From a464d83c8fe2ca941cf199ed1c4fe4387e0db9b4 Mon Sep 17 00:00:00 2001 From: Allow2CEO Date: Mon, 8 Jan 2018 10:33:40 +1000 Subject: [PATCH 1/2] restructure for dev and generation --- _config.yml | 1 - README.md => _src/README.md | 0 _src/_config.yml | 5 +++++ 3 files changed, 5 insertions(+), 1 deletion(-) delete mode 100644 _config.yml rename README.md => _src/README.md (100%) create mode 100644 _src/_config.yml diff --git a/_config.yml b/_config.yml deleted file mode 100644 index c419263..0000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-cayman \ No newline at end of file diff --git a/README.md b/_src/README.md similarity index 100% rename from README.md rename to _src/README.md diff --git a/_src/_config.yml b/_src/_config.yml new file mode 100644 index 0000000..98172bb --- /dev/null +++ b/_src/_config.yml @@ -0,0 +1,5 @@ +source: . +destination: .. +keep_files: ../_src ../.git + +theme: jekyll-theme-cayman From a1f0b98f55b0fb914366fb2d42a2dde4be52c45d Mon Sep 17 00:00:00 2001 From: Allow2CEO Date: Mon, 8 Jan 2018 11:07:36 +1000 Subject: [PATCH 2/2] first attempt --- .bundle/config | 2 + .gitignore | 2 + 404.html | 24 + Gemfile | 27 + Gemfile.lock | 70 + INSTRUCTIONS.txt | 17 + _src/README.md => README.md | 0 _config.yml | 46 + _posts/2018-01-08-welcome-to-jekyll.markdown | 25 + _site/404.html | 146 + _site/INSTRUCTIONS.txt | 17 + _site/README.md | 31 + _site/about/index.html | 147 + _site/assets/main.css | 470 + _site/feed.xml | 13 + _site/index.html | 149 + .../update/2018/01/08/welcome-to-jekyll.html | 158 + _src/_config.yml | 5 - about.md | 18 + index.md | 6 + vendor/bundle/ruby/2.3.0/bin/jekyll | 22 + vendor/bundle/ruby/2.3.0/bin/kramdown | 22 + vendor/bundle/ruby/2.3.0/bin/listen | 22 + vendor/bundle/ruby/2.3.0/bin/rougify | 22 + vendor/bundle/ruby/2.3.0/bin/safe_yaml | 22 + vendor/bundle/ruby/2.3.0/bin/sass | 22 + vendor/bundle/ruby/2.3.0/bin/sass-convert | 22 + vendor/bundle/ruby/2.3.0/bin/scss | 22 + .../ruby/2.3.0/cache/addressable-2.5.2.gem | Bin 0 -> 103936 bytes .../ruby/2.3.0/cache/colorator-1.1.0.gem | Bin 0 -> 7168 bytes .../2.3.0/cache/concurrent-ruby-1.0.5.gem | Bin 0 -> 132608 bytes .../ruby/2.3.0/cache/em-websocket-0.5.1.gem | Bin 0 -> 31744 bytes .../ruby/2.3.0/cache/eventmachine-1.2.5.gem | Bin 0 -> 246272 bytes vendor/bundle/ruby/2.3.0/cache/ffi-1.9.18.gem | Bin 0 -> 885760 bytes .../cache/forwardable-extended-2.6.0.gem | Bin 0 -> 6656 bytes .../ruby/2.3.0/cache/http_parser.rb-0.6.0.gem | Bin 0 -> 177664 bytes vendor/bundle/ruby/2.3.0/cache/i18n-0.9.1.gem | Bin 0 -> 60416 bytes .../bundle/ruby/2.3.0/cache/jekyll-3.7.0.gem | Bin 0 -> 109568 bytes .../ruby/2.3.0/cache/jekyll-feed-0.9.2.gem | Bin 0 -> 15872 bytes .../cache/jekyll-sass-converter-1.5.1.gem | Bin 0 -> 5632 bytes .../ruby/2.3.0/cache/jekyll-watch-2.0.0.gem | Bin 0 -> 6144 bytes .../ruby/2.3.0/cache/kramdown-1.16.2.gem | Bin 0 -> 258048 bytes .../bundle/ruby/2.3.0/cache/liquid-4.0.0.gem | Bin 0 -> 71168 bytes .../bundle/ruby/2.3.0/cache/listen-3.1.5.gem | Bin 0 -> 27648 bytes .../ruby/2.3.0/cache/mercenary-0.3.6.gem | Bin 0 -> 16896 bytes .../bundle/ruby/2.3.0/cache/minima-2.1.1.gem | Bin 0 -> 14336 bytes .../ruby/2.3.0/cache/pathutil-0.16.1.gem | Bin 0 -> 11776 bytes .../ruby/2.3.0/cache/public_suffix-3.0.1.gem | Bin 0 -> 95232 bytes .../ruby/2.3.0/cache/rb-fsevent-0.10.2.gem | Bin 0 -> 50688 bytes .../ruby/2.3.0/cache/rb-inotify-0.9.10.gem | Bin 0 -> 14848 bytes .../bundle/ruby/2.3.0/cache/rouge-3.1.0.gem | Bin 0 -> 282624 bytes .../ruby/2.3.0/cache/ruby_dep-1.5.0.gem | Bin 0 -> 11776 bytes .../ruby/2.3.0/cache/safe_yaml-1.0.4.gem | Bin 0 -> 30208 bytes vendor/bundle/ruby/2.3.0/cache/sass-3.5.5.gem | Bin 0 -> 320000 bytes .../ruby/2.3.0/cache/sass-listen-4.0.0.gem | Bin 0 -> 27136 bytes .../fastfilereaderext.bundle | Bin 0 -> 34484 bytes .../eventmachine-1.2.5/gem.build_complete | 0 .../2.3.0/eventmachine-1.2.5/gem_make.out | 25 + .../2.3.0/eventmachine-1.2.5/mkmf.log | 15 + .../rubyeventmachine.bundle | Bin 0 -> 461356 bytes .../2.3.0/ffi-1.9.18/ffi_c.bundle | Bin 0 -> 349780 bytes .../2.3.0/ffi-1.9.18/gem.build_complete | 0 .../2.3.0/ffi-1.9.18/gem_make.out | 260 + .../2.3.0/ffi-1.9.18/mkmf.log | 301 + .../http_parser.rb-0.6.0/gem.build_complete | 0 .../2.3.0/http_parser.rb-0.6.0/gem_make.out | 21 + .../ruby_http_parser.bundle | Bin 0 -> 76260 bytes .../2.3.0/gems/addressable-2.5.2/CHANGELOG.md | 216 + .../ruby/2.3.0/gems/addressable-2.5.2/Gemfile | 32 + .../2.3.0/gems/addressable-2.5.2/LICENSE.txt | 202 + .../2.3.0/gems/addressable-2.5.2/README.md | 121 + .../2.3.0/gems/addressable-2.5.2/Rakefile | 32 + .../gems/addressable-2.5.2/data/unicode.data | Bin 0 -> 115740 bytes .../gems/addressable-2.5.2/lib/addressable.rb | 2 + .../addressable-2.5.2/lib/addressable/idna.rb | 25 + .../lib/addressable/idna/native.rb | 59 + .../lib/addressable/idna/pure.rb | 677 + .../lib/addressable/template.rb | 1065 + .../addressable-2.5.2/lib/addressable/uri.rb | 2492 +++ .../lib/addressable/version.rb | 30 + .../spec/addressable/idna_spec.rb | 298 + .../spec/addressable/net_http_compat_spec.rb | 28 + .../addressable/rack_mount_compat_spec.rb | 104 + .../spec/addressable/security_spec.rb | 57 + .../spec/addressable/template_spec.rb | 1419 ++ .../spec/addressable/uri_spec.rb | 6468 ++++++ .../addressable-2.5.2/spec/spec_helper.rb | 21 + .../gems/addressable-2.5.2/tasks/clobber.rake | 2 + .../gems/addressable-2.5.2/tasks/gem.rake | 91 + .../gems/addressable-2.5.2/tasks/git.rake | 45 + .../gems/addressable-2.5.2/tasks/metrics.rake | 22 + .../gems/addressable-2.5.2/tasks/rspec.rake | 21 + .../gems/addressable-2.5.2/tasks/yard.rake | 27 + .../ruby/2.3.0/gems/colorator-1.1.0/Gemfile | 11 + .../gems/colorator-1.1.0/History.markdown | 25 + .../ruby/2.3.0/gems/colorator-1.1.0/LICENSE | 21 + .../gems/colorator-1.1.0/README.markdown | 47 + .../ruby/2.3.0/gems/colorator-1.1.0/Rakefile | 6 + .../gems/colorator-1.1.0/colorator.gemspec | 23 + .../gems/colorator-1.1.0/lib/colorator.rb | 111 + .../colorator-1.1.0/lib/colorator/core_ext.rb | 9 + .../gems/concurrent-ruby-1.0.5/CHANGELOG.md | 387 + .../gems/concurrent-ruby-1.0.5/LICENSE.txt | 21 + .../gems/concurrent-ruby-1.0.5/README.md | 247 + .../concurrent-ruby-1.0.5/lib/concurrent.rb | 130 + .../lib/concurrent/agent.rb | 587 + .../lib/concurrent/array.rb | 39 + .../lib/concurrent/async.rb | 445 + .../lib/concurrent/atom.rb | 222 + .../atomic/abstract_thread_local_var.rb | 66 + .../lib/concurrent/atomic/atomic_boolean.rb | 122 + .../lib/concurrent/atomic/atomic_fixnum.rb | 139 + .../lib/concurrent/atomic/atomic_reference.rb | 51 + .../lib/concurrent/atomic/count_down_latch.rb | 100 + .../lib/concurrent/atomic/cyclic_barrier.rb | 128 + .../lib/concurrent/atomic/event.rb | 109 + .../atomic/java_count_down_latch.rb | 39 + .../atomic/java_thread_local_var.rb | 37 + .../concurrent/atomic/mutex_atomic_boolean.rb | 60 + .../concurrent/atomic/mutex_atomic_fixnum.rb | 75 + .../atomic/mutex_count_down_latch.rb | 43 + .../lib/concurrent/atomic/mutex_semaphore.rb | 115 + .../lib/concurrent/atomic/read_write_lock.rb | 253 + .../atomic/reentrant_read_write_lock.rb | 377 + .../atomic/ruby_thread_local_var.rb | 161 + .../lib/concurrent/atomic/semaphore.rb | 145 + .../lib/concurrent/atomic/thread_local_var.rb | 104 + .../concurrent_update_error.rb | 8 + .../atomic_reference/direct_update.rb | 81 + .../atomic_reference/jruby+truffle.rb | 2 + .../lib/concurrent/atomic_reference/jruby.rb | 16 + .../atomic_reference/mutex_atomic.rb | 61 + .../atomic_reference/numeric_cas_wrapper.rb | 28 + .../lib/concurrent/atomic_reference/rbx.rb | 22 + .../lib/concurrent/atomic_reference/ruby.rb | 32 + .../lib/concurrent/atomics.rb | 53 + .../collection/copy_on_notify_observer_set.rb | 107 + .../collection/copy_on_write_observer_set.rb | 111 + .../java_non_concurrent_priority_queue.rb | 84 + .../map/atomic_reference_map_backend.rb | 927 + .../collection/map/mri_map_backend.rb | 66 + .../map/non_concurrent_map_backend.rb | 141 + .../map/synchronized_map_backend.rb | 82 + .../non_concurrent_priority_queue.rb | 143 + .../ruby_non_concurrent_priority_queue.rb | 150 + .../lib/concurrent/concern/deprecation.rb | 34 + .../lib/concurrent/concern/dereferenceable.rb | 73 + .../lib/concurrent/concern/logging.rb | 27 + .../lib/concurrent/concern/obligation.rb | 220 + .../lib/concurrent/concern/observable.rb | 110 + .../lib/concurrent/configuration.rb | 188 + .../lib/concurrent/constants.rb | 8 + .../lib/concurrent/dataflow.rb | 80 + .../lib/concurrent/delay.rb | 197 + .../lib/concurrent/edge.rb | 26 + .../lib/concurrent/errors.rb | 69 + .../lib/concurrent/exchanger.rb | 356 + .../executor/abstract_executor_service.rb | 134 + .../concurrent/executor/cached_thread_pool.rb | 62 + .../concurrent/executor/executor_service.rb | 185 + .../concurrent/executor/fixed_thread_pool.rb | 206 + .../concurrent/executor/immediate_executor.rb | 66 + .../executor/indirect_immediate_executor.rb | 44 + .../executor/java_executor_service.rb | 100 + .../executor/java_single_thread_executor.rb | 29 + .../executor/java_thread_pool_executor.rb | 120 + .../executor/ruby_executor_service.rb | 78 + .../executor/ruby_single_thread_executor.rb | 22 + .../executor/ruby_thread_pool_executor.rb | 362 + .../concurrent/executor/safe_task_executor.rb | 35 + .../executor/serial_executor_service.rb | 34 + .../executor/serialized_execution.rb | 107 + .../serialized_execution_delegator.rb | 28 + .../executor/simple_executor_service.rb | 100 + .../executor/single_thread_executor.rb | 56 + .../executor/thread_pool_executor.rb | 87 + .../lib/concurrent/executor/timer_set.rb | 175 + .../lib/concurrent/executors.rb | 20 + .../lib/concurrent/future.rb | 138 + .../lib/concurrent/hash.rb | 36 + .../lib/concurrent/immutable_struct.rb | 93 + .../lib/concurrent/ivar.rb | 208 + .../lib/concurrent/lazy_register.rb | 81 + .../lib/concurrent/map.rb | 240 + .../lib/concurrent/maybe.rb | 229 + .../lib/concurrent/mutable_struct.rb | 228 + .../lib/concurrent/mvar.rb | 242 + .../lib/concurrent/options.rb | 42 + .../lib/concurrent/promise.rb | 547 + .../lib/concurrent/scheduled_task.rb | 318 + .../lib/concurrent/settable_struct.rb | 128 + .../lib/concurrent/synchronization.rb | 31 + .../abstract_lockable_object.rb | 98 + .../synchronization/abstract_object.rb | 24 + .../synchronization/abstract_struct.rb | 157 + .../concurrent/synchronization/condition.rb | 58 + .../synchronization/jruby_lockable_object.rb | 13 + .../synchronization/jruby_object.rb | 44 + .../lib/concurrent/synchronization/lock.rb | 34 + .../synchronization/lockable_object.rb | 74 + .../synchronization/mri_lockable_object.rb | 71 + .../concurrent/synchronization/mri_object.rb | 43 + .../lib/concurrent/synchronization/object.rb | 153 + .../synchronization/rbx_lockable_object.rb | 65 + .../concurrent/synchronization/rbx_object.rb | 48 + .../truffle_lockable_object.rb | 9 + .../synchronization/truffle_object.rb | 31 + .../concurrent/synchronization/volatile.rb | 34 + .../thread_safe/synchronized_delegator.rb | 50 + .../lib/concurrent/thread_safe/util.rb | 16 + .../lib/concurrent/thread_safe/util/adder.rb | 74 + .../thread_safe/util/array_hash_rbx.rb | 30 + .../thread_safe/util/cheap_lockable.rb | 118 + .../thread_safe/util/power_of_two_tuple.rb | 38 + .../concurrent/thread_safe/util/striped64.rb | 241 + .../concurrent/thread_safe/util/volatile.rb | 75 + .../thread_safe/util/xor_shift_random.rb | 50 + .../lib/concurrent/timer_task.rb | 331 + .../lib/concurrent/tuple.rb | 86 + .../lib/concurrent/tvar.rb | 258 + .../lib/concurrent/utility/at_exit.rb | 97 + .../lib/concurrent/utility/engine.rb | 56 + .../lib/concurrent/utility/monotonic_time.rb | 58 + .../utility/native_extension_loader.rb | 73 + .../lib/concurrent/utility/native_integer.rb | 53 + .../concurrent/utility/processor_counter.rb | 160 + .../lib/concurrent/version.rb | 4 + .../2.3.0/gems/em-websocket-0.5.1/.gitignore | 3 + .../gems/em-websocket-0.5.1/CHANGELOG.rdoc | 149 + .../2.3.0/gems/em-websocket-0.5.1/Gemfile | 9 + .../2.3.0/gems/em-websocket-0.5.1/README.md | 146 + .../2.3.0/gems/em-websocket-0.5.1/Rakefile | 11 + .../gems/em-websocket-0.5.1/examples/echo.rb | 24 + .../em-websocket-0.5.1/examples/multicast.rb | 47 + .../gems/em-websocket-0.5.1/examples/ping.rb | 24 + .../em-websocket-0.5.1/examples/test.html | 29 + .../em-websocket-0.5.1/lib/em-websocket.rb | 24 + .../lib/em-websocket/close03.rb | 14 + .../lib/em-websocket/close05.rb | 14 + .../lib/em-websocket/close06.rb | 19 + .../lib/em-websocket/close75.rb | 11 + .../lib/em-websocket/connection.rb | 313 + .../lib/em-websocket/debugger.rb | 17 + .../lib/em-websocket/framing03.rb | 162 + .../lib/em-websocket/framing04.rb | 15 + .../lib/em-websocket/framing05.rb | 163 + .../lib/em-websocket/framing07.rb | 185 + .../lib/em-websocket/framing76.rb | 105 + .../lib/em-websocket/handler.rb | 97 + .../lib/em-websocket/handler03.rb | 9 + .../lib/em-websocket/handler05.rb | 9 + .../lib/em-websocket/handler06.rb | 9 + .../lib/em-websocket/handler07.rb | 9 + .../lib/em-websocket/handler08.rb | 9 + .../lib/em-websocket/handler13.rb | 9 + .../lib/em-websocket/handler75.rb | 9 + .../lib/em-websocket/handler76.rb | 14 + .../lib/em-websocket/handshake.rb | 156 + .../lib/em-websocket/handshake04.rb | 28 + .../lib/em-websocket/handshake75.rb | 18 + .../lib/em-websocket/handshake76.rb | 72 + .../lib/em-websocket/masking04.rb | 37 + .../lib/em-websocket/message_processor_03.rb | 47 + .../lib/em-websocket/message_processor_06.rb | 64 + .../lib/em-websocket/version.rb | 5 + .../lib/em-websocket/websocket.rb | 56 + .../gems/em-websocket-0.5.1/spec/helper.rb | 173 + .../spec/integration/common_spec.rb | 111 + .../spec/integration/draft03_spec.rb | 298 + .../spec/integration/draft05_spec.rb | 50 + .../spec/integration/draft06_spec.rb | 144 + .../spec/integration/draft13_spec.rb | 104 + .../spec/integration/draft75_spec.rb | 123 + .../spec/integration/draft76_spec.rb | 234 + .../spec/integration/gte_03_examples.rb | 42 + .../spec/integration/shared_examples.rb | 252 + .../spec/unit/framing_spec.rb | 298 + .../spec/unit/handshake_spec.rb | 216 + .../spec/unit/masking_spec.rb | 29 + .../gems/eventmachine-1.2.5/CHANGELOG.md | 166 + .../ruby/2.3.0/gems/eventmachine-1.2.5/GNU | 281 + .../2.3.0/gems/eventmachine-1.2.5/LICENSE | 60 + .../2.3.0/gems/eventmachine-1.2.5/README.md | 110 + .../docs/DocumentationGuidesIndex.md | 27 + .../eventmachine-1.2.5/docs/GettingStarted.md | 521 + .../eventmachine-1.2.5/docs/old/ChangeLog | 211 + .../eventmachine-1.2.5/docs/old/DEFERRABLES | 246 + .../gems/eventmachine-1.2.5/docs/old/EPOLL | 141 + .../gems/eventmachine-1.2.5/docs/old/INSTALL | 13 + .../gems/eventmachine-1.2.5/docs/old/KEYBOARD | 42 + .../gems/eventmachine-1.2.5/docs/old/LEGAL | 25 + .../docs/old/LIGHTWEIGHT_CONCURRENCY | 130 + .../eventmachine-1.2.5/docs/old/PURE_RUBY | 75 + .../eventmachine-1.2.5/docs/old/RELEASE_NOTES | 94 + .../gems/eventmachine-1.2.5/docs/old/SMTP | 4 + .../docs/old/SPAWNED_PROCESSES | 148 + .../gems/eventmachine-1.2.5/docs/old/TODO | 8 + .../01_eventmachine_echo_server.rb | 18 + ...cho_server_that_recognizes_exit_command.rb | 22 + .../getting_started/03_simple_chat_server.rb | 149 + .../04_simple_chat_server_step_one.rb | 27 + .../05_simple_chat_server_step_two.rb | 43 + .../06_simple_chat_server_step_three.rb | 98 + .../07_simple_chat_server_step_four.rb | 121 + .../08_simple_chat_server_step_five.rb | 141 + .../examples/old/ex_channel.rb | 43 + .../examples/old/ex_queue.rb | 2 + .../examples/old/ex_tick_loop_array.rb | 15 + .../examples/old/ex_tick_loop_counter.rb | 32 + .../eventmachine-1.2.5/examples/old/helper.rb | 2 + .../eventmachine-1.2.5/ext/.RUBYARCHDIR.time | 0 .../gems/eventmachine-1.2.5/ext/Makefile | 261 + .../gems/eventmachine-1.2.5/ext/binder.cpp | 124 + .../gems/eventmachine-1.2.5/ext/binder.h | 52 + .../gems/eventmachine-1.2.5/ext/binder.o | Bin 0 -> 294856 bytes .../gems/eventmachine-1.2.5/ext/cmain.cpp | 988 + .../2.3.0/gems/eventmachine-1.2.5/ext/cmain.o | Bin 0 -> 831492 bytes .../2.3.0/gems/eventmachine-1.2.5/ext/ed.cpp | 2096 ++ .../2.3.0/gems/eventmachine-1.2.5/ext/ed.h | 457 + .../2.3.0/gems/eventmachine-1.2.5/ext/ed.o | Bin 0 -> 1155932 bytes .../2.3.0/gems/eventmachine-1.2.5/ext/em.cpp | 2405 +++ .../2.3.0/gems/eventmachine-1.2.5/ext/em.h | 309 + .../2.3.0/gems/eventmachine-1.2.5/ext/em.o | Bin 0 -> 1437980 bytes .../eventmachine-1.2.5/ext/eventmachine.h | 143 + .../gems/eventmachine-1.2.5/ext/extconf.rb | 270 + .../ext/fastfilereader/.RUBYARCHDIR.time | 0 .../ext/fastfilereader/Makefile | 261 + .../ext/fastfilereader/extconf.rb | 109 + .../fastfilereader/fastfilereaderext.bundle | Bin 0 -> 34484 bytes .../ext/fastfilereader/mapper.cpp | 216 + .../ext/fastfilereader/mapper.h | 59 + .../ext/fastfilereader/mapper.o | Bin 0 -> 125712 bytes .../ext/fastfilereader/rubymain.cpp | 127 + .../ext/fastfilereader/rubymain.o | Bin 0 -> 140236 bytes .../2.3.0/gems/eventmachine-1.2.5/ext/kb.cpp | 79 + .../2.3.0/gems/eventmachine-1.2.5/ext/kb.o | Bin 0 -> 491072 bytes .../gems/eventmachine-1.2.5/ext/page.cpp | 107 + .../2.3.0/gems/eventmachine-1.2.5/ext/page.h | 51 + .../2.3.0/gems/eventmachine-1.2.5/ext/page.o | Bin 0 -> 294028 bytes .../gems/eventmachine-1.2.5/ext/pipe.cpp | 354 + .../2.3.0/gems/eventmachine-1.2.5/ext/pipe.o | Bin 0 -> 723248 bytes .../gems/eventmachine-1.2.5/ext/project.h | 176 + .../ext/rubyeventmachine.bundle | Bin 0 -> 461356 bytes .../gems/eventmachine-1.2.5/ext/rubymain.cpp | 1515 ++ .../gems/eventmachine-1.2.5/ext/rubymain.o | Bin 0 -> 323704 bytes .../2.3.0/gems/eventmachine-1.2.5/ext/ssl.cpp | 615 + .../2.3.0/gems/eventmachine-1.2.5/ext/ssl.h | 103 + .../2.3.0/gems/eventmachine-1.2.5/ext/ssl.o | Bin 0 -> 708348 bytes .../gems/eventmachine-1.2.5/java/.classpath | 8 + .../gems/eventmachine-1.2.5/java/.project | 17 + .../src/com/rubyeventmachine/EmReactor.java | 613 + .../rubyeventmachine/EmReactorException.java | 40 + .../rubyeventmachine/EventableChannel.java | 72 + .../EventableDatagramChannel.java | 201 + .../EventableSocketChannel.java | 415 + .../gems/eventmachine-1.2.5/lib/em/buftok.rb | 59 + .../eventmachine-1.2.5/lib/em/callback.rb | 58 + .../gems/eventmachine-1.2.5/lib/em/channel.rb | 69 + .../eventmachine-1.2.5/lib/em/completion.rb | 304 + .../eventmachine-1.2.5/lib/em/connection.rb | 770 + .../eventmachine-1.2.5/lib/em/deferrable.rb | 210 + .../lib/em/deferrable/pool.rb | 2 + .../eventmachine-1.2.5/lib/em/file_watch.rb | 73 + .../gems/eventmachine-1.2.5/lib/em/future.rb | 61 + .../eventmachine-1.2.5/lib/em/iterator.rb | 252 + .../eventmachine-1.2.5/lib/em/messages.rb | 66 + .../gems/eventmachine-1.2.5/lib/em/pool.rb | 151 + .../lib/em/process_watch.rb | 45 + .../eventmachine-1.2.5/lib/em/processes.rb | 123 + .../eventmachine-1.2.5/lib/em/protocols.rb | 37 + .../lib/em/protocols/header_and_content.rb | 138 + .../lib/em/protocols/httpclient.rb | 300 + .../lib/em/protocols/httpclient2.rb | 600 + .../lib/em/protocols/line_and_text.rb | 125 + .../lib/em/protocols/line_protocol.rb | 29 + .../lib/em/protocols/linetext2.rb | 179 + .../lib/em/protocols/memcache.rb | 331 + .../lib/em/protocols/object_protocol.rb | 46 + .../lib/em/protocols/postgres3.rb | 246 + .../lib/em/protocols/saslauth.rb | 175 + .../lib/em/protocols/smtpclient.rb | 394 + .../lib/em/protocols/smtpserver.rb | 666 + .../lib/em/protocols/socks4.rb | 66 + .../lib/em/protocols/stomp.rb | 205 + .../lib/em/protocols/tcptest.rb | 54 + .../eventmachine-1.2.5/lib/em/pure_ruby.rb | 1279 ++ .../gems/eventmachine-1.2.5/lib/em/queue.rb | 80 + .../eventmachine-1.2.5/lib/em/resolver.rb | 232 + .../eventmachine-1.2.5/lib/em/spawnable.rb | 84 + .../eventmachine-1.2.5/lib/em/streamer.rb | 118 + .../lib/em/threaded_resource.rb | 90 + .../eventmachine-1.2.5/lib/em/tick_loop.rb | 85 + .../gems/eventmachine-1.2.5/lib/em/timers.rb | 61 + .../gems/eventmachine-1.2.5/lib/em/version.rb | 3 + .../eventmachine-1.2.5/lib/eventmachine.rb | 1590 ++ .../lib/fastfilereaderext.bundle | Bin 0 -> 34484 bytes .../eventmachine-1.2.5/lib/jeventmachine.rb | 303 + .../lib/rubyeventmachine.bundle | Bin 0 -> 461356 bytes .../eventmachine-1.2.5/rakelib/package.rake | 120 + .../gems/eventmachine-1.2.5/rakelib/test.rake | 8 + .../eventmachine-1.2.5/rakelib/test_pure.rake | 13 + .../gems/eventmachine-1.2.5/tests/client.crt | 31 + .../gems/eventmachine-1.2.5/tests/client.key | 51 + .../gems/eventmachine-1.2.5/tests/dhparam.pem | 13 + .../tests/em_test_helper.rb | 154 + .../eventmachine-1.2.5/tests/test_attach.rb | 151 + .../eventmachine-1.2.5/tests/test_basic.rb | 315 + .../eventmachine-1.2.5/tests/test_channel.rb | 75 + .../tests/test_completion.rb | 178 + .../tests/test_connection_count.rb | 83 + .../tests/test_connection_write.rb | 35 + .../eventmachine-1.2.5/tests/test_defer.rb | 35 + .../tests/test_deferrable.rb | 35 + .../eventmachine-1.2.5/tests/test_epoll.rb | 142 + .../tests/test_error_handler.rb | 38 + .../gems/eventmachine-1.2.5/tests/test_exc.rb | 43 + .../tests/test_file_watch.rb | 85 + .../eventmachine-1.2.5/tests/test_fork.rb | 75 + .../eventmachine-1.2.5/tests/test_futures.rb | 170 + .../tests/test_handler_check.rb | 35 + .../gems/eventmachine-1.2.5/tests/test_hc.rb | 155 + .../tests/test_httpclient.rb | 238 + .../tests/test_httpclient2.rb | 128 + .../tests/test_idle_connection.rb | 31 + .../tests/test_inactivity_timeout.rb | 54 + .../eventmachine-1.2.5/tests/test_ipv4.rb | 95 + .../eventmachine-1.2.5/tests/test_ipv6.rb | 107 + .../eventmachine-1.2.5/tests/test_iterator.rb | 118 + .../gems/eventmachine-1.2.5/tests/test_kb.rb | 28 + .../tests/test_line_protocol.rb | 33 + .../gems/eventmachine-1.2.5/tests/test_ltp.rb | 155 + .../eventmachine-1.2.5/tests/test_ltp2.rb | 332 + .../eventmachine-1.2.5/tests/test_many_fds.rb | 22 + .../tests/test_next_tick.rb | 104 + .../tests/test_object_protocol.rb | 36 + .../eventmachine-1.2.5/tests/test_pause.rb | 107 + .../tests/test_pending_connect_timeout.rb | 52 + .../eventmachine-1.2.5/tests/test_pool.rb | 196 + .../tests/test_process_watch.rb | 50 + .../tests/test_processes.rb | 128 + .../tests/test_proxy_connection.rb | 180 + .../eventmachine-1.2.5/tests/test_pure.rb | 139 + .../eventmachine-1.2.5/tests/test_queue.rb | 64 + .../eventmachine-1.2.5/tests/test_resolver.rb | 105 + .../eventmachine-1.2.5/tests/test_running.rb | 14 + .../eventmachine-1.2.5/tests/test_sasl.rb | 47 + .../tests/test_send_file.rb | 217 + .../eventmachine-1.2.5/tests/test_servers.rb | 33 + .../tests/test_shutdown_hooks.rb | 23 + .../tests/test_smtpclient.rb | 75 + .../tests/test_smtpserver.rb | 57 + .../eventmachine-1.2.5/tests/test_sock_opt.rb | 54 + .../eventmachine-1.2.5/tests/test_spawn.rb | 293 + .../eventmachine-1.2.5/tests/test_ssl_args.rb | 78 + .../tests/test_ssl_dhparam.rb | 84 + .../tests/test_ssl_ecdh_curve.rb | 80 + .../tests/test_ssl_extensions.rb | 49 + .../tests/test_ssl_methods.rb | 65 + .../tests/test_ssl_protocols.rb | 246 + .../tests/test_ssl_verify.rb | 128 + .../eventmachine-1.2.5/tests/test_stomp.rb | 38 + .../eventmachine-1.2.5/tests/test_system.rb | 46 + .../tests/test_threaded_resource.rb | 63 + .../tests/test_tick_loop.rb | 59 + .../eventmachine-1.2.5/tests/test_timers.rb | 130 + .../gems/eventmachine-1.2.5/tests/test_ud.rb | 8 + .../tests/test_unbind_reason.rb | 40 + .../bundle/ruby/2.3.0/gems/ffi-1.9.18/COPYING | 49 + .../bundle/ruby/2.3.0/gems/ffi-1.9.18/LICENSE | 24 + .../ruby/2.3.0/gems/ffi-1.9.18/README.md | 111 + .../ruby/2.3.0/gems/ffi-1.9.18/Rakefile | 232 + .../ffi-1.9.18/ext/ffi_c/.RUBYARCHDIR.time | 0 .../ffi-1.9.18/ext/ffi_c/AbstractMemory.c | 1104 + .../ffi-1.9.18/ext/ffi_c/AbstractMemory.h | 175 + .../ffi-1.9.18/ext/ffi_c/AbstractMemory.o | Bin 0 -> 335396 bytes .../gems/ffi-1.9.18/ext/ffi_c/ArrayType.c | 162 + .../gems/ffi-1.9.18/ext/ffi_c/ArrayType.h | 59 + .../gems/ffi-1.9.18/ext/ffi_c/ArrayType.o | Bin 0 -> 25936 bytes .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.c | 365 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.o | Bin 0 -> 41316 bytes .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Call.c | 517 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Call.h | 110 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Call.o | Bin 0 -> 55844 bytes .../gems/ffi-1.9.18/ext/ffi_c/ClosurePool.c | 283 + .../gems/ffi-1.9.18/ext/ffi_c/ClosurePool.h | 57 + .../gems/ffi-1.9.18/ext/ffi_c/ClosurePool.o | Bin 0 -> 24736 bytes .../gems/ffi-1.9.18/ext/ffi_c/DataConverter.c | 91 + .../gems/ffi-1.9.18/ext/ffi_c/DataConverter.o | Bin 0 -> 17436 bytes .../ffi-1.9.18/ext/ffi_c/DynamicLibrary.c | 339 + .../ffi-1.9.18/ext/ffi_c/DynamicLibrary.h | 98 + .../ffi-1.9.18/ext/ffi_c/DynamicLibrary.o | Bin 0 -> 33844 bytes .../gems/ffi-1.9.18/ext/ffi_c/Function.c | 998 + .../gems/ffi-1.9.18/ext/ffi_c/Function.h | 87 + .../gems/ffi-1.9.18/ext/ffi_c/Function.o | Bin 0 -> 85156 bytes .../gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.c | 271 + .../gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.o | Bin 0 -> 40488 bytes .../gems/ffi-1.9.18/ext/ffi_c/LastError.c | 184 + .../gems/ffi-1.9.18/ext/ffi_c/LastError.h | 47 + .../gems/ffi-1.9.18/ext/ffi_c/LastError.o | Bin 0 -> 18236 bytes .../gems/ffi-1.9.18/ext/ffi_c/LongDouble.c | 63 + .../gems/ffi-1.9.18/ext/ffi_c/LongDouble.h | 51 + .../gems/ffi-1.9.18/ext/ffi_c/LongDouble.o | Bin 0 -> 24368 bytes .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Makefile | 263 + .../gems/ffi-1.9.18/ext/ffi_c/MappedType.c | 168 + .../gems/ffi-1.9.18/ext/ffi_c/MappedType.h | 59 + .../gems/ffi-1.9.18/ext/ffi_c/MappedType.o | Bin 0 -> 31652 bytes .../gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.c | 197 + .../gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.h | 53 + .../gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.o | Bin 0 -> 31688 bytes .../gems/ffi-1.9.18/ext/ffi_c/MethodHandle.c | 358 + .../gems/ffi-1.9.18/ext/ffi_c/MethodHandle.h | 55 + .../gems/ffi-1.9.18/ext/ffi_c/MethodHandle.o | Bin 0 -> 25780 bytes .../gems/ffi-1.9.18/ext/ffi_c/Platform.c | 121 + .../gems/ffi-1.9.18/ext/ffi_c/Platform.h | 45 + .../gems/ffi-1.9.18/ext/ffi_c/Platform.o | Bin 0 -> 16784 bytes .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.c | 508 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.h | 63 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.o | Bin 0 -> 54544 bytes .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Struct.c | 829 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Struct.h | 106 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Struct.o | Bin 0 -> 95200 bytes .../ffi-1.9.18/ext/ffi_c/StructByReference.c | 190 + .../ffi-1.9.18/ext/ffi_c/StructByReference.h | 50 + .../ffi-1.9.18/ext/ffi_c/StructByReference.o | Bin 0 -> 33716 bytes .../gems/ffi-1.9.18/ext/ffi_c/StructByValue.c | 150 + .../gems/ffi-1.9.18/ext/ffi_c/StructByValue.h | 55 + .../gems/ffi-1.9.18/ext/ffi_c/StructByValue.o | Bin 0 -> 32028 bytes .../gems/ffi-1.9.18/ext/ffi_c/StructLayout.c | 698 + .../gems/ffi-1.9.18/ext/ffi_c/StructLayout.o | Bin 0 -> 73352 bytes .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.c | 352 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.h | 95 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.o | Bin 0 -> 17256 bytes .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Type.c | 397 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Type.h | 62 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Type.o | Bin 0 -> 87588 bytes .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Types.c | 139 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Types.h | 89 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/Types.o | Bin 0 -> 26284 bytes .../gems/ffi-1.9.18/ext/ffi_c/Variadic.c | 304 + .../gems/ffi-1.9.18/ext/ffi_c/Variadic.o | Bin 0 -> 42856 bytes .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/compat.h | 78 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/extconf.h | 7 + .../gems/ffi-1.9.18/ext/ffi_c/extconf.rb | 66 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi.c | 98 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi.o | Bin 0 -> 16536 bytes .../gems/ffi-1.9.18/ext/ffi_c/ffi_c.bundle | Bin 0 -> 349780 bytes .../ffi_c/libffi-i386/.libs/libffi.5.dylib | Bin 0 -> 22896 bytes .../ext/ffi_c/libffi-i386/.libs/libffi.dylib | 1 + .../ext/ffi_c/libffi-i386/.libs/libffi.la | 1 + .../ext/ffi_c/libffi-i386/.libs/libffi.lai | 41 + .../libffi-i386/.libs/libffi_convenience.a | Bin 0 -> 44952 bytes .../libffi-i386/.libs/libffi_convenience.la | 1 + .../ffi-1.9.18/ext/ffi_c/libffi-i386/Makefile | 1820 ++ .../ext/ffi_c/libffi-i386/config.log | 1144 + .../ext/ffi_c/libffi-i386/config.status | 2336 +++ .../ext/ffi_c/libffi-i386/fficonfig.h | 200 + .../ext/ffi_c/libffi-i386/include/Makefile | 487 + .../ext/ffi_c/libffi-i386/include/ffi.h | 427 + .../ext/ffi_c/libffi-i386/include/ffitarget.h | 1 + .../ext/ffi_c/libffi-i386/libffi.la | 41 + .../ext/ffi_c/libffi-i386/libffi.pc | 10 + .../ffi_c/libffi-i386/libffi_convenience.la | 41 + .../ffi-1.9.18/ext/ffi_c/libffi-i386/libtool | 10056 +++++++++ .../ext/ffi_c/libffi-i386/man/Makefile | 466 + .../ext/ffi_c/libffi-i386/src/.deps/.dirstamp | 0 .../ext/ffi_c/libffi-i386/src/.dirstamp | 0 .../ffi_c/libffi-i386/src/.libs/closures.o | Bin 0 -> 2668 bytes .../ext/ffi_c/libffi-i386/src/.libs/debug.o | Bin 0 -> 3456 bytes .../libffi-i386/src/.libs/java_raw_api.o | Bin 0 -> 6044 bytes .../ffi_c/libffi-i386/src/.libs/prep_cif.o | Bin 0 -> 5336 bytes .../ext/ffi_c/libffi-i386/src/.libs/raw_api.o | Bin 0 -> 6624 bytes .../ext/ffi_c/libffi-i386/src/.libs/types.o | Bin 0 -> 3728 bytes .../ext/ffi_c/libffi-i386/src/closures.lo | 12 + .../ext/ffi_c/libffi-i386/src/debug.lo | 12 + .../ext/ffi_c/libffi-i386/src/java_raw_api.lo | 12 + .../ext/ffi_c/libffi-i386/src/prep_cif.lo | 12 + .../ext/ffi_c/libffi-i386/src/raw_api.lo | 12 + .../ext/ffi_c/libffi-i386/src/types.lo | 12 + .../ffi_c/libffi-i386/src/x86/.deps/.dirstamp | 0 .../ext/ffi_c/libffi-i386/src/x86/.dirstamp | 0 .../ffi_c/libffi-i386/src/x86/.libs/darwin.o | Bin 0 -> 2660 bytes .../libffi-i386/src/x86/.libs/darwin64.o | Bin 0 -> 168 bytes .../ext/ffi_c/libffi-i386/src/x86/.libs/ffi.o | Bin 0 -> 11008 bytes .../ffi_c/libffi-i386/src/x86/.libs/ffi64.o | Bin 0 -> 1424 bytes .../ext/ffi_c/libffi-i386/src/x86/darwin.lo | 12 + .../ext/ffi_c/libffi-i386/src/x86/darwin64.lo | 12 + .../ext/ffi_c/libffi-i386/src/x86/ffi.lo | 12 + .../ext/ffi_c/libffi-i386/src/x86/ffi64.lo | 12 + .../ffi-1.9.18/ext/ffi_c/libffi-i386/stamp-h1 | 1 + .../ext/ffi_c/libffi-i386/testsuite/Makefile | 500 + .../.libs/libffi_convenience.a | Bin 0 -> 100616 bytes .../libffi-universal-darwin17/include/ffi.h | 7 + .../include/ffitarget.h | 7 + .../ffi_c/libffi-x86_64/.libs/libffi.5.dylib | Bin 0 -> 27456 bytes .../ffi_c/libffi-x86_64/.libs/libffi.dylib | 1 + .../ext/ffi_c/libffi-x86_64/.libs/libffi.la | 1 + .../ext/ffi_c/libffi-x86_64/.libs/libffi.lai | 41 + .../libffi-x86_64/.libs/libffi_convenience.a | Bin 0 -> 55616 bytes .../libffi-x86_64/.libs/libffi_convenience.la | 1 + .../ext/ffi_c/libffi-x86_64/Makefile | 1820 ++ .../ext/ffi_c/libffi-x86_64/config.log | 1144 + .../ext/ffi_c/libffi-x86_64/config.status | 2336 +++ .../ext/ffi_c/libffi-x86_64/fficonfig.h | 200 + .../ext/ffi_c/libffi-x86_64/include/Makefile | 487 + .../ext/ffi_c/libffi-x86_64/include/ffi.h | 427 + .../ffi_c/libffi-x86_64/include/ffitarget.h | 1 + .../ext/ffi_c/libffi-x86_64/libffi.la | 41 + .../ext/ffi_c/libffi-x86_64/libffi.pc | 10 + .../ffi_c/libffi-x86_64/libffi_convenience.la | 41 + .../ext/ffi_c/libffi-x86_64/libtool | 10056 +++++++++ .../ext/ffi_c/libffi-x86_64/man/Makefile | 466 + .../ffi_c/libffi-x86_64/src/.deps/.dirstamp | 0 .../ext/ffi_c/libffi-x86_64/src/.dirstamp | 0 .../ffi_c/libffi-x86_64/src/.libs/closures.o | Bin 0 -> 2908 bytes .../ext/ffi_c/libffi-x86_64/src/.libs/debug.o | Bin 0 -> 3612 bytes .../libffi-x86_64/src/.libs/java_raw_api.o | Bin 0 -> 9736 bytes .../ffi_c/libffi-x86_64/src/.libs/prep_cif.o | Bin 0 -> 5656 bytes .../ffi_c/libffi-x86_64/src/.libs/raw_api.o | Bin 0 -> 8668 bytes .../ext/ffi_c/libffi-x86_64/src/.libs/types.o | Bin 0 -> 4168 bytes .../ext/ffi_c/libffi-x86_64/src/closures.lo | 12 + .../ext/ffi_c/libffi-x86_64/src/debug.lo | 12 + .../ffi_c/libffi-x86_64/src/java_raw_api.lo | 12 + .../ext/ffi_c/libffi-x86_64/src/prep_cif.lo | 12 + .../ext/ffi_c/libffi-x86_64/src/raw_api.lo | 12 + .../ext/ffi_c/libffi-x86_64/src/types.lo | 12 + .../libffi-x86_64/src/x86/.deps/.dirstamp | 0 .../ext/ffi_c/libffi-x86_64/src/x86/.dirstamp | 0 .../libffi-x86_64/src/x86/.libs/darwin.o | Bin 0 -> 200 bytes .../libffi-x86_64/src/x86/.libs/darwin64.o | Bin 0 -> 1528 bytes .../ffi_c/libffi-x86_64/src/x86/.libs/ffi.o | Bin 0 -> 1588 bytes .../ffi_c/libffi-x86_64/src/x86/.libs/ffi64.o | Bin 0 -> 15652 bytes .../ext/ffi_c/libffi-x86_64/src/x86/darwin.lo | 12 + .../ffi_c/libffi-x86_64/src/x86/darwin64.lo | 12 + .../ext/ffi_c/libffi-x86_64/src/x86/ffi.lo | 12 + .../ext/ffi_c/libffi-x86_64/src/x86/ffi64.lo | 12 + .../ext/ffi_c/libffi-x86_64/stamp-h1 | 1 + .../ffi_c/libffi-x86_64/testsuite/Makefile | 500 + .../gems/ffi-1.9.18/ext/ffi_c/libffi.bsd.mk | 34 + .../ffi-1.9.18/ext/ffi_c/libffi.darwin.mk | 95 + .../gems/ffi-1.9.18/ext/ffi_c/libffi.gnu.mk | 31 + .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.mk | 13 + .../gems/ffi-1.9.18/ext/ffi_c/libffi.vc.mk | 26 + .../gems/ffi-1.9.18/ext/ffi_c/libffi.vc64.mk | 26 + .../ffi-1.9.18/ext/ffi_c/libffi/ChangeLog | 4600 +++++ .../ext/ffi_c/libffi/ChangeLog.libffi | 584 + .../ext/ffi_c/libffi/ChangeLog.libgcj | 40 + .../ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.v1 | 764 + .../gems/ffi-1.9.18/ext/ffi_c/libffi/LICENSE | 21 + .../ffi-1.9.18/ext/ffi_c/libffi/Makefile.am | 196 + .../ffi-1.9.18/ext/ffi_c/libffi/Makefile.in | 1820 ++ .../ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc | 141 + .../ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc64 | 141 + .../gems/ffi-1.9.18/ext/ffi_c/libffi/README | 342 + .../ffi-1.9.18/ext/ffi_c/libffi/acinclude.m4 | 92 + .../ffi-1.9.18/ext/ffi_c/libffi/aclocal.m4 | 1873 ++ .../ffi-1.9.18/ext/ffi_c/libffi/build-ios.sh | 67 + .../gems/ffi-1.9.18/ext/ffi_c/libffi/compile | 143 + .../ffi-1.9.18/ext/ffi_c/libffi/config.guess | 1501 ++ .../ffi-1.9.18/ext/ffi_c/libffi/config.sub | 1705 ++ .../ffi-1.9.18/ext/ffi_c/libffi/configure | 17191 ++++++++++++++++ .../ffi-1.9.18/ext/ffi_c/libffi/configure.ac | 496 + .../ext/ffi_c/libffi/configure.host | 11 + .../gems/ffi-1.9.18/ext/ffi_c/libffi/depcomp | 630 + .../ext/ffi_c/libffi/doc/libffi.info | 593 + .../ext/ffi_c/libffi/doc/libffi.texi | 600 + .../ffi-1.9.18/ext/ffi_c/libffi/doc/stamp-vti | 4 + .../ext/ffi_c/libffi/doc/version.texi | 4 + .../ext/ffi_c/libffi/fficonfig.h.in | 199 + .../ffi-1.9.18/ext/ffi_c/libffi/fficonfig.hw | 57 + .../ext/ffi_c/libffi/include/Makefile.am | 9 + .../ext/ffi_c/libffi/include/Makefile.in | 487 + .../ext/ffi_c/libffi/include/ffi.h.in | 427 + .../ext/ffi_c/libffi/include/ffi.h.vc | 427 + .../ext/ffi_c/libffi/include/ffi.h.vc64 | 427 + .../ext/ffi_c/libffi/include/ffi_common.h | 126 + .../ffi-1.9.18/ext/ffi_c/libffi/install-sh | 520 + .../ffi-1.9.18/ext/ffi_c/libffi/libffi.pc.in | 10 + .../ext/ffi_c/libffi/libtool-version | 29 + .../ffi-1.9.18/ext/ffi_c/libffi/ltmain.sh | 9636 +++++++++ .../ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 | 176 + .../ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 | 195 + .../libffi/m4/ax_check_compiler_flags.m4 | 76 + .../ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 | 63 + .../ext/ffi_c/libffi/m4/ax_configure_args.m4 | 70 + .../ext/ffi_c/libffi/m4/ax_enable_builddir.m4 | 300 + .../ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 | 215 + .../ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 | 79 + .../ffi-1.9.18/ext/ffi_c/libffi/m4/libtool.m4 | 7831 +++++++ .../ext/ffi_c/libffi/m4/ltoptions.m4 | 369 + .../ffi-1.9.18/ext/ffi_c/libffi/m4/ltsugar.m4 | 123 + .../ext/ffi_c/libffi/m4/ltversion.m4 | 23 + .../ext/ffi_c/libffi/m4/lt~obsolete.m4 | 98 + .../ext/ffi_c/libffi/man/Makefile.am | 8 + .../ext/ffi_c/libffi/man/Makefile.in | 466 + .../ffi-1.9.18/ext/ffi_c/libffi/man/ffi.3 | 31 + .../ext/ffi_c/libffi/man/ffi_call.3 | 103 + .../ext/ffi_c/libffi/man/ffi_prep_cif.3 | 66 + .../gems/ffi-1.9.18/ext/ffi_c/libffi/mdate-sh | 201 + .../gems/ffi-1.9.18/ext/ffi_c/libffi/missing | 376 + .../gems/ffi-1.9.18/ext/ffi_c/libffi/msvcc.sh | 197 + .../ext/ffi_c/libffi/src/alpha/ffi.c | 284 + .../ext/ffi_c/libffi/src/alpha/ffitarget.h | 48 + .../ext/ffi_c/libffi/src/alpha/osf.S | 387 + .../ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffi.c | 728 + .../ext/ffi_c/libffi/src/arm/ffitarget.h | 65 + .../ext/ffi_c/libffi/src/arm/gentramp.sh | 118 + .../ext/ffi_c/libffi/src/arm/sysv.S | 497 + .../ext/ffi_c/libffi/src/arm/trampoline.S | 4450 ++++ .../ext/ffi_c/libffi/src/avr32/ffi.c | 423 + .../ext/ffi_c/libffi/src/avr32/ffitarget.h | 50 + .../ext/ffi_c/libffi/src/avr32/sysv.S | 208 + .../ext/ffi_c/libffi/src/closures.c | 615 + .../ext/ffi_c/libffi/src/cris/ffi.c | 383 + .../ext/ffi_c/libffi/src/cris/ffitarget.h | 51 + .../ext/ffi_c/libffi/src/cris/sysv.S | 215 + .../ffi-1.9.18/ext/ffi_c/libffi/src/debug.c | 59 + .../ext/ffi_c/libffi/src/dlmalloc.c | 5161 +++++ .../ext/ffi_c/libffi/src/frv/eabi.S | 128 + .../ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffi.c | 292 + .../ext/ffi_c/libffi/src/frv/ffitarget.h | 57 + .../ext/ffi_c/libffi/src/ia64/ffi.c | 582 + .../ext/ffi_c/libffi/src/ia64/ffitarget.h | 50 + .../ext/ffi_c/libffi/src/ia64/ia64_flags.h | 40 + .../ext/ffi_c/libffi/src/ia64/unix.S | 560 + .../ext/ffi_c/libffi/src/java_raw_api.c | 356 + .../ext/ffi_c/libffi/src/m32r/ffi.c | 232 + .../ext/ffi_c/libffi/src/m32r/ffitarget.h | 48 + .../ext/ffi_c/libffi/src/m32r/sysv.S | 121 + .../ext/ffi_c/libffi/src/m68k/ffi.c | 288 + .../ext/ffi_c/libffi/src/m68k/ffitarget.h | 49 + .../ext/ffi_c/libffi/src/m68k/sysv.S | 270 + .../ext/ffi_c/libffi/src/mips/ffi.c | 1038 + .../ext/ffi_c/libffi/src/mips/ffitarget.h | 242 + .../ext/ffi_c/libffi/src/mips/n32.S | 591 + .../ext/ffi_c/libffi/src/mips/o32.S | 381 + .../ext/ffi_c/libffi/src/moxie/eabi.S | 128 + .../ext/ffi_c/libffi/src/moxie/ffi.c | 276 + .../ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffi.c | 719 + .../ext/ffi_c/libffi/src/pa/ffitarget.h | 78 + .../ext/ffi_c/libffi/src/pa/hpux32.S | 368 + .../ext/ffi_c/libffi/src/pa/linux.S | 357 + .../ext/ffi_c/libffi/src/powerpc/aix.S | 328 + .../ffi_c/libffi/src/powerpc/aix_closure.S | 445 + .../ext/ffi_c/libffi/src/powerpc/asm.h | 125 + .../ext/ffi_c/libffi/src/powerpc/darwin.S | 383 + .../ffi_c/libffi/src/powerpc/darwin_closure.S | 575 + .../ext/ffi_c/libffi/src/powerpc/ffi.c | 1448 ++ .../ext/ffi_c/libffi/src/powerpc/ffi_darwin.c | 1359 ++ .../ext/ffi_c/libffi/src/powerpc/ffitarget.h | 139 + .../ext/ffi_c/libffi/src/powerpc/linux64.S | 187 + .../libffi/src/powerpc/linux64_closure.S | 236 + .../ffi_c/libffi/src/powerpc/ppc_closure.S | 327 + .../ext/ffi_c/libffi/src/powerpc/sysv.S | 219 + .../ext/ffi_c/libffi/src/prep_cif.c | 177 + .../ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c | 254 + .../ext/ffi_c/libffi/src/s390/ffi.c | 780 + .../ext/ffi_c/libffi/src/s390/ffitarget.h | 62 + .../ext/ffi_c/libffi/src/s390/sysv.S | 434 + .../ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffi.c | 716 + .../ext/ffi_c/libffi/src/sh/ffitarget.h | 49 + .../ffi-1.9.18/ext/ffi_c/libffi/src/sh/sysv.S | 850 + .../ext/ffi_c/libffi/src/sh64/ffi.c | 468 + .../ext/ffi_c/libffi/src/sh64/ffitarget.h | 53 + .../ext/ffi_c/libffi/src/sh64/sysv.S | 539 + .../ext/ffi_c/libffi/src/sparc/ffi.c | 669 + .../ext/ffi_c/libffi/src/sparc/ffitarget.h | 68 + .../ext/ffi_c/libffi/src/sparc/v8.S | 313 + .../ext/ffi_c/libffi/src/sparc/v9.S | 307 + .../ffi-1.9.18/ext/ffi_c/libffi/src/types.c | 77 + .../ext/ffi_c/libffi/src/x86/darwin.S | 444 + .../ext/ffi_c/libffi/src/x86/darwin64.S | 416 + .../ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c | 644 + .../ext/ffi_c/libffi/src/x86/ffi64.c | 635 + .../ext/ffi_c/libffi/src/x86/ffitarget.h | 121 + .../ext/ffi_c/libffi/src/x86/freebsd.S | 458 + .../ext/ffi_c/libffi/src/x86/sysv.S | 468 + .../ext/ffi_c/libffi/src/x86/unix64.S | 426 + .../ext/ffi_c/libffi/src/x86/win32.S | 1065 + .../ext/ffi_c/libffi/src/x86/win64.S | 468 + .../ext/ffi_c/libffi/testsuite/Makefile.am | 80 + .../ext/ffi_c/libffi/testsuite/Makefile.in | 500 + .../ffi_c/libffi/testsuite/config/default.exp | 1 + .../ffi_c/libffi/testsuite/lib/libffi-dg.exp | 300 + .../ext/ffi_c/libffi/testsuite/lib/libffi.exp | 350 + .../libffi/testsuite/lib/target-libpath.exp | 263 + .../ffi_c/libffi/testsuite/lib/wrapper.exp | 45 + .../libffi/testsuite/libffi.call/call.exp | 32 + .../testsuite/libffi.call/closure_fn0.c | 89 + .../testsuite/libffi.call/closure_fn1.c | 81 + .../testsuite/libffi.call/closure_fn2.c | 81 + .../testsuite/libffi.call/closure_fn3.c | 82 + .../testsuite/libffi.call/closure_fn4.c | 89 + .../testsuite/libffi.call/closure_fn5.c | 92 + .../testsuite/libffi.call/closure_fn6.c | 90 + .../testsuite/libffi.call/closure_loc_fn0.c | 95 + .../testsuite/libffi.call/closure_stdcall.c | 64 + .../libffi/testsuite/libffi.call/cls_12byte.c | 94 + .../libffi/testsuite/libffi.call/cls_16byte.c | 95 + .../libffi/testsuite/libffi.call/cls_18byte.c | 96 + .../libffi/testsuite/libffi.call/cls_19byte.c | 102 + .../testsuite/libffi.call/cls_1_1byte.c | 89 + .../libffi/testsuite/libffi.call/cls_20byte.c | 91 + .../testsuite/libffi.call/cls_20byte1.c | 93 + .../libffi/testsuite/libffi.call/cls_24byte.c | 113 + .../libffi/testsuite/libffi.call/cls_2byte.c | 90 + .../testsuite/libffi.call/cls_3_1byte.c | 95 + .../libffi/testsuite/libffi.call/cls_3byte1.c | 90 + .../libffi/testsuite/libffi.call/cls_3byte2.c | 90 + .../testsuite/libffi.call/cls_4_1byte.c | 98 + .../libffi/testsuite/libffi.call/cls_4byte.c | 90 + .../testsuite/libffi.call/cls_5_1_byte.c | 109 + .../libffi/testsuite/libffi.call/cls_5byte.c | 98 + .../libffi/testsuite/libffi.call/cls_64byte.c | 124 + .../testsuite/libffi.call/cls_6_1_byte.c | 113 + .../libffi/testsuite/libffi.call/cls_6byte.c | 99 + .../testsuite/libffi.call/cls_7_1_byte.c | 117 + .../libffi/testsuite/libffi.call/cls_7byte.c | 97 + .../libffi/testsuite/libffi.call/cls_8byte.c | 88 + .../libffi/testsuite/libffi.call/cls_9byte1.c | 90 + .../libffi/testsuite/libffi.call/cls_9byte2.c | 91 + .../testsuite/libffi.call/cls_align_double.c | 93 + .../testsuite/libffi.call/cls_align_float.c | 91 + .../libffi.call/cls_align_longdouble.c | 92 + .../libffi.call/cls_align_longdouble_split.c | 134 + .../libffi.call/cls_align_longdouble_split2.c | 117 + .../testsuite/libffi.call/cls_align_pointer.c | 95 + .../testsuite/libffi.call/cls_align_sint16.c | 91 + .../testsuite/libffi.call/cls_align_sint32.c | 91 + .../testsuite/libffi.call/cls_align_sint64.c | 92 + .../testsuite/libffi.call/cls_align_uint16.c | 91 + .../testsuite/libffi.call/cls_align_uint32.c | 91 + .../testsuite/libffi.call/cls_align_uint64.c | 93 + .../testsuite/libffi.call/cls_dbls_struct.c | 66 + .../libffi/testsuite/libffi.call/cls_double.c | 43 + .../testsuite/libffi.call/cls_double_va.c | 60 + .../libffi/testsuite/libffi.call/cls_float.c | 42 + .../testsuite/libffi.call/cls_longdouble.c | 105 + .../testsuite/libffi.call/cls_longdouble_va.c | 60 + .../testsuite/libffi.call/cls_multi_schar.c | 74 + .../testsuite/libffi.call/cls_multi_sshort.c | 74 + .../libffi.call/cls_multi_sshortchar.c | 86 + .../testsuite/libffi.call/cls_multi_uchar.c | 91 + .../testsuite/libffi.call/cls_multi_ushort.c | 74 + .../libffi.call/cls_multi_ushortchar.c | 86 + .../testsuite/libffi.call/cls_pointer.c | 74 + .../testsuite/libffi.call/cls_pointer_stack.c | 140 + .../libffi/testsuite/libffi.call/cls_schar.c | 44 + .../libffi/testsuite/libffi.call/cls_sint.c | 42 + .../libffi/testsuite/libffi.call/cls_sshort.c | 42 + .../libffi/testsuite/libffi.call/cls_uchar.c | 42 + .../libffi/testsuite/libffi.call/cls_uint.c | 43 + .../testsuite/libffi.call/cls_ulonglong.c | 47 + .../libffi/testsuite/libffi.call/cls_ushort.c | 43 + .../testsuite/libffi.call/err_bad_abi.c | 36 + .../testsuite/libffi.call/err_bad_typedef.c | 26 + .../libffi/testsuite/libffi.call/ffitest.h | 153 + .../libffi/testsuite/libffi.call/float.c | 59 + .../libffi/testsuite/libffi.call/float1.c | 58 + .../libffi/testsuite/libffi.call/float2.c | 58 + .../libffi/testsuite/libffi.call/float3.c | 72 + .../libffi/testsuite/libffi.call/float4.c | 62 + .../testsuite/libffi.call/huge_struct.c | 342 + .../ffi_c/libffi/testsuite/libffi.call/many.c | 69 + .../libffi/testsuite/libffi.call/many_win32.c | 63 + .../libffi/testsuite/libffi.call/negint.c | 53 + .../testsuite/libffi.call/nested_struct.c | 152 + .../testsuite/libffi.call/nested_struct1.c | 161 + .../testsuite/libffi.call/nested_struct10.c | 133 + .../testsuite/libffi.call/nested_struct2.c | 110 + .../testsuite/libffi.call/nested_struct3.c | 111 + .../testsuite/libffi.call/nested_struct4.c | 111 + .../testsuite/libffi.call/nested_struct5.c | 112 + .../testsuite/libffi.call/nested_struct6.c | 131 + .../testsuite/libffi.call/nested_struct7.c | 111 + .../testsuite/libffi.call/nested_struct8.c | 131 + .../testsuite/libffi.call/nested_struct9.c | 131 + .../libffi/testsuite/libffi.call/problem1.c | 90 + .../libffi/testsuite/libffi.call/promotion.c | 59 + .../libffi/testsuite/libffi.call/pyobjc-tc.c | 114 + .../libffi/testsuite/libffi.call/return_dbl.c | 35 + .../testsuite/libffi.call/return_dbl1.c | 43 + .../testsuite/libffi.call/return_dbl2.c | 42 + .../libffi/testsuite/libffi.call/return_fl.c | 35 + .../libffi/testsuite/libffi.call/return_fl1.c | 36 + .../libffi/testsuite/libffi.call/return_fl2.c | 49 + .../libffi/testsuite/libffi.call/return_fl3.c | 42 + .../libffi/testsuite/libffi.call/return_ldl.c | 34 + .../libffi/testsuite/libffi.call/return_ll.c | 41 + .../libffi/testsuite/libffi.call/return_ll1.c | 43 + .../libffi/testsuite/libffi.call/return_sc.c | 36 + .../libffi/testsuite/libffi.call/return_sl.c | 38 + .../libffi/testsuite/libffi.call/return_uc.c | 38 + .../libffi/testsuite/libffi.call/return_ul.c | 38 + .../testsuite/libffi.call/stret_large.c | 145 + .../testsuite/libffi.call/stret_large2.c | 148 + .../testsuite/libffi.call/stret_medium.c | 124 + .../testsuite/libffi.call/stret_medium2.c | 125 + .../libffi/testsuite/libffi.call/strlen.c | 44 + .../testsuite/libffi.call/strlen_win32.c | 44 + .../libffi/testsuite/libffi.call/struct1.c | 65 + .../libffi/testsuite/libffi.call/struct2.c | 67 + .../libffi/testsuite/libffi.call/struct3.c | 59 + .../libffi/testsuite/libffi.call/struct4.c | 63 + .../libffi/testsuite/libffi.call/struct5.c | 65 + .../libffi/testsuite/libffi.call/struct6.c | 64 + .../libffi/testsuite/libffi.call/struct7.c | 74 + .../libffi/testsuite/libffi.call/struct8.c | 80 + .../libffi/testsuite/libffi.call/struct9.c | 67 + .../testsuite/libffi.call/testclosure.c | 70 + .../testsuite/libffi.special/ffitestcxx.h | 96 + .../testsuite/libffi.special/special.exp | 35 + .../testsuite/libffi.special/unwindtest.cc | 124 + .../libffi.special/unwindtest_ffi_call.cc | 53 + .../ffi-1.9.18/ext/ffi_c/libffi/texinfo.tex | 7210 +++++++ .../2.3.0/gems/ffi-1.9.18/ext/ffi_c/rbffi.h | 57 + .../gems/ffi-1.9.18/ext/ffi_c/rbffi_endian.h | 59 + .../gems/ffi-1.9.18/ext/ffi_c/win32/stdbool.h | 8 + .../gems/ffi-1.9.18/ext/ffi_c/win32/stdint.h | 201 + .../ruby/2.3.0/gems/ffi-1.9.18/ffi.gemspec | 23 + .../ruby/2.3.0/gems/ffi-1.9.18/gen/Rakefile | 30 + .../ruby/2.3.0/gems/ffi-1.9.18/lib/ffi.rb | 20 + .../gems/ffi-1.9.18/lib/ffi/autopointer.rb | 203 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/buffer.rb | 4 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/callback.rb | 4 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/enum.rb | 172 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/errno.rb | 43 + .../ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/ffi.rb | 44 + .../ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/io.rb | 62 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/library.rb | 538 + .../gems/ffi-1.9.18/lib/ffi/managedstruct.rb | 84 + .../gems/ffi-1.9.18/lib/ffi/memorypointer.rb | 1 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/platform.rb | 159 + .../lib/ffi/platform/aarch64-linux/types.conf | 104 + .../lib/ffi/platform/arm-linux/types.conf | 104 + .../lib/ffi/platform/i386-cygwin/types.conf | 3 + .../lib/ffi/platform/i386-darwin/types.conf | 100 + .../lib/ffi/platform/i386-freebsd/types.conf | 152 + .../lib/ffi/platform/i386-gnu/types.conf | 107 + .../lib/ffi/platform/i386-linux/types.conf | 103 + .../lib/ffi/platform/i386-netbsd/types.conf | 126 + .../lib/ffi/platform/i386-openbsd/types.conf | 128 + .../lib/ffi/platform/i386-solaris/types.conf | 122 + .../lib/ffi/platform/i386-windows/types.conf | 105 + .../lib/ffi/platform/ia64-linux/types.conf | 104 + .../lib/ffi/platform/mips-linux/types.conf | 102 + .../ffi/platform/mips64el-linux/types.conf | 104 + .../lib/ffi/platform/mipsel-linux/types.conf | 102 + .../lib/ffi/platform/powerpc-aix/types.conf | 180 + .../ffi/platform/powerpc-darwin/types.conf | 100 + .../lib/ffi/platform/powerpc-linux/types.conf | 100 + .../ffi/platform/powerpc64-linux/types.conf | 104 + .../lib/ffi/platform/s390-linux/types.conf | 102 + .../lib/ffi/platform/s390x-linux/types.conf | 102 + .../lib/ffi/platform/sparc-linux/types.conf | 102 + .../lib/ffi/platform/sparc-solaris/types.conf | 128 + .../ffi/platform/sparcv9-solaris/types.conf | 128 + .../lib/ffi/platform/x86_64-cygwin/types.conf | 3 + .../lib/ffi/platform/x86_64-darwin/types.conf | 126 + .../ffi/platform/x86_64-freebsd/types.conf | 128 + .../lib/ffi/platform/x86_64-linux/types.conf | 102 + .../lib/ffi/platform/x86_64-netbsd/types.conf | 128 + .../ffi/platform/x86_64-openbsd/types.conf | 134 + .../ffi/platform/x86_64-solaris/types.conf | 122 + .../ffi/platform/x86_64-windows/types.conf | 27 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/pointer.rb | 160 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/struct.rb | 373 + .../lib/ffi/struct_layout_builder.rb | 227 + .../lib/ffi/tools/const_generator.rb | 229 + .../ffi-1.9.18/lib/ffi/tools/generator.rb | 60 + .../lib/ffi/tools/generator_task.rb | 36 + .../lib/ffi/tools/struct_generator.rb | 194 + .../lib/ffi/tools/types_generator.rb | 134 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/types.rb | 194 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/union.rb | 43 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/variadic.rb | 78 + .../2.3.0/gems/ffi-1.9.18/lib/ffi/version.rb | 4 + .../2.3.0/gems/ffi-1.9.18/lib/ffi_c.bundle | Bin 0 -> 349780 bytes .../2.3.0/gems/ffi-1.9.18/libtest/Benchmark.c | 52 + .../2.3.0/gems/ffi-1.9.18/libtest/BoolTest.c | 34 + .../gems/ffi-1.9.18/libtest/BufferTest.c | 31 + .../gems/ffi-1.9.18/libtest/ClosureTest.c | 205 + .../2.3.0/gems/ffi-1.9.18/libtest/EnumTest.c | 51 + .../gems/ffi-1.9.18/libtest/FunctionTest.c | 70 + .../2.3.0/gems/ffi-1.9.18/libtest/GNUmakefile | 149 + .../gems/ffi-1.9.18/libtest/GlobalVariable.c | 62 + .../gems/ffi-1.9.18/libtest/LastErrorTest.c | 21 + .../gems/ffi-1.9.18/libtest/NumberTest.c | 132 + .../gems/ffi-1.9.18/libtest/PointerTest.c | 63 + .../gems/ffi-1.9.18/libtest/ReferenceTest.c | 23 + .../gems/ffi-1.9.18/libtest/StringTest.c | 34 + .../gems/ffi-1.9.18/libtest/StructTest.c | 243 + .../2.3.0/gems/ffi-1.9.18/libtest/UnionTest.c | 43 + .../gems/ffi-1.9.18/libtest/VariadicTest.c | 99 + .../gems/ffi-1.9.18/spec/ffi/LICENSE.SPECS | 22 + .../spec/ffi/async_callback_spec.rb | 35 + .../gems/ffi-1.9.18/spec/ffi/bool_spec.rb | 32 + .../gems/ffi-1.9.18/spec/ffi/buffer_spec.rb | 279 + .../gems/ffi-1.9.18/spec/ffi/callback_spec.rb | 773 + .../ffi-1.9.18/spec/ffi/custom_param_type.rb | 37 + .../ffi-1.9.18/spec/ffi/custom_type_spec.rb | 74 + .../gems/ffi-1.9.18/spec/ffi/dup_spec.rb | 52 + .../gems/ffi-1.9.18/spec/ffi/enum_spec.rb | 423 + .../gems/ffi-1.9.18/spec/ffi/errno_spec.rb | 20 + .../gems/ffi-1.9.18/spec/ffi/ffi_spec.rb | 28 + .../ffi-1.9.18/spec/ffi/fixtures/Benchmark.c | 52 + .../ffi-1.9.18/spec/ffi/fixtures/BoolTest.c | 34 + .../ffi-1.9.18/spec/ffi/fixtures/BufferTest.c | 31 + .../spec/ffi/fixtures/ClosureTest.c | 205 + .../ffi-1.9.18/spec/ffi/fixtures/EnumTest.c | 51 + .../spec/ffi/fixtures/FunctionTest.c | 142 + .../ffi-1.9.18/spec/ffi/fixtures/GNUmakefile | 149 + .../spec/ffi/fixtures/GlobalVariable.c | 62 + .../spec/ffi/fixtures/LastErrorTest.c | 21 + .../ffi-1.9.18/spec/ffi/fixtures/NumberTest.c | 132 + .../ffi-1.9.18/spec/ffi/fixtures/PipeHelper.h | 21 + .../spec/ffi/fixtures/PipeHelperPosix.c | 41 + .../spec/ffi/fixtures/PipeHelperWindows.c | 72 + .../spec/ffi/fixtures/PointerTest.c | 63 + .../spec/ffi/fixtures/ReferenceTest.c | 23 + .../ffi-1.9.18/spec/ffi/fixtures/StringTest.c | 34 + .../ffi-1.9.18/spec/ffi/fixtures/StructTest.c | 243 + .../ffi-1.9.18/spec/ffi/fixtures/UnionTest.c | 43 + .../spec/ffi/fixtures/VariadicTest.c | 99 + .../ffi-1.9.18/spec/ffi/fixtures/classes.rb | 438 + .../gems/ffi-1.9.18/spec/ffi/function_spec.rb | 97 + .../2.3.0/gems/ffi-1.9.18/spec/ffi/io_spec.rb | 16 + .../gems/ffi-1.9.18/spec/ffi/library_spec.rb | 286 + .../gems/ffi-1.9.18/spec/ffi/long_double.rb | 30 + .../spec/ffi/managed_struct_spec.rb | 68 + .../ffi-1.9.18/spec/ffi/memorypointer_spec.rb | 78 + .../gems/ffi-1.9.18/spec/ffi/number_spec.rb | 247 + .../gems/ffi-1.9.18/spec/ffi/platform_spec.rb | 114 + .../gems/ffi-1.9.18/spec/ffi/pointer_spec.rb | 285 + .../spec/ffi/rbx/attach_function_spec.rb | 34 + .../spec/ffi/rbx/memory_pointer_spec.rb | 194 + .../ffi-1.9.18/spec/ffi/rbx/spec_helper.rb | 6 + .../ffi-1.9.18/spec/ffi/rbx/struct_spec.rb | 18 + .../gems/ffi-1.9.18/spec/ffi/spec_helper.rb | 93 + .../gems/ffi-1.9.18/spec/ffi/string_spec.rb | 118 + .../gems/ffi-1.9.18/spec/ffi/strptr_spec.rb | 50 + .../ffi-1.9.18/spec/ffi/struct_by_ref_spec.rb | 43 + .../spec/ffi/struct_callback_spec.rb | 69 + .../spec/ffi/struct_initialize_spec.rb | 35 + .../ffi-1.9.18/spec/ffi/struct_packed_spec.rb | 50 + .../gems/ffi-1.9.18/spec/ffi/struct_spec.rb | 886 + .../gems/ffi-1.9.18/spec/ffi/typedef_spec.rb | 91 + .../gems/ffi-1.9.18/spec/ffi/union_spec.rb | 67 + .../gems/ffi-1.9.18/spec/ffi/variadic_spec.rb | 132 + .../ruby/2.3.0/gems/ffi-1.9.18/spec/spec.opts | 4 + .../gems/forwardable-extended-2.6.0/Gemfile | 24 + .../gems/forwardable-extended-2.6.0/LICENSE | 19 + .../gems/forwardable-extended-2.6.0/Rakefile | 13 + .../lib/forwardable/extended.rb | 202 + .../lib/forwardable/extended/version.rb | 9 + .../gems/http_parser.rb-0.6.0/.gitignore | 11 + .../gems/http_parser.rb-0.6.0/.gitmodules | 6 + .../2.3.0/gems/http_parser.rb-0.6.0/Gemfile | 2 + .../gems/http_parser.rb-0.6.0/Gemfile.lock | 39 + .../gems/http_parser.rb-0.6.0/LICENSE-MIT | 20 + .../2.3.0/gems/http_parser.rb-0.6.0/README.md | 90 + .../2.3.0/gems/http_parser.rb-0.6.0/Rakefile | 6 + .../http_parser.rb-0.6.0/bench/standalone.rb | 23 + .../gems/http_parser.rb-0.6.0/bench/thin.rb | 58 + .../ext/ruby_http_parser/.RUBYARCHDIR.time | 0 .../ext/ruby_http_parser/.gitignore | 1 + .../RubyHttpParserService.java | 18 + .../ext/ruby_http_parser/ext_help.h | 18 + .../ext/ruby_http_parser/extconf.rb | 24 + .../org/ruby_http_parser/RubyHttpParser.java | 495 + .../ext/ruby_http_parser/ruby_http_parser.c | 515 + .../ext/ruby_http_parser/vendor/.gitkeep | 0 .../vendor/http-parser-java/AUTHORS | 32 + .../vendor/http-parser-java/LICENSE-MIT | 48 + .../vendor/http-parser-java/README.md | 183 + .../vendor/http-parser-java/TODO | 28 + .../vendor/http-parser-java/build.xml | 74 + .../vendor/http-parser-java/http_parser.c | 2175 ++ .../vendor/http-parser-java/http_parser.gyp | 79 + .../vendor/http-parser-java/http_parser.h | 304 + .../http-parser-java/src/Http-parser.java.iml | 22 + .../src/impl/http_parser/FieldData.java | 41 + .../src/impl/http_parser/HTTPCallback.java | 8 + .../impl/http_parser/HTTPDataCallback.java | 34 + .../impl/http_parser/HTTPErrorCallback.java | 12 + .../src/impl/http_parser/HTTPException.java | 9 + .../src/impl/http_parser/HTTPMethod.java | 107 + .../src/impl/http_parser/HTTPParser.java | 36 + .../src/impl/http_parser/HTTPParserUrl.java | 76 + .../src/impl/http_parser/ParserSettings.java | 256 + .../src/impl/http_parser/ParserType.java | 13 + .../src/impl/http_parser/Util.java | 111 + .../http_parser/lolevel/HTTPCallback.java | 5 + .../http_parser/lolevel/HTTPDataCallback.java | 25 + .../lolevel/HTTPErrorCallback.java | 7 + .../impl/http_parser/lolevel/HTTPParser.java | 2161 ++ .../http_parser/lolevel/ParserSettings.java | 83 + .../src/test/http_parser/lolevel/Message.java | 374 + .../test/http_parser/lolevel/ParseUrl.java | 51 + .../test/http_parser/lolevel/Requests.java | 69 + .../test/http_parser/lolevel/Responses.java | 52 + .../src/test/http_parser/lolevel/Test.java | 16 + .../lolevel/TestHeaderOverflowError.java | 48 + .../http_parser/lolevel/TestLoaderNG.java | 212 + .../lolevel/TestNoOverflowLongBody.java | 62 + .../test/http_parser/lolevel/UnitTest.java | 117 + .../src/test/http_parser/lolevel/Upgrade.java | 27 + .../src/test/http_parser/lolevel/Url.java | 127 + .../src/test/http_parser/lolevel/Util.java | 236 + .../lolevel/WrongContentLength.java | 59 + .../vendor/http-parser-java/test.c | 3425 +++ .../vendor/http-parser-java/tests.dumped | 845 + .../vendor/http-parser-java/tests.utf8 | 17 + .../http-parser-java/tools/byte_constants.rb | 6 + .../http-parser-java/tools/const_char.rb | 13 + .../vendor/http-parser-java/tools/lowcase.rb | 15 + .../http-parser-java/tools/parse_tests.rb | 33 + .../vendor/http-parser/AUTHORS | 32 + .../vendor/http-parser/CONTRIBUTIONS | 4 + .../vendor/http-parser/LICENSE-MIT | 23 + .../vendor/http-parser/README.md | 178 + .../vendor/http-parser/http_parser.c | 2058 ++ .../vendor/http-parser/http_parser.gyp | 79 + .../vendor/http-parser/http_parser.h | 312 + .../vendor/http-parser/test.c | 2876 +++ .../http_parser.rb.gemspec | 28 + .../http_parser.rb-0.6.0/lib/http/parser.rb | 1 + .../http_parser.rb-0.6.0/lib/http_parser.rb | 21 + .../http_parser.rb-0.6.0/spec/parser_spec.rb | 350 + .../http_parser.rb-0.6.0/spec/spec_helper.rb | 1 + .../spec/support/requests.json | 612 + .../spec/support/responses.json | 375 + .../http_parser.rb-0.6.0/tasks/compile.rake | 42 + .../http_parser.rb-0.6.0/tasks/fixtures.rake | 71 + .../gems/http_parser.rb-0.6.0/tasks/spec.rake | 5 + .../tasks/submodules.rake | 7 + .../ruby/2.3.0/gems/i18n-0.9.1/MIT-LICENSE | 20 + .../ruby/2.3.0/gems/i18n-0.9.1/README.md | 84 + .../i18n-0.9.1/gemfiles/Gemfile.rails-3.2.x | 9 + .../i18n-0.9.1/gemfiles/Gemfile.rails-4.0.x | 9 + .../i18n-0.9.1/gemfiles/Gemfile.rails-4.1.x | 9 + .../i18n-0.9.1/gemfiles/Gemfile.rails-4.2.x | 9 + .../i18n-0.9.1/gemfiles/Gemfile.rails-5.0.x | 9 + .../i18n-0.9.1/gemfiles/Gemfile.rails-5.1.x | 9 + .../i18n-0.9.1/gemfiles/Gemfile.rails-master | 9 + .../ruby/2.3.0/gems/i18n-0.9.1/lib/i18n.rb | 349 + .../2.3.0/gems/i18n-0.9.1/lib/i18n/backend.rb | 18 + .../gems/i18n-0.9.1/lib/i18n/backend/base.rb | 230 + .../gems/i18n-0.9.1/lib/i18n/backend/cache.rb | 114 + .../i18n-0.9.1/lib/i18n/backend/cascade.rb | 54 + .../gems/i18n-0.9.1/lib/i18n/backend/chain.rb | 97 + .../i18n-0.9.1/lib/i18n/backend/fallbacks.rb | 86 + .../i18n-0.9.1/lib/i18n/backend/flatten.rb | 113 + .../i18n-0.9.1/lib/i18n/backend/gettext.rb | 81 + .../i18n/backend/interpolation_compiler.rb | 121 + .../i18n-0.9.1/lib/i18n/backend/key_value.rb | 100 + .../i18n-0.9.1/lib/i18n/backend/memoize.rb | 46 + .../i18n-0.9.1/lib/i18n/backend/metadata.rb | 69 + .../lib/i18n/backend/pluralization.rb | 53 + .../i18n-0.9.1/lib/i18n/backend/simple.rb | 87 + .../lib/i18n/backend/transliterator.rb | 106 + .../2.3.0/gems/i18n-0.9.1/lib/i18n/config.rb | 142 + .../gems/i18n-0.9.1/lib/i18n/core_ext/hash.rb | 29 + .../i18n/core_ext/kernel/suppress_warnings.rb | 8 + .../lib/i18n/core_ext/string/interpolate.rb | 9 + .../gems/i18n-0.9.1/lib/i18n/exceptions.rb | 104 + .../2.3.0/gems/i18n-0.9.1/lib/i18n/gettext.rb | 26 + .../i18n-0.9.1/lib/i18n/gettext/helpers.rb | 73 + .../i18n-0.9.1/lib/i18n/gettext/po_parser.rb | 329 + .../i18n-0.9.1/lib/i18n/interpolate/ruby.rb | 37 + .../2.3.0/gems/i18n-0.9.1/lib/i18n/locale.rb | 6 + .../i18n-0.9.1/lib/i18n/locale/fallbacks.rb | 96 + .../gems/i18n-0.9.1/lib/i18n/locale/tag.rb | 28 + .../i18n-0.9.1/lib/i18n/locale/tag/parents.rb | 22 + .../i18n-0.9.1/lib/i18n/locale/tag/rfc4646.rb | 74 + .../i18n-0.9.1/lib/i18n/locale/tag/simple.rb | 39 + .../gems/i18n-0.9.1/lib/i18n/middleware.rb | 15 + .../2.3.0/gems/i18n-0.9.1/lib/i18n/tests.rb | 12 + .../gems/i18n-0.9.1/lib/i18n/tests/basics.rb | 60 + .../i18n-0.9.1/lib/i18n/tests/defaults.rb | 48 + .../lib/i18n/tests/interpolation.rb | 153 + .../gems/i18n-0.9.1/lib/i18n/tests/link.rb | 56 + .../i18n-0.9.1/lib/i18n/tests/localization.rb | 19 + .../lib/i18n/tests/localization/date.rb | 95 + .../lib/i18n/tests/localization/date_time.rb | 82 + .../lib/i18n/tests/localization/procs.rb | 116 + .../lib/i18n/tests/localization/time.rb | 81 + .../gems/i18n-0.9.1/lib/i18n/tests/lookup.rb | 81 + .../lib/i18n/tests/pluralization.rb | 35 + .../gems/i18n-0.9.1/lib/i18n/tests/procs.rb | 55 + .../2.3.0/gems/i18n-0.9.1/lib/i18n/version.rb | 3 + .../i18n-0.9.1/test/api/all_features_test.rb | 58 + .../gems/i18n-0.9.1/test/api/cascade_test.rb | 28 + .../gems/i18n-0.9.1/test/api/chain_test.rb | 24 + .../i18n-0.9.1/test/api/fallbacks_test.rb | 30 + .../i18n-0.9.1/test/api/key_value_test.rb | 24 + .../gems/i18n-0.9.1/test/api/memoize_test.rb | 56 + .../gems/i18n-0.9.1/test/api/override_test.rb | 42 + .../i18n-0.9.1/test/api/pluralization_test.rb | 30 + .../gems/i18n-0.9.1/test/api/simple_test.rb | 28 + .../i18n-0.9.1/test/backend/cache_test.rb | 109 + .../i18n-0.9.1/test/backend/cascade_test.rb | 86 + .../i18n-0.9.1/test/backend/chain_test.rb | 91 + .../test/backend/exceptions_test.rb | 36 + .../i18n-0.9.1/test/backend/fallbacks_test.rb | 219 + .../backend/interpolation_compiler_test.rb | 118 + .../i18n-0.9.1/test/backend/key_value_test.rb | 43 + .../i18n-0.9.1/test/backend/memoize_test.rb | 79 + .../i18n-0.9.1/test/backend/metadata_test.rb | 48 + .../test/backend/pluralization_test.rb | 45 + .../i18n-0.9.1/test/backend/simple_test.rb | 84 + .../test/backend/transliterator_test.rb | 84 + .../i18n-0.9.1/test/core_ext/hash_test.rb | 36 + .../gems/i18n-0.9.1/test/gettext/api_test.rb | 214 + .../i18n-0.9.1/test/gettext/backend_test.rb | 92 + .../i18n-0.9.1/test/i18n/exceptions_test.rb | 117 + .../test/i18n/gettext_plural_keys_test.rb | 20 + .../i18n-0.9.1/test/i18n/interpolate_test.rb | 91 + .../i18n-0.9.1/test/i18n/load_path_test.rb | 34 + .../i18n-0.9.1/test/i18n/middleware_test.rb | 24 + .../2.3.0/gems/i18n-0.9.1/test/i18n_test.rb | 446 + .../i18n-0.9.1/test/locale/fallbacks_test.rb | 133 + .../test/locale/tag/rfc4646_test.rb | 143 + .../i18n-0.9.1/test/locale/tag/simple_test.rb | 32 + .../2.3.0/gems/i18n-0.9.1/test/run_all.rb | 20 + .../i18n-0.9.1/test/test_data/locales/de.po | 82 + .../i18n-0.9.1/test/test_data/locales/en.rb | 3 + .../i18n-0.9.1/test/test_data/locales/en.yml | 3 + .../test/test_data/locales/invalid/empty.yml | 0 .../test/test_data/locales/invalid/syntax.yml | 4 + .../test/test_data/locales/plurals.rb | 113 + .../2.3.0/gems/i18n-0.9.1/test/test_helper.rb | 61 + .../ruby/2.3.0/gems/jekyll-3.7.0/.rubocop.yml | 154 + .../ruby/2.3.0/gems/jekyll-3.7.0/LICENSE | 21 + .../2.3.0/gems/jekyll-3.7.0/README.markdown | 61 + .../ruby/2.3.0/gems/jekyll-3.7.0/exe/jekyll | 57 + .../2.3.0/gems/jekyll-3.7.0/lib/jekyll.rb | 198 + .../gems/jekyll-3.7.0/lib/jekyll/cleaner.rb | 112 + .../jekyll-3.7.0/lib/jekyll/collection.rb | 234 + .../gems/jekyll-3.7.0/lib/jekyll/command.rb | 78 + .../jekyll-3.7.0/lib/jekyll/commands/build.rb | 102 + .../jekyll-3.7.0/lib/jekyll/commands/clean.rb | 43 + .../lib/jekyll/commands/doctor.rb | 155 + .../jekyll-3.7.0/lib/jekyll/commands/help.rb | 34 + .../jekyll-3.7.0/lib/jekyll/commands/new.rb | 159 + .../lib/jekyll/commands/new_theme.rb | 40 + .../jekyll-3.7.0/lib/jekyll/commands/serve.rb | 387 + .../commands/serve/live_reload_reactor.rb | 127 + .../serve/livereload_assets/livereload.js | 1183 ++ .../lib/jekyll/commands/serve/servlet.rb | 203 + .../lib/jekyll/commands/serve/websockets.rb | 80 + .../jekyll-3.7.0/lib/jekyll/configuration.rb | 402 + .../gems/jekyll-3.7.0/lib/jekyll/converter.rb | 54 + .../lib/jekyll/converters/identity.rb | 23 + .../lib/jekyll/converters/markdown.rb | 104 + .../converters/markdown/kramdown_parser.rb | 129 + .../converters/markdown/rdiscount_parser.rb | 35 + .../converters/markdown/redcarpet_parser.rb | 108 + .../lib/jekyll/converters/smartypants.rb | 48 + .../jekyll-3.7.0/lib/jekyll/convertible.rb | 257 + .../jekyll-3.7.0/lib/jekyll/deprecator.rb | 52 + .../gems/jekyll-3.7.0/lib/jekyll/document.rb | 507 + .../lib/jekyll/drops/collection_drop.rb | 22 + .../lib/jekyll/drops/document_drop.rb | 69 + .../jekyll-3.7.0/lib/jekyll/drops/drop.rb | 214 + .../lib/jekyll/drops/excerpt_drop.rb | 15 + .../lib/jekyll/drops/jekyll_drop.rb | 33 + .../lib/jekyll/drops/site_drop.rb | 47 + .../lib/jekyll/drops/static_file_drop.rb | 13 + .../lib/jekyll/drops/unified_payload_drop.rb | 25 + .../jekyll-3.7.0/lib/jekyll/drops/url_drop.rb | 88 + .../jekyll-3.7.0/lib/jekyll/entry_filter.rb | 123 + .../gems/jekyll-3.7.0/lib/jekyll/errors.rb | 20 + .../gems/jekyll-3.7.0/lib/jekyll/excerpt.rb | 126 + .../gems/jekyll-3.7.0/lib/jekyll/external.rb | 74 + .../gems/jekyll-3.7.0/lib/jekyll/filters.rb | 430 + .../lib/jekyll/filters/grouping_filters.rb | 65 + .../lib/jekyll/filters/url_filters.rb | 65 + .../lib/jekyll/frontmatter_defaults.rb | 212 + .../gems/jekyll-3.7.0/lib/jekyll/generator.rb | 5 + .../gems/jekyll-3.7.0/lib/jekyll/hooks.rb | 107 + .../gems/jekyll-3.7.0/lib/jekyll/layout.rb | 62 + .../lib/jekyll/liquid_extensions.rb | 24 + .../lib/jekyll/liquid_renderer.rb | 51 + .../lib/jekyll/liquid_renderer/file.rb | 56 + .../lib/jekyll/liquid_renderer/table.rb | 96 + .../jekyll-3.7.0/lib/jekyll/log_adapter.rb | 147 + .../gems/jekyll-3.7.0/lib/jekyll/mime.types | 825 + .../gems/jekyll-3.7.0/lib/jekyll/page.rb | 187 + .../lib/jekyll/page_without_a_file.rb | 18 + .../gems/jekyll-3.7.0/lib/jekyll/plugin.rb | 98 + .../jekyll-3.7.0/lib/jekyll/plugin_manager.rb | 113 + .../gems/jekyll-3.7.0/lib/jekyll/publisher.rb | 23 + .../gems/jekyll-3.7.0/lib/jekyll/reader.rb | 134 + .../lib/jekyll/readers/collection_reader.rb | 22 + .../lib/jekyll/readers/data_reader.rb | 77 + .../lib/jekyll/readers/layout_reader.rb | 71 + .../lib/jekyll/readers/page_reader.rb | 25 + .../lib/jekyll/readers/post_reader.rb | 72 + .../lib/jekyll/readers/static_file_reader.rb | 25 + .../lib/jekyll/readers/theme_assets_reader.rb | 49 + .../jekyll-3.7.0/lib/jekyll/regenerator.rb | 201 + .../jekyll-3.7.0/lib/jekyll/related_posts.rb | 52 + .../gems/jekyll-3.7.0/lib/jekyll/renderer.rb | 269 + .../gems/jekyll-3.7.0/lib/jekyll/site.rb | 470 + .../jekyll-3.7.0/lib/jekyll/static_file.rb | 162 + .../gems/jekyll-3.7.0/lib/jekyll/stevenson.rb | 61 + .../jekyll-3.7.0/lib/jekyll/tags/highlight.rb | 141 + .../jekyll-3.7.0/lib/jekyll/tags/include.rb | 215 + .../gems/jekyll-3.7.0/lib/jekyll/tags/link.rb | 37 + .../jekyll-3.7.0/lib/jekyll/tags/post_url.rb | 103 + .../gems/jekyll-3.7.0/lib/jekyll/theme.rb | 69 + .../jekyll-3.7.0/lib/jekyll/theme_builder.rb | 119 + .../2.3.0/gems/jekyll-3.7.0/lib/jekyll/url.rb | 161 + .../gems/jekyll-3.7.0/lib/jekyll/utils.rb | 359 + .../jekyll-3.7.0/lib/jekyll/utils/ansi.rb | 57 + .../jekyll-3.7.0/lib/jekyll/utils/exec.rb | 27 + .../jekyll-3.7.0/lib/jekyll/utils/internet.rb | 39 + .../lib/jekyll/utils/platforms.rb | 82 + .../jekyll-3.7.0/lib/jekyll/utils/rouge.rb | 21 + .../lib/jekyll/utils/thread_event.rb | 35 + .../jekyll-3.7.0/lib/jekyll/utils/win_tz.rb | 75 + .../gems/jekyll-3.7.0/lib/jekyll/version.rb | 5 + .../jekyll-3.7.0/lib/site_template/.gitignore | 3 + .../jekyll-3.7.0/lib/site_template/404.html | 24 + .../lib/site_template/_config.yml | 43 + .../0000-00-00-welcome-to-jekyll.markdown.erb | 25 + .../jekyll-3.7.0/lib/site_template/about.md | 18 + .../jekyll-3.7.0/lib/site_template/index.md | 6 + .../lib/theme_template/CODE_OF_CONDUCT.md.erb | 74 + .../jekyll-3.7.0/lib/theme_template/Gemfile | 4 + .../lib/theme_template/LICENSE.txt.erb | 21 + .../lib/theme_template/README.md.erb | 52 + .../lib/theme_template/_layouts/default.html | 1 + .../lib/theme_template/_layouts/page.html | 5 + .../lib/theme_template/_layouts/post.html | 5 + .../theme_template/example/_config.yml.erb | 1 + .../lib/theme_template/example/_post.md | 12 + .../lib/theme_template/example/index.html | 14 + .../lib/theme_template/example/style.scss | 7 + .../lib/theme_template/gitignore.erb | 5 + .../lib/theme_template/theme.gemspec.erb | 19 + .../2.3.0/gems/jekyll-feed-0.9.2/.gitignore | 20 + .../ruby/2.3.0/gems/jekyll-feed-0.9.2/.rspec | 2 + .../2.3.0/gems/jekyll-feed-0.9.2/.rubocop.yml | 29 + .../2.3.0/gems/jekyll-feed-0.9.2/.travis.yml | 20 + .../ruby/2.3.0/gems/jekyll-feed-0.9.2/Gemfile | 6 + .../gems/jekyll-feed-0.9.2/History.markdown | 98 + .../2.3.0/gems/jekyll-feed-0.9.2/LICENSE.txt | 22 + .../2.3.0/gems/jekyll-feed-0.9.2/README.md | 139 + .../2.3.0/gems/jekyll-feed-0.9.2/Rakefile | 6 + .../jekyll-feed-0.9.2/jekyll-feed.gemspec | 25 + .../gems/jekyll-feed-0.9.2/lib/jekyll-feed.rb | 10 + .../lib/jekyll-feed/feed.xml | 81 + .../lib/jekyll-feed/generator.rb | 55 + .../lib/jekyll-feed/meta-tag.rb | 39 + .../lib/jekyll-feed/page-without-a-file.rb | 7 + .../gems/jekyll-feed-0.9.2/script/bootstrap | 3 + .../gems/jekyll-feed-0.9.2/script/cibuild | 7 + .../gems/jekyll-feed-0.9.2/script/release | 7 + .../spec/fixtures/_config.yml | 9 + .../spec/fixtures/_data/authors.yml | 5 + .../fixtures/_drafts/2015-01-12-a-draft.md | 4 + .../spec/fixtures/_layouts/some_default.html | 11 + .../_posts/2013-12-12-dec-the-second.md | 6 + .../_posts/2014-03-02-march-the-second.md | 5 + .../_posts/2014-03-04-march-the-fourth.md | 8 + .../2015-01-18-jekyll-last-modified-at.md | 5 + .../_posts/2015-02-12-strip-newlines.md | 6 + .../spec/fixtures/_posts/2015-05-12-liquid.md | 7 + .../spec/fixtures/_posts/2015-05-12-pre.html | 8 + .../_posts/2015-05-18-author-detail.md | 9 + .../2015-08-08-stuck-in-the-middle.html | 2 + .../_posts/2016-04-25-author-reference.md | 6 + .../spec/fixtures/feed.xslt.xml | 0 .../spec/jekyll-feed_spec.rb | 285 + .../jekyll-feed-0.9.2/spec/spec_helper.rb | 28 + .../lib/jekyll-sass-converter.rb | 8 + .../lib/jekyll-sass-converter/version.rb | 5 + .../lib/jekyll/converters/sass.rb | 22 + .../lib/jekyll/converters/scss.rb | 132 + .../jekyll-watch-2.0.0/lib/jekyll-watch.rb | 5 + .../lib/jekyll-watch/version.rb | 7 + .../lib/jekyll/commands/watch.rb | 19 + .../jekyll-watch-2.0.0/lib/jekyll/watcher.rb | 134 + .../ruby/2.3.0/gems/kramdown-1.16.2/AUTHORS | 1 + .../2.3.0/gems/kramdown-1.16.2/CONTRIBUTERS | 60 + .../ruby/2.3.0/gems/kramdown-1.16.2/COPYING | 30 + .../ruby/2.3.0/gems/kramdown-1.16.2/README.md | 71 + .../ruby/2.3.0/gems/kramdown-1.16.2/Rakefile | 308 + .../ruby/2.3.0/gems/kramdown-1.16.2/VERSION | 1 + .../kramdown-1.16.2/benchmark/benchmark.rb | 43 + .../kramdown-1.16.2/benchmark/benchmark.sh | 74 + .../benchmark/generate_data.rb | 119 + .../kramdown-1.16.2/benchmark/mdbasics.text | 306 + .../kramdown-1.16.2/benchmark/mdsyntax.text | 888 + .../gems/kramdown-1.16.2/benchmark/testing.sh | 12 + .../gems/kramdown-1.16.2/benchmark/timing.sh | 10 + .../2.3.0/gems/kramdown-1.16.2/bin/kramdown | 90 + .../data/kramdown/document.html | 22 + .../data/kramdown/document.latex | 50 + .../gems/kramdown-1.16.2/doc/_design.scss | 441 + .../2.3.0/gems/kramdown-1.16.2/doc/bg.png | Bin 0 -> 56156 bytes .../gems/kramdown-1.16.2/doc/default.scss | 217 + .../gems/kramdown-1.16.2/doc/default.template | 62 + .../kramdown-1.16.2/doc/documentation.page | 84 + .../doc/documentation.template | 35 + .../2.3.0/gems/kramdown-1.16.2/doc/index.page | 113 + .../kramdown-1.16.2/doc/installation.page | 88 + .../gems/kramdown-1.16.2/doc/links.markdown | 6 + .../2.3.0/gems/kramdown-1.16.2/doc/metainfo | 3 + .../2.3.0/gems/kramdown-1.16.2/doc/news.feed | 9 + .../2.3.0/gems/kramdown-1.16.2/doc/news.page | 29 + .../gems/kramdown-1.16.2/doc/options.page | 49 + .../gems/kramdown-1.16.2/doc/quickref.page | 603 + .../gems/kramdown-1.16.2/doc/sidebar.template | 25 + .../gems/kramdown-1.16.2/doc/sitemap.sitemap | 5 + .../gems/kramdown-1.16.2/doc/syntax.page | 1799 ++ .../2.3.0/gems/kramdown-1.16.2/doc/tests.page | 104 + .../2.3.0/gems/kramdown-1.16.2/doc/virtual | 14 + .../gems/kramdown-1.16.2/lib/kramdown.rb | 10 + .../kramdown-1.16.2/lib/kramdown/converter.rb | 69 + .../lib/kramdown/converter/base.rb | 267 + .../lib/kramdown/converter/hash_ast.rb | 38 + .../lib/kramdown/converter/html.rb | 498 + .../lib/kramdown/converter/kramdown.rb | 438 + .../lib/kramdown/converter/latex.rb | 619 + .../lib/kramdown/converter/man.rb | 303 + .../converter/math_engine/itex2mml.rb | 39 + .../kramdown/converter/math_engine/mathjax.rb | 58 + .../converter/math_engine/mathjaxnode.rb | 56 + .../kramdown/converter/math_engine/ritex.rb | 38 + .../kramdown/converter/math_engine/sskatex.rb | 97 + .../lib/kramdown/converter/pdf.rb | 625 + .../kramdown/converter/remove_html_tags.rb | 57 + .../kramdown/converter/syntax_highlighter.rb | 56 + .../converter/syntax_highlighter/coderay.rb | 81 + .../converter/syntax_highlighter/minted.rb | 35 + .../converter/syntax_highlighter/rouge.rb | 74 + .../lib/kramdown/converter/toc.rb | 69 + .../kramdown-1.16.2/lib/kramdown/document.rb | 141 + .../kramdown-1.16.2/lib/kramdown/element.rb | 522 + .../kramdown-1.16.2/lib/kramdown/error.rb | 17 + .../kramdown-1.16.2/lib/kramdown/options.rb | 681 + .../kramdown-1.16.2/lib/kramdown/parser.rb | 27 + .../lib/kramdown/parser/base.rb | 128 + .../lib/kramdown/parser/gfm.rb | 194 + .../lib/kramdown/parser/html.rb | 600 + .../lib/kramdown/parser/kramdown.rb | 371 + .../kramdown/parser/kramdown/abbreviation.rb | 75 + .../lib/kramdown/parser/kramdown/autolink.rb | 31 + .../kramdown/parser/kramdown/blank_line.rb | 30 + .../parser/kramdown/block_boundary.rb | 33 + .../kramdown/parser/kramdown/blockquote.rb | 39 + .../lib/kramdown/parser/kramdown/codeblock.rb | 58 + .../lib/kramdown/parser/kramdown/codespan.rb | 44 + .../lib/kramdown/parser/kramdown/emphasis.rb | 61 + .../lib/kramdown/parser/kramdown/eob.rb | 26 + .../kramdown/parser/kramdown/escaped_chars.rb | 25 + .../kramdown/parser/kramdown/extensions.rb | 203 + .../lib/kramdown/parser/kramdown/footnote.rb | 63 + .../lib/kramdown/parser/kramdown/header.rb | 59 + .../parser/kramdown/horizontal_rule.rb | 27 + .../lib/kramdown/parser/kramdown/html.rb | 163 + .../kramdown/parser/kramdown/html_entity.rb | 33 + .../kramdown/parser/kramdown/line_break.rb | 25 + .../lib/kramdown/parser/kramdown/link.rb | 143 + .../lib/kramdown/parser/kramdown/list.rb | 255 + .../lib/kramdown/parser/kramdown/math.rb | 54 + .../lib/kramdown/parser/kramdown/paragraph.rb | 62 + .../kramdown/parser/kramdown/smart_quotes.rb | 174 + .../lib/kramdown/parser/kramdown/table.rb | 169 + .../parser/kramdown/typographic_symbol.rb | 44 + .../lib/kramdown/parser/markdown.rb | 56 + .../kramdown-1.16.2/lib/kramdown/utils.rb | 59 + .../lib/kramdown/utils/configurable.rb | 44 + .../lib/kramdown/utils/entities.rb | 347 + .../lib/kramdown/utils/html.rb | 77 + .../lib/kramdown/utils/lru_cache.rb | 40 + .../lib/kramdown/utils/ordered_hash.rb | 18 + .../lib/kramdown/utils/string_scanner.rb | 82 + .../lib/kramdown/utils/unidecoder.rb | 48 + .../kramdown-1.16.2/lib/kramdown/version.rb | 15 + .../gems/kramdown-1.16.2/man/man1/kramdown.1 | 414 + .../ruby/2.3.0/gems/kramdown-1.16.2/setup.rb | 1585 ++ .../gems/kramdown-1.16.2/test/run_tests.rb | 46 + .../gems/kramdown-1.16.2/test/test_files.rb | 449 + .../kramdown-1.16.2/test/test_location.rb | 229 + .../test/test_string_scanner_kramdown.rb | 30 + .../testcases/block/01_blank_line/spaces.html | 1 + .../testcases/block/01_blank_line/spaces.text | 3 + .../testcases/block/01_blank_line/tabs.html | 1 + .../testcases/block/01_blank_line/tabs.text | 6 + .../testcases/block/02_eob/beginning.html | 1 + .../testcases/block/02_eob/beginning.text | 3 + .../test/testcases/block/02_eob/end.html | 1 + .../test/testcases/block/02_eob/end.text | 3 + .../test/testcases/block/02_eob/middle.html | 1 + .../test/testcases/block/02_eob/middle.text | 5 + .../block/03_paragraph/indented.html | 18 + .../block/03_paragraph/indented.html.gfm | 18 + .../block/03_paragraph/indented.text | 19 + .../03_paragraph/line_break_last_line.html | 9 + .../03_paragraph/line_break_last_line.text | 9 + .../block/03_paragraph/no_newline_at_end.html | 5 + .../block/03_paragraph/no_newline_at_end.text | 5 + .../block/03_paragraph/one_para.html | 1 + .../block/03_paragraph/one_para.text | 1 + .../block/03_paragraph/two_para.html | 4 + .../block/03_paragraph/two_para.text | 4 + .../03_paragraph/with_html_to_native.html | 1 + .../03_paragraph/with_html_to_native.options | 1 + .../03_paragraph/with_html_to_native.text | 1 + .../testcases/block/04_header/atx_header.html | 51 + .../testcases/block/04_header/atx_header.text | 48 + .../atx_header_no_newline_at_end.html | 1 + .../atx_header_no_newline_at_end.text | 1 + .../block/04_header/header_type_offset.html | 11 + .../04_header/header_type_offset.kramdown | 12 + .../block/04_header/header_type_offset.latex | 12 + .../04_header/header_type_offset.options | 2 + .../block/04_header/header_type_offset.text | 13 + .../block/04_header/setext_header.html | 32 + .../block/04_header/setext_header.text | 39 + .../setext_header_no_newline_at_end.html | 1 + .../setext_header_no_newline_at_end.text | 2 + .../block/04_header/with_auto_id_prefix.html | 3 + .../04_header/with_auto_id_prefix.options | 2 + .../block/04_header/with_auto_id_prefix.text | 3 + .../04_header/with_auto_id_stripping.html | 1 + .../04_header/with_auto_id_stripping.options | 1 + .../04_header/with_auto_id_stripping.text | 1 + .../block/04_header/with_auto_ids.html | 21 + .../block/04_header/with_auto_ids.options | 2 + .../block/04_header/with_auto_ids.text | 24 + .../block/05_blockquote/indented.html | 25 + .../block/05_blockquote/indented.text | 14 + .../testcases/block/05_blockquote/lazy.html | 34 + .../testcases/block/05_blockquote/lazy.text | 20 + .../testcases/block/05_blockquote/nested.html | 10 + .../testcases/block/05_blockquote/nested.text | 6 + .../05_blockquote/no_newline_at_end.html | 4 + .../05_blockquote/no_newline_at_end.text | 2 + .../block/05_blockquote/very_long_line.html | 3 + .../block/05_blockquote/very_long_line.text | 1 + .../block/05_blockquote/with_code_blocks.html | 15 + .../block/05_blockquote/with_code_blocks.text | 11 + .../06_codeblock/disable-highlighting.html | 4 + .../06_codeblock/disable-highlighting.options | 1 + .../06_codeblock/disable-highlighting.text | 4 + .../testcases/block/06_codeblock/error.html | 4 + .../testcases/block/06_codeblock/error.text | 4 + .../highlighting-minted-with-opts.latex | 9 + .../highlighting-minted-with-opts.options | 4 + .../highlighting-minted-with-opts.text | 5 + .../06_codeblock/highlighting-minted.latex | 8 + .../06_codeblock/highlighting-minted.options | 3 + .../06_codeblock/highlighting-minted.text | 4 + .../block/06_codeblock/highlighting-opts.html | 6 + .../06_codeblock/highlighting-opts.options | 7 + .../block/06_codeblock/highlighting-opts.text | 4 + .../block/06_codeblock/highlighting.html | 6 + .../block/06_codeblock/highlighting.options | 5 + .../block/06_codeblock/highlighting.text | 4 + .../block/06_codeblock/issue_gh45.html | 164 + .../block/06_codeblock/issue_gh45.test | 188 + .../testcases/block/06_codeblock/lazy.html | 4 + .../testcases/block/06_codeblock/lazy.text | 5 + .../block/06_codeblock/no_newline_at_end.html | 2 + .../block/06_codeblock/no_newline_at_end.text | 1 + .../06_codeblock/no_newline_at_end_1.html | 2 + .../06_codeblock/no_newline_at_end_1.text | 2 + .../testcases/block/06_codeblock/normal.html | 13 + .../testcases/block/06_codeblock/normal.text | 10 + .../block/06_codeblock/rouge/disabled.html | 2 + .../block/06_codeblock/rouge/disabled.options | 4 + .../block/06_codeblock/rouge/disabled.text | 1 + .../block/06_codeblock/rouge/multiple.html | 11 + .../block/06_codeblock/rouge/multiple.options | 4 + .../block/06_codeblock/rouge/multiple.text | 11 + .../block/06_codeblock/rouge/simple.html | 10 + .../block/06_codeblock/rouge/simple.options | 3 + .../block/06_codeblock/rouge/simple.text | 9 + .../block/06_codeblock/tilde_syntax.html | 7 + .../block/06_codeblock/tilde_syntax.text | 9 + .../block/06_codeblock/whitespace.html | 3 + .../block/06_codeblock/whitespace.text | 3 + .../block/06_codeblock/with_blank_line.html | 13 + .../block/06_codeblock/with_blank_line.text | 12 + .../block/06_codeblock/with_eob_marker.html | 6 + .../block/06_codeblock/with_eob_marker.text | 5 + .../block/06_codeblock/with_ial.html | 6 + .../block/06_codeblock/with_ial.text | 5 + .../with_lang_in_fenced_block.html | 24 + .../with_lang_in_fenced_block.options | 2 + .../with_lang_in_fenced_block.text | 33 + .../with_lang_in_fenced_block_any_char.html | 8 + ...with_lang_in_fenced_block_any_char.options | 2 + .../with_lang_in_fenced_block_any_char.text | 11 + ...h_lang_in_fenced_block_name_with_dash.html | 3 + ...ang_in_fenced_block_name_with_dash.options | 2 + ...h_lang_in_fenced_block_name_with_dash.text | 4 + .../block/07_horizontal_rule/error.html | 7 + .../block/07_horizontal_rule/error.html.19 | 7 + .../block/07_horizontal_rule/error.text | 7 + .../block/07_horizontal_rule/normal.html | 19 + .../block/07_horizontal_rule/normal.text | 20 + .../block/07_horizontal_rule/sepspaces.html | 3 + .../block/07_horizontal_rule/sepspaces.text | 3 + .../block/07_horizontal_rule/septabs.html | 3 + .../block/07_horizontal_rule/septabs.text | 3 + .../block/08_list/brackets_in_item.latex | 3 + .../block/08_list/brackets_in_item.text | 1 + .../testcases/block/08_list/escaping.html | 17 + .../testcases/block/08_list/escaping.text | 17 + .../testcases/block/08_list/item_ial.html | 10 + .../testcases/block/08_list/item_ial.text | 8 + .../test/testcases/block/08_list/lazy.html | 39 + .../test/testcases/block/08_list/lazy.text | 29 + .../block/08_list/lazy_and_nested.html | 9 + .../block/08_list/lazy_and_nested.text | 4 + .../testcases/block/08_list/list_and_hr.html | 9 + .../testcases/block/08_list/list_and_hr.text | 5 + .../block/08_list/list_and_others.html | 40 + .../block/08_list/list_and_others.text | 26 + .../test/testcases/block/08_list/mixed.html | 117 + .../test/testcases/block/08_list/mixed.text | 66 + .../test/testcases/block/08_list/nested.html | 17 + .../test/testcases/block/08_list/nested.text | 7 + .../block/08_list/other_first_element.html | 39 + .../block/08_list/other_first_element.text | 18 + .../testcases/block/08_list/simple_ol.html | 19 + .../testcases/block/08_list/simple_ol.text | 13 + .../testcases/block/08_list/simple_ul.html | 48 + .../testcases/block/08_list/simple_ul.text | 36 + .../testcases/block/08_list/single_item.html | 3 + .../testcases/block/08_list/single_item.text | 1 + .../block/08_list/special_cases.html | 62 + .../block/08_list/special_cases.text | 40 + .../test/testcases/block/09_html/comment.html | 18 + .../test/testcases/block/09_html/comment.text | 15 + .../block/09_html/content_model/deflists.html | 6 + .../09_html/content_model/deflists.options | 1 + .../block/09_html/content_model/deflists.text | 6 + .../block/09_html/content_model/tables.html | 14 + .../09_html/content_model/tables.options | 1 + .../block/09_html/content_model/tables.text | 14 + .../block/09_html/html5_attributes.html | 13 + .../block/09_html/html5_attributes.text | 13 + .../block/09_html/html_after_block.html | 7 + .../block/09_html/html_after_block.text | 5 + .../block/09_html/html_and_codeblocks.html | 15 + .../block/09_html/html_and_codeblocks.options | 1 + .../block/09_html/html_and_codeblocks.text | 13 + .../block/09_html/html_and_headers.html | 5 + .../block/09_html/html_and_headers.text | 6 + .../block/09_html/html_to_native/code.html | 10 + .../block/09_html/html_to_native/code.text | 9 + .../block/09_html/html_to_native/comment.html | 7 + .../block/09_html/html_to_native/comment.text | 8 + .../09_html/html_to_native/emphasis.html | 6 + .../09_html/html_to_native/emphasis.text | 6 + .../block/09_html/html_to_native/entity.html | 1 + .../block/09_html/html_to_native/entity.text | 1 + .../block/09_html/html_to_native/header.html | 6 + .../09_html/html_to_native/header.options | 2 + .../block/09_html/html_to_native/header.text | 6 + .../block/09_html/html_to_native/list_dl.html | 8 + .../block/09_html/html_to_native/list_dl.text | 8 + .../block/09_html/html_to_native/list_ol.html | 15 + .../block/09_html/html_to_native/list_ol.text | 17 + .../block/09_html/html_to_native/list_ul.html | 19 + .../block/09_html/html_to_native/list_ul.text | 22 + .../block/09_html/html_to_native/options | 1 + .../09_html/html_to_native/paragraph.html | 3 + .../09_html/html_to_native/paragraph.text | 4 + .../09_html/html_to_native/table_normal.html | 12 + .../09_html/html_to_native/table_normal.text | 12 + .../09_html/html_to_native/table_simple.html | 61 + .../09_html/html_to_native/table_simple.text | 71 + .../09_html/html_to_native/typography.html | 1 + .../09_html/html_to_native/typography.html.19 | 1 + .../09_html/html_to_native/typography.text | 1 + .../block/09_html/invalid_html_1.html | 5 + .../block/09_html/invalid_html_1.text | 5 + .../block/09_html/invalid_html_2.html | 5 + .../block/09_html/invalid_html_2.text | 5 + .../block/09_html/markdown_attr.html | 38 + .../block/09_html/markdown_attr.text | 38 + .../testcases/block/09_html/not_parsed.html | 24 + .../testcases/block/09_html/not_parsed.text | 24 + .../testcases/block/09_html/parse_as_raw.html | 35 + .../block/09_html/parse_as_raw.htmlinput | 34 + .../block/09_html/parse_as_raw.options | 1 + .../testcases/block/09_html/parse_as_raw.text | 33 + .../block/09_html/parse_as_span.html | 12 + .../block/09_html/parse_as_span.htmlinput | 12 + .../block/09_html/parse_as_span.options | 1 + .../block/09_html/parse_as_span.text | 9 + .../block/09_html/parse_block_html.html | 21 + .../block/09_html/parse_block_html.options | 1 + .../block/09_html/parse_block_html.text | 17 + .../block/09_html/processing_instruction.html | 13 + .../block/09_html/processing_instruction.text | 12 + .../test/testcases/block/09_html/simple.html | 60 + .../testcases/block/09_html/simple.html.19 | 60 + .../testcases/block/09_html/simple.options | 1 + .../test/testcases/block/09_html/simple.text | 55 + .../testcases/block/09_html/textarea.html | 8 + .../testcases/block/09_html/textarea.text | 8 + .../test/testcases/block/09_html/xml.html | 8 + .../test/testcases/block/09_html/xml.text | 7 + .../test/testcases/block/10_ald/simple.html | 2 + .../test/testcases/block/10_ald/simple.text | 8 + .../block/11_ial/auto_id_and_ial.html | 1 + .../block/11_ial/auto_id_and_ial.options | 1 + .../block/11_ial/auto_id_and_ial.text | 2 + .../test/testcases/block/11_ial/nested.html | 11 + .../test/testcases/block/11_ial/nested.text | 15 + .../test/testcases/block/11_ial/simple.html | 29 + .../test/testcases/block/11_ial/simple.text | 41 + .../testcases/block/12_extension/comment.html | 8 + .../testcases/block/12_extension/comment.text | 12 + .../testcases/block/12_extension/ignored.html | 8 + .../testcases/block/12_extension/ignored.text | 8 + .../block/12_extension/nomarkdown.html | 10 + .../block/12_extension/nomarkdown.kramdown | 20 + .../block/12_extension/nomarkdown.latex | 13 + .../block/12_extension/nomarkdown.text | 21 + .../testcases/block/12_extension/options.html | 21 + .../testcases/block/12_extension/options.text | 21 + .../block/12_extension/options2.html | 10 + .../block/12_extension/options2.text | 5 + .../block/12_extension/options3.html | 7 + .../block/12_extension/options3.text | 7 + .../block/13_definition_list/auto_ids.html | 15 + .../block/13_definition_list/auto_ids.text | 18 + .../definition_at_beginning.html | 1 + .../definition_at_beginning.text | 1 + .../block/13_definition_list/deflist_ial.html | 4 + .../block/13_definition_list/deflist_ial.text | 4 + .../block/13_definition_list/item_ial.html | 17 + .../block/13_definition_list/item_ial.text | 16 + .../13_definition_list/multiple_terms.html | 13 + .../13_definition_list/multiple_terms.text | 10 + .../block/13_definition_list/no_def_list.html | 2 + .../block/13_definition_list/no_def_list.text | 2 + .../13_definition_list/para_wrapping.html | 10 + .../13_definition_list/para_wrapping.text | 6 + .../13_definition_list/separated_by_eob.html | 8 + .../13_definition_list/separated_by_eob.text | 5 + .../block/13_definition_list/simple.html | 10 + .../block/13_definition_list/simple.text | 10 + .../13_definition_list/styled_terms.html | 4 + .../13_definition_list/styled_terms.text | 2 + .../13_definition_list/too_much_space.html | 3 + .../13_definition_list/too_much_space.text | 4 + .../block/13_definition_list/with_blocks.html | 38 + .../block/13_definition_list/with_blocks.text | 24 + .../test/testcases/block/14_table/errors.html | 12 + .../test/testcases/block/14_table/errors.text | 13 + .../testcases/block/14_table/escaping.html | 52 + .../testcases/block/14_table/escaping.text | 19 + .../test/testcases/block/14_table/footer.html | 65 + .../test/testcases/block/14_table/footer.text | 25 + .../test/testcases/block/14_table/header.html | 117 + .../test/testcases/block/14_table/header.text | 39 + .../testcases/block/14_table/no_table.html | 3 + .../testcases/block/14_table/no_table.text | 3 + .../test/testcases/block/14_table/simple.html | 192 + .../test/testcases/block/14_table/simple.text | 53 + .../block/14_table/table_with_footnote.html | 25 + .../block/14_table/table_with_footnote.latex | 11 + .../block/14_table/table_with_footnote.text | 6 + .../test/testcases/block/15_math/gh_128.html | 2 + .../test/testcases/block/15_math/gh_128.text | 1 + .../testcases/block/15_math/itex2mml.html | 1 + .../testcases/block/15_math/itex2mml.options | 1 + .../testcases/block/15_math/itex2mml.text | 1 + .../block/15_math/mathjax_preview.html | 4 + .../block/15_math/mathjax_preview.options | 2 + .../block/15_math/mathjax_preview.text | 5 + .../15_math/mathjax_preview_as_code.html | 4 + .../15_math/mathjax_preview_as_code.options | 3 + .../15_math/mathjax_preview_as_code.text | 5 + .../block/15_math/mathjax_preview_simple.html | 4 + .../15_math/mathjax_preview_simple.options | 2 + .../block/15_math/mathjax_preview_simple.text | 5 + .../block/15_math/mathjaxnode.html.19 | 27 + .../block/15_math/mathjaxnode.options | 1 + .../testcases/block/15_math/mathjaxnode.text | 1 + .../15_math/mathjaxnode_notexhints.html.19 | 23 + .../15_math/mathjaxnode_notexhints.options | 3 + .../block/15_math/mathjaxnode_notexhints.text | 1 + .../15_math/mathjaxnode_semantics.html.19 | 32 + .../15_math/mathjaxnode_semantics.options | 3 + .../block/15_math/mathjaxnode_semantics.text | 1 + .../testcases/block/15_math/no_engine.html | 3 + .../testcases/block/15_math/no_engine.options | 1 + .../testcases/block/15_math/no_engine.text | 2 + .../test/testcases/block/15_math/normal.html | 29 + .../test/testcases/block/15_math/normal.text | 30 + .../test/testcases/block/15_math/ritex.html | 1 + .../testcases/block/15_math/ritex.options | 1 + .../test/testcases/block/15_math/ritex.text | 1 + .../testcases/block/15_math/sskatex.html.19 | 2 + .../testcases/block/15_math/sskatex.options | 1 + .../test/testcases/block/15_math/sskatex.text | 2 + .../test/testcases/block/16_toc/no_toc.html | 14 + .../test/testcases/block/16_toc/no_toc.text | 16 + .../testcases/block/16_toc/toc_exclude.html | 35 + .../block/16_toc/toc_exclude.options | 1 + .../testcases/block/16_toc/toc_exclude.text | 19 + .../testcases/block/16_toc/toc_levels.html | 24 + .../testcases/block/16_toc/toc_levels.options | 2 + .../testcases/block/16_toc/toc_levels.text | 16 + .../block/16_toc/toc_with_footnotes.html | 13 + .../block/16_toc/toc_with_footnotes.options | 1 + .../block/16_toc/toc_with_footnotes.text | 6 + .../block/16_toc/toc_with_links.html | 8 + .../block/16_toc/toc_with_links.options | 2 + .../block/16_toc/toc_with_links.text | 8 + .../test/testcases/encoding.html | 46 + .../test/testcases/encoding.text | 28 + .../test/testcases/man/example.man | 123 + .../test/testcases/man/example.text | 85 + .../man/heading-name-dash-description.man | 4 + .../man/heading-name-dash-description.text | 1 + .../man/heading-name-description.man | 4 + .../man/heading-name-description.text | 2 + .../man/heading-name-section-description.man | 4 + .../man/heading-name-section-description.text | 1 + .../testcases/man/heading-name-section.man | 2 + .../testcases/man/heading-name-section.text | 1 + .../test/testcases/man/heading-name.man | 2 + .../test/testcases/man/heading-name.text | 1 + .../test/testcases/man/sections.man | 4 + .../test/testcases/man/sections.text | 11 + .../test/testcases/man/text-escaping.man | 8 + .../test/testcases/man/text-escaping.text | 7 + .../test/testcases/span/01_link/empty.html | 5 + .../test/testcases/span/01_link/empty.text | 5 + .../span/01_link/empty_title.htmlinput | 3 + .../testcases/span/01_link/empty_title.text | 7 + .../testcases/span/01_link/image_in_a.html | 5 + .../testcases/span/01_link/image_in_a.text | 5 + .../testcases/span/01_link/imagelinks.html | 15 + .../testcases/span/01_link/imagelinks.text | 18 + .../test/testcases/span/01_link/inline.html | 46 + .../testcases/span/01_link/inline.html.19 | 46 + .../test/testcases/span/01_link/inline.text | 48 + .../span/01_link/latex_escaping.latex | 6 + .../span/01_link/latex_escaping.text | 5 + .../testcases/span/01_link/link_defs.html | 9 + .../testcases/span/01_link/link_defs.text | 27 + .../span/01_link/link_defs_with_ial.html | 4 + .../span/01_link/link_defs_with_ial.text | 16 + .../01_link/links_with_angle_brackets.html | 3 + .../01_link/links_with_angle_brackets.text | 3 + .../testcases/span/01_link/reference.html | 37 + .../testcases/span/01_link/reference.html.19 | 37 + .../testcases/span/01_link/reference.options | 3 + .../testcases/span/01_link/reference.text | 53 + .../testcases/span/02_emphasis/empty.html | 3 + .../testcases/span/02_emphasis/empty.text | 3 + .../testcases/span/02_emphasis/errors.html | 9 + .../testcases/span/02_emphasis/errors.text | 9 + .../testcases/span/02_emphasis/nesting.html | 41 + .../testcases/span/02_emphasis/nesting.text | 36 + .../testcases/span/02_emphasis/normal.html | 61 + .../testcases/span/02_emphasis/normal.options | 1 + .../testcases/span/02_emphasis/normal.text | 59 + .../testcases/span/03_codespan/empty.html | 5 + .../testcases/span/03_codespan/empty.text | 5 + .../testcases/span/03_codespan/errors.html | 1 + .../testcases/span/03_codespan/errors.text | 1 + .../03_codespan/highlighting-minted.latex | 2 + .../03_codespan/highlighting-minted.options | 1 + .../span/03_codespan/highlighting-minted.text | 1 + .../span/03_codespan/highlighting.html | 1 + .../span/03_codespan/highlighting.text | 1 + .../testcases/span/03_codespan/normal.html | 16 + .../testcases/span/03_codespan/normal.text | 16 + .../span/03_codespan/rouge/disabled.html | 1 + .../span/03_codespan/rouge/disabled.options | 4 + .../span/03_codespan/rouge/disabled.text | 1 + .../span/03_codespan/rouge/simple.html | 1 + .../span/03_codespan/rouge/simple.options | 1 + .../span/03_codespan/rouge/simple.text | 1 + .../span/04_footnote/backlink_inline.html | 79 + .../span/04_footnote/backlink_inline.options | 1 + .../span/04_footnote/backlink_inline.text | 38 + .../span/04_footnote/backlink_text.html | 9 + .../span/04_footnote/backlink_text.options | 1 + .../span/04_footnote/backlink_text.text | 3 + .../span/04_footnote/definitions.html | 17 + .../span/04_footnote/definitions.latex | 17 + .../span/04_footnote/definitions.text | 24 + .../span/04_footnote/footnote_nr.html | 12 + .../span/04_footnote/footnote_nr.latex | 2 + .../span/04_footnote/footnote_nr.options | 1 + .../span/04_footnote/footnote_nr.text | 4 + .../span/04_footnote/inside_footnote.html | 17 + .../span/04_footnote/inside_footnote.text | 9 + .../testcases/span/04_footnote/markers.html | 46 + .../testcases/span/04_footnote/markers.latex | 23 + .../span/04_footnote/markers.options | 2 + .../testcases/span/04_footnote/markers.text | 27 + .../testcases/span/04_footnote/placement.html | 11 + .../span/04_footnote/placement.options | 1 + .../testcases/span/04_footnote/placement.text | 8 + .../span/04_footnote/regexp_problem.html | 14 + .../span/04_footnote/regexp_problem.options | 2 + .../span/04_footnote/regexp_problem.text | 52 + .../span/04_footnote/without_backlink.html | 9 + .../span/04_footnote/without_backlink.options | 1 + .../span/04_footnote/without_backlink.text | 3 + .../testcases/span/05_html/across_lines.html | 1 + .../testcases/span/05_html/across_lines.text | 2 + .../test/testcases/span/05_html/button.html | 7 + .../test/testcases/span/05_html/button.text | 7 + .../test/testcases/span/05_html/invalid.html | 1 + .../test/testcases/span/05_html/invalid.text | 1 + .../span/05_html/link_with_mailto.html | 1 + .../span/05_html/link_with_mailto.text | 1 + .../testcases/span/05_html/mark_element.html | 3 + .../testcases/span/05_html/mark_element.text | 3 + .../testcases/span/05_html/markdown_attr.html | 6 + .../testcases/span/05_html/markdown_attr.text | 6 + .../test/testcases/span/05_html/normal.html | 43 + .../test/testcases/span/05_html/normal.text | 43 + .../span/05_html/raw_span_elements.html | 2 + .../span/05_html/raw_span_elements.text | 2 + .../test/testcases/span/05_html/xml.html | 5 + .../test/testcases/span/05_html/xml.text | 5 + .../testcases/span/abbreviations/abbrev.html | 21 + .../testcases/span/abbreviations/abbrev.text | 34 + .../span/abbreviations/abbrev_defs.html | 2 + .../span/abbreviations/abbrev_defs.text | 5 + .../span/abbreviations/in_footnote.html | 9 + .../span/abbreviations/in_footnote.text | 5 + .../testcases/span/autolinks/url_links.html | 15 + .../testcases/span/autolinks/url_links.text | 16 + .../testcases/span/escaped_chars/normal.html | 47 + .../testcases/span/escaped_chars/normal.text | 47 + .../testcases/span/extension/comment.html | 6 + .../testcases/span/extension/comment.text | 6 + .../testcases/span/extension/ignored.html | 1 + .../testcases/span/extension/ignored.text | 1 + .../testcases/span/extension/nomarkdown.html | 1 + .../testcases/span/extension/nomarkdown.text | 1 + .../testcases/span/extension/options.html | 1 + .../testcases/span/extension/options.text | 1 + .../test/testcases/span/ial/simple.html | 6 + .../test/testcases/span/ial/simple.text | 6 + .../testcases/span/line_breaks/normal.html | 11 + .../testcases/span/line_breaks/normal.latex | 12 + .../testcases/span/line_breaks/normal.text | 11 + .../test/testcases/span/math/itex2mml.html | 1 + .../test/testcases/span/math/itex2mml.options | 1 + .../test/testcases/span/math/itex2mml.text | 1 + .../testcases/span/math/mathjaxnode.html.19 | 27 + .../testcases/span/math/mathjaxnode.options | 1 + .../test/testcases/span/math/mathjaxnode.text | 1 + .../test/testcases/span/math/no_engine.html | 1 + .../testcases/span/math/no_engine.options | 1 + .../test/testcases/span/math/no_engine.text | 1 + .../test/testcases/span/math/normal.html | 10 + .../test/testcases/span/math/normal.text | 10 + .../test/testcases/span/math/ritex.html | 1 + .../test/testcases/span/math/ritex.options | 1 + .../test/testcases/span/math/ritex.text | 1 + .../test/testcases/span/math/sskatex.html.19 | 1 + .../test/testcases/span/math/sskatex.options | 1 + .../test/testcases/span/math/sskatex.text | 1 + .../span/text_substitutions/entities.html | 6 + .../span/text_substitutions/entities.options | 1 + .../span/text_substitutions/entities.text | 6 + .../text_substitutions/entities_as_char.html | 1 + .../entities_as_char.html.19 | 1 + .../entities_as_char.options | 2 + .../text_substitutions/entities_as_char.text | 1 + .../text_substitutions/entities_as_input.html | 1 + .../entities_as_input.options | 1 + .../text_substitutions/entities_as_input.text | 1 + .../text_substitutions/entities_numeric.html | 1 + .../entities_numeric.options | 1 + .../text_substitutions/entities_numeric.text | 1 + .../text_substitutions/entities_symbolic.html | 1 + .../entities_symbolic.options | 1 + .../text_substitutions/entities_symbolic.text | 1 + .../span/text_substitutions/greaterthan.html | 1 + .../span/text_substitutions/greaterthan.text | 1 + .../span/text_substitutions/lowerthan.html | 1 + .../span/text_substitutions/lowerthan.text | 1 + .../span/text_substitutions/typography.html | 40 + .../text_substitutions/typography.options | 1 + .../span/text_substitutions/typography.text | 40 + .../text_substitutions/typography_subst.html | 3 + .../text_substitutions/typography_subst.latex | 4 + .../typography_subst.options | 8 + .../text_substitutions/typography_subst.text | 3 + .../test/testcases_gfm/atx_header.html | 3 + .../test/testcases_gfm/atx_header.text | 3 + .../backticks_disable_highlighting.html | 2 + .../backticks_disable_highlighting.options | 1 + .../backticks_disable_highlighting.text | 3 + .../test/testcases_gfm/backticks_syntax.html | 20 + .../test/testcases_gfm/backticks_syntax.text | 19 + .../test/testcases_gfm/codeblock_fenced.html | 20 + .../testcases_gfm/codeblock_fenced.options | 1 + .../test/testcases_gfm/codeblock_fenced.text | 21 + .../test/testcases_gfm/hard_line_breaks.html | 3 + .../test/testcases_gfm/hard_line_breaks.text | 3 + .../testcases_gfm/hard_line_breaks_off.html | 2 + .../hard_line_breaks_off.options | 1 + .../testcases_gfm/hard_line_breaks_off.text | 2 + .../test/testcases_gfm/header_ids.html | 27 + .../test/testcases_gfm/header_ids.html.19 | 27 + .../test/testcases_gfm/header_ids.options | 1 + .../test/testcases_gfm/header_ids.text | 27 + .../testcases_gfm/header_ids_with_prefix.html | 3 + .../header_ids_with_prefix.options | 2 + .../testcases_gfm/header_ids_with_prefix.text | 3 + .../test/testcases_gfm/no_typographic.html | 3 + .../test/testcases_gfm/no_typographic.html.19 | 3 + .../test/testcases_gfm/no_typographic.options | 1 + .../test/testcases_gfm/no_typographic.text | 3 + .../testcases_gfm/paragraph_end-disabled.html | 31 + .../paragraph_end-disabled.options | 1 + .../testcases_gfm/paragraph_end-disabled.text | 27 + .../test/testcases_gfm/paragraph_end.html | 38 + .../test/testcases_gfm/paragraph_end.text | 27 + .../test/testcases_gfm/strikethrough.html | 27 + .../test/testcases_gfm/strikethrough.html.19 | 27 + .../test/testcases_gfm/strikethrough.text | 27 + .../test/testcases_gfm/task_list.html | 40 + .../test/testcases_gfm/task_list.text | 26 + .../two_para_hard_line_breaks.html | 4 + .../two_para_hard_line_breaks.text | 4 + .../ruby/2.3.0/gems/liquid-4.0.0/History.md | 232 + .../ruby/2.3.0/gems/liquid-4.0.0/LICENSE | 20 + .../ruby/2.3.0/gems/liquid-4.0.0/README.md | 106 + .../2.3.0/gems/liquid-4.0.0/lib/liquid.rb | 79 + .../gems/liquid-4.0.0/lib/liquid/block.rb | 67 + .../liquid-4.0.0/lib/liquid/block_body.rb | 139 + .../gems/liquid-4.0.0/lib/liquid/condition.rb | 132 + .../gems/liquid-4.0.0/lib/liquid/context.rb | 224 + .../gems/liquid-4.0.0/lib/liquid/document.rb | 27 + .../gems/liquid-4.0.0/lib/liquid/drop.rb | 78 + .../gems/liquid-4.0.0/lib/liquid/errors.rb | 56 + .../liquid-4.0.0/lib/liquid/expression.rb | 45 + .../liquid-4.0.0/lib/liquid/extensions.rb | 68 + .../liquid-4.0.0/lib/liquid/file_system.rb | 73 + .../liquid-4.0.0/lib/liquid/forloop_drop.rb | 42 + .../gems/liquid-4.0.0/lib/liquid/i18n.rb | 39 + .../liquid-4.0.0/lib/liquid/interrupts.rb | 16 + .../gems/liquid-4.0.0/lib/liquid/lexer.rb | 53 + .../liquid-4.0.0/lib/liquid/locales/en.yml | 26 + .../liquid-4.0.0/lib/liquid/parse_context.rb | 37 + .../gems/liquid-4.0.0/lib/liquid/parser.rb | 90 + .../lib/liquid/parser_switching.rb | 31 + .../gems/liquid-4.0.0/lib/liquid/profiler.rb | 158 + .../liquid-4.0.0/lib/liquid/profiler/hooks.rb | 23 + .../liquid-4.0.0/lib/liquid/range_lookup.rb | 37 + .../lib/liquid/resource_limits.rb | 23 + .../lib/liquid/standardfilters.rb | 420 + .../gems/liquid-4.0.0/lib/liquid/strainer.rb | 66 + .../lib/liquid/tablerowloop_drop.rb | 62 + .../2.3.0/gems/liquid-4.0.0/lib/liquid/tag.rb | 43 + .../liquid-4.0.0/lib/liquid/tags/assign.rb | 51 + .../liquid-4.0.0/lib/liquid/tags/break.rb | 18 + .../liquid-4.0.0/lib/liquid/tags/capture.rb | 38 + .../gems/liquid-4.0.0/lib/liquid/tags/case.rb | 86 + .../liquid-4.0.0/lib/liquid/tags/comment.rb | 16 + .../liquid-4.0.0/lib/liquid/tags/continue.rb | 18 + .../liquid-4.0.0/lib/liquid/tags/cycle.rb | 57 + .../liquid-4.0.0/lib/liquid/tags/decrement.rb | 35 + .../gems/liquid-4.0.0/lib/liquid/tags/for.rb | 195 + .../gems/liquid-4.0.0/lib/liquid/tags/if.rb | 111 + .../liquid-4.0.0/lib/liquid/tags/ifchanged.rb | 18 + .../liquid-4.0.0/lib/liquid/tags/include.rb | 113 + .../liquid-4.0.0/lib/liquid/tags/increment.rb | 31 + .../gems/liquid-4.0.0/lib/liquid/tags/raw.rb | 47 + .../liquid-4.0.0/lib/liquid/tags/table_row.rb | 54 + .../liquid-4.0.0/lib/liquid/tags/unless.rb | 30 + .../gems/liquid-4.0.0/lib/liquid/template.rb | 254 + .../gems/liquid-4.0.0/lib/liquid/tokenizer.rb | 31 + .../gems/liquid-4.0.0/lib/liquid/utils.rb | 83 + .../gems/liquid-4.0.0/lib/liquid/variable.rb | 136 + .../lib/liquid/variable_lookup.rb | 82 + .../gems/liquid-4.0.0/lib/liquid/version.rb | 4 + .../liquid-4.0.0/test/fixtures/en_locale.yml | 9 + .../test/integration/assign_test.rb | 48 + .../test/integration/blank_test.rb | 106 + .../test/integration/capture_test.rb | 50 + .../test/integration/context_test.rb | 32 + .../test/integration/document_test.rb | 19 + .../test/integration/drop_test.rb | 273 + .../test/integration/error_handling_test.rb | 260 + .../test/integration/filter_test.rb | 178 + .../test/integration/hash_ordering_test.rb | 23 + .../test/integration/output_test.rb | 123 + .../test/integration/parsing_quirks_test.rb | 118 + .../test/integration/render_profiling_test.rb | 154 + .../test/integration/security_test.rb | 66 + .../test/integration/standard_filter_test.rb | 535 + .../test/integration/tags/break_tag_test.rb | 15 + .../integration/tags/continue_tag_test.rb | 15 + .../test/integration/tags/for_tag_test.rb | 410 + .../test/integration/tags/if_else_tag_test.rb | 188 + .../test/integration/tags/include_tag_test.rb | 238 + .../integration/tags/increment_tag_test.rb | 23 + .../test/integration/tags/raw_tag_test.rb | 31 + .../integration/tags/standard_tag_test.rb | 296 + .../test/integration/tags/statements_test.rb | 111 + .../test/integration/tags/table_row_test.rb | 64 + .../integration/tags/unless_else_tag_test.rb | 26 + .../test/integration/template_test.rb | 323 + .../test/integration/trim_mode_test.rb | 525 + .../test/integration/variable_test.rb | 92 + .../gems/liquid-4.0.0/test/test_helper.rb | 117 + .../liquid-4.0.0/test/unit/block_unit_test.rb | 58 + .../test/unit/condition_unit_test.rb | 158 + .../test/unit/context_unit_test.rb | 483 + .../test/unit/file_system_unit_test.rb | 35 + .../liquid-4.0.0/test/unit/i18n_unit_test.rb | 37 + .../liquid-4.0.0/test/unit/lexer_unit_test.rb | 51 + .../test/unit/parser_unit_test.rb | 82 + .../test/unit/regexp_unit_test.rb | 44 + .../test/unit/strainer_unit_test.rb | 148 + .../liquid-4.0.0/test/unit/tag_unit_test.rb | 21 + .../test/unit/tags/case_tag_unit_test.rb | 10 + .../test/unit/tags/for_tag_unit_test.rb | 13 + .../test/unit/tags/if_tag_unit_test.rb | 8 + .../test/unit/template_unit_test.rb | 78 + .../test/unit/tokenizer_unit_test.rb | 55 + .../test/unit/variable_unit_test.rb | 162 + .../ruby/2.3.0/gems/listen-3.1.5/CHANGELOG.md | 1 + .../2.3.0/gems/listen-3.1.5/CONTRIBUTING.md | 38 + .../ruby/2.3.0/gems/listen-3.1.5/LICENSE.txt | 22 + .../ruby/2.3.0/gems/listen-3.1.5/README.md | 297 + .../ruby/2.3.0/gems/listen-3.1.5/bin/listen | 12 + .../2.3.0/gems/listen-3.1.5/lib/listen.rb | 57 + .../gems/listen-3.1.5/lib/listen/adapter.rb | 45 + .../listen-3.1.5/lib/listen/adapter/base.rb | 141 + .../listen-3.1.5/lib/listen/adapter/bsd.rb | 106 + .../listen-3.1.5/lib/listen/adapter/config.rb | 26 + .../listen-3.1.5/lib/listen/adapter/darwin.rb | 92 + .../listen-3.1.5/lib/listen/adapter/linux.rb | 106 + .../lib/listen/adapter/polling.rb | 37 + .../lib/listen/adapter/windows.rb | 98 + .../gems/listen-3.1.5/lib/listen/backend.rb | 38 + .../gems/listen-3.1.5/lib/listen/change.rb | 76 + .../2.3.0/gems/listen-3.1.5/lib/listen/cli.rb | 65 + .../gems/listen-3.1.5/lib/listen/directory.rb | 87 + .../listen-3.1.5/lib/listen/event/config.rb | 55 + .../listen-3.1.5/lib/listen/event/loop.rb | 117 + .../lib/listen/event/processor.rb | 122 + .../listen-3.1.5/lib/listen/event/queue.rb | 55 + .../gems/listen-3.1.5/lib/listen/file.rb | 80 + .../2.3.0/gems/listen-3.1.5/lib/listen/fsm.rb | 132 + .../lib/listen/internals/thread_pool.rb | 29 + .../gems/listen-3.1.5/lib/listen/listener.rb | 133 + .../lib/listen/listener/config.rb | 41 + .../gems/listen-3.1.5/lib/listen/logger.rb | 32 + .../gems/listen-3.1.5/lib/listen/options.rb | 23 + .../lib/listen/queue_optimizer.rb | 132 + .../gems/listen-3.1.5/lib/listen/record.rb | 118 + .../listen-3.1.5/lib/listen/record/entry.rb | 64 + .../lib/listen/record/symlink_detector.rb | 39 + .../gems/listen-3.1.5/lib/listen/silencer.rb | 97 + .../lib/listen/silencer/controller.rb | 48 + .../gems/listen-3.1.5/lib/listen/version.rb | 3 + .../2.3.0/gems/mercenary-0.3.6/.gitignore | 17 + .../ruby/2.3.0/gems/mercenary-0.3.6/.rspec | 2 + .../2.3.0/gems/mercenary-0.3.6/.travis.yml | 15 + .../ruby/2.3.0/gems/mercenary-0.3.6/Gemfile | 4 + .../gems/mercenary-0.3.6/History.markdown | 109 + .../2.3.0/gems/mercenary-0.3.6/LICENSE.txt | 22 + .../ruby/2.3.0/gems/mercenary-0.3.6/README.md | 250 + .../ruby/2.3.0/gems/mercenary-0.3.6/Rakefile | 1 + .../mercenary-0.3.6/examples/help_dialogue.rb | 46 + .../gems/mercenary-0.3.6/examples/logging.rb | 39 + .../gems/mercenary-0.3.6/examples/trace.rb | 21 + .../gems/mercenary-0.3.6/lib/mercenary.rb | 21 + .../mercenary-0.3.6/lib/mercenary/command.rb | 280 + .../mercenary-0.3.6/lib/mercenary/option.rb | 87 + .../lib/mercenary/presenter.rb | 94 + .../mercenary-0.3.6/lib/mercenary/program.rb | 53 + .../mercenary-0.3.6/lib/mercenary/version.rb | 3 + .../gems/mercenary-0.3.6/mercenary.gemspec | 24 + .../gems/mercenary-0.3.6/script/bootstrap | 7 + .../2.3.0/gems/mercenary-0.3.6/script/cibuild | 6 + .../2.3.0/gems/mercenary-0.3.6/script/console | 3 + .../gems/mercenary-0.3.6/script/examples | 18 + .../gems/mercenary-0.3.6/spec/command_spec.rb | 98 + .../gems/mercenary-0.3.6/spec/option_spec.rb | 83 + .../mercenary-0.3.6/spec/presenter_spec.rb | 39 + .../gems/mercenary-0.3.6/spec/program_spec.rb | 19 + .../gems/mercenary-0.3.6/spec/spec_helper.rb | 14 + .../ruby/2.3.0/gems/minima-2.1.1/LICENSE.txt | 21 + .../ruby/2.3.0/gems/minima-2.1.1/README.md | 147 + .../_includes/disqus_comments.html | 20 + .../gems/minima-2.1.1/_includes/footer.html | 46 + .../_includes/google-analytics.html | 11 + .../gems/minima-2.1.1/_includes/head.html | 16 + .../gems/minima-2.1.1/_includes/header.html | 32 + .../minima-2.1.1/_includes/icon-github.html | 1 + .../minima-2.1.1/_includes/icon-github.svg | 1 + .../minima-2.1.1/_includes/icon-twitter.html | 1 + .../minima-2.1.1/_includes/icon-twitter.svg | 1 + .../gems/minima-2.1.1/_layouts/default.html | 20 + .../gems/minima-2.1.1/_layouts/home.html | 26 + .../gems/minima-2.1.1/_layouts/page.html | 14 + .../gems/minima-2.1.1/_layouts/post.html | 25 + .../2.3.0/gems/minima-2.1.1/_sass/minima.scss | 49 + .../gems/minima-2.1.1/_sass/minima/_base.scss | 215 + .../minima-2.1.1/_sass/minima/_layout.scss | 250 + .../_sass/minima/_syntax-highlighting.scss | 71 + .../2.3.0/gems/minima-2.1.1/assets/main.scss | 5 + .../ruby/2.3.0/gems/pathutil-0.16.1/Gemfile | 22 + .../ruby/2.3.0/gems/pathutil-0.16.1/LICENSE | 19 + .../ruby/2.3.0/gems/pathutil-0.16.1/Rakefile | 81 + .../gems/pathutil-0.16.1/lib/pathutil.rb | 909 + .../pathutil-0.16.1/lib/pathutil/helpers.rb | 111 + .../pathutil-0.16.1/lib/pathutil/version.rb | 7 + .../2.3.0/gems/public_suffix-3.0.1/.gitignore | 11 + .../gems/public_suffix-3.0.1/.rubocop.yml | 32 + .../public_suffix-3.0.1/.rubocop_defaults.yml | 177 + .../gems/public_suffix-3.0.1/.ruby-gemset | 1 + .../gems/public_suffix-3.0.1/.travis.yml | 24 + .../2.3.0/gems/public_suffix-3.0.1/.yardopts | 1 + .../gems/public_suffix-3.0.1/2.0-Upgrade.md | 52 + .../gems/public_suffix-3.0.1/CHANGELOG.md | 330 + .../2.3.0/gems/public_suffix-3.0.1/Gemfile | 10 + .../gems/public_suffix-3.0.1/LICENSE.txt | 22 + .../2.3.0/gems/public_suffix-3.0.1/README.md | 202 + .../2.3.0/gems/public_suffix-3.0.1/Rakefile | 49 + .../gems/public_suffix-3.0.1/bin/console | 14 + .../gems/public_suffix-3.0.1/data/list.txt | 12288 +++++++++++ .../public_suffix-3.0.1/lib/public_suffix.rb | 175 + .../lib/public_suffix/domain.rb | 235 + .../lib/public_suffix/errors.rb | 39 + .../lib/public_suffix/list.rb | 243 + .../lib/public_suffix/rule.rb | 348 + .../lib/public_suffix/version.rb | 10 + .../public_suffix-3.0.1/public_suffix.gemspec | 25 + .../gems/public_suffix-3.0.1/test/.empty | 2 + .../test/acceptance_test.rb | 127 + .../test/benchmarks/bm_find.rb | 66 + .../test/benchmarks/bm_find_all.rb | 102 + .../test/benchmarks/bm_names.rb | 91 + .../test/benchmarks/bm_select.rb | 26 + .../test/benchmarks/bm_select_incremental.rb | 25 + .../test/benchmarks/bm_valid.rb | 101 + .../test/profilers/domain_profiler.rb | 12 + .../test/profilers/find_profiler.rb | 12 + .../test/profilers/find_profiler_jp.rb | 12 + .../test/profilers/initialization_profiler.rb | 11 + .../test/profilers/list_profsize.rb | 11 + .../test/profilers/object_binsize.rb | 57 + .../gems/public_suffix-3.0.1/test/psl_test.rb | 49 + .../public_suffix-3.0.1/test/test_helper.rb | 13 + .../gems/public_suffix-3.0.1/test/tests.txt | 98 + .../test/unit/domain_test.rb | 104 + .../test/unit/errors_test.rb | 23 + .../test/unit/list_test.rb | 239 + .../test/unit/public_suffix_test.rb | 186 + .../test/unit/rule_test.rb | 220 + .../2.3.0/gems/rb-fsevent-0.10.2/.gitignore | 13 + .../ruby/2.3.0/gems/rb-fsevent-0.10.2/Gemfile | 3 + .../2.3.0/gems/rb-fsevent-0.10.2/Guardfile | 8 + .../2.3.0/gems/rb-fsevent-0.10.2/LICENSE.txt | 22 + .../2.3.0/gems/rb-fsevent-0.10.2/README.md | 259 + .../2.3.0/gems/rb-fsevent-0.10.2/Rakefile | 33 + .../gems/rb-fsevent-0.10.2/bin/fsevent_watch | Bin 0 -> 42376 bytes .../2.3.0/gems/rb-fsevent-0.10.2/ext/LICENSE | 21 + .../ext/fsevent_watch/FSEventsFix.c | 626 + .../ext/fsevent_watch/FSEventsFix.h | 105 + .../ext/fsevent_watch/TSICTString.c | 373 + .../ext/fsevent_watch/TSICTString.h | 74 + .../rb-fsevent-0.10.2/ext/fsevent_watch/cli.c | 201 + .../rb-fsevent-0.10.2/ext/fsevent_watch/cli.h | 45 + .../ext/fsevent_watch/common.h | 22 + .../ext/fsevent_watch/compat.c | 41 + .../ext/fsevent_watch/compat.h | 100 + .../ext/fsevent_watch/defines.h | 40 + .../ext/fsevent_watch/main.c | 548 + .../ext/fsevent_watch/signal_handlers.c | 66 + .../ext/fsevent_watch/signal_handlers.h | 16 + .../gems/rb-fsevent-0.10.2/ext/rakefile.rb | 226 + .../gems/rb-fsevent-0.10.2/lib/otnetstring.rb | 85 + .../gems/rb-fsevent-0.10.2/lib/rb-fsevent.rb | 3 + .../lib/rb-fsevent/fsevent.rb | 157 + .../lib/rb-fsevent/version.rb | 5 + .../gems/rb-fsevent-0.10.2/rb-fsevent.gemspec | 27 + .../2.3.0/gems/rb-inotify-0.9.10/.gitignore | 19 + .../2.3.0/gems/rb-inotify-0.9.10/.travis.yml | 30 + .../2.3.0/gems/rb-inotify-0.9.10/.yardopts | 4 + .../ruby/2.3.0/gems/rb-inotify-0.9.10/Gemfile | 3 + .../2.3.0/gems/rb-inotify-0.9.10/README.md | 103 + .../2.3.0/gems/rb-inotify-0.9.10/Rakefile | 14 + .../gems/rb-inotify-0.9.10/lib/rb-inotify.rb | 15 + .../lib/rb-inotify/errors.rb | 3 + .../rb-inotify-0.9.10/lib/rb-inotify/event.rb | 146 + .../lib/rb-inotify/native.rb | 36 + .../lib/rb-inotify/native/flags.rb | 94 + .../lib/rb-inotify/notifier.rb | 339 + .../lib/rb-inotify/version.rb | 24 + .../lib/rb-inotify/watcher.rb | 88 + .../gems/rb-inotify-0.9.10/rb-inotify.gemspec | 30 + .../spec/rb-inotify/errors_spec.rb | 9 + .../rb-inotify-0.9.10/spec/rb-inotify_spec.rb | 9 + .../rb-inotify-0.9.10/spec/spec_helper.rb | 12 + .../ruby/2.3.0/gems/rouge-3.1.0/Gemfile | 26 + .../ruby/2.3.0/gems/rouge-3.1.0/LICENSE | 186 + .../ruby/2.3.0/gems/rouge-3.1.0/bin/rougify | 17 + .../ruby/2.3.0/gems/rouge-3.1.0/lib/rouge.rb | 82 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/cli.rb | 429 + .../gems/rouge-3.1.0/lib/rouge/demos/abap | 6 + .../rouge-3.1.0/lib/rouge/demos/actionscript | 4 + .../gems/rouge-3.1.0/lib/rouge/demos/apache | 21 + .../rouge-3.1.0/lib/rouge/demos/apiblueprint | 33 + .../rouge-3.1.0/lib/rouge/demos/applescript | 2 + .../gems/rouge-3.1.0/lib/rouge/demos/awk | 4 + .../gems/rouge-3.1.0/lib/rouge/demos/biml | 38 + .../gems/rouge-3.1.0/lib/rouge/demos/bsl | 7 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/demos/c | 8 + .../gems/rouge-3.1.0/lib/rouge/demos/ceylon | 7 + .../gems/rouge-3.1.0/lib/rouge/demos/cfscript | 18 + .../gems/rouge-3.1.0/lib/rouge/demos/clojure | 5 + .../gems/rouge-3.1.0/lib/rouge/demos/cmake | 7 + .../rouge-3.1.0/lib/rouge/demos/coffeescript | 5 + .../rouge-3.1.0/lib/rouge/demos/common_lisp | 1 + .../gems/rouge-3.1.0/lib/rouge/demos/conf | 4 + .../gems/rouge-3.1.0/lib/rouge/demos/console | 6 + .../gems/rouge-3.1.0/lib/rouge/demos/coq | 13 + .../gems/rouge-3.1.0/lib/rouge/demos/cpp | 8 + .../gems/rouge-3.1.0/lib/rouge/demos/csharp | 5 + .../gems/rouge-3.1.0/lib/rouge/demos/css | 4 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/demos/d | 16 + .../gems/rouge-3.1.0/lib/rouge/demos/dart | 6 + .../gems/rouge-3.1.0/lib/rouge/demos/diff | 7 + .../gems/rouge-3.1.0/lib/rouge/demos/digdag | 19 + .../gems/rouge-3.1.0/lib/rouge/demos/docker | 9 + .../gems/rouge-3.1.0/lib/rouge/demos/dot | 5 + .../gems/rouge-3.1.0/lib/rouge/demos/eiffel | 30 + .../gems/rouge-3.1.0/lib/rouge/demos/elixir | 1 + .../gems/rouge-3.1.0/lib/rouge/demos/elm | 4 + .../gems/rouge-3.1.0/lib/rouge/demos/erb | 1 + .../gems/rouge-3.1.0/lib/rouge/demos/erlang | 7 + .../gems/rouge-3.1.0/lib/rouge/demos/factor | 5 + .../gems/rouge-3.1.0/lib/rouge/demos/fortran | 22 + .../gems/rouge-3.1.0/lib/rouge/demos/fsharp | 12 + .../gems/rouge-3.1.0/lib/rouge/demos/gherkin | 17 + .../gems/rouge-3.1.0/lib/rouge/demos/glsl | 14 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/demos/go | 7 + .../gems/rouge-3.1.0/lib/rouge/demos/gradle | 10 + .../gems/rouge-3.1.0/lib/rouge/demos/graphql | 17 + .../gems/rouge-3.1.0/lib/rouge/demos/groovy | 9 + .../gems/rouge-3.1.0/lib/rouge/demos/hack | 5 + .../gems/rouge-3.1.0/lib/rouge/demos/haml | 5 + .../rouge-3.1.0/lib/rouge/demos/handlebars | 7 + .../gems/rouge-3.1.0/lib/rouge/demos/haskell | 6 + .../gems/rouge-3.1.0/lib/rouge/demos/html | 8 + .../gems/rouge-3.1.0/lib/rouge/demos/http | 14 + .../gems/rouge-3.1.0/lib/rouge/demos/hylang | 10 + .../gems/rouge-3.1.0/lib/rouge/demos/idlang | 8 + .../gems/rouge-3.1.0/lib/rouge/demos/igorpro | 9 + .../gems/rouge-3.1.0/lib/rouge/demos/ini | 4 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/demos/io | 11 + .../gems/rouge-3.1.0/lib/rouge/demos/irb | 4 + .../rouge-3.1.0/lib/rouge/demos/irb_output | 2 + .../gems/rouge-3.1.0/lib/rouge/demos/java | 5 + .../rouge-3.1.0/lib/rouge/demos/javascript | 1 + .../gems/rouge-3.1.0/lib/rouge/demos/jinja | 9 + .../gems/rouge-3.1.0/lib/rouge/demos/json | 1 + .../gems/rouge-3.1.0/lib/rouge/demos/json-doc | 1 + .../gems/rouge-3.1.0/lib/rouge/demos/jsonnet | 28 + .../gems/rouge-3.1.0/lib/rouge/demos/jsx | 17 + .../gems/rouge-3.1.0/lib/rouge/demos/julia | 11 + .../gems/rouge-3.1.0/lib/rouge/demos/kotlin | 3 + .../gems/rouge-3.1.0/lib/rouge/demos/lasso | 12 + .../gems/rouge-3.1.0/lib/rouge/demos/liquid | 11 + .../lib/rouge/demos/literate_coffeescript | 3 + .../lib/rouge/demos/literate_haskell | 7 + .../gems/rouge-3.1.0/lib/rouge/demos/llvm | 20 + .../gems/rouge-3.1.0/lib/rouge/demos/lua | 12 + .../gems/rouge-3.1.0/lib/rouge/demos/make | 6 + .../gems/rouge-3.1.0/lib/rouge/demos/markdown | 4 + .../gems/rouge-3.1.0/lib/rouge/demos/matlab | 6 + .../rouge-3.1.0/lib/rouge/demos/moonscript | 16 + .../gems/rouge-3.1.0/lib/rouge/demos/mosel | 10 + .../gems/rouge-3.1.0/lib/rouge/demos/mxml | 22 + .../gems/rouge-3.1.0/lib/rouge/demos/nasm | 26 + .../gems/rouge-3.1.0/lib/rouge/demos/nginx | 5 + .../gems/rouge-3.1.0/lib/rouge/demos/nim | 27 + .../gems/rouge-3.1.0/lib/rouge/demos/nix | 19 + .../rouge-3.1.0/lib/rouge/demos/objective_c | 18 + .../gems/rouge-3.1.0/lib/rouge/demos/ocaml | 12 + .../gems/rouge-3.1.0/lib/rouge/demos/pascal | 14 + .../gems/rouge-3.1.0/lib/rouge/demos/perl | 5 + .../gems/rouge-3.1.0/lib/rouge/demos/php | 3 + .../rouge-3.1.0/lib/rouge/demos/plaintext | 1 + .../gems/rouge-3.1.0/lib/rouge/demos/plist | 142 + .../gems/rouge-3.1.0/lib/rouge/demos/pony | 17 + .../rouge-3.1.0/lib/rouge/demos/powershell | 49 + .../gems/rouge-3.1.0/lib/rouge/demos/praat | 26 + .../gems/rouge-3.1.0/lib/rouge/demos/prolog | 9 + .../rouge-3.1.0/lib/rouge/demos/prometheus | 9 + .../rouge-3.1.0/lib/rouge/demos/properties | 7 + .../gems/rouge-3.1.0/lib/rouge/demos/protobuf | 5 + .../gems/rouge-3.1.0/lib/rouge/demos/puppet | 6 + .../gems/rouge-3.1.0/lib/rouge/demos/python | 6 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/demos/q | 2 + .../gems/rouge-3.1.0/lib/rouge/demos/qml | 9 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/demos/r | 8 + .../gems/rouge-3.1.0/lib/rouge/demos/racket | 24 + .../gems/rouge-3.1.0/lib/rouge/demos/ruby | 9 + .../gems/rouge-3.1.0/lib/rouge/demos/rust | 12 + .../gems/rouge-3.1.0/lib/rouge/demos/sass | 3 + .../gems/rouge-3.1.0/lib/rouge/demos/scala | 3 + .../gems/rouge-3.1.0/lib/rouge/demos/scheme | 4 + .../gems/rouge-3.1.0/lib/rouge/demos/scss | 5 + .../gems/rouge-3.1.0/lib/rouge/demos/sed | 4 + .../gems/rouge-3.1.0/lib/rouge/demos/shell | 2 + .../gems/rouge-3.1.0/lib/rouge/demos/sieve | 10 + .../gems/rouge-3.1.0/lib/rouge/demos/slim | 17 + .../rouge-3.1.0/lib/rouge/demos/smalltalk | 6 + .../gems/rouge-3.1.0/lib/rouge/demos/smarty | 12 + .../gems/rouge-3.1.0/lib/rouge/demos/sml | 4 + .../gems/rouge-3.1.0/lib/rouge/demos/sql | 1 + .../gems/rouge-3.1.0/lib/rouge/demos/swift | 5 + .../gems/rouge-3.1.0/lib/rouge/demos/tap | 5 + .../gems/rouge-3.1.0/lib/rouge/demos/tcl | 1 + .../gems/rouge-3.1.0/lib/rouge/demos/tex | 1 + .../gems/rouge-3.1.0/lib/rouge/demos/toml | 9 + .../gems/rouge-3.1.0/lib/rouge/demos/tsx | 17 + .../gems/rouge-3.1.0/lib/rouge/demos/tulip | 13 + .../gems/rouge-3.1.0/lib/rouge/demos/turtle | 26 + .../gems/rouge-3.1.0/lib/rouge/demos/twig | 9 + .../rouge-3.1.0/lib/rouge/demos/typescript | 1 + .../gems/rouge-3.1.0/lib/rouge/demos/vala | 8 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/demos/vb | 4 + .../gems/rouge-3.1.0/lib/rouge/demos/verilog | 27 + .../gems/rouge-3.1.0/lib/rouge/demos/vhdl | 23 + .../gems/rouge-3.1.0/lib/rouge/demos/viml | 14 + .../gems/rouge-3.1.0/lib/rouge/demos/vue | 11 + .../gems/rouge-3.1.0/lib/rouge/demos/wollok | 11 + .../gems/rouge-3.1.0/lib/rouge/demos/xml | 2 + .../gems/rouge-3.1.0/lib/rouge/demos/yaml | 4 + .../gems/rouge-3.1.0/lib/rouge/formatter.rb | 75 + .../rouge-3.1.0/lib/rouge/formatters/html.rb | 37 + .../lib/rouge/formatters/html_inline.rb | 30 + .../lib/rouge/formatters/html_legacy.rb | 44 + .../lib/rouge/formatters/html_linewise.rb | 27 + .../lib/rouge/formatters/html_pygments.rb | 16 + .../lib/rouge/formatters/html_table.rb | 61 + .../rouge-3.1.0/lib/rouge/formatters/null.rb | 19 + .../lib/rouge/formatters/terminal256.rb | 180 + .../gems/rouge-3.1.0/lib/rouge/guesser.rb | 55 + .../lib/rouge/guessers/disambiguation.rb | 101 + .../lib/rouge/guessers/filename.rb | 25 + .../lib/rouge/guessers/glob_mapping.rb | 43 + .../lib/rouge/guessers/mimetype.rb | 14 + .../lib/rouge/guessers/modeline.rb | 44 + .../rouge-3.1.0/lib/rouge/guessers/source.rb | 29 + .../rouge-3.1.0/lib/rouge/guessers/util.rb | 32 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/lexer.rb | 461 + .../gems/rouge-3.1.0/lib/rouge/lexers/abap.rb | 238 + .../lib/rouge/lexers/actionscript.rb | 195 + .../rouge-3.1.0/lib/rouge/lexers/apache.rb | 71 + .../lib/rouge/lexers/apache/keywords.yml | 764 + .../lib/rouge/lexers/apiblueprint.rb | 47 + .../lib/rouge/lexers/apple_script.rb | 367 + .../gems/rouge-3.1.0/lib/rouge/lexers/awk.rb | 161 + .../gems/rouge-3.1.0/lib/rouge/lexers/biml.rb | 41 + .../gems/rouge-3.1.0/lib/rouge/lexers/bsl.rb | 81 + .../gems/rouge-3.1.0/lib/rouge/lexers/c.rb | 212 + .../rouge-3.1.0/lib/rouge/lexers/ceylon.rb | 123 + .../rouge-3.1.0/lib/rouge/lexers/cfscript.rb | 153 + .../rouge-3.1.0/lib/rouge/lexers/clojure.rb | 112 + .../rouge-3.1.0/lib/rouge/lexers/cmake.rb | 206 + .../lib/rouge/lexers/coffeescript.rb | 174 + .../lib/rouge/lexers/common_lisp.rb | 345 + .../gems/rouge-3.1.0/lib/rouge/lexers/conf.rb | 24 + .../rouge-3.1.0/lib/rouge/lexers/console.rb | 136 + .../gems/rouge-3.1.0/lib/rouge/lexers/coq.rb | 187 + .../gems/rouge-3.1.0/lib/rouge/lexers/cpp.rb | 78 + .../rouge-3.1.0/lib/rouge/lexers/csharp.rb | 114 + .../gems/rouge-3.1.0/lib/rouge/lexers/css.rb | 273 + .../gems/rouge-3.1.0/lib/rouge/lexers/d.rb | 176 + .../gems/rouge-3.1.0/lib/rouge/lexers/dart.rb | 104 + .../gems/rouge-3.1.0/lib/rouge/lexers/diff.rb | 31 + .../rouge-3.1.0/lib/rouge/lexers/digdag.rb | 68 + .../rouge-3.1.0/lib/rouge/lexers/docker.rb | 50 + .../gems/rouge-3.1.0/lib/rouge/lexers/dot.rb | 68 + .../rouge-3.1.0/lib/rouge/lexers/eiffel.rb | 65 + .../rouge-3.1.0/lib/rouge/lexers/elixir.rb | 133 + .../gems/rouge-3.1.0/lib/rouge/lexers/elm.rb | 89 + .../gems/rouge-3.1.0/lib/rouge/lexers/erb.rb | 52 + .../rouge-3.1.0/lib/rouge/lexers/erlang.rb | 114 + .../rouge-3.1.0/lib/rouge/lexers/factor.rb | 302 + .../rouge-3.1.0/lib/rouge/lexers/fortran.rb | 176 + .../rouge-3.1.0/lib/rouge/lexers/fsharp.rb | 118 + .../rouge-3.1.0/lib/rouge/lexers/gherkin.rb | 137 + .../lib/rouge/lexers/gherkin/keywords.rb | 14 + .../gems/rouge-3.1.0/lib/rouge/lexers/glsl.rb | 135 + .../gems/rouge-3.1.0/lib/rouge/lexers/go.rb | 174 + .../rouge-3.1.0/lib/rouge/lexers/gradle.rb | 37 + .../rouge-3.1.0/lib/rouge/lexers/graphql.rb | 243 + .../rouge-3.1.0/lib/rouge/lexers/groovy.rb | 112 + .../gems/rouge-3.1.0/lib/rouge/lexers/hack.rb | 48 + .../gems/rouge-3.1.0/lib/rouge/lexers/haml.rb | 229 + .../lib/rouge/lexers/handlebars.rb | 79 + .../rouge-3.1.0/lib/rouge/lexers/haskell.rb | 182 + .../gems/rouge-3.1.0/lib/rouge/lexers/html.rb | 138 + .../gems/rouge-3.1.0/lib/rouge/lexers/http.rb | 80 + .../rouge-3.1.0/lib/rouge/lexers/hylang.rb | 93 + .../rouge-3.1.0/lib/rouge/lexers/idlang.rb | 310 + .../rouge-3.1.0/lib/rouge/lexers/igorpro.rb | 408 + .../gems/rouge-3.1.0/lib/rouge/lexers/ini.rb | 53 + .../gems/rouge-3.1.0/lib/rouge/lexers/io.rb | 68 + .../gems/rouge-3.1.0/lib/rouge/lexers/irb.rb | 66 + .../gems/rouge-3.1.0/lib/rouge/lexers/java.rb | 87 + .../lib/rouge/lexers/javascript.rb | 281 + .../rouge-3.1.0/lib/rouge/lexers/jinja.rb | 137 + .../gems/rouge-3.1.0/lib/rouge/lexers/json.rb | 29 + .../rouge-3.1.0/lib/rouge/lexers/json_doc.rb | 23 + .../rouge-3.1.0/lib/rouge/lexers/jsonnet.rb | 151 + .../gems/rouge-3.1.0/lib/rouge/lexers/jsx.rb | 102 + .../rouge-3.1.0/lib/rouge/lexers/julia.rb | 172 + .../rouge-3.1.0/lib/rouge/lexers/kotlin.rb | 79 + .../rouge-3.1.0/lib/rouge/lexers/lasso.rb | 214 + .../lib/rouge/lexers/lasso/keywords.yml | 446 + .../rouge-3.1.0/lib/rouge/lexers/liquid.rb | 287 + .../lib/rouge/lexers/literate_coffeescript.rb | 33 + .../lib/rouge/lexers/literate_haskell.rb | 36 + .../gems/rouge-3.1.0/lib/rouge/lexers/llvm.rb | 80 + .../gems/rouge-3.1.0/lib/rouge/lexers/lua.rb | 125 + .../lib/rouge/lexers/lua/builtins.rb | 22 + .../gems/rouge-3.1.0/lib/rouge/lexers/make.rb | 112 + .../rouge-3.1.0/lib/rouge/lexers/markdown.rb | 154 + .../rouge-3.1.0/lib/rouge/lexers/matlab.rb | 71 + .../lib/rouge/lexers/matlab/builtins.rb | 11 + .../lib/rouge/lexers/moonscript.rb | 114 + .../rouge-3.1.0/lib/rouge/lexers/mosel.rb | 231 + .../gems/rouge-3.1.0/lib/rouge/lexers/mxml.rb | 68 + .../gems/rouge-3.1.0/lib/rouge/lexers/nasm.rb | 198 + .../rouge-3.1.0/lib/rouge/lexers/nginx.rb | 71 + .../gems/rouge-3.1.0/lib/rouge/lexers/nim.rb | 152 + .../gems/rouge-3.1.0/lib/rouge/lexers/nix.rb | 205 + .../lib/rouge/lexers/objective_c.rb | 194 + .../rouge-3.1.0/lib/rouge/lexers/ocaml.rb | 100 + .../rouge-3.1.0/lib/rouge/lexers/pascal.rb | 66 + .../gems/rouge-3.1.0/lib/rouge/lexers/perl.rb | 196 + .../gems/rouge-3.1.0/lib/rouge/lexers/php.rb | 193 + .../lib/rouge/lexers/php/builtins.rb | 194 + .../lib/rouge/lexers/plain_text.rb | 26 + .../rouge-3.1.0/lib/rouge/lexers/plist.rb | 45 + .../gems/rouge-3.1.0/lib/rouge/lexers/pony.rb | 93 + .../lib/rouge/lexers/powershell.rb | 678 + .../rouge-3.1.0/lib/rouge/lexers/praat.rb | 350 + .../rouge-3.1.0/lib/rouge/lexers/prolog.rb | 59 + .../lib/rouge/lexers/prometheus.rb | 121 + .../lib/rouge/lexers/properties.rb | 51 + .../rouge-3.1.0/lib/rouge/lexers/protobuf.rb | 70 + .../rouge-3.1.0/lib/rouge/lexers/puppet.rb | 128 + .../rouge-3.1.0/lib/rouge/lexers/python.rb | 232 + .../gems/rouge-3.1.0/lib/rouge/lexers/q.rb | 123 + .../gems/rouge-3.1.0/lib/rouge/lexers/qml.rb | 73 + .../gems/rouge-3.1.0/lib/rouge/lexers/r.rb | 89 + .../rouge-3.1.0/lib/rouge/lexers/racket.rb | 543 + .../gems/rouge-3.1.0/lib/rouge/lexers/ruby.rb | 437 + .../gems/rouge-3.1.0/lib/rouge/lexers/rust.rb | 192 + .../gems/rouge-3.1.0/lib/rouge/lexers/sass.rb | 74 + .../lib/rouge/lexers/sass/common.rb | 180 + .../rouge-3.1.0/lib/rouge/lexers/scala.rb | 142 + .../rouge-3.1.0/lib/rouge/lexers/scheme.rb | 112 + .../gems/rouge-3.1.0/lib/rouge/lexers/scss.rb | 34 + .../gems/rouge-3.1.0/lib/rouge/lexers/sed.rb | 172 + .../rouge-3.1.0/lib/rouge/lexers/shell.rb | 189 + .../rouge-3.1.0/lib/rouge/lexers/sieve.rb | 96 + .../gems/rouge-3.1.0/lib/rouge/lexers/slim.rb | 228 + .../rouge-3.1.0/lib/rouge/lexers/smalltalk.rb | 116 + .../rouge-3.1.0/lib/rouge/lexers/smarty.rb | 80 + .../gems/rouge-3.1.0/lib/rouge/lexers/sml.rb | 344 + .../gems/rouge-3.1.0/lib/rouge/lexers/sql.rb | 140 + .../rouge-3.1.0/lib/rouge/lexers/swift.rb | 181 + .../gems/rouge-3.1.0/lib/rouge/lexers/tap.rb | 87 + .../gems/rouge-3.1.0/lib/rouge/lexers/tcl.rb | 192 + .../gems/rouge-3.1.0/lib/rouge/lexers/tex.rb | 69 + .../gems/rouge-3.1.0/lib/rouge/lexers/toml.rb | 67 + .../gems/rouge-3.1.0/lib/rouge/lexers/tsx.rb | 19 + .../rouge-3.1.0/lib/rouge/lexers/tulip.rb | 106 + .../rouge-3.1.0/lib/rouge/lexers/turtle.rb | 63 + .../gems/rouge-3.1.0/lib/rouge/lexers/twig.rb | 39 + .../lib/rouge/lexers/typescript.rb | 22 + .../lib/rouge/lexers/typescript/common.rb | 33 + .../gems/rouge-3.1.0/lib/rouge/lexers/vala.rb | 77 + .../gems/rouge-3.1.0/lib/rouge/lexers/vb.rb | 164 + .../rouge-3.1.0/lib/rouge/lexers/verilog.rb | 164 + .../gems/rouge-3.1.0/lib/rouge/lexers/vhdl.rb | 97 + .../gems/rouge-3.1.0/lib/rouge/lexers/viml.rb | 101 + .../lib/rouge/lexers/viml/keywords.rb | 12 + .../gems/rouge-3.1.0/lib/rouge/lexers/vue.rb | 120 + .../rouge-3.1.0/lib/rouge/lexers/wollok.rb | 103 + .../gems/rouge-3.1.0/lib/rouge/lexers/xml.rb | 57 + .../gems/rouge-3.1.0/lib/rouge/lexers/yaml.rb | 373 + .../lib/rouge/plugins/redcarpet.rb | 30 + .../gems/rouge-3.1.0/lib/rouge/regex_lexer.rb | 441 + .../rouge-3.1.0/lib/rouge/template_lexer.rb | 20 + .../rouge-3.1.0/lib/rouge/text_analyzer.rb | 49 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/theme.rb | 213 + .../rouge-3.1.0/lib/rouge/themes/base16.rb | 130 + .../rouge-3.1.0/lib/rouge/themes/colorful.rb | 67 + .../rouge-3.1.0/lib/rouge/themes/github.rb | 71 + .../rouge-3.1.0/lib/rouge/themes/gruvbox.rb | 167 + .../rouge-3.1.0/lib/rouge/themes/igor_pro.rb | 20 + .../rouge-3.1.0/lib/rouge/themes/molokai.rb | 82 + .../rouge-3.1.0/lib/rouge/themes/monokai.rb | 92 + .../lib/rouge/themes/monokai_sublime.rb | 90 + .../rouge-3.1.0/lib/rouge/themes/pastie.rb | 69 + .../lib/rouge/themes/thankful_eyes.rb | 74 + .../rouge-3.1.0/lib/rouge/themes/tulip.rb | 69 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/token.rb | 182 + .../2.3.0/gems/rouge-3.1.0/lib/rouge/util.rb | 101 + .../gems/rouge-3.1.0/lib/rouge/version.rb | 7 + .../ruby/2.3.0/gems/rouge-3.1.0/rouge.gemspec | 23 + .../ruby/2.3.0/gems/ruby_dep-1.5.0/.gitignore | 10 + .../ruby/2.3.0/gems/ruby_dep-1.5.0/.rspec | 3 + .../2.3.0/gems/ruby_dep-1.5.0/.rubocop.yml | 3 + .../2.3.0/gems/ruby_dep-1.5.0/.travis.yml | 11 + .../2.3.0/gems/ruby_dep-1.5.0/LICENSE.txt | 21 + .../ruby/2.3.0/gems/ruby_dep-1.5.0/README.md | 197 + .../2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep.rb | 2 + .../ruby_dep-1.5.0/lib/ruby_dep/logger.rb | 48 + .../gems/ruby_dep-1.5.0/lib/ruby_dep/quiet.rb | 3 + .../lib/ruby_dep/ruby_version.rb | 58 + .../ruby_dep-1.5.0/lib/ruby_dep/travis.rb | 58 + .../lib/ruby_dep/travis/ruby_version.rb | 59 + .../ruby_dep-1.5.0/lib/ruby_dep/version.rb | 3 + .../ruby_dep-1.5.0/lib/ruby_dep/warning.rb | 98 + .../2.3.0/gems/safe_yaml-1.0.4/.gitignore | 1 + .../2.3.0/gems/safe_yaml-1.0.4/.travis.yml | 48 + .../2.3.0/gems/safe_yaml-1.0.4/CHANGES.md | 149 + .../ruby/2.3.0/gems/safe_yaml-1.0.4/Gemfile | 11 + .../2.3.0/gems/safe_yaml-1.0.4/LICENSE.txt | 22 + .../ruby/2.3.0/gems/safe_yaml-1.0.4/README.md | 191 + .../ruby/2.3.0/gems/safe_yaml-1.0.4/Rakefile | 26 + .../2.3.0/gems/safe_yaml-1.0.4/bin/safe_yaml | 75 + .../bundle_install_all_ruby_versions.sh | 11 + .../gems/safe_yaml-1.0.4/lib/safe_yaml.rb | 94 + .../safe_yaml-1.0.4/lib/safe_yaml/deep.rb | 34 + .../lib/safe_yaml/libyaml_checker.rb | 36 + .../safe_yaml-1.0.4/lib/safe_yaml/load.rb | 181 + .../lib/safe_yaml/parse/date.rb | 35 + .../lib/safe_yaml/parse/hexadecimal.rb | 12 + .../lib/safe_yaml/parse/sexagesimal.rb | 26 + .../lib/safe_yaml/psych_handler.rb | 99 + .../lib/safe_yaml/psych_resolver.rb | 52 + .../safe_yaml-1.0.4/lib/safe_yaml/resolver.rb | 94 + .../lib/safe_yaml/safe_to_ruby_visitor.rb | 29 + .../lib/safe_yaml/syck_hack.rb | 36 + .../lib/safe_yaml/syck_node_monkeypatch.rb | 43 + .../lib/safe_yaml/syck_resolver.rb | 38 + .../lib/safe_yaml/transform.rb | 41 + .../lib/safe_yaml/transform/to_boolean.rb | 21 + .../lib/safe_yaml/transform/to_date.rb | 13 + .../lib/safe_yaml/transform/to_float.rb | 33 + .../lib/safe_yaml/transform/to_integer.rb | 26 + .../lib/safe_yaml/transform/to_nil.rb | 18 + .../lib/safe_yaml/transform/to_symbol.rb | 17 + .../safe_yaml/transform/transformation_map.rb | 47 + .../safe_yaml-1.0.4/lib/safe_yaml/version.rb | 3 + .../run_specs_all_ruby_versions.sh | 38 + .../gems/safe_yaml-1.0.4/safe_yaml.gemspec | 19 + .../safe_yaml-1.0.4/spec/exploit.1.9.2.yaml | 2 + .../safe_yaml-1.0.4/spec/exploit.1.9.3.yaml | 2 + .../gems/safe_yaml-1.0.4/spec/issue48.txt | 20 + .../gems/safe_yaml-1.0.4/spec/issue49.yml | 0 .../spec/libyaml_checker_spec.rb | 69 + .../spec/psych_resolver_spec.rb | 10 + .../safe_yaml-1.0.4/spec/resolver_specs.rb | 278 + .../safe_yaml-1.0.4/spec/safe_yaml_spec.rb | 731 + .../gems/safe_yaml-1.0.4/spec/spec_helper.rb | 42 + .../spec/support/exploitable_back_door.rb | 29 + .../spec/syck_resolver_spec.rb | 10 + .../spec/transform/base64_spec.rb | 11 + .../spec/transform/to_date_spec.rb | 60 + .../spec/transform/to_float_spec.rb | 42 + .../spec/transform/to_integer_spec.rb | 64 + .../spec/transform/to_symbol_spec.rb | 51 + .../gems/safe_yaml-1.0.4/spec/yaml_spec.rb | 15 + .../ruby/2.3.0/gems/sass-3.5.5/.yardopts | 13 + .../2.3.0/gems/sass-3.5.5/CODE_OF_CONDUCT.md | 10 + .../2.3.0/gems/sass-3.5.5/CONTRIBUTING.md | 148 + .../ruby/2.3.0/gems/sass-3.5.5/MIT-LICENSE | 20 + .../ruby/2.3.0/gems/sass-3.5.5/README.md | 227 + .../ruby/2.3.0/gems/sass-3.5.5/REVISION | 1 + .../ruby/2.3.0/gems/sass-3.5.5/Rakefile | 378 + .../bundle/ruby/2.3.0/gems/sass-3.5.5/VERSION | 1 + .../ruby/2.3.0/gems/sass-3.5.5/VERSION_DATE | 1 + .../ruby/2.3.0/gems/sass-3.5.5/VERSION_NAME | 1 + .../ruby/2.3.0/gems/sass-3.5.5/bin/sass | 13 + .../2.3.0/gems/sass-3.5.5/bin/sass-convert | 12 + .../ruby/2.3.0/gems/sass-3.5.5/bin/scss | 13 + .../gems/sass-3.5.5/extra/sass-spec-ref.sh | 32 + .../gems/sass-3.5.5/extra/update_watch.rb | 13 + .../bundle/ruby/2.3.0/gems/sass-3.5.5/init.rb | 18 + .../ruby/2.3.0/gems/sass-3.5.5/lib/sass.rb | 102 + .../gems/sass-3.5.5/lib/sass/cache_stores.rb | 15 + .../sass-3.5.5/lib/sass/cache_stores/base.rb | 88 + .../sass-3.5.5/lib/sass/cache_stores/chain.rb | 34 + .../lib/sass/cache_stores/filesystem.rb | 60 + .../lib/sass/cache_stores/memory.rb | 46 + .../sass-3.5.5/lib/sass/cache_stores/null.rb | 25 + .../gems/sass-3.5.5/lib/sass/callbacks.rb | 67 + .../2.3.0/gems/sass-3.5.5/lib/sass/css.rb | 407 + .../gems/sass-3.5.5/lib/sass/deprecation.rb | 55 + .../2.3.0/gems/sass-3.5.5/lib/sass/engine.rb | 1244 ++ .../gems/sass-3.5.5/lib/sass/environment.rb | 236 + .../2.3.0/gems/sass-3.5.5/lib/sass/error.rb | 198 + .../2.3.0/gems/sass-3.5.5/lib/sass/exec.rb | 9 + .../gems/sass-3.5.5/lib/sass/exec/base.rb | 190 + .../sass-3.5.5/lib/sass/exec/sass_convert.rb | 283 + .../sass-3.5.5/lib/sass/exec/sass_scss.rb | 440 + .../gems/sass-3.5.5/lib/sass/features.rb | 48 + .../gems/sass-3.5.5/lib/sass/importers.rb | 23 + .../sass-3.5.5/lib/sass/importers/base.rb | 182 + .../lib/sass/importers/deprecated_path.rb | 51 + .../lib/sass/importers/filesystem.rb | 219 + .../2.3.0/gems/sass-3.5.5/lib/sass/logger.rb | 17 + .../gems/sass-3.5.5/lib/sass/logger/base.rb | 47 + .../sass-3.5.5/lib/sass/logger/delayed.rb | 50 + .../sass-3.5.5/lib/sass/logger/log_level.rb | 45 + .../2.3.0/gems/sass-3.5.5/lib/sass/media.rb | 210 + .../2.3.0/gems/sass-3.5.5/lib/sass/plugin.rb | 134 + .../sass-3.5.5/lib/sass/plugin/compiler.rb | 552 + .../lib/sass/plugin/configuration.rb | 134 + .../sass-3.5.5/lib/sass/plugin/generic.rb | 15 + .../gems/sass-3.5.5/lib/sass/plugin/merb.rb | 48 + .../gems/sass-3.5.5/lib/sass/plugin/rack.rb | 60 + .../gems/sass-3.5.5/lib/sass/plugin/rails.rb | 47 + .../lib/sass/plugin/staleness_checker.rb | 199 + .../2.3.0/gems/sass-3.5.5/lib/sass/railtie.rb | 10 + .../2.3.0/gems/sass-3.5.5/lib/sass/repl.rb | 57 + .../2.3.0/gems/sass-3.5.5/lib/sass/root.rb | 7 + .../2.3.0/gems/sass-3.5.5/lib/sass/script.rb | 66 + .../sass-3.5.5/lib/sass/script/css_lexer.rb | 33 + .../sass-3.5.5/lib/sass/script/css_parser.rb | 33 + .../sass-3.5.5/lib/sass/script/functions.rb | 2885 +++ .../gems/sass-3.5.5/lib/sass/script/lexer.rb | 484 + .../gems/sass-3.5.5/lib/sass/script/parser.rb | 835 + .../gems/sass-3.5.5/lib/sass/script/tree.rb | 16 + .../lib/sass/script/tree/funcall.rb | 318 + .../lib/sass/script/tree/interpolation.rb | 223 + .../lib/sass/script/tree/list_literal.rb | 119 + .../lib/sass/script/tree/literal.rb | 49 + .../lib/sass/script/tree/map_literal.rb | 64 + .../sass-3.5.5/lib/sass/script/tree/node.rb | 119 + .../lib/sass/script/tree/operation.rb | 149 + .../lib/sass/script/tree/selector.rb | 26 + .../sass/script/tree/string_interpolation.rb | 125 + .../lib/sass/script/tree/unary_operation.rb | 69 + .../lib/sass/script/tree/variable.rb | 57 + .../gems/sass-3.5.5/lib/sass/script/value.rb | 13 + .../lib/sass/script/value/arg_list.rb | 36 + .../sass-3.5.5/lib/sass/script/value/base.rb | 258 + .../sass-3.5.5/lib/sass/script/value/bool.rb | 35 + .../lib/sass/script/value/callable.rb | 25 + .../sass-3.5.5/lib/sass/script/value/color.rb | 703 + .../lib/sass/script/value/function.rb | 19 + .../lib/sass/script/value/helpers.rb | 292 + .../sass-3.5.5/lib/sass/script/value/list.rb | 134 + .../sass-3.5.5/lib/sass/script/value/map.rb | 70 + .../sass-3.5.5/lib/sass/script/value/null.rb | 44 + .../lib/sass/script/value/number.rb | 563 + .../lib/sass/script/value/string.rb | 138 + .../2.3.0/gems/sass-3.5.5/lib/sass/scss.rb | 14 + .../sass-3.5.5/lib/sass/scss/css_parser.rb | 56 + .../gems/sass-3.5.5/lib/sass/scss/parser.rb | 1313 ++ .../2.3.0/gems/sass-3.5.5/lib/sass/scss/rx.rb | 134 + .../sass-3.5.5/lib/sass/scss/static_parser.rb | 354 + .../gems/sass-3.5.5/lib/sass/selector.rb | 327 + .../lib/sass/selector/abstract_sequence.rb | 112 + .../lib/sass/selector/comma_sequence.rb | 195 + .../sass-3.5.5/lib/sass/selector/pseudo.rb | 283 + .../sass-3.5.5/lib/sass/selector/sequence.rb | 665 + .../sass-3.5.5/lib/sass/selector/simple.rb | 124 + .../lib/sass/selector/simple_sequence.rb | 348 + .../2.3.0/gems/sass-3.5.5/lib/sass/shared.rb | 76 + .../gems/sass-3.5.5/lib/sass/source/map.rb | 213 + .../sass-3.5.5/lib/sass/source/position.rb | 39 + .../gems/sass-3.5.5/lib/sass/source/range.rb | 41 + .../2.3.0/gems/sass-3.5.5/lib/sass/stack.rb | 140 + .../gems/sass-3.5.5/lib/sass/supports.rb | 225 + .../sass-3.5.5/lib/sass/tree/at_root_node.rb | 83 + .../sass-3.5.5/lib/sass/tree/charset_node.rb | 22 + .../sass-3.5.5/lib/sass/tree/comment_node.rb | 82 + .../sass-3.5.5/lib/sass/tree/content_node.rb | 9 + .../lib/sass/tree/css_import_node.rb | 68 + .../sass-3.5.5/lib/sass/tree/debug_node.rb | 18 + .../lib/sass/tree/directive_node.rb | 59 + .../sass-3.5.5/lib/sass/tree/each_node.rb | 24 + .../sass-3.5.5/lib/sass/tree/error_node.rb | 18 + .../sass-3.5.5/lib/sass/tree/extend_node.rb | 43 + .../gems/sass-3.5.5/lib/sass/tree/for_node.rb | 36 + .../sass-3.5.5/lib/sass/tree/function_node.rb | 44 + .../gems/sass-3.5.5/lib/sass/tree/if_node.rb | 52 + .../sass-3.5.5/lib/sass/tree/import_node.rb | 75 + .../lib/sass/tree/keyframe_rule_node.rb | 15 + .../sass-3.5.5/lib/sass/tree/media_node.rb | 48 + .../lib/sass/tree/mixin_def_node.rb | 38 + .../sass-3.5.5/lib/sass/tree/mixin_node.rb | 52 + .../gems/sass-3.5.5/lib/sass/tree/node.rb | 240 + .../sass-3.5.5/lib/sass/tree/prop_node.rb | 162 + .../sass-3.5.5/lib/sass/tree/return_node.rb | 19 + .../sass-3.5.5/lib/sass/tree/root_node.rb | 44 + .../sass-3.5.5/lib/sass/tree/rule_node.rb | 154 + .../sass-3.5.5/lib/sass/tree/supports_node.rb | 38 + .../sass-3.5.5/lib/sass/tree/trace_node.rb | 33 + .../sass-3.5.5/lib/sass/tree/variable_node.rb | 36 + .../sass-3.5.5/lib/sass/tree/visitors/base.rb | 72 + .../lib/sass/tree/visitors/check_nesting.rb | 173 + .../lib/sass/tree/visitors/convert.rb | 350 + .../lib/sass/tree/visitors/cssize.rb | 362 + .../lib/sass/tree/visitors/deep_copy.rb | 107 + .../lib/sass/tree/visitors/extend.rb | 64 + .../lib/sass/tree/visitors/perform.rb | 576 + .../lib/sass/tree/visitors/set_options.rb | 139 + .../lib/sass/tree/visitors/to_css.rb | 443 + .../sass-3.5.5/lib/sass/tree/warn_node.rb | 18 + .../sass-3.5.5/lib/sass/tree/while_node.rb | 18 + .../2.3.0/gems/sass-3.5.5/lib/sass/util.rb | 1092 + .../lib/sass/util/multibyte_string_scanner.rb | 151 + .../lib/sass/util/normalized_map.rb | 122 + .../sass-3.5.5/lib/sass/util/subset_map.rb | 109 + .../gems/sass-3.5.5/lib/sass/util/test.rb | 9 + .../2.3.0/gems/sass-3.5.5/lib/sass/version.rb | 122 + .../ruby/2.3.0/gems/sass-3.5.5/rails/init.rb | 1 + .../2.3.0/gems/sass-3.5.5/test/sass-spec.yml | 3 + .../gems/sass-3.5.5/test/sass/cache_test.rb | 130 + .../sass-3.5.5/test/sass/callbacks_test.rb | 60 + .../sass-3.5.5/test/sass/compiler_test.rb | 225 + .../sass-3.5.5/test/sass/conversion_test.rb | 2138 ++ .../sass-3.5.5/test/sass/css2sass_test.rb | 523 + .../sass-3.5.5/test/sass/css_variable_test.rb | 237 + .../sass-3.5.5/test/sass/data/hsl-rgb.txt | 319 + .../sass-3.5.5/test/sass/encoding_test.rb | 188 + .../gems/sass-3.5.5/test/sass/engine_test.rb | 3499 ++++ .../gems/sass-3.5.5/test/sass/exec_test.rb | 95 + .../gems/sass-3.5.5/test/sass/extend_test.rb | 1679 ++ .../test_staleness_check_across_importers.css | 1 + ...test_staleness_check_across_importers.scss | 1 + .../sass-3.5.5/test/sass/functions_test.rb | 2021 ++ .../sass-3.5.5/test/sass/importer_test.rb | 420 + .../gems/sass-3.5.5/test/sass/logger_test.rb | 57 + .../sass-3.5.5/test/sass/mock_importer.rb | 49 + .../test/sass/more_results/more1.css | 9 + .../more_results/more1_with_line_comments.css | 26 + .../test/sass/more_results/more_import.css | 29 + .../sass/more_templates/_more_partial.sass | 2 + .../test/sass/more_templates/more1.sass | 23 + .../test/sass/more_templates/more_import.sass | 11 + .../gems/sass-3.5.5/test/sass/plugin_test.rb | 552 + .../gems/sass-3.5.5/test/sass/results/alt.css | 4 + .../sass-3.5.5/test/sass/results/basic.css | 9 + .../sass/results/cached_import_option.css | 3 + .../sass-3.5.5/test/sass/results/compact.css | 5 + .../sass-3.5.5/test/sass/results/complex.css | 86 + .../test/sass/results/compressed.css | 1 + .../sass-3.5.5/test/sass/results/expanded.css | 19 + .../test/sass/results/filename_fn.css | 3 + .../gems/sass-3.5.5/test/sass/results/if.css | 3 + .../sass-3.5.5/test/sass/results/import.css | 31 + .../test/sass/results/import_charset.css | 5 + .../sass/results/import_charset_ibm866.css | 5 + .../test/sass/results/import_content.css | 1 + .../test/sass/results/line_numbers.css | 49 + .../sass-3.5.5/test/sass/results/mixins.css | 95 + .../test/sass/results/multiline.css | 24 + .../sass-3.5.5/test/sass/results/nested.css | 22 + .../sass-3.5.5/test/sass/results/options.css | 1 + .../test/sass/results/parent_ref.css | 13 + .../sass-3.5.5/test/sass/results/script.css | 16 + .../test/sass/results/scss_import.css | 31 + .../test/sass/results/scss_importee.css | 2 + .../subdir/nested_subdir/nested_subdir.css | 1 + .../test/sass/results/subdir/subdir.css | 3 + .../sass-3.5.5/test/sass/results/units.css | 11 + .../sass-3.5.5/test/sass/results/warn.css | 0 .../test/sass/results/warn_imported.css | 0 .../test/sass/script_conversion_test.rb | 365 + .../gems/sass-3.5.5/test/sass/script_test.rb | 1429 ++ .../sass-3.5.5/test/sass/scss/css_test.rb | 1266 ++ .../gems/sass-3.5.5/test/sass/scss/rx_test.rb | 159 + .../sass-3.5.5/test/sass/scss/scss_test.rb | 4238 ++++ .../sass-3.5.5/test/sass/scss/test_helper.rb | 37 + .../sass-3.5.5/test/sass/source_map_test.rb | 1063 + .../test/sass/superselector_test.rb | 209 + .../_cached_import_option_partial.scss | 1 + .../sass/templates/_double_import_loop2.sass | 1 + .../sass/templates/_filename_fn_import.scss | 11 + .../templates/_imported_charset_ibm866.sass | 4 + .../templates/_imported_charset_utf8.sass | 4 + .../sass/templates/_imported_content.sass | 3 + .../test/sass/templates/_partial.sass | 2 + .../_same_name_different_partiality.scss | 1 + .../sass-3.5.5/test/sass/templates/alt.sass | 16 + .../sass-3.5.5/test/sass/templates/basic.sass | 23 + .../sass-3.5.5/test/sass/templates/bork1.sass | 2 + .../sass-3.5.5/test/sass/templates/bork2.sass | 2 + .../sass-3.5.5/test/sass/templates/bork3.sass | 2 + .../sass-3.5.5/test/sass/templates/bork4.sass | 2 + .../sass-3.5.5/test/sass/templates/bork5.sass | 3 + .../sass/templates/cached_import_option.scss | 3 + .../test/sass/templates/compact.sass | 17 + .../test/sass/templates/complex.sass | 305 + .../test/sass/templates/compressed.sass | 15 + .../sass/templates/double_import_loop1.sass | 1 + .../test/sass/templates/expanded.sass | 17 + .../test/sass/templates/filename_fn.scss | 18 + .../sass-3.5.5/test/sass/templates/if.sass | 11 + .../test/sass/templates/import.sass | 12 + .../test/sass/templates/import_charset.sass | 9 + .../sass/templates/import_charset_ibm866.sass | 11 + .../test/sass/templates/import_content.sass | 4 + .../test/sass/templates/importee.less | 2 + .../test/sass/templates/importee.sass | 19 + .../test/sass/templates/line_numbers.sass | 13 + .../test/sass/templates/mixin_bork.sass | 5 + .../test/sass/templates/mixins.sass | 76 + .../test/sass/templates/multiline.sass | 20 + .../test/sass/templates/nested.sass | 25 + .../test/sass/templates/nested_bork1.sass | 2 + .../test/sass/templates/nested_bork2.sass | 2 + .../test/sass/templates/nested_bork3.sass | 2 + .../test/sass/templates/nested_bork4.sass | 2 + .../test/sass/templates/nested_import.sass | 2 + .../sass/templates/nested_mixin_bork.sass | 6 + .../test/sass/templates/options.sass | 2 + .../test/sass/templates/parent_ref.sass | 25 + .../templates/same_name_different_ext.sass | 2 + .../templates/same_name_different_ext.scss | 1 + .../same_name_different_partiality.scss | 1 + .../test/sass/templates/script.sass | 101 + .../test/sass/templates/scss_import.scss | 12 + .../test/sass/templates/scss_importee.scss | 1 + .../sass/templates/single_import_loop.sass | 1 + .../sass/templates/subdir/import_up1.scss | 1 + .../sass/templates/subdir/import_up2.scss | 1 + .../subdir/nested_subdir/_nested_partial.sass | 2 + .../subdir/nested_subdir/nested_subdir.sass | 3 + .../test/sass/templates/subdir/subdir.sass | 6 + .../sass-3.5.5/test/sass/templates/units.sass | 11 + .../sass-3.5.5/test/sass/templates/warn.sass | 3 + .../test/sass/templates/warn_imported.sass | 4 + .../gems/sass-3.5.5/test/sass/test_helper.rb | 8 + .../util/multibyte_string_scanner_test.rb | 152 + .../test/sass/util/normalized_map_test.rb | 50 + .../test/sass/util/subset_map_test.rb | 90 + .../gems/sass-3.5.5/test/sass/util_test.rb | 393 + .../test/sass/value_helpers_test.rb | 178 + .../2.3.0/gems/sass-3.5.5/test/test_helper.rb | 149 + .../2.3.0/gems/sass-listen-4.0.0/CHANGELOG.md | 1 + .../gems/sass-listen-4.0.0/CONTRIBUTING.md | 38 + .../2.3.0/gems/sass-listen-4.0.0/LICENSE.txt | 22 + .../2.3.0/gems/sass-listen-4.0.0/README.md | 297 + .../gems/sass-listen-4.0.0/lib/sass-listen.rb | 55 + .../lib/sass-listen/adapter.rb | 43 + .../lib/sass-listen/adapter/base.rb | 137 + .../lib/sass-listen/adapter/bsd.rb | 106 + .../lib/sass-listen/adapter/config.rb | 26 + .../lib/sass-listen/adapter/darwin.rb | 88 + .../lib/sass-listen/adapter/linux.rb | 108 + .../lib/sass-listen/adapter/polling.rb | 37 + .../lib/sass-listen/adapter/windows.rb | 99 + .../lib/sass-listen/backend.rb | 43 + .../lib/sass-listen/change.rb | 78 + .../sass-listen-4.0.0/lib/sass-listen/cli.rb | 65 + .../lib/sass-listen/directory.rb | 87 + .../lib/sass-listen/event/config.rb | 59 + .../lib/sass-listen/event/loop.rb | 117 + .../lib/sass-listen/event/processor.rb | 122 + .../lib/sass-listen/event/queue.rb | 58 + .../sass-listen-4.0.0/lib/sass-listen/file.rb | 80 + .../sass-listen-4.0.0/lib/sass-listen/fsm.rb | 131 + .../lib/sass-listen/internals/thread_pool.rb | 29 + .../lib/sass-listen/listener.rb | 132 + .../lib/sass-listen/listener/config.rb | 45 + .../lib/sass-listen/logger.rb | 32 + .../lib/sass-listen/options.rb | 23 + .../lib/sass-listen/queue_optimizer.rb | 132 + .../lib/sass-listen/record.rb | 120 + .../lib/sass-listen/record/entry.rb | 62 + .../sass-listen/record/symlink_detector.rb | 39 + .../lib/sass-listen/silencer.rb | 97 + .../lib/sass-listen/silencer/controller.rb | 48 + .../lib/sass-listen/version.rb | 3 + .../specifications/addressable-2.5.2.gemspec | 39 + .../specifications/colorator-1.1.0.gemspec | 34 + .../concurrent-ruby-1.0.5.gemspec | 23 + .../specifications/em-websocket-0.5.1.gemspec | 35 + .../specifications/eventmachine-1.2.5.gemspec | Bin 0 -> 3599 bytes .../2.3.0/specifications/ffi-1.9.18.gemspec | 49 + .../forwardable-extended-2.6.0.gemspec | 20 + .../http_parser.rb-0.6.0.gemspec | 50 + .../2.3.0/specifications/i18n-0.9.1.gemspec | 34 + .../2.3.0/specifications/jekyll-3.7.0.gemspec | 71 + .../specifications/jekyll-feed-0.9.2.gemspec | 49 + .../jekyll-sass-converter-1.5.1.gemspec | 46 + .../specifications/jekyll-watch-2.0.0.gemspec | 47 + .../specifications/kramdown-1.16.2.gemspec | 63 + .../2.3.0/specifications/liquid-4.0.0.gemspec | 37 + .../2.3.0/specifications/listen-3.1.5.gemspec | 44 + .../specifications/mercenary-0.3.6.gemspec | 38 + .../2.3.0/specifications/minima-2.1.1.gemspec | 36 + .../specifications/pathutil-0.16.1.gemspec | 32 + .../public_suffix-3.0.1.gemspec | 41 + .../specifications/rb-fsevent-0.10.2.gemspec | 42 + .../specifications/rb-inotify-0.9.10.gemspec | 40 + .../2.3.0/specifications/rouge-3.1.0.gemspec | 25 + .../specifications/ruby_dep-1.5.0.gemspec | 34 + .../specifications/safe_yaml-1.0.4.gemspec | 23 + .../2.3.0/specifications/sass-3.5.5.gemspec | 48 + .../specifications/sass-listen-4.0.0.gemspec | 39 + 3027 files changed, 424964 insertions(+), 5 deletions(-) create mode 100644 .bundle/config create mode 100644 .gitignore create mode 100644 404.html create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 INSTRUCTIONS.txt rename _src/README.md => README.md (100%) create mode 100644 _config.yml create mode 100644 _posts/2018-01-08-welcome-to-jekyll.markdown create mode 100644 _site/404.html create mode 100644 _site/INSTRUCTIONS.txt create mode 100644 _site/README.md create mode 100644 _site/about/index.html create mode 100644 _site/assets/main.css create mode 100644 _site/feed.xml create mode 100644 _site/index.html create mode 100644 _site/jekyll/update/2018/01/08/welcome-to-jekyll.html delete mode 100644 _src/_config.yml create mode 100644 about.md create mode 100644 index.md create mode 100755 vendor/bundle/ruby/2.3.0/bin/jekyll create mode 100755 vendor/bundle/ruby/2.3.0/bin/kramdown create mode 100755 vendor/bundle/ruby/2.3.0/bin/listen create mode 100755 vendor/bundle/ruby/2.3.0/bin/rougify create mode 100755 vendor/bundle/ruby/2.3.0/bin/safe_yaml create mode 100755 vendor/bundle/ruby/2.3.0/bin/sass create mode 100755 vendor/bundle/ruby/2.3.0/bin/sass-convert create mode 100755 vendor/bundle/ruby/2.3.0/bin/scss create mode 100644 vendor/bundle/ruby/2.3.0/cache/addressable-2.5.2.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/colorator-1.1.0.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/concurrent-ruby-1.0.5.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/em-websocket-0.5.1.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/eventmachine-1.2.5.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/ffi-1.9.18.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/forwardable-extended-2.6.0.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/http_parser.rb-0.6.0.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/i18n-0.9.1.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/jekyll-3.7.0.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/jekyll-feed-0.9.2.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/jekyll-sass-converter-1.5.1.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/jekyll-watch-2.0.0.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/kramdown-1.16.2.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/liquid-4.0.0.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/listen-3.1.5.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/mercenary-0.3.6.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/minima-2.1.1.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/pathutil-0.16.1.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/public_suffix-3.0.1.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/rb-fsevent-0.10.2.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/rb-inotify-0.9.10.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/rouge-3.1.0.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/ruby_dep-1.5.0.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/safe_yaml-1.0.4.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/sass-3.5.5.gem create mode 100644 vendor/bundle/ruby/2.3.0/cache/sass-listen-4.0.0.gem create mode 100755 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/fastfilereaderext.bundle create mode 100644 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/gem.build_complete create mode 100644 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/gem_make.out create mode 100644 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/mkmf.log create mode 100755 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/rubyeventmachine.bundle create mode 100755 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/ffi_c.bundle create mode 100644 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/gem.build_complete create mode 100644 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/gem_make.out create mode 100644 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/mkmf.log create mode 100644 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/http_parser.rb-0.6.0/gem.build_complete create mode 100644 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/http_parser.rb-0.6.0/gem_make.out create mode 100755 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/http_parser.rb-0.6.0/ruby_http_parser.bundle create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/CHANGELOG.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/LICENSE.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Rakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/data/unicode.data create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/native.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/template.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/spec_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/clobber.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/gem.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/git.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/metrics.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/rspec.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/yard.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/History.markdown create mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/LICENSE create mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/README.markdown create mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Rakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/colorator.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/CHANGELOG.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/LICENSE.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/agent.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/array.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/async.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atom.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/abstract_thread_local_var.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_boolean.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_fixnum.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_reference.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/count_down_latch.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/cyclic_barrier.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/event.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/java_count_down_latch.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/java_thread_local_var.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_atomic_boolean.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_atomic_fixnum.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_count_down_latch.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_semaphore.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/read_write_lock.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/reentrant_read_write_lock.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/ruby_thread_local_var.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/semaphore.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/thread_local_var.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/concurrent_update_error.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/direct_update.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/jruby+truffle.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/jruby.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/mutex_atomic.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/numeric_cas_wrapper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/rbx.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/ruby.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomics.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/copy_on_notify_observer_set.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/copy_on_write_observer_set.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/java_non_concurrent_priority_queue.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/atomic_reference_map_backend.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/mri_map_backend.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/synchronized_map_backend.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/non_concurrent_priority_queue.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/ruby_non_concurrent_priority_queue.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/deprecation.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/dereferenceable.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/logging.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/obligation.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/observable.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/configuration.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/constants.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/dataflow.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/delay.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/edge.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/errors.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/exchanger.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/abstract_executor_service.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/cached_thread_pool.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/executor_service.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/fixed_thread_pool.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/immediate_executor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/indirect_immediate_executor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_executor_service.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_single_thread_executor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_thread_pool_executor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_executor_service.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_single_thread_executor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_thread_pool_executor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/safe_task_executor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serial_executor_service.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serialized_execution.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serialized_execution_delegator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/simple_executor_service.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/single_thread_executor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/thread_pool_executor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/timer_set.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executors.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/future.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/hash.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/immutable_struct.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/ivar.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/lazy_register.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/map.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/maybe.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/mutable_struct.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/mvar.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/options.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/promise.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/scheduled_task.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/settable_struct.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_lockable_object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_struct.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/condition.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/jruby_lockable_object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/jruby_object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/lock.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/lockable_object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/mri_lockable_object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/mri_object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/rbx_lockable_object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/rbx_object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/truffle_lockable_object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/truffle_object.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/volatile.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/synchronized_delegator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/adder.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/array_hash_rbx.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/cheap_lockable.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/power_of_two_tuple.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/striped64.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/volatile.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/xor_shift_random.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/timer_task.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/tuple.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/tvar.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/at_exit.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/engine.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/monotonic_time.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/native_extension_loader.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/native_integer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/processor_counter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/.gitignore create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/CHANGELOG.rdoc create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/Rakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/echo.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/multicast.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/ping.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/test.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close03.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close05.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close06.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close75.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/connection.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/debugger.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing03.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing04.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing05.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing07.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing76.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler03.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler05.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler06.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler07.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler08.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler13.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler75.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler76.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake04.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake75.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake76.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/masking04.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/message_processor_03.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/message_processor_06.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/websocket.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/common_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft03_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft05_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft06_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft13_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft75_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft76_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/gte_03_examples.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/shared_examples.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/framing_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/handshake_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/masking_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/CHANGELOG.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/GNU create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/LICENSE create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/DocumentationGuidesIndex.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/GettingStarted.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/ChangeLog create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/DEFERRABLES create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/EPOLL create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/INSTALL create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/KEYBOARD create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/LEGAL create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/LIGHTWEIGHT_CONCURRENCY create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/PURE_RUBY create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/RELEASE_NOTES create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/SMTP create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/SPAWNED_PROCESSES create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/TODO create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/01_eventmachine_echo_server.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/03_simple_chat_server.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/04_simple_chat_server_step_one.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/05_simple_chat_server_step_two.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/06_simple_chat_server_step_three.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/07_simple_chat_server_step_four.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/08_simple_chat_server_step_five.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_channel.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_queue.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_tick_loop_array.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_tick_loop_counter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/.RUBYARCHDIR.time create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/Makefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/binder.cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/binder.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/binder.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/cmain.cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/cmain.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ed.cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ed.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ed.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/em.cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/em.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/em.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/eventmachine.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/extconf.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/.RUBYARCHDIR.time create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/Makefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/extconf.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/fastfilereaderext.bundle create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/mapper.cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/mapper.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/mapper.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/rubymain.cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/rubymain.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/kb.cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/kb.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/page.cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/page.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/page.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/pipe.cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/pipe.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/project.h create mode 100755 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/rubyeventmachine.bundle create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/rubymain.cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/rubymain.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ssl.cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ssl.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ssl.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/.classpath create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/.project create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EmReactor.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EmReactorException.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableChannel.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableDatagramChannel.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableSocketChannel.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/buftok.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/callback.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/channel.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/completion.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/connection.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/deferrable.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/deferrable/pool.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/file_watch.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/future.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/iterator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/messages.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/pool.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/process_watch.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/processes.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/header_and_content.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/httpclient.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/httpclient2.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/line_and_text.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/line_protocol.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/linetext2.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/memcache.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/object_protocol.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/postgres3.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/saslauth.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/smtpclient.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/smtpserver.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/socks4.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/stomp.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/tcptest.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/pure_ruby.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/queue.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/resolver.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/spawnable.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/streamer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/threaded_resource.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/tick_loop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/timers.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/eventmachine.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/fastfilereaderext.bundle create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/jeventmachine.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/rubyeventmachine.bundle create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/package.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/test.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/test_pure.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/client.crt create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/client.key create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/dhparam.pem create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/em_test_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_attach.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_basic.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_channel.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_completion.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_connection_count.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_connection_write.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_defer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_deferrable.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_epoll.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_error_handler.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_exc.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_file_watch.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_fork.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_futures.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_handler_check.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_hc.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_httpclient.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_httpclient2.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_idle_connection.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_inactivity_timeout.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ipv4.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ipv6.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_iterator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_kb.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_line_protocol.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ltp.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ltp2.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_many_fds.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_next_tick.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_object_protocol.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pause.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pending_connect_timeout.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pool.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_process_watch.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_processes.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_proxy_connection.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pure.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_queue.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_resolver.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_running.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_sasl.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_send_file.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_servers.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_shutdown_hooks.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_smtpclient.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_smtpserver.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_sock_opt.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_spawn.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_args.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_dhparam.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_ecdh_curve.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_extensions.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_methods.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_protocols.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_verify.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_stomp.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_system.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_threaded_resource.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_tick_loop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_timers.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ud.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_unbind_reason.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/COPYING create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/LICENSE create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/Rakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/.RUBYARCHDIR.time create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Call.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Call.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Call.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DataConverter.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DataConverter.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Function.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Function.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Function.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LastError.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LastError.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LastError.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Makefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Platform.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Platform.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Platform.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Struct.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Struct.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Struct.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Type.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Type.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Type.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Types.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Types.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Types.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Variadic.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Variadic.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/compat.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/extconf.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/extconf.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi.o create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi_c.bundle create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi.5.dylib create mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi.dylib create mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi.la create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi.lai create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi_convenience.a create mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi_convenience.la create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/Makefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/config.log create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/config.status create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/fficonfig.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/Makefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/ffi.h create mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi.la create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi.pc create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi_convenience.la create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libtool create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/man/Makefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.deps/.dirstamp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.dirstamp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/closures.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/debug.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/java_raw_api.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/prep_cif.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/raw_api.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/types.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/closures.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/debug.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/java_raw_api.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/prep_cif.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/raw_api.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/types.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.deps/.dirstamp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.dirstamp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.libs/darwin.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.libs/darwin64.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.libs/ffi.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.libs/ffi64.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/darwin.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/darwin64.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/ffi.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/ffi64.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/stamp-h1 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/testsuite/Makefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17/.libs/libffi_convenience.a create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17/include/ffi.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17/include/ffitarget.h create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.5.dylib create mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.dylib create mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.la create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.lai create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi_convenience.a create mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi_convenience.la create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/Makefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/config.log create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/config.status create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/fficonfig.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/Makefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/ffi.h create mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi.la create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi.pc create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi_convenience.la create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libtool create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/man/Makefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.deps/.dirstamp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.dirstamp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.libs/closures.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.libs/debug.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.libs/java_raw_api.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.libs/prep_cif.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.libs/raw_api.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.libs/types.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/closures.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/debug.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/java_raw_api.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/prep_cif.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/raw_api.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/types.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.deps/.dirstamp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.dirstamp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.libs/darwin.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.libs/darwin64.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.libs/ffi.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.libs/ffi64.o create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/darwin.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/darwin64.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/ffi.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/ffi64.lo create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/stamp-h1 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/testsuite/Makefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.bsd.mk create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.darwin.mk create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.gnu.mk create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.mk create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc.mk create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc64.mk create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libffi create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libgcj create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.v1 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/LICENSE create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.am create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.in create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc64 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/README create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/acinclude.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/aclocal.m4 create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/build-ios.sh create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/compile create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.guess create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.sub create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.ac create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.host create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/depcomp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.info create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.texi create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/stamp-vti create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/version.texi create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.h.in create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.hw create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.am create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.in create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.in create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc64 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi_common.h create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libffi.pc.in create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libtool-version create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ltmain.sh create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_configure_args.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/libtool.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltoptions.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltsugar.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltversion.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/lt~obsolete.m4 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.am create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.in create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi.3 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_call.3 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_prep_cif.3 create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/mdate-sh create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/msvcc.sh create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/osf.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffitarget.h create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/gentramp.sh create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/sysv.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/trampoline.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/sysv.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/closures.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/sysv.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/debug.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/dlmalloc.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/eabi.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ia64_flags.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/unix.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/java_raw_api.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/sysv.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/sysv.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/n32.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/o32.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/eabi.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/hpux32.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/linux.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix_closure.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/asm.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin_closure.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64_closure.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ppc_closure.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/sysv.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/prep_cif.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/sysv.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/sysv.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/sysv.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v8.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v9.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/types.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin64.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi64.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffitarget.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/freebsd.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/sysv.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/unix64.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win32.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win64.S create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.am create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.in create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/config/default.exp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi.exp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/wrapper.exp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/call.exp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float1.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float2.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float3.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float4.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/negint.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/special.exp create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/texinfo.tex create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/rbffi.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/rbffi_endian.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdbool.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdint.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ffi.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/gen/Rakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/autopointer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/buffer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/callback.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/enum.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/errno.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/ffi.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/io.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/library.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/managedstruct.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/memorypointer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/aarch64-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/arm-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-cygwin/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-darwin/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-freebsd/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-gnu/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-netbsd/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-openbsd/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-solaris/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-windows/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/ia64-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mips-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mips64el-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mipsel-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-aix/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-darwin/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc64-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/s390-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/s390x-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-solaris/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparcv9-solaris/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-cygwin/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-darwin/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-freebsd/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-linux/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-netbsd/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-openbsd/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-solaris/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-windows/types.conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/pointer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/struct.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/struct_layout_builder.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/const_generator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/generator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/generator_task.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/struct_generator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/types_generator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/types.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/union.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/variadic.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/version.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi_c.bundle create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/Benchmark.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/BoolTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/BufferTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/ClosureTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/EnumTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/FunctionTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/GNUmakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/GlobalVariable.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/LastErrorTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/NumberTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/PointerTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/ReferenceTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/StringTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/StructTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/UnionTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/VariadicTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/LICENSE.SPECS create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/async_callback_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/bool_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/buffer_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/callback_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/custom_param_type.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/custom_type_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/dup_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/enum_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/errno_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/ffi_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/Benchmark.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/BoolTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/BufferTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/ClosureTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/EnumTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/FunctionTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/GNUmakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/GlobalVariable.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/LastErrorTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/NumberTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelper.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperPosix.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperWindows.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PointerTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/ReferenceTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/StringTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/StructTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/UnionTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/VariadicTest.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/classes.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/function_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/io_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/library_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/long_double.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/managed_struct_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/memorypointer_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/number_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/platform_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/pointer_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/attach_function_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/memory_pointer_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/spec_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/struct_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/spec_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/string_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/strptr_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_by_ref_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_callback_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_initialize_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_packed_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/typedef_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/union_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/variadic_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/spec.opts create mode 100644 vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/LICENSE create mode 100644 vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Rakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/.gitignore create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/.gitmodules create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Gemfile.lock create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/LICENSE-MIT create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Rakefile create mode 100755 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/bench/standalone.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/bench/thin.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.RUBYARCHDIR.time create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.gitignore create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/RubyHttpParserService.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ext_help.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/extconf.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ruby_http_parser.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/.gitkeep create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/AUTHORS create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/LICENSE-MIT create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/TODO create mode 100755 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/build.xml create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.gyp create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/Http-parser.java.iml create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/FieldData.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPCallback.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPDataCallback.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPErrorCallback.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPException.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPMethod.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParser.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParserUrl.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserSettings.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserType.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/Util.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPCallback.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPDataCallback.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPErrorCallback.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPParser.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/ParserSettings.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Message.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/ParseUrl.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Requests.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Responses.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Test.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestHeaderOverflowError.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestLoaderNG.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestNoOverflowLongBody.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/UnitTest.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Upgrade.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Url.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Util.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/WrongContentLength.java create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/test.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.dumped create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.utf8 create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/byte_constants.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/const_char.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/lowcase.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/parse_tests.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/AUTHORS create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/CONTRIBUTIONS create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/LICENSE-MIT create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.gyp create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/test.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/http_parser.rb.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/lib/http/parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/lib/http_parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/parser_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/spec_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/support/requests.json create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/support/responses.json create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/compile.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/fixtures.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/spec.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/submodules.rake create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/MIT-LICENSE create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-3.2.x create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.0.x create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.1.x create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.2.x create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-5.0.x create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-5.1.x create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-master create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/base.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/cache.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/cascade.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/chain.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/fallbacks.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/flatten.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/gettext.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/interpolation_compiler.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/key_value.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/memoize.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/metadata.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/pluralization.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/simple.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/transliterator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/config.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/hash.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/kernel/suppress_warnings.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/string/interpolate.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/exceptions.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext/helpers.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext/po_parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/interpolate/ruby.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/fallbacks.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/parents.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/rfc4646.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/simple.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/middleware.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/basics.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/defaults.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/interpolation.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/link.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/date.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/date_time.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/procs.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/time.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/lookup.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/pluralization.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/procs.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/all_features_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/cascade_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/chain_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/fallbacks_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/key_value_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/memoize_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/override_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/pluralization_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/simple_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/cache_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/cascade_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/chain_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/exceptions_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/fallbacks_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/interpolation_compiler_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/key_value_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/memoize_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/metadata_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/pluralization_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/simple_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/transliterator_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/core_ext/hash_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/gettext/api_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/gettext/backend_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/exceptions_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/gettext_plural_keys_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/interpolate_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/load_path_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/middleware_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/fallbacks_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/tag/rfc4646_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/tag/simple_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/run_all.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/de.po create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/en.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/en.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/invalid/empty.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/invalid/syntax.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/plurals.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/.rubocop.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/LICENSE create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/README.markdown create mode 100755 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/exe/jekyll create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/cleaner.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/collection.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/command.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/build.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/clean.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/doctor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/help.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/new.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/new_theme.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/live_reload_reactor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/livereload_assets/livereload.js create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/servlet.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/websockets.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/configuration.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/identity.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/kramdown_parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/rdiscount_parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/redcarpet_parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/smartypants.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/convertible.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/deprecator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/document.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/collection_drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/document_drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/excerpt_drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/jekyll_drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/site_drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/static_file_drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/unified_payload_drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/url_drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/entry_filter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/errors.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/excerpt.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/external.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters/grouping_filters.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters/url_filters.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/frontmatter_defaults.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/generator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/hooks.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/layout.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_extensions.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer/file.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer/table.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/log_adapter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/mime.types create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/page.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/page_without_a_file.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/plugin.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/plugin_manager.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/publisher.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/reader.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/collection_reader.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/data_reader.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/layout_reader.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/page_reader.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/post_reader.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/static_file_reader.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/theme_assets_reader.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/regenerator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/related_posts.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/renderer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/site.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/static_file.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/stevenson.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/highlight.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/include.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/link.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/post_url.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/theme.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/theme_builder.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/url.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/ansi.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/exec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/internet.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/platforms.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/rouge.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/thread_event.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/win_tz.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/.gitignore create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/404.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/_config.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/about.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/index.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/CODE_OF_CONDUCT.md.erb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/LICENSE.txt.erb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/README.md.erb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/default.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/page.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/post.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/_config.yml.erb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/_post.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/index.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/style.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/gitignore.erb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/theme.gemspec.erb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.gitignore create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rubocop.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.travis.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/History.markdown create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/LICENSE.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Rakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/jekyll-feed.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/feed.xml create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/generator.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/meta-tag.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/page-without-a-file.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/bootstrap create mode 100755 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/cibuild create mode 100755 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/release create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_config.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_data/authors.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_drafts/2015-01-12-a-draft.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_layouts/some_default.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2013-12-12-dec-the-second.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-02-march-the-second.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-04-march-the-fourth.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-02-12-strip-newlines.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-liquid.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-pre.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-18-author-detail.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2016-04-25-author-reference.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/feed.xslt.xml create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/jekyll-feed_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/spec_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll-sass-converter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll-sass-converter/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll/converters/sass.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll/converters/scss.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll-watch.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll-watch/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll/commands/watch.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll/watcher.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/AUTHORS create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/CONTRIBUTERS create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/COPYING create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/Rakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/VERSION create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/benchmark.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/benchmark.sh create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/generate_data.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/mdbasics.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/mdsyntax.text create mode 100755 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/testing.sh create mode 100755 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/timing.sh create mode 100755 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/bin/kramdown create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/data/kramdown/document.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/data/kramdown/document.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/_design.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/bg.png create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/default.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/default.template create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/documentation.page create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/documentation.template create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/index.page create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/installation.page create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/links.markdown create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/metainfo create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/news.feed create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/news.page create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/options.page create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/quickref.page create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/sidebar.template create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/sitemap.sitemap create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/syntax.page create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/tests.page create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/virtual create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/base.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/hash_ast.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/html.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/kramdown.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/latex.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/man.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/math_engine/itex2mml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/math_engine/mathjax.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/math_engine/mathjaxnode.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/math_engine/ritex.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/math_engine/sskatex.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/pdf.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/remove_html_tags.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/syntax_highlighter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/syntax_highlighter/coderay.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/syntax_highlighter/minted.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/syntax_highlighter/rouge.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/converter/toc.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/document.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/element.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/error.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/options.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/base.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/gfm.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/html.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/abbreviation.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/autolink.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/blank_line.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/block_boundary.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/blockquote.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/codeblock.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/codespan.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/emphasis.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/eob.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/escaped_chars.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/extensions.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/footnote.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/header.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/horizontal_rule.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/html.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/html_entity.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/line_break.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/link.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/list.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/math.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/paragraph.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/smart_quotes.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/table.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/kramdown/typographic_symbol.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/parser/markdown.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/utils.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/utils/configurable.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/utils/entities.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/utils/html.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/utils/lru_cache.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/utils/ordered_hash.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/utils/string_scanner.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/utils/unidecoder.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/lib/kramdown/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/man/man1/kramdown.1 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/setup.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/run_tests.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/test_files.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/test_location.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/test_string_scanner_kramdown.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/01_blank_line/spaces.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/01_blank_line/spaces.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/01_blank_line/tabs.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/01_blank_line/tabs.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/02_eob/beginning.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/02_eob/beginning.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/02_eob/end.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/02_eob/end.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/02_eob/middle.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/02_eob/middle.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/indented.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/indented.html.gfm create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/indented.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/line_break_last_line.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/line_break_last_line.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/no_newline_at_end.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/no_newline_at_end.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/one_para.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/one_para.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/two_para.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/two_para.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/with_html_to_native.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/with_html_to_native.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/03_paragraph/with_html_to_native.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/atx_header.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/atx_header.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/atx_header_no_newline_at_end.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/atx_header_no_newline_at_end.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/header_type_offset.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/header_type_offset.kramdown create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/header_type_offset.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/header_type_offset.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/header_type_offset.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/setext_header.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/setext_header.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/setext_header_no_newline_at_end.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/setext_header_no_newline_at_end.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/with_auto_id_prefix.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/with_auto_id_prefix.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/with_auto_id_prefix.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/with_auto_id_stripping.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/with_auto_id_stripping.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/with_auto_id_stripping.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/with_auto_ids.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/with_auto_ids.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/04_header/with_auto_ids.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/indented.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/indented.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/lazy.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/lazy.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/nested.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/nested.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/no_newline_at_end.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/no_newline_at_end.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/very_long_line.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/very_long_line.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/with_code_blocks.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/05_blockquote/with_code_blocks.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/disable-highlighting.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/disable-highlighting.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/disable-highlighting.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/error.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/error.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting-minted-with-opts.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting-minted-with-opts.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting-minted-with-opts.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting-minted.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting-minted.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting-minted.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting-opts.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting-opts.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting-opts.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/highlighting.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/issue_gh45.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/issue_gh45.test create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/lazy.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/lazy.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/no_newline_at_end.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/no_newline_at_end.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/no_newline_at_end_1.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/no_newline_at_end_1.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/normal.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/normal.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/rouge/disabled.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/rouge/disabled.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/rouge/disabled.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/rouge/multiple.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/rouge/multiple.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/rouge/multiple.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/rouge/simple.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/rouge/simple.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/rouge/simple.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/tilde_syntax.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/tilde_syntax.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/whitespace.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/whitespace.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_blank_line.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_blank_line.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_eob_marker.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_eob_marker.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_ial.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_ial.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_lang_in_fenced_block.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_lang_in_fenced_block.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_lang_in_fenced_block.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/07_horizontal_rule/error.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/07_horizontal_rule/error.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/07_horizontal_rule/error.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/07_horizontal_rule/normal.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/07_horizontal_rule/normal.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/07_horizontal_rule/sepspaces.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/07_horizontal_rule/sepspaces.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/07_horizontal_rule/septabs.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/07_horizontal_rule/septabs.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/brackets_in_item.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/brackets_in_item.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/escaping.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/escaping.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/item_ial.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/item_ial.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/lazy.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/lazy.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/lazy_and_nested.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/lazy_and_nested.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/list_and_hr.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/list_and_hr.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/list_and_others.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/list_and_others.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/mixed.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/mixed.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/nested.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/nested.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/other_first_element.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/other_first_element.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/simple_ol.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/simple_ol.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/simple_ul.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/simple_ul.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/single_item.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/single_item.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/special_cases.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/08_list/special_cases.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/comment.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/comment.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/content_model/deflists.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/content_model/deflists.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/content_model/deflists.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/content_model/tables.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/content_model/tables.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/content_model/tables.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html5_attributes.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html5_attributes.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_after_block.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_after_block.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_and_codeblocks.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_and_codeblocks.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_and_codeblocks.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_and_headers.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_and_headers.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/code.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/code.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/comment.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/comment.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/emphasis.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/emphasis.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/entity.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/entity.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/header.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/header.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/header.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/list_dl.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/list_dl.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/list_ol.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/list_ol.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/list_ul.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/list_ul.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/paragraph.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/paragraph.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/table_normal.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/table_normal.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/table_simple.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/table_simple.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/typography.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/typography.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/html_to_native/typography.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/invalid_html_1.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/invalid_html_1.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/invalid_html_2.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/invalid_html_2.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/markdown_attr.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/markdown_attr.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/not_parsed.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/not_parsed.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.htmlinput create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.htmlinput create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/processing_instruction.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/processing_instruction.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/textarea.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/textarea.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/xml.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/xml.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/10_ald/simple.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/10_ald/simple.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/nested.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/nested.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/simple.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/simple.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/comment.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/comment.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/ignored.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/ignored.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.kramdown create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options2.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options2.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options3.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options3.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/auto_ids.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/auto_ids.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/definition_at_beginning.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/definition_at_beginning.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/deflist_ial.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/deflist_ial.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/item_ial.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/item_ial.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/multiple_terms.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/multiple_terms.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/no_def_list.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/no_def_list.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/para_wrapping.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/para_wrapping.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/separated_by_eob.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/separated_by_eob.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/simple.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/simple.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/styled_terms.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/styled_terms.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/too_much_space.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/too_much_space.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/with_blocks.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/with_blocks.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/errors.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/errors.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/escaping.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/escaping.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/footer.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/footer.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/header.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/header.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/no_table.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/no_table.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/simple.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/simple.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/gh_128.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/gh_128.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/normal.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/normal.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/no_toc.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/no_toc.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/encoding.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/encoding.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/example.man create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/example.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-dash-description.man create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-dash-description.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-description.man create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-description.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section-description.man create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section-description.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section.man create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name.man create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/sections.man create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/sections.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/text-escaping.man create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/text-escaping.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty_title.htmlinput create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty_title.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/image_in_a.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/image_in_a.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/imagelinks.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/imagelinks.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/latex_escaping.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/latex_escaping.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs_with_ial.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs_with_ial.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/links_with_angle_brackets.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/links_with_angle_brackets.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/empty.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/empty.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/errors.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/errors.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/nesting.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/nesting.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/empty.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/empty.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/errors.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/errors.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/normal.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/normal.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/inside_footnote.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/inside_footnote.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/across_lines.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/across_lines.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/button.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/button.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/invalid.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/invalid.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/link_with_mailto.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/link_with_mailto.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/mark_element.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/mark_element.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/markdown_attr.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/markdown_attr.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/normal.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/normal.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/raw_span_elements.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/raw_span_elements.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/xml.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/xml.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev_defs.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev_defs.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/in_footnote.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/in_footnote.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/autolinks/url_links.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/autolinks/url_links.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/escaped_chars/normal.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/escaped_chars/normal.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/comment.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/comment.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/ignored.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/ignored.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/nomarkdown.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/nomarkdown.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/options.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/options.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/ial/simple.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/ial/simple.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/normal.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/normal.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/greaterthan.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/greaterthan.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/lowerthan.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/lowerthan.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.latex create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/atx_header.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/atx_header.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_syntax.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_syntax.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.options create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.html.19 create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/task_list.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/task_list.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/two_para_hard_line_breaks.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/two_para_hard_line_breaks.text create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/History.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/LICENSE create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/block.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/block_body.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/condition.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/context.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/document.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/errors.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/expression.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/extensions.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/file_system.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/forloop_drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/i18n.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/interrupts.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/lexer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/locales/en.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parse_context.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parser_switching.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/profiler.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/profiler/hooks.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/range_lookup.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/resource_limits.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/standardfilters.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/strainer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tablerowloop_drop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tag.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/assign.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/break.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/capture.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/case.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/comment.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/continue.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/cycle.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/decrement.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/for.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/if.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/ifchanged.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/include.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/increment.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/raw.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/table_row.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/unless.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/template.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tokenizer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/utils.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/variable.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/variable_lookup.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/fixtures/en_locale.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/assign_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/blank_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/capture_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/context_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/document_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/drop_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/error_handling_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/filter_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/hash_ordering_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/output_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/parsing_quirks_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/render_profiling_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/security_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/standard_filter_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/break_tag_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/continue_tag_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/for_tag_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/if_else_tag_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/include_tag_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/increment_tag_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/raw_tag_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/standard_tag_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/statements_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/table_row_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/unless_else_tag_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/template_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/trim_mode_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/variable_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/test_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/block_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/condition_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/context_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/file_system_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/i18n_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/lexer_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/parser_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/regexp_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/strainer_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tag_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/case_tag_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/for_tag_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/if_tag_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/template_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tokenizer_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/variable_unit_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CHANGELOG.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CONTRIBUTING.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/LICENSE.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/README.md create mode 100755 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/bin/listen create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/base.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/bsd.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/config.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/darwin.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/linux.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/polling.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/windows.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/backend.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/change.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/cli.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/directory.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/config.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/loop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/processor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/queue.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/file.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/fsm.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/internals/thread_pool.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener/config.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/logger.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/options.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/queue_optimizer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/entry.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/symlink_detector.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer/controller.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.gitignore create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.rspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.travis.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/History.markdown create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/LICENSE.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Rakefile create mode 100755 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/help_dialogue.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/logging.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/trace.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/option.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/program.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/mercenary.gemspec create mode 100755 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/bootstrap create mode 100755 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/cibuild create mode 100755 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/console create mode 100755 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/examples create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/command_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/option_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/presenter_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/program_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/spec_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/LICENSE.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/disqus_comments.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/footer.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/google-analytics.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/head.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/header.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-github.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-github.svg create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-twitter.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-twitter.svg create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/default.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/home.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/page.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/post.html create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_base.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_layout.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_syntax-highlighting.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/assets/main.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/LICENSE create mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Rakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/helpers.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.gitignore create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.rubocop.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.rubocop_defaults.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.ruby-gemset create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.travis.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.yardopts create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/2.0-Upgrade.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/CHANGELOG.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/LICENSE.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/Rakefile create mode 100755 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/bin/console create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/data/list.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/domain.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/errors.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/list.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/rule.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/public_suffix.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/.empty create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/acceptance_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_find.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_find_all.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_names.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_select.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_select_incremental.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_valid.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/domain_profiler.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/find_profiler.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/find_profiler_jp.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/initialization_profiler.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/list_profsize.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/object_binsize.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/psl_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/test_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/tests.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/domain_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/errors_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/list_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/public_suffix_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/rule_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/.gitignore create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/Guardfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/LICENSE.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/Rakefile create mode 100755 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/bin/fsevent_watch create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/LICENSE create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/common.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/defines.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/main.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.c create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.h create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/rakefile.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/otnetstring.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/fsevent.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/rb-fsevent.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.gitignore create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.travis.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.yardopts create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Rakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/errors.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/event.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native/flags.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/notifier.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/watcher.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/rb-inotify.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify/errors_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/spec_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/LICENSE create mode 100755 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/bin/rougify create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/cli.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/abap create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/actionscript create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/apache create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/apiblueprint create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/applescript create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/awk create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/biml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/bsl create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/c create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/ceylon create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cfscript create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/clojure create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cmake create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/coffeescript create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/common_lisp create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/conf create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/console create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/coq create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cpp create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/csharp create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/css create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/d create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/dart create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/diff create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/digdag create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/docker create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/dot create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/eiffel create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/elixir create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/elm create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/erb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/erlang create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/factor create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/fortran create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/fsharp create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/gherkin create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/glsl create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/go create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/gradle create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/graphql create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/groovy create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/hack create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/haml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/handlebars create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/haskell create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/html create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/http create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/hylang create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/idlang create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/igorpro create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/ini create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/io create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/irb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/irb_output create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/java create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/javascript create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/jinja create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/json create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/json-doc create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/jsonnet create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/jsx create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/julia create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/kotlin create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/lasso create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/liquid create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/literate_coffeescript create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/literate_haskell create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/llvm create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/lua create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/make create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/markdown create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/matlab create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/moonscript create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/mosel create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/mxml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/nasm create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/nginx create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/nim create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/nix create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/objective_c create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/ocaml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/pascal create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/perl create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/php create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/plaintext create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/plist create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/pony create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/powershell create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/praat create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/prolog create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/prometheus create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/properties create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/protobuf create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/puppet create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/python create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/q create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/qml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/r create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/racket create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/ruby create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/rust create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/scala create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/scheme create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/sed create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/shell create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/sieve create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/slim create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/smalltalk create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/smarty create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/sml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/sql create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/swift create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/tap create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/tcl create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/tex create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/toml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/tsx create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/tulip create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/turtle create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/twig create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/typescript create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/vala create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/vb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/verilog create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/vhdl create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/viml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/vue create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/wollok create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/xml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/yaml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/formatter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/formatters/html.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/formatters/html_inline.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/formatters/html_legacy.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/formatters/html_linewise.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/formatters/html_pygments.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/formatters/html_table.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/formatters/null.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/formatters/terminal256.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/guesser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/guessers/disambiguation.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/guessers/filename.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/guessers/glob_mapping.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/guessers/mimetype.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/guessers/modeline.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/guessers/source.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/guessers/util.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/abap.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/actionscript.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/apache.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/apache/keywords.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/apiblueprint.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/apple_script.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/awk.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/biml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/bsl.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/c.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/ceylon.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/cfscript.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/clojure.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/cmake.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/coffeescript.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/common_lisp.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/conf.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/console.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/coq.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/cpp.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/csharp.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/css.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/d.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/dart.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/diff.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/digdag.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/docker.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/dot.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/eiffel.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/elixir.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/elm.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/erb.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/erlang.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/factor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/fortran.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/fsharp.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/gherkin.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/gherkin/keywords.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/glsl.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/go.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/gradle.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/graphql.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/groovy.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/hack.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/haml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/handlebars.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/haskell.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/html.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/http.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/hylang.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/idlang.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/igorpro.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/ini.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/io.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/irb.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/java.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/javascript.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/jinja.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/json.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/json_doc.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/jsonnet.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/jsx.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/julia.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/kotlin.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/lasso.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/lasso/keywords.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/liquid.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/literate_coffeescript.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/literate_haskell.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/llvm.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/lua.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/lua/builtins.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/make.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/markdown.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/matlab.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/matlab/builtins.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/moonscript.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/mosel.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/mxml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/nasm.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/nginx.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/nim.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/nix.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/objective_c.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/ocaml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/pascal.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/perl.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/php.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/php/builtins.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/plain_text.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/plist.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/pony.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/powershell.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/praat.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/prolog.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/prometheus.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/properties.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/protobuf.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/puppet.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/python.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/q.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/qml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/r.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/racket.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/ruby.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/rust.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/sass.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/sass/common.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/scala.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/scheme.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/scss.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/sed.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/shell.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/sieve.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/slim.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/smalltalk.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/smarty.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/sml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/sql.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/swift.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/tap.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/tcl.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/tex.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/toml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/tsx.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/tulip.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/turtle.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/twig.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/typescript.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/typescript/common.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/vala.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/vb.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/verilog.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/vhdl.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/viml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/viml/keywords.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/vue.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/wollok.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/xml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/lexers/yaml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/plugins/redcarpet.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/regex_lexer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/template_lexer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/text_analyzer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/theme.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/themes/base16.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/themes/colorful.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/themes/github.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/themes/gruvbox.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/themes/igor_pro.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/themes/molokai.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/themes/monokai.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/themes/monokai_sublime.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/themes/pastie.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/themes/thankful_eyes.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/themes/tulip.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/token.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/util.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/rouge.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/.gitignore create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/.rspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/.rubocop.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/.travis.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/LICENSE.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/logger.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/quiet.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/ruby_version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/travis.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/travis/ruby_version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/warning.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/.gitignore create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/.travis.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/CHANGES.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/Gemfile create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/LICENSE.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/Rakefile create mode 100755 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/bin/safe_yaml create mode 100755 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/bundle_install_all_ruby_versions.sh create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/deep.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/libyaml_checker.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/load.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/date.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/hexadecimal.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/sexagesimal.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/psych_handler.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/psych_resolver.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/resolver.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/safe_to_ruby_visitor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_hack.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_node_monkeypatch.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_resolver.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_boolean.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_date.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_float.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_integer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_nil.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_symbol.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/transformation_map.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/version.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/run_specs_all_ruby_versions.sh create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/safe_yaml.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/exploit.1.9.2.yaml create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/exploit.1.9.3.yaml create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/issue48.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/issue49.yml create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/libyaml_checker_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/psych_resolver_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/resolver_specs.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/safe_yaml_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/spec_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/support/exploitable_back_door.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/syck_resolver_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/transform/base64_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/transform/to_date_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/transform/to_float_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/transform/to_integer_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/transform/to_symbol_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/yaml_spec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/.yardopts create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/CODE_OF_CONDUCT.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/CONTRIBUTING.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/MIT-LICENSE create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/REVISION create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/Rakefile create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/VERSION create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/VERSION_DATE create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/VERSION_NAME create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/bin/sass create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/bin/sass-convert create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/bin/scss create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/extra/sass-spec-ref.sh create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/extra/update_watch.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/init.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/cache_stores.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/cache_stores/base.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/cache_stores/chain.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/cache_stores/filesystem.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/cache_stores/memory.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/cache_stores/null.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/callbacks.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/css.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/deprecation.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/engine.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/environment.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/error.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/exec.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/exec/base.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/exec/sass_convert.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/exec/sass_scss.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/features.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/importers.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/importers/base.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/importers/deprecated_path.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/importers/filesystem.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/logger.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/logger/base.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/logger/delayed.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/logger/log_level.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/media.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/plugin.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/plugin/compiler.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/plugin/configuration.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/plugin/generic.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/plugin/merb.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/plugin/rack.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/plugin/rails.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/plugin/staleness_checker.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/railtie.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/repl.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/root.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/css_lexer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/css_parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/functions.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/lexer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree/funcall.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree/interpolation.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree/list_literal.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree/literal.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree/map_literal.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree/node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree/operation.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree/selector.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree/string_interpolation.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree/unary_operation.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/tree/variable.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/arg_list.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/base.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/bool.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/callable.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/color.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/function.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/helpers.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/list.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/map.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/null.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/number.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/script/value/string.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/scss.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/scss/css_parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/scss/parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/scss/rx.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/scss/static_parser.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/selector.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/selector/abstract_sequence.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/selector/comma_sequence.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/selector/pseudo.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/selector/sequence.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/selector/simple.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/selector/simple_sequence.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/shared.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/source/map.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/source/position.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/source/range.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/stack.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/supports.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/at_root_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/charset_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/comment_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/content_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/css_import_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/debug_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/directive_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/each_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/error_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/extend_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/for_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/function_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/if_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/import_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/keyframe_rule_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/media_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/mixin_def_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/mixin_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/prop_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/return_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/root_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/rule_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/supports_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/trace_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/variable_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/visitors/base.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/visitors/check_nesting.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/visitors/convert.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/visitors/cssize.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/visitors/deep_copy.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/visitors/extend.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/visitors/perform.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/visitors/set_options.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/visitors/to_css.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/warn_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/tree/while_node.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/util.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/util/multibyte_string_scanner.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/util/normalized_map.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/util/subset_map.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/util/test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/lib/sass/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/rails/init.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass-spec.yml create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/cache_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/callbacks_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/compiler_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/conversion_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/css2sass_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/css_variable_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/data/hsl-rgb.txt create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/encoding_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/engine_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/exec_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/extend_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/fixtures/test_staleness_check_across_importers.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/fixtures/test_staleness_check_across_importers.scss create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/functions_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/importer_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/logger_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/mock_importer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/more_results/more1.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/more_results/more1_with_line_comments.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/more_results/more_import.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/more_templates/_more_partial.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/more_templates/more1.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/more_templates/more_import.sass create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/plugin_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/alt.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/basic.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/cached_import_option.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/compact.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/complex.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/compressed.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/expanded.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/filename_fn.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/if.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/import.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/import_charset.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/import_charset_ibm866.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/import_content.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/line_numbers.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/mixins.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/multiline.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/nested.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/options.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/parent_ref.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/script.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/scss_import.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/scss_importee.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/subdir/nested_subdir/nested_subdir.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/subdir/subdir.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/units.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/warn.css create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/results/warn_imported.css create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/script_conversion_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/script_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/scss/css_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/scss/rx_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/scss/scss_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/scss/test_helper.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/source_map_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/superselector_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/_cached_import_option_partial.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/_double_import_loop2.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/_filename_fn_import.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/_imported_charset_ibm866.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/_imported_charset_utf8.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/_imported_content.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/_partial.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/_same_name_different_partiality.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/alt.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/basic.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/bork1.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/bork2.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/bork3.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/bork4.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/bork5.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/cached_import_option.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/compact.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/complex.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/compressed.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/double_import_loop1.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/expanded.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/filename_fn.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/if.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/import.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/import_charset.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/import_charset_ibm866.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/import_content.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/importee.less create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/importee.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/line_numbers.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/mixin_bork.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/mixins.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/multiline.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/nested.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/nested_bork1.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/nested_bork2.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/nested_bork3.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/nested_bork4.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/nested_import.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/nested_mixin_bork.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/options.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/parent_ref.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/same_name_different_ext.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/same_name_different_ext.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/same_name_different_partiality.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/script.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/scss_import.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/scss_importee.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/single_import_loop.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/subdir/import_up1.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/subdir/import_up2.scss create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/subdir/nested_subdir/_nested_partial.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/subdir/nested_subdir/nested_subdir.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/subdir/subdir.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/units.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/warn.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/templates/warn_imported.sass create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/test_helper.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/util/multibyte_string_scanner_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/util/normalized_map_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/util/subset_map_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/util_test.rb create mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/sass/value_helpers_test.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.5.5/test/test_helper.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/CHANGELOG.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/CONTRIBUTING.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/LICENSE.txt create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/README.md create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/base.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/bsd.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/config.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/darwin.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/linux.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/polling.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/windows.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/backend.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/change.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/cli.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/directory.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/event/config.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/event/loop.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/event/processor.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/event/queue.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/file.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/fsm.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/internals/thread_pool.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/listener.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/listener/config.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/logger.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/options.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/queue_optimizer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/record.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/record/entry.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/record/symlink_detector.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer/controller.rb create mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/version.rb create mode 100644 vendor/bundle/ruby/2.3.0/specifications/addressable-2.5.2.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/colorator-1.1.0.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/concurrent-ruby-1.0.5.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/em-websocket-0.5.1.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/eventmachine-1.2.5.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/ffi-1.9.18.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/forwardable-extended-2.6.0.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/http_parser.rb-0.6.0.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/i18n-0.9.1.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/jekyll-3.7.0.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/jekyll-feed-0.9.2.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/jekyll-sass-converter-1.5.1.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/jekyll-watch-2.0.0.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/kramdown-1.16.2.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/liquid-4.0.0.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/listen-3.1.5.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/mercenary-0.3.6.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/minima-2.1.1.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/pathutil-0.16.1.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/public_suffix-3.0.1.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/rb-fsevent-0.10.2.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/rb-inotify-0.9.10.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/rouge-3.1.0.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/ruby_dep-1.5.0.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/safe_yaml-1.0.4.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/sass-3.5.5.gemspec create mode 100644 vendor/bundle/ruby/2.3.0/specifications/sass-listen-4.0.0.gemspec diff --git a/.bundle/config b/.bundle/config new file mode 100644 index 0000000..2369228 --- /dev/null +++ b/.bundle/config @@ -0,0 +1,2 @@ +--- +BUNDLE_PATH: "vendor/bundle" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9af2c35 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.sass-cache +.jekyll-metadata diff --git a/404.html b/404.html new file mode 100644 index 0000000..c472b4e --- /dev/null +++ b/404.html @@ -0,0 +1,24 @@ +--- +layout: default +--- + + + +
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..85339b4 --- /dev/null +++ b/Gemfile @@ -0,0 +1,27 @@ +source "https://rubygems.org" + +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +gem "jekyll", "~> 3.7.0" + +# This is the default theme for new Jekyll sites. You may change this to anything you like. +gem "minima", "~> 2.0" + +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +# gem "github-pages", group: :jekyll_plugins + +# If you have any plugins, put them here! +group :jekyll_plugins do + gem "jekyll-feed", "~> 0.6" +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] + diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..4ed963d --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,70 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + colorator (1.1.0) + concurrent-ruby (1.0.5) + em-websocket (0.5.1) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + eventmachine (1.2.5) + ffi (1.9.18) + forwardable-extended (2.6.0) + http_parser.rb (0.6.0) + i18n (0.9.1) + concurrent-ruby (~> 1.0) + jekyll (3.7.0) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (~> 1.14) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-feed (0.9.2) + jekyll (~> 3.3) + jekyll-sass-converter (1.5.1) + sass (~> 3.4) + jekyll-watch (2.0.0) + listen (~> 3.0) + kramdown (1.16.2) + liquid (4.0.0) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + mercenary (0.3.6) + minima (2.1.1) + jekyll (~> 3.3) + pathutil (0.16.1) + forwardable-extended (~> 2.6) + public_suffix (3.0.1) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + rouge (3.1.0) + ruby_dep (1.5.0) + safe_yaml (1.0.4) + sass (3.5.5) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + +PLATFORMS + ruby + +DEPENDENCIES + jekyll (~> 3.7.0) + jekyll-feed (~> 0.6) + minima (~> 2.0) + tzinfo-data + +BUNDLED WITH + 1.16.1 diff --git a/INSTRUCTIONS.txt b/INSTRUCTIONS.txt new file mode 100644 index 0000000..20e826c --- /dev/null +++ b/INSTRUCTIONS.txt @@ -0,0 +1,17 @@ +This site uses https://jekyllrb.com. +Doco: https://jekyllrb.com/docs + +----------- + +change files here and run a local server to see live updates: + +jekyll serve --livereload + +----------- + +To Deploy, + +cd _src +jekyll build +add, commit and push to master branch + diff --git a/_src/README.md b/README.md similarity index 100% rename from _src/README.md rename to README.md diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..1a3c068 --- /dev/null +++ b/_config.yml @@ -0,0 +1,46 @@ +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole blog, values +# which you are expected to set up once and rarely edit after that. If you find +# yourself editing this file very often, consider using Jekyll's data files +# feature for the data you need to update frequently. +# +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'bundle exec jekyll serve'. If you change this file, please restart the server process. + +# Site settings +# These are used to personalize your new site. If you look in the HTML files, +# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. +# You can create any custom variable you would like, and they will be accessible +# in the templates via {{ site.myvariable }}. +title: Allow2 +email: ceo@Allow2.com +description: >- # this means to ignore newlines until "baseurl:" + Next Generation Parental Controls as a Platform +baseurl: "" # the subpath of your site, e.g. /blog +url: "" # the base hostname & protocol for your site, e.g. http://example.com +twitter_username: allow_2 +github_username: allow2 + +# Build settings +markdown: kramdown +theme: minima +# theme: jekyll-theme-cayman +plugins: + - jekyll-feed + +# Exclude from processing. +# The following items will not be processed, by default. Create a custom list +# to override the default setting. +# exclude: +# - Gemfile +# - Gemfile.lock +# - node_modules +# - vendor/bundle/ +# - vendor/cache/ +# - vendor/gems/ +# - vendor/ruby/ + +#source: . +#destination: .. + diff --git a/_posts/2018-01-08-welcome-to-jekyll.markdown b/_posts/2018-01-08-welcome-to-jekyll.markdown new file mode 100644 index 0000000..ece7899 --- /dev/null +++ b/_posts/2018-01-08-welcome-to-jekyll.markdown @@ -0,0 +1,25 @@ +--- +layout: post +title: "Welcome to Jekyll!" +date: 2018-01-08 10:39:05 +1000 +categories: jekyll update +--- +You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. + +To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works. + +Jekyll also offers powerful support for code snippets: + +{% highlight ruby %} +def print_hi(name) + puts "Hi, #{name}" +end +print_hi('Tom') +#=> prints 'Hi, Tom' to STDOUT. +{% endhighlight %} + +Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk]. + +[jekyll-docs]: https://jekyllrb.com/docs/home +[jekyll-gh]: https://github.com/jekyll/jekyll +[jekyll-talk]: https://talk.jekyllrb.com/ diff --git a/_site/404.html b/_site/404.html new file mode 100644 index 0000000..4029c2d --- /dev/null +++ b/_site/404.html @@ -0,0 +1,146 @@ + + + + + + + + + Allow2 + + + + + + + + + + + + + + + +
+
+ + +
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
+ +
+
+ +
+ +
+ + + + + +
+ +
+ + + + + diff --git a/_site/INSTRUCTIONS.txt b/_site/INSTRUCTIONS.txt new file mode 100644 index 0000000..20e826c --- /dev/null +++ b/_site/INSTRUCTIONS.txt @@ -0,0 +1,17 @@ +This site uses https://jekyllrb.com. +Doco: https://jekyllrb.com/docs + +----------- + +change files here and run a local server to see live updates: + +jekyll serve --livereload + +----------- + +To Deploy, + +cd _src +jekyll build +add, commit and push to master branch + diff --git a/_site/README.md b/_site/README.md new file mode 100644 index 0000000..6611c9b --- /dev/null +++ b/_site/README.md @@ -0,0 +1,31 @@ +# Allow2.github.io + +The Allow2 platform provides free to use developer SDKs for both "devices" and "services" + +* Devices - Any "User owned" apps and devices, games, gaming consoles, TVs, PVRs, etc, designed to be paired with 1 owner account per instance +* Services - Any multi-user API connected instances. Facebook, web sites, twitter, group services, shared devices in public places, etc. +* Request Interface - Users on each device/service can create and submit access or change requests to the parent using this interface directly in the device/service. + +## Current production-ready SDKs: + +These SDKs can be embedded in production apps: + +* https://github.com/Allow2/Allow2iOS - Device SDK +* https://github.com/Allow2/Allow2iOSRequest - Embeddable Request Interface + +## Alpha/Beta stage: + +These SDKs are still in development: + +* https://github.com/Allow2/Allow2node - Device SDK +* https://github.com/Allow2/Allow2python - Device SDK + +## Need to port/develop + +These SDKs are yet to be ported, please feel free to get started: + +* https://github.com/Allow2/Allow2csharp - Device SDK +* https://github.com/Allow2/Allow2java - Device SDK +* https://github.com/Allow2/Allow2php - Service SDK + +If you need another language, please let us know, or feel free to get started and contribute your port. diff --git a/_site/about/index.html b/_site/about/index.html new file mode 100644 index 0000000..28eb614 --- /dev/null +++ b/_site/about/index.html @@ -0,0 +1,147 @@ + + + + + + + + + About + + + + + + + + + + + + + + + +
+
+
+ +
+

About

+
+ +
+

This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at jekyllrb.com

+ +

You can find the source code for Minima at GitHub: +jekyll / +minima

+ +

You can find the source code for Jekyll at GitHub: +jekyll / +jekyll

+ + +
+ +
+ +
+
+ +
+ +
+ + + + + +
+ +
+ + + + + diff --git a/_site/assets/main.css b/_site/assets/main.css new file mode 100644 index 0000000..d341fb6 --- /dev/null +++ b/_site/assets/main.css @@ -0,0 +1,470 @@ +/** + * Reset some basic elements + */ +body, h1, h2, h3, h4, h5, h6, +p, blockquote, pre, hr, +dl, dd, ol, ul, figure { + margin: 0; + padding: 0; } + +/** + * Basic styling + */ +body { + font: 400 16px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #111; + background-color: #fdfdfd; + -webkit-text-size-adjust: 100%; + -webkit-font-feature-settings: "kern" 1; + -moz-font-feature-settings: "kern" 1; + -o-font-feature-settings: "kern" 1; + font-feature-settings: "kern" 1; + font-kerning: normal; } + +/** + * Set `margin-bottom` to maintain vertical rhythm + */ +h1, h2, h3, h4, h5, h6, +p, blockquote, pre, +ul, ol, dl, figure, +.highlight { + margin-bottom: 15px; } + +/** + * Images + */ +img { + max-width: 100%; + vertical-align: middle; } + +/** + * Figures + */ +figure > img { + display: block; } + +figcaption { + font-size: 14px; } + +/** + * Lists + */ +ul, ol { + margin-left: 30px; } + +li > ul, +li > ol { + margin-bottom: 0; } + +/** + * Headings + */ +h1, h2, h3, h4, h5, h6 { + font-weight: 400; } + +/** + * Links + */ +a { + color: #2a7ae2; + text-decoration: none; } + a:visited { + color: #1756a9; } + a:hover { + color: #111; + text-decoration: underline; } + .social-media-list a:hover { + text-decoration: none; } + .social-media-list a:hover .username { + text-decoration: underline; } + +/** + * Blockquotes + */ +blockquote { + color: #828282; + border-left: 4px solid #e8e8e8; + padding-left: 15px; + font-size: 18px; + letter-spacing: -1px; + font-style: italic; } + blockquote > :last-child { + margin-bottom: 0; } + +/** + * Code formatting + */ +pre, +code { + font-size: 15px; + border: 1px solid #e8e8e8; + border-radius: 3px; + background-color: #eef; } + +code { + padding: 1px 5px; } + +pre { + padding: 8px 12px; + overflow-x: auto; } + pre > code { + border: 0; + padding-right: 0; + padding-left: 0; } + +/** + * Wrapper + */ +.wrapper { + max-width: -webkit-calc(800px - (30px * 2)); + max-width: calc(800px - (30px * 2)); + margin-right: auto; + margin-left: auto; + padding-right: 30px; + padding-left: 30px; } + @media screen and (max-width: 800px) { + .wrapper { + max-width: -webkit-calc(800px - (30px)); + max-width: calc(800px - (30px)); + padding-right: 15px; + padding-left: 15px; } } + +/** + * Clearfix + */ +.wrapper:after, .footer-col-wrapper:after { + content: ""; + display: table; + clear: both; } + +/** + * Icons + */ +.icon > svg { + display: inline-block; + vertical-align: middle; } + .icon > svg path { + fill: #828282; } + +.social-media-list .icon { + padding-right: 5px; } +.social-media-list li + li { + padding-top: 5px; } + +/** + * Site header + */ +.site-header { + border-top: 5px solid #424242; + border-bottom: 1px solid #e8e8e8; + min-height: 55.95px; + position: relative; } + +.site-title { + font-size: 26px; + font-weight: 300; + line-height: 54px; + letter-spacing: -1px; + margin-bottom: 0; + float: left; } + .site-title, .site-title:visited { + color: #424242; } + +.site-nav { + float: right; + line-height: 54px; } + .site-nav .nav-trigger { + display: none; } + .site-nav .menu-icon { + display: none; } + .site-nav .page-link { + color: #111; + line-height: 1.5; } + .site-nav .page-link:not(:last-child) { + margin-right: 20px; } + @media screen and (max-width: 600px) { + .site-nav { + position: absolute; + top: 9px; + right: 15px; + background-color: #fdfdfd; + border: 1px solid #e8e8e8; + border-radius: 5px; + text-align: right; } + .site-nav label[for="nav-trigger"] { + display: block; + float: right; + width: 36px; + height: 36px; + z-index: 2; + cursor: pointer; } + .site-nav .menu-icon { + display: block; + float: right; + width: 36px; + height: 26px; + line-height: 0; + padding-top: 10px; + text-align: center; } + .site-nav .menu-icon > svg path { + fill: #424242; } + .site-nav input ~ .trigger { + clear: both; + display: none; } + .site-nav input:checked ~ .trigger { + display: block; + padding-bottom: 5px; } + .site-nav .page-link { + display: block; + padding: 5px 10px; + margin-left: 20px; } + .site-nav .page-link:not(:last-child) { + margin-right: 0; } } + +/** + * Site footer + */ +.site-footer { + border-top: 1px solid #e8e8e8; + padding: 30px 0; } + +.footer-heading { + font-size: 18px; + margin-bottom: 15px; } + +.contact-list, +.social-media-list { + list-style: none; + margin-left: 0; } + +.footer-col-wrapper { + font-size: 15px; + color: #828282; + margin-left: -15px; } + +.footer-col { + float: left; + margin-bottom: 15px; + padding-left: 15px; } + +.footer-col-1 { + width: -webkit-calc(35% - (30px / 2)); + width: calc(35% - (30px / 2)); } + +.footer-col-2 { + width: -webkit-calc(20% - (30px / 2)); + width: calc(20% - (30px / 2)); } + +.footer-col-3 { + width: -webkit-calc(45% - (30px / 2)); + width: calc(45% - (30px / 2)); } + +@media screen and (max-width: 800px) { + .footer-col-1, + .footer-col-2 { + width: -webkit-calc(50% - (30px / 2)); + width: calc(50% - (30px / 2)); } + + .footer-col-3 { + width: -webkit-calc(100% - (30px / 2)); + width: calc(100% - (30px / 2)); } } +@media screen and (max-width: 600px) { + .footer-col { + float: none; + width: -webkit-calc(100% - (30px / 2)); + width: calc(100% - (30px / 2)); } } +/** + * Page content + */ +.page-content { + padding: 30px 0; } + +.page-heading { + font-size: 20px; } + +.post-list { + margin-left: 0; + list-style: none; } + .post-list > li { + margin-bottom: 30px; } + +.post-meta { + font-size: 14px; + color: #828282; } + +.post-link { + display: block; + font-size: 24px; } + +/** + * Posts + */ +.post-header { + margin-bottom: 30px; } + +.post-title { + font-size: 42px; + letter-spacing: -1px; + line-height: 1; } + @media screen and (max-width: 800px) { + .post-title { + font-size: 36px; } } + +.post-content { + margin-bottom: 30px; } + .post-content h2 { + font-size: 32px; } + @media screen and (max-width: 800px) { + .post-content h2 { + font-size: 28px; } } + .post-content h3 { + font-size: 26px; } + @media screen and (max-width: 800px) { + .post-content h3 { + font-size: 22px; } } + .post-content h4 { + font-size: 20px; } + @media screen and (max-width: 800px) { + .post-content h4 { + font-size: 18px; } } + +/** + * Syntax highlighting styles + */ +.highlight { + background: #fff; } + .highlighter-rouge .highlight { + background: #eef; } + .highlight .c { + color: #998; + font-style: italic; } + .highlight .err { + color: #a61717; + background-color: #e3d2d2; } + .highlight .k { + font-weight: bold; } + .highlight .o { + font-weight: bold; } + .highlight .cm { + color: #998; + font-style: italic; } + .highlight .cp { + color: #999; + font-weight: bold; } + .highlight .c1 { + color: #998; + font-style: italic; } + .highlight .cs { + color: #999; + font-weight: bold; + font-style: italic; } + .highlight .gd { + color: #000; + background-color: #fdd; } + .highlight .gd .x { + color: #000; + background-color: #faa; } + .highlight .ge { + font-style: italic; } + .highlight .gr { + color: #a00; } + .highlight .gh { + color: #999; } + .highlight .gi { + color: #000; + background-color: #dfd; } + .highlight .gi .x { + color: #000; + background-color: #afa; } + .highlight .go { + color: #888; } + .highlight .gp { + color: #555; } + .highlight .gs { + font-weight: bold; } + .highlight .gu { + color: #aaa; } + .highlight .gt { + color: #a00; } + .highlight .kc { + font-weight: bold; } + .highlight .kd { + font-weight: bold; } + .highlight .kp { + font-weight: bold; } + .highlight .kr { + font-weight: bold; } + .highlight .kt { + color: #458; + font-weight: bold; } + .highlight .m { + color: #099; } + .highlight .s { + color: #d14; } + .highlight .na { + color: #008080; } + .highlight .nb { + color: #0086B3; } + .highlight .nc { + color: #458; + font-weight: bold; } + .highlight .no { + color: #008080; } + .highlight .ni { + color: #800080; } + .highlight .ne { + color: #900; + font-weight: bold; } + .highlight .nf { + color: #900; + font-weight: bold; } + .highlight .nn { + color: #555; } + .highlight .nt { + color: #000080; } + .highlight .nv { + color: #008080; } + .highlight .ow { + font-weight: bold; } + .highlight .w { + color: #bbb; } + .highlight .mf { + color: #099; } + .highlight .mh { + color: #099; } + .highlight .mi { + color: #099; } + .highlight .mo { + color: #099; } + .highlight .sb { + color: #d14; } + .highlight .sc { + color: #d14; } + .highlight .sd { + color: #d14; } + .highlight .s2 { + color: #d14; } + .highlight .se { + color: #d14; } + .highlight .sh { + color: #d14; } + .highlight .si { + color: #d14; } + .highlight .sx { + color: #d14; } + .highlight .sr { + color: #009926; } + .highlight .s1 { + color: #d14; } + .highlight .ss { + color: #990073; } + .highlight .bp { + color: #999; } + .highlight .vc { + color: #008080; } + .highlight .vg { + color: #008080; } + .highlight .vi { + color: #008080; } + .highlight .il { + color: #099; } diff --git a/_site/feed.xml b/_site/feed.xml new file mode 100644 index 0000000..ecf8e00 --- /dev/null +++ b/_site/feed.xml @@ -0,0 +1,13 @@ +Jekyll2018-01-08T10:59:31+10:00http://localhost:4000/Allow2Next Generation Parental Controls as a PlatformWelcome to Jekyll!2018-01-08T10:39:05+10:002018-01-08T10:39:05+10:00http://localhost:4000/jekyll/update/2018/01/08/welcome-to-jekyll<p>You’ll find this post in your <code class="highlighter-rouge">_posts</code> directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run <code class="highlighter-rouge">jekyll serve</code>, which launches a web server and auto-regenerates your site when a file is updated.</p> + +<p>To add new posts, simply add a file in the <code class="highlighter-rouge">_posts</code> directory that follows the convention <code class="highlighter-rouge">YYYY-MM-DD-name-of-post.ext</code> and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.</p> + +<p>Jekyll also offers powerful support for code snippets:</p> + +<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">print_hi</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span> + <span class="nb">puts</span> <span class="s2">"Hi, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">"</span> +<span class="k">end</span> +<span class="n">print_hi</span><span class="p">(</span><span class="s1">'Tom'</span><span class="p">)</span> +<span class="c1">#=&gt; prints 'Hi, Tom' to STDOUT.</span></code></pre></figure> + +<p>Check out the <a href="https://jekyllrb.com/docs/home">Jekyll docs</a> for more info on how to get the most out of Jekyll. File all bugs/feature requests at <a href="https://github.com/jekyll/jekyll">Jekyll’s GitHub repo</a>. If you have questions, you can ask them on <a href="https://talk.jekyllrb.com/">Jekyll Talk</a>.</p>You’ll find this post in your _posts directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run jekyll serve, which launches a web server and auto-regenerates your site when a file is updated. \ No newline at end of file diff --git a/_site/index.html b/_site/index.html new file mode 100644 index 0000000..5d93953 --- /dev/null +++ b/_site/index.html @@ -0,0 +1,149 @@ + + + + + + + + + Allow2 + + + + + + + + + + + + + + + +
+
+
+ +

Posts

+ + + + + + +

subscribe via RSS

+ +
+ +
+
+ +
+ +
+ + + + + +
+ +
+ + + + + diff --git a/_site/jekyll/update/2018/01/08/welcome-to-jekyll.html b/_site/jekyll/update/2018/01/08/welcome-to-jekyll.html new file mode 100644 index 0000000..e4fe2b6 --- /dev/null +++ b/_site/jekyll/update/2018/01/08/welcome-to-jekyll.html @@ -0,0 +1,158 @@ + + + + + + + + + Welcome to Jekyll! + + + + + + + + + + + + + + + +
+
+
+ +
+

Welcome to Jekyll!

+ +
+ +
+

You’ll find this post in your _posts directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run jekyll serve, which launches a web server and auto-regenerates your site when a file is updated.

+ +

To add new posts, simply add a file in the _posts directory that follows the convention YYYY-MM-DD-name-of-post.ext and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.

+ +

Jekyll also offers powerful support for code snippets:

+ +
def print_hi(name)
+  puts "Hi, #{name}"
+end
+print_hi('Tom')
+#=> prints 'Hi, Tom' to STDOUT.
+ +

Check out the Jekyll docs for more info on how to get the most out of Jekyll. File all bugs/feature requests at Jekyll’s GitHub repo. If you have questions, you can ask them on Jekyll Talk.

+ + +
+ + +
+ +
+
+ +
+ +
+ + + + + +
+ +
+ + + + + diff --git a/_src/_config.yml b/_src/_config.yml deleted file mode 100644 index 98172bb..0000000 --- a/_src/_config.yml +++ /dev/null @@ -1,5 +0,0 @@ -source: . -destination: .. -keep_files: ../_src ../.git - -theme: jekyll-theme-cayman diff --git a/about.md b/about.md new file mode 100644 index 0000000..8b4e0b2 --- /dev/null +++ b/about.md @@ -0,0 +1,18 @@ +--- +layout: page +title: About +permalink: /about/ +--- + +This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](https://jekyllrb.com/) + +You can find the source code for Minima at GitHub: +[jekyll][jekyll-organization] / +[minima](https://github.com/jekyll/minima) + +You can find the source code for Jekyll at GitHub: +[jekyll][jekyll-organization] / +[jekyll](https://github.com/jekyll/jekyll) + + +[jekyll-organization]: https://github.com/jekyll diff --git a/index.md b/index.md new file mode 100644 index 0000000..1eb5d67 --- /dev/null +++ b/index.md @@ -0,0 +1,6 @@ +--- +# You don't need to edit this file, it's empty on purpose. +# Edit theme's home layout instead if you wanna make some changes +# See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults +layout: home +--- diff --git a/vendor/bundle/ruby/2.3.0/bin/jekyll b/vendor/bundle/ruby/2.3.0/bin/jekyll new file mode 100755 index 0000000..80c4bef --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/bin/jekyll @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'jekyll' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +load Gem.bin_path('jekyll', 'jekyll', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/kramdown b/vendor/bundle/ruby/2.3.0/bin/kramdown new file mode 100755 index 0000000..3fc2e03 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/bin/kramdown @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'kramdown' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +load Gem.bin_path('kramdown', 'kramdown', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/listen b/vendor/bundle/ruby/2.3.0/bin/listen new file mode 100755 index 0000000..17b391b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/bin/listen @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'listen' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +load Gem.bin_path('listen', 'listen', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/rougify b/vendor/bundle/ruby/2.3.0/bin/rougify new file mode 100755 index 0000000..93c899f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/bin/rougify @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'rouge' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +load Gem.bin_path('rouge', 'rougify', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/safe_yaml b/vendor/bundle/ruby/2.3.0/bin/safe_yaml new file mode 100755 index 0000000..aa92b59 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/bin/safe_yaml @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'safe_yaml' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +load Gem.bin_path('safe_yaml', 'safe_yaml', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/sass b/vendor/bundle/ruby/2.3.0/bin/sass new file mode 100755 index 0000000..2fdd68c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/bin/sass @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'sass' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +load Gem.bin_path('sass', 'sass', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/sass-convert b/vendor/bundle/ruby/2.3.0/bin/sass-convert new file mode 100755 index 0000000..0ae7e59 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/bin/sass-convert @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'sass' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +load Gem.bin_path('sass', 'sass-convert', version) diff --git a/vendor/bundle/ruby/2.3.0/bin/scss b/vendor/bundle/ruby/2.3.0/bin/scss new file mode 100755 index 0000000..02d7dbe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/bin/scss @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'sass' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +load Gem.bin_path('sass', 'scss', version) diff --git a/vendor/bundle/ruby/2.3.0/cache/addressable-2.5.2.gem b/vendor/bundle/ruby/2.3.0/cache/addressable-2.5.2.gem new file mode 100644 index 0000000000000000000000000000000000000000..3e53ea0e40340e58428b322d4535e8d50eb1733d GIT binary patch literal 103936 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 E03;L6D*ylh literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/colorator-1.1.0.gem b/vendor/bundle/ruby/2.3.0/cache/colorator-1.1.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..d5616ad5725f946628b99e1df91f84c2c52f1730 GIT binary patch literal 7168 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/concurrent-ruby-1.0.5.gem b/vendor/bundle/ruby/2.3.0/cache/concurrent-ruby-1.0.5.gem new file mode 100644 index 0000000000000000000000000000000000000000..4119d3aafc2c553615ccc9fcba29a1c87d65c0a1 GIT binary patch literal 132608 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%0A1`uXFJD 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%0Ag9;Mt&)uGlHs)ogW;^!vN}N& zYf7A`jt)4K&K-yO%O7XK!uE*=1W%903rSUqJKN2~@%vT#L&mT5b^G6h%iJJ;@rel& zcoBx}0J_lzrNZcE)+FiV>q`4n+mAMe&Wa!#L{W7H9Fhr8B0yf?N(V>LwS{!V4mEp3 zs%8&_9ABn)n>b#7Yn8}~OlAb%;!EPCf}QpJ1(!gXEQX06&u0(zxi3jM*@bw?t^l`- zeDP}xRDhoF=Vd%G2ny>?#EEc7QHK}oAo{7%F%=$U#T-33dSN>Y3yNEJ#} zZCPh#EM#IBOI=U=QF+2s#z&pIZI}PiCkayz!bPnR2>%f>HY2v2{#Jv`r5@C%PUa{O zP25xb;C>@)b`T(=%n$nYD}2k;F=eBvI%GwR0&pMuJ;E3$AO)BfO%PDCL>_feK`610S`ysI zh`9mA^Q$X8U`9i;L#g8nd=+acr`_&^t!wum$i?W#vG-SPghRj&u;S$_Th(rW+YgOs zT6_5~O~0(}ncm}nsNehgfbq}5n=~><&f;>cp zRWoqJCnt`})-U}&*~0Cxu)wJl6j830miQ6$6ZXZU&2sXxz$|kp#wHw(d7{YDwdbdF zD&}j7<+ivOH*$Of;kPC-2n}?_NsEF1TR*1%N$!6t@IMv!p9=gx HufYETr*$nA literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/em-websocket-0.5.1.gem b/vendor/bundle/ruby/2.3.0/cache/em-websocket-0.5.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..e5975825b2203387fdf779f66302b620333bd2ff GIT binary patch literal 31744 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 bn{i?x=>G)R|6Sw12>cg;|03}J5CZ=T&|v8u literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/eventmachine-1.2.5.gem b/vendor/bundle/ruby/2.3.0/cache/eventmachine-1.2.5.gem new file mode 100644 index 0000000000000000000000000000000000000000..26c18a8e0e535e6c67605502c50c4e63e6ed57ee GIT binary patch literal 246272 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 K%E15W4E#6qkpvn5 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/ffi-1.9.18.gem b/vendor/bundle/ruby/2.3.0/cache/ffi-1.9.18.gem new file mode 100644 index 0000000000000000000000000000000000000000..06613e5f6c8d97a24d8c22f7db54e60ee8de4270 GIT binary patch literal 885760 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ℑ6TN+%C+6{1)%?kFJaOvG@;6 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

yYmy$^yWPsWq1RCwe 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 z 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

DULlph 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

~$WMzu5m zzD2}B4h3~eYW%tX0W|n=8k6|}>h`!B25p?qsPO0rLmzS-?(`r$ z#jvH>El(#NqA>t$L}+j>&Y{nfp}g^EVd1TlnL$(+rn<42xr4($g0N`ITcW17QGepe zXQSXl$Pd@+k2n7Q*mJCZ{S^0vwi_Tnt0(6!*$(-g_etMR&chy_aHhV-!H`xVjBkTG zGM~JZspcVW<`{{hMz?fbg{6TLugf=g?PPqKq)nJ*t>w4wNu||#*Qz#Jt=4+u%)_#e zaU!Gfz-jzJhO&Y!CiWBM&t^OYrwF1B-oA3Fg(XZDfc3&8VLDcTN8O>UASUU6jX?+po-*Y`L6I< zo`)Z@X!==Rs{bJlyNCh>awtkc*q!y`(^H0_p;ZdumA%z%|VPXtNqG2z*DyVsjq@hNMs|9DC#iY zQ(GnB(Ot%+;UnK0;-c>1soOvP(LQ*MrMK~Htg`MHKXDIrtt&T4(UUq0y`f=890CL# zt5e9*9olsDDrDbfS^QlF=W$NW_T?jGlOn^Ef+nPJC2t*yc{+kIqZ3Lp z(U<|GF$aZG>^(m{Zy)dOEOxe>{lhI4sh7>9;m`ipIGy#c!Q>@gQ{I9}{LQdoG74w3 zCHjuFkNVkf2^XQQhD5dxbGu0XM6Ab8O?j_D?(`raTcVN8{LB>eS(0)Om>|j*{T3kVJAnR-oY~?iz zlDmss&1yBNebYrV?K@T=C*#0a)3lk(Imt=SKs4!$@FZ=n*;9FKedFe^Y#5?T-Lz`v}mUFQr}o?|ZFb%XH6Z9nd$!<05V?}K1S0b;XN;xtIn(oIXi z>C81b0kIZMT}#I}!depRYb(nezpbxT2_lfpw!;Xm3zHxiBpho1R;WmtfjQcW&u;bl zT82NTg>?>t&Wv~g{3VRBv4XG-U4&Hn^1twlx zsleP5S_Ri`PPIaHgq62|;r@i01-5Rcb|E`6;N%sLzSfpyh@AmO&8^nFKasvcWB%C{ zjv}@zn4*6YogW=o!VIJ zv|Fre?EYse8^Imx8N0VrG8qimI_| z>l(Y0%Es>Pw2j^z+D31twy}46ZNu|VS2|v%a_p%mb7&lUmd3F+P2<=r);RY5Gc}Ih z9cvtWx6?TGrfVE~H_|xvZl`hV6>1!NH_|xva*M&9t#R!AxiyZxxik*hCp=nz9(7~y z%cvX099A?d|0L?h-se&`_HL$b^ggS)!Nban)g7uEd$ZJyJzL$_n^ZUUl)90-FTlZ| z)Yvah!N19n6lgqDJB!9O=)&R{6qo{o<+S_VlAsfqfRbm zf(STD=wQ#CER$E`WQVYS1t@wcFhN&%t+n-Uyb~*a)toeBCJC3p?aGuJ*_bU31nQqA zaUbK><1k3DqqnVA;~iR9fB%fXDtwYrfa*)oPn%xj?Qe~D`2R|yRd3ZBo)+WVeiTPx z$M0iUK~xTrGTHEh9@y_1GMJhoZQfJ`T~KuK3erpdibkJ*ZT$7jJCS*KInQU%sYgVCO`#vlq*%ykY&2bUo#R=va1TtER+lxdBE4F2kMd@>taHfxUS-xebTOaz%R)v zPthUpO2EKD{wP2zeny)6QCj&6W1eY(D>l6_(Xe!qY7!vIzlKC&cfUS~UlhDd*__l8 zQ6npYU5hf?PE&lii+ZP6QxJ8@es{(^l4vF{Xr(}q#vq`2pv-_2BY%KQF2@7f=5@u$r$rKNrS)E8RZ}8t zq~Q>!6hb_ampa+$M=8Y$V^WL@B?BSXK4dU0&q-;bx4a>`kf3squaU8aM$a6QpF&+n zZ09YJ)o$1lePF%%A6C>YnTIw<=*r@e#qjgJ9S>&tqoT?87h0^f9{ETG?GRHkz;rFj zp>dQle3L@Xkt~}ZNNm-TI0#a`_0K$;G+qE(K+DCQRWyfk+uftJh+34J4>won4kj&T z4t74T^Bc5kVnLX$9|QYLwJo~2fRi%@gEqoQEJHP_*|eD=@22LPJk^rphTd>e^IS;& zEtO7Vfqs3fg>#teluS%q8Rza`r)-uL&o9l=S!1Lly*g}|d`}*tYV)1h*EZ zpb;<^?a5@fwa|Kgyi-FD!NcPkI^Tgxq1`SK_7k}y8dPU2o%0bXyT6q2;lMhCw(O8)TjIvTk7;_Vc!fow#GzvK=> zn+$WYoG8eCAh;ZMO2%zW+D->UNI~nromOiC^Xn6Z8ikV+ zSsgQNbuj=fr6r8t_1`^Q_+d*9Ss2`M7$;#$yIF;Ty()Ksh!*z@sR$_OSq{NYxX)b$ z9*1cZ7&BB!0m4b2%xo(YCLBr@w(p^Wk0xXt=aJGsRJYWg=Yjd87c{hhgyW+X{hnpy zz9dUXJ-`x@JR)w9S~59VBpcSAyZBb>86+nkafXRX4QEvf;f-{)h(>v_Lzmy{g1Knc zi6%4VgpDTTUW25d1IBFIL`Gz^8Zjkxtj?&IN&`fsbqwm7#*811rG+pXvB!fU$ens#`0o62`11Mw3o}yte2aj-6q_c?b%S!3 zMY1-+MO8}F@TZ$yIV_3YOT@fO4d%LtM_t^Hy_OnaA zvLt@Pf*$&3uBjLDC0b_`Ckl!fA-MHQh?v|2r0rY<$+N0+b3h`# z|Dgg9uY%d1fBS(3VBL z){V=g9By-f#crxE!ij77LOaCtw%02Kr% zGzUbvk=mMU2QS*ZZ1 z>25vW-fHg2zaH!2djv}%1Uq8NlxhexCA*<1*svlp7@sNy6 z(kpT5cl%c`TLXqAi(%RiD8OJpJncwQ%XsuAA?I}Tkl?Zt1a$blv9`7*POmV2m<|hd zI_~w<9%HPGin?P8_JN3T8L}Nl0EIw$zggME*eCK*9pO7k3E>b%%!3@eD^$VgWV|nB zMo8i4Mr>;dBxK;BQyF}!a9o<}8ynw#yD1GhH-4t0bBb{}3eV0{W%B}m&!VyJ(_b*~ z0NpqKG#+)$o()-nQXy3|WSfE`byVOb=+^<%F=g=lnOvsMC?#|x!M~AY!{HOPbu>EF zL@&<$G>I`j=ah!m);EpTb*|1X!Uzxe*_aK!bb_-^$7G{l!|3mqjl*5Dy~srgvQe!@ zT|Vw0Hza&PoBHnq)ne|{ZzvR1%F!WpeA1NJVT7cBA3zt6($MesuT-;tjYmnaimcZO z1l2(Y_=5J=g250kR)Bv8z$0PmCpe8)W#+4REQ5Cl*h{>W$p zlnRfQ1CD~J!cS6z=}KpemD7!tAr5_%89Z*;aBh6_^nFz|V?P2t%m;n}McPX^AklCf zrO$L&Ug#Z`IzUAd(E(IXRctu~gOf4rbPOCZ?E5L~o(IV@@$LHGH^g!ri5IUM8$UPR zysS=}0GQh3gaJXjWutx=zId(BTq7D%Xel9Uq#*)zLeF9dF&tf})F2qh2%Gbk=MTa& zKTgadxA4)?u^fo*`{dkYIpQkVl#EBfX8jO`&tw%2)TFzX>PN`5R^J*Ug!Q>eeWM^f zO}aQidZQqaU*lmA$**01Bxh20kC!I)X}A$7dE zy=e)#JSC-Q1iE4}Prv!*@zX~bRaZu-x!kJgZ;}e5dNJ58~di;M4IEr#gz}0$mxfBJOoTcZYX($l5yjOyYi43)h5{(XR@iI@E#Nhpdl zUqdEAz>$n`)Pg<;!6@wD^o|&%I_iaI<58fO@qpJaH8W-K!~pN*Y4F-G@NHg`Ak8{n zeAD%HUBXv`09Okl#*G1Dyjq&YCwLItM=NOtrKRN(Jg7bsc_(>d@ z%rjL1c>4I;Cq_uw!Wl*_x26D}UgT1U+V7}4bxJzHFzFLwWqqYux-^RtD?E8t0mVJ8 zZ+!S>WhyVMZ9G|9GcsKzkOR+CI`KCjp3*mX^rXHqzSxkI-t$ato{)dW)~g@ehg)w% zBSeeI(vB8s408px3~;!LHsr&*HvBb}otaIyHC_*R(6pXQdPl6^P6P8!uy z6wPMkBmJ#aK5ieq*xUcH%|B)I;p=N%@BN;olKT?HoA8orVYG??+%aM}>~)|KS4u}@ zosjxVlge!d$#x@@hKA>Uzo*nOzk{k_E;*ZrC{k<=f`I&iil?Jo7CtJdWcQ>1sn{*< zCd;euM6{eo8rqd0m5Vb`_>RedoR17EtV)Onp6h?ZeNkgW96mP&-*99T=Aed(Peb(n zJGsqZqap~s%R4+$b(sT|;xGf_`njV;zJ!m}vs zg)nrfT9tb~Mw8b&JTok`(v>@CCvI?2k|0#RKR};9GBpRaB}5}Hzn|^()Vv&Gaz2e1 z$bF(F#pbvisTzZgOSeP0fx+>@eXLTUNY$v{N<3|xOh{ICFvP#oB(^bUUzF?zz|W`|zJlckm(m{pzsk(g~@1 zt7A%SihIP|Nh#{@K?8@zq{9~I*f8tbXK95 zRVYY3{OT)-`_3|Nc^OtMbX=}hMJ@Op7BHPmRclF;zIG|iH=dY?Ijh2zX3a&*@tZTh z&OgEM)*C+7zH^3YxnDQs^}!-M!r3jhKr2N|*G8cgb(slzaojxhN1LR+!w+%l|9ex& zdy{pbfsr}05r7nUNDet59dtd9P{{z~3tVg%a#V_>PyW3e5{z*ymJhe~51LQc6yiAk ztfE13a2cj0@rwBxjnX&i)3{vYrwp_~SKQGcF8n}{~Q<{+qcL^PNDms9X(u!YkHJhZ~%GUE!%!TPL z9&hN(neQ4Dr4Fd8H>b^6%c)cSDeBclh{w#JcY!7*R-*9o=7m9~l9KdJp7*5_ZTf<} z%mv?hM@OKDf1&;@Zb7b#so-(MaL`?{V@dE5tBYD3%qv(sBl3)DefCKsj8CjRhls&kIY)Vb9Hu7#`PGgfR8H&k7)IPHwg(>9( zFrFZny9mqS3K!Hp@~IUj9oI_kYSxqwfe(_V2g6_yt%2gic2DXtj7j1d^H1AK6kK@^ zVQS>BzHFYZtS1;l!ZdcQD70{{}NjF%o*V5`G29o=pDELNJ@nc z0PV`Y>Ntz~-?2gapco0u_X$;osFr^ln9 z6Q4zhdDso`ssJshL75-u3px7*u?JDxL;)xj=;mmc2WdT6k0z9C-J=CqjZMAZqCCNd~J=2bE2JMz9>!F+&3 z#KReof?i5?epDJ><7510B7?QIO2xN|_oJBEg=ks zk@dQG`*swZ1()yM**Q&QWICjf2L9Afh`Iq}7?K8L*)YaSJZYd_u?JllC=%$bpvA8X z&7eXl%yo~i z-SF*`Z)TQc4&3g+o_MFM?UlJJ6@d?n~26S~Kf z>xs8Y)W#8-;i3c~A1N+*l>;MO`hy`_>`5adMuO!vw5C`6dU2)rJe$FVq5)M3O;Y>l z_`_)aydq~_dJ-yU*@o<~o#>iE`Eue4No>^+<(JrZHtIJScdaBXiJuv;DWtFy=-o(R zuCJmFi!dB&w64ZGh8&^#O=?g5z_%1)c^HH%weaz`PnYW})S?t7EQqvc0v}et|1=D0 z{%BCUK+Avp0nMyEeNvs)Or@8=cEVG>lr%Z@QRR~MBAL!~b#WX7^31dDEYw0-|N06W zluk4gURJ*^pQ^dGU^6nWiP5<~Oycg<4TY`YjA8p-s0b zu;M_YmI+v^lZxv1-GGGO&_6>93|@Yuy5LzQ=SJ9Cb;=TEs}9?zP$pybsjr+A`seG( zJs)%EnW7x{=I5z%KYV}VJj3zj`dWQs4LOm1tQ!<&^ivV5h5pkgmJ$2xQBE=qf<8V0 zd)Km`RbgooJhN+Jf9vU!5(#7|2x^e9X^%GyO+gOR`Ecm3+)0h!ikk7Hx{SI|_4{S< z_TUiIq3ZW`E0(Dl)$iY~Lbet0a;x@g|9G2qsaBo-%-^`7zp>VS`b4&_U*b)$K(l1E z%vx0oC)PZ*oT#0gAjpQ&^N8lOTpeESZwvM>O2p|Xeh-Q}EDQUbP&}?*uF_5hB+$kA zmH5=E`=k_oY7fH>{y@n!W4RzW#I{;!v4V*G|MhYUSOf`HD@xvnP$oH};1}{miO`TV z2CiDE>X~q`qi)L|Z+u#D;ZwL(>?rD!=Hm_I329Cfagr#P=EdU;nc(RYeE;-`_4?_P zjD+zxLg(2UHOK7P`Ne?r^&6lc;%Oib!f1Sn%6;AG<5z6(`xRWTFoXyGKo7!%t?B65 z&7_WWO1zWxZqWgj{QR~0s~Cp|eIBVjoqsHHTB=9EMVvgnt1VV`qC4OIDlfq2oVHOv z$+lN3Q5qAn>hICz4Hp~bc3RDa3^TQkgbe$)&UC%wny!khG-$iLs*a2Q728=noRseZ#;h6^7%09x*R<0!nmfVBj_ zqlWj(i~Tp+&2L3{`Q5CzC)!Q$u_2g=MLq;k7k#}5cp^^Y5wz(>>*HdF9pcc)BmOC2 z;pbc7i#5%alWYx*I-}|hv`gh%8T>vDqO>|?1EkSIBiVW0YmgVSdvO+5?}B44j72@ztLD&^b4 zv)11_ecsvb?gYENy|W+Be+u{i=fB?n+&>r`Mla%{;mhCud-N(fPG66I`S8z+UoYQW z{p;WVPso@}wLrK@qqSVGx2lb#)p*-lf2TgrHXCPdiF+Gf4drG`rDz^Gg}gFl;EW5W z;&J`zD^W;O1!F4y_Ze)my8S->yc3%&N$b9$O&=V*J~}$M3$$sbRE##w@0wYv2cw7E zqfP5hEo0mJ12-+JTA8fAGo6VRfSXnvmWP|pp8s(+S%s4%)kCQ&IZII8LN47;F=Tba z-Qh$}5lME(=W{%Wr@O+5RvmorWKwSCmDSvthp!ffi7t^<6K}t`O_nY@hyARE^T8&o z9RJy5sf>?In=D)G7mOTmlX zJ36N*FQ^QPWoicE|0$K9NyHEi(@Fw)F|8Erp_}cUb5TzG(L)HQVr_Qo)g7p?TdxZB z)~#1fdiS8A-daPYuDtJ&nxK*utIkd-m)u;wAs^)=7(e==0hzGKS+SV%vmwRNgQtaJ z=|4Es(w&GNMQX~%Suyrre}Nc^z3f3T}O zUuFp5;!I_mT7T5``J(qWo7jvBM_1QTY+#3()Xzmt{No?(t?k{TJ@MT{=%B_5!MbM2 z>liqg%;Ox~l!|5GD`aBai;aSGJc`8HrgQBuMQjaF>P2lBz|oa*$H7o7)Tw3&SsH+X z06%6ppMH{N*09hppxN|b1xGD}N0-8FsN}x*!OV(dqs(qU!hc24e_C$I;J0XF#$~o# z27on!2xTu30-0Vw3zF1N$4RsDy)(BEZdJaA$zRc#mB?j$Mg5qfJ&EgFz;4&fhuDg1 zSy=Afi0rEgW>>Lc&ky?;eIf?MB|ZbH8GcaRd1QwgGKa+KWarVJr86HD_hS_3e$?2& zlauQQ{Zih78((rgxsvNZ6jv$$ydw_YoBmzMDBy;(S9MJp3^ccyaB%~uM=TRFj&J^te~)}pDAsv(p$ zoF$kRmqYhb?3i6}XL{=t5oC3FF8zZzx+B$9b?<$XLH2wrskSo*LoKSmmdK|3%P+3M zs-kTbRt@8W4qK?hntY_0$JAmiDPu1IIXzbOKg>ayNolf6Vkbz0(E!8!N*E`CGwT5F zr-6w3-CB}farDA8?5NXR5d83}Eq^JzZ0nAu0tsMt;va^|#tcK~hA;wJ{l3i9IUmGb z@$|_Pl_5(wj;y54^p(88DbMu$7NW3xw^H=@e_N8gsHLJME9Op^IW9!8fSerii5_KA z=A$AqIMfA=x8T(Kap!&8Bo?p+0J2>1U1q#FC2bT>LYzLfZKHkG2EM#kNBtNR<^e>x?4eRgknb=uu(8Ugcy$q@g*=3qpwJizA(`(g7@0q zMour+Zd6oxRdf?7MJ?JUs6bpY74jL-f&8bml8^igkz5T<<35w?#aJ5QqCq?48#J>N z(V)J7ie!{I^hY@EFAfFc(lgnL?ko0so}x$Hm{zH6_Ekb|sD8iAEo=|N;X+s1gbETQ zjNz8}k&aKSFeKyAd&0JqF~DK;dcg%w9*L7k$dGS=#uYX%;CB4d2jP2J7vk4*x*3-- zIw2RqP=S`qDZc;9U&Lnh9gnh)Y!B}{eLq2C?W8jbPqEvelen>JI1w@imEo%aertMf zpKtH%{`l(n^*awqy+X*xA@(w1G00r9K}yB$bOM681jU3yhf&41iR#c#n_g@AZF{Ts z|NPp&->EO;Sl+67EXdKATy{cD&W(=714TwIfO(`zZ`J$tJBdFtmx+6pbqn(TxPScm zSC#)<;nZX|t|n>*Vm2AtfK5nsUWP$|7&wy1sMzWn(Sqd|T zbe1IRqg-(4vLy3hP~>|vS4fWh-izbczr3@ewvn*B2oN8XRgxcH{6d(9H1|+Kh8Vsa z;|^k6bDMRg=Kyea?Vp*$zzUEc*cFe2;`6;7uW-~~(Xg9Uc@4^Wf=GD6C+t(2O1e;# zZU{gdv+NzhB-=)(2N(|@7aE+x$2fWAlorcDGOXjYN3N-|!${XpeR3Zmz$P`Pw6{h7 zY89wRkV!&?I}4&5ozr7aq713I*!-f1UmMNnAN>!{~uNF2@XV1Pd5x2Er5omqY+8`S4 z{Ix}xNqOe#b`KW^FnWm%_vNk=_YLm*YrG9Xc=|6yl*RJ}??B z&T~)zXkKEc%V4EwvmynFj(slA3~+fG^)8X9>k7B+(%}G|Gi9tTJ8M<&Vz#O{Smq=_ zU?@)b*4Nrnoh8m?Z!~DSt=2kQ^>F4^YeT^QE*JRgC`<#bg&~z~A^n{~Xhq#xj7or8 zGo)7&#A!+FVWjwwqD`s<+zS6nyygRx=n9von%pZXKQEad)9&bWQh!jZb6qCd>Vv={ zgj)=ijal059%wlo1jSY&jueB#<9|YuRhf@H#VEu)56};YCH=h#&swaap_9n3KMT)o zIW8N`fwGgflYkX|`4_{^@`F}IJigx4sT;@qT!kF3uPk9~q)t*_SssRS!sQ0e2hRAnk9*~uf;Dfc6RrKdI!(=0nWQm?^@NB zD zZszMqscEvvq9|>;+H!wrxljxfNSVO+G)YIx^n-_G8FN;v*P5Is@JaJGVfbYMs1=--^R#w%<*d>Y=gi z!Rt2K#x8|uQww$J4Ey5*|97Ms;BLF(qq7u5ps+Zk6M!V5(@~HKn+`1)>Iq5`T0*L& zFFsxum36HOK<+?W-sS2?qnM`Wdz%)m>LwfbF0WNLuN~D2b<}%v3s5|o;vHm>3265A zi`sx%V*Ld=Cd0yKZsDb%W$78A;bK#daWqiiPK)#h=+{NYo~=(}I$OJ<^_{3tRf;HA+Et1GTLkwtKstqo}SBQ*n zRF&~1J#)raysYlu0D6U*J z694_Km+1H;lo06;lVIG9Yf^{d7Rg!)=*FFc<9{8tw~t`+4U)BQwiOif9<&OpPpGys zXh%1eVN*IWt}^KVPx_fzKj?F62<>QR7McWQZ<&e``SY$lTFO6C;*j^rQjt~%mLV#s zkc0$Ixl~a*XV(+|FlQsPZ|wuELgKqgUi6#-jxAtW?%)9E42LKS6r&p3%R$U_ z6zE6eP6~Y>WY5zAyn>nWB%Ib*8C_WJL($&_+T4Em>gdN;TZe6^;v3wTVjR$*D_ftu zeJ7gEN4i#Xe~?Lku(qP&de!W30^W0t?WDP_tn;3-K5J9z-mt5)j&4osX((~c+C@9p zn~vshR+#(|U8vG24s2rv$jcHxpAKn)krWEZiF>bhci~0**P~ZIZ@oGK-QAH}B_0GW z33}P+SI|a=%T*dF>3TGK6gD%xXR1;(!T6{LV6D{}gXkR`rx??~!cpp|k)#9T8K#D6 z;>>_5@jdau{`2Ez1wV`4sv8Ubizz6*TR_~!w=%uD)~HaY#b-*L8nvUijpqfhd~#%9 z%(S=;hn-TQz~QSuOm|S@K{g-3Wx(4)wftEsJVIzbq9t5)Zl!35jLxkT50dkURRrnH z=63uD?Rlg?SlX&fXXWZBH4%=^J}NFAdK4261>0qjcrUGMD=@6ajN zo79%esAisNMgJBvaDxFJ#qlgZVwuXian+a4DuPa}hT3FJrlqTO3O8r=>_<$}mPx*b z74;f>7XBKyvX}%Udb47t-Bb)=KE$&S>J;7u&?9+3Z54ElB5Y~d!6{0H1+zlB8}v>H zi@!#PTDonEGxIYF}9Rm~A z-OTA)eB+q$=ohJa)|t<0QCv{@f&|Q^j#I>`L4+sWHMyg#p`A$y!*a^DOxebiC49>% ziE|4wZDw{*?qyK|SNw$>Sy87bcuh)!x{74OlSl^MJPqjL(m(T4et>IPW-KvM+Aq%J zvpDVo6-hZ0e%XCIUg_Y?W^JXWZ_Ss)9x4TR8N;XhThI4ZY&*K&tt*Fm4^Q{PO-~dm z@qf~jJHD{CLpK(v=O-!_8EoY+!V{shKl zBH_~~Swd;HRjBhwxH=e5j@@&^0bQbNUr%+%) zZ@zO}4~*SwV{FfM4-&eZ2H7p6qQ-7&b}J_^jLAOCG4qgmya8D$kwp(V>T-^XU^+V^ zvfq3Kw<)cWnefGZ+qok>ypPH~Vsh?HcIbLXX@*=itf{eks>5`u!UHSHih8=tmqAli^l@SVsmj4l2~9fQ z)s*#FEKE`54rD)-w~2osSQi;m79n*N3?J==EZ8yoH6IMz1mmd13(;h!7p%hKPtFOq zKzFi+p#H^U?@h>VtQhWK+0i*F^@O*8EWo$fAlx=h0`_8F5qtV{(223V<1 zT~o6y0j|Kb0%UszSWC@0wNW=f0OOKCXvJF(yuO*-eB`5FPg%nGI1IUwPI%DCs_0zk zvtT?7(mTO-7^L^i$@*~X#s1#z@$2>-1?92m6}nklDVq5l502KicC^lSZ~-gd8@Fq_ zu9dP@IP>t>&6nUD>*W^TiMM|oI>eM&mFC9VuJ$ZBx0qPFcT%jNBkl|_Vzxvp8iwNB z57O<9U?g&#eV;^H;iR120B3%-TNGYmx~MBj^Toj?ay76qCvs!{06kF%JyF1Td2Ta- zD2k+3;i8j+rO1sGOl_OeAYEWtK(TI-!F{SP27VOwuw)7@SiW4$lfCS)3-93DcnE_j zse^BW={`w~vEA*?;10;^A;PPD? z{xFHVSLkPLfp&b3IMvD3V4Q|`6sTGfyKj-IkNAvw*1L27LM|&{S5kUGzhxk-Q2n`se87lyg1z5*?)ZpiwP4dTtxU) zQ>S@YG;Y0U=q@ec*L$;e$ck1b>h4VCo|~@`innrNEPMRNX|+XDBUM8vYdA|VEiQ-d zrPwjM;LbGJDI&<~@?81{adbyItm@wTCWGwxR#I(e4u)D(b1jig`Ilc@YgI+tI;$GS z2aUB*V>S6mGmojQT2jVd0zRjv+7E~Eo#?4Z=${nl0-{gXAZIg%XLDwwQH8akU z>|*MfhAc4!`{&d#V=`E{3nh~%-LvK3=#DHlk4kMckEDIm(Ssf4-H86966?J!!gA+6iW#H%ccyk8%`gi;vdqCB z#Lt~-p0acAnar_fS#h16*_^bf`gt_P!u#kCv+O=9vgkf~u;iYif*zR`+(#3Z+eecY z+eewD_UBYXpFX)eMHJ&m-9J_I>65!sMxn1t)zPOS@A8agzJ>k}It;;ivYfYZE-WC&-i4OVj{@`K z!Rz+nF9)yp5drm=gWYR2K_4xN=T|B?FJkaqgnbG}N#Z=$LTZ}$S3IUwRSABiae5_! zkkG|oIZajMg&_J6j^YSov*;LkB3Bd4jp6o!!7#lN(qWN6QUykVSw#RMpbj-cs)Qe*ob4%iDt#2asapnWrQK>5! z%vw}b6zU8wsuoX{AzDtYdj&d1*uh`5U;C@MPRt6B5e05a|B(=L7m;%jm8>B|8yJXX zAVL~F(!5g8YdTWHU(8qye%^92xg=Maq`CW~fbzedIO1o|Xzi(P6e>Nz;M_JdKL+IWL z0aqWf?HPW1l`IV~HF#+LBJh+Y-@a6{D6ylyy=GH6FMaR|>;2W8(f@Y*Gp#Ey> z#lik_JBLNGD1k|5Rwr}3&a7|O=ImQj3sBU}Vo1V7g-dGF3-2vjJaN?;ii_ z@U|i{Yf-sew9{x|I45+)dj0L%`o_DeF|_ca?f3ifMH@qjQ?$gUSNV9+zpm*Af_`IQ z42-qsDL6+(b7f9?ATm>m9-j>TP9Sbl$Vyc#$*{5SB)Ok0cN!ivim_ ziw!S0iFYkWjHD6FTAEQbl7ZOHZ-49P?&&#ofOD<$JZnZX-PKohRdsb8@1O7P9iP2w z?;o5T9sm3J!Hbvem%FD=4_?-x`o_mv6j~gA*Vey&v|i^)_VzmmUSf3x|9V{0$A zrt-J}2o=1Yj%d=cEy9wy;4QqS2>yXv@K{M^tH^BXH|ZgV zG<#mig1&srnT5z%`wJNGwxy|m4iRgTW-dJ`(or9~s6Ya#gj4H>4`MreaH@*gu?Q(j zf9Lqriwnb-m{2pIq=Xzd9=7Oc9CTry2IB&8xUgPKAm-rvQ$NHTo1u$JpO8kcvcL*J zGq*bl#y56c;|ygYys7u(8;v9IBb~V~Rw8-T0w0$X!g*} zI0d@{IECBO7ZzB+qwxSv99Zf>)F)%7=V5YTXHW-BgfA$FHSm#no)Yw72y%Mc!P_Qv zza+0hqA#eHr7WWIRs^LXg0L!n2=RjK(uH%tm{a>vHf%s07zgQlFS=d2P*ch|T;dB9 zgQz~=ringK?@Lx3*L8XUo&0fCoQ&N*y!m$E4ZR7RpTENy`PKmfL8o@vn_GxK^fjG?DVBOCcPxc zmfcI4ksFw}UAhxpgU*A?vjlqwre-jOAw)ByvrFqwdWKcX+!aclA)0q zc&~l<g3JS&CV!eoJvNVgk5bztfjAj&OEZU(?tZ*s#}S~_!GfXLL-9t0N^63vHr zYXX>wNvu+nWnLSmKQ4Y#n5IVRm|aeRPo#KV#nb-r znRsAd3pFty$hmB1)N{K7%mX!ahwC+L22R1_8|2uCCHCE~pjsJYmN^p?TOk2ANJ6zZ zF_id#2zNkN6Bcy0dx;8>tTadlU7R)dDrPoOmj$Nu@N7?P*&FtjP&k>MQWU{{mnl`7 z;&xMt-TmVxlu~bjEDGE5aO_>zAJ}+haN$luGFKv!)t%go08<^5sKwMDpiscpb9KiL zJ=?S%Oqu}35+Bo^-Tovbiu#zMP?~DN%B)pHMf^i-TyH#iQWec6K5cDOL9$>0A8_mF z_@{%@wQg0cRh)|Wwkh!WAOD~~@T>A`#VG#r_=l4dS=^}ly{PO~#64&ae$)j3s)}ud zP}Kr)y1f>Q!fQG0dKFznpvHHt^53jt<5aOQXB6`cg9h*cX6eC(F#?j?ORKW-tK-u( z*lT^LySC<1D_^Yjt5s_K3;70LR1?%6ForVTl~^~p=CMJQC%zS14}lqa_wMPq@@vov zln4iyy%ip+H8pkkqgq;l#wNiOBs}_xnszxT{w}X5)t&!bOa~RZ`R9!}ILo>%8O+$V zBjYV`F${c4JJ9LSpA2CKjZ+F)QO9+LX~u;6ep#ci)Oa$@ky9mNX$NM|8UvU@9y&Wd zJJ{VnI6V`a0PwqLdovxQBlF?u;Vbdbz7OZ`o3Me~Jfy=DAQ1hqFDaoS)*X1=38ht( zN(U)v0n+KJP#T{xCm}v6CZZWMFgVn}t2bDlx0KNw)bj9X1+)-OSv}}&FJN&bM9cAK z)N1oQ8gXoD%DQ6~Y%j91hxxiZFDd*ZnNgKaNk6<83IHvzZc~1g6fkVdE7+2St3;fM zma1i4x5|l{Ewb}AuH9`|8xwa?s%2u67C5h}xO zy2j%KkG(-Ka($#L_({IJ^8EW-@M)mlNB^ygy_g!JUgtXX@Y2By&Ug&I@ZPz8bh%`e z-%Ge$=3eMdKH`YsuQ6aQ1IW`X$BOTWQM3I1WOwghyH5}5a!O763tdrJV8BFHMGS_r zp2x3#ko@Qe>YKKyNEXnSQb$4X7R{DH%9ix#A+2fT-{jIq?Vwq${ag13E0o zWHfX~&e)j*tfZ5tn*r!zX7J`}Dwk!Jm%_*PfcPu|!lJy(O(?G<0&kS>f6S zTr09gwqBK?7Tx^9lNA{irzVO_g}E)Q4;CT=b~?+b)T8;78*C_U=$#KO-%By0-`PY%p-UlP%?K4;1eSU=mg(IAhldrP(Zy#8CQ??;Rf< z9qheqzu0|#aF*#c$TqdAO#=1KfkWmc5;;eVru{zNe}%)~ts7Ijy(+(tL6;lri>7#` znGVsVSShv*WE05v7nS2sC!t>zPX|E)Wpx4wH6VdE}-vL<)pnH3JO|(6;_=j@u*;9@^d@`e3UTwmR zUBiI~(=eIu+F{#rNBUKs0Sx zO*UieGAnF{VuA?6W(ubulPH%Bwv;cWCPRIY(uyLjG_A%o9ODg3q741CN;;5-3Jant z?kJnr94RwK26Tjwt`Q-`a7mJ78kvh4voz0{+@ktc(gn(oV>AU2p@K@zF5V?8R#aJ7 z>=|Kz8@m_ob@LoJ))?B!0%D16VZvyw+3T$;P=Xa9%t2+1)xttbQ<~V9qLn!;5Rsz% z!Qw-S?q1Z*UOCxwD^>(pzx&5lskFYnE`D;xXxOr?&s3-f zS0{rh8sNZ*fh~-L)ce8LF)%DQtPzC7sA?!{^rl^?$?gs;Eh><}(ov!uyWQZz_kIPD z17W;`#--ny7se|Log1<`;ggH3mFfyXL9?7`7w_@t*u(J{`h8c1JL&>IK;0;cI|{l6 zK#dXHvWJZ7f$b`w1SJAY-9S?>=>CN>?$KRm&}RcWDVL$y zmkVSCx{04_=+Q)AaP(IWI#%K6NvJZ!IedGAr?K!R1P+E-x}6K4P_Tv#AOn+tV05Mz zb=kFlg4ALMM2ZbRC!$ME4}11tSX9#%6+NMa|%37=)ieR%Ymy=`KF>>1HuI`rxu`d=9StnMwckne>7@`7;at%z{6&;Lj}h z@5_P>zt(6Hwo57iQih%iok;eGXtRGhhx}3wBaG1=dtxZ84!dJ-G%1zTI%o~i-`nna zRh+?Q=(_A`qvJ)gwGKwo;G zwT?F&4YUgkI~363(0eruW&vHg2}El$)V{WL{57;Evx?zUXrd%=d}%dwbXbZc|i2Q(IYBJwmsx;k>ZUf)BnA##r0vrDW4e2;(Xgk2vqYg2SLafR+XNg%ZH z1V}0i->b*E)?a>`edz_+APt1$bjx!YB|h3^dH@xD+Q3W)ug4>=J3|%iX6x?w+nipkKeKA}@2qi{q21 zPwoAKC%Zo!y;Oa}?J2I92ZxPLfMrG)-GbEOysR=vNzX;31)fS;>I{pzQgjcIhgepI zDXL-N%f+o^a2BPStTcWuH+nmw@v~UJ*XUJ5JfIAE>FaSCLusBTBetBE%BRmwBi}^_ z7DwvhQDNEJ42iY;^9-myHpf(2g}u7_E1n_Nq^O79dJiOWxuHSV=z&MzO zBN|IO-VYGr5zW|0xdxnsnRx6A*(@10 z1W)nSAa1CwRrX3D&T4!AUAHSQ>}R%65%pJ^%GCS7kL70>J!Anm>B`J}mpRtBf{=2L%CXU7&307jHsQ+(0ZY@085=taqg70_(&oYP zD5+Yfm9+9_xkNS|hdw%NGFhh&D*EZ#W))5f6PIPIfdgo}&T>g~lNpQ|$l6vFctAg( z3qOiqj;veH%iT zE~T9?U44fPNnd~u1`gnecj1dQx-%D-HzQcjDmfQZ>p0EfWiTD|_%PB9#u%Psa3eeQ zGMW?*uQdBWr+_*3#5>Occv=nt7VKaER$3DFnh0GUS+pQ6te zZ_8?_UCui@R;^{xZmmYOEaR({2(VU__>Wh>(@;iN%ZptWr!cDRR{49Nn`I3|M~5TN zoNI4le5*zwRYG~6${Q~heTUasQx%E_jMs@Mg0L0(g^!qRY!R<7Vkh>Vf^-H51;8)6(uGt7+;&wZ&Go5GB-PC!~psXNd-$-#=V=@@su9!VIPY&<^4#;>hXOu3W{ zXSao(9zCyb`tx3o;w4g1>qJboRY(pAP0 zhUW7zVgg)Pq=1b^A$_)$>xi;`OhLUGG}8ji$m?djm1d!(SVZ|OfhN0|3dUrtWPg^R zE7BObQpykY2Xw@{)`pC1f`XPYDlyq zaysZzw2J_b&mIUHSefi_tWxGuR_cA2m5MH?1Ii5_ef>7s=##@&&kwfIvfPulF4bBgMrU-j0j+9w z2orLJfVwvq7$y>}aIWreF=+bJbuaXZfw>#T3IT};8zRw1N?)O&8A7f%aR&o!5ABiK znGW_E644#%AGz6tQq2a!7F1kARw<<^X>KN?=ur(gT%jmiwT&G+xr{=g&}cCBi)6Pb z)x+d~ur>g2K##vcWicTksfWp&bI=14aWjYlmaWz6Juf5!Zf80P>L52m52}VXybv+= z_m7U+2d_?!PhVCN6E4GX!o=$6qJ_&B_)?7x+#1c1blE*NkXDnT?KoLq_54|T|KAv% zmtqDK_ZI0qn_DM4d+B&@r?b)P85Xk*3~_}eX|Bbal0)9Gb|3M8;)U3G-BK(e(HYzV zGyC%BLA?XWcCss;oz#DL#ZBVm;K%!0_%Q+@3)zCa29ZF^N*TaAQ+YAqb!kkch@MX3 zC0`z$3G@;ekhsU!Bgkk5bbzsEQ0>dn$XS2%0B_M&#l8QSkV`9?g5c*us=QJ}Y&;(b zpm+WHe*K#_#*`lNYjNMcrma)&1H=XaRDNgT!u8!TYR`BLiFDfrgmB_Iy&4kwu{#L5 zSTae^k@}CPK3dGC$Whn}!rp%`MkAwJ|A)bgRM5aHb`wAnkLNfH4?A>$+MvEo4USI&}h%#U5>m3>rseV$@NH~lZ%%rdsXe+kmF>ghPCcb0^IWJzxXB!|GyWn z_yX|hiyy?^y?YW_UAE(wCd$ekPo5PfK~RgdP*D)y3EzUD_i%4I9NDFroLfOoZhDxV zcMsN|pXiPnHs*Bk?Ymtgm~fj z?ejzmUU!bmroA&dQ@=+SkbB?H5J+TTZHMDaODBZn5)}#X3og~q1Awj>}hzcdb8r*`OOE_E~!dE(8#SiG5i*iW6hfJ=fYZ}S(sPj#nM<$}K8{|Y)ZYknT5J2SfAbs1gszxql( ze6yh*9?A#q;d-RAfb9qG21o{<0z)1}VL8RxI*`A0+KMM|G!C2b9|P@& z`aZn}Vlnbhw1Zd@KSngRxf!p4AYFqQ&Ov>&0&Fn4bh1=ni_smUBi93*^3H|&+s8iu z0e%z096o+7ULA=&K;eys!koq&7+GpAf0;Fxzwi?Z zXO#qdB6@gECOALxrS}KCpAip#IVWSt^|Ptp5>H6phsX6N8ogFzh&N-S-X|dt&qOfa zQ$M-_Py%5f&5lq=l!@aCsAAE=MB5_=1?UUfsqqN*%pUKFhxRw0xP7@~BC?e$JjD9$ zRTzYiW}GAbWk~3AZ=Jv7xvfw&IETc6JO23WNn$1fvijC+QXdKmyp8u=7UTp-m* zRv{UMWE0`km+$e3KhaYGd;NcM?LkJW6ic{zHHr`(nhU}QGnUkBvv}HWvoT0VfHQ!9 z?XBq*ox1qf{rQpZQ|#G!)E8o>Kz&h(=`Sj`xv9av5cW)c@A?W*oMx#T+_$&*Jv={r zM~8%CkiLI-aro+wojmAgw`kMO>_fhaOgAwp!eJi6DC*hbG`qS~-;6zn7n>P+mQ`}t zS9QlYs+2^`jPp&ataH!9 zr_|f5L0Or?O3D`~Q&Q2n43tYyl2MqHJMFrdCg1XA{8JL|IF(G~-HwyJRk1rFw`IKg zp-ehjI~yg((F*bu1Kf;KXvg?L+V?5V4Mdt9EXxpRuuBsDIj}HFB(9YqMk3G!>Li}1I93G+wxLRIne+bnR9Aee z`+OiXQK#@wmMr**4rY0%jCKEzQ`)izvBZQGpT^RYn|PCTDoYm8C$nVB>5_|_(2xdZ za@X$VFzAWty(?i;rm6IKjpz62AzpPFF$?J05(B=tQ66&YqvuhSov?x0V6KhvH_7Lo zf?4|$j~uc~I_6O?RuM4?yAT7mj&C{Cu=!qf7vIH;Nb+sl8HE2+9!g=R=aLs>ITjN> z^Y736`!oOk%)dYL@6Y`EGynce^6yJ$+#_{P*t7u0Ied|kFDxHO6VYDnKC6s|WbHxF zMUB80_{~VZDa{R393|dcKvAX?&M2yh7w+%8o(mNFMn}zDR=~Jo-v|WEL?4Gr>bV)p z)PjmJF+vDq@)*mLC_L~ZPV5+&4NVaM=gAQIe%I^+3W;ACDP=)SITEtfFK)8(}DOqZ#*UCrx)ktJc zx*ZnmkK2Ha?H)`UGxaIFBM6Lm4MdK>?WxbEs681k3g4q|dYfI7+R`#(lD6U94&X~$#^r??lzIg|fm|^iL>M7|CJ+KM zq9|PHkAoo~##R1Dt{mzDlS>dldTrd;@fo_h44^Gt*Zj09WL8cEO`R;r&w>($VPwCN z({<}|;$Z72KRouwSm&LvZi4Hn7@u5}Akmz~8si?g*YO_66kPBxMYlv?6gzlCU5T2O z^-8AcH`KctJEIZv>T|JHA=&x7T4qWZ_^ueD3pCP7KuTa|bPAJ!>9{`_P8VbD`mQa+ z0s9$li*x5gr~AQP@7e1WZcKK-7-tBjWQ(0{rAFW!3@3@9eM7qKk`qFQMtLxVT0IJq zk(h~Qh0<{C9<`63JUKhSsEv=04%#2o+xC;!hx>2Z(4SH)XhUW#j_wH3ji=U6>`_3< z8XzM~h-0&uxN2Bst~s45I*6n1rcY*MxGQSPecv1FoI>a&&c;2s^nHS3EI+gjV;Xo} z500sZp%BdP8O5~3T}7rsWG>H9mt`s^sG#CDNNC(^Z&Kla#8B@>kedJ?g^zKG6`pa& zc~Iy<@ANeC3Tlo*c&x%2bMY8wxPhu32)|*#tGIoGw#rI<=)4w=! zvekaK%G=g-v(+(Pa1Js15*#*&tzSCiKG$(E+$Rae>@YhB;6IGv;tiFj^iPzk4$zzp zt^hbi66j9HF!#6&P8d#yQhjm7CqybL>p%A}mSfPLh#x&N!+}o31E= zl?h532Foi8BIWCE#9C8M2v;^+Qb#&! z13fU&BQsr0b|@A&kqkPBWK-HK?9{POA#DLs#u#q3Mh+@K88Jy<g<`RiLu~*DT3!^R2F*#|>2e~jPQa1(;g|zkO7^_1%kUVYbufmPj`UO* zqiKcp4(Oy#2nK{tjuX?bF=Yo#8F^!N$WcT02Hxa`{PQwL4jcPfaD{uZhJ+8lOYMVV z4BQGr=+KcSgobJYDufgoL+a(W?9FfNhwIQRFeSu%U~yCGp7)-oD*s8WvZ^#0vpwR0r3I$SFN`?zj zWvU$ZK5w}x52i%gq&JuJfyu9zHpn+oC#Px}jVM^MDcPc+9Ezj;8tu)!Js>Xw_-;rL z?r;Q1Li-QDNS|*RI!q>d!z~s|^d`}dxmm-Xsgpe_qk)J*tY4+D|O8SHsIGa5_1PI6#f<@^>gG*pij8`RwdDe*zu!clu9*ON*KQs zNVJ;MsPkUiL8mxLSYX8!{m8=G7li3)7M4v&6r zZrHTlVV$}pcWP4iEq>jMz~C?YoBQ^Lz10%4+XsNB&%Uzn3){AnK(+wL=Dbjz1DhSA zp5SYHD+8G7J)7v_D?J2FiRPNCDD(`H02h%@Vr>2qy)a%&GV~H~Zs2E)lasw##A;X- z0L&XYbt3~V6-06QA|A#ik`DlTR_4l1617^3Li9~XoEigvF?Xx6>AXBvA`}@c-&dyd zP}(CIS2Dd6bqi>`IyK3dSZ7VAR{;1Ne~s+!la)11Me?rlcqlH5bd&OerkE=R;5M^; zsI1%_$>Rvjmc6xscV|uqXeiyH!MPXHP*N5Uq?0;+jDwLq>hYE8V<>PQ*1w@SI&)1_ z0%o2WXjEPU#xqRF;5v4cIpj|h|1qW<;_MT0dLzAz)E`8utTubFGx-k#^05VaS(cCW zfGSrq8#0v)mAOJpCc1d~T$I@cUuE=lw!CY}l#Uw=#DPMW48+=y5j(={Pw@&&i#LO@SXrR#CLR7 zV98NZQj+lDq(}z=E$`@NREnh@h>7EOuB_{U@DWa6w<5*B6w-L)hAyV}rynq#xw8!_ z<9L}&C5JxEsW3oVWaRb8#gv-hG#|?Iz;LRqX+Vw&0mXSALKmlmlED!(*grbbp-&e< z$$6z(=vdv*BNIWIg*K{Ku1Y=?STI|u9_^32)SjdHL#tA0{QUay-u~0mvp28Bn+B@W z;csh=OetE`Mr%{-@4nn^?1YV<=~KJy58G{B0N&73RIu^$AwufG!|UC{mp^H^3#jRN ztO>p2>-L*_nW{(QL;Lj;);`k9OH@6--mU+~ss9RsFT82@27?c&H*ms){UDEk#iYdu z7Mp+OxE(*mZ5gNNYQrj&^v$@n&V^gY5Env6H>}s8I(8B%y?)DEeT7cUWU|AEt;5%$ zk&rV$ZT$_aWoYu;koo)QLQq0WGyixUHpNLc^WBVEeebu@ zN^GrjOaIYmuqefk#|i!&q{Y;&RYU{}W87w58jD5 zjr=3!IXLe&0DOw?>1ZF9u-FODxM7%2CL|BfLWg0rF zz;{+w6L6$*ntfUk@e#|{zQE6@ldWcFC(V|14i-8`i5B!TvTjrTWHTi-H8e*2s;Y}S`)p( zxR*V(d_gm3fXtQ58HB1#&cE4+B4z&XO{SZb`z_=QPJjTGV`bTwTRYuG; zQh1_eG<-}0uX{>*kU;w;P>MF21e*-FIuCHv7XYw!)O)XQ2DGJB&jz0XHVKP^&@$?z zBGne*iGm&5`fBeJ=}R8&1vL{a*IvEa?1qAG&uTF-R`OcSpMeGnIbtyeRf z`(^kxyc`3!Ni98ffFsVY6hxf=`|g8mV?cTF8(sU(7cg~CVp%NO=wcI>oPixN-&EFr zHD>a|hdxaAlj`_kxvL+Zj51rQWxpiQm{dA?qa1=vj9`3~sd6Y*uvbG_thm84$S}cuX2> zi}fAxac9nopLz-Sy`0@TXE2vH`T2cI-_xKqMvgcNq|}J(j1)Nv@Z4A7ge5sPqdP0A ztj@a0OT$q5rxlWfqMQ1hZC7BVyE4N{x1uZ|)QNv3b@oHSIbZQ11Aj)Zx*D7W8>AUp3R2thJ)1=TP{LFdLV`Dp~n9lDml^6xAAY1i&*Ud@&Tw0Ytg%Vhu zpmynqzKM|3>VW(%aS`zN$-dZX*?kfc)?UJ!%= zLT4A5$<1N)2EQM|@9M%E_0+i8Pi)W8*uy-W0m6S|f3sPD?x-EaVP!sTC^U@|!ME`Y18-QAPZwDdu&poZOEPAb`)0V;Fp&M1XkSZ%pTMr8I|cU| zdd9vSR4FnU6yos|GZIn*0YezOzf3($V5&Q*u7c21U8c01TzPOPHE&=>usdxjKHe1> zTiQT)<&$3v=8L>{)6jB6Z$(kOlzb>9$_3IrWQcp1Ic7W&qv_bKPu%NCOaPRfm?a1* z${dpdlh>rt?dq(1(o_`w&s_8m;-Yc0Wy5(wRZIDar`(8(_xr3n?z!#W)2TB1Xg14P z6nJnHt&Fpx-H?qbi0=8;8MDr1orCSv^1pnz zxh3k)=-e}Jk*yth zro@Wlih6yIU0CZ!DO0<&EoZ_Zk34sx2sFQn+$h0Tl&18B44}k4QLQ0A^n-EouG0$* zYQv$6$dgN@F&+#6#ul*5B=Jk5McN|UyMFz^v@@9}$*N2_T{9AVaZCi*g=CGOyAE?I zjWEa|_{!y^#R%lmc}E8Ky&%eOPm6(WGAqz8@|2Rcf)XC_A3!n0ueQ_-KW3Bz>gNY- z*Po1UWLzsNMsvtKj2#2n8xXghKdiA(raC4q>?sX6tS!rhHrB51k@+T?wGJJ$;l#e9 zBOk&*7hU<4py)E3nvq(f?6iY0sL5Jlg5ol|D?4vx=B>!rd*HowrSAtTys&nn5DHB$ zN{F%nF?29HDEU&sOY0}g#>+5)W|YzOg=An*B}Y)oHN~ty9$n(xF$?Ebw1!!7Z zYn8>8Xf}oQ(yHRcMD$`m`QmZ%#ZOk1LOQL5(@r=UxWF0P~3#B4Vcr>ZJ2BjZ?NPsVU0*uSrvj=rLNMISo#y@>!i=snASOa zF10gg2e#VVNS}(gXED8MiZFF@2oolb4(PX`tJ5rs9LWbLQpQeOky{You(3THrF3S3 zGU(xdc;F}p&?r+bDggpGWDjMyA6hw! zB8iKa$9v?n*$1)25>Brt>OKd(8TAT`%t4YoGxjbb&pU zyQGF-4?k#@aHqXCNSxgyi7Aums_`+}^`i@jZ0q^di@{e8jVydkx-18LbEc(m|31_Ss4P7`>0#Egk2QW6n%>g!<2Pb=5;q&DGd6PzJFSg9wA9{ zxCqU&DRBbxg)re*W#gByP6!R zH58&WA?BVHYi$nK$~saR^#joU!u4H@pk#(tGUFMMHhIqD@`4k-sx<4OPTfXV)hGrD z%k^3~3LHB4@gaJRB$Fy7n-h zU6`~XMfJJV5h4_gVcl;Ot`Q{SKn9(1d;?Tp!CqlSTD#e3YZjh{E<6YXvIi5E!9y-lo_8?DWT`aHsij}r37 zijHP&Hr_nPG|!^`EF%R@ES{wD!}H0;qMROsbxyH*IB64-O-DR>Q18G7X5m&IT4YEK zVw_4vU>o67l&&SwPcxlb!6;rmdT=)b0a^(EKOUmgLIf!mh&LmxB1dV?YCI!3(d`Cn zQQlzqxsCr=G9nFA@8UhyE=4qcj=PhNthO!Xg6#^EO8MF<723a%ih2RXW5sImHBIbf zg(hYR9rn3lg7iL%7=EPS6V|obb#Ze@i(AR5xkJ1Y!*%z)^QceeF>t$;a_KX;Y+OS% zTN0UL9Zr>5*LG~>*~lx48CZZ=et=ZWG7Z7Z<$;00`oub3`83N_G~IJfu%)G>TXD6O zOn$cVnUj6yWS=?NUy+lo+yM_`Wxza=y-17pHLiXKLcIWjos#K=I&O{O5QV~h9>F(C z%3^awHe8X)NvT0X1v06QD1c}bM@}B$PXbp#$tp~sqIiqR|dHq zO-bY)#c-n}c|Fl`3VGL!zMS+#7nBbOgF^8C;R>U@`_Y z!HXse5<&@2$!t6$FxRKz&=Mu2UOLAVAbr1^!>W^4yxE4zWoevcJGuA2F@?kDP*R^m zNqr6_H7k@<*z;aLco^O1=j!L`WBG3R7)ZAZdR!d#m@lz%<}Ej>k{L}&gP9RkDbpcH zej4!2$qTmY#8AkFl|_0rMP;6#TlvbymE>j6KP!BZi^9T$%X5-NChOj^7LOSDQ+eb{#oR|n0o+p!w+uaNc6{OZ`A#cK$= zu2w&MegedF+sdk;T$o_75x*_!U~JW6`L#)iro3$`=|v<#VJH`6M%9tWF!cfYK{h=` z47c255H(S4Rwm;qN+WZIG+X&2qM6kwNSU-7Nz{x*E5pBY#w&v<+9!J^G8l1uq9{01 zBM`IXO{E+i=kj{=-~nLWpvM{~EJYXJTm%kgyxK@gIW5t+O#~{gQB0{VKrnw*1?SoebD$;ip>zi6IfyaShRm&)u>PtEOGFFG%Lx%iY z{7ChD_r>9pgEK%h7z`^Lx2?!rurHE583H%!!#B$$PH`}zt_q3Fj%g60&TsKnd^+yB z+gZiQN`_MEZOTbQ!7;yEOgk!xpy;b&mzg~>NtqU8dNGYe4PBJsHAjHPfpzH~-m(7OTLEtPT(?{j2Oiqb8ygg##~ zqeNmoG)_aij5aEaP(HB$n5hrTRYiQdh#T_A8ue?5z!4SGL_T*6m6AN(=NL(4Ut3Tn zO<2x$;c1PtOz}?a+XH5!{nO2#f95@9f^YH=b^t!+tX$(-QcG<%QSF7(j zxQy|sy4#6bV5n)G=KQmu26>-Q=Yl-W$0%}g?lPs3XY1zd#3pk5CjFs)^Ma$Igm|wbtu_=tMFjw{76%IWe)sVSpwHr7DMxu0t`>bsYeXnyfp@=Z^>6KMFcFOh7if2uGZW2*CFRKw&JJzqJlV9A%Pr{>Qg3l&B^?(L zb($e2=a336BuQ-~b7)SIVHQaKyY4$@An+aOw70%94G*i)ZAqA6YG{T5iK)KP=u7%L zj(s{Vz!5VTvoWxW_|z91d#)S6@$**|Ct+2b1(^2=O$SsE39??0X?4R=j0zk5!Vbq{ zzOIVh5oU~`eB@;0M+fpKi=I6QF0`wRvfb5Imz#((@}o3$A#I#w*qs2^4U>qw(Om(W z&h{$ibOXoJK%yc$qVcm>zlUXGZJN`+Rf>FgdS1UDgK1XVN(Xw><}5j=W*D_7hG)j5 zoK=hK@V_Y1*CQL%^*ExM*ldy2=-fM+J)XBkIlDLUEv+^BS;c4nUVUP?#r^=g6g3= zQIU)#n5dEpnm!%%fHb$q?u8eUWi5NS#18r&8)48^({09J19k>gWWWww1DUkX?MWp) zMtxvTR>OJoCR)=<$>M|Y+gi*9Pu36HbnUCPvgErjBN73hq-1DA*5nRultV5KTq*te zk{PX;b@p+>E1W~}g1}36$G@057kJ4YqL?N|?zoPT1W6bXus1yERI|8rb#>`dXR%Qo z{XnvPr`vT$lQ1<`1;W=d;PPZM#O!vW>~iv1o(Q&*ErXfov=pAu+kOxfVWsBY+{7Jt z5n)6dY;+BCVquUQ?LZ_JbRbf~K-TOM@rlW_nWcabe?sRL{a>EYaSNFvYdAS_M_y6F z(v_s$L3U}A;?6Ki|C>@^a}P;csXY&~qh%(dOx!96zw06@Q+~zx-IT^J?HdADEFhX%h_NkTgf?$lotY|GZK@gG_;n;XDc(r?VT@V?Ozo9NCurbzSXY ze1*KS5bvEEaDEuyTG|eL@hr0Q9a(iiqg346l?Z=y$a_8OuQ%#ny-B^WwXOFZ88oac zKuuN*D{zt5kvl*IvD8w;4AfK7$~;L8f^aLHig*!Yr}Q1yypfFKbI2-C>1U{26~*C; z!dq@Ws=k z1M%Yc#o4pn(}Vr_8qgWNXOtaYqas#g&y3=Pga1JT`1*gk;|V>?PcrfWtMx808;72H z7_T76h2zZALWGh1`|~M{ioD=q?vQIteHl1V9-v$6l>#X~FG9)RNA(nw)w1U=W9mND zto?b8M1Q7Zg0T@Orz-q?NclXSkT(ZMpGKvY)8haGsLQPnG21luX%-x=lYgW^taN=Jo8Pf?)fmzXw~UbHHGe}m6>}Dq^NV(bN?GzP|E&R zDA@Sp0I;`9*X-Tv>&Qey$AV$}=2P0>rf@?f6I9-k>gJQqWKO)SxH@ojM4fhJ4r>QcOhd3)qrmC5j2{YOV(!YG}aX(M)gXP zRe54NWge$*IrZ}@TmInfbBB{(xIqf8@Rw4m=4cNyvm9w^OzND6Zzw#0`NCeWiiFGg zOERKT#(zYJ3h-W?5)e}3bYp&|qp*h_df2K=rd#$Su{LyWI+&;M zp}qNi)x4@pvzeJ8)FfHOIP&Ny)tzKSQIln)wTCQcXyo#fRsSk-05hkIgUd@5H^*H@ zB8!|6$(1k%n(bkTsHV6M-Cw4zKZ&Am|A6=f3kM587s{NMKo+Zsj@xz6q{2fdvoSi! zc|PSdk&b0{fIuiD0NYJ)*Z|M>CWKKoY(WpRG_p{H<`da&|4$?SwKy%BabJ>^LXQKU zENkY!lwR*sxOrg))dv}Y-FV4~Plvu&&Ev+)vfYd^iB(Dpil#2ogbITneE*cN#`tpN@ktd`|wkcK&b{7{k~_ zUwsn?P0yvW{ESd4Ii_qzl(Cgz08%qhsZT!Dejrw#%f?`Gd<+E^IyWJbJsA`8hPHo5 zX1TD>Z(wJ;*|f#X1z0)S$26vGv~{a2gNF9~Pwq3E(~bQ5lPKp|Mu*p*pQLZxdVJ&N zyWN7@-6dDE;BwAf31cCQI%WyFv5PJv3cO)>pwlagN=NyYbtYx?;s@Wm{s~y}S2o=r zz24k-V`g9e%1qE~Z$P1~2XBhbfs$+1kknR+4x)PfX02~Nn%>S5k~vQ8&W?_0;1c~( z*&c7v^bG5nr=Mt8Pe1jD7RnA@O(eYh$t5R-7soHj0#s@uP``WSilKLLiJ1mN5A$d% zk%kf(#u8@fAj23uNadl%c#LGZ$+gfmK@AzxRdYC87*{NR7so9`W6wz0s4_Qm_Cw-r z98T2_l*KT&6eaL_CuMP!>t=An3CK7(V-!x3Lki=F zlH)KMlg=PR@;Qbvb1-0&^X{g8>0t8gXkek5TYEtQkg1bZB{{7A-4Kh}f&XiBUm(nt zmTcDTeS!sjCT9PO#B4e#PV@a|3#l?AluCBu>DYObj+?$0Gmniq&czqg{+6OlW^lD0|vdK;BhKY z7Umx{e0G|q15YXO-)aeiOd^$6i9=NonZXUS31maxLphpeIQ?f4QVVDP`UCn+RVgEb z3`Phn&+t)jdQA0mBeln3dd1?+rG2bZWGq4j6TU);^~!G*gTc$tdC14%Jfm|V!x@u# z^$-@wt7C+6WZ0~^=(?IeNi3j!Z-S+iuckYL){Yqt9XP9@773&>DqszWhQz7L;qX-- zU|^L?hrAZM#9ZAz+RsB>$_k60odFz=dpBZ)T8R)pMT{B*0T2^7F*2p-gf=w@%>5~g zF7E~sU*!b;P{98=oIhp*$#eP0LZ{_iK2RGQxiGGz9BSoi&hV)v?csa)Kk}+&AT6uK zbK0_UX0>Huec3|GvS5&ceNQ9rT=}(%7bf@xUZKuu8aB({8v~rNey#HN823b1wq!dT zCq=)8GUzCh@CG*WKL#>^D1YQo!JXu9yN|GsTW=34g&HW)m(=LS@CQaLFeb@TO zrf4b4*_K7y2mZ8-q%&M96P1<)_Pb)9nJ`x8q{)%uV^O>dib_XGnK2}DMT^$kw3y9u z6eoRqoQmAW^C+9uW_ljw6(wR>Z~`i*o*|e?X$M}hoc3q_ZyAmzr9d6R0AvrRJ8{Qe zIPtn+0T(N-7~@=}f}>c@-JA@YTcs>sS8!w;Uo@@8&pNQ$cB9rfI&D~Lt%^!ou@I`6 z&FRDwGT{V~K(x&P+Bs^wzcj6|)@-f4-mU+~ssH+ByH%~VHftA&=2JDGle&;>o{Ayv zwK)+M%H3=fzDt>I4>Ci%#+RX*wQ56rqf^<*Q1L@<$|kD`4R|aq`LCL$gf+*o}e2~I5shST}`Zc zwrgXI@~WtFO5KuDl3;66d4%q~&RB+K^n>vbs5%0ogI=t&sD0t2P?uT_1l@Y;Xm9i} z3BAD>bv+bl1FOL|m~;e5S(Cg;=nncS)jQsD*(y<3#`?)H85tj=7#U$>ry&{_mGhFO zF>>aYh6zYeMx96d?BHbgbob@)DYjr4El8|e6~}Ke^!OF7qKwkW3tdwy0TbQ1;Ru%@ zCslDkK%clHy0OFyW^Y1}@OXeyH60l6c#R<#Fsz9SHA5Ls4THW9NA0YU@mH!1I}q<< zcmtI8PEKSpoIUwhyBhP};3G;9*7*)67~hyF=O~{X;1jla6Sg^#xu1#pXj)fFTvzZ+ z%ZiP1qKj7S{9Q0Qj(4B^Q4}{(N`xcH>=_x^wMr{@(FH3y&7-MdX*MS2K(!>Ps+1ld zJUx6N-k+W|E!b7!3H)t*X!+L8NAaHF_k*Ab0-AK44yOL3xv?XcZVg^}z#d*a*%9>k z9g0QxRIgVF00-|W(?`r~z&3~ar){ZXX2B+YF+W9Z-@B)@8y`8h>U%SV^qMM$AU4eU z(NKW$ax45|M;A!}j9RVNjbbJ9FaGI1ve1`M zI~B?YG^^rVk+7%aT?9qj4khK2hb^gX!^8ueb&d~~vQRuBL>O45RPqygGxg)|&_pD> zjQ_yH4?;9`l*Uh3`0?25LI0#Sy*c&Y0+;Yh(sZ{yxf!`|+5qC9)P*eXHLWOYMUOhE zrm8oXFfgM{pOfUmlPWwm+woi%5gzb0 z(aeO^GW;3L$U`;$P#o?)dcbnlQcJ?~wan7RzVppNVjcI}Dt{rZr@{VL#ZRa%MPtC} z2v=##{^p^5T?1KnFaY6aOI@c@Kxzzy?r~0IG$NA_kWBZ8l#{hw6qQ<#9ive}0t0d~ z<_%F&cb*j7&K2jYUkJNG6}>QalZ!IkXNJBr0=a%d@fmS)fWrlp+w{J@VV4SQJpnuMdIbNFfrj~P zoAxX3SxHq{h39tr>5CusFj#@uLLcol{Q@}b7Rny-#q+}#$ER4XDZcrt$}X@BhLrf` zi&dBpuU|nG6|kK5dwU<_PT^SoJCO>Gu$?d_Pv3x~ugqe%HoPy^U?on_gB-YVG0ljQ zD$2tEM|kJ0sjkvh`2Ij9J)zqaoxWV0!0`#5GzdI5q??PdMIkqJK>3h419^cUlj;K2 zq1h|Q_WfxTWImz|m_ZrJs3bjDm%LNbVP;nGHi7T{qZGYO8 z02uo%4);6Ydm0e(V%O;*T1MX;x{CmwHFARy>@wsed^Tn2$zk(@=;q>Pg!v7q-Rw~E zcfeQXC3yKn%s8V^hGwAVp*sd45(W$?1qEH7mCGbP0NagDRl_Wgcku|;#11!e$GC;%YM0SY8zFqp0 zpc@ggDD`k=kJQRWNpX{ly(;#YRYpB(M=5z7fqAGAJ%Ow=K$b;GRi$q*WNC8tqx_D* z&<3IM7;CH>Et@(C^8QnIEUBDpC=JK*t$q2ky^aT*pBtEDu@wO=f7#mnlCrSv$h(8n z=TSc!*<;$l1l>S!tZpwVO9$qo7j2buII|`k-50K7B=sY8LM5ez!u`;3d${@reb9lV|%^f(x>>GU{DIxRR3 zQ`N+Q_|@iS^aFLYW3R(6vd+vA_{<|@Rs*rxtMOo>h!!>u5oAu3W|WFJ)ftRGiM3Ui zPao0iHT9dbEs|jf5Xq=imCeMFy-!2FSu3&mV+ZqHVquh)>Le~PzbE-f>Rm#Km2+jk zj$tbl?*&&Otyd~{WEK)<9J@3(0vWoNPF#mZ@cLQ+Ix(B@Vgg-FY4?wgNQch)2{y7R zuQ8rg8@Am53`A{nQn5kR)2UvuZxl_fd9J(JD!<1!AJ2c2th_fM1;%;#?AZY{j}Dfi z-X*eXi!#z^e1vKm+DClh?XXzhD)$DYj6oV3!9?wJxd#Ln0i44>vT<%r7gVZR{DA6k z%&zj5LKBbFJ5^K%FGf7zj>)D~N%dRR;7qs9z3aRJT8r(|aLaW4!$XN8nVa9xnH_#4 zLN3xxd8|;fK~CZ;$$YE){f<6!RP@p%)KV1yFc{=53ob+P0??wCITsv(`b~!w2M(wf zB6+w@E4Fk}naty%+=P)?(;mH`tnDQ8SD-{i@ct2S)MaZYIFD3}C>=3c&B4DSij5X{ zI@k8kl;7*-qER_l`s$cZWzvTr}|SZ9f7MqR|8#`2A>X0Bcqd7Hh6qpLev z!|Wq_Lg=ad83r;HEdd1w6 ztj|c^9#m(ccXTI5Ml4=GY?cq7oXOYl)U51idt$yH)OUmECnqUQ3KMfWA@G`_a)i*RxSWk|uM6s)?l%&ofedXKO6jFSVIxeh@F zZ|n&RyZt4F7+Iq$E;v*ClUC`=-$GAb_by8UbnAK|e796M5kMW$2bc6VfM)+b<8j)v z7D`{g=x&k=?`I0xfjg!;kr>DEWZEo{R+nznGP>^%q)a4&)3`1H!*0`}iZ5&O}8YQmW zm+M;*3K%9X`PL00GQFA2|8OQES!o_LWL0cs=XJOK>mDH7cB7J?ZDds(l0*Iw4f01y z<>`o@SWu^R2Ry*B*t7TQT-(H;$fi|EJe|oMwJ~EIw8B~2n8Vq#XHY_tZTZGn*%l2) zKxO<%h{*!vhCy|o283qlfp3d7*S@fYbt12-pP+-hCFNrdN+ffl~h$Qkoj+Z=U2CpqU&Qh znpIQP7QLNQg_eRA*M{ZcTzvBO|DB;RGc+_64w`0{IX${)3R^n(5I&(cAJ5kG472HV z&PhC8{#-YwZmkk8En?Oh>T+M_GQZ8m{_n0$T^JEEb*Zz|qBuXX-06u;LSr`yr4vB| zucF^iKyJ|HD`cnX1XIk4j<-4uw$HsG&nlO$!yOC;PxXyk)ghpe<9p!{Z+pl=8bwvx zu%D=3^ZEk+YXqJDvV39)HTqriJYDYGG*igbrpRHw-rTzXX1!`a!@(FP)6oYswau`) zkKvkxS}*HrT8U|vOLU?Rpd%;DPmO;?*H~E_LcdM!9Ydl~1G&3VWc4xnp4r=2u%yV+ zZpOyQz>Y*N_<8s`wJ7V|CwmRtK=K7FuY5N@z+C&HR9jnU&XjCSy=+BAALs~TQOVT1 z2ll4DnJ5BpX7^iS#H?<^j#}k73J>f@0yA`>6rc&qolTE%n|I+){{l=wvUgE%z4)nE zL+)JS>|HwE+uP4yu0$s7U)mUe$tCmhztdDF<*b>qT9E+M34%%EG8noIz7%B=dt|u51{rZ{O{G%m;q~S~ zVEjMyekS`V8FZ*f8d6pxaSA1{|><5!3P)J>w9kRPh;Y;yd9D@dwW%WcJjlkHX6IOpC9iZ zpuO9x`&%(pRl)tex(Gu2gp+6dNRa(D<*+g*_(u=2z(0Cm#SE+Rw`=aPCt^`i;_?ja z9NZE+2XkO2VBWLfN*&9|>B{fHneXfXXh4_08I<~rzY+et4*sdMiG(pdg2epO;akNDFx?<5``Nf##S;AL&j2w zf5OgU7=_ptnG=DQUA;d7@fK8=WGt3m-((JN!~^J9lktZhQ{)`` znnee`D^rg{$?(dXbT3J^7DxNM{`LD?AJ#4SS6Cm`>qFEAY<0q+H^R5ZPhlCVnqJH(E|hp%v3e;=t0LA z0RKt@hYAsJ_@QAxdSH&BT0CGMBQe&87&I|y=`xR22~k7>{Wv$lm@QurjuKFj{27x{ zqYpD}RcArAW>GSX$7!%Y?I?qWAV)|_Fzp!zxk8O<4LMvl==bdsk(qV+hWmtnVwva{ z7A#a!%S7u#R2+9)*&GmX1sx#0T}Lf;9q1nZz@&&OuL-{U%iR+E{x;Wje<8E$Vk9Ra z=ZxZ{!9-6`(t$Gv%1a~MYAjNs=j{GVjFKsV8sWqW;4c?dY$jNx(u`%CSK%I_FFZv} zIaMWXq-x0z4RUM08Z=v0Rw%8OwS%D&bcS>cJEcNOlyjp!wk%6Bj9aIpM`^J%bkJ_A zT6&KQg=9|Wq%SR;lOD>6wes=f|J(oJ`3c_Yr*p+uV^(Az#KqVJf-cwHUYB!erL0+u zocFVoX>dgUq>1e{LYU~G7(F3`fgKcXYQ`oh&m0$TA|iYgw~(&j0P{imkS78a_!mk{ zeW%-XN9^Mm?Y^;#c^O!q=x}sN-h1R5K(yNgNEKyRLb4^3?u~r-qqBVuk6^cN_UAVI z9MGu&jcRnj9X1A_;l*bsUhCW7>#Qo z=OkMr$07i>L!0Hx&_q3}CR*jKYIR41Z$YGJqFc~M0D<8uzQ9*iX)@U=Z|E`@1g#>z zP4+NuV6keiHyS&QpI@(tH|v*IU1x+(jowb!c)eX)d4twT@Z5a;bMwu58H(~V6c+N6 z)qp>ZpUaJ21wc>6qSEp!0{-uOmO3F3_n~Y|m?eXvN~cJQYK<#_la6aoY72EV!kd|% z7t%35b<_=f0wP@lqfpz=-%8%^M_z!K+a+0FWnp9;^NSx6vATdZv76yUIb3(f!CUmX z#Cly!5TWA>hBX4hmTlahI|Y~&V95=by};{rIR!F4 zGMQcSgki77?l7Q$-#A%UJQ^8+3d_O38ay9~P-JARJdR!6(S<{?fb$(k4lh|s$#tds6ZjQ zWnt!V`O&6i_YukmwHembZ(&; zq8Vo=2Z>E&J=b6bh_VNb*zw7G3G}*WbK}R)~LN1eTQF5nXxTT!cvwW!X{cn@VU*tQRV;k&bso9Uu8m3urUib;_d;h-7(rskxPHt^@ z`!`ZIFU_5bwSE@G@wleF-vin?~WnYblj8C6Y`XIW`5!S zNgdoLl*3kG+f&aqpj?7q$q4KzX?`Wc0$SslN`jb?08#8{9L_|)1*8LemKnFb zs0~K}koh7OYFVi$&zzA55ucN}6FIYDHP7N7j@o}B&h?k#S##3Xg6)uyW$-6JY2*q- zLT!~u-Yy271W+kDL}=Wq-pc8n52`B}E+@17q$0jO8TF+h@5_@X943ggr}YUY(3+5* z))wLf@D-NL?a8l{x2qZHFYUj)toBK*dUVRS|1I84>aYS)pOAL(G%Imvsnjaz&t@vN z7j*^niy;*=pppv(CmF<@-_;MKui`{eZC z$>A%pcl`Y1@aW)_O?J%%pb*|hC)7=O4nesWx|5ICOZcmMSwNVIp;65*tmUoGyksYL<+sTUNd`0V>l< z+BF}GnrLo*v|dF}oarQ>q$8wmdv$|R59G?K`$fD*(}VB>zwTapA>RLLpKloy)Cig# z&w*}XY6057r6?LM-mKC6qV^)C8|-(1*Hg{mETR>d2&AIV~|aN|d^Q}R|*RSD&7CPvvt1XGBnUGnX?8-m0up0z|Ma9(ab zYv@KBErz-vO`!x~1m$Y-#$k4A-f-ylJZIvv{3F{`Eyf}~JO0h&l9~f{NU1GklY}n1 zm}->3Bv3Kg`qbCA*vlmiO8`u0Oajs2C2&g+~l~Et`1_jJHT{xWr6|;iAlX8n3=yFzy2nZWy z8H`NL4j-c#BK%vTM+)|F$^@z1@elS zdB#M&e*kpGJbT(82+gOMp^{OxOm0Tjg#?C@r9l%|8Rc`J%PKOAj~UK%&J&|)l?j5Z z;zuJo!9vehJsgN=x4WakG{pavFwQ%)WbIic&S_Ah&dK##tL`MsA7#&s@3*#x%)kZO zkH!ioKLfq^WX6k(KiPP-9D~akL5j)clu+Xoww#GLO$rrwRxyZrgbcz0mPsz|@W?}?DC_!ddJ5v-XH7u_NFvp8Bv64-bgego z3Z}{z6T+Sz&?lvZz0bsOF=D8fF_#?1O57QYU#Ej#QS*-Z@6P27vHB`a;;}6{*~IvA$IQ;zhYn|yuLDve^i#D`bxkA&G!QQT#a1M_fAgO3E3*EN7iS>r|iId)f=?zlJB;- z8s2|RL&5maGDeRk{*pwUe28=7mZ%e zUId~5NUU50B-R(%yJASmk|r#pQ!!Zi(2^zN(DLhT7*%+&Q$O@$8XIs2*Zc3humf9r za?`x@dOepe$-|NRCw+?Pdf~5!yH^WXa2xTY;Ej-Dw z^mI1yDl&|8O7#6;jEZCs&727)xSUShc6)6N#^><> z*DRSJ)2dcM;8If&tNdO`U=Oy4tfFA4#Wo>G7F|aw2Xs)K_BLwf=KGLbC6etB5EC@0 z7$a#rlJ&14RA$2OqkKJUy#Y)lf2>*5P3XO{{*43FRCOmSAI|&IiUDy=FvNBQG6^lB z$UCJ770LKzGzFO%0Fg)za|1(M`6vqkX7vW$K>)>gNISUl_~oN1rDTAJ#9!_T$-t7R z%k1>;nfo&zM&3`XxMk%q;}*$*D5bS53qx=qzZGJQfT&LxG=^ToZ^d)IHyGs%hTkfG zk8`FgTe1<(RIFdi03T6K$}p0j-)jN-qZviS5ct;YhAO>787Ox|727e3tE)wG3{vPL zfl~HEo0DHBu%?=QFDbMy>2(S*=B*-8{R74sOxN&(ME(Q9vF(yhhXkSr+wWi~OQt%R zU|7;sXPM~evd$9s;%ALiBdKFXW(hX4ibW{C&MKKO99mB3O_gT5p_WSebsNc*K~ds$ zGJEdbQkGo+-W<}c9O)k-pQQzBk$YveBgrW)zW3xSni(lm zQKD2)M-KIZT0cr))i_2^`62pD>FK|JkF zYW&ygWSTv%XA2)(=bV&;l&~;(KS)C7Hzr+62HwB>Msl|_vWioe0+MpDUgdL#x7neL z^xvIKX^}fF--9n@)4k;E64O{tdS$0LRaOC|w^^P5!by{W zE;1i8>n0{c=`2zMXfm>3PF>S4PKQZ9_Qmeut6D~S8NVl0Gsa7_tDv(Dre~uF1DLA3 zrbF6dz$XWzJtH1*>cx}8y_^7rj(2@uZizhCJ(UhvzBgo<1eH16eStacV^jt`xIGXC zI2v8q{P|l;)&S{MC+^A$Po;{LbsUapL-P<`KTwHpVxGl1I^Y*g$_uCEUg(H-4RWK~ zmgxwk3$F|w5F5cV(_#`FDLF2_QxYvEwn^&iUG9+t$}O}<5_J=MWK}$O-U9AUF)Eoy zRbwL|H(ql}QOLMqN8O^8z#P@Fm0;V8_HYD-4 zrPAIWn_}>RV9!cMPLSIjtD&m1EfsgP=~FKipJ6CS0D<+n*CV8Nf!}qv8R~LYeS11i zxZwC=Gpzbj=uR<)+qS6pw=hTgnT z$3vu879MadkZ32EfLPOHG!_g|s>9eJQI=8h&T|BFJY$@&Zur#Z42wk(BM-#2~JJFSPG;1GdF(zX;Se%=- z`AgMb+;TrF=aii0a%>$+)FJEz8SZPcMg3`(7wqYhd@ZBtOum*=E@kPTS2VuiHBmdh z5Bm?vha|pN5%%-46%@71ZOXTa)Zg``{>z0X#J__n@Ktxnf!*G*(gs9lVeCIZ`@;zy zaXEuP0kpA;hbP!H!1_?2@8Hyp+%XzCIGi^L_TLS(ISt|HFaz4+{}n@%(=BHkiRAV5 zwW5*y7+bDI`}XtCKW9A7(>I`bu>G(Lcw2Eb-m2lh_iN(O#sdl(b_Mf>DL}q30Pmz?b^j7T@riMm7j?8X@XCPh75tL8p%4Ak#KkpMv52y-EJF^0ynij=F0a> zwk+h0rhc+JnxX`@Lfv`v^`rF<*Iz$sKYCz<*cCD$A3)J;3{S{T7`np_CL_D?C(bqH z)t2dVW#ao_{C2za_g2>|r#gW-7BKT(Pi&xh)o41Ip*u-e$Wxxc%CvC_sdRf|In~Jm zhJl%_CS$hUfyk0!i4#aw2St_*KPB?70 z*DUINwDY%x)pRVe25_o1c<$hHho8In+~wyUKKHJxW<{(QjH*@H23ipH@s@hcQUm6> zvH-x9Ro&sti2bS(!ZuY!nQXBS<-WY$R{!7ft*r6s=Ex*xt*?GZlHJ^*9umuZJwbB4 z&(#V?BRk&_N-i^B$F*}gc#~5#F6yn@QsM(*uCZucTnqyr^U;a_&)&E9wQ(yA|M~v# zr%)F+#su4#5RyRM)&VEsDYq9xo1Qo|i@m^}_*SnSpb771f9E1;rM(#2x%Hfb>IzS<&D{!EKR`G3(OQJ!j%DE}{6Bo=t$nCj%nYKg~g zi>M3`)z?k*_g_8UeuWi??dFy@pFH01HXg4(*<9XS&ZGNt+>B-7TjKQM%At8}g!qR0 z)8_JPu?=t$K{Ll@*}Qq zj0Rej9l(FTiHY=nO0K~@m}prcVma|tX@L>mi_n`_T^hS`h^u}%J~}|)7YxDmk)8Nb z%3LgFPE9VN&Zx$v(*ARGxZGKDDsU5!|Bl+*cs2i{RJWE2h#I5LXjxyoX=|c{Jb5)H z;-?*);5;Tp5gMS4yw(T}knWjesW{f`TA0Vm$n1_-??*GWiD@GL3L%k&X&EHO$)ZPP zHga-L!{dTd3c^~KS1~Z;6($f?M}F7;OJ0GXgIZ;$0ttB37u*ITugkvZZH3}Rzw3_* z7elv;XV~OoO1gA`0w5a=kXxeysT|eU0K$c};B zg2{$tXtq_rrIqZ8lI_PhP^Xj_Qq0Dr`Bx=t0dHaVtCzTqn30ELhN?NAcy~F6cz1cP zcsKJvh<@-iJ*N`A=3*vsG8IRPeokgmn8L{LQWPRX%KR#h8TK$iqpA;jp)4W~M%mz2_X34u_W?zgd48 z9Qhyc!-4n;2oD;zd zqjP`Qjvzgmh_Nn`OWJtq>Z1OUh9|2`Zl12vzm1u7CsE8Pl_(nR+h|jC@qY)kimuE* zqVw0&uY@DuGbvhPL+XEn#zi-JI@OB>{@*WN!=k^pCWwKF!2ior_K}k$?vS4*$xgJI zy(t%-xrK|jKhZxHE|#F63Qj8VmYmYZTB3npWGj9eWW%ayQ%$l_78e$Ny z!WVDWTi!*gaLOb$*2TN0#?pQ9I2pP>73C8oDj8XL^%+=))Py-hSlQA9~4@lKnJi-C&8{6kSO{mcW&#E3HB_xxvfVaAGRLp zjM7gs7&(NMO?%?=Wgp=W+CzNqW}2m#>A}~-EEv^8xmGa*=Mm~Rxkjh zWo?;NyBQ7L7GFwbS3%e4RJwm5V5a~JvwP{#g-Cxyp8d}~BajvPlA}XhjJg*TGl4e} z?QyqzDBek23&8UjWO5oXyfW7?zZ8`_kE%K3Ty(D+T9%uauJAmDx@P zyB10ML$YU9)H7twOywKZvRtP!7Wpvb$4W7y?4x;M;pGCz=5j)=HLWo_jlnpKy}FeM_1f`9u$TvDrs7i4u;is>=&7Mg75Cpq7riiVU4+k%jA!xwnJosG z^n5>^;Iu^2Da5gY@c^1kSRa>1-Qdx))xRFUS$+IAN+bjn?;~Q&^3|#V?w-%A_{I|y0#Z2(GhDwqUeobFsfw4seQqr z7Z{8U1=7NwV}Ixg1x5yjEU3y$g>)>M{;WCjy!ZcXwk#F zE$A`mmaFgGpe?zi1-sy)5LNWs9Xe-4FfR~GUh%Rhs>s3e(zh$yp$o1RAif+9Ig)zZ z7mo0kpKgR!l(IcpzI9_Zp}_Trp<+fYu{(i>j0BIPX5=o@y8Rfr`S{O$$A9iS{&U|k z%_cv=KzqWiN4Y07%dnA&yb2!k@uMU{Xsp@>)`Q00G!7`~KiY;qu?JFB?XkO(kgQHHmH2a{Z>6b*gbf;DRyW* z!B&y-iQEIqHgGUJKaiI(EiZD4&MB-m9Nvq((5ZgF&p7H!ue-PC`fez22=c1495zTS z(NcHq2N;PWydZjEx(1|BC+DOqYv-jqyHD;B-M7(;u27;}$TFXOxl;ax=UT8BdB!Dc zJB+gRpSftME}L`NN<{xVE?h|!{f}C@Brl9ltS`p9PJm(2wgUF7l4r4atlXzkXjf9D zC-E-gN`^<(S^b%QDi8cJ{S#+s4zKKUF7L)-0DCFFJMM~Wci4lhN%37KV5ObSw0I&Q zSkvuv<_waNL<-I2R)oIiCjPsR(J^W#1zU+O0rJen9n!wcDGa=}+rv;f;(Jl}4f@Fm zhq+U@2}VPx4zK{oeeYP4z$pZycA1|s*BhQ=$W(H0kDWdk_DB7|VbDJ@f=B0lr$T<) z0sPNk*y;wC@PI0_3KYEA>kkGa`rCrP{qq3+wt8(zfe`6$4e>9=oeq}5xesggjz5xB zd3arR?25i_sb|0(yl;&3vuX0N_eMMh7ckULIv88 zooXo0R=)qfxV*BGQ*ZEi_BURFlV?qO>x#?Y3vAw*_*@Y)cqfz6(f{pJc1{zcq>mO~ z=hL8w{gSrGDW*Xw^=`5M?j!uSvYeND7g79J?Dg@#71WJ$8f(d6*m2Ri(@>@%<+YPi zX~>|+o_0838l4}e7r-||8Nj3X#3P&}jg+<-0hN;xlkvW4yyc7vSv^NDR4~A_Y*$Jj z*kPqN6ZWu)J@?hSAmQJXRn17V7p0*#rCNE#-9ZsH9_JB*gMBu5T z1V!++#A&_O+^_B)oWOszG;ibKf4A)X?7WaSgw1|^KTSG+o7dfVX!-u|hZ@CcN;(l)#YF#GEGP;GC7l-$7FSdl=JOKxu>IrW1tG zV1(37#mpw9#M=_)&D{p5|B+pLu6*Y2`*k}0`Nf4F2Q{@gsW2+=*H`!gvJM&~p?+bW ztXIec(^^2Mml$fakwFc-4Q*8CJDWd*dIC?bK4!cIuK8;EiOH*14WE+2ZN69wV4if+)|z^EKx7o zuq{MI81<)Y5uf*{_(5c;3rlBLU`!jP1kL?*zrG^F+>CJFLXrVvV9=l;#^fE2>1d{y zQ76le3IiQ(4&HYIG=4>+EdK_tHKvSQZDEiKgX5oIlp*50n1iTxVsV#p5(~xKlJdDyrni@R92?8JHV3EPstQwE5`@(Ji+ihX| zr}Iv~^^U}K#WiG2Wewr6tIMR`fy!X;W2zyr)G>T9O1}iE*Y2$>vd$h=L*8(X=3D%! zLH6)2C5IBf`Mq}kIuJ{^Gk@<6eYZCX@+(Y*m#`0HW=TOSM^i5xVoCaER6MTB2&?DUx2YF+V?US6HvukhmJh$b^Lc;I4^j7 z;gV84I6PSTegE*Zo|nOS19j&D`8daMD`w_)XB;Wxo>Te=bQ&*ed#z4W2^;g?toWRl zNkPg*v$g;)l-kKG{FBF{TYrtKVjZjbxD~rF&I5t^tL(y(DWoI#02SA81`(Ry28_15}m6vt@G&= z?qBWapJKDG^vLQ}HDOI>-eryG6_N(VWTEsKPeN)FPA ztC^bRpL->nFeT$aN<@Z|&FycZNNqb14T;C}8BMyck6wff{RinbQt7Kzb^0=PYQHxB zRXaYMtsKc>rYwVINfLcvW7^ECEwaI|g}1-(JsA5VPxG&nTK%Mc`g~{iSStjLq?j%+ z3eIZ47zWqiqzsXoj$OEc7F__?g}tZw|D80Y8s=iV<1|XPX!#BB7kY#x+-QCsQ2~`4_-ER z4o{!&K_j?Z+e=L|xd|mSoB5myEZ`2i(OMqwTXh_EHEg%Nu@1l&L(e-8+Bgwa61r@_ zq>#*OvXnL{-8|g@A}O@)LsV$*hmY2x75?@3(VA6d1X38Sp&!`rd%MqHyx47SAMe&p zECf_Y7sK~9&Wqz;O<2fRpjU$deP{R@W0JiGAnFG#D@nn`d+Dg!1kQ5$+9W=3iMAw7 zy@XP{g|)HXe04MlEeR({jf`u6Nh9j>7JIn>^T4w#x2pqN^Vi@ zkGWGlhVMCH2rU*t75ZrKNB@vHFXlNo3V8Y0#&pO4ZtOYFcayAbKNLMrrG7mw8U~P1fzTlXL3EHq-NBDQmi^~N@5KR z;IMoX{@&7Yc-y6e$Q&shQqoFSz*gxResbw*Y8%CKl2yJ;O00kh9@fCZNUwt2Wy;d& zO&82>u`&%HF3yBYFNq~3SrESHa_A*iObEiI7*G?K0LfR13BXIp1n?!!1T=_b0wL6d zLP#uAg}_T#2)@J%(IB#r5Nbjphp%^QVJY|)7DI3GazY?kkO7xol3sRYSxOR6rD@3^ zTAl^SCEBp}mdP?qq+Cdgm5phs1cXt%@UY(GVTP9ff^shFOK&^ZUN76UZDUar_eAH=(B=Gm4I(y8T1w}B?OY?7;xz& zS*jgbo{^?YHPd2c#}K#%ah&vekh(~g56`+>e2$f;0l1tHW`fW{a zXb>r|giw>$vdA(TSwqtn(D>>(1*1oaUA5>{*q&Djt$Ag&<<%6VjdtLRK|ZMsA&4qs ziu#ADJTYLVPk?pmG-5&=U)0#a>u0zMI9;ds3+(pf1#aom8gQK!pQNQ$6x>QYyPwP^w?zihua$MFT zEBf7`e^Xe8&V7tlt=Ol%0Cka z3%<-!PUOS`v3j%m;zeFm&_Dg^+G;+tC{4FuZ0(^`yVS~yrJS1+KU4%hKX^bt@Rs{4 zXMmp^o*o@Za0B%xk*ns!Lnsek3IYh_#U@e!RBCuqd5z2hp1Lfhlno1as{IaF>=mD&@PSi+r9+|4yc0LO#O% zIZS}RB|T6r`Fx4Y7eAnPZ+Lk4kRAEqmxEFOBIux67asB}s_XD2pIJa#{r-3`;9NYS zl8xegVfx))`xKY^GpsD%%K!Z**qIpZNii~sKv>=+v1*Bb@E&rk6fI|#m;Qyxe9_^e93M;MQSr%B=x zuE}uCtG|IbuBsf3ztXyLhhiB+uPpInUVW9NHL*fYYrb`|eJCUMF6 zrVCf#o=GA{+9W$y*$|rD-*9f=t7tY~9-MABo1t_g$A7aa*_5oV7R4mqeto<7YwZ{k zgq~$x0wwWLM9C>CLXwemtdE7sB4N%h3XP?TukOCih{eIsz3jR|(>CCQv~`!|LoW<~ z$4Uzs;Iyxf1jz6Y4?*6=J2L_H$@{+F7R!nOFms1#&lg}wj9WCH)Pwv@w3DB}V9Lx< z7L?5PC74QVyv4an9OQ4xR$>*MWY-&oV{`i?OIQ;brhphk!Omo=_ zgN&gfXJwx+^Wl9hvYkW!-2DroH?az?Rm^0#!zzvJhrQkBhtL0KXZQF{W`|=ask^sR z`}!07R5Z?1)pDZedF?=K58YdF)$dPr!C?}58rSb*zykO7Tk?9LSl{+>^>^BIS}ALp zYwz5{N=iO|4ZS$hDa_eENoS+zr|WGLLz2A}=Ts^qU5zs@Ymt;w7>bdbB%jFah@L32 z5o=z0qw|d?;$`jRIsEXO_8Sc)0_=NtSTS8FhCC`ODMcJ8PTtRjNYocx0PTe6>roRL z&P^k0W;bXv!`tm_4lgq8Feny6nv_~ev1wLjwTC!3c{QJ<43aMBjHcZoqN@;a3GAhk*o^MQsnR81+xGt`~wv|S=BF&XhAkwqO` zS!{|z83m@8{%mp~;)l5cN~V0Ra>Qq244_c{&kg^W+@v(`Y)Np^Kihq5g*ZwR@aZIrU@e#L29U`#>P}h2bB7e9ii9G*BgimoA;EQ23I=9e6|AvQv_EMxhp zqnO49QLEJb@48_9zw! zcbSOvOQ!C5K!u(57CZgR9Q&$8{?hhfPtXZ0V_(A?pLxyL>Qq>N!kdwwz&0XZDv@Qx zV0ia7jUZCr{TIB-I}nLwhP>h*HgOM|FfN-+!7B{tdl&{negm#yR4~puj5>W5{$bJk zk76QbH+^1CV)V&pW+zr}PvR*Nz?m6~al<-U%Q!8o=$z&P^ED~BZ$8fwZiaqxpWW7sF3l}b1BY0 zisF@{8RwF2O~%h1_k3J|U@x!z{L3g=pF?BR2FVSz#!5x^}#fI9z2XV>at|6cS!ImXAhEae4@Q5J=l+^Bf2peHRxvVq4fV z3X9_GE$Eovp)ToDgPugWpwZBTi+0uwMdwQckmb5)Und<~q0IRF_mf)l@OYGBgV0vW$llvMIRO?SAt1x1 zl7ekv=>dG+zZ?fb_Bfl*+1%u_*uX9#lRzWLErFq-0{DVz3Ghd{U9cxG>JAefcnYwA zFZtybrvGY2C&R)VRusFKE_wQwvLBJ`XY9N<3y3M|&CJi^n(LD%w&WG_&+i{Pe%Bx2 zXVTNVX^(suAx&ezP+-dyQD<)n`7bi>b)D{+*O8jSdZ2T{8vk7sZartk}wCu{w1=#j4jbjadNUKPS|*zqw${KQeY19(8@v_pIJjyupupW3jCSI zQgDS{I!JjFw0ytW?Y?;{Dzx5xK!f15^=B*i`()!W{%+LP*Xj4!Mw#CqKf>Q9&*)d& zp=n5zrte!cH=eC;BhKUX$4u+-#7`aWL>6rr zV~a~zE$AS5FC?zw`wjLXbrg}Llor+SZEZ;+y}r6zqLZ}#AfKc>tZqvM)ak+QueIZP zb+7sSba!tjS&0}@U6$oUec`BR(cHQoDuvK4H1I|vGFnR*GhzvFvGp9O_sZ)GER{F8 zHI*KEX4hM~LEv@IF%oXEb>WLa;Emh;LVq9vcKkI#Yk41PTxTicazGP-9^fT}$p zor@==*D1yvCWA)9=1zjPBIl-B(bk*WFLs+p_1fvqVe{}P*--y}-%#_oyAEd#+UBAO zH9X2$0}RRS@PX@~1s&OOM-=Ly({BY+O~%V&+{H@`7j%NB~+o3L68wnP!b$G{Kupjd||I;B~Khp|f< z^6!VuwjT^0t+9wLh{Pvwf>e|G3123a4@AJeq-lNl;jHMQ#&8` zG=1s1%>z-7VzjA9w%)r z*{MP^a(wYHp>%0{~k+zyke7QX)^r1 zGc^fq+Sz(sd%0UbsU1%e1w`B_f5az}KI2UEd6=4Ocp&;TULfafFsIOvj(!g(z~kUg zkPVV)k?Mu|A(y%y)21Dg3q`r&=ERTT5Dv&`ws{<0Xc@TxnxvXasSPQo=C%_`COUZ< zSYY>#egk^iL62kaORr9>i=1<5NegFO~hBWmK?&Ns);N_=Dgb{z! z^9B@bqJH?ozd=p792{*C+;-3Vo%@^@PC`wXxg)Z>y@h@wkR}H77zQ{(<})pwK#)Vm zkrOXLx$7HF zgL}W>r1XD-Pb#>_U^YV+QAZ1T@7T!Yi^hDSgZC51K_&ZBMojyq8`+-(n@2OUBg@ey z44llKw(g9vv?vbx*J32i4TkPH$8eM1HX{#Ndl&p8>50*~m5EGcBrulVG-`?1_wTqk=|vJeN+A z!#QCXoY2X4?vJ8qngcv%mKHx-SC>X6O*>p8j3aF!;zgPzihGJ&5X1`1LvkU96yMkw z54}wxuX*6vxlJ7nmJRCE<@zMtdN696Mjnr0Ck~jf1R|8{ff4JLuW8WeEhP z(3fqjHyN=h5$VR>XHuXg6K5TkRH>=z7QL(H1+X}8#c`dLpBZf?H5&R)f$>a>N5KbH zIqYFiC2QBjv~@-8-{(`eB^PqP{w*DEDurAc`YakcpmBNt+lZZJogEM~PkukDO|=<; zD!ts^=6fumGnLGz1ZUR6MUVI3sz2_uG1%`A#F+y6jGW?@+f;NWO`~DIsYuMJQCLVM z#=8Qgmf+8P0j1#vT9Iq876javfdl0r1S<0iwi7&O)O=ReAwj7IyZ>0<_+&f zZt;5PkG$NxRUjE_f&bdBmx{}u%qomBCoqNxlw<>mOuz!2YRVrUHfyh%FJNU%nBWOW z3b@Hbs^Pd8K`qJ`c)(ACeVv5Ps>eAM7fp9G8v5sWIlj5H^xhBrbHC${ZkHO)mEUfA zy@r#=d+?KW7}HUi#4Z@D8KQKzB+_MH$4mByKTP z)g`l{&Adyx!%8muVSBsKYTb##Z)|c{sGD=rW-w*w_gqHIs~&*@Q&c06^Oe;icPSjP zQREIRE<^X*d~h-kn$+)KiziK}!vr364_1U{O@}y@SISqrJ3F<5=C8Z;-RHY|yC=Ul zt0yPNyU$Ng5(O5u<>P-!U#~=jLc#0dmF_~@L+>K61s9k8d-#x{e3SjaAWZ^!7%w-0Ffmz9#&|Ajk05hG$B|}HjYEtUZsZmCRo z<$o%rJA=`1+=6|}#154}Q+KI^Pv}&cLk$lDP^a|j!6B;MPq$C%lg3MG(}wOf?8E)Z zO#`4N08QOA37^n3nKO0Mj;p^lt4F(YHEl2+`WLr_z`gKbS((^C25mCv)XlW85*lme zPccbO>vVc@dc6DM_sK0jx$*)}`y&a+F#@@s_ufMfj03NY-OErA=E86ygiDU%jK ztyk85FC~#CEu6gmU~Pc29|#&y@8XcR9+jQW{oLHa=BJ(jEz69RIxP#T{69?z|1nltIA1Q~} zfo>5x!EX0^xe<_2Zm{2Z-e84tx-R-^>-OK%RXVQ?6#NmC$gZ`~A(oVbiSG^ETWH9L zoYG*2P$zIV%8q8I+qiZB9dhyQL33at(Xu1k2Y5pdJ5{%xOFZMdNnY=LlZ5GzXD`9> zf)#{b^G5QP5_CIMdpIPal2|y9==Ax_YoxyYitMLlLS0s65Pe0)4W#=yfTU0)olgHc zyi#4%ZhWLWy%69Ux(|j7svWpg)f-(OhD5K8b?c`*80K70cl8TI}O(ZQyK{Ut{M)=3qQz%oipaD~e? z)f$I?AETzBT?P$N7lsO}$(R8`x9~&f7VGVjE_%eX=E}dk66ZK(deM;}1A<+v-c^GI z>IhX?3cW`|0-~QS(U+ClUR;!6dCUc+KN?GK+`?bg!oQkt<-=;>S@Z33BVQ>lmm1~L zAa|ynOw$IDh;}NCY?jH(Lp6E%4%aojBDr&m?{Ry{rd zA!So`i}r}7i0i59s*jZB@@_s#Yg>2v0Ew5cds^6pp5J{@hriS(`S7kG{Ci%lziI;W z{}r<7xqf(hyj{x+y(vfE-WCdVmX*E5Gg!SxE2!RNWjRig5a!S@KPFc4Yzg=31GnW> zaw4}SH0W80Pg%Jb)9QQ|bDOQepWcF^m&FR6W^cz^9S4|@rp9dp< zG-d`j9>T|Hz(2h6+lQwWIdR%LPv)p2c{$=6nFS{(4lk0MH^nlp2k41qiL>N&_c)CpF%FZeG}K7zDrs{v7)PU(+n>RK_YrN6uU!~w9pOrBnlD$A6j^hdZvl+Mv)P72GS)$!y^7n{a2 zGmt+j#4oU4-h8-w3%!%imXrwBD4UxYG^2k|QdD&TF*-;Ax);$ajkP<8vFXw2Rw$65 ztcZTr(6CjyDU}Hi-nchR%&u#&>uwqp91rBUAIR@u2O}(#Ey5 z3P|QvlQA~7?jlZ4zC)ds-8_H1A$@YZVMF?auJ+!mL1M{CYm&rR& z_q|fGF?ox6HjDc+4HeC^n_;p-ns4_}Cl_)Cqn4H_wk^rjpN^zO^)bdhTU_lgJyN^!y-qt{`jdd1!_A&J*6vfCQg#Ut82P zjYNyEk&aqxe!9zLGCQ>w^-5ufG>Y4Y2QPMCHeb>91@;yF^M3~wdLHSw(~62X=;OfI z6j=`OLcR`7uYRPdx!J_RaY6QbV~&+mE{bCou~7iRL%$xnROTfidrF>uJ9sL2OJQc* zPRDB(rDB^l4;7Gu8rjoEu~aN=!DF$XEy;)Tf5T&rfqgTwhO7{aQuM~OoHMG^T2UMg zy#d-B>wq<|hxiSd535AT|K@nq#}DvhrCcnphLA)8{wV<(`KFZb!d>$(E&re%$Svzj%AVW}F(+2x1o{!Z%loLV=k{3OCr@bvPy0c? z_rCwmqkXL++qo@Tt|PD&b|bK%7cOo&2HV@ojj=&yYm|liZ5vmuPtiO8`h*5n>tDTz z`_vSw@p;(YZ+93B2vJ3dMgQB>w^4Ut&itSQyq*OQxr0CP17F~3=}Caok9nE4v_ zjaC#r$R>$sQK0!+_^m{>>hXTck_j0zE||yrU%&dl9;Zo}oHb(;5a+8mVsH03+MI14 z@1|@iO@P@NWMF>vX1zH6HMu#MF8g z6Kg6@g6k*Mlhb;oShB1i?;Jc6CVROix^AeflDTUKN@m;ECc2%aQ$r&$0wXPA!vvAF z3Uy|1tv>YlR6ar>0J>7!2L?>K}CWIfbgCZ5;70+}1k??N(V1)LagjS(zdi2%M-6xr>T4@2) zr8kmE8ESH+5e^-EFK|!XWxN}@A;A5@eJ3NZ#(K6fp=%dKA>p4`T*R#X_25eE_I!*G z>Ho#OCbQD8pj)1M9NYGJe?07QL`y)$kghwY)xB+~OQpOeWc^i=SfuXV|D`U1tBiFT z{^4IB)?na*-NOTENd-(`$?J~M$0va2(~O+ZtVKh?%fad1-uC`Zg##TO4ZXs8aZN>_ zCfn?PL4(_5D%%#p0AqmQucV+~QNW

UDb*MzlQ~fdqlhAf$=1}OO5_W#P}3peOq~ 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

@9p$+X-kq^=|GDv*`4G2q~zp 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

1*-( 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

-k(vtbXsJ1M!5*in8 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/forwardable-extended-2.6.0.gem b/vendor/bundle/ruby/2.3.0/cache/forwardable-extended-2.6.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..370222f6928cab5a725f30ccbc4e0eee086db3aa GIT binary patch literal 6656 zcmeHLS6CBFv!)|RuhN4AM3In$j`S);x+XL!p%WAcO`RuKdn_;oR)ZGrO}p@9z6NGwbf)ZEJ7qZ3}V=Ao^Vb{wWd? z5=8$Rf6A{TSXv571c6F}A>u!$NkNEyDiRV9A^`Yz9q8ZV`k=gRy?!3a&)LBN`R|Tj z^#9BMKe_##+%L=jQ%%0;OGJ?8Vaq$K?cP`pV1dY)bkh? zCMPl^Ne+f+w!L*5p;X#33zrv|!o)^)M z(34lP4tC%qO`riBm(3%~6;0o|1zEd%SNv-8R{!OR!rgc5b({e2>r7}xq}1KaxQ(um zIX&fAp^=0Je+`Vx@R~wnV34MxWoE|kG50}c>T0mDv(YI*2N9KgqA`Tk)a5}*MJ#MR zjKZaerol>#@=7M_1(JdTFivaa2f33Az63CVSbNJqfR9-D=t{T|*{|>Lzq$XD0soKu zmjp{o|H^-HDe*u2|MjkZhy6GIw>ZyDX8O_Dc-T#$JKORCT&g*E`F>Q)r3bMe`h;94 zuEYbg-O0`JU+FXG%(gZ+=F<=K0L986W!vyh!1{w$SYzFzRX-%uTcNh1zv!Jw$D1`U$@X(Lpv0v+nBWWSmu!jbwnk>po+HvrddbaKxd-5q?L#@pz z<^9iWnU^jMzCDaIuD@`eK?yRaz(}uOeOg7!JA2trB1LklWT$DmC-`&^2BMgatV4SA z%G1{_7Egz#Y=V`5+?{^MM9(JxiJjX@E=q8F(G|4E6_y@j3fmH6Ms$#p-3!B2JJXRp zD(a4Rwh_>eWT#py)D)4yp_s22Z!&hU*0^Sv7V$^mWkH&H3Wnv;mBTcDV&+9-5-Nae zANOz;Jkgyw*1eqsG~#Qmwtsd0bDSAXgRD z^oTP02LZn$M^G9_7PJ?Zdvgs{nU^IF@$4MwhDbkwFb}pwqRRu{Q#f3q?g^o9=diHr z>IcZeFBA+X)yN*`4&Wi-ZfrJP^UPRof%F9WuUQcg_aCI?9SOHULT$v3Jl9@-M`$l; z;k7Sm$o6p0-2qd-seGzOF}UA`5B)ZFy}r}3Q-CUL^y&&jER;m{zIxGZso3esSXt*M zr7;YND@M;a6EYpr7COYSw@h5g(c2A+^)#fZw`b5@?FkeU=65Fz?~hB z)(Adc&8u%F)#{*=I@PO~D(rfbL>7?dFPTo=%hvy(s>=qMgYhrPlna|e3?7eZ%#2^v zIAfdmh$g%xo*UBMRhyH@nT|kJ9klo(xz#XVy8ZOF_%fQuhcxIJI*RKa@nKLT_(QE@ zi>e??isjwaywPn}9_9?E)snnW#0TG8AJ182Yk1wWPdhg0BVBgH&kyC4X_$@g3BV+jPSFJ?+>4u$l;z!{v@WTt^siMa$N?pSG&CV>R>V#Bnt-<{8a2c(p3Gq?&ir zTZtbSbadN20NNtE>Cj?jI%UkXv2-afEA~ScT zL+0UxBFbBh(VK+!i=BXT>!aY|F+#Jm&qnY0LBOtQ{F%oVodb?cK-DRm)Kd5~RIs-@ ztQ02ysYjz|Udg34=5ed(*jSu8UeiU%1arUQYRO(6nA9*9*1Z_^cKxw@$!P3J35L}_ zk@MvMC-HqZNA`y`=A?|SlGLNTsvC-pq~r;JLPzF`rHc7)!KQ^_bKIrVqyvZWh@g}y zlZsH#mQxfVt9fp2L-lNTmxsG}Ihcnq%tSCt0!4@Si?Xf37uiz6Y-teD4E{9wj^Uij zP-mdJL`^tuc}2f3%hryFmkMc6{)WRwR&3S+nG@2>gI=~ZxSQ8opSmY|sLtkNU!XcW zD033ec4xFRN%PK#p}_}u6Tg{`D^q!04n>FUxw=P|*-+ZMmtwfKR5Chc%=+{DL2nGh zOb2ZMqe@)2r$@dS23W^Z#-;aa+T(<=7Xu{YUd;@xCtR*Md*giObQW39Bj)&kOe_d4 z!%ZvFd3^cscT17216$g$x3IDYI}~p{pL~5vvtfsob62|r>Njjl@e1QWbG9k(S+HBd zLi&0sGR;4dv6|%vHl+Pf+2^>yOfH9UF@kG5DmMHdPMvRLs@&t(mmMG3 z9AxS{r?Ms^aoZdII7L5kt`8^X9`guk{yx}CWz4D3Nv85Lp0q25&-?u;MzQ0u0^iN# zqFi=XZy#HiCSbfLw!#95GuaV-$`c!q9f zGc@$Q{v^c0w|UUvx^o?;(Jwr^dHiIKL_`dFo58eJIPAjz_I zdrU~A_448?Ef!n;Tv5-#WYDeWo@PjPxe7lHcVR1R6}|VO4Y~JJ#bkW9;4Np-mDWg&Fx)tXpk z^s^0wLz}7U6z;AtqB1J`@|%6WSh#;V4WYvt zBx!k{0gI0dTn}kSud@g?$`F6mguUEt5gGm900_J(rfC?ZJFm@T(mW8glP>#v&wZCA{h>UYbX zs8hj5jLkYyUS4Q4`JI9y1)u$Ua$s)_;nd>617~9TrM26XM5$T%qr8_vkkr?g`V5U!Dr|FR)IUr`4mF#f znH2wcbveigt1TmswRRt+xDhTOjC}BbEl2aHJ`a#aX2cq(Odk7L(iBh5<5zGc|9#h{ z0%L{d<7<#ou1mOrgi$@e`m`7io`%7|=Hfv;p)%OFsW-k>1sST>b*j2;Tzqi#-~Q?c zDs#15Aa39Yfq9y>x>YzR2egeH!@YNVLj~9=U(u1AZNA;#x({g{dJ$|IgB|xY9VOu7 zf4m|DY@CTH933;RhRn+m=7Xv{E)4QjA8j7AuF4WD&O_(QZVBXC?tK9_en$xot~Q>u z+!rkt?>sTL-gFBpSv!&bS%VS?q(pSjDqV=Aen&z2C+0tj0K(Y;;fC^YM}hop-I2ei z3;fsD$p7~LBLR{8rT>$V0z?1wfB(co_`CmeNVuM8p~67kppUuSXEagcT{8tnW#`-z zctORV{l%KJcMTK6o*v)3e7Lzvsrc~dH2bmtkAdK`i_@lP5!T^a`ABZEF%t0!p2PcE zy>?TuW##>qieocShC0%+Ac9M>*?N|FALjjonMk^xbZ&9Uu7$ttXIzj z9%k=xLgwGD3S_O2d{@$Rx#+YSl1rDRE)yuXOv3&xEhf~!E z#SSWcW{SyaK3~wz#Y(oHea2{VD#k1?c~TUH5#Thw64y+(0PxnYwB$t6Ri`P;XxA=o u?IiP1B+6_&+tpLH?_{O2^FE~viC~1iCjKYj{1pW)ULCf3# literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/http_parser.rb-0.6.0.gem b/vendor/bundle/ruby/2.3.0/cache/http_parser.rb-0.6.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..3d3d508f71748d4a96108b857f7e4d3d641f1446 GIT binary patch literal 177664 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�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 Ctr^4s literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/i18n-0.9.1.gem b/vendor/bundle/ruby/2.3.0/cache/i18n-0.9.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..c8cb0dc54febd087f0909913ea56fe6dff237899 GIT binary patch literal 60416 zcmeFYQ;;aY&o4N(ZQCYN+qQMawr$(CZJT@kyASv7w-5VtQCpjSNT*WiN~*g1 zm+GW#Oq>mj4V(?=%sc`9M-jt6VrFIr_z(X_|CKW_F);%${$XTeW&6X-#>@u5!1#xm zl@Wk|;eV7v|NXiyPR<67|6Fo2H!-pP?-l=L{{N=`zhe7u!TlHW|6N7=CBU z;9+$sr%hIbo=3I3o+A>)he}$r42z963nmvh*U~UkCL9RugfamDQ2tHH((h}X_@y9} zzLL^4yoj}1;<`1RE5mMenlZH!9lJlxKfvjeyZlL~uUHtn_M*6IObJZ^S$E59OdcRc z3d!I*@6};Qf-glTA2uD5O?kG3(n-j_vVvM_)JBiS0yp>qiMg7pS~y)wEw+^Je>23^ z4&G8Z#dPmQCG2CpT7Y$wByLg=^t=2$leef$0K(j~K>YSpj??((b7|Si+!{_Aj>yR0 zvKbg^^jVI}w!`8iBygE#(kg4wE0+yD1X3rvKBdw+@gKYt1Hm)`jd3`e*vsB!H8KsWpW0hbEgg+fAtfTI$i^u&*mX#Qw-%0A)cj3N7gJg9OqG(gKyy_Mbs ztf^X=;PmSgyR}JY@C&u~wGGO3-T{936f2YFF;y(Hnp8;aVX9xAY3AAai1#%DpQEn9 z!_rEZtJm*y$^IT0JzdvE>FxZuKmPoTfbUILuC}sSC>=O~%8X9zJi%Mk4vKi@@Q&_J zI&;9+p6suW*Pf8~X5@C|ueg-T-npE}{LOftr_fS*@i!x&8McE)3|CMcWt=p}6#3?e z)yJ3^;M>HAm4L*>6`+>pID3bf@VT=f?I@#W2xrb17aoJJqs1#XH_9~6Q}|NCaY0E! ziRsg9GR6Nzj6IG)tAA%~D@Mh66=F1z6;B^v?czklqL^dVkg>rX#JjT(9Qz7j*0;GA zjyY;*VC-=L+b15BeGV}L(}7EuMSNKzn6^Z~T9g1;u9#a|Lte!#Pk47`2?#NK8p`Wt zz;Xq?GDihvS{f#wVehwIJAOWP$wF{;8JtuE@YIK5uOqK?Ve-@DfEFUPHm4@Kje!%5 zCv5YE0QN=S=jSCgKDG!JRu7?f`juH06=CHrn3gWV)5HxvnK|o&py5^S*S)a7T;?7; zqhjUPi7KtQTY%&}nj|<%GJ#kNvxe9*t3_ZhszE4{_Zu9{h=xHTdNSY^5q&0t1A}F# zz+k+KH!_SaD?gzYipFKRDPkSk?_nRh(-4ZA6oSEB4WqPDhA!Eon=BABnyZ^Y$ua&S z;FeZ+@}ikbHrP?1gFg_QN2>I%3_2rp3*9TX)&wScQ=rN<2>uRyeE}-vOMHtP5bM8d zkee@8b-*~f+JvyfMjUM)ia&PO#JXHWyKYQeEeJ#wcSV6a^uT}xhP+cotnmOm5 zq`J9qy}rHsJIw2NxH&dM8?gsdd-sX$*}z54@qT$LOr4b~b?HrKbLY4){nwezdl_8Y zZ4}@0FCA;gUj~-jV3Yk?&|&F6+&9rBJ_@U--Cs8}?_D|Oy)#gs=TY@Y?pm#Sf(cPi zRG6({JEm`(ta_-L(`B|ujxPd+z`yr294ar|-Lh(xLk|WF9b*5m4nVWBti_8aq-#;x|kHok!U58hrTV&$#l zP5Y_sX^vNF7(D{#PTwy38T>cXZhOT^&*+9dj7zBQZb{DfqiXx~O~``2dYnhXcf&F#UNf_&fu= zll3jZjo9C^Q!$0&4q_{1>?Lt}s81p=96+NK(%8c<3d~cYm(!1D&T5mQSmwL#PAIsUP&-pIe%gBLuUvXQJxE1Ad*5fzPJt!!Ttkq ziQZfsq1C)`1Nsp>lWIv&F~%#BS>g+5_Zt5$@Xp*Co7$)t+8*pE>%!9?4 z?YNelD=3Qk?icgdKlRW2RXiWk-d*=+zKsn(*`u46TwI1$TGrg&UG4S0y_BqY+ne5w zeuwj62f$^o=2mLfw%l85pn08IK-kH7tSk9DK@)?|*IxMjv(50VtZc4)R*~S?opA^! zzyKX&c(pdSwp(5e?Jcx;eCxhl&5dx=yS3aKo=x{>{j5z5Klb1AwgAs#ud`cB!IfwJ41+MDicD6gw{ zH9l>!%`E^EEq#VaopOAdr6lHdus?2gZbp|1pyrNtm-9EQU)F;3t!^&Ma%`?EnT9rA zM&OVS`d-j|#2on}Xn+BpaVwZmiJI)hKq7aqN!czzli$zHGXBj$Dc1x2t#rRX`9C(b zwcCDecrc#3`q+PFezB$O*St=Dr!QCOXMfr5+00@;Bu#E7cEAtYc9FU4nPMBiKNND} z8de4b*&~CvVRJ{>}@L=IbwhOHZLn{PczV2kf*8*j79~((#Uie1YMnQTn3JMA$K&BithPpYYB04N$^A3Q6KL`@s7V*W>cF&LhqQ z&t-$B0P!Na%~AUOLOp&#((&0_A)^319|?da051W_?^FPJ@J+uTX82vBv++n90QT;< zui}Ue!KyO)J`o~P17G)0@S+Lofho+$`v|(t0n!!xvaqn0Z*6vVTc8Xh=%gQv0Z8kJ zf@1S6#=l7nZBBPaz>>Mn#ONX1={X@rzqx~&X4-yX5ae=V#O^Bb;W)b)fNiJGwdtpX zwqxDVvT2O_7yuIIDS}NCmyAW}JLbcwZ~-Mg`hNL!pNPQWA~WC?Zx9JqMW~SI$psT| z!wL}zcOg4x{U7?`Uq-{ilAZOHzI4|>dG9OStrv?(=U0*gML`LYM7tqz*M|at=K9|C zqcoJP`Py0?osQ8ETkwHDi7&>(ORav3NE_`QAjH_?9pVUx-d}m6A8g{p(qR@?bg6pjaIl>>}5vr@6j~hH{B#6)LL1@^%I#-6fuFEouc+icw zN|!yutqJPl*`>C#aElfXna@qbM@Hwz$=M}Da8-e%fvGl9zct^ulaO&$p&62;jTjFm zQo!p@z|s-m4c=j|OcId6A%oJR7wP(@^&M{aFKTQmn=&x^4^R?y#2&QMqp?JRS!3Hd z)~xksZ~rh-r`-C!cBTxP1E?!h^m!(Si@5D0C8$v4k{WFQE->nb6G%8CrT=B;N!Zwx z88kyQ@kZx3nl&hK+HfO8zTC5cXgp^k_H=-H?1V>;qF{%~BcZ!}hh4MOREGEs(z+2u zJG@yM*%jD$uZaRbm}mlnr(&n$+Un7Fxx#>vNV$q6u0~85w7<>~nWJ zFetMla6}K#3s4uESV##rFH;4dqrh~e4(`cncTSiX5Ez;^X4Xe@52ky?bQvFPW|q&a zAqwwcQL%@nXT}ScBaJ9uWuOt~(RP)6ta~5nN>Q@uf&>=cDyyTS`6(<)V>#QYgq-9m zCiFl%K158^nobW&r}IhB2{X4v#?ngDKOaN4l0P2`lvgN57$r2aFfv)y&HIb6N4AV! zr&+LM+bOGr&nXiBmLtJJTAlF){gPJ}qm>u_U@O1hNw+_dlt@nFn(CSeQ}fc-(}u=NH4!&P z=w2b6H%>O|U{vA*MigFRRvOHf-@8z+&E>HBeYX7M3vro5oy&tc&LWL7e z&m2MKhExd67{S2QuJj*B2j12w!R}c%fD|bPY_@$MLJSvJXbcDuTNhH}omdjJVc9eTVRR5*!KY;i6)|>G2#aZQ>$((%tg*W)7*U9-!yZl96`CT~v_yw>3 z@mu@)jrpfDYX6~s|Mi2o{2hVM{_W-d^}|{Hjgk8K#UK07>)`&SU;U-7`u&eQ@L@)p z!`A#`N9TF@yK?Y6{2%LqQIiPR!L=9S)L=RaVTR1*Nzwfp|PX~)rY%8OW zkKP{V$CHNEpIUl)y@y}BBl?&gwpgV#fR6DxE?ET+V*`X({g_J}&v!q(;xY}T$HZn< zy^~Xnu{C&Ricow5_5@V$+v}xgu9puyYJKV+;|6YZ;E4~%SK%I%|d35-~~*wBs5%a=fNuM zmpWJ9WU^5R`shElv{=o!Jc~Z~oiB&Y+uP6AV*bYin{slOPNlN0cOFRam&=Wohh6ti z-uZ#uLA-ehlL8FUv76n-TjyfegmaV^&7EcblqbSg=}(Ea&`{7zObJSr%bpmqb*b#A zW@6K3W(VfC>%2|csz*3fNj0VMA1Vhy3{emVS^oVq>WtB)1L~HIOz%KcA?A*B-zbK! z6fpz31X>$b`(w@RLp|(VTBQE89IFW6732)c8)L2CXR17a287iDUg5Z^qJi-J-X*M z6>Ze^G|iE<2vo*4K+R(apb+(#??QPtwyh>vLQ7$wV50OO_V3gBH}IRc%XVkY z%~7@`loDOxwHmn)(Y zOrfL^)*2Otk$d3eNSZKGwhDtBcBfQEE+vQa`CIWrEFAa^G>>criZ{%K>M04mu={gls%{^1&lQY`eDNXYA7PYgWA~{Qb@;zENq1AvP+(Mb+AWxmL3Sg8nj0+ zDXfFOj@q2x^H~z>?gqe@S*Vo_%^j*6HW9lQzpzcTE$J^L71*A6eAV(-3Z8l`-+K7- zlYk3&7?Zo)%5`w9`~3Cw0)zrj_Drj!3R5-%pDj>4o~5kQ4n9G*cu5i~k&c%rQF4)| zOlCssr%Fx#lmzn!FpH_7uV!xt^C-|$cudmYA~|l6u=ej^VG({i8bUDQiXSSJH;%<) z3z(SCPQseB^&)y#Na($g|V;e%P>oEZ@m;jlXz z<&3k)o@IDQymC3A3ebALf8WvX_S{g+^$3Rg706?f1H}bCnu=TfywLLjE2z)!w4ZUyPtr`{jE;Ij|BW223*HsW z`gb6BQKqY03a5zZm&hLjpsn+He=uWQ`KU%>$YmA@sd-i+1g$RAa!b$2cz%l)Dr!cP zsiSNY_pCKBP{rUXSrW>4q`@^LcE(pEKW06Hi zhs=9udUR-PZVwR!4GwE-E3-^`MKSxSEd@spriO;BuIO$TlRwms9Jk9myrkSS`Lr29 zFLo@L^NT<)&}wxc2en4+k-aB*bckp-hCRJM`q$$pH#5uUNmDy@@zxb-iG5iF?FzC{ z@I!O;`zWJzr+5Ie-4YO!AKn*tZr4@?EcFOiu4p-yR=H3&CU;_Qa2K1ks8)liQzc%i z3t%%&X)vP-SPr*=>)o4!o-%*LKX0-=_Qp>}3!Y*P;&M%!C(sr{;_37|%wn0)i@jDB z%%~Z|GLz7;xv#ZE(%p%`x_sZU`@D31lGzj3|G;RcpL1pT2$;(Vt)CPS>_gu!w7lE} zeOm1ZegnKRhS{z(%jeR0M}Z`dg==omgBvPgF-ffm1O``{;@f!xh&jk!0D(v(Dmcy- zxwIHfjsSo52pgpUb`H>)x+4_F!ymJTqAf7LD`z3v(QUFT;d@mJH8IP*4qsH1!CD@~ zmhnmh>nA${9(BFURu+VCXjrVY`^myoZ>nz#qJ#!)7RH=mgy9;@)n)@u8AR?w)LDy$j0i%(pydu~m&#a0WN06D*RBP_)Gbo zd~iHW1vD1un|>^i)jY`c9OvI{*Y}kFq`(B_X@71Rp+rhGXd&g-VCjm2Phk*;WF(M7 z{hIKum=*qRnUI%^RA=R&DwLI7UXev)mB@^!CRDQH60;sj5 zi`6Y}c=6{uOg=%)Cn z5K7=1zo{L0-7fFC z55q6rdpUF`M+cz7jvUZ^f5ZWF0N!X1zgScNfJMZpKJ(L0c-DP|8u z_$#YO-luCL$$?5WzdPu2_#ZN_m!RGNqrJKfhLCeGB^@ofq$>@Gud1!w?#F8uS>H?jFL<*gMmKh&r8Qyw^0^!v zs&~vuRHcaS=V>=;j+Yl0=$?rBDG`D;_)L!8ihJw*NqBPHXtxEwiT*#(hmkuR19Ues zM9Q;JG`PnOOJa6?2#V($fO{hxxTl^uZRQjjtf_Vd!EpSJncX0`S040;mx?GCj?G-= z1#(?~Sl}8jSr@;)_l)Q0rAdnZ8jwBz5T2hNK@3buAsvA4f{!@hs6e0l!JbPfXNTf8 zzK?03BOD^yZc58_i`XrNGez8HqiNk-P#pb=&Bf&3l;q;*v#gwM=1JezfA&5j5oe{q&kw97Yj9OTLs=tQTt-bjg;S`;(MW+S7= zI*ZzBj?B*A7PdQ~o%WX7u;}>?x*gnSu3|lUdAMf$&Vs2&?`9q5omMmHhxWgy4I*7V4dqC>IVtE^pj3pYiZs}IEiJ=L zbS&O#7RAwQp?YX{eR$+FIi3#mselye8*;O|sWzW%UNh~euX+j*G zngPb4&w*l7eMIL|F-Dl0 zqdmwdF-2BgUO9@XlbJ5N+vn2Fza!b;#xM_YjsWXV<(v6TO@B8v^=({{6QM99c5g%7 zl+^x2?NkpPpx%6VqiT@Eklg{PM#tgJ;Bxeky5+ZIIz#N{i^_sFW4F(w=7(DssT?uU zs!w^OA_0$VJL>h!VZX59TMXg5WilLojMIc;q(1n3eZK8-2c(|!U}TD?K0|$^?&VAN zdOu1EGOBj4y9wI#QVu}`gXH09DuIcOyWvOdCF0BrA#8DKQ3cyeH224S=GJy6XfuB? zu8~}p{4Bg_uEzS2FlWf7q20+Lp>vjNY7!RDXps(5PllQRk!aj*I7BbgeG+*9FNK0O z$!useA}iYx5UyjZyP;d6GLO(VR;@A6n>0cmxWiSnT1qa$9xr#(M>y{-O*Sv2Dcq#x zz(gzf`CdbKOSMr2KK>Ev!s)(62#Nr}<@D|4wPDU9o7ua`(y9*n2MPZ(=9XMgN!X@Y z`2&U-`gN!WGokILG>8DfOvrDT(1?hcKMX!{mo8E09c=IT%tj3Ho4ngK|&L)#XD|gdNy!Z`E06_RFlA2 z>RZJ^!`-VDhoj>nAQt_1x+=j}&+u)kT`(5$jxCJ>_Z35T2aTt}0vgB%JqvJ2`1A9; z`)kb!x#yU?xR38RsEqt;ZStcwa(co8*^6`gH;*`pi?^HbQdD*cWp|3SH`Tp-JtE?1 zKOhde2XmIN+W0b|aJrrSt*B|U?pfr?@R3i6D)kY7pc;wjEX2wXPjVbhAfVMr`BO#8<}#maV4Fr07gdWmgwl>GE)OW)sra27I9a(C5ul zD!6u;dYaBATj}btps&g3xu27uiP-skSRYjF^f~af?)rB{O?0n@E{hw~@)6nZhugE- z?ym)4?}?E9$4_sU^JD1k@8L*{)aNdn^{*Ea+(!>=?L$wGe+eM+pIni1h70;VDMqZ4 zmbgKb!fq4LsNKZHVYVxj35~Wp<@xR7;vzdI!x%ird(m1FS@XoRQTcrW$AGoq;tY?D zR12oLIZ>Zv{=^dfZ>p+5FiC7)Ew8rnf;pXGu{E$x)?8xfu_hr$xgWs4SZF=zull8t zDe{Vtt$A6G4Q{9gN$=M9;1O&uMPa2(>ukEmDhdCB8>qr4+-OY;c+PaIcGZ;q3Lrl^;IJv5p)2 zxiv7lF_?l_9C#RuAHWf%j+$6p39QM#4X;3-~Eg$W57$@B@FUd?vdP`S&;F9r&yAXld!c-7+x zyLESPug+3{YLs*FVr!;~0+RujY#{qcQfRG|yDuB1R&_mIQ3BfH9#Yc$*e_&CLYtHs z3I!lPLBltG1dPbfWsb3FR72@E*VbFVTQezNVfy?OIhMOt8TT*LaAyHvz2w^^$CU%R z43%c~+}A_kn9RezZmLiYjxD`{PW82W)TEb~57iX>T-b(CJ>{u3RaV9SOem)GrXHUQ z;K3JI$;@L;LU85#c3rQdiAo03%%XcMo6yGcUoBj!i^Dr;7GvT^qa(C5h(A3YH%1~R zOS)@9cf`8#CDeZ!q_{GBB#)pic+avV7IlSs?aBBgnD`)AOz8By51=Ft*!dkU-g28v z>R#xfx5O^=pTh2VJljQ9cxMu%FnW%);Tuk=ecjS2qQ-Lmq|GBcl|E486>JuLW$8%- zRctJov=Cn^AMV<_O1$&ecXUue9z(_4?YG9~p9i@9Nz@$1?C}c9nsNk?n)UMIn)6uFdv8ToInw6S% zU(Ff|qOEe-Q`eaxpeC~*;pUhzBdbmGUPIJLu+nQaCQ6Y$38FIl8tjR(u~)VopxLnP zH~y_~QXe-=pH5$U0bcRePbqKXiwQ|zN|hUft`BH464#;^o8QUw6pb0l@fFP^TD^7g zoV>J15`ab-ls^oQH-e1REz1_ORX&QB0wODnoi-InYBNrC11zEiGo{ZCL@(BMpnXg~ z@4-)R)EpqGWLrQkPnM1=H)T;eIVob}kRwb^cIxIW6Po9{Prjs`WgfJEA04oQh2M8g zY>5z|t{7z`Jx@(S;bL@}d1%br7JauVF=h!@Y*>HX{v{O?dEjWQ3MQk?9Cdj8+iIGg z>0*5eK4=~fb4W)d5ox9qts*&UdEiczeip;uRQ2W2q+B%48+c-&(!wBF6kKDg+E!3- ztFY8BOas~o5PuK`vQNn&Q}Zm6OxB^};SNNMDOAY(H*WqzzR(B|8LV04IEOq%fg87s zqL6qK4C&UnpzzKkIyD-P8EzNKe?Zxm!@?P2cjFu*1e5OZQ9r;S4nErvT?GY7RSXC0 zBtY;|l)eOb7}jh=rLAr7PDfc*=96`XHNigru4ZP+uvT*791 z?YE+b5}veoH?vBXhT(RnNQ&WRk5A-p)*vr3?0Vtord{qp3aiLZkBG=zYP#UY3H_KC z+=(L528&4$zreJY_YDXkqEs+B zOqKTU)uIe!IXAV=G=;pl&Fz%xAA^s&O?Ku;0{gUb_fcPQ8v9J=;rF!~;EN%o!iI^* z(1sLRv)Fa36X61G`oR&tdQw*rvg|n_8LXj`_PD-PtEM_Q?g}{#&@cDG=80`JoGn65 z@(H#QW6&pP8N=c3F2g*PU0QYK#-j*v!GVFwumu*= zfXAf$MgvD~Z-DEooan4eVyfW_@o_q$zkY6XU3(}Y{AI;~``k4dVn3(^vj=vSbe^GAx2FPUF4q{m}SYW({2TXhtV&;NrG{t4S zGv>id10lavM9Up!R&6#g1kayfj%&I}h>mYGjfmnZS7~+QpTV42pZg^>Kf@n27B@V- zXr!(8J*$dVM1SO32@`u`t( z7Q|uFLQwu4hDG-xk`b;%6IN5BS_U;@Qr@2Us(z2jFHa-|QX`Y%QK2@*CG?#g=v7Yq zXuMncyK`YYz}d)EYe{-tPb<4H7BqhId-`tl;B48An-Fpv&zhRlvy_zW`V@#ap9pg! zIVguXz$IUeORM5)Ih!|@mYu&_Zf$)7^L&62X_h|veA^l^e)1b{ORjo)hs3=OD10Cv zK1UF>S*^nhOuEqnfICs5L64S?hB4rWh|?U8492)Z1tEQt_MTrc2Su`r&_*m88H!85 zKO@RRP#=0l-0z;KeWqu>JDNQngR8$C9*;~vli2S{mb_JApfKi+S@~Af#)$@s z2C8GSz52YwY?XTHDQ0CJZ!9xZP82nf;l-(RKE;rzfAq!yJEx(<3VpXsN{+k^)4v>D z4!Fyv0E2bRJ;cd^)|dhXz2)6Ws;iPCF(UFII3jwChcu#)2{4b&Vq`mn<*dt5`bSzh z9ZlwmK!PcrgRmHOskH1qLLidB0N-HrC4WaWh(Zy)5GMK$TmkUDU?o-X6`vaGSnwH6*9Qv zyb_9=>t5V}HR{?GQG~O(50AviZ2PwalHD|l$d9gTm1%7IXcj@tV=l{!>VVkz?AG>cDsm zU&2D~@M-#(LTfo1kB9$of@f5ne%6ZN_fEz+6t=wZfZS7t2@NM_&mey>Y@?W$ z{A8nO0ZrY>108P^&{$6B^%AjiZO4Ic*LpD#+>GV8w&W$2@KVrp@iC)n?CwT$AWV;# zt*TC?!u4!%k$LzFBCJnU_%N<8gw? zQ*XtDgxWzAA_a&AOR9%#3`+Gs#T_ILT+M-?#f1Q`Q{gh4P(v*+BR5;e4Fa0voL>2# z%PJRK)p{KGjB(P*{#*s5YH$i6AEo78}%T!YSoQdItpX+wIe*+pTH|dj&W*8 zpIiusafcSH@+fx*)yQHR(4SvGq0n6{+BwVfblNXeUxI9INj zo;mZ$)1cR@<3RCeNWxMY6Hn3}6Z%h%vd_A(Pys=^rqJa$m8$MOi@Ly_M`Qcmo6d`N z<9i+sHIZ{&UdM=W#jW06xA19hzC)}e>P(e|H&DQ?$Vj*jdU89bB6W_|;Y+qhwGJ!Z z;XxZ9chT%?pf#eSdhaOi+@?v(N0>O^A%xX;SfZ-4f~Fb+s%^(+!H6BGLwSx~@dtXK zjz^8vP_~BL{fQGS@Oa~n@ETcU%ivLsZrgI zID{8|hiPH`u52 zCk~>`hS}IhdNB>o35fKWlTmgNXYE*@WO81kU^nu>`@|hIhX&kz5PXD+4o{tB@~jcq3rRQt(nny7PpDWh zy3#>i0>&PO8UmF;V~^}szNnny zlx3BJ@GlW9-4y_kj6(DRCVc16V!S8;YrxmF0C)5W{9=6IxP&e2xJMq)OnsxHHkd=2 zAwS_G!90A}Y+1G!iNMs*=(vF1M}*l3<%~ix(~St>D37CYjM`k+s`vqWjR!#HhG5$M zd;~}BI7e+Dq4wI2hOK%^trdJeOBqKj2%_w)#bi-@(hGHq7%o+?D@R{4&>?$bRT+4R z@^xUOlv{nn7GD2aSW)92YHjK(4T=|6DaV5zt%a9ib8Dk!B?21me&oW?I~u&^MUrtD zt<>0(8IeB}K~0j|;5W#v0766}J}=%!oJql%J0Nn2q2gD)ZYp)?qXd_u+h>wKIb6HR z$%NZC-QQqh8ZG|{sTP!HTE(=W?&F!|7g$DM=ysXAsj-unYV2t#$76FVMEhK~5UpD5 zA2JyjCV1fV8n5{HKls~gUGuNInQW=hKYV+SiNC)IcfZV~z7lXarDCSqk7PBGe0U}H zi(U%=8p7$S{WvRrn!OlVwobdC@31kTuaP7rI>H({Z4W zOjAYAa5^wSqYCBXps?8o1ZD>>D^U^&=7g~CQ47^0UuDRX?#f4`m@`A_oeIU|j%3{r zu~j)1j3D3%IH)_*GSo67VPdS*z~oAi5EV?3D}5^_8i^l20;g**BtCTOrqvx6h%ooc zL|w6eD1(zI;v_ybLhO5?~VFDd&xDYKZR zOUqi|>zO@yvN^>bsJSy-;rc!o55`&);>Z-S)^2jSK;I2T(m8Az*Y=ra%GxN6MUL)a zQ03{_Y`Uj)$?@+~##)lSl~d}MkwEK0Y)kx0TqgoWR(7ApN_37h9fOqAp_ICd)RmZV z20{!EP_i+%FM&Sh^mb3jF0~atCSDcNS-i>{yTW7M1vYF|7TALd8vUGxzVN1ut@_#1b6Kl}i&NFYm;NAu5W3$|CO!5Ai>Nfk-6|j!K-uR;W0r9vAVQ%I+UKP>e zoJX3aUUXHn?rqjB`&8zG7v_}1ep^zmWx*LeNCob35|oyK0Jzx}m4`;N2C zT^JC6?@^ARYxhQfYCX2`t~pax(oI7Zn=A*~>``jZnQ+2IX*Uz1WRL8{Yo zt=GVU1$!%TaHF#bTMeS2+}Jb#tTAX*(UJDRzokYm$3VA=f!<=77jT{Op2*7fP{E_4F0XNH(r%LE-^(PmW_4`*-QGsV}*GB;y_$l)Jz)UhS^9-LAyQiNz(0bn?~zfVcURJb=yZotI|0Icg0d zZX?26E9O4nO@-$ym0P7E-%w{d)pC;!$E{*Rw?H|>mD?IP%`g0>^z}N5;IgHVkY~ip z7Cwm(Y!85_#pDFF8sZFKrG|){cTi?DAPXgySdU9~_MV4qt*2e9g65V^n?a#xE@aV< zv26_uMLNAXy^?KQSZDiq>M1xSDwVK5 zgqEuME^OuPuXr-)Ap8Ceb%gQBWXLgp$^vDz8hkgESL_H4Ff3?qKd;NR`QKW#CMA1c zF0bdes8~ZHwD3B;@J^wHU8FJ5k8q*jg3!f3f9=U?#^{d~|5~!n*xZ&U?WI=hhh#6G z>=-UK$&sl(OCVq)e~mu?%=R6cY{B$Sz$tF=HSIY_D-I-H=MQc6SAl-V(40m9@owVp z6({yv_5Mz(#j%zCdR>0Rp#J{!dLJ_VEXGZI_Sz8Ca7@G8RvYNyhu-;3%bOl4MPV4{*HT=_m>=(QBf_UXQu8Kn@PPXb?i6-+pvu>237O-Sppo_ zerJ{Eabd;Mx!>03px_IGvkF|QV8IG-kcl$Qz2s+L)!g%J9ps42QxMyB;TIwqRb`>v zqr%&8tmQK>Q1ZY1M7+>Ub=HuS8ZIqgFL1cJt>D+%)Lz@#w640{RP*TC?S7iWPD@nE zp`)iI^GpRz|EJka%ti+T8bsv~c~d3ga54x-YHb3T+#AB%64kjWUmj)XSWsuUR#zKuK{rX#x zZJwbT9RmA?!Ygr!SSo*M)CcI_r+r$z3VLMyjBex$C^gk6VkIo6_@et8n?PWM0_eJn zEepVj_pNf?cGofmPMeuY0u}lvd9k*{9pb4m;F5_;J6V1V*G-oYV*$nXzUzSNVS;`A842pcNm5V9^!B-3Pe;hL{R zX5Rwn+eWi{+87>SQR{GRVi%jHQ(jT192=7}Np2xRnpfldm1xzi#R>@|No@2?Sy6MG zxP?T(l%x{*JHcsH-06J~oL|Uo(kz@%TwGVHWWuH2XteiYuM|Jl`C%n}Ve-H=KEL%^ z`ZHpDkj(#OfgY*r0+a{3ZiSUHa6k{Nedz>Su2}w6=ez3@J3Ec?}p=|<>4XU_8!DC$aOJ|u2ne2T3HuAhG@J+19v_tcag)h zz65lU>yl>3J_Fl?HRt3nE5|A%L^y=m?rzTAo1j%c&P*H$dQrLILqhB+Aca~8@L}Pd zh~dQd2TLon65nqUm>YW@%l0rd*J&&H$-7kr(rJQRPO z#*FwCOXM92q><4_Bdv)pzzjO7(Gjp~`u+RildkLdNnt@&&2HSc4w@V-Pb(S`U86~r z`d8l=QBGx$;t~9;Ojq0?Oh ztgtA5T!r!LkcCb1iiMP}q8QObfVBj%A}Rl>>;X*Nl{3EqCtvMawf<6-V8iN6k#4*4 zATESkBc6T)I^4)*xBP?uQ&Ip%dA4Kxjzb#G)d%Af{#VfBO4Sx|u^=M02;|%(6c`Q) zkakG(T>OFoWA{dgUlxaWpOl$${^?jqlvHpeN#QD-4>yJi?D^dF)JIVzkyp!>-g$?- zJ!NU;36+iMSO-xdjo$-Kf~Z*&zdm?5Gt@TSxVMgq1q=9l(K`PH%ev|S|DREFj_ zsxoKODiiW_`aG+JW@9E7>PR-ja;~B7VL*KzK(?F35I%XFg_LN7c;B%JpZDw)H;lS% zB%EJ8b$H?J5dI4nxp9c%LyeXjZd&hCAXXtJsBapGioyWsw6K@b*Un1e_Vex4hGF}L zMzumPA!7Y#>Gcp=hO^LM>iax8=|Pmr=v?TDdinx18`_lUH+wBH7{5Kt^2H_R*~q+P ztmVg&RVER$6BHw#{X%>%d^(e=fk~#1m}`@X8K=O9q_rr`vsWRHPq8fkGu0nuo~_fT za<;TI3;?r!zO}cRL6`h>xaLa}pi$6aR|{2p7-FMk1r%b+oHFSwE$%)UKWv|_cVjP` z#Z=yVhFKcX+izW*a%pHSlVSe|{Ylkp+e>v;8p^%YW$7m)Naf?f4vbiETw`Np_o^z= z6IqkKOc)Bk9pm|uJoC!G5%SQbWvHh2QB?nFAy~i4c}|RIQf7YyD*R^?@4$ z_$f^IV5O%azFH0r=CB3rx>}OA2k2&;Kd^nQ}IDw7XkiBN@Q=7eA=siQFITPT@D|9UQfRKY}SH&S;t)PZ)f#mW%U!RgKaiDR%pW96jEb^d z65V!m_{uxRX!suWjJ`v-;i`8hZG(!H)r`Q zzsayxyZ|wyxo;=}v1kMI|3O(N2iFys7(=Y&`{SZaZ|NE(n$O^JKM<;WI<#4u&A@|x z=5S;4hUe!1hwc_x&@T4==00U|7d4@fNYi=y!7868!ds}7a*Wlax zeg9#`b%ArVDk#u1IxhkjP@$#opu2|gzK(tgzVa})eyE?s86^!=rPnaZX_A{lYH8N; zRXA4$zJ!Qh)+FV3syGeJ+7{&VOS z=mZ&Q4m(L+eie^=M3KLN7Z)w>wO(!y>fS$H9(%En%#BJh7PB)AeFmXXDKa4i9>N37 z&-ubm; z<~EqdITl2A6WaH+Uo=}ZP0i|3Q1io(|KL`^gY?GyKipbcD)@i6wQ?!{dGqi8Y7*cR zn56^|k_kjxKH)EXo+ZPJX#i*^JaEy-;;w#sM)@-GXT1N=-iZd=7`;tuRBDHe+7+IP zkryfR434HIr3Uh_VDU#9>GxIl3HvJ7o!i@I9#8$vqjLbNd`OM~jNYAHXVre*vg%|L z>yY%{`t#c9bIf7~#T{}s1l`OOVPw1&CVr+5PONPOT%pJGRGkLoE9l!hTaQGCInE=AtVltfEGAg>qLU>32oABP1f$eNQDFcB#b;LdJ9@O|YL?r0R`WpnbMMW1 zjg3Ug>}i^gA}J}JNnPV+jSd7KR!6H%I#%p0qK#_snuN(VbRTSH(IT1^Jo< zFs;TTcF!W+o$MyhPLg|JCmu!=evQLB;sWC!nlLp&bj1K8ehl23Z$hQlb2>g4XA3z( zTj(;l8k9H$!jU8gUEgDoc`9;2kDtKyenRI4^1jUnwMN6Iz+)rD zD_B;cv6u{%hhFJr^AWmwU@IaN6&tTtwlSFNQ&rDfn5S_!GT}Dm7NRYxC^VQAEiC4k zfL*vq9I6#AS03N3`X@?-8kX}s$8YkxxWl@`?qc7N6GNGcHMQyytx)M-EJDu<&rR40 z*MlxX^+(zssS@9s=!m1KLlK?oNJJE<;M|3h3zQpG#oWY__Fk_Y$Ew|m2JIjUa}14X zVt6)LiVI7E0?uOWWWBYAn#c*qW+O3=3L^;XkOOuM$eRY;Qt;wJcKpC8QUDLMKEqfY zAzBd6h)O&4H8xT(NQY$;FNVn=b@DM^#4^JJEETSdu^rg!sI6P_M!;gF6agDMUElp!O`4{47?%)Ra+Nf6%uxFplvd3wGwjy zG<7DKUKFMEL<8g~eEk(xfq+>*Z*!9Pa)!JJ3x4R;F{@Ul>cUtAn?RLlNK}y>k?Ks- zZ8@f@#7uKntk?`SkbyGmL}iF)XW|*Y9xOZ!7Jf>+^<78rL8(2W&*Cd3>C(umEQ_p0 zC44F2DFa;|F0a(kKF}$p zQ~!tJb+T~(A29Fq2KE1!;nH99|8N=q?G5RFxXiNBIFQpIGscOTv=L%0Yw1Xz7#0e) zj!TrS^XO^c(+hF6LS$v74njT-94!!|BoXJ+^!z>Cfjc7A`LCn(AVF$92YpkZ+nx*v zK0;SJH-P$!@!g?zaomymEz*-x8moQ5Ic*`I|&5LRzNX#l1IYaKs@$2a;D_TxZ z5F~#M9t+<{@-{cd)vgpY8mF}CMzF!fROQZ^19^-O zvO^V)FR!--(0+IrHHGaWvG!4X1><_ko&J52aWz!!z(T66dRgIkNG#o=n>y4oz#T{> zjlmU()K*a{$59HDw^!`7iGn_7EWeazS&Z!(=^#*g-2t@C_*sN80-AWqKp(Y}v{H{F zE7UqVha$iv&S&U8J5@T)QyDB-hIx?69NSftSXHtB>YH_It*}An?BZOL9B11i&GvO| zq*?3@qmGYX_Cd2ney9Sf$qJ61!&TcCt~0e*$bTG+KDZ^8b1irim|g%~m);oF(KtH?~l8e;0cQ&4R;Zb9X-)P-pRsJ>suZaRhK zjn07^q!E%CWk788$fC?iN^)dXXi1377a8v;y4Cf-0AP0Ee135)A(ZDUq3V>8p<<=m zyYi!(r14=qgtZI(rP7VBi>^M#d}O^?H7_&L;88}NEG%D;bh8>2AS*!z|lG}aS#PI1qNEc>3QOS+gOsK_Cx>V z;^IW72d^jU2s^;FqiOi}4e4K(0+z8-Z-WDIOrIATUOHyqd87`*%1injwqk%VKOi=c zfFy8^J86g^QP`!323Im)Wh`RlzAo1nPSTK*rrQA))jIda$KK--csS3vU8T;UHPz-w zC0#NCwnsqi^3O#Ob+5%IWbREbNE|{%nN!-dwyqzn!zJp>^(egyxZ58_Lv-OxE`-_L zhV&A1K;Bx!z0LdEHB|6AF|6$zP0FT1(DH1;Pg-9@Dc+JH9ra5vx^HU$7g$W9KyIaB zQmB^pkl05@@M08qQC^_+YiJ*0-YNRt7?zn>6l;&}Pn>Kt&yK=OJ71(mq*r2eF{}zF zDG$*BDh=j|1{TG%XCNM^478Ir9np`v98wSeiWqlv4u-oVj5ELtsoiPRT!Xm-jTSNK#tf~ zluUD{TQ+QKF%;Y!$k+qU`cmFZ>NaJhPdtYby7fW`QOI?D0Q%bhu4%w@e>1M<7TquV zVgIg`?BD8(&R-@EiamVV&!3UHm+n?geP=ZnR?(6U8Zph%RJv5b|B2=QGiG~Ulm_y48E%lMCP3Lj3eO%X1TJ zAb|1dL`UKCIPvt08Jct~=PHC+w48KP(5j>E8GkiQ52c~noUpNiF1ajVKRJxMRzY(@ z%~^Z)ocVH`%Dvj<#>maNnmi)vjx7DBN^3RTfX!PuZiWglP?jWfDkGfrgdlu3(Xev1qrqG65Fi_w~t+D4=>G8b0L#M$L)(Mu+C!gO>D zO{B-Sy?yrhCZRWl>t)YX8&SzPN`<~`OQfh-f^%t z-jUEpf5^3l)~%Id{BX>G5+rue{YS>PehhAez#Z42y(G^pNc3zx829rS4_T}xExFJ4mkpbM@WvaeDw+jyN^#hai z%GdTB>boWIqN(Z7wmkF|qF!pP3)K0t9+{?uO_=GB@{Oxj|9Ia2c%H?1#PO6~$31ZR z{cmaU*3vEi{paS*o0s>$H}n2OhApU(BgXl`{JR%^KiG99id<9o*B`7s+1zb!uRq>g zySM&u{n4(DE_cTY9`_+}*mg7=`0-@-!Th`0zF9>o)nP>8O18FhZ)3v*$r{1o{~{j9 zBUAF;(i=!Y--9tNIv`1-Q9ta`2Ebg0*;nqmi=l9q`}q#{>(VDcgKt+j=b$BJbR`-l z)1-B-LYjScO+w9WwO&Gm(r8`8RSOrUP+s2(LD!(Kb$Y4s=n4Dy6-qxlqsNg+en12n zymMOE8@>u9~u+e!ACE&*V=$l=0&X7RgI=8iw$ z5-^MQegA>4N|TRds4aB=90KQ$4>&f3iZ6yPm5OsqqolU4wa1UQx4yISki5w4c&cC3 zAN-T*>ig9-^qcpCpEaNV)O`M&`TS?*^XJXyFVN?@6K1jcgI~nddsN_;@N=C$|GD}6 z7v}R{n$KUx&kg$g75V9a{Z*6yYv%J`;pct&{B`_%M4$f}Key=f-|LKL4lr{J+fS|7|}1+I;?v{B*$nKbSbC{QuW{ z{;m1^zWMw+{5+x0zsJv<>HoiFvJLl3vnIa$SxwR}&6@b~=S-?u6JP$kN&N*m`yH^q zsK?>UU(&1N%YSZC|Ak5YmnQX>P3o`6R0r&@>dF7*uSw#=r&$tT{<=y1*LtOW`ET_2 ze)(@@ssr}lnf%`{wSLp2{+3DoZIk-%P3nIrnPFejlK7DFX-OQ?=kJ)*-!-YfXHtLP zr2c1_>VW+(CZ86>NAyVxf(H7_KQyU-WK#cF?;&6QiJZd@*grM-f2Qa7mw#?j&3gFq zFHEXg4`2Re$u9QgUzvPb4;$a6Z(0!X=k!f0f|F@Qa4M~ckLmM&;pa0C@ZZQp_@u?L zNuRVh`t#LtNssGfZ{+!-`zxro-*?;x(GSvqA z)i0R*Uo^FT$)wWSsPQ)~jz=^bzM|DJJoLc*vfiV=`W3x%eD$j)_18@5zcQ)6Zc_Qg z@K(ZCv{Dk9-e1vD*``lgASr$RhDrTRllogG^|xiJ1DBS{4&~EQp;O?i|7cSGlS%y@ zllr?R_4j0|1NQe#J}s49`lJPt)8~IRsefQn|InoVkxX^K{;@vGzWNirt$y{VCiTxu z>Ytm`|7KGEqU4DD>c5-(zcjV}%B21ellnhRDlLys>64bnu?P0A^>O>v|I$1ESASzt zX?grKebVyyfe=4)zzuEapQt*A?%%ecQtV`*fu; ztzSgsKT6~0&@<01#U#4jb#rEFuUu#_%K7ct9#uRFTrgUyB|2W~^-AwkN)6L%q2xUc z`bVLa?cvwqlV1{f9Z{8?MK~c0i)0G|!iDs!S5mZ3-&`vwGuUKk0;hemX>HzIM$R_OM9H38#my zALVADSD@NF?1KE3gTIZ)iEY8|N)+0-G8-PSWPMd$;J(69?949F&*PEtCVcXm<~tT=0x2>Z0`Jn|mk8k95#Y+9#zC zRPu)dQwo)abnjtjJ&wpU<|up~Dc6_$u$@WQ?d9#sxx&^NQ>fF%A@M?Smk@%AA-M`U z>Zy8%U41h9nqfbz`RD!AFV-dNTrajlSEqDNt)i?kWr$bB8qRcGRJmM} z=(`ANi_LOKtesJo>1ygsqOh5c_Pj!`B$MV9*2)qz?!Z~niP)@TG{z+o9%78!@BrtG zJlq9&e9bedsS{ZXhn%0Zzt#jPMSt23%}@SX5yIW7Ye8|N)h=1)Kj27fasmDXF0VseZN>l65aWW6{peZhl5Tpq@C3YkJ8i{&~2%0O2>-XaQRJh zTDRz3bT-Jw1@>hLWdga))ZWlLRX9}2*a^9MP%7qRY?NtJxqz-83XlvzsD{JxwSr}p zs(BjO+G8{=rjD)=KBdIAiEH?(iqyHLCJOuO?Ipt+b|6(j1j97WPbN9{Zdo3!$-Z?w zN=fqy28Mk84z0C>%z#vXV5-xyhs#E(pXZl~f&Hh zK6S-k7~h%Oz#5q=cKb0;3N*1ijEOx$>sVzSK&t<~gr^V$f3Z%6X7WIbFH`OK)bqDwN3_ory7}PkPflfNwnUKi?yQWAXF<;6V=gEjhUmB?%7-J z%rq9tz}?mGVbUdm?N8irupm*@sHBK{e8+NaMGDrq zYRn^Is;M6#6O=f?pokqZlJc`rg6V2WKW1@ALSHOwrD?09pB_at4Pc~Dv;s5dd6dQn zC%6?U?hiXA1rutXP2i8`9G(I-oH-p1;YqhjTN9ej_DKcJc|Ns-?%PyguzgI*YRqnk z+``O4;wRp)(USkBQ9F8(FOVGTwTgjf*#9l9tlaeEzc+5(xQzevM*fUSR7EQA_2X_- zzxoXAZBYN5SK5&Y)~<8-rQ?)&2yvudVc5q$Sz*T*`_i(#mRIJZisRi28!!6yB0NYN z-drZ?SFwVHmPVFLVVumF4KPUE!X%p{DbqMTM^{Z+=iZJ4q_}M5I()LnZyo=v==xqN z&|A?rF{wL_*q;6DOq4uwSvv3M7wK{dPSpQ7Va%(D+rNUhnw=bu31lzu)IUo4UtlQ1 zNF3$)sI{;Vd%~0%N4bG+hbQS4zm(W{R@+cYd7d@ zsQe`D|Ieay81)x0f(zbI+Q(sv20huUp9wSe|Hb8HZ~tFjUb^)E^hWK!Kc+!fM}R-{ zw49U&y*BWkog{<1Zd1JV$@=yOTRZEp$kk_4v$e|UTr@-@T3?oPg#L6=g=_K?}EI7azQ2_8r z1#jDit6V0o2g@SMQSv7XqXB^S7RAnmkx|KjQ#p+Dqj85gloTt=|91LGXW{z%@_a_Z zodphZsbXB>y70nYPF^AGDRFLdnfso|m%3Wcp$xJ2IzSx91jB&dEqN~c|8J&{?)tT`0yx~9xqs4oEo)-2#vOc^yRK3>6VGQ zbPcyauYLgmeU#)O7&^lE9qgur_Kz_(!Dp4eV zYRB?MqbZF-Q?z6Mi|(N2P8Fo{7W^mxJD*6C;-oDliZ)QzQ?F!vo8*rjy-@P9aovu4Lq63V z{9Vest4iKAr6@zCD}M$(D^89|(_*uxcz(tPv&s>~Gm`MASw!+8DJ#N9yT&9}NCc~^2Ca*J^5xOAJLIYDHw&X^&jNc$0;Sf4xP7EBWHB8`az+m7I>0XGPT zVjlz9FG#EzG%BTyOOi5Dq!KHd0A9z(k^wFBeqtY=44(~wuY3S!(eBCU0(?P!G9nko zQ%+efqDtrvaO@#)kl_^QWe(_A4DAY|b`n$w{ERbTpHQ{Vp%qdbSp?KfcnGVA^C zx-b7(TDi4&`TqCA^Z)rF&jp%Hk2jxeuWhz>)*r8JukCJaV_d}QQy4X#YxlMu?XG`k z*UIPY73u6H9Ontm?bb(8A7(skd^LN%EgW%jts-?0*xhAYdeS<@6ATZ8J?T@N+=%Zh zAChI!oaXE+pw?Vxu*}Gmx_Ojo$45y&vK<4?8NGKg2uCB**4A$48KClmFBP=miupWB zb6&x+pEcuj9yj;HD4maoz37F&Xj46QvTmHBZ{6P#DAi%vm=$GB>AH_fA|VvKhcm}# z`4*)CfnQPs84Y9{dbix)dsOxyPP3fs3*Af@nEi5A54wwvIoiZk)(6>P+-r)0x~$M1 z*r)`(dIlM~m8+MOr81~aOLz5AV%X|E=}e7E?7v>?xSt^TzqcOWVEpGBkY9-Zc>U7< z*PE69*^{6k2rM}l=8WIGjQ8Of_DEHPH#8Y0GD%UvGNG6qaziswT^!fRa(9!qgUI%9 zs1PzYic*T@VuzvRC?J8S6{{Wlk!HNasHF}dTWVk@k(e@k7GMwo(<~CgF^i*PZCleFM)#O!j;IIJ*5HbhuWn5 zK8Jv@c|{YQLxs;lD|bYInul%kQM+DU8^L&0B`*B-po3B9&@N315RymzerC1Z60$bM zws9OSnGRp&Ex0AaS+XQ4?%4&T!hTC``PP{M2tryG_na*sewQCHl3eO=DVNnqcWbiD zspBh6Cc07cYG*ZZE|pG{B%m=t0MS-BI8n4cylg`d0PY=qO?|34Gc~yA`RVr0IL(y6 zXLh#$((hx|);)3}-&wuv<}Y&D536@px4lJJ;1^9L1$EB_yU)@fgKTp);-j`k(nfsf z4G;a(W~QbofX@_5rW3<#dg)1R58JvOUuW2?^EV$d?1%BOCw1++V*@<4%7umnR|=-ve@3zexZWx z7sExx1P@iVS&T`mwNv6&?)9!Sy^e4X!H`GRg5tS1# zd29Ld{`V&SRy)xl#pM|#df3H0T;qo1_DX~z7$mq8-AhI%X^h$y^?MDmytsIM9{%$l zT$!>k5f8_CawKjK=$|kbM^N%OJPC$T@cHO{tdE9|gAij4_F|OU!!?5>n|D=eHjL}pu52IFn3`I&O9nSP9F2k?6%m33au9ZG?q;S zly~75<{gp2ade#9w`)Ow3h7x24eB8{L3&_;Ac%Xn!uQ_0acePJyn!dHR}hkx7T=YM zyW?S$bwl7~P`Q>{PRY^?e@ho*PoEAKnxgu2Sk(n6=L%-!l$DodrIeMHWmPGwYO;L& ze8LtzsHs>pz=ohQ-NE>aFHWRw8CSl`fhhA#XoJ7IR^%8?P}NKXk-PF(Md35crQhoUme?tZUXlegmAzV3&3Vn8zV*&I6tQu-xAhQR@y+PYoWy5VJ+9{0u3~Li8g_jk z;l`s6%jrN2<3F0~qKrFF_ZFL2X0BMbtE*zMr68DJDiL}MIj3c9=`6nX7DhJX;=moh zb$|VXCm*VJ%kLS_bz!rkv_D2;Sc}!Yxzq5x3AF5-?^jDj>;T~8q!)F@hjKl84fG^i zQBjTSmCiaO?~6r+2w5g)QQnp%>Mhu9^QKjUm}c6-8ZHWQk8n1hA?(@hJb5O)HbFnL zqxc{xzgzszdz{CK*m?Yi^OhIYuZmS)W-d8E zv4d8{>rQ=DPj^OQ$w9|8mPK8XBf4Tq2R`su&%}Plb2bx&1M{542lgGUls=M!6^w-$9zn1+j z8L=3XexAzDOVZCTJHM{;FDB3Yij#L!{bDe3^lw^a=H&>?-*6J;KQ1)xlK%M~XD&H4 z7Wp63rNbmoy!kFC#`3Z~6C_QSSJWuD#I$G9dvd-z^Fu669${8xuK{3X}J&#CdBW6L@bnmE!bL|7h@Z_Upkt zt;o2At8k11O}5D45Gmh7$`Yg~HV=Q}&dV$_{<t5mjW8K#F!t-_w&bkk@e zd1*@e?54^wR;gxHI4KT1d+?kz50=DV{j|@1m1Yf;N|J|@S4;o)2(~XNBLOAt%v#gT z{5C5!Vl41Ojx&DJAj%IMU7aQeR{n-@#4jFB{4yhnzurPwQjTB1tQ`#KOY%`N5ji;e zWM&gTS%tBUPFv_F{OCt*tAJFxu~L}NlsCgd0)QGuHAM^J$)!k7&nSyM%TBU98VDd? zjHJql-J^WqjZvn86c>vk8DK!#o}IWdPuJohICRpsudlJvN~zdFFcet{dxG_s}AKG9!d2O zWrpxaX$0k>T&((e*9)V&@(qset()HHE-lU)UPNhe-`kv0Cc6@Mp z7Q^XzCh))L?Xg-tC#lZY#cpZwx{uzCi;vIZr15beqO@TOOjTV<$&f9;r+@e9qf$}n z-XqE7%j%EW`>*BiV*&j-y+#G#8T!A=Hw*sXZr-?l{qp_y&G`Q~io)k{|3n%hBt!c} zx0Y$e)Kd2!kP!_tG_;&ke!(nn8}u5i6${AU#=*@SH({9H?Y#Hy(m}NN-i_rOEAMt! zmX{V+mc!mswAk$(bgnN&Hy-V-Z$IAJr1(MY$7{Rr^AT)@+tFe4 zVib&rfMT8Y$%VJyUTDg%r>FI&$JZK9&lj3v`X6j>VNNdnDZDc*gWgXL<1Sj3vEKvIQhs?~!+~Wrr#BZJNQ;jg z?f;Hk3QRIZBtzY|mZWDqZBvMhm$D@M8L_>-v%dYw`u+CD>!0nYN#KBYZ2kyl&1p&E zWCipk2XVEA(ms@ym8D^etv-?uz0!_4j!!RC!;KJDI?*}M0!^kfNBa#^kSnRZ{dUb# zMypxBJUunG?gdh#z0X_A_+Nq&Lj0W5Jp>lBuL{eTKD`hK+3z5&r zl6(&<^Y?P|k348hG1PUMw4!YJz8ndT92DckQMxB@=gFOV3yaub-?}dDh>R{>2SB;G z)3>f8@z`S|Ix%!&mA&?`UN3+CO9vKjKK|F@BAon}@xOkQ>_0b^ixXqL`2glO`ufrK zo6?K-fl9AA#dpI)b*4JS^YE~Csdf6J$p8D}`R4e4$nyPv-CS9`<+c z?ADR7@39FOdGRv_ddQ~&XQU^J2}#2?Widx0qHr~pIXhsD)ZOO>TV_kKLa31SnRINI z9f#yJkX(a=0IC-s97Gi4#r5jXE(c{l3|35)Jpo?FFiQ zdjSEJBOUgSLo`uGJ3qoPPpF^}SIPEo6k72KGxGB9+OgLoj7QOuy;4{-1etL+C8Wur z>NpY^wgjM|Se(ixaa4i(>Jc`(CO)GRfItrX9?`}PJhxvy$^cAO$`Vw?MP44cKOWPq zVWi9%V;pG=!brA_;qb&7P?KF8+d()SW3_j^_QoPV-YHAT!US)H_$=u*?F_M-W< z-73yQ`o6zjZIpo7Qw7bO<=;(RjZBuB8W*0&UYB(|!5&#s(?PYE$SMhC>ddhnNbuz!vgoh zJnZAt?`H|8ik(q7jI$#oFx)(zQ9vt9jE4lnr>NGi3eH3-l=-4f|k)>hOFT=eWrt^ueI82+m8hjm<%6hbV(sF&*Fkys(Vcfr?t9dRjeW4F~usS;vu=%IPd7|o)1m2k74$vCU zhCRx1c$6wS`p{{@=4pE)RB8Cu44+ym$iX}F#FoS4iGkI2!SFQOLlFCRgsGC;+qVT& zE=s*7hh|sm^J$V(tSP(iib8N1hJ`1smD<*HK_wk>yh&zEh?q5&>Y-2e7GN}jZqo0g z!$|BUq}aX00)-tLs1ULoWG*ZwTq*fO_w zZB=)YsEAqna&nuFU8BM@{Y)v#cADYa1ol>iq6S$x)UWC_h!B0U`c=lm_dDsCIU%KFg z%ez+CNLv!0Yk}=B!UJOMX?O3sS#+bKy zw7#rP>bKXU2e9iVXg8`(g>-Q}H%On>sDut5{-hF$n5b(fQ?u^r}*uuQl+g)r46sW7(Y^_^hzq z7e9}$448^~oqmM^=n{xFp!y#FLRfW4wmY&?pbEC|CeSDl>+9@XW$Rxayl-m#uiU(O zz3Bh(GXBdO;{UcE+!Hw53oEzi($QHw_9Hy|G4?^_dg@Lb-@puL97wCr#wRfI; zu)Fr*4qn$q%k=yIXYXB`8%dG`vG4UOvccgb&;z0f@KuHB>S}fsYr1CYWyR`wEQ^Or z00}a?fJ|&=qF5{zWjk}Hy)S#(vpdP8537@{*`7%z$?W!KZ)Ky^K0fs6d-rb`vork+ zxqC!pMr1}l00JO;8nv@cWM+hiyGMkFhlhuITM*tBl(#wQXiF3RbMSlYJ8wbbnUM8O zMeR7z)T8GwpYFdpWC6)UQ_KqPow*pJB5If3_N=iJlCdp9gWgZZysYR98H9+j9EFKz z3^hJMf3pd@GFSaLLA{iZMyq?H?)QR?oj3wB4zf7qJ!VROWyKb9+RRfPD>7d-6j(x& zXIJ{1K>{j|jm~ngSiPR-vo!EtH0ot=8H%G3`RUyg;W_C=x*TzY7p_GfSay(DeiBVG zn5yaNGk#$UmxjbhE(7ddmHn;hq25cknYk>AU^-&Kk3J*@V{B$)X=B(N{-C1gxOlS- zRsJf)%!l!d!{Z1ajvE0qTxIoYalF6iGukF4>riTiO?!x$hmRp|hg($`6S{6aEnx*zr?AyBTU%cM0-ft^iTs^Wj z-XCAI>RXra3I4aiUTj^~E;iw1?fwV$V*8T+*s0&StienYVnhW80IH%wt#;oi`EQMj z`z&Cs%MY*nh*TMnYkbYn0NdQS8xa8zqi2NtaRx9h>$0GooxeXOz6n?@WYCZF@YW;` z=oGwn3YaDbbN@pwsqren*HRU(7UqW%ER^6Tf!_XD44Wn!HVN9{bqj{b$G1~Jl~qcC zS$qBd@|`0Kr>ylr90zCxDpZ4!&c}Q#b!k$A9&C*%mSwUEZV9%@XkYCe?Qp?yAKvfc zi4MN185H8=Xzy4=+o#{KTqq>fc?vTN^TI{puI;{@7!JzaR}f%nyAwFYcjEN^rr8Gx z3pPaP^nYeWTUPwP&1P#m75{Iixyt{sB>kV69*Y!yew-6T8a`;{G)~|T=4?Qx2GF`u z{gO;{P!V?FhS%%CJOy126zr+>YbH1n2GT5PlBvR>YL<98y~?9z2m%aMv#E5XooI@* zihGDzY?>(4OgN_%8w6)Q10`k5Ab|XEnHBoL>r<)e)Fx?tC{mY11Euw%BvIc_tLqK4 z|Bjq~e`ueaKjNrfN+f6Ke zt@~Ck+fZME<_zls|NiO}C2NBp^c=NuRCd^XpX11Z;Q_n<1JYb>a3w6RKL25D4}*nV z|0zEI*-Ywx+gm#;|NrYd|9ORDA(6iAb1QIqL3B~pj0er_E`2f+6~w7|JzYWgr*>n>=?~JyBfxl&Rz1VOYpXmTk+&g90_r ziS^cUh8RVxBd$=~lTKfytpN@;qmnM}OO83>9eJ1bg&zpI6JyAc_%cZ)j?T@|;AI+A zvm+Wq%#oHhV!C~}pSWZ#4vGk`|+$OA<`V8P6B9NF*2L#OA2_V7G=TtFea7Y5aK z3Stcu_P5e8Mn2<@ryX`(%jd)HeRA0OHZG|j%`{F*^Q)h9Rue*s_=g9Oc|6424329J zJ1M{&5rshELl&Y_^adBR)uN_rjquFr*?R8fBQ-5oSuFqiXo7bnLp#ro$eWo;CdCs} zGdSdV!<(*RQ6`5n=L$B%uDoG@S=K!k9$3p6MOYe=01vHW`6~D@vxtQ$49JCEr;9%A z7=Em;k+n(>(YLxtL8jJKbCGfGsL1rJ-l^RoR9GB(JkjQ}N{M_C6{{IP{9&r@RVf5c zXVdq7D*9H2#v=Vcx~MeI9YBHpzqQ>=`F}QdSN@+j%KtyLC3vXbt6|=g;bg2{51VrG za~<$P7TZ2s;@?N}*tpD;&tmwtxepLZX_C(v*9hdXyuV;2bejlO$nX-eprH`sigXc0 zO5j|B>jz?=|DqlylN9Z>E% zq(7(_A0@taFv&>N8ONoO=WcB=vh*SwMSj7q42tZc=`<5bLIWOkNMNZlZA(jf`Tp|; z1|J94kfTPA zSV3|cWOj52&m6GC(o0-p=S}=7I}!5J!{^TwaDY+Q#`pt0JHWuc0*RkmZ!PAW+c2JB z=wB}5i6b%Uj5HPEsh!{=MgzkbT`oF$;peX+;KmSGG1T+!(C$rqCp^b!o;@3gYLjJw zwF%tBD7e_WLKg;ZoY`F?a6%hBGC`H^S+0T_sG?}jS--eMUhqT%XbF$kFqv-vd|;tQ z;~Hp}#H6%;3>_6V66ms(SD`slh&<7|P8i=UNeu5+GOETFAvR zbtWx_F?tekQg=uA#w(5HLl`9e(n!Lpi@)eS)tnM-*|bJm4UE>MP{1fEkN+&F=V_=J zXb-JXw{Nj+Mua~4yD*Fg623U_L(Act514ri>HvBp&~iaU0C2B?$abJz+R z5$QS10cKnp>uDw-fGcyUcWSvO%)-$Sx4-|*zn*Dvl>uCl?`YnODYEDe?zANR{@4HR_rLjfzyJ0B@%vx@i_U~8Q2YkB|kNn()&z|%) zz8a^vWpVaIYaw481a$ON9gU%U*BOGQO9=-mTFJ&1hP-+SiI}}80Ir>{#?@j@)(Tmf zdp{zVVT>0R zLYv8(Fpn&pfta>fsG_l4W-mGhbHFi$A;3gxtFVZkoqCtBj{{Z6HcmXV0gHam?ucU5 z3Q;Eu<{|620>;F*6TI=Hu28ud&L~5#r05}DwiEkN< zrl`dv;MfKmx4r?ZL2;*9FDU@$z+F>jfq|U1!b`I}A1yX~i~Hv0a@R(2K`dr*oP+r@ zdHtg2P2BL(2%V7~v<;c*rI}42DEaSPcsbp+OQDf(qu8Fr=b3V}o0F_GIz=0kta`P) z4cYnye?mpui0u5Ra?7{d=hqw^c(BHn(wsO$xRksU)#i%2vv1qugw)0jlxSxWwjw$d zvBzqLoaBMijCe~3^h+VX@47RoxKMAQgkY>-1#=#>nc}L5-*jYUxvsznHU9MrctPXg zEANzj`6>ROPx$JR4z_M-6p((WY$GS0*Vi`Dbxu_93d1#RWwTyN-{Tw1UVTtu77PJ%h}qUCUig!7*VuR91^dxRT`jUd;A=4-O1|OxnmFex@8n$R3#XdT7yXmX(f~{{)uL*YO~^ZgGDL2%nH5| zr8(6^ndUlsGV2#VUt+5DN77#6;L8V{pT5WlSuJ-m85?7OLI=NxN%Yd;$c_8#{n#5D zZ8@qrOSdMz>8(W3F$i~*r+j9-!KCe<2BxHlkpVdd85cCqHtZY4$VT z0%VAKQLdgpAqjHkDp-y!eJ|YLiYDq*3uh8#&Om=OhF(SC6zaHKB}p?)VwRq5)v4Gv z72i}YEqQPeS7g3O1I@U++E6RaGgI`LS*xW|LtL4EOB{ux^l(5N&cU5{DWo1e{MFL$@tHEuqjyS|2OCUzZ@|mm5$>fxdNm^V#HN$ z_o0ZXt@z5pV6nLsJ7~U7*Jd?yo7Gp0!)s(#O-YXy?mK0dLq^c^yv zBs_RnFga#}CeF5%2qbOd!}K+f{^@EF;nP)78Yzg?wi2d)Sn{7H-#iw90{IV8KN(o2H487hmj^u5sJ%}|4V?=Vp>Y2c6k^M^t{D@P4MV;%2j9JdN)v z4XZ>2ogq@AsM!-1xL4w-7I`AuSqK_>m~Xa#9u0`li_fhHwKn|Yo%*?zATFj#6VTE!AEToJ$vO7)s0LZ6#7e)M0 zvXvHdJ8^86vQw65FAqoo4|&DLz_;!9_H-q$iVmeavH}N=Bjh~WE9eQMU{fXtHLUcDCpj_{ytT|N^zin)`Ha45&NnKh? z(zW;eP3U#)674lNr*2Q-SjuTc(av+V?_%3IG^?7<$;RF1_g9i13_(Mn|7s|*pt9a? ztdAP&zfuk2J?UF(VvHo zjcKaj*$KlluXk!ZgaWot?;iQKgMYd9SJQyUHNTT?1Hc1l01Ds$i~%5YwMk1*s{Yh+ zarBB&%#{26u@6G=spS|yow)d)p=0b%PB19Mp*;>MQ&BV!pLuWDi-)jA;E!5k;s&SA zfMP9V(x62J@xUz*Vj$Yb=CO5b8XLt1u`RWkL@SrKvYuA?0~TxlA>->6jX(wVpWUt9 zMEr+VbF;a!|9_Y5KZ@OWIvWrUxLi9B7Km&?*igbAR5x~&+$$a?bLy0<*}PL;<3s@0 zVo@?SciWqriOoew$02jHEhWjjvVEx}+E=qQC9y7RZMsUg99nflbWKbs{LlCiih@Fl zuWYoEiC%``Dn-K8j8_W!*JQxbkYvq^q@@_LGz5IUm_E751}zO2y7TKs+jsg7aKmx? zPLINh6?A8+LT1D zelu(S#!?Nw(-}u0TD3eH2R7@Nr=j2ogqG*Tc5es9LJ5KD6 zom}sU+3hGyZN0i31=JK~BQe&0WvqYEUVqwNKQz|gmou!e8fDEZymToW3tmV1luhUK z$1(c|b8}@ASn~d#yrAab08$YDv9*`H|I>p1+ga`ZzoYwq)y+&@Uqtj;p`-^aMFNZB z6(p7nCay_T<50|!*U_$?cJ!05r`iHwZ>CxDSuW|@-~8pb|Kgkf1poJs-~Q&CzrGzU z|EWc%vc8Yf6NFnuUHbh=EgSr|zb*|PK^xWe{aPOUoRwQ}HdeH+owtAg&0l}}C*=r7 zdwhAee)AU$vXKk82xh_i29kzC-W$WLUVQY7Gw(5@@d3aO#A`*&_ID8^*7w8Qg zJ=5Vm9d^#f`*N;i$-TkRp%tQ)Co=MYo_2X0?-$ZXn21A)P1nFBioayP18xWhfa~TP zUIe=LDPBLUlwzTr8EkfrYIil)F!rW2Ul*`bu{FXU&9F>wpsqGF=gY`>4$pJ{S&)d*e}z2q|jX(2_H4u1`!8uMCgo>H3p^|AK>9b!bpHNL@bne zP5CX_{0fowI!)9HhAtT(*;SJnP*V1jKQe2LVA8Fc;`=4)0%bhOc@r<-OptP_T;v}sFYG`osx)uM6N*znBA!^u=zmSfp` z&>&mo-;Ov{$Hu+?#<=~@*7tAMjQg7M>u1$({w-{_fBnthefuZh{4M@n}2}E{|x{C|G=w%_~v)t{GIX5zlDv|KSEjl_?K7>%KWwQ&HoDZfAh_6 z;lF?K&EG)%Z~q(~q1d;7ieDAGLCt7qAoE*2GXJDU=C=wm-~Kv6=G%XzBJ)oQGOCrK zR<27VhpoAEN_D;eVco7(Uk4x8?pN18uVr`9w|@?(|CaWee{OvHFM-D20$G0zocMDi z-rXAT=AVcI(R=vwyKnzHU?TrPAO0FZ{mr-k0+{d{;stT}H_*m^BKW}Rzmp&T0k{-B zApidkAkd@gftJ~&|1m=T&x~*WN(p#?6lAa$et8AVzh*N36X?FpRs65- zs{MaP-@jbHzv=cz{O~@%QuB^dtL&cfdOiK->gBh155FsU_i_Fm+V+U{YcI)XDD;z^!ob_di>4N+wU4Z{pRoGH%AY@g?RU|h`!~0`{wW0H%Fhoh5GYd$(Qfu z`0>r%hcDlM?|bKFS6}(rt^Uo&{}1DD&N%{j!Tx_|duJyZ|9fw9wg12A`+poMx3YHm z>K?yb+CzPYc*@@RoOej@qUW7>HDG8=&Ar+}489Ky@5Rcoz zN>jChs(&gahtiV7H_-~!n64Sv8DNZ9>Mu=O5op%4HRImBdsKFoHfWUOHA3TwwLxWz z8j18_u1S%(-1VZ{hUgUlk1U-kGnFTJOhIu)rt0kMITbmP9&fD;cs2NMX+#N)Y96?w z3ZFursfs0(#OYPU7=4(FtYMMeAXsT+rP@1{YzOh_Wh-yJ>6pFT)gzmpr}ZfsQvtLRAdfiJvC5E@Rd8INJJYq7vauxsmD-Ql_MF*E0UOnY8R zr~MLs1i%;Hhgmno%mYIQy4;hwB190MOpY6bw$*P$EggEsnQg)#2|}m$hQ-;3sf<$? z_S~@b4lzCz%w?Of8947)FnnsekuxqaXcXl(7cHl9Vj~G?Yfht?7#?tn58B3jhdn%Qjs+6d@nY%iT&SrIPvEm0KQ=V*V<{N;{U?C)&B2B@Bd!NBSo2# z$`}$7b~9-qZojvERWrlP#$=!5$+~lLN@Cr3#gff$7aTCIS5%7ji%}BS%}iaOB-Ug; zPNL14HEx*OpWc8Oi2!NVbZ3ybxZt zrbBbk>cQ8>A<&sXOjO0QnkQ{ipSR(eRH1k6v@Wt$l*k8y|oA`ttR0Et`Ah`URAy(JdSr!zEy?8|bcRFY%=6!rlOPp_b=#;IKf0ng0XS`Afigv_ik9OT zDUwV(C7!8T>$E&e?N#fs>Ir}8G1?l?FH=eOsNECmR9eoR^fodHgSA=;Ml%xzAzCj3 zqgC>-Dn1-B+9DmOIQ%uvtiTu}3VqdV%gYh-Wnp`>G>I3)5{<@?q_f5{%q@vwx-<^i zc&Dc0tV}9LcQP$s8qzKKnlRlDzM$K|#W!RrQ8M0g4La8SDq50j#*guhahbUJ`UkfE zdu#i_Jd=Kw-~VlHZYS>lG`Dy6R{7tS@=x9D{ruqN;p6AeV6m!fHtsf>m6adgANW69 zJ#JfL=Qaq#&cL=n&#{9JzMY>WD473S&8^h=PqWor&HrWm^IB1*lVdI0ohI z)~&96;-El?KKqmI`H4LWO!*~C^W6z1N6llUwAUDvaYa!$oCd&r3n>CymKdb%b1g-SSu zw&i2IXDtZO{@^oeWyvpDErK$d)l#xH^TIh~!;SZ0gK5&NRJA< zo6K**16cbtIZpM3xDmO0lI-b{W0%ixT{?aCEwSSoS#N9@WH9E=Y;p~<44O5Q_epYi^~^|8_UGR`H*& zQ~!%~EUvdKQoo8-qcWO`q>$*=`PEAKU05lVHInzgfSj>7>X$fqOhW!7Teg1PC7CGYoyDx6nqGEC~$D1Q>_4s87+-c7F zMDNm8?1DR~C05fM6<<`JO3N3O@)dn?$MkJ!{uXX`*m;WPnTzn1o|JL5_Zc_d? zw^sLmZif8lZUlVx{sMG0rq2ICuLplX>No32wHIe|f|3ju6z6{`iypltu0`Li>_Vd7@t9dTGTi%t3E~RzxUSmeP1S~dFo^Jn?{uK1WMTS_o0 z1F}!y>^$?Gkcli~WQV6-KfcPuTC?AU*qE*>J}bKDWZJHDiiwrm(W_c~pGxq+{K6g%@#3EO z3wzk}Mz#nFiT1}+d>+FC_D$$P=V4rL5#|2$}GxN)O3S`%^ol6G*THz zNERTN92B!tRs#(n^zUFGM~myFtK+`~@Bfvntn*a@3eW%clKcO?t=-l6-_2P6mEFT4 z&j6F#l+`)l_wgK1VZiDvaC!1Spb5GV2f#xA@13nw{QsTR{lA+b|C!+CQ|+e7|GZt* zYBl(d`VF#Poa#uCRatos&M5ym$8NLRi_7-^*xhQT?0;KZtN0JsDF36kedh!R$f&=g zyA)pH{`U`puy6Z*gWUr^eB+GAcnO?F8VP}b$A4EYz*cVAn1w@HhWJ#cd$9|=h{P^& zUuEl|y^}ocMdKtKG~KhVh%Pv1U7*gzL#fK+hw((Ol(hg0Cj@T#Mm7tLqa%r(p!ny9 zf(WIh$TDP{Iw5ONu+t*d8z8XPFpkEaE2V5v#k10A=)qE6%{Zg%0 z_`WVD?BJ%&e6TK>rRN4MLh^Gmt){_#t^`}|T7C`#;|OlVwLXvRG$r3+0#kh)mGy0_ zA0y8qGNqB{X_yqAB#>vp(Q=c>P?80Jj35$ICI+iAS+Wkch+y14 z%rYB{tsY2}^Hl6IrAsywN@4*2skS323uuT`WOd`>vIgDNx8GG+tEn+<_4`4bHb#R^ zgag_(I;@rGW0jq<#76@2LKO5l|F&66L?=_R=4T%$cq#W8OUR=<^Bg}B4N?{&$~bfH z(Ay}d@! zAgS0TJjjh+R;J*Vl=Mj9OH`UIh&|68I42Xd{_v%jow`N*0Hp|seMsM6q(9t=bb->G zN^m4ORN`g73XNrr6q!R%tZ{0;TnX7twE&lE$~MCS&Lsyz-!F~UQ0P$ zWq5vckKo7rOeDcYT~8}WqF>^mTUvEu(ReSGOT5^*V-NcURd_U=DBxrQ32BJ3KN=Ji z?Unt=M?jQ8~3e%UXv>wRm9Hp&(sC;dVZ2!c@b%h1T0KiGCYFV2sDb46Rheh3!lQCFmbCDP1 zRQzq=5Jy<-<dc^WP>m$p&SQafg z(PP`>`v~pUx?I&p9tf3Qcv3+i{qw1=fKgbfB*V$rLC4NVlyEYU`xGNTvq*|FZL6c+ zMzvC)IhW0KavUuPx?r&wttB>{e9A>h1Z-5_SOx(p7354qHs1Nl(f|2xvzCd8$ca%m zLeDGHaymgndd%0Qd4QFVQ|(h+dv-`KNxv3t87;~zHl*Ee?39=gS4X_sF$lgEl}N}K zb(aeCjJiWxSewbl#jgls!cQfGD#hjJNs^h5S-fq{SP{6^*``Fy0j&j5)bO^~?=!bR z`q+R+GtMdA_U-ZToUb0C6EYVC3^Eo`Km!EM$OK>&G^{EB z=R6xa1Hu~Ng-t0Di6Q+?3KPxPiusuuTA4$w5G{hI8_62(*RR|fLdkDT+c))@8l$SE zThsMbeTvpZo!ZKE;(KTRSxgMTBL9!p)>g{@V|SJR`DWRFW{Cm#8M|u*i!UExxYWu^ zQDl{2XX;$1O={yH+I_b4(JxsQ4<=o?PO50M7RC!VyXeqqCUU*5Ur<`AOL>ilErrbi zQ|_nAeuXV-!b}vv_Jhn&S@dx;6F=O~pl|5GZW2r34=9#Ro?0@SxK@HV%9 ziSeH*i6j$@#FtM#f_eQj%W*< zl&mAd4YiE6D>H3hZqWca3hck1yy;**wS=5d6<5tp{OAk+$K z)tO+_R;K@+9+#89N0H{DOn_S{eWb)3xh1P_@=UqFfdDVyzj3h&U{p~FpoZ#(+!Z;L zBo4xoR-Wk8%>r!~-BS9#Hy(q$J3DniE>Y2e&C=m|skNNz7?Jy18h)*TlY}pk7eevF zqaH@_SeRkVF=ko}!oZXd|FW;<8&iSIbsiB~s)9G?f7welhN28LY^!&Qc|MtVuTyT^ z4@OR)0l8qD16W+DlN~))oAYJw|D)5x`38Y5ivP0PO2+@(+uq$??f-Am{{J8v8uLvA zkR1qx#kSzbd2Nl$coa^8*4ee#JD$6ku)72-Au>C4MQv&@fdyGUrYsq+Bhqmb$J5d& zJ|2sA*+#!GFo*EnlvQmGwGBlZ9F}|-4r{C~nuo%)cm}t#ob2brHE|bcde*2X?gWD0 z8_M-;fC>?DH<+J8cHQyH>>O6{Qf0&S&g$|}Z|sh<1fGS60awG2fip5pxg@*qpG-!! z8%Au4_{3W_$O#IRm$yzIv@`M)idYtesGw=5uEGdylVqJT0icQ6Q+Vo-3Cu*N80sGr zv?`OepxyTi1QmB)3?sz|s!)GAE-If4%PMOHG~K9;$|d_-GqZWQRNY5e{}+@4B7gmF zHFsOd{6BlG)++w@javVs`20e~*w>c~Vt&q`u!Y7M+h!Ii$yhJHoiP8<&*5+UHWmWR zr14mKUcVq8|4S}KbXfFlO?!QtVZqz8-ix={aLm5F@$f)j4L{`69ETg9ztq)a9~R?V zsxUk&3LJdRFe%4uQZ36;-M+1_D|1Dz{$8za#(YzqFFD;(zmwY;EWyqI{Veg`kXW@c zh}Vvh7#9h2X7i{_;2D$5a`c9?qU94vl)ql7ANmD|s7)mi;jAoyO}U;e>Y6OxXw(~Q zt?QvDW1lHx47hD(At=xN2*Jtw84xVTGxFYTOXhjYI8=3?D{xRXpjCK~6Of*MMKgDl z@Ac%p&CZOC%!NVGkr!jo`Kap+jq2H{(>rC-Dd4?U)3dD-v#l~M+m5jRkMl_p$ckzt zYD*B8CIMz*CJB;cn}rIih>DpZlSY*7F~{`7JJhabH-$>HHaY zaaqehzMGCKxXQxZ7)dti; z*&*(Zp)?h!?ILo4IVa*T z+ALC}toMi`Z)yk+LDeBCpEB=Wl{X2&YoqNk%@#gJ>4Px*;FrD=U|5oV0n1qR{M|$1 zq&8Kx9kna2P0r)en~oTX3DIYTN2F?9E!vEp0VxtoTsphnz)a8QZfv)?3RNQVbx*0@}#%(C+3qG$rRN5_IbPRaX-h(LEFJJ%XD$YshmRGe=(E z9yY8n^vV2hCM02GKvHiO%H=Bnv2rZVzXB0kz67>3RT2?K66t%AmPsCI@;hyq>~nkK zh3YG8aKB=7ouehRZ=JI+9r$+rta=Dj-8!#{Jy52}F%v$!VGgSsz}M_+nDLL|;>eai zelS&F^oy+~!zu8=DE#@GP#i+1#vS{DiHVf~2{= zZx)V*OlGDPqXLdD4()hA6o@X&J(hdJViB^7!K7x>5b5=tgkiQE%<&WB+LJh_dH$TA zW#mzz!3 zDaoUFA<{cOA+AJqJ>$$+S6po6rsq@%%x7X?7WTO{atPppQ(|UB6LmNpE=hthy3nTR znUQ6UPM}hn*0lYjJ(tfeZWc@(l|~kFYepjRh6V58*eq(Q6f#fLZis5m0BUxWA&gaP4ZM`70A#Rgsum(9ZP2sE zcA&z+fTUG+_s8znjgd8UdX6^Cr@KGwMgPO!3!i9Qazf z(iiB*mfd5?@_b~8v618uC|>e>?em&J$MZXE``PJxZis>N#UjPr+K)`D+oJ*S`og+I zoJ{`r==hjjRqK1k2e13p2fm9cB}JfoO}E?QOFMjSu*?hnPUykvo)kEmNZAps8ak1# zKqXAwWNz$l07+Tm(%e`FqOk!R@P`L8AO34o!Ura25k9ZYs0Nm&8hPcdMprb@HsQf6fN#kBG>ZAzmdm#b z%2%MgX=1Q>Dqn$zN)h~u#GiI0;!kpv!9eVA2MnA-cvqc^pMGM&a01>&A1e4h$n@d4 zX4HcuG1f2MUFOX+Dno^IC<#i=Y{!pen5HEdl7=OP2Fq*?3*y|C%EA;kSR6@9duOGx zb^%C6Yic%ZDu}@2!ZB=98x&GOBoFrb1((87^f?gBW***&7;V{jCm2!&??jaxysgW1 zwQv!?*Gt1@C3P@fSAL99W~&veg4cwyVMGNH6f0YV-}JDdAg8H-ua(!XRjHTgGbl(1 z*R_3SY3CC2i0DL44;{1ucf{Q*oYQ=tU*LLzLeHzVe%pOcjJ$Ak^5yrCG_oqPYHn@jB5Y_Jq>l z1?!W0pH}E^Mb}`eCqKmT#ID@^l8JsM)=Qn9YqFneXMSbFy|%T2#Hwm))GH?PUNgqN zy}^4YI>g~iDjsSni9~TE;H1MIFG&d^CwKVA&^J6ZMjWjl-!-uN8*dyKAl~496@3e9 z#{Kw{(Kar4!kU3V6xaSZ+0T(U?KzfCa>`pva(60HgX*PonV*W4QL+D_nSo~0GVgzG zZf)+gQujZ1SN6Xfb^r5c_W93oWE4h!= zQb&Fl@u3|LG>}g0k=_Fj09FV>Te1PUKotIEyN7%1h$2l(hHXd*=EI?@SXXSfl59nx zRXOjVL}45bx$7!%uT+l9ctwP9A#>5T?tN-n#21X+)PtuU9X-R3J}qbX`W-yIGcVD_ ztkP`^DlAAOysf;e@Rz*`JoPHPMB`nBKC;I?KJ??DPE)q32|ypwL7*-uirEoCG`r?8 zp#;0yO5&xy@MRX{iUm9MW|yc1(g*;76)&|-Jy%TqPT`2 zKB{1EL>j^URXDCc{P@}ja@{eHug0U2Fn?1I|)2i8M za8NY%KYYAYywgKZ$v8-2%9oA{)4(1M8c}&rU#p2XA3hkHHRDG{Q&fn&*%XryBZs3k&89p- zNyc8CmzvtePDMx!$QD_#xPS;cdM2rnEG1TLrd4Jtn*vkMc%PkHJJp=ddT0lDq?Ur( z@m%;e^enDvxg(=NQitW%W_9|Uj<_86xk!B1r5UOm$r<qJB)( z;!TLy&e+xTVr!G)j4Z`U<4G7KYl_i_+l3$e{NUy1&kqmM?BA-V z>ILvnH!9DbKihcq#mj^JhZ}gDF2ZNC((Dcb$Ei@Dp-HE%TV zPXfDdjGU9xkS_g(fXwiml8izl4(NUSOe%{o+pzk57DF62Z3OxJWo*w+2`oJS-%I3wY+(k7mHu~=^uHJK&{&uf zsI;=2tHhsSg0k4@?ZWurelS3zyJs|w`%LP#+4Ck^c&n{Oqq$j&O-!z_Zov3PC!qEK zcJ*ze+H69ZyBTFhmU|9`c!;peOqKQBJB%_7xO4H(<|cn&IDg8Kzl@SK!cG=c)q6^| zxc4kwostW(&Tu86P5F=+T9oV>eo%1{!px*!W;zU$x)P2l5g%^G*;}YgS1x%{xaf68 zh+U#2X_X_pL<|tHdiSnY1`Q$>0~s_kv@tc;SJsNg_^GP2WidehA_lDt3>e>27_{bx z0d*-cA&U#VuhVRpA0KEKA`+V-`X%?>-TICScTKVptjez&&wTf8>ib_|~c_FytJx^~Zkp9ZD%IkV2u4;+OfduK-nPPFso=^9YrE9M7v0~EV-5uS18 zRbdfo^UDPoOxg-~;0Y(>8A=t%s^N&X+!>)LziXRa}z9GT~18|hQRlYYrcpi9Rq_?{PUG*L7P1S*!D z6e88i+J!U*E^z?78x1SEn4m?pFh>-kgBS*MM1Fb9F%Fa=7(MAY+)x5vGgA69A?O0q-1ZZbWvXc!$&`Rr0Sr*EKgYWR%@T3Fi zvR4IDAb+8_iC<1pD|Vv4EJ^%Do+tk06}SRh+qckmkPeI$dg%a(8uG5MLnGA5wF=N> z$OgsO#u8N)sFXyV!h$(VFv8vUZcqK?nxO1mTq~P2lLzQPB`h>9+^c*Kj1w*JhBImT; z(6oQxd%+v8%QB%CBlxHO*S`zieEmDBkm?3CEm4H46vKN2Qf6?@5yf0A7HqxzSZAqj zHX6;=UM-H();$kx;XjQP&?JcOjvHe@v|9PHq7BQ2MeE7QouCQJWb!+MmMB`3^1%*x zCum4oGkUNw3T@%UL>mvEu2gvg<4e~8$%`oq&hRq0FN2_>97f-k0k+t!Df8&qL zxt&FfOgfyVHxm~_*mwaQsE;RcL;@k>n@tcIdwaXbl9T}1 zMY^387;Gj~CKdEG35*BNpML)M+2dzFF&;kNKX`d?`1nxr&z?rPs}h%L3G1A~r&5cG z!l8!;kM_TO@~X4{;>FA7zkK|3|JCE?&kk{M=KhzkijRG|sbWO8wR-4$5TxBQ^J!?e z(LRxUr$?Z{TEGAOyYaI6m)igLP_)?Z!rM6h=YITOwEu_Q{$BF@e|vki|G&ob|L83) zF6!`5OaTwz%fY)4#f}oTEXz-TiNrNB#s_4t71v-RK^JZ1bq8M;iiy@YrGp*ytSEI3 zbRnB%m5LcBLWoC0gJ@E|uYs)X*=h6@J2yt=RGZJnSuT)=8?~#?`ND9D6PV!I0=Qo* zlIW=5;Ry570gTpIT+eI3k2Oq}Y13H6XGR}oqn10w>ROEBp~Zk#b78Uj9_Zpb{joEXH=)>%qCZHP7$hv^=><0_;MG8mz(-7t_`(_vz4)DoTxcG` zq6w_Ajb_7$ezzK|(xDZ;rw{lSUW!_keb=zYW8Ai@m-Y@E*VrEq?4f$KBFYN?^}nQ# zMie=*jUg5sap9w~Z;0ni@KE5rV-GQoa9&GMvA9jCRc$cM4ay1}afU_D;|J%MXzz1z z>W@oJ6tRRpe=z0q?q?l2M9H%b&uiZiw=FxP;6&#;?|C1X0`RO;jhOd zF1o_e&?t?S5R?hD8d+#bCsi=Xsqun3bQ(-~ zjZ9?M3|GTGH-$Nh1E(*^wGP_nCqv8ErAp$|CjhsRYkll#X11 zG}n=pBa#+9yymF8ZL{EtLc-CqNgb3^+b&SN7jI zLFG6jR}^0qXE~nVpM;+5;?m3T3Lx(q!J%YBD##vr8Wcj55U2P{W2-l#i^0pU|Eh2M z@2%6J;-K-s@<03nCw{;J{A-;Jl)7WNF0Q*%RR2h+|I9u!dKoaZtd&?$j>`(zsmV^% zo}Tbb0Mk$&1*r`>6g#*4sO_Bw2|o>(AG8T%fAw1DA(C0xsI{^p31{?e=;zd2CYyH<|$Hn?i$g)pAcza zG>6pN0AK4D7J%7eFx^>zu1pKxh5bL>>0wtPamTRa{r}!hI{*9b&MN-QxT(7N}j5sk}a0L$n@BZ8#n`LF^O zO2v(0&~ORLgVex>$Lzxs_CA6bUH8>tOtFcgq91f2s7%C-64LZ77JQNCwN>PTMlx=_@YGQzx#S}~>% zF~D?;0uLT6<+`SrRY{x~yLqZPdH33(fYl`!-&Z*-4L)s}$hf4q-;>IJ$Wua7`f@*u z8zuXXxWao~hSu5wbuZuT0J#kp~TvNvN|# z$-mJNi4=JBgHlC{rxl8XVj*Hw)-OpR)aCV!jP@unWq`H zO6)T|Xi{W&cz2*eHWiP3=dBgmEP4v+su@~nw9St4`-r$TaR@w6>)6^-pt5psU8wn{ zL&N>Pao;$1>|wuZ*NisPK&y7FIwY{mTI#D@=fLPMmtvXIga%}KkhsJjp`Ae?2il-; zG*wmOQ9}Us?b>n}ki8HV5*^1dh{GSSz&E)}P_sa)G%vN!^>Vo^*+S^%(<-MZxE^Y= zMb;FQa?y0-X#MV3yJGu~aFODEQ5frNPKKZY`%kmE)lA0!-`QFDf7}fF5BITPyByF> zf?1;WM6MbQX>=X6-@iXbw~999!$YY{KU&9WJ&EGPkQT)AAXC;CZ;(!0;|wsIY5)^h zAGtRZohqPHt6vQp%uxjhC6w8KL`rj4Osd&N+*Cdp`i5!bKzl1K~aG|0I1V29Jg=ZJ^_(5={9=a==Nw5 zdZ)45>Co%mw)@?#-5gkVT3dGpRD$I=0H;mHS^cBuaIq&%<`;3Dl?xvN(BgO$E#ti=-u z24LH$prsgPz`&ch{fcaUnR?C3JU%UuK9o6zXlKOICIoXSfxy9|f4g6hYB$O=vy62d zBclR>A)|uc`wb>?wZyL*RxhN4!gkQJ#&(<=3a#=w)?}?D@gl9EC2tAW&BgUB!LV*< zWTbvRuV29TOR2mTFIFZ)@TNjDGP&OwIqy0Xm*ugBg|1_{{Z9NuYjj7R6nYtKTA1qLdp#YjaF5b|VBx2ja8N1y-GlZE-YLk(>k2g=p;peq4&u zq)x3}um|V>yv&KJII}qM1psQ9YZvU{(yXLK44XHW-}lbk+3As4sc^YiisK>R1jIK_ z4y8X&=AiY1a{U97(+O^&)Kz$O!Nl6VPnle==y;Ws=;nv|l~=UyiWw}n|3o+4=AHte zF#peXI{!~=mH+2v*#Dovuy_HZV*bJU3se8SvJuR(}ImUP!ymj zMpd%w+twRluICxq)nw+%Ezl$B4yf@X!@O;~jq}maJU-T}o#^o*((6^*x;V}ZIgtn+ z1fx9~hvx=BH1JMnmb0qrV5!fm$k>~%rlzIMCypP)-zKbNI*l|{bv#mK2?3dN-uvwA zj1s}ZJNKrM%xpGuq}l2-l6~J|=S4^@-Sj~_D{}+ogEQXfOfxz^`NVkW_$h)uZd~}? zI?!=x&M-z-r#at?^BWn!tc> z#H{fc9v@Cdqw|-b0PK&)(Zc^(JQk(P3*r^+EwOrP5tXXN{)He#(e02nH-^`x+|`&g`Jw{&%4;Q+;z~ZS0+wnjPi``{8Np5I>nrvu*d*<-> zwH(OX%0>6Q^aqnVY zqc2kL5|jvMrl&Nfv1B{n)`!1ka)^0d7v-oNgm$DuB5c~~GID0gla62(;p|#Qq=ex* z<9hW7`Ia@o!$^Nnofh-!*U@1W#2z{FjO3}lsC{$`FAAd|y`Yn6Msxv%5-`OUGn%IB z`y_HnYgVxECAG<>U>0;`vdf;#?aF|F?; zEWbXbadS?v_Q`e>=!M-xGwL|7M+veJS<+!?mNCr5MJ1t4CEbX#DI7>UZZ6K!@E=(0 z-t1Y_#DDUubrc}AAaK)P;mKx+D3>OhG|OJOF0QemQbk76e_&45d751Kxj!S}1+V-! z=t^~-)WZEerBs;y3F1Ecen}+4xwLgztDJ{^j?@nS_%Wl8e-hf_I0E?{tQ-pHp=v*F#n&13fh(lA{I8e$H2S>t^W?++#O^&LZ<(A@;t0Op4h)5Vk zxSdSsMsOsag3Aqi^?R;D4j6>3iqxWwaL!bBb>TsD1x$N44BcO^YN`aTo_U|; zG48fa1T@Crbgc#qF}mNc81rmM(>_ge@Hc4g@q8uc5N5k77<-8~BdC_2iOGhJq8>@jH+ij ze#Fp#xiW=$ux58ckv{2A%g?+HBRnl8{85At7y?#$R2%WOn)=N-Y>F~k98H50r7Rj#W&4C zT=BN8CBmf7+*WLz@8z;afI@rhxzS%*={|4@i~XJzXiVO8b4Gl6H`U_?clpRMY@s>wZjTUSA_ScD>dR32{)t*e2q=-3 zxvvXEG(m9WWL66T1?miB%K4fI>d$L3dlz)Y<> z428Ageyi}(sSpu>%&j^+QmesbrAo(AfGmx`ci+Yw)&#nL`5Pu#5`7{p>iOa`#0D{Q zL~N6v<5}DUg%OO{U|4#Mt+4JZF$YBfctg1SkY;jCZtzPtFy;mI>aA(dwsp4RKh!+t zM}HZvE^C9dQQRDb;I-DWX4OcFGl@Wul56*=xxzvuup>5VztW;!om!wQ-}?GAgJe6W5bSR0BzlY|b$$ND zZI0S39KbyF;BBB)W7F>qrZb^=tm6Xa%N3eSFKp)^@~C}Q7p4I&myHI{YrEyi-w?QU zC&$0za}OZt;loI&qe<~SoT=1o7cBydwaqjcjY<-dHYmw5ej>C9s2{!N?g-A>XTlu% z2(L|pOmC2aO7Hs3hK*Z70a^yMq6Pu{Q$(Kc871&bu_W1|prL&xQ|z-(S=$c~WO5S}AN&j4AA*Z?Pzad=(un zQc8%!Q{%WTz(?*yVg&S&g28m0K;66Z^@^D~;b$XgKNMmF-GV+tU+?^~T%(hNWfaF= zES z7Sq(DO3+myr)Yt_@6Eu{}xUzJ9}LcTtI2#vJacNFX3AFqFK;O_~e z3#+-UW7k{}-j((`Yt2ndwAhRUrj2FTNIC2ct{ zNbsBQF6$o)W9e-wKh?1qxq>#hk>E8X4O z{2Zaszw(2agYj;lr`X0_q6Ep?rJL__)T!qiEuzHQPm}#yW{a;Trp_k_n1#TC0xmdI z_>_$lAtjbNu*a^eIcO3^RC=QvY&lo(}Nh;2YdkU6a;jz!364^lGiZ%cGlno%uja>Z*3VE2XL|rWKGg4x`wA+s-4TA1StbwU zk2ix6dM~j{jY}ZzTk6BA2B*@AC?Rws7NS58%zzaLM6rRF<~UnA$;@M~)>p9$+dqn> zY3od@Z@Ji|ZW+dnvAoC5AzSxQk7;ZD(EPEb|E96rl4hV0hg{uUN;Z;Qee0Fw7obV) zvYq*w4K=yu;-KpFBLY-9j=lza)IxcE&E4I23{`s^M)yYcsvtAaZH%woja*TjZ7l`) zL@mExYBF_ltcMRrlgIiofS2SdWkek*el#y6CO?5&f_9f!XPfoTg1~BinEotBkv_*`jF> zd!>lTz}OVGR_D6%4_}iV>$uQ(?cJ90ebi=VfTg0?nphJ(O97G)cmkl{L=Tk3XNili~;b2wuxt>8$(d`-93VMiGt1*2^i6S9LeE!3J%84vl zU33r^;i_j52>2bW_X`EXG7BM_URD*ix^fOi>4vat=(Nlj&mSC#ddxsomna(7Hfn;E zzcd8uXEeX1@U}o9W_lN^fe`pcd2;t5jL-yUo<_*sJV4H{!AVxW<4hT%h|4$nXg!J4GmM{)3 z175CT8hP!$Og~)6)nRA6Hmx}{(Ncb*AU>FHJb;#gFb+@kn;6-QD!zac>XLZX*C`$4 zzH>Zy>83vCFq*74B$EO@%Mq!o*5Bi#%Wvcn+}YUa9~OPAnY{C3IBf56;$*|JSW?CB8O>R_xqeZR z71u8GNAux3h0`~N+H$A2e0s8XPJ})cg8j_r zHnisk6?n7^zxnsBK>6|}QFF5;)Ihl4R5oy7ktB&Slh5Txf&;8c>vw+Zy2ZUA zq~|=~qD&jN^%14S2)2vQUR%FtoVE$%<5Od{5@wXaW~q;1NTkZQM#AtscF*3>-R&1Z z1&?pj#a7f?miIphwP)02(vYX|R;`@|aBdvY%!|jRs+eyahwwiv=Tb9Sar9}gU8>X; z5{IH_WUDu%yX{9QqpOcuI@w?_#o5s|&6$~Sq<`>xIH=}1ahoDqcHjwiE7xMAsHSEw z6B>!m9PK2&V+%x@kvNGCLqeo{LNozLE)e6mDq7v6FM29(Vu4h>M>Y!|q@}sU(he8gB{ar>$e$w9P(9l@F$+S!(336kV+fn%hNPJ$a*}qd z_N8B(;tmm#apTGbMq5~(snL{LThM%Ij7X9cO#~P)Q~VKrOI!v9+R(S}-Xam$ePl~hFbr}uU&~hG zE%`beJ{25KwPm=tL)IAT!OI!uLCd;E5Q!Fx9XQ-8f$M}sjBQ50BOaWV7)RwOZ-qkx zC@9F^hPxxX^vjUiV<(vh6ZHLzr&Ywc+S&yF?T!>AAEsIR9?@mBsF7}kEjB;BK+jkU zpUvfLVK$gS#E$>qOzlbHR3Z6YZmL{TgWuGGHqYOG5of&LQyzF#nSs(rc2X$L0$(AN zAjT!)cfaEPZ~zOl!U=aQWJ#LXzte?hrMSRxm{YGJ#IUacqF_|*L>T%OMeiBS(Xw8w zf(B@`Mj@Q$6a=XSHaKU2IF3{E0dX5+x*z?}!C7gnzmos#j_CTj4GI>K$9@%KypL8h z@ZT76^uV61bERotH`HkH2650`4Sn~W_9}m@LV}XM>UwKoJ*g2?{u(adrXZRGv3=*YmLpVX?lJ_ORL_nrZmMSZ3 zF|RaKzai%=I+rA_dL{iqSZ?fKqh*Png<$K)7QA@KQK$9$`HtSMp9GWe_e+h+tNqz2 z-MC*vL)tRaLr1iq`^f~zSS1QsuD%v5l-koHmAZ5pluDBa!o+X@6}U zzYpy$=?o;CpiA-!g%NiyIwz*QkHUiM7_zy$`kW=~?KJT)*flNlGmC6RuVurW)v?DH zapFO9=x9?SJ;Yxx7$rcQ^OGcpmHtN_N-vkAroP%wsP(&&HeuWnX?V%svSp zC&}rtA9vLW2YUCLbXTu>!IMzczaCr+_h^G(lPlWYU#ISOHV$96>9bBnz3(qKAdqPR z6ZitVve}rfotLL8y}XUyL()XlSAVSw?cI>`&F6LZmG%3k(`^*(W%prUqV$+iY1|OC z-M%YrQY`Ouy8v6E+Al4(wLHA%c5j55x-HUIc3yxh8NOhT&6wm{J$l(>+coyIx7y>f z#uHp7WM0Dy!OP5b9txj_ornt{=sf(e18uz`VyWIIruPj0;fH5v= zvYRR5>xn%*4XgxH_|G99zk*Ay*s1WlrJ=X($ksbQbtLHpTkm#DWJuj+s>7E%Z+S6u zg*!pzxEx=?aMwxfgy2p&ElJN(D1y9xX0-|24|WYxlAiRn1sS!Ap;CzY-I|pmzSPh0 zlwREPEc3l<*e!)QAulFAWnmcb0={%NTs-M5xCqcZO;swjqCP3U+!I_EekTTob6?F> zjR!6ZXG2^ajzHW>J(HCt5@>>^k|!O`fv8>wZ21Ll6Wx=0?5zi&ZVHK3t4LnE6>RI> zc3!d%Ul;W0eFNUvo=4nLd~0_Mr5O8dh(&v295^rT#n(RYmuX<>Et~Ghb0MzY@Dji) zbYWZMhN_^#2Byr$NwV{D6KpsgY&0sjJ^qT!_(qsqaG{9F+ce#K8aLk%M!t|&*+fx^ z8LRpT!9(jEo!+jLMAP$N8Ibh5N08t5U&RY2^?bN73YhS)2br2dstMcS%U)7rx{RMA zi;Xny^4_O_+r|Y1LY+5)K5&vHnH(6v?tJ=j{%7R#{ML>0{p9;P1Y1>YCQZjON>6&w z#V3S5b!)Y6gpu-dqHbkz)4$=Di2y}>vJUPT{+jMy-B;}QqY>n}jnwI?NMe5Z0~=w* zDBS|a3+~4eT^PpRq()GwdFiHW->u9UlRy4HaXXR`0WiOCz5I{Eh7rr!CG>w{DhN!# zvK{Sqi7U9Ny_2NW5Qj`1F`4>f1hsDFg_MUq$01(Jp!0n3JPXXuGjX@V_LqJS{3|)3 z(zoy(n~(}+P9;S5s09r{OKal1>4mop+S8bl#hz^m?PzL9oP+8yy+A!rIvQ9H7zf*w zO_o5*gV2fYp)sux?$SmR|DU2mdI_=O%HyijO2_0<}M- zee&~~g(@UK8D24xe3MyV8zAFPxAH>1M!TZCcVhtD6j5k{Yg)_TRaRSDS=sD!NBIlo z$ZI|K#*;{qhYS$02|rR;CEherV5^Bp%-`;j(rhmlW!R*PGs1v~as?|is(;|?c6&fU z4A1AW+c>Z}NSAE1t}k!2c~U5r=C--+dG2MZ?2Rt1)n)t_@;KzK6P#d61kNX;=fNQi zh998Skr-$3MqGe+*J|?CAA^-v7s^PzT(*@~8`1J@hiZwBA*R0>-f2{-)u5Q`LZB)w zD6{D*9VjqqFgYkxX)t*R%+}&f1PM0(@?c?TK-jI%ULis`SXU+;w z!g8q7aya*Y3KcujAzO(iTZRVsUDxat%!K6tCqY??{}d{ANJFP$O$H1NXuGaCE3662 zAxn}it}kall>nfy;vP~{9Wp#^^TOswgDsZ@ZR6>`S_-0tS=M4?HaJN&qQuy_L7WPAR$<29P-~_U6x1fmbz9bzZnlNp;>OS*fC-Gmf%U z`n8m%1Hj@%du?%CcDOX_65eY`uDh?E+n4lmiRL@@s5I_YDX24O;hS}nyaw>`I%HvW zD5wn^E(9Akx7M{4G!QYj^*J1}C?&0Kb?UAN5%DP$fr$-^mN>sX<`dmt*;Y-~^>8k` zo@+a9Ynd?)%6PL6f=#zRgCJMt4eq9+wf;u7yK|dW*R#9dtDgzR%bh8*SPftW44UD7 z9O*NKz04+A&#}xNes@%;pEja8DPVFKo5JVY2QISs)`=mUl{7>Jy;uaecM!8+*SCl* zpmCYD={$ZAIbm&+x)YeMHEG1|`CXmjqp>wZXC|(i+}3NQyvN9AW0UGyxw*Wk)Kw^Q z$(Z-f5<&{n-zOqzOTEg7X!^B$GIfWSSD;raz4rd3`+{#I117KFJW-}=D=AU6QC7-u zSYIROMh!>-m{Tv=&b#V!oUc<#7XG$UP_cA2b=Q72)dy<%;keJbN^pp{=E4eEvs`@V zrI5U1X7j)jo4mH;;Gr;-Q7Wd%5&yd|m81?`zpT~8(sg*k{g5EZ(H*4T&Vk8mSoy3p zOuN)Uot7`EL#zq_F$VZ>Dme#EYf_G_gxTBW7b&x4SXm}EAlep&>Rj_2&Ip#dd?Z@^ zr9Ni7vw|nt-ux-NkryFuBb2K8nnelHuVC-!q9XA02ys1ZtGnLra5xm~b~xNigZywL zsE6pTQg!nx?C;hI41}NwZJ@vOb!E2d$ZhHrKrVgY*9D?TQ2=u;V_8=SV_A1-3DxJx zhu#jymvfA33o)%wa)kX1FH(dHO5L(k$>*PYO3rThP@7LsUq}toI3)$q9lEnA$ylfR z!|r~^(HqEyPWlJ8NWlCk*x*Vl1J87)5i^F^=Dp`@FSmW00H61)N2Oo5m^I z(J*p=le!PQ6Rc5dE}>C3;U||~mZWbbwym`?YkH*H@MhT?IYAeU7{jMm;e~ihB!<_X znLh~^!uByT3qE{7=_Q@zToM{+x95jZ@IX}y(N~t-wtu=ce!p}g_uVQ+0raH=UAE(~ zYPSaXH`MWLp{G4Vl6{LJYV35qP_n|}nS!q3n(xxHNb4_l)RZxNgh)uYX1r7HGpC5^ z0l>pNEC^Bd0<(a)#V^Vnd&{71UBWo*_r=1M#HTQItuMO3GLshg@$*IU`+r=U&{sbg7#JuN9_C4#1RVwj;m!L0-pnk` z&1{@qY@Jy>Ol*Oy0MGvdkJ#QC7Z(@If5^A?e@Zqkc5WDUPIg`%UQRAvE?yWmb}k+c zUKlF2{{mnB<&!SXKTMq7TynECHwXU9=s!FDZ{z=%+dn7w&o}>DYm`yQF#AnUI&kpj zzXYrC#E_+~bozkC%-I2<$*HL=fqQ`OreAlCY>kSgyvKIe=8tdgUr(8Qg)+ypUPN5h z_J@D2Q;v_G@%5`%<4WTyEjfT0gCo~aj;MT_l=pmmeVjz1cHEuwy=b!+P3!TN=lyLe z0XwA~e*&+K$~j1`QuS+1;H?@XN`8@FTdjC`zSEP(=r1#^A!zRUBKMnpSAd$yoIiTX zfx1GM$hyj$sHe06)}9pEzxdWGjlJb^U1Z+a8bcRDyf&54`s-f%nrpSj6y29jrox}I zy)!Ql2}k6A;{%on9IXb}|EMvx1b?;~cDR%9*vAjGN?o@34PzGYZgU%peCi}N7xusP VfBLs`|Bk@FBk=DC{J)OC{{S-fOd|jQ literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/jekyll-3.7.0.gem b/vendor/bundle/ruby/2.3.0/cache/jekyll-3.7.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..b0b0c23482738314da6d744bf0d089a165729ad6 GIT binary patch literal 109568 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 AMF0Q* literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/jekyll-feed-0.9.2.gem b/vendor/bundle/ruby/2.3.0/cache/jekyll-feed-0.9.2.gem new file mode 100644 index 0000000000000000000000000000000000000000..0d221a9dbe963e680a6c5cc8ad6fed038380ef9c GIT binary patch literal 15872 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/jekyll-watch-2.0.0.gem b/vendor/bundle/ruby/2.3.0/cache/jekyll-watch-2.0.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..2836691c1b17caeb2c1a585500e0bac19f3a0488 GIT binary patch literal 6144 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/kramdown-1.16.2.gem b/vendor/bundle/ruby/2.3.0/cache/kramdown-1.16.2.gem new file mode 100644 index 0000000000000000000000000000000000000000..9f35574ced7cd81dbe3cc8a81f2ad8ecfdf085d5 GIT binary patch literal 258048 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 z%0A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

#e7)B{>73js};~9dw8D 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 z zGR|Gd4~1*>N9S(sPAN8@R}&x#q9mKJo0FMyw>x+B*PN=eJD(eMIp5;LS>{Wicy7(- zZe_iBT3L_tje&sS{eCN225Lh$H_K~x4dv~!v(u{d1L!eLMVx~(d#yQ z+=7f}dkUxN+*O*6+P+fTA>(XJin8okIVNPwnhhP75^5CElbayXgK;=vEdth{$0^SP zkTFpg^c>Yr8z5dubQw-*W~0(kBLZ1nAd)Dm4F6z(R>uxd`WsrPMU9|hlp0uv#6H>k zmxCtS3ayn|&BDd12&hc*p0k^ZhfPAd(gLvKdUI0MV?0@g7o~&>0_Cc1g$5(D(wEd$ zb(8}6Dn;ykEIR9Mu{kM$7USG~v&C84SJ#WX&W2N@)_`waw1|AOEi2z}w%qkycb+OV zt0OK&y=_oOTcQ@LWy0tjZWNrHIVvHUPg~AqXFY#M(AcZ zSyW{{U8YvZ^cV>iiV0{ihH zqunKbtx%jza|-Oz>WvZ|VJZC*Y3kFC8ka;Hx@w*oRt{^9w{Nz}TzN86o0(U`(alSV zpgSkI)+3|$vLs=>Q)=IE^(Q*wHvz|+~?cz#e)!JSYTy1AG06=UP$&xP#o$Z(Y^H>`TD!G!-+o2& zz~n4yVh>79&|5C^Br83;vfL?0r2VZt#!C&S|LN_)(O*d%%3lNtvYD+W3M|t3gb_Az z0;HKQllSi=sc46&aVBf~Yn-q?n5a9X5Tmto1fQjzB*DajMCEEx$b(N%Bi#bSN7XnS zRb#J3J)=dw-MHKEb(XkGftoC_BBykPcgpwhG$eSr95ruC;VaPAaOB1=7x#Gq(Zal) z2`9rbQK1O`X+#Q?qi>I9A^L71gE6znvY#j9f1=EAe7UL=Tm$7Fk$PDC^*~U*xdO4+ z@dgfvEK*SnLfDc*jF0U)=eMA7#%Z)AtR<_cKrQcb?2WGMLlJNRaM~8PT(f_ymPKdd z$V}#}mK8hk%ROhC_RIJu6f2@SFu$|@vuH&-){R?;W%}gcX_)BN3+NS`NVZ$mYb6Uy9CSB}E=ZFsM8324h zgTKy7CqX!Dp_4++6(Xm-Kr}m(u{Q|$YO*zVQ@MfPGQLK~;A(TQYF!I2VW26@6HQZ2 zo7SEtcYi}9G&&O}Hr}%~EB0>nmC^F~>KatDuk+cHC4C7ol3$e* z<@<_1p|0QSW`UY%68Jj0eQXEQ)qG_m)=8x!d}=EU1yaj;C5B7MXgzXVbKMowHoS;o zH&l)tkR2+tGr0ycUmOcuiI+HZqi}Kl9E04FCu-<3y}r9ga`(7wizdC-JX{B z(@W;DRN0=9Fue4IlV3%$qdF>|vS37?Em8?9xt{HpHD}^o`>~90F&_4v(b(_!cw@sI zjP6n5LsYTHBF=?I6YDNl2}iwPf~Z1OH1)-`BTwJ%tA z)j!jm7OPllPxB2{-R^@7RuQ$eRZgi))dzpRrOU=%|Eb0NRMXQs%#E|}?5@Ygr<$|r8WyNUtxcM7$YMD8QnX&ew32!LF4XB9yUYD8 zDi#^qT&HP96Gi)uq?7LC$&(bTLV$O4lO)>L!?pWAPtnLxsqI?1re`}Vu@NZBDXsC# z*H8$*oW7UpWoU$EMS}fSjN_X!W8GdVRtib;aYWB>07qrf zkN$s;{(pZ${$~ayes^&8CN*_n)7@`=)BJ`)8R!G2yLI=geVbVcSCLG@w5T142ZV1v z%u^&iGj5(OCM6C)3C7R^)0T}e76 z^5Uv-KFZY0!pR*nmCURJ4hy;WCyBZc$UTq4c?=T6FU;!v z(ih;+63sd9^)&5MDkmuLw>NiT2X?Z_++IhV z$z=bf3^2%Ort;5WFenyg1$XW?&)r3{pTvH+2_Ja@wf^gPRfKYR~MoSipCl z0x-JYWs+c#p1~r^c3tiGB37h`*URQ6<37<>ZM-Dn#i?8kY1@ezar77m{9haY8}^Z@ z|8F{+_~8RofE@hC-RdSqUH_$w=}VBPY^=qeC&;Hp)^R? z7emA#V^6O2SG^%LdGP+QB5A*;%n^?AEiWAL5>fiiC*jb z6CUom(J|UMM2~2r=)<;;mT3=qO5l>`!%z5=pb{;I!Eh2_#x7zW@-`e^C~Zbal5vNi zNsyR=K88Qry8+E9)R5hPL3XDd|Eu(b7mCAC+S+CUZ&hI)fX5JS6Lz3+;Pt|o;xtk4 zBfYK;Lk{i;cKj=`UsJNkRfYdn5d$pxi6$Tb_CdcFs)u#~sJQRlI_G|bSO_xY5Oq(C zUWd&bBoBwF1MkAw5PZVWcHHHW7F0pBBM63a!ja!Weu5VRD!4i z@bg>NbfYzMHS9s#OlM;NtB9WngQY!ZaO?P=M`J{ogNB3ts23m|z3~_*68IsyFJWpn z%7P13;Kb4n0L)IqFS8jv@gh%Ss#S1)gL+r-|Me*Yi8+4{U52(i* z46TcZ8@d%ZaVX{5C&H1u!u^q_I36t=%^cXT4i)F97tkI{O~FvRut{_{Hk>~}EigU; zOU7Urng{&gfA(QS!1QHNYv}*q6cLr-Na}hBJ{e*>m!u3-BWR;h2BxPo9W!VvuIA}E z?7WjHFv#T)fnuR*+?imZgnvPz4nravFqXWsVV(k-g@3`%=a}gc=PDQg?~kYCm*K)> z-{7qalEfpf^ca8*hYX~`3xMGT(SqiojL|N%41xhu%tNB!YU%LgMg?&_z)7Ht71Ybi zUT{h1d~zw?1flQ3v;`t-CGKs|^bM>NHp#?gnpRZ%z3!)g;hfYUC`bu{e&J_Qr6()FtyEQ&8ZG)2$p|FqwKIC_Qm9)-rr>RR)g=C{p4(OoZ< zn;Vs8wf2`6doTB!KQZme!-9O!s1{de1x$d`Xs@^Kw#wV{=BZmPJB?b8j9^=>Ryp&%wL3YS zd2xTGS!q_>=1*M1II9MjVP3=>KZ`5BJDlPs5c+KOU?UuGUgfezYe7_mGwT$+$`EIitMm-qIK3kjq z#m6+?cvy~n1n6~eL+JTcF#}Bb)b`wBVYccTBc^w@Q^%^+FS8kEwnL0XY(D1(qoL(A zWs(*7$60+5ynF>Bg+G2#4PF*P=Ph1Molal}uB>J{rl>wpXYFspx<66#IVO7}{PCxu~O84h?G5D1n zUfC(EV%~z6Ky6wCwj!&ARZ%3g7TM0PWjm{uUZO9(Zd#G3mY%(q?fhD{(`u0(1gGy1 zE$V+h9G}%sMdAb4dz-C&PSs+$Nv0!7PCv-#`4`FR^~1w1jY){XJ7{?VR4zc8a_(kh zA0$Njb*9|=!c%vy`aSadajXWvpsH+FLTtJ2X*YNy^GzOToSzX*&wn?Y&XWe2V1%+-s_D%bAJ*XNp}nV^>IAvO30S0yQBBUtT2aG6U5hO0KbDpQkh=19N^1Tt6H@#qWqR7;U zeOsb^ilvQb&*+ZE43&=8!!>aQEL>(*GUNYKTZ=Qms051lQ@7IhM#N-2{{p07I+zkL zQ%(_oReDavl0veu3cOGJif{8zMm;quNrWcbFHNDptfHmAkO!6Ci3v22zy=($6x?!rQ`Q{2LGoa2|8R@-zMe$N*v07 zImH*)8#okS!hbKCRs8nS6(Bkyts_V^pIL9D#EvG%VjQ{it+P$&PDyU2en>Xl7u~Ay zzw9B3`xsPha$_UQd>cpCwDG+2gQ;I6xaU zBqKg2s}TQm?%P9IX+kA(fg+rBaky4Qys2V56K3 z1D^ILUyn(iHZ%yOK<-JAdqR{s7`KgqbuF#wlogHloFJi7GG$y{BpzIOWR!-bjTb@i zU^);<@dbXy(_!T_(P;u)kUuz)yj8D|Se|QV(I;8;zunewaK=5nk{~+UYE3)KrA1E_s-2 zvt%AWiXd#&p1b*Z2uVt{)T35oLZ4;P#ww0mwyVU5wi3OkAT27wNJlIGBGXF36rS94kqvCyQAxQh!6V z>x!tWl@@)NUULaVCuy~4VfKTVig{yj7sae%yXsN_hQjcv7=a(}>He$k|87S^iVO`p z?eMmLKJ4A=GB5}KW9R9%dH=Vw{rnOCg*Zu(7dG z0Ii|l^}?$bs1gPKK8U`WQkM3Y7PwG<+se*tbOF@NBG`KUXe# zsHF^2Uq6vIh31QFDZ4IznmH%_rT=+UVU?4fy3(a&7eiF5v}{C`R& zjHZ6a-G`4aUd&#;bpP}H(roe{W^BUmUjX`bA^Gpwu7Ury^?c{qqyN{V{FmeZW%2V$ z$c9f+Qet~ikQ;_Zyb~Nx(RSX1C5koiE)9ZP#Lh;D6WGmYEaG>za`lIw{7}MY;p4tP zxx&~fnd!{ya!8)ndm{Zg1{-lFd~Y%x!*1!k;TWkhI?s1}Cmi-sI)eU(6mND#dDps5 zH@LX)QGV&&%AmUISXhoO(Bpm-d%-m(?d}8=9d(1S1!_ugVSNi7vMJ$ZkSn4JMMd0V zNTJxGiLnn7P&5WE7jlFr^csdU!pJ0@v`6G^jK;Lft8yH=DH;Jv2Wb7fbuK(OMz}M> zfiLeR%-E ziZ$n8Joaw+E=R=nMXV)>Ov8!e9GESl=ye~@Fua25noK0++4|qk>PN5Zh~LJy9ei_j zfl+K-I1h#OB?%T@L-XhWNZVGky4N_AMt`Q@!CFpZ@pFuqXe|`A#+m-`K1TEH)?rTh zvPP-WNgT&56`hLu>h(a>E^=UQ*%8Jr7p9>$7{WTPDUSLhRdVP43tp6&13})sn+3Co zz7-A=^!JN_a)JLN_46LDDrPq5UpN_#sD~Q7^iRhhj$R*}{AL3nRM7?zCNLke@GIdH za>K8VU)Lj~V8$9Gj7Fsk`}E)t2y%2b7w)I0mG$PpExGGykc6_?2y^)0ZTsW^y7B7G z!3iqr#bUt&O}y}X!NtG^&nY>@!X`fXK|FEIS5MDQ4v&7pceg5)?M)Xgu07awVA8yq z(L!SktFNd(qstPv#mcFgG+w5~As^RfxL#zONTt!ayN`~Tkz*|WOu&`WH&&}hV-Q#? zF^355p@04eSyGe#rYNm{DXDL9`EPT_u>Wm6-FdYCJ<5M+_P-~%aQ60`CTW+>JNo$v zOBJF`@k%7eAZKGtHl6HM{uTaJPwI|0h=6E7h&o5?B`L*tq~Bri{s3?4@I;6uP3i@& zUT-=X_J&^9i8S7_BDK=;s`}!Wg7L5)EkT26`yaU{9Ri+~f z#-%54Ol@qnL{McUIAo4Tc0rEjmHd8$U19(h?EVI|5)CPOtxa7w#ubw!F*1yHzyWrr zBXzu&oNKJuIN11mtK{;(4R7Q3mRl_snp^GWcEPp2KxMdmN>Q9@?8}PsP^S>kz71KOFWx30E1vGX=@~6FbF&&<&IYrY)&RW_eX6i z)4ud4==B;~l^Dco58Z5~FH5afHGYp>1onVfm`js432;VlIESH#XvYwjNOJ*&t3W;(Q1J3Awxcf;Oyg=H#M2}>aJ)*7%FKBK8 znvSVjl7%fKMejhPN(P?Vqidq?$mWBMye2AxL}aZPWqd}8yhYkGlx6DJQvVQK8s?os z|Kaf^Ta*#>>eiVGLo;H z4s#kxrdp^kKp}ibc<#<-JpC!Rlcw19$4gz7^Is~cU(67ceg1DhfA)0Cy#L$YdG>hz zKc4@o_8*%7@SbrcL$=Zk0z&&!Z{Fy-jL-mKxia4105-^da=X5fjc7*dp{33dy(V3t)cPr=RhqIr* zCn!+r2RlTF`!McLMa?zsbgn!#F0>K1)2fWT&ULZyVZGqu?%kRCS`udE9z(m*;F~XK z5>Yd6!-`W!XK&E%H|T+cU&gyN4v?YNBJ5G1z_1f|h&D;ezC~mLj$jvd5pP3s31eUO zZV_}|P>=-SZllc)_2eW4@HK`%AB0G+7JiZ&<&ITu%P zM`wp;zqQHHIR!kBsQbg#PT46O^hQ@+y2l@s+J#a-`IGEIPodB+UcaAR>KT-J?e}u( zdJd)PqcG?V2btx*hjM?<>(~!iS$3K2O(=7Al~dC;;+Y)|a|$6`*V2igX`j7eS(b&SaOTNbzC*+Ixl+A7xhc4Cy`2UVG1wl40K3dxoT(WUswv zNXThEt2{$Wj?0GrQDNDwR_R>E0XnvkT!E$Gz-AJIHz*UyxaDmqs`a`hIpX zWWo2j#b`MXDNSltF*cbr=a=W3c;3W?UuEro-;$|?1X z1c**v$DYyVJ3YuNg_U)4OVLWnErqLmoL7q2@hYd(b6V!0<$2jN{+!k@s-oGYkQV-D z%;}q1jLvqv-^(nvg-kmDmB!01hFpel^x375GX_C+8RRj{29aGA$=~6$pIz4vv;_^j z*;QfR`@vuuW*0-c_J%iJ4q<73gk>3YvWx9--$vP`kTrtAMGiGc67>d`nT2Sl1$8pJ z5bd+s{7TYlXPVt}5>`82PNC;CyljHffBL(vrnY&Y1cFei2s4+C+rS0dGH4kWI56?-|&nx%CCXIERy-z?XmKd^2J$p_JJN!Lc$R%zZfs7Jnmm`V4 zH$BfO_5+EYm`*dZ9Bskf!0TrfBmVX>_W@c==nI}z2K(fVhFMK*(R^e2oQy&wEA+CO zB2DEovokcP<9aW+%q&HUk)KnFl=0J!m#vEK(5ek{i_ymW+q9p>@z1xA2AyD>b#y)_ zQ_v*nWedLBEV*D{bapX1{qu{FREX&WvWt-hm0OH#jFi71yBMw4{9?N#a9>{fY9 zO!YjHZIh&0&m-A3iK_J+l5KAy{p;DZU|Z{9e#emfhxr{t@*n1Q4C#NE*D)l2{p?L< z86^Hu9#d?Scy*jRMv|P4bH_-M({bJy$)0nZ-!&xvaSkcSew3&9v8Z+&_OeAf7S%rF z69dWrA)gpH10V8;L2}=RoKce0_gij@WVSkcb9{1?S&B~5-?JAlOOReJEl7a$@_R-$ zmRwpO{k>eqpj&1yk7T5T!XBabTJ=Ofn7J=C?@q z%U8qkAhQ%HSfa%Y4V)y;^K5Nqmjs84!SEtmVa8JDQvXgBeQ=9HZ8$?Z!mS7UmQ@7k z4*kk1v5l2%XBOGPB0HN|MRuu{%-%kwB2Tl50GmJG%53L3R ze~@WA`kpl`zn@)-H53H2$tc%S0&-+HH#(B`z0ruGW-e4W)8cR}A_yi!_BZWJ5c*hi z88zHG-yOVnlz0d9{=X_K-u}UbbDf#kQ$$8^8|2S>O)z|^h;L&r2z@26=!fmFyUMnYS;dgARFd3jjTPEbfy(F8%`{2fio>NKX9c zQ#clk_>X5hPaoqyALBnv{I{|Hx!)7uZ($XI*cJeSTP{X~GH#6h9)%A~yztsUEL%s& zvULen79)*d{0E#k=TKYl8D13;1|0FBM2P%I8BdA=n1liZ2U@0(HHzlId<2{bg<=<= z%#Q-~%6wNo##l}lQH#`6Y)2%Sa#NHTtpBu+0{Mc zq*t3mc;N_|U;Cw{Wv4J++H-1N*v7No`R+R-eF9X87_8p70=x?cSCKfXqO`(`xupj6 zxQTj{id;hcT`gd+;!6GW)xrBZo?jKrxpD2^?iV{+inoq|9bB|_J{aH^s4;bD*r$k! zO8tpPsm(AhG)PF$jIG~dc+}8}U!ia#AcmUqY4y9cJN{+Z&7AybEqN_MH%o zqA9{C;;74o7X?K0B>?q8tOFEYipQ7we(*~#HgAI|DupzhhKS^G)7{qxE3yY|^{@9P>_YZ$)|6w!tr)2oJ{p33iH@JfMb zuGLzUu^1#yLfPT7I&l%hU1D4y?3cv&ksd<`p^Sz}Xbp_aLq~{ma^QJbQX&g);6#gq z`9epe>Z3LxcuMoj_F~ROzH6o7=hEa6_ zP)yJ*rgV1o3^qw=e{);V&MsvsQz}nRcSOWeg7abLpoEqd&T8NrEdnW0x7tR(gUxfb?!K?j2_}|-`yE_T|@9mvO{qK*{|D@2khz7W|iyGkbKTZQ&5dY`E34=bS zKIa^cpvf>GHbsvY-=2JM9p-8S+}r2JsPy5^EHHU4V9#a6>129-TL?K;oYlELs4Z-V zg#SPpBGCvjdC!6X_HQhwU&m3csfM-r76Xw)j+wFF!=0gyt0 zfFys9;WDp=y)K;C!S8T5W6j37qe3?$u&#owObHhqErH69+-U@uNf(_%Au9|KFNkS~ zI$H_oRYK!k3B=tJ0q_mQ&o{uMqI}F-P+aY3qg8|_asP^(%!PX-u%D@f%i{Dt>Qo>u zbAbl@f@aB2kh*ixB$?;6xm`(pg0^kQlfHO3_r-=p+) zKPpr3?*T~j_~*|)|5XIpKLY=6bLZ)10{?G&_woFHwEr%F|D%8+i_5%64dj07Uk7yl z0y{wN{m;%bbN%l=%Kwk+U#|c70ti?W*|M;xP9ReEa9%qN#~cObkP|nHOn||FlmDPJ zk20l9Gl&gF@;Bech}x6c1VN-8k1;nqRxt3xiP>zZ3fy{!UN|)!YW<0Fzu|LZYKJRv zQX^|i;@Ss$?-4wgu&@auGbdAtnvmI$*z{(mH4>L9L0EPWO}tF4Qil4T|H`L2=E{e zEmD>&+SWHZI3#(-vm}ja0!^|zIei%*yPCIPW69X4U|NM!6kscamnAR2?2mj19x!l#ge?Eo1Ol zr|5~@6R+q1LzCCc%^=xn*!gEfVe`C`Q!D%I<44xfb;gnR!4D@fCIg4!>p5@Ii7YcS zop&7Z5HK>(HHKy!=j_(SqHVDxV1}nM2CC}z0?R(rr=O$m6Sw8`C-O8Eni>T;0cYFBW z40gKc{7qjDE9R(?ekjlIW73$w^9DTLE>HhHWl=cd3WkgdbC*Fo1S-&aaG2;k)2JuX z$72jV3{)%fT%7Q>*L3drR993lgdT!2(_{LrqJ8n-n4SwtVPDq}-Z`z}F`82`!Iu?p zAAt4DWjTN!O?#G``73plKfk&C#$;i<-^Z71O*U$FL=V4iJ0q#>vrE%)h>-{0IW|Qb=hPF)dASdP#iºp#T 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 (4=x|rd!ieYb3&v{a6F;XDdyS30 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/liquid-4.0.0.gem b/vendor/bundle/ruby/2.3.0/cache/liquid-4.0.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..8bb56d49f39e242862e3928834f55bda9eb8f1f0 GIT binary patch literal 71168 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 IXzq_H0-XeFNv=@$JqRPpsxQQbF0)NpgR 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 A%m4rY literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/listen-3.1.5.gem b/vendor/bundle/ruby/2.3.0/cache/listen-3.1.5.gem new file mode 100644 index 0000000000000000000000000000000000000000..3508492c768aa345f8e35a4875c8110d9c1f07ad GIT binary patch literal 27648 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 F{s+pUi#PxP literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/mercenary-0.3.6.gem b/vendor/bundle/ruby/2.3.0/cache/mercenary-0.3.6.gem new file mode 100644 index 0000000000000000000000000000000000000000..e5333e006bae100c0b2bb4a1eda22d89487e348d GIT binary patch literal 16896 zcmeIZQ;@Guvo6@SZQHhO+cs9)w%x03TdQr`Hdou`Z~lAcVxRafX2&@vcFdWGFK_Ct zsH}>tr=s%B%E-sw+|}63*wvW9(i`Z%OPKxVg@4p-1wC5xeSAISlgXaK?57-RrerI8e-O;_@^LHPLN%vdY9mchoM{F$ z3No(8*|j1(do2#ecEzalxy;YqJ7r^y{EKR*t+hn8F3UGNbI6`VWW8+$ylRsbjnK8g z6f=83WEERlk#g=&b*JbTiO4nC+qg#zRf3+y+0F6h-XGGIr;EolT064Mc%@&WEwl*) ztvLb~=1L$yt02^!BEfDXotR$Fm=Xm(n$-UY*`y-Kkx}(21T~jp=W1@>w*->C5qxjs zj!0(+keLE>B0Cy09UO_Sctc7aaO#AuSn(|Aw2=DovMA)Zvh>pG zcYVGsLz_?4-WjC?HB2MWf37CFb1eX-ERvh-?UT+&q^{H1m3={X@|jiVV*RndK`Qo3 zN7AJmpBHea_%-2cTT;(bq3QxzOz}>l^A7H*fhXFb_$O>T7@teiOBEIfkwfqoCg%}f zv-i=BGlW;X!znw~fsFqOgQv$-nupc8smr}>mlGbu7qPLg5wEXq0>*_+3);*;u{Ejd!JZ8j?7o`!3w!AWdvN7QldTKf}u0= zte05A1rxzgygkz(q%z$|DOeo6z69RTX;C;)8NRuDvsLpMLRh8E44!@7BKmGrepRLap$D)ke2kLAO`H4o)9Kwy@ z@#8qbW99QW!YAm|&D?k47`+eD8>xrg1}r5W1n4Dre!O17mI0Het(%`v#_9cmizk{k zzqSR^_QO233#`ALZr;`&M*rY-<&kc4n`un6IIF-q!aE(*(Rj2Mn&a3~<{QW}Dd(Nf z6VMO94z1m-oOJtSdQADgBvAID4O~C zyj=%4oo#m}^<;SG+XHS1TARKC5Tyn!00F@Xr*B8xch?B8r{7`dy9&G*rt+(;0OQ-m zHvBI0w&S)|^qC0Zh&VjP!_|Ilxq>3ICyjhi=z|_Bq|Rn7ev8MA`KXT4JdG>+dpDo` zm(x1V8ZCdME>e&E;r?$@yIe*5wIRmXFyH-Iy_>P5x44~*hhP1ElzLxxv;kdr-3^E! zQ>g|aZ%8wcphSlF92x!d?cRJKiI0hwW7)Zk0xGSaHD7%_K8Ys)$m^b&9{^fDRmPBm z$%-`IT+!?chYIjK6bUcXnEKSF2__LiXEC_0kT8T}6*BGv_G`p8VLP8mUA~>vGPzPt z%ktjL&xZ$~+qIZ0Ff*IyV9WT|X+ZdQUt60?#sJmf<5x1PtmZa7>p6hHP2P zl+l!lDxwYHi@gjWuC~9vUPh*2Z)L>UvTfa(c~LMnRm|0fyUN-bFEijZ2BY`r{HZ8q#&^lM1;IWt#tIcmD1s8hv2uIO<_Y4xkPPBX;C`ab6N5WOOQiG9?qVVf zKA1M056&?Tb^B4q)b}2B?7*BZ<3cL7Rs6ez9RunfpPF=ixUMs?{<6HT6T#Fy*w_P1 z2F?bA@f2_plEIDaGleN7a|Ep^1uEk6IJBI((-4I!-(dPF&DzzO`Q7y138ut3Q^r=k z-H>z|yAm5TKJwOs+swwoV{b;+DC2olA{=+ zI~)F(8NrfEpg@K(8tTJ}F@3bb_ao?h!M7G=L~zr(Vsnq5A#CM!N+>;Lzw@BrB6;|n zb~z+Q@JX})&!v!ZHMsB#iZr1uTVBZl;tRrZ3Y2FoI7y7Jk^VxaNn_Jymld?rt8`tr zym&P?;TwY61w*nS(WvwTZuLa3K{Q8Ht*o)5JP%bo5QHsD81PGJRKhAV#AZU6yAK25 z!VZk3>C$sI7=FkI0_219g*fIfYfGu|>+7+~E8p3+YM3jQ_ps?z3NA~*ty~@CmCUD- zT1UTi-9oK(3KlIwU#w@#5rI`jh91J2~NbF$e<&G2?qfJ zV1dR=ghTE`DUelgP)?F?`-}JtLN3Zy+YdlUh$o#R(sqpH$bmpsAmT*Ab`A!`>LZ!E zM!4RB*A?pU+0YpM{s#}J1!WFs2U1WQk=02)b5%22H1bmFj*nG&otvwI$?iIxx$Z6= zBO=8Us-T1qNvyAjc{yfT<5DuA2q}*2nI4i2tiFR!>pdq-J+N8r-181v>;)ztjl3h3 zyfyWWVd|7`{DeUFWuqq^AeV5%O2+xz5Y^mT+??%1Uxla$8?c=I+_%mCNW;iAqK&-ty=>9elcQIFmIToLSeTfKG{XuBFw{*k&V{3F*P1mLqyr7tkbmazP_PJ zkH8ZEk=Y2Z_i1yJ{~mbKW-6c#U!XsXvJoRPLjn>#;Bq34Br>rjcbf=*Zh<{ElcMQ+ z&xl%z^^$^s;C7=oy&PD^ms-6Ezc)Lh>;1Y_)>G(IOi*NuzkU<=(fa@>ToQTwtnF@{ z0rHO@*)r%wJotd?I4WY`gHWJBgFfl6nl*)yoTt23ddw(^j6RXSJZD5rB>Q`fJ%H=~ z3jGbb33Onx3rrp3PL3TIh92t{E}1ZFz*eF|@l5(YTpgw7*ENz}zbKFaD}F;rg&;N( zQwC~6=rJ*fl%?S%8d={TJSr z&_1aG$s(LQIooQ9hZ=-VqebMrR#D_;Pj+BM4i0pI6_^PHTT~M)9Om0EA^KzpV5QLY zD3Np|v_MbUn5wX--2@7+B(o6hpa$tmg)y}HsQR*)AZ$ArG*rfd@O~?nG_>f zXKGPywMNtCOO6)6Lxz41f8W>n*;j@e3F93<{b6~>>@XB z0OWd*1-#(5B^+*QLFbs#ZO8M)+t<15o7Yo`&tlJ4$3UJ3qayNO7a;Fp1HxQG_xxUN zZXV0}y_`OQF0Syu`P$`{-PzFA^P2XJlut4@w-B|bCm&# za|Qt4UBCN>5mF9bncrpZTH{pa$V5vLIRTn|Ph;<>pwAig40n;c}M z3J-6(0-`Ey8;Js_AAc98oTrnG`vvI!&i+XYV;|F{Pg%d&goL~vp4RfAISYUzVT;GB z%L^b5Fh|)0V7A|Fs6jo3^T>GvWeHCjyVXxT4-$S6r4sJE(mxy3L4S^rM_ji4J8fb1 z$(8?#DRfug+wCnvvkcy_;^nHZItGhu<=BrhTSm59b`VESBGzgA&O)ShM`4Q(7vJds zc~($El4ZF^fl+b0p2lXXr%6XcYq-oK(1(hT-%ZJe$cE(!YWMYE9%gS0EM{er@fSwl zOb@LHR*DbD5hb0w1;!W$ei%-8DrhmVD2NqAIR=cxMn&Vd#*WRN%U9b9#HRVvTHS3? z#_5KmcI7bd zd1dx`v(vguu;5Qo*{^H~R%{^|B>Gs=Q8@Jdc=rIZm)xL^=(GW~YPP-vS{6 z2$+I~sX3rQB^%CG)!MRbwQ%R=Q@S7qEA4jc=czC&3To?~pQs+n8% zLvR!^nV)*S#Z9Bify&8p3sJxy2$elYva~KtKoa8NZ0=8;v^AO&(t%8t1E}I+j%3E^ zr_#yRMAwPncJ5?zu!p?!kweVZf1LZJQW|WjaZZe`V@6sCJ+;abcH6WfG1xMV$XQA2 z?BMWIRh0@RhI0!-u#yCkjGT-s7=YRYdOgal^h8PGbxcAAnhrt!hVq($b(6ff=x-Gr z1$NRiKjTt!{CSr~mhwn~{lx(3!%Is|6o}WFCa7vxdZ;`-+ zQ+&v|I!iPIS-3+V6l3P|A1VgAp9k4M*IlUSPl-a&qjK>?KyUhHk^4F>x;g@l2~?Lq z&9=%i$vkqzNiG9*EaJ{RELDUlT$C42zg-~tcsZO&DYvXQz|R!`^*Xy^r@6&kL+@Wy z6sv5qyfSHT7!k_qCO)?)Xv3EdbEe}$qHIzTm%-_>PE`bX0kmX}`NE(aMWic6(V+qNz@3%GL2)aHu|1g4O9p@ILjHP@NO98nk-nTC6S#5Q zQ11WRaU?PPv@w%p7gbV%OD3MVITR@A&yK;n0>NY%=#EAJ94OM+W<^rPN?8q23%8sM zLaupE5tMg7=*BjpJ#$AlfbQe?F5*UjwDp6QF*Qfbi2;bzeeX&3q;HR%Wi zi_NQ%oPc9@1^z9-z&@CVp#XBSP3r3txJtCx6Gm2eXr?-;3eD%DjIpRfNujbCO9QU~ zj2_g#{|fsDt@=)%#+-Nn=Nty~OLM3;vJE|0S6`!^ z+8;2m8S-qjJ{8n(x|3pxn(Y6p5);&#=d$10ko|5h{;k<|>*d)E!Cktrn8_96-GbEW zw_2pC6OM2UatTcapqkPH=Had!5PqL zwrBAYdUqrsQ8IKXh(#Bfwd{$}x$y)-bi>i=i`>D7E@_u~9f<9syAJr$|GQXN>It3dSn`m(a15UV% z;CUUej*{}^(s|+@vpyGBOQldrG?7oO{B9|!iwv)dx}b40=Y*4Oq9L#{XizB~;^h2G zMCqGodMkBmQ35ETT2}q1Gu@p{lk$RIBheCsq%N!?HP<=el#ANShUh9~WLbS;yMmH% zFyq)KL1_{6f1YfUslPC&@so=C(#iQ9hs|J>Hl@pjiiM|=R;@q`RTfH8YbwchQ|YlT zaj*J~zz35W6`Obw1UHoRoZQR_&}D_V-{w2+kmgt&--{(ZAubbOa^SMz51H^C>bAd0eJdL!P+9jXHNsw!gUeD;BG;{=vJo z<>BGMQB=zf2Vr)da9DWylFfT&`v-oHsZ$Fs0QV@W4IIb^MUlTnT{%KoEBN$KG7Bl@ zFjwLA>3u_<#ZcRwQKzDE@t^p!+e?{qcU^QhKSBFsB{<4)k;zJ&bs)N$1{7o0 z^inztKcFzxALVhWcXXAEvD%h-|)`y9n~AE z8Su_n!iZ?q_RXiBS4X3(@iQgoQSC2Ky+yFTf?y-ggEpL|iK2mO2)l<)!p(DKF%;8s zs_9*ox?LRF@yAZ7v92*{^7m!ua@uKnM4)CKMGojRw;NZ_d|6cFBr6wihG2y;TRdwQ zy*C`W{RPU;IVt8wM>KbYzkY7JPY8K|ez|=C3|_tfcSasAKmR09K3t_rFR>o28QqK8 zh*BKf#|!~OrC=>_kaj(Vmw`~gGREtGlvlvPkAEfL)}Iy^5YXV#5C!;T`w=vBm@EF( zb^Eck-G?p>R8!CMvYkM21J(1y?*M=aHi_$n-$4>@)v1r*$T6tjHA?t#e?P-@5_%xoxBMBCpcW?ym~ly{Fg^%nU1_y zj~c527FE#+nfi5nVW*b;md}d<`*n%(%rgCbT_whwgPQWnI9885KKrH6!5hD|vPg&_ z(X{^rYA{6r4FJlR;oN7oq|TS(sQ{DjM%oSklM#YnWfzr{zhAE7Dx<;5Mr}@rGLxq- z1tM%HGTAwNYc{lVZ>^X2=@W&_P_6yGjcv}NTA{t-JsCf@59!ZA(#JgryWo>?h7=)k zP3L4=#Kc|OBy#t4gUka~S~ZpK1sq$wD>byD0CFAK34tI4L(E#Xh;Q$H1YI4ebriLs zq1=}6^@;4YU0iAUGFooBA1b@$F5dX$Z6AOk?kv1M!PA`QJvO+5Q30+RCg5$(FdRVZ zGLt{~z7_-6u(o^$_;>v|0O0-rlHU6&c2L7)-vGTmri3+r0a#ffg~^*&(i%-AGc8bw zHdtC9J#yOcjB%tcid!teAyyqN8{$NCeTR2>{p;wc(QHZv?Pm|-FS0ds-Bn0pLlp^m zO*rAeWVV3m5KM5h)4RkFkr~hhqGy(AKwOmD^l*RYFE!^s_?1LY zkwbq_a+XJyd0(g>loa`p%~oi+|K2PY==-HouuPH;t1)&}zSeITmGCq67~mZIjkO){ z=lhoFH^9XaV1x?jIsg!60+x~iYft{6Nc74tVYXgD$@%ffXV5D6MXcDe?@1d1ebwsz z0zN}|ZuyNd&6;Ds8JR~PQQ8$TLuBq(QaI=G^K)}GE(jHro1<_9LcaTU1newd0S2}y zfY+2wfVIctCpM3y2}gp?NNY-1VX}*+QDs$bzMU%)r^VTjrZhoR95gN=#|z$z42s#f zYZHB$i4ji2lV%H}hhmidA)GiqOR4EBbpaM6e#o#206euB? z=%$G=x%k*f)d&9rXGg1+LfiGD0(aM+LrL*`4v@XR8A@@$3dd*4dw=xX?NErj#t*O6 zwcTN#;6!<#0PL+QdPwNjdel(^rZc4e9#8w;qar*pH9$p5biyUVcSET7CWGT*x?0W3 z;cu=h+;kh8n}zs^xtLNNSCr-Z7z=q}!wRJs*EO;^iIr?RT|rlPTM8W+sDiVB8;e+i zuWn|Ns}cv<_vLud2Dv0Yv|_-=HXO+kF)jG_^t_*Ubm-oS@Fe>|Cb==cMepUxiS!^M z8`~G3g*S7*>B$LnLVeweC_cz@MvspYVw$046`348phu^7n*f*;dCL@=JE089#cH zhWv_xqVR*7pNnMWE~WXZL~t}Bspa#s)iEx%kIe0f4cb<(Vp70_PPGJ!ZAnc#M6ya; zy--?eH(Qn1P8L{_M5;ekUwc(M9g+VN6@Nt|PN9}fPbsYbXRR;oGaoO4cM?AYeSPcq z^$Md$pV-W0UqIWA(Ta_}z|V;cKj1{Cw}7c-`dqIrHw$Or^R;E8qSCv!W`2RTMg_1h zo=?7G<1N?Irj6F(UcUV_161xtu@(AgtZKhpbMQKCmmNr`Y8)CB04qZ$o{HV9AttQa z80VG0S{nZ$&@q;*>ysW@O}b;YJn}YmvJ-oLwn*-A1JMOsvP~AH2LDug^sHJeRfr;# z#rVu2l_&W!9L0oi_KB9!nHGB#A?Gt6TIFlL+QDGYfGFB`2)$xx!&~Xl!zwJO#{9d4 zQ*6x2uSRw$rO1%Ruz|pi99yeNTh)*1ywd9~PurR#R51)>LMsyPBzJPf?J|@BJl@DG zkEqvy%*2EV%n~YORI603oj?&d4WFH*anj8i!m5UxDiTJ>S-8tDRYrS2i7WZ^ifK=T zxjeIAFtbU=3P|PmGOJi{_3=5o^8LB98BRR-`8SXJ^@{Vk9N5^rI4RAU#Bdb!9P+_Q zO*1u`tPPDETk{|4Frv}u8log^v&$VGc}M0qc&em0lxX!Rh|0UFocXB(eGRHEl@sJY z7k_N4b zrA}B4P{mZ(;N)w8^2CTxwj>;sJ)t9&#!GOjCtjPf%A zO*IISjYvexaNz1i2eEAv-Q=!Tt=aq?@0uo8d4=bXMnHY$Xt>z#NJADI7Hc^JvLsIemF`FHmuxqUTwhC_bI9=opr+z9NE{R zD0YpJD`WmEtd2y5)av>-KVp@b198;Dl1?2pUHz5$0$4npzt`}0N9-MsHUr}g?C2m% z?^94pbp7X$n1qR!H8!Q?eT&`b)NIMkeKL#O&q!+`hc0{(QU9c0hQY0h=$?!k3Vb;0 z{#;o% z_hr{>4iC2(REmLun%GB+Utf`VQA0~3))fiWGAbTA;ZG@P{Z^{lqO&yDX~*AfD$@nU z8}1-N9rg_nlf)MKn^59v&md^1IF6?MSN7s`4Vtt8Pz)insbvCia#*ER`B)^{S^S(9 zbZs5R?O1GX?sP1Q^!3R$MR?vVQ&E+lI+fK%%tHt=VR1Dt2}!&wTk**Y+uV$^JX58f zX>bj(8Yde4%nNE6M6k`)mYf9r3-hy5>OQrQjGMW=VHDWoW0oB^pAAqPD3 z=H;~LsnAxI7-$4pM3H#dNvf2h){0BZsCzw4+39O3_$EhKAT&M$dmv2F#rMi#dehV+ zahtD>P#kjFKm$%v1pHE78ZmD|dzR%#;>8@1pr7Eo+IV#I%?e0YSE@>#IhzUDw=a4tjV zr_C5CEP(|KOVu2WNsgRQ6F-57j21vd>Knj}vmgB@;IsDo>bvhV;(90!FlPA-;G(@h zk$UK3S1};Gi%D)6FqG?s2pArT?D1qi8p%UjOgf|sc*<&~SueOP-2970j5WgOeA$Izzk-*-j3i{`AFiZmD z96L3J*N1acMnR{+ed8pU@u>72`}F5Z>VS3+dt-wtC5!3>vs$1fxSw4RXJ2*nFelg& z%>va#M0P#%pxDGK4fLm`;pGc(VT>qo^M z3~d0<9mvOOq{dbMH1okpD{{ z6vIqzhLgPhWbIfIeTXIy<;R})xT*$pDcebP6kAE(46~wD=1dUaub*M@m`$$KE)~uA z5XA!z<-w2wO(f*AAmRbU*@H@W&|-LDK;NO%GT;0niAc2j1lS*`hDgRr-HaH`8el|A zjnZs$EZ@*$_O@GP9;FFu^bjN(09~YBQoOpYO=gc{;+O5P#r37ap(({!x6>xz_71Sd zOdn7M(=G$pa>Tdz2E1~7>{+e?TA)p%9R1VrdYyM^N*VO|kJzPq)kpkQr}PMa+XzvU zz94c(43(;E!ca3evLtCf(#S4$68(aDs<1 zJihL&-jPZLm@AXJmLp^A?KYW2>(bLMX+h4rjmCb&-b;7n8@V+$y~TFx?3BYjqO< z8Dp-^3BaL$;MJL-pT7dvVx!w}{s>%Em%t{C={8%>Pp8H^y#3zVV4%eUY#w%GgY7;HrKU|$A`Xhl z4;*Gnm_CNW2NW&YATylsp4Vwe3(^~jOjz@Cukjg3+@hYTfM0(dI`#~Cd#9shXJ&7r zoN;#fhLH6$CI>GIX^#X;0Eg~EPrVG1=ORYOdiO|LxxwzA7PIw%pm4!-JYwJ@sG`Qb zU#1=vwJ*j$bK`3V!Bpb4hbBmj!m@N|5_jN56zqpxrM`j`qQ8N~+*Z?~i9@0)W04d74jY%H({k^{rII} zQqgatu6V3&@|f9KC8SV<3Fdgp+QpV|7|>#pvjPz7{wa?II9y+~Y<9fe_Q?O-&eZ~< z%nvqU*2+bGTtxLt>(=u)@;cnlaskJ`U47o0~WF zcIC@Z3~O#WU0WGoEGmIdR}08{Jp7(`DaY*B#&lUs_`GFDAdH0?k*&p>OGBE550GHi zCgIn|`Drg;(J~441lT&X(yK(yDxwWvdI-gD>iq>xcG`o6lcy?FSe^^l4Z^m(PHJKBs7gs$e5lCAkQF z$X`jG3esU^Dq((@EaL&Y>|5C-xQ$05_xhSyYUWV@!Ru4=$Nj)->wN>nFXj_jk>W}H zHCaV$Nw*Vuy`NcM_EcQn+uu}@buP}<(0=VX=PX8plqMgjaf~>B^0%`eaQrR!>)zn+!I-t_%8%p8V?Z0{J3w&lr>||9L6SH+DbQ$R z%ek=PlZ2z|yZ#RVR1ijBmA;?$pCr!eKY60^o(aI0^lJd&5fUBeRkMXumH&lChEdAvb}g!iRsBI|3Sf)@tnWx3B8Swr+FyZ3xD`&>V4=5 zONA#I=w#k89zQeG@!+^!Aty!jlqZ__2-bK$7!EwZfeDY-cQP5o5Hzt_U0d2*aN7E92^g~%NRB|oLMETnn#b7L38mYSn#o@fmQH2ZxS84O7ySs z3welWC>WxtCEvVz)i?Ny$>k8M6J#L5NfVs%+mnW%XLg%kPof(1GS-8ROn(M|JM7`Z zZed41i$F2uw8*V<_KH2CUlz*GTbPHA91U3dM&RW@qLURQ(Nlvt7HUL+%|st8omfqf z%G#WIS8~0m?=qdv zRBWIs2WcTp@S3oTliHxv63wfrES-dXF-HCp=Q@=NL5xXIuSom06gi@}Nc5Tg)WDc~ z;f2pqt>U9lI}ql+r^k^xsUDq$}n@1&LI)!0@-2t_Oog4x4%o|^?Mf^L$nxw zc4}F^C3r_$RpDpEGEMEsFV>u7OJz!Q+%yZL=#uG^ZmR_+z^R{%aBSH;EhaktgJ6*_ zR|-d;WtY_7d-O)asl!i5jT$pUNS=AW(wc7hj@}$cemNNlsR|oYim4V->CdD=eRn<5 zyFWQc?yAa+LYxmyjCKa;Onv4XsZB1dZR z9!Ub_P*@}Ui#kNI|V6y<3cGVS!hzG8fE+p~vUaUGx_)?7 zPRgxA{5P>fVQgs6X>O@UYR9L=S=?gPy;Jfz*jV|ns06+=W0gr?r@>&N`<)gIJH$B1Mqs2vkxS%MkWT35O0+xix_%V5es zzMGjg4FbA^q?1&5>_D}yR1TJQ4WQ00ZaWD!H(fR|&qS2DThvm>{^D3zmbBq4Ez!1^ z{_wu@u$9e2@GLl3XI?gbH-Ah|!3qAMG5k60}ZBJmm?OEmYC9v<0DD~ zmlAl9KMf5{Oh>NEZt)beS6A27t-W8$V{i2+-*K`31k+3t1X`&r6vhstI!ulfq_L(b z`Fu9a_AyfWA$vwjVMurS$-xrM^Bgn;fv=%a7LAT*y90w6uB_@@VK*{<@@&`<^6+Jz zkG}*SnVO_`If<|JwACoCeFs}U*tU7hUjml7hI7Y(!k%?^%JqK#}9R{Jb+hfR)=RiPMIQ>pL`F3p;2 z8A42JaZM~#GN^XeqzADj_&j{m=KMC_f5Kq|)0EQXfCm3ze@|G<_N4&iW5D=m1M)*w zC4N3R9|1|wJ~H0{$22mR*{tf+ch509+RU_H2MoL{~(|WB%$tCFsd>$)11&oCidnzue*PTNgjl40vm2Yd*3& zRJIW=d}q(zo~G7_OK1#I79)Xn-6-Z6+xOJ8k(m6hr{}T31AK%0ed3wjzcQDwy`hfa z%IKgLj3L5WytqhI$@u3F78nxjR?(%wB^mUoB^p>p#3X z`&Ir3Ooj~9@}lj^>x!uErV literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/minima-2.1.1.gem b/vendor/bundle/ruby/2.3.0/cache/minima-2.1.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..6e8aa61287f4a4d9c6a1a6a21df3e13d488b038f GIT binary patch literal 14336 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 S^6@VO{)NE55cr>j!2be9aa!~M literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/pathutil-0.16.1.gem b/vendor/bundle/ruby/2.3.0/cache/pathutil-0.16.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..1d8cdf8f3f8b425d2ebb5d656259880af65d9cdd GIT binary patch literal 11776 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 BJ-`3} literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/public_suffix-3.0.1.gem b/vendor/bundle/ruby/2.3.0/cache/public_suffix-3.0.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..e8fc0478e6d7671f97da6fa1c378d1dee8c28e45 GIT binary patch literal 95232 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 Z%?JNq{hj`0+`l65uL%4r0{^cg@NbGvH$wmb literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/rb-fsevent-0.10.2.gem b/vendor/bundle/ruby/2.3.0/cache/rb-fsevent-0.10.2.gem new file mode 100644 index 0000000000000000000000000000000000000000..cea2115e9969bef4cca0ffa1950e9e6a7c416573 GIT binary patch literal 50688 zcmeFXQ;;S=uqN8JZQHhO+n%1bd-`wN=Cu27+nj0Jwr$&Y&bbeJ;=J708?mwbu=$cz zQI!>6W<`Bfl~wkZZl)HdZl+8>03iRXgyo-baBzV9hyEx3U9)mO$)7sL~?!PwtxAOm2`~U0P|8VZVng5?!C60yx z*}~P<1p{By+H{;}LGgb!Hht^aA(hoHA(b>+YjRho6tS-U1yV5LTob8F0KLAthW+I+ zrSvwqHrv|JqIUV`{`ENTx?dD!M!Q26J5kObto4?0geP~QXHdb(DzrjokYYfiw0EKh zTq8{&fU7LRv+8550;ZV0(2wUNTwE=EVk#x=1Qr{0X+`WOdUAjgd}0GtVQVan{E`fe zgEO`&U#b;y-wZ8XPpvARAEy{OQBo8gI$z0)GLLoEO%UwH^*eGBYcy8>*N*SZ@OHq{ zd;NFl=V7=XIqrgrrHV5s(eV7d0W%}kul%&Irt$_fjwyZ$wE8QvJ%?(keMZ-fNm;Ou zC%?Ssj{(KJ!p6@k8A05TPjrlR$=Lio1m+SA_g39%QE}Lbe48OT@bhz-783&4r$7zc zVAEf2!0pf<%!$^>?;^nauv3N?;S(XmaOOk@y!trzELKQ2A7}9xM(?8K2QrQ9>_XP;gaUFx3cH?AvY;NR7 zq~E2I_48(YxWKdR?1bPJ0#7X2(IFNE@{U7p7fUaNX8X7`G< zz5n77>&y0j@b?f{H*ZLJV&k4+P!`LOThiB+SlUw>2)B5Q0*~DcE1EhGg?VL+ci<@t ztaz@)6ew`^cTw{A$Ee-21PxDRZm{6vLE<|wtRnk!1nx05 znI!zvNsU9MgdavsDXk3y>fY=`onim&T1x~Tsr zaQ!Fu|6{=aZT!#5&c?#Q`Cs^-`#<=foty3d^8f$DH2(kY`ak&pq7&IiV=y)75(d4*7{<`v?Kilp?qko<^ zysx@lrv?A%=|9s;=rdq~1$7lN{*A_(?wXpHKuNXKm*1Nekc-hpXQ7MmHa3;mj7B=} zFYwr62?ms(gnsp9N16q6pPf-?*&x?;w?{*t%&(KJk2Jno`sU%K;^0(uYkZoHP1=!q z_J;Kd!Z4s+PI;5~kr0?!SSRXlf4jCsWa=f&6J>N3F}fF*2sOFrNg3g`0*r6<>}{5@ zY>OKtD=(rTgZyj@(Kd@h$zArxQd&nlo2u>O)DH<*b7WLFJCX;-XFl-j5GCvBqPOWiE}#oMV)03nUFHZs;3m4>XTTSuIKQh z@5X)MBh62Lb6BUA+wMB6jSpi(_4ofYJ{s}hJ-ZA(HB@Q{a*x|U=m;QyaSykwr7E-o znFYx-bF6}Y3>+hpz?|l-*n51YC80w}I@d_SZVgduX80Qpf5EQ%yDF=z2+xPyztz z`s&T(1T=$qqCqwaWOS|F+#BgzXe6qh3W%bKQF)p8P)Vwht#m?&uA&cDPAoWA;U%Jp zr2ZiK7}bq>{G?;+m|ImU`VjOXeRvw08le0nNoSgIQBQz^E5j&F6ofIzI{@OOYW*)9 zy&iTEZv#3ruOq9qe4kSBD{K2R19L~uks74->dr?g?ZQG;rg~2h12v{vXLmk*ZO^fQ zSqH~c1L{_;(Wf-`JH(o_A(u*Xd;LF!h2jqO>4uZ`4(WyU1|H2EZQ9%&dRn9Oq=xeJ zEM@R37;Kkzsr4dLV}}85ic40~-ofZ1?{ewui|sWA4leF3Cb^0U<%SN8t)3ltT7NDt zUDnT@T9%NYF}AJkf7&}Yb2N+7##u?rmm4u9y2ER@nN}!K7x+5CQ;ni#2dtgba;h zviTw5i)95Ujua;S3JZQ2{50^2N;SLr`2@sAc9p6eA>}dpff&9%J9Am z?etaT=TFu2o9!d3=@>2DQ|)0F{NgU`&f3BjG7?&mOU*T7C1q|;q8?`?7>@w87pn-d z_anVdWu;)pI>L)|aIW=1bO!FYoM>u+4FQqBT_H$r$3l)*D)|7B+U-g&QBD>0P-*CV zGhfx2coV*BRgO-wvYx;i40szIJcZ{BdNdZeUc5766apmC!A{lCh6go2u~b;`(F)vk ze4q)wO_r*8Flb-g&7cNm2Q3c>u05z3C?lwFevlkGl9XsOIAV3FcFX=%)5dvhkQgxJ zK#2LKF`a{4i(AAqvi`~XM2Z1=!HD@MrSBFfg`py@meg*TnP8KV4k$IO4wHACWkDSR zofC*I+%M2nZIwTD6e@6<$TS^)DUmD(gZz5Kz!xYOHmKIiCoukuX|@!%;1$?Kjscg7 z!$fa`-25cL1(DX283Xjffm;b+sGUaJC7|sX7z(d(S9~tlqBg}XO zbcy-P!wMt--K~f!f?J!;VoQ8k@-U_QKp6R;-_E1pIe}v8CVS{JQIBt(KygE8XyK)uyB=x_ zlF+SO?14t9k$8-Ypg=9)8Pd5fP(*I0N4WzApbxXGj4;aEEPLBv*GuTqWk6zj_s(Vq z4E;8a4AKc!D9;x%DQMy}{JjBV37PnAp-t{V!;;e=sa`H8et3iy#Wy%kMsxOq3Bp8&QJ?udaWzVF+Q+q;3PQZh<7N&YxJj zw$}7(2A9rnb&bvH8iR4_8<16QDMkq?365b&GEA${b4!oMvW#i45}HnWiv=Rne(`1Z zLPU7KS z)ze4WjOq5GxBFbt12)o=FLWY{hvzmirlV0ElBlt|f3L~Vz$lZt1~n%bnM$ydih^DZ z;S0k9ZfhF-#*Nzmc?p~TJ_=ZftCWVswx~>#*XHC%8NI+xuBSg}y!};EUR}+YEdR;! z%E%y(DLPSpY&?so7UTg>=d($pDki83gAhtTu%!^njdPPkQ>zn<)(ljhsWodX`ypve zq7grtK(B|bS6y@El7w7TAYzUxpI1IED-lq3hSeGMNjYCc{x)aTZ*(kL%U(u|oA8G% zW-QzQHB~TIX?RV^$%)_>gz`!m@|>4zIzLFzi~wyBUHLJCwuo02x8sxsYY{q{d2YpxKqQ9@`kvVw4R(^6 zd@Nns2*X+^U_qW2hEv9xoP@lM?+K^O#zq9cOgT$8K^siSMmOiDzH^WUBAmjn&1|Mn z3puivIza@xWs}l2C5;^pM`MVF`%!pNRp?O1K!eVFhuOJ~vrrd(cE$Zl)v(B~(*UZ$ zAR|pF#8I2gHfM68cs(y)l4*HGru!-_-^}u5ZS0nWx!UkG3206z4gDfwPo~4_Hvv$a zF|9J<1WvkijZ=e4&TcQG;w9{Ii8{2SKVF9oq$20Y;vn3n{q3AO79Y+Nxr;UI zXA5Edl{=4WjP2P!WkNtS|zc&{?Ej;?6>0;AO5 ziwNC~8!xh6y(?0N@mdh0K9PvHVm3K6jL=YnFJV4|qp@pH7v&ym(qbD{!WI6BuiCl2 zvPMicW-lQpLT!0U)2`_hve*%Z#V+S5a$&|&7@<2Gtqnh5B63*^mNj^^PE!h$>pU@F&5%yTRJ@lBw@0byLPe41Iss(51= z8?b?&XICES%IA*Cf;2-6dSk@slgE02_q0a}F`wN5VV?eDdR7PrJ1HFsx0_A)R7ge~ zSoKRiJj(%{4z?;_+)|~gAk&7IgN-0=u7Ov~GF$~F;%v9T=x9w^bx;D|1A?~9;|JB0Au{`9c9pq^(|!TWx!yYHe>oca!1l0+;fjxu%sRXE+t1r ztgE%Sd~b3+jZ}Ew`8*^Sl-ldLAl(^8n8})F@S16;$_}$`Q<=vtP*O7*o2f=mPhH(m zKlT;8yzQKiV@BeAwpDB zazRM?2T#$*oysVmKZDhGZf5G-k8OftW{AeTF%{!03c4ZXe_|K*onm@L<=#MoH_>4O z$QcUT#oDB_Z}L@*iqKUr-WaPY%yi)hPVYt0jJ6`_tUD`!I8E{wQ%tpv>Pf5}&iGg_ zU@JTb5+zB)*m{uXNWQCWgYW?AOQ~I(#Y(6?vE5RFLbz)dO87o78DC8N;w};v9!B^M zjA~+TbnFEuaf`KYaV>R@*g>&;XwR?*I96Nodr2>EF-+5iiq%%U}fs z{)$aF2l|F^$?@oX8=DNMNv;uQJS9P6d$+ z88UCbc&78^$)(LWGU1GQr;}(;S&N5oFLvbE6EexUm_t$Q?L<1OKZp}_r*MWyR!#Ie zaI4%EvewD-l+R~g3O~?k`Jez^s6(k{QIHa0MO7N$W(DCY7RVEmB?6w}Ai%Tbb(< z+}B8JGlp)%Nr*!r7e@#nxpF9Lf@a1c=4J&|6h$)7u{U9=F;ZS3!A(MgN-HoGzEnpa zruYK}4P`G{`iwh5>PSK}zm&1X)Zt^7~2z*-aZe2|e;K2p7P9Nihx%cQqjC%VTGKOz=mm zR~@1M?=iA@yktKYsl9$*?8pg&y}EiphE!4z0{&{Th-_e8MIK8G_9Sgd!|0{aniy4$ zsIG$dT*5C0zD`>91hx*9IJ!Lx=@FA7@mzP#6e^0(r2d{PAeWmA3lv;cEB130&$^4K zV&MZdE}R1tEwUj3AC3*CXu)WHD(qy{9?4Kv`ID-E-ks%7kjyunCA1Bq3iL@tI!77k zm%6~;D1XRN6je7ELd{emAMAiXK%T8S#n$jb5r~5$kLcwR+=8p-(B$)T4nf9j7pfsV zcdeuLev)57PJ>@Unk88Mk_xkf3Wa!g+w0-zvl852i!>|)kb?@_)Kj4MlOFYO($G0i z2YJnuIkRBn9bpp>odFf{uG*@B4IK=C_WY|oJ%~=aB66n3bmrV;2YRbi2Z0UI15c> z5PsoiStV)TPo6|k-k?Wd>gKMKCCEEk*545g%lt)~1(hb9h_*(8Oahpw%Owsj)O$W6 z{nHL(wa<|?+`mw=?b49T{xGrn1izPQh=7U z3|~~g6=~L_E%-qY6j@mwH2o8XoN-cg6XE52jI7GsO0dPNBz13-F;ffLV}FyA1T1Wr z$bI|518E!`#@d8ADQIZK{_lt|?>JhZiMBR{CrNT<%9hIsVkp(Pj!bR2-v=Fc^>dYr zTgxhcj!P?Z5v2Thh&vH|y~aMpkBR=m3_m(1cNv&-Z3?{H3zg%W{D{P#KpqywC-fzJkI8n2g|pA)na4@5bl_hnkFm8#M)CTQjnD7G@*MdJ_b$nJ&hwnC&L}WlV8Wl}|wb$kdVDLlscj4hYsf-b^^4#ak5x%Jg;Z?)z3zpmYPdv$G9= z5>y4e#c;}Tl35DT4)sG**%~w$Z%-j3uvtMRN7ia|2kO{&dON|th^nIcH*;|qd_$kG zE+6;)Ht-U}?2g*d(tUj17`JzrTUyG@(qT?&Q@v<1h#m_0LRU?nM}N6zhmWt4Ow!;v zHL8eMtC&0&;N+WD#rtOyo1nPu_a?gu@SFW9BAnh zZ1L>+uZgZ%vYnCoL{WmkLc=5P-`v(qv*-Gc*ST*j`*R)}(2=57~#&Z7Pry zv;3AurhT(B%eQ?g6E3`rHvO7uh1WSrg}Fqq`i(MuSN4{2^UDFOe&`$qq`+~uLu4Y& zMg!I(`aV_RM~-YKZWHfd^bbK9V}il}BeUf`UzRgIk#`2uN$hFFQ71_pG?3&ayev{J zdtaV=m0?rVH?*K8YZTu;K$sLU)H$KXZ?@r3)VW$XUo>1}QBBG9Wn!idutqa&_IS-41D>b8Zzoav=qE5fb8D`O=t;7 z3BLs;Qhhaa#tG!0Fx7lhFBjJl`~h`sw*HgeUeVMZsIwvXpL&p;Ds(M9AwzOh_+_UB zuu34xE&&^?nyBX?5pvDNKeM#s{kpe61-f*phc@+cCLzO zQPL;&oRUtU-{KV=q~y7?{Wo>&G(^!ENH+$GLh;mW_5IgIT8Dsb z?ZHEYfkKYRjlWqmeh#325m_b5C=>>Z*dgOqOIYs1nk0=tH6n0`!XyOD#6kn3hSqtg zl1}h>#hQT=GjrhVBB<4+Pq#w?4n1dot#}+1*3f4J%7#n~0x?edCS}&@P9RUCy)VJp zxoD>$lOO}1bo@61pu8XS^9=DW#ObXM$c zlE~+w7%q|eVZHIR{eHdT|{T$o70#fR4}qna|Vp&6wP27m|?Br8%S zSv|5rNnzwv4`1;k#GNd|0a7?Q*%Zb~jJb?N%yl%>K2y!NoNbbTSyXK@Hq#CZD}AJS zmBM6IRn3D|$?lzOYI#k0a>H2#Bs}&qlhE_WpD*}V=2!T$>v!gZ?g!?w?r-L4f7xcE z?<~>rEtA91a0m-xUGb@O{(<-7viCx{{88>&IO{2$be3l&|8tH;!&e`b5uNj))2=)4 zwt)WAqK3#~3g$Cl*{17LLv+G)bBbJ|C$4o&m?lssA!7BfF)Z-%D3y&FJ4J<~#F2OQ zBY2LtN7e}$8Nv)=A%|&Z)3hqdDjK?pWf+1B`h!(~3T2%(sw7XhPFBrjTL|P%Gy5&_ zQk|LMOFc`ACp@MW(s4F{ki%iy)*>uU8kWWP^iK+ldG7}K(sl$2qjLEwg1GN$%ChYi z0PUEi>3WNNCN^xNu4M)}Aq1<$BhaR|CCLyR(}F`P3kKsnb&$Wa;V9Mt?fi$S>gXHg zfzreA@^lE(>adlxg;JzGrn^LPjR?wRh&8S9l3oPk#0{qpscK<$w}l~Za^;&N)gQmI zlQcMv^K{4Js0Ph$kd+#L@cK3uu_!X{?QE;Xl*G-4XKWPSart!g2HN7L@Q(^M63@8~ z9=xq=fPP=XfV@l=IE%H~^*2c5*AjL>_T}ex1>XI;Fi-N|@2~0YvPjts&GeD0H~`ttFijeT6LQQoaqhY}E)j zzr9)2iJ9j4Sy%O~`BK?{fbY=N?_t0Fs=jZj`|rKX%!zyd#~{e&Ma_~|e^vX-z31ca z?&0g-!d=cKB1sJGNlk*#JG3|3S~RkMD1PrT2l`WgcnjD+X~ty{TvqSj*JX?IW=tm% zOh6lFjwJXM(t`G@aMKch!Sk-{_bMh~Wb$^8SR`&2F4FQ$XE^3IZNdNqR2i2rCo}Ud z`4YE}vfXsPFX+Z%2q9Jd2saakX#{OK6QC zZ#RvuZ85h-d@w-$0_NRbrYpQ&?tc&@tKAH|4vKx&!IapsA9yyXA9!wn94lnx&7GeP zv6nDB=ri6`Hk9maxbE#sd6x?27)M$So_!iP+b&@8b#U(P-<@uZx$l+NRlSZ?*v`>k&(GKNVjOKMh%TXFDyAXWz$78I$+-)g|UD zr0YN6kLOWR)H~^Wie$q6xvD7^>9e%$S02q9JJxQe=45?s^lB_$9?L~V^?@Er%GXkRn66)e`F_)*mIm>TjMuAxl9G~r`0lSk`f0=_BX(_K z@=&d}JVzY%mtZc3VK;L4`SE@i0I%}dTsf?h5T&Na3|QHmVr>z!23G-1ANNCHY8!%s zn60ie$8zq$olLJf7HX1rVxMCBKu;* z6TB0&(;6$l+Yq;E=LPdF@aj1BlR;5qH=Exb?e@o!Cp?bz$CcK>9OsTIqDjUC zJS$g@dN;8W$@A>T?N15T?+%boSPl19WL>tZq~;kbYkqO}C<=f$Qw#m9y56an`}GAX zfoni1?jF8u?*1qF(fx{tfghTCJU*YT-joBI?L^7;dMEr)T5FtDDF6Hi#j>`VI;jc$u{xE<}q3vKIHk0poCUxaN$3FmLhsL8IC)D{9p zds8JJ}))pi$D5m7eZj^t*X1NqN;1>sJhzndG(S@iE&!gcyAallYB zWAcoA%5d6dIcH3`6Ny9Ap6cM+1zw6FFzm9L6ppC6X!r4sujo0$gQz5`o1>*{nvG-J_gSk&%q5+8|Tj0Er1^_ee6ShyjsOlt-7V^#I{!L$*oUHEKP zS%t!}GB`2PQ8>3sH}<6uOcuKbgpR2o#LwgYmBU=Vx=z1MsG{*X@mKp3S%h^ru7#Qk zAt-}q$gC;8nZTVZhc<#nfl(pXQ@?X>_6e3Jfppdk+ACSMTDm0&%prvQ|% z?07(boVLoP@PUlU@Ip;7QCl0XbfEdR>98N^a~CBJ**8{_cU*Yy`y_ILC(a!hQ^cjb zfPUalLTTX+kE6miI``pi*$pt$+d`E?E<-e-=CHLdNu56wSD`Da!Z#VZeuX#$2C6T! zqw%0m4#x^;VPU@viLjC;-hI8OylD3PRC7g%qP{!_r?baA#X$$x5Xxo+;U!YL5mMhu zAd5x49%&I^v{at`=I0Oy_|e5SZrLM2Ai(xFJV846Srr|Nr`U1FgHK_&tqpF)GZty9 z_cgxexzCERT~95K=KQsD3m(u9!{&rFnUc2D9V#Skx`OX6D=%|ajy$t(g?T**>DONM zF%-s&fH}wgXXtE>ae0xGzYvytA|Ex53al`iO3R0hl`cZ+&g#$nJ%@~4hVo?EYI=9T zQ|6a(4nJ&JR+CSB-Gq)_rDmt%_V_bXU;V_JwPF+wzeM-7->g-z3+WyzV=zKtXHUFGb@gl`3+`jt{mtX4Osv$78{& z-1bt)@-TDWlY|jwnCt=7jM{ZYlP0l1q0KxAiK6U^)}0V=_A?VU#e-f4yhG&xsQ_TC z=;?h5du2rHux1DJ84)&}@L=v}ThZ&4sRCqLRIsJ??#!Q^OV?ZK!k7o8Q_SHm#p4cMF#R)gr96_HK2Vb_#GKh{b@`pU- z&tWuqJ0fiixf~_?SIxcs(%~Vcl&rPn7Xk_#1|J6P;oPy6u6dmY{z!CxsXGDKjT%ms z*KYZ?aqC}Ke6R{2v;thbi1^>s|OCH~@7Q5k7c{6!K@0KaX zkTZX@iaaOM#Z1!mBjC`o@`TdtJfU!$ZeAUhq3HY5}V`8CVMz6;civ zb4M&jJ9jLZviQacVGvn-8>FNeRFnXSDXV`J84S1_zuE!%j_~fn=`2ge^PwwH8k|Dj zz%4b9s9FZu`{S5JD1ZQYbr^}03B37h>N;qEwW>A3e>m*t!2y?}@zJk}lc`EjNRA%_ zA3yheLsh?Hzqc@n!5^`dv(3^$y}!?W)Qr)Qr!X0rcv6hx6UF-C6g^v_Z_KdTy|)Ww zuOygmUQGOu@~_5ck9x9?W4;lNwo6In-GwH>v-MVWqZxYDBV4 zKhs++svquWURTmb^=4fa=0l6v7x?Y8w>Fzb6}0kcF1W;@7>FmbPz4s>;hEq1V4 zQ_oyPY>s7ShgNBmh3w+{tdj13W;|KKJJMP?wUr)uXoo*X-O+ZZA zA$4}!>y0A{td0Ht1u?%DoF4}FW28e_2*S~{f#|rNh5)!Wj3tB6G|{tyHv+OG@gPN{ zBTQ!79?@Bpd&qN}xAIqa@53$4-Y!pimn|j$vT09G*BTMJ+@+RM$Su@*Q#^<$vUZ$i zU`UF1ASWO_v7-s*@1&T!F+^&tAxLbX^C^UbU_Bz(F)r9~kAxQx8;p6d=d{VJjleai z;D@{qKk*>Xz>(>NS6e06YpxC$slNdvsk$T;BP0qB^(^=Yzzl1kvx81kgukjy2}5Me z{g_p}EBV)nOV#_&&IW-0#!6yF7#duM2g`T(G8!kbs5?>dSUM9m)lkW^`dxC9hsCSo ziLwbveMX?dlL?h%EIaFB#dxICh{z8aUj7ix*FNu)!7KeAG$^aBM=nO`F_csVo;Pa) zzgJJTj52fpp*smSS25cYRG3t&`5a$CftlY#Fu$I6(1;u(!&Vn?_DcCP=U#r&=rXV+ zDMW;4?T;U?AqOjk$@_czd>W7|Z@Tc_FTAyfW_WGc<&-;g(7~(6PDzzS8HSx$HcH~B zj6(+7w`E&N+HHlFSj7_8nhA=iOYJS{a(JoVau}trDAe zpsD}LKqLUi;T~LHyk_Tc3WX<_J~@Z~*4wU&M@NbOre`+DFgsJ-7z&7O4^)dr?6gV4 zQD_`h%(nalzw?YVWcUqzUp@Xf*^oFupB{;ZWF*B{r(SKyzm;_nwleQp($?}4SkyAK{(r=|wN+i33S^JH%s;(MjCV9+|tJ7b0|;c_?5dG~N$ zH*p75aV^n`-@1+_f&}YS0(bW6*UQM0XZ4xwic`^FSLLiw_&4fVyVA4Y|1zEY z7V#HE=#%D^U>tb_S6HE$6I3M&c8v`A;KlDZB!Z+pTlNqD4l{O9MoJ(CH4|6T-sHgW zkCUQbmv;cmThk_Q*|INID85(a zoHNJE^Iiy!=x*gd$4Q-CA)@(tb7b#IZRcgoI(a0M*dzTjbCr@l5GZ*0$a5%Km6v7j zHZB+_de_biOxmIceab}O*6%gYU=h}|E4-{k!HHl$oqJk*==kT%91 zvv2a<^x&+LP*B{Rl`DjFl~dCC(AwD0^W6sngBm*g^60jT(4Xs8-oX_da!* z&!E+fNeE-s)Thxvl`$5ziZs3NHIs|>0sQhLq1!xJIp24(`X2 z<*79)EkJ>$*`|Vs=a4w}PlT=Ma(ar7^-Z7r%O=Se1O|Q_x2#1=E1>Tt>gBGdppVUl z{cBz->b&*1WEbICG|GCiF~Z0}k0XNWI&EFaG$vxhB^2C1`UEIPrGoiC@}f7CLM*8o z`1ovJjX1mfJl~2g>m$%62ZNT}aX~#n3(S(-(L*hZ z5V@Az2th17XJ%XUSN;@Fk3_e1DG>(XQr1WM@LUDJ{FQ+CQi13q0lSyjsU*93Cc9D0 zv5rJvS?bO7Rxw;-e_yfe@Oec>^?O$nB#}KH=*Q6P{#nkWp9_5oNQ;^m-uL?wMpm_}II{Dp1U^*6_1{I-5S!KdPI09lmhV6K3dNvGhGRpxhwkmSX{%p8^;ew?lZfa~91|B);q?UV5f|HmVVz{D%zyF*R5n9C#6b5{! zby~}*?^-wa(6z)&p?A@y&8~udOA&UztqxE}ITtD5O^Q;`fR?kog|mb8c$stbf-us? z?UIh{T<9i<@9z){&po$Pg9dS?by~%58=d_-t#1tAOJ^n zU(~OofbU4u1}aK><pid=#!xI}{(Jv@ z|L>Ld(9>^3e@iduFS#`%$FhB7gk9_7Wa#g1s~23RW5gGK=&$7W#I_~RLFHZ@<^0cP zSLKTr^TpXfYqMua5(y{nY(^@Qqtsz66NL!#Dd7u|c{`oXJermI%hV6xG(x}4YKQr{ zv+eAZIaYl`G48>`3XW{F`iKGX_xuVD(jqbW(9Q#PEvmZc9<|n5=$AQRj)zF!2l8@M zF!GH9%HzJTg3>|WY7<* zS_Qg}cP#;%%n#=Xroa1!O=?=Whe&~HDsG;_1tB2CE3bxj>o_ew%c%BoJ%5!`kB&9D}M$dc4@&ZOo7kp@H z|L~I7%zd+MOaHxbt$JrQe`B_LN5cN*rc|!QWi=0Vm8c}`A<3v^D-S8lO_gzub+ zf2UsNBV~7ZQA-Hux9B9RGKv`c-d3SYC*2XT+M!)pvpn;)bD<9TZYR9JA{*A6alVj` zOw-8CnEYXY$_A#T=IQ9k7s%1`5&zOf=_f27n*(lq6qDVR8Z2TRK%$TZN|q_k7h#xh z+G*_kUg)!xWvn?Y-7fyG zb96WgcjTo!Xj~*vMKejBs#}PQP1!1oKDoAlJMv^C45(5n)@9Q;^ETs01JOAODuev> z)W0hKzTWK#FL#BMu(uh1If<%y8EfY2uV>5pbda=H8fpfd2de8q)0MO;qQQ3?nzsfs z2~w10zU)w#Zh=FZ+pfbu_^u6HQ_r@!Gy1mkegXcaXdGNWxHG2fWi6&j^@IyaR_nkc zx{ue%Nj74v_^v79l*!;G-L76irKp5%qw84({ONd7{7b^B*w5jec#-7`sqaJ4HiaVr zUMFV@C99HC{77bbxTRhOf34P;b=Gk_1t_6H*op9+3myj5??2)ye?H?u)IQsEqAwr9 zXK}$?6tPj)Dh=(z!X{d*`{f(XPNf;}#fiQi#nB^|Uf{QEUWqs(7NR zPW=Lh63&OFw)KSy76w8epY}pp?_kabC%ZEZ?YIM+8s^eXZsY`cbkETcx}=bmwBGR$ za;btuac9muVS>N2#e2Vln88k8###1KEhLoKz!>|{gyp0TD9LA*m~IhKLB&3>GN?Q# zVRwf{-jfpJnntu@Hj-i(uoET88VJc9r)F1&JY(x@-*9D@?E9@pG?>lM9gl99o+|qq znQx;BNNfBu$)7yFzzvpHOjEqa`h#|vGR4WQ&j@P39R~B+>df0_c-u^6WWL0`t}NG| zus2^1ye;V5t-8vlcA(U{vj(BIuB4d{*k{uSoVnUckL&{@tAv#oTv(no_5zL1!hL$t z@V02aj6@J2TQ!UnUtA@dnWs^~tf07W`UvWAd1=GbR%{XHEUm4xI|ElV(1&y*Jzbr8 zn~RwPxnysBJULHuO$a19`u^(?st=$Tx01FlCB*;Pt$lMJCOVpXW0B9 z=VK&4jrm|8J1qs^nw^)OK0iGz`2jDuezK}GtpwPTnQngg8<~54>IE;zJ=YkW>j&_d zZ%of^onx2zcPJ)*&^Rrhb!8W9ow*l(*pQoEKW)#+^_+917Q6-?I{^Gray{qoi2z8m z_vjCQ({uBH$Da=$)BwM*T;v&7W~!nNE0>`1>^+Czx6JhOiC0+eFDz~kO(enl6W++& z(1)hEdoY4$Z>#Se7Zd=YxwbFj25Cp3`Gcm(x)Fgup|G?u<6EvIv0g|lk?1zngJ4uw zjvHQ-kPo)y1O16Nny>e4IDGW1a=~@{$sc^*#(+)fYYAh*w;7tsR&-y|2S^6Hv#n^T zrb6z5YtV;Xeu7S(4XLb|@CF+<-nT7@ZLkN-UK0F4Y;J(+T&z)CSL#Vtn2_+>j8yA0 z(}V1ZH;QkmiTnCH&zq4nvE13Laltj>1EHibkxb5P=`1(AFZ8T-beHtZa#Yvn$vyB| z{zQHD8TVl`xJx6it0-&vK@N@51fwe`ZLp- zbSJ)z_CP3-hv-`ibYyxf2~=W_;#%%RdcZ84j_;EFk5Qh#5W2!=pRwNj!nz>dz5=?^ zXSfkL#%GUbwBx&ofsTxCVY8*cYto0!$gW!8wff1sz*|>j*Zb_V`G0^h20Bu|DHUFe zpZr0==$?gnJ1VHf_Z^>YCGxeFV_%Ew5_;gBeTIE7jQ(fsi2CLf$;wCUTbr*ewXJ`W z6(|JHz%RutvORb*E^3VUrqmy@<_-Sl7v7aM^9=XqAh{iVvL4ih`fw?>P5R)A=DRJu zeLVY&_}~lf`#!@R(*-^A%<*<5xy}0Ei{aZXx$W_gBf4$%U5;Aq1_SU&-SlCXyMxLW`qmQPA6-EgNYkfu zy1l;Ct?|h(aM{~j5`84M&h!!Pn_JsDU9Bx08}K^OoAK&4@=CH?(OWK8RN$pJ=9|a( z`@{GZX1YuizeRxwZo~xom33(s7vm?%lb6}?1^x69n=K+`q&)3w;Hi|rn~|V*ApP^= zu26T_#@`sH50GOPQOW}EqOQQ6uNT)IH_GBRf5Yb$_)>TA=>b+eDnBs-lTmtBd?~AniB(KY{ZK*Q=1BfT-*hLr z*!b}d{Guh_3G2s9nlKZ*Nv?uhmZExibHJ~RyU<>yTTbu;-jtF)8(5FGH6~N?749NR zE~U>_27KjmD9~RnkH3j7`%eognz*5*Tn?vzGU=))4hXB1evKIjLR*d0pxgxm|)D>8A31n176%X}PEU8*xtFkRxP?kzS z_n(UdTb9&%Y8OdX^dqxN%%)O`9i&&$A}NR#X@W zVNA0)mBy67KrLf}rCAdsNotjBz)W>0AL~F+!UJ-kNipD;#5ZlF=2%qg@OeWWv988| z8U;b9sEukEKS&|npr|1ws6%{LdUTCSpR16ZBsK;b!y!d7eB4Q*4?jS!^pT6-vuzL` z$RK~a(ih&$e&cs;Ig&ooMgC^KpqYRsn1K`(yG%zFrM32lfXxtI>(w+>k90-x!zk>9 zX0fkhpbzGPO_KgKT@H47Rlgg<1?cuhwPcVW67y>ECUz;JDt&YpcW^-d5PtOp>S=9) zNy{x5uOaz4Ed9Dm{CGVGSn=r_RjONl-Il(f&PMemFeFQox7OB|tnO^8SWqmAuXMW_r9>{_+m-wK`)&A{ z2!(D-2E=G(8-3VE8*oEr6_CK@*Zd_=49^(G>Rby$XSqM%)2=0{wtSN^aBV}AxHH$W zMe)Vx(?82AF=Q zP>feskStHTYI}mp^2J9Pa;7;WLrQl?b0CBt6%{ugWzPWQ%#sZ08#_B1Z&-;Jn`cV1 zplRXaY>Bc^lw|0ZiAuvSL}W-vqd@;GV&z)=LLuQ@CZCY_)eCI38FByyT%*s| z_Dn2={8Ld?Td`nC=Ys0GMT_bdEvcviy`U;fW?TsruvEK@Ly~WH&yoeD>s0Zg>I`Xx zCQ(7ssKW16`valsTH9hgWa@0Zs|zo9CEX=!%Ip*+ktw^~H#R3H@XXp!w!E9% z_EjAjGOp;R+xxsBtwO(cFA6%OH`-Uxg?AVufWbbk!W#^D>8oKCYj9qu=o7rJuMH~t z0-<{3J-MP4(rd<=EUy&eczGp>>uaricik+$?{E?8IEzyEWLkc_Hs9j4R`^}FaKDepMhO+a?JQZ8;4wdF}URrylh$$aon zl5$oQNS3xDDMu~_ykaT$IJhT^CCkVZh`UJ2ADJrU6;G4$w@;TW@+DIK@k=F3@oXvo z2gG<2nu8!3@28?T1^$|TEBl_X8m@B8~uyJXo?Y$?8=pl}Ep zJ(t_P{X1jyo10t!URZorPQzsV{!$EY#QXjj@3IN-f`v z^7}p-Q!?Jg6X2n7%2CFfIsx7V(C!h&vrT}v$dbx$v5t4kc)az1carg1^g9mMF<#S- z{Cn~~mWy~hA#Ub(1zwTGRIYPJuAbjlG47GGm-`&%$9O+Ax5H5Gd)Qva`}PF=F&CJ< z_j_ljvm5X>o&%l+cx%6R_Wt+`;I%QHGC?~I0^a?McUu;`atL}I@J=#bvzgAe^#Cezbze~`X78N4hZ}MS=xEF z@jSxmZ#v6(E<7mkW}Ia_ON@8H1b8%_x!h7S-pUkz<9I&Fc-AcWmFwgAKo(na1pZQUz71mhV7~X_xgq0yOqw`f#6Jl5 z`xyWEbHINa@Yfy|_-~v8pW=9)c|_oUF=t}>A$}*0uOABhm(HO+JMmohN9T_JExW0rq86Vv%@bX)RM zk0(MeNRE_iA>l*sWu?k=+({*RtEiZjjy0>~3fGqwL+zZ&9!LH2ie0CSHdo8<8cH7xq&u%xn5q3Ys?oM{^VfTJ^ zKhN%0*?oxJVRnDW?sM$E#BPG!x7dA;-AVjig<^IuWp^&SHg=b=yOLcuyEn4Ck=GfQ9L*{zx-`Tn)OZ<)O zc4vv_&vHl~ydnL2J^D}oj>Fb0@%pE%c4o<6UsvzR60fp*f0lUt+cXbmiPzU9`?JLN zvHM7t`gfnBzA5IFLY4?Jf7WD0l3y0m?p@BjXf{ic*eHg0N&%xquT zK~M78+gEO%H8WD!e*Mk%?beweK)e+mkEfxjfsgGv=#Z@et&Q5zbV&*M6zK!%cI)u0 znL{f)n;M$z!C=_u)xv6{uyd2P-~T4dT#LYHi3Nj_@V3W7?r=E5sLf%&!V#SV5yh^m z-hl>hFu2m|+Y~iKGzNTlj_p+kZcxsGa3k9G8BnG|b6Pr}H9l3*lvTlSmp8Z)PadW1 zdkcQ>ouRbo4h<4Xx*a;6PI> zMC8D@?Uq!eFgI!z_9+;-+Yq@*(Hh7w3Brfc!;!+SMvS;WJ%Var*IZELEf~Gm5bX*@ z6?GiOK7p|^91bepP+H#m%~8qrJk1yn=Eo z2Q(#$F(auMK^zP`Y7Rs@6pT1-jxdliktI$~domRd^}`CZX(~pXPK$6Wp&qT5Ixfc; z&bb-V?M{nNk#Q&$-mXM~UZ0X|?fo2;B;7b}*=xoa*Uo)rjPyP<$95RIQADOC7#3kD zA=1K+=;3Jfo9dboV=yP6F3S)uGCFRGN!BJIBH9(;wkU<1)I&7j9_ktn5Hbq~NK91~ zF+{fK8sosBJ`sT(z2Sc93I>G;rA9cmXo?#02BB+IB?@_Yb<*EI9=S;k_hnD8cYK01 z0j)RL+xs%dHwkM}>?|V!wodq{t4vXb4ihn}+ug|7_O56+7}FF0sn^mX(bQ1bQK5|z zbzfRM+7n_78tjBaOxL3+l;qeGgBEHs4*Pfp>_+HO5V<`Wvrm{3U>y;O8*nm1baL8b zoYQ6;=%rLs$M@6rJRQGX5#N4y!Bpz?^(Lio-bE`sY&r)NSG;{Gh94Ri*A$FJdpia~ zK4O}2(H*{C#UBe&S2J@Gvy4ZCDT+w4FGG|_v>#(uDQKrjm=EXSY)bQ^$H#JQ*bo-( zx>fOM9yCnup{5@hABnd4VKLrDDAq$SUQpKyI2t0$|8AUYsgF50Jv70g$!WRU8wgSt z>Jcg^B|7$L5vYY@5&T*&_DVj6(7fBDXr4fyw@2~xDqg>c-km9WbD!7mS3S{Sz%M!{ zg(MJs`UHA^Dn?a$0>Bt5eGS#q9acS%iNL3hK}>H~nEQgDpjYi9`Xhud)r6_DA4U-A zht`#zFe+l$0coKhj43gwN0NVzq{T*=ZAK_Gh^-;Q3ozLc#|0c6pjsplqIWKkx(Iap zLK@NfG(p|Skwnu;2#S6pA__RBQK3URB<3Q5R7DVhfPOU~D!mUuAUmi|o?uu=r2QNg zi3I#a421iVv>7H)=|dZ8YB$2Env4(#73uYg7Bfs$IgUVPtjIV+nv$*gJyqz7chE5jicjb0UgSoz7z#|=*)Q3~tV+Cx4%?jza-{C^M9C5pab8^$(2rCDoK+X!qTU6#EWXu4|Di6H0hZfS5$f~ zN4!zy>TXdKzv7qf$YuLRZtrgjpqTDJPfS&$;he|-n&OL+n!;$vNt4ohP}1;aQm(Xr zHaw2wWBVMaa4U!jlHkzIZ{&z%(mQ~>_bNaco`)$)5xE?bRls9t86@j)Ne|>E2`BwK zR3S*Ake?&|m@iVNLcTajsAj2Way)lpbM_U&RChb5}yWy?F~qsMtGcbU`MS&uo=M?c#O26uN}J)KL#F=emx1_ z-{EhZ-(NrReK%(rE1yHA(FjIVt z+zcF{zZkT?fZh}OHed{Gz!Go4`gjnn2f?k#J;2Z^uB4@x3&fy1QIIEn`Lh-&PZ~aq z&y)X-&(riA#_P9oBQcfc)B6i!_@=Sh0L4bPL8R>?yaS(d9-jN}aEtT=8N zMkun~GLi%S+`WY(mW^_8Rq=64WGHvVkmb1Lq-B5pad7tnK0Gb^b5?AOv_&AIU^st& z&hgyig?lYk{ITixs?okOPujN_cZl<(?@gAZ3oWU0(O)s##^;{}7YbNE7oE+pem+{u zuzt?DR>vWix?~M%W=f@F-H!}QDhV}E|FEYHB;bDe{89s(^QR;i_ zqYNKm_%y>K44*eez(*Orl;PtHmouDTcp1Yd8NPwx(+qE9cw<1oF+KiP0e_fbiNEh2 zXSk5zPa<5L`u_X38J@}TqYTRo|A^sIhJVg*6~nJHT+J{Z^dY>0;n_MIX8RO|oeW>c za2vyY41a*(4>P=$;ZHKWk>SrW+{^Hn8IFWg=jv!vJaRu7G8(-^C0UGrWl5lT5D@Y@XkhT#Om7vu~0b%qx+{0hTs^SS(m zTz)>e$>UPh1n)M%518P8Gr^CW;Gdb`w@q;2q;&W)6I^S8n@#XW6C5(Z+fDF&Civ?n zc-RF0*aZL91pmnd7Zs$#^G&eB1g|&2stNwE2_7=Rdrk2FXMzu!;O9;7FHP_X6O2dU zM)*P#Ji`PpH^JQ|_`@dnA5HMrOz^M?e%=JXX@bu`FCAWBg4dg1%>;kk1V3VepA&G> zTx-+>ZHNn@K;8iBL#RRW5!8e;=p9zkb;DHO$`QaWD{0}Dh>n8X~6a0z^&YzrK-eeOz z!vtS$g0D8gHWR$q1lOD3P7}P|1p7^J&;)BHc&iECWrFvZ;QLJQKbzpMn9FC|CA6Ok zvz^ul*fskKlZcYXV&NNO)g0tS7Mz$OrI`?KYlUwA5fn}nT_`C z@c(JFuS6Xj^#W`w&PVY7In={&tnxb%Uqt(4)Xm}lU(x0oKdpI!9TtWhhGiE3+fI@`1NX`cmF%uapN40 zc9`&w?~393KQG|>DX5#UK7I`40_v(LAL0LHw8O`_5!dtZ|1YTLpzRsXuc$+#9*MFB z*V}0GhxX9${}YrqXhY1Vx9|7u|NOp{C68gJxgo4?^`?hr+4eOe>AT9tFy3-D2Dx~f z+7xKqC^p8JHm8kI>D$zvaU1oXaeMEcR6uHv&@&z@l?m_knRa%^V~pSF9gkz$K^~8w zZ#vU%;l$AycWSdI(J68kgmcW*wDUb40V7SD&zX@jZAfRvH1BR_#xn1dXT~z`og1%W5+;}n#55p-=T72^K$Kx4)Xyn0DDcWtP&Fd7X?{23; z#4b0%5wR<8@QVXQV*u^WivZfYPvtLQeS4mQ44eO+Y$s!$O&Lz=aTh(gfu0q^ysvIT zOzy|iEly%9eIgWbKNIb$PmGqf0iO*uxwY@1qrps;W|?iwG8>nTvnm^JPL|D%Yytza zOqOFAOvWa#70Y5ImccqK-7IXpJy=FVu&fqf<4wQD*?eU+_8Mp9mC3wo0=upW47##d za%DE*O0(S>XS8Lu)*5G~mBBu1ykVBXA}eKzmC*((-S|qkx;i&=t8=%r%4%Sh-Lfi^ zNmT}0s?0`IS*@ogGMhR_d#Q6bl*(oyHKA$LIom{KH-^e+1(nVG>Fjn-nGBvXSUM$5 zoYHKYG8;8zv1ZC%jsENWtV zs0@Zs=U@TFrcZ41q#HY#temo#H<|33bc3d(B@>%43EL$$TGFkRl4eS5pTveqtU$0S zQko4?()cK&&3n?!J&Tch78Ccg7`UI+yj{0|N}4|DrsulZxo!iMG=36RPuVUeW;-X{ zz)81k(oLFlTc)HDlWx7Fn=Pg6l?;YTBpj}! z*a3@)I1Kd*g?N0#xMiL>Lj!_4++#|@tHp_GnzkrBhuYez7iF!mt-6NgWwOiCYv>Gz zH?5BNaVaMTlp!ve#M4h#ld2ik75bvgh1Wp$DgFR0uF~Z-G40A&HwY&&wIBm_c~Ow1 zI5Ts6O4BCo9j|EwxUbg3*WN-Jh2?{;g-a%_9H}SB1vK=jfd~vt zkJcASg$H3ctB|0FWOFur+rq3dOS0ugdsp^QHB6kiPKPmK?6vAYJgK6sRyQ3Q8pBSAW)z#J{pC#s-&+v>06X-p=d)P z-YND@dV~l^k6-DE^`M+WAQ z;<(2nuF?iVcJpKuRs%f~3?i3U@Y%WpAkk9v_xSM|U%djnD#VppNKyPz58s;#p1_tQ zB^D%o3%OXDIR1No$`-BC?P_qebU6NIWmHvHRn;z9Bvpx@*l><(+LpT z3+iasfZU^ko~roEWmJ#wYHw5}dX#efM1nU&H{D0^&hIWw~i~IG_Rj65!SXVF*?Jc*0 zh6!1B!Q!l3j$)us31KQ|M`c)*K|%#FhXB-@+M22z;XodJRz2Uy}mH>&m zV`>PBW#Yy55PN26R~?*O=@TwdeqbhfVUlmVmN-qN{FZf%n7E$iePTrG{|R>#`5c1K5t z+}bX?n%mqiM`O9{YH4tzZd={n*4p8K;v20ktu3yWrgkXB(d=mH zv_Yv*l0J+0yce|-5`)a6tJJqkDwQXIyYn8K8cDA}39T2$EVRgIgE8PxJ6f~;A zZFe=7%Z>JC`zi;eYW@G&`}W5)Ze`)$`70FKh9v>~$g4GRT7q%Htz-Ow-LyCLp=(&% z+W^aDmpDF&&)@#dL()q70Q_jq?YYT4x3;y?Xfzs)Mx)UTKf{f7pdTD=^CLp>F!N-D_1uqucHwL3X;bGEHa086Y<_(x{U7=d_kSzO`17T@Y zu1Pd;mz$&YU_`l@U^AQ3zDYP?dXF#|d#bOBiS>Z8OrY@(Q;tNq&w_RUAYIOkgL(q0 z4Z&=No9%#ukUL)OtR{+Upd`$~wQw92DPx7_4iWL<+L10N6k}=tP5=V)m`p<0qd)L2 zj7WqgR#F?mze3E71iyvQ7&MqLAmkC_FI%rb zDR|rI{@mzxj`nv@uhHOM9=$3G%=uMp!56zyTtlzfHmjDV(5ZbouMDm*=~#eVKf`=e zq~oeZA}kXEowl7AV8nTYFo7A}qw?~{<)hNc7|oGbLk}~ZRe+UnF=X6V6Wazr6L0Wd z_{X)iNjR^~<}V}?cXHkpeBMQPH$C!- ztRpYY(X~#!V&SP*GW+s_uUO&WOWVrAv#(g~?2CXFAAd#u@i*2EZhi(9#u=FQ-Wwc) zB_6js3yb(HOycfl$6=8?4wDF3;Y2J}I}szeC5K|M+MyUBEjbs9Yn_W}r^-GWi)$Z^ zlM|{Y`K8*4U1NhzZ^D9;>VPsc5RZSrbUM#qVY?{1)gEo6Bf}k?H*_O285gYW0SNj} zRl->dqanau+XeCTvbVFQ(5MYqbsWahoOI^I`jM-7D@P9BP?B~%Ei_1z1S~+%p!|}G z3YMJsc*Q`u2t%otV7^KgT6}=O>~@^D3gid~2o@qJJN2OAZ8bwC5DB2&*o$z4VxyKo zjaIM33G-s{#ylfm6M~wMBnSllvCya}B^H|C#-O{Eg2u!N_3Dx9gKQ;@U^9&fbZAgS zAp+wZ&IjIKgp1r!BqV!3lHxsp?=vyR9Eu?I;_aO$Odc8ZFlca(Y9xeN9gxz|ox`-k z$#3jll5z}^b{?u!!$bJu;p7AGG3ZJXA09jC;lQ?Vc#_J7y``!>E}VJ;WEM;ni(E8A zHkl|uTHMFN86AAgYaE|th^h|&*4TH0)BNMS={S2ARF zMTyaL%MAHV2rZM}gcb~Ir`;oA+uEs#g$7L)-Nq=j)TZr13hteDw}pZib|?K?6KDp= z?NvnYpw(>SFRfo&Fp@?WggArkwf^4`RDzEPP04*{2~}W1nnzvQdyo#jqnEwI_TkZC zOT6lIc6ub;yQ0_X{?cx?dUdha=@G$>a3jFf$kaVR0cyc#`2FP(Yz|1b_Woh3+dZPZ z#bpHay7LwY1IRX@^$yXvvrl6N8g;s~F=y{h@pjY$>NO7&yBO{&xJ|`_75lAMd+k@P z{btMByvlm>YIDzT8^0MlnBJRqZPu;OjEXiW4m-cJ5qVh|_@LL8Jk!~w6aG>2wWL0- zg0(`S@QqYpi>KJ@8SXfp67=zwndRssu$}>rRmH)8@mEi#)_)g z4Q3#DKzsKmd0<^ImmRZjrL2>}-$x-?;V;rxdPrrINxT21@#}H9 zZUeVHK<*UuB7c$Wj>6fXk}MmB5dc<@KLq|z zI{i)4@IV^WP!}+Zk*PsL8FAShQ?lcTfvq_2eONDCiP&2riid3!3e%zG-7z4?n0yk& zY)>>eC^_7JS=?X5p=Lexts>UNRpBb;bD|}oZsO6OcsN<1|4%PCb<8hiv6fZ*Zv8lm zCHHt*^O+witUlTOe!QT^Q3b7SWzp|r5@$M&_xq01m%dT`zJTAQH)y{iHY?&$xx8o{ z-X0a6IR8{QNrsl6Vh)phtJk3V`oZmUQf1dFBNM&z!L49#W%HACBy{deh!w`?gKO1- z6+LvQOcx@WYV{cCsZaOrIp&hNpR=%lXoo?M9B9i)F!)cpk~-{TTd_7)%zFL%q=*I< zwTR88S1FtpP*wd)RB?FbR_OrESx&klSAr#zX70v8yHH56QS960Cbssd&qgEfZL(n?q=&s=Bl^j5pFR7C! zN{7ZD6)C|b)n6_Y-*`C!=a9>65w56}M@+`r>;6SN~~m!PM)Etn&# z7jk$C>X}_x#9UhwZ=@xAK)!J5i00ur>;qcELpnDKLZy~wALXs5nJ2Z=!geJ$r$rmA z!FNjInUA7(8|#~okNK+YD zqHDFis0VX851VvN1tVYz50eA95+2OSjXT+OVYn@PD1Z{%#f;%>n8412L-&kmv|t`D z7jp&c)gnnF-No;eJu;bNJxOkQSmC6kyaH0Kt_EhIdVUi|x%U@xilp`zVwEBHCV3^q zB=Fbd7CJ)Yy&PDPXQUfBA4gb-*%ER&Q|VUesfi^&S40m4Sw9}Z;&;HwLnIwaO+|7= zHLT~4=Ofr%7`~;6AryXz;;0TPCKT0lXa)kn2fJQcqmyHdcOX+kGR{vkPjv-^)B8-^ zJ?gxYY=~Z5-RzLacfuFC+rn8F_qGMUxiKIaO%1jpUC#JaFC<35VC4iR7eH#1SK0i? z1hb})tQ*!*(jY{_P{GHs1S#%iQ6dAOG=Y{dT7njmLRMLVHZbOt6(lccghd2@Vv>PI zl|?sMEn}eZkw|hCs8wfPBtY}#x4GJb+MR$b=NF=MQ*RJn?)wR%bEj#tn;0*`1l_ABU>(p|31He-^4BMGBf=K>K~xCMA1Yw}IbV!UCCn zNKk-keR;s7kw7fX{wIbap)S>kT z;*fi`#%!(DAmlki;ix)YQ8e152S`c6%7OYHY3=hPK}V0sI(cH9cZf_?4*A%gT-N3B zIjTc-D*`J&6#U}QSyh-Dhku&IEQ%xeBzh<+k{>L7AQ}Dv<@0)S=Yd22BtQml9kjY{ z7Aa8qDn^&KR8TJre-wJfDlX6!Et-+nBm2FF|N zVxs@qjI2bh`4I(|J8?YoJ3rig58gGv!^C9-=dXzvQ z-g@oPEvKmJDDTX&jssHa5p^yHTE687W1ZgM>f4Q!$`yLoAp+x)MS|-}5_d*EOW}Ml zfX@{5?S`fsrnXQ>n|%hW-(qvSte@JjFWR>AW+48 z(@=`JGEGto&I_Q~*%}(T3r|Wgiun{h%EWXYMdZAP{)c>V$4)e-%$VdZOFkP6ZiwbL zdT)*H;^KlWaqJl^?`vYJ6HI#5N^T)Aaz8>)-iJA$N@6mM68%!8s{hWFMeE>*C=<_>pDek+rF5Sq2|*uyC32#M01b zAL>~GNYRn()e{%rVJz^kM=#l6s#zS{>~{`ZTY9Db&)i45wp_2|S~Ulr*DqOE0pfw< zQx{KM1oP1l0ePfX(K4*iI|Pu+;=~)c=p9F|R(O@5qqYp$6pBBkOB#;QrBkryPAUkF z)^GxfUmBCG5`Bi16EIx}UBYneBNq<5i6ey6p6xTKSBFgn$#-W>T_580fyG-AC7 zUq;~j5Gj(Nd*Fl%jE;o7!2ANsENxUG{E}O}W0iTwE4GsX*~~)O)8@)OC8?1J9wsS(AT7I<)%oU)hRG5pA}xsAf`OfU zbj&_Shc1kX7^)WrT1{co7CD`w@2ZEc%u@yJgx=Nl2LWy;5eSpM0B)wSM0^!`!DAo<)#@b7xK3*_2+$Ab=y3P@6l#eR{XN;)VzlDx3@MBYX0@#qWDBrES}f5v zrnF`$)985{P5O|;T5vI`@#`W#iX{~=5V}2(FilzdQ+9qOb1j2;LWE^#M(PzMX-26x zSdS|D#bpH_@X?;%z`dR0W}w)b0UlI-2QL2r<@PTBvA;in6REcd*LC<;?)3~!+|c7c z2bF8P{NDvO>J^#g?XLjd(CJ@}Z{PE&p?dJD*$42BOKA#x;2%JkVW@`z@uL8RPx@`Z zja~&PaMt4h>sbI)So$U){kkdjJV3tfqJ^@*b4QN@0NC9<4#1ZI2+@2Tko`6wIot)W z1OVP0z7jy}?&g&MKAr<;w|^y|o(Pbfy!9&qqZ$Id-7A5_69EEvvsVK469G{F$8@-| z{O@&9?76RsF2gl+KMbwXu{$`g25T7iF{^wOU^vmNFB24NNtS_iFtToC4$r;p(%1nT>O(Oqw7tB-5hpl&uIeX`THr6c$Wy0+;n zuVd(Cd&-OK=$1Xk*U@<6t*(Ck98Du2kDy4j6@@$0xEx3Bi82&pY*PFSJ;5Js;&*iH z##icnuBguF*%eNLQ6K*Xy%I1_G{u`rMyL8hsYn~9AAJgx@+wCQn5CI)5<`JI1k+XC%o z+gkSbd%wMT+1cwiUiR?ve_6G?PP4HG743`QL?b7=l@On^x=k7EQRna{Y5TlQ2I7u> zaC#bgXaZ#%-kGQz*Cze>1pWhcKPIp3B)Ql+BBAm9bqv2U_l7ZMK!a4Oig9w=1A z13Y=!g#a@7h@md9?Q_(d(Ao-rltqTOySz9v@T_3N>I**9WI6vOoICZ(&8nyB=J7c& z5E|#HN8_zY9wqa-y-Jlz0}u|4plBn(z3j`?RcWz(=d`e& z>g3^+K??CAd+N=9)#}PL%%)=wb&X=hc9QcKWD}d?mwfBE+ z?X(Z`wqcxdMHjk7u`(NJU&TrX$CRoVHUlCMNvb$uxbOJDX|KL;gUs)=Uu!r!a!V7?yT{VNU*~uE`Bczy)dynG(ObQ zS}01%OQKwT!MPPgHRBVS|3RN%hQlzY45efra*w za>~syUz5&wWT@%%C)4Rqpp(_%1dl2}tv~G(iI!3J5l?KVYM7_MvP1M%GnXPGoCY3> zKkJ!#Ex~~WHF80*z7ON4NJ0I>-ws+NuzUTz#()2&jur8EM zrg=}b%s8-W{{nWtMbPxyqGwktzF=y)6Lc0i#m!6#-tT}ygu4jc%TPaB)~Hwb0xjE_ zce%2y=SmCi0lwx)CJb_tl9o4$SlSL!R*Xf;eRdin$1hjJqD)3mp}gWzLcf``A3>9~ zD=UwLVev{nhs!)$XIRYG&(LP0tgcc{TG{B>Zi`tIO)R=ZUVr*E{`bE#{`cEp_8u?LK>!c` z-7&z!uQ9;C#sL2s1N>_Y@UJnz|Bu7~NAXh|Q0zKFQHG|4v#j=i0!e;?j&vZCkxZ8? zLEwM-{fG>5>xwb$YPf3Nv=51$UiNkr%uq%^{Kh|>uy29+@~E#bx|8KbWWgrP)h=$7 zG>|p>Px4z>Lnk0DykvH9AMB7L^q5zBUMs9;Qv4lXNX2pHn!EiDInVT*`2>?RCIT^-F_x6RO(Yv#z`0XD zc$kQ}daI&nNBpKAbzr-d9=QlSJbql?s8AE#ADomq$~SGvw3SFH%R&N~7iYsGrsr5u zL-E0PGowf?Ku0|p(uW#CXR}h!sI(_&IQBVGd!TzJ?TZ3?I6lSzxP((Hl;iF_yMz_M zuQoX3*y8?G>@uVO?-S(cdi)HH6cM!X$*}e-vV|MUfC>u`u^CSy0{c=55qy4mQ$$E9 z0%;_taJ&LOvPZ^e6Y#mJTkPE0KYHW9R%NlVVOcS`7-w2f9?E7fjM8kA!5v9Flh4AE zM3S$JfG^~8p^^XIlkYn@_&z&xf?60wB!*4`jNXrO6f_i+nP|3~pPtqhbS+ zF|EnKH$$>_fI7pvV3d~r^%gJ2yA2lu@Q`3X)5E-C5d1z?je)?>&$Tqd4| zOZ(zD2qPjCY$0RMorLkutmO4YfNtEVoh|4!wxzAaE9To?#VpHSlvftjQm>>JR^nI0 z%*{v;TNAMb%mCzV9L$aUxG#0oAS;O5mkFVl9|0BbZ}Q@=)$?O-)t5$Es$VDejU;LN zRG;2RH|Lp?dl+)C+_^v}nneETrP^2M4YdquBSR$+JX*3BKCV**gP*|t2C6OUmMHM) zEkId5Z<9ws>6dxKNH%Inw+qRjphyS6uj%&w2KoPtT;N|M|KH}b_4P+d``_l*{C{7_ z{onyWI!+lR? zctvUsQ+A4uWiifvLL6eQ~ z?s%szXgIQbTf9%!jp4>V%G_^rw@U_;mmchAsHgCs+v3xDW&J9y-Q4AL>cUFmuFnG1 zjibGKR$Vj0`?9)b^7mzRt-SC{;i`=B%keeR$uF&&Of|3T77B?#*V^C^V1O&y-!TAU z-{3a#Z&r@mSwyDyhFJQ_i}-`Oq{$+){W>vKKSgS)&!t)QQ{<-lvNXGc1kGg!qfu7v z6xFFVm1b2>5uRzIORYBea*!x)5WD9^)|zori;Dx3tNEa}>2h^tEH4Smym-6e;>^55 z%!kD|8JE0SLP8DtRdUcK$4QGtPFLAf+`(uy!KEYrY=c^bR_dvO8NX_U!s?45@U9)v z5DG`$WmRqch;x5J+#X^1`<{JwvqqFjQEI%OROQW9262POw<%nmLr1cBR#?7Je2S)j&9 z0=z$mA4chE7Ka%VW}vsO@uT=B$~8?s^%o-wc&R1V9yL!f1i5rgWc+!fpNc^E#qUP* zVg*5EMWBT0`3on>tIS;sB1c{&`7Y+56w~1cjE6wUJjUM8XFH4;5g~tVT!%c(-8URe zQ=uYXW80H1>*UY9gS|Zz8=K{dNOr-|8YJMCmys8mcuCM$eh|$ZuBE0Lr@v2^si*$O zJ;fg~#)G-av2QgX9tquJQE!fl17&L>$!HQ5Z|HauX4hs2N{g2lir#eCN!G|tBNtQZ zIP_OJp~=0|E68|L#6xRfoR*i}R~csKy5sDu zGSKC?BT!4q+0wX6Vs16Dr8&;tSZqd=%UQy%XRYNp^h|0sON!leJ)0x5MgPjeA{I_2 zqM^#`qzdCeEUk~6MJNF$SMaYIg~Hk-h^9(GNs%@7{2eb%ypMXK6}bX9zmuA;05rKCG{8rn&eD2i33%DYI`~+9!GCBXWHF+w zsnnz-y;fNbJZd$8nt2iwj88X9$@t#WSzEY(TyFmF5titXqU#L+N&00?QDK34*hROF znK#4=xf@4(@Veo4akVlI2#yE3P!|7tMegj*ozpLHPaZHR$;l#BRR-Bo}WCX!?`lJ!XoL_qRG?t(*YT3 zNUM#_b-HfOJR7fe=@prTv27bn?E&QSN0zxr5$(NYC*ofcoMXNtHSsV_u`6OCccR6d zn%AFc%3ZNPZgRu^EK_hYKBZ|B{snhUHKpn7G?~~P&gNboU**29$bq$s4;>Z)TS8Z5 z!Crx?3)e$V2Zqsm#d)I^H=MSl&3x5GqMNPO?^2-c320OPFkg7&$;hO|?`jqCm|R(D zalceRYC$FqC^>3|eK^0)!Cc{yc{Hzx(vPKlfw;0@lc)dXVlC4M5EoiRxb}1;1&@+m zNXH5Nw)%8%{c`dUL1uljW!Zz}jN`JS+OEi zwKzO3kOk_*Ii%nZ1I#pzoQwZ1&hZI?GksUxINshat(V08`@+GW&$k7XZXRO+{{khY zA4(~KF|Ag!*4fw_j{{6iRuSZNOSpJtdJSH<@ifxtlYzl;gn4>J_FVM<+SA7?uYr|k zWi;}QIr-~GS-7Jeo^F_~v!Pqt=(RTVgs#4H-%cq^H}ZqE7Pk@fVUO zDG2`-^hunU?w&jxh<^Pqq6wmZ=QK&5js9+Akt4Ws%4D2=mVY9bN9q z#5;~83FTtSy?lf1Z}9Q$y;E?e(bF#)XJXs7J+WcL_%T~|U)B3J@pEF+VdBc`_`i|g^sRDJ-!U~yzwqn_Gnd#Gutu$; ziK#WCk`@o2^gL5hu;0?kWp$^V>)B%2jL(YzWuIXa3rRp?E{tkdDLk*UI+Yt8!)mo$ zcr3`=eygL%+l48m9CjN~n+N@i%JeH`UnhO?$Cf}VjyJr;HMUWCp)C_d{A0O2lDuz@ zVR5KIZdF|#hq>@@<^Iv63;-sP_0PJOfogyFyea^p6Mog{@<9z05Ne*%zed+%Ja6drwZMU_IBrEGOf3Oo{2@N<#EhoP&j#mrd znRLs|2Qv%AKkSw6vZ$`E-Q#N>CL<{fh={qGAMM-kQ@^n#FNTXQp1R3mBj8 zS$`ns&liwuU>5lpqOH=WQ`i5ia@ekl+Ec!upL|zrD%th{tzS9tW9@k_ZU^ZECmn=o z2YZ3WlW+QXC(u!$BrP{;g_LaOkLDm?%|F6x=OEHEhQ&A97J-3IIAiexIwHp&gYACu zrcziP9Gi_e3-O$G*|6P{GYAc0;G6WX!BdY5lOmY}F{)`+j3N@ma1Qfc+wK-aUp4xx z7Yuu0xGHglWxJ)p;vfdGK(#yG_;Q|QRLgI{WleHy%1^?1hUS=rdW4waVwE}F^aTq^ zq=Uhj!SCN@gtG^98}WULbzaZd5j7Rzyvm!wF#2sNJsOE3epkzhjV{X`{`*Ytd=rvW zOQEmN&R26ydD>3hlJ!0K>7#w=c8e(Gi2D&5lktXwb^lp1ajgx+QCwLpBM*5)$xC=1 z(j=G8%4zQ7=SOfCLuy4Q{>E5lv`JYF8rd-(pw7tm4{52>L zWa=QP4cNo5!z+IxauSlL@~Ym)#7PB(-xn88$#B+eakwIuX7IZS5;6&Uk&nj@h1vGR zue02*8i70O?r4RCGxBJ%^V#7_YmCQ^g9I41$wOW?l*9)J*+XiX#%%}XoYULR4p+4) z-t-Uwxj)K!n33Fb>-jGGr{+NoSD5{uHdme-Nd2FcI(2val^d;)e31v~t#C!KpZSdP zhN>f_+G}nH>6_=d3*Qrh zEvvy1f4;ihurP`?{c&;SXT|(X_$A4*jj0Xb_yV#gaRJ9);!}%t4el>F?CH~!}*Kcll_FCTBjr4Yj%QkAOCF*DAvO`}C z?aKFgIl(wX?=g=zf@9jki<4~V;-D9Cfi}oN`i>u8``)WFb#?;3mjTB&$qfaHQ5qez=b@VsE&wX_Kpe@87KA{EM7Y zef-`s=-L{Il6d?aXKZHjFQ*$tYAGZ~-aaIHJqf*O=1Lm7rWOKiDk*eDq>*^-AB1~Z zOf)PJMF8Y8q_Jw1>yL?|S~o*x;6Xi)6lbJS{$`=>Ku5z-qzgd zvtrGe8l9La2wCwnmU5!Mudzw_*s@3AKbsn7XDlOZ6Rxp2A7?EiEc;3}>oyTJd3M)_ zEX}HUwoW+n84FG-7wvnCfYK=sF>8t5P|zM3hsjxDsktC_q;@I&Uzz>BU79QZj9sSt*MF?|-O)T`X!hvs!0v)~o%AE$>t7>}(XSB;rK zwd4t5TxXbVVPnmHJZ4Flk zj-NLt9*z=!Qs}|QNni;RsBdWoM@P70F9b~Est&&;P;-<&+kH0lZ(H9Ix$A#yYZ6xj zhH9ui?R6Q{UF19#`E9xNdkr_kxYN*8olal|-e{ZXTU;X|!g8&(FtI9kl`DW+P? zqN|LfPIJn>2Nn-c8R046UaZ3M8@CM}2BYCzi|TgzO#N6M+e78+Q0+UeFGxPBlcBmA z=Zh8H6lq|;mKuIvfl}M$ZOcfxpaEPe#DIPfUNzkY&h;Mv=0C=kX$USq^Xu;e`xgKx zpSFkh{4a|~{WGxz#sX3_HKu=eOA~IiC>X)Qx6CVw1i)fjVO_8|j;BQ1AB}3y3cmxy z-KQLM6;fT%saV(#sj4%KkwQbli>kIk->SD|MQCY~xWIAHVb#$|rN7js)_$pqO#F6; z@Q5vaYFSv4bGH#|UpbZiXR9){-XEd0H70C)=BL+x$+f`V5QigO(!<=hS8A>&++LGT z#nV|OS8%k*4}F2nN(YSEcC zoU<-U&S!;;W8SzPQKlUZ-~Ax;K3ET@P~*xS!}xU!#zGOUhs8RgDfJKri#8h zCm6g53VATqSQ5_5aE_x>`u<6knKS^&R1D(igOt~Jc+{=}kMGx?L6U&LIB2o&nBGAH ze{jD$;m-z?uY)w{!~s0r`ZN_hGGELC9AO#vhf_BF5h>1-Nfw{AX53!i|O z!K=9d1hNzNh7#mwGCP6m`rin6@93VQ81Rxq6avo)-eq0d$hjw|%!J|JhRBJ_-S0RU9ysc# zB>RL%^%;m^R-<8WfLXFOadX$?3_Qx?S+bkA2;ZEr4sV92-s$^^{GN7FA!3XJigt^$gcvjU@Xz*oh&sJ>arYi4LZL{^)?f zFF^ZuSii={{bj59ywYo7qxnFiGr%jPTnBKu^E~88+VD08Jnrd%Q66d+@Mr}ZA$eac z{WcG1RM^_fi!zSDTQ3fxCu7vkdAlg1-Qif5)~`lLqviK=I=6DUlq8S)T9gTUq{9m> zazzo%4Z+Qsr}Y&W{lo-@FkUcz145@?Ntmva=z@nfA;X!4X>chJ%P#=}u&^$Il> z8Nq?U&&=W-fqL+Q^+t=~D+M9%sw*Hc=E`&Gsi5BT>r9~uXUk9jq17@=ApRa96GV$D4%DQ+E?w|18sQp1=-7LEy;gr6}EChL3$kj zmh!E?Z|Yqa`kD>deLEN`@H+c-fF6(N{O75D90w;;Xo}!Uc^&DueD{5`+p(3$vDJHg zpbQUi(D6$=;5h!-?JC~An5jzmy_UqHCBVEbAa(V-P&2{ovDhx~^5Y}qY`!T=m?KMA zf8#5%=1drOHc)4SkSpKKmr*lxpLKiu<#5oA6XhPX+N;v2i<$4%+u!XXhfJ?cW#Cx! zk;o>!n~K?}T9pSkyb}34yD+^!U&qm_3kz|1#ZBIPV#tjFcdE>dfixZOQY#7Zak2J* zws`THI_9rLJ5=NGyd#__ehAQPMu-Osa_Y_1jI1C|5X7gIt1mOW(dH`u!in@9B+8wW z{nKVB#kHF#7LnIo9!HK|QJZbD)hExlXo44XC4bLy273Lw==1OeI+3Rr-cEu#-b=v z1+Y(_r<765z2rg5LT#sVO8^Ary1j{r2U}1@Cen#LD=DfRrpoccbOoPP{!0UT|TKTG(d~nGVrxvdrx@h+N!-a$|Xv5J<>w-r$26#^7^+- z(pQKbho8<2<%a;n1`^gBWHvp)K0!zWDB(m*?YqEe?xjz^-W3J5HT^)!eG=)b8z zv1&N{R#F8}g@KJh(6G<{0ix(c3qEq$*u1naT<3;?8^z_~dh)LQe*w`@p;$DcZp;h( z>3Q7>Znzl6AXX8I>lub{%wUZ^omDBLFoIk&MDiL9j2l`+dh5+qj|*p11wlXzvG{LO z&P+MPSy$Nei^tfrYlIewe}540(0%&&P`}hc_CjXANA%*+9>iVH6y(spJYNhuU>xgs z37~0iqOKRfk5(-CIcju2ys-zg^J}KfUVF#6tsmV}!4U!DlPyS}TQd|_&-nv&3uEzM z7`Ur^DSvlH!B*Y~i9b39oG1lGpch7huq9bFc-LbwE@G=xjfqHr&f+gZ($-LZ2Xo?- zY>Qe_6D~uf5mK$Fo^YY2w}?B@y!TLCqdJrvxEV0feY3nmHeAx;{Sgt^02F2)o9T{} z(=5dA+Z4h!Eu9o1F^*7R&weS&TyES5V`1@#LgD}57cU$xPs=kgR%UW;KaT=^Zxnf% zM+${sXy?vhJyZ8AOUwcV;nur$)4Jh-gRB;qN<@uwz{nBA-=A06g?yRfr`ev7Mii+y zkvD_Kxx@1qQ>MLAF7~-+j*-Mg*AI2Mo*A2wkFaang(6xn(&3!~8PKXhi?ZSjj4=UW zk|rykGLYkba6!Spu=RePFV=? z`vSgraUYbm^_SifB1y|LMI7GPPuEgIYc68aV#dn3<9U7ypO1CVaULkB*zx21LRtNQ zBM3FlxcTgVPqDmF=nrD+2%(FxJtUOiV%k=mAlgJ7frDk(!ZS_gV?OzoVF^;clpU-D zZrIP&izW#2aQ*@+X!7V6?1HxqSY7z-p-!F`+mW|x*o8RY!$Q|_^uUkJRrGgSV1|EB@Nw()I9ow-%alzgJ)(S?{Z3c*%{HrnpS= zWR|c~Ujq8KKLVw%9qpuhHqJiVN^z0gYOuV6yBiICKN`sCw*Eo)Ze%YH)CGt)Tt%it z=ujk0C_CtxtKQ?5y+@cteax=*EM&Ot8OA9hah&5emQki!!pk3o(U9n8%-Nd~|GIqt z7xlom|5TM1dTDVCrDIM^)`U!2S`6jVL%=+Vxdq%1Jl1!hh-4PJ6dWbEB&&ouXa4yL zwSOAX0tX?mU{zL-bKrmf%`VS-Kjl=*7|nZaK6B+k>!U z+zhb}5;UGsTJ>?Xt1>z{;#qU>I&yc#qY5=rDC>7ei5OXqjF62aXNlafI|Ze7B4c=s z*u@1IE_)T$OsY-FI>c++a!?XD4gC?&H-TWry<`LF8q;{Ck?+zvN8)l*1Bx?RrA=+1 zg{F|_SivejN{4AI8kFFfDEmE99jd3>p<%?IYfd|-W<1NeGS9n_ zwVGOnTKziqq{SmQA@4xhk9PiH9&t4XBx(}lDY4dCu!xSH9F)NdL4(KptXe_FVV=OT z2J3ye{m2>=JAZBgl(PYD8hZOmf>m=$#f@B6A!}N5cbpeWPf9fLH;C|(9Z@gqo@TFq z1-yg{3l(=+OV(3OPlnM*%i<;Au{mhDOFm%32CsIBqYN(e$*E;Mi)6JJ%p3I7$jdvY zqv})UO>~#khoxWQMSsOjgV9-B$}v*%I1233-588ymz_wuV^~MF2rEv=@A0-S)X+LW zQd`cj|1xFWXu8Z}%03BzG!_XNUy>~^SVB5YDRPdhLX%cS1-jZI^$YmnP7BCu&{NhD zKa?bqjLXI1_|^e~YAO!L?TplQ0y)+L>TvC7Gvv*6sBV^b@_tXYDokRJLqun9xfzLS zfXB{CFUIUx%+AswukI+B_Coh>5d872a$mS?4IEAEy-)xAXK(i}YO&M^vY81pv+g!{uJL>EX zi@-7~oaD<-NLLCkTbF+ZKk^H2h1EOl2#0R67!-#DhN4#kwLa$r&(mNl;>pkB0v{r1 z?9iZi<2D;)CKN-~?8|tFxtHfB8EEb+T_$r`pawRZlB*?P5%pSzKQAV8Q!%o41?(9b>+Ii~bJta4o=8|1Tn$kl`{C$W zMY`8hQ6OGkIIZilv9ygY|ExKyjmf@T%|TOVZGGA62vxe(ZW4B%xrYrYTxnr z$)CQjzUgP)m4A5cvreGy2{Lq?pVX`fI~r@uTB2*;^en0 z*5GAPXb!ghFlt|KvfXr63>#qZcRo%%C1*m{ll z!B-vj2e%|FRW=&Z0>9Gg2NBLR~FTz3A9#&P06Fv|H7jJAe0RMm<#^= z7;BRBJYBb#=1p!%vKlp7v1@sHx!s72q}nX5Upu(;aF~Ze_($Y zvWw@tK1wl6)Gfmt{tQq5^V~MFvvnqz%U3Dbna|I8jFkq5*gZ~Z{1Y~9_NZq9sB#bc zo2`@`E-dP2sUWJ-8;F--U??I(kBBWW%3AeR*9%E!x}VyVRhn8!ZmBK-%QH3uX@zgd z@P{7u$lGo-tqvnX4G&^`E>X%JT)#d`y}PiHjzK*p03u~7+|9AYc}W-tKpk%YEn@e}gL+h(?6k808HB26FI-icl=KYrKafSBkd{)=-ii^<*{ zQSGw~Q>ja$r(kKVfPaqA7*!uw|DM4|11j&JlBMp0>PcRtep>lkus*yXvIwWtJyjBV zk7m|<|@l+eN@{y*ZdK@A@&rJgI%M5JQwrfGXviFn|Yh{Un- zw-qEr#zW-U^t}vH$6%O4d4bHm&CIMK;WF;vrJie{h{mdozDcE?3$Za*#&GpT^u5g{ z7hZ5{tPO6rj$_FQM%GgI3$W|9! zYxh#bOs8nl+u&Lfvg^_{D!RXEP3{mRqKI!C5GZCLC{{;N@i>rEf|bR-(**j2PRNMO z_R1{F_9od3jzIOTEHkhSalDCgx;6|q4Go!YvmQ1NZ|LbJ7S2nc1D$1NGMcD4KrJnSI1xn@es?on{5$7&5}cfP37{Mjh1 z;`69cZcn+<*#K=Lo)3G=2Dt4FH(PI(9&>B0FLPRc|K1+NwR%{8faQ!_r@QE9wb)l& zEv*{IJp_%^RbDc*WE0i6N;sf_mY-oBbuR+%B)&0S&`CMd`&%D2l=p(ioKgEj=FEt{ zk^33WDJu*53<=~yHwebJr#5;{)ZW8eXd#)D_b|!5WCA>7dTDe#L$n@}`oA@%n|~%5 zE&q@~7+_*!O$5dIL?Wr>sQ(}d>n4XY`FZ4xLAf>{j&iw8ZoUPN&CX#M`fK!k2TApN z3ejPDZZnz*8PUi{cM!mYlf)O3K8O+Qf{mmxn_@e_sWYgg)r5^42K_NwOk4=qPa&Zd zg&;d&EXbCW9>ag(DoZ%oF`wCDup^pZJ(3&8zb1+^HihX-Gi-?4xJ1ak&3jWYZ-K@f zPqu$3qYWR8=Q+Cyz1FYJsTEajbH_7{ix_@1JLDSZgM-T$JA&tVJK5kZ#xQi4yJYIZ zJCBPJ;1WZf&VT793br7Tucz9XoshO^(K0Zxs98w3>Y8Qx>! zpQ6VtAejD!Uy3%V8SH}4RK$+^8q)b41ivRW)w=(puy2^WhC89F-w2 z;q0)Jv$~-YviBDo>kfQ<;({br!YV-GFRPMf{(T-@KrygnfHObh0KKVMBL z7E|Cf7K5GgjV6K2?SW>s-7nXnC^NKhVhfH#ZC|$z_Wi$ahvZ|ICaEp&Q9E8;kCTR| z3RJ`looHO178Fn6x$~@35$cAOr@p%yO=z^Te?!cUaXOnPO5z-0gmc^gKMZDirzZ#O ze+5-UPROf_o#>30g197?K#gC@lNpJj{k*{QkF#I1&mH;;=(dm@n63rHZ3|L=6^jld5q^-!@^$Y2AI_^`Y$`(lC*X8bH0pF z3ppdR`N-D;sv6h*L#yWhrZ|Wc!e-B~GG1(FRto=>J}KYNAG&=G@pm#y%v#A7y2aD2 zA4vHvbiQ{W80>!M@t`q$^+q9O7Bb=l^MS%qWLDT#{}xQjxL6kH;Zpl(~?Q(-gD&&ql@fImj=f zVKI5$)!T?0wt4OUUaI4)QMxHXY|tzxH9xE4vtVj=q&$k4M379eEuOMglvRan3C2~U zz^Y09l<40mF;>K#7JZ?MF2Kh=_SOl~wN~I~6+$EF@cDCymeyPjUP!%1`Vis$YgkdX zFE)e6d()hWtuqFyWqAkTPrYN67~}{^zEdoc-Q98~PnrEcyxIM{v0sq`w|1vhnBSSs zjDbKGhH@A#EjN7B;r%~%w6DLL%3wb1b?DkqLZzt~;T^AQHtCF97o5U*;1VzpsC^5% zQs&O1dId?}ySl75NqABwv#S|`FBW0;~%L?2U z<{{4w%%%BwT4U-KL3eS+QZKJMUWAZBTwmNGAE8_yRrb&#qF13{C4w_eQ?WOeVXDO$MEQ)A@MwljCq?&xesK+{e8;AB3Z<}<19 zZdo)hHIZ}7zMopJL9Ji~Qp~B?`DvgiSA_vVxBC61>zgj^1tQv3SStok$+Tv<20`kS zc58tS4A$AUtTTALr!fp0Y5)?j#-A{e_Gepc@DPlva!J3)F!j;e7U=Xxl4 zs+$QYd_pOi`1Wad7m<(qiK}G-amcwm(gGXam^Zr%8fbH$|6N$si z>y~hPLCnEYuhQdrK=HbrJ4$f9kBZO2^_O^3aD@(Z;Qx@@L5fgc3{t1 z7OyiF4gDkM=#LUJFo%L9{$muqg?O?AXI z29w2J*cv^BGjKiD8EY$8RHy!}+jh?&&qT-IqZ_1S{k<@Q|*mF0lP-t{1y0WAJK(^)%N&2KWyXzWY@}YpR}!dPO!A{Yr!3 zkJxIOun^lt@AszF_-$*Ok$r^l38ekl+PjdS#?dBVjO!n_2@Jq;q~u&Y_B<`G8O`kuzeaRFdtW~9 z2HWjOZ{#l~aS;%69D$H!P6{q-LRGpo2>>|8QG=2o6p?0i^U!4nVZy%i3cGEV6t})?#*Bm>-5Cu7-ZR|&jw-8;ZQS0?zBE0=xhS0g7pZM> zf7z!X%(I1;N#?R1Z%FjVQKs~VDg|ll)6@$p@Y8IYdW)Mp3C3|dg;Q*!*kg)69F4ELU~h@SiY7v)z0ejK2}=R4%4YA#GFotVaa&HFmLrOWx}`X3?` z?j{^wLL>>#=VKb0atUH_0{GskNqfxHNQUDAzwH%U)qC7=F~}BWtgeLJd$Gb|B!->v*n=-$ zijcwe%b{oSH}1Gs?up6R8d(~DX$uKx`jW{gBwB&ZM2=x0y@2UF+U#fhiRksqFZ35x z8Z|;svK18V#f^*9h5OUVI&s{2_f{0}f=xJoW$|D{V zsu%aMy0guQTTw&V^q%)7r)4+5R|PE;P&L(RA{J3CY!YmLmQtk1oUI2=X`(~g62w$F zYF2#|Y?wt2r#MzhO2cvOF1Z+ZstlEYNx=NTPQ{e1h^rQ=0hPwM;wpKkLR>gh#A_>I#HI|{mL=;@U#){ zDh08gqvtB8&^&&95&bxc>KzSg{iyKTi$N#(=xb?yJrSDn^MPT_QCp<#u>`HpMM8Uy zIEl!f)%!Sseq^I$?H%pQHpD=W1$0i9ql1f6!)~~^uC@sLs`j=v*A5Egm#toL@PoBA zy-!J1fyAQAf9Y>VM3)>XR?c{ zgu|BOLrD9D(^rGbyo`PLqzN>xig^wqotoG&{`?Tj7f@=qr%-{vPPc{|u99qkRtPml z4;sSj!VvDNVS?^ROb@anZ#<4%PWH`Q)c9a<7T}#hwBX*q?alj_4ju>7gYf&LW0~vxtU%pRkWI&o0~JuUmG3=jbo5{-i4sE+vrdmZ^fiY8r(;vSAVzswK%5^Nyz^ z)|RDBG9PxPm`caGO>n`M70_C|2Dca-YDq6f13rz>>?OGxCP$R3kE*Vb^!z?(0oMq9 z2(_+F{T}4tcZnycPc`v9$I1qJdVnN0QkDY34yDYnthK2`sjW)N^3tr0JH0Ztl(Ugg zux6y3ZYp>S(Q=RZ%*6DR;=c4BM&J#Sg|RY%jMnDM0|q0YJz$jbpn~x=^Lx{_-=9HG zS^l@%Zm}8=Q(gsxT{y!<*qV3z2;>ioLIhq{{h=WSyjVQ8S)I%^LL`y^2v4g)#k<2B-lJO$n&8-R`1Q!7#_klG8ClkWD z2u0C9AwcqVV83@j!nPVne zI&A2S|HIhFZf+C@29ji7V`zzZX8eOUcH5bjaA!4Ea1-KKUd6}W6Y9=sorpZML(=tYzs5}h2%84Q;*3Eo8iP}}Nlxp+|VoTdRSS9@du<#f6w z=3ArlfnozzoCVUOW@r^e16Tyg#&VPyVkP$GbW%eyC6>2V&Pk zu!wP!>jjn~F}>A|4J$r0PR_Xl`xBkc3$`K&HIs{S2nsP$G!3DdElS42R}goe={uc( zbbBj?vRcB>Cj{&7oH;KIj*;NaQKD!Y*5hxx(Ti)i(d$f$SAU879NhGab}?Xg=U5tq zucJ(hVFPg(jvPMk+|MsmMB*LIKzBTgn^^IH{gL@=KyHjRz-PhX*{5h3+W4Bsnc7Lz z#<#!Ivt@ZNkjhYO8ZcM5Vb^a%0`oWlsxJujS_U11`L*e_xfkl+2vOj%9r^jq zvway0$z|b!xGh`SH@=RS_Ybj~50i)qEZA)*_DXnwp4azk(S8-`i*K|(^#s1Y8+ami zgoC(UQKi-%$N^VvM!iCq_58m4&b*i``awUAPYq-FLkqcH@vnKX8kfBw{}8nP0V5!&spI5N)41q?HP=>|7?ptv8mUmI4Fh)Y6zN%j%zazYf@>LVrdMz@} zNqIzUb}BJb^b9hZ{zVPcNHU^Zq4cj7y-f5%8p8rntp$+OUH+y(gpL-=FI4}k6qY{- zi{f|VUMZlGw9rw6Q5$BZItqUiZ9m(l$qIwd0(9(Q$@w6nU8`cRM8APk?q!mMOG5i$ z+7=uUlYKce!CJ@O#EOOl`NT|w2*tdP68E}77f3>y*o|yEGsX!F3?7Cw;iFKgb43Mh z27vj%LC;HYEn%w0&vs$y;&_H;FrYJ;dQ2a%BJA|z8X$ukdt7$?Kt_N%@sS)U5qcEW zU-b;I{kv_t`{yWcgg2N%i_rvoG)421=wsZE-X@IpgN~Rf(H*Ty7>#3&^BV?N@a9r1 zb11yU>Puxu?y6fRJ#IJ*Rft?E`so`^n0yeMa6oVhs8@}7J9W!4IEkanM zi3QDJ=eNWQ-x5Z#QK&3+Sgd^h2WT#g<%Bblx>JpX22+O9Z$8*eT2fEpqmW0kP=hW_ zkvbgztmi3pkU#X@_+IoH|0SV1HU0+u0n0x$w2StkvC3LZ6LDU}Y{wQz`42QY*lKbQ z>Ju*V9NH=B0J0zuONL;OBPA-$9W}q|V)TI=&ZvU5|jh zO~Q1<23Nw_Z9D`W#)F$9zvnqBG1GIynyQe_7%L%-dM>BD&1F=teGh z^A{{?(S0#eoURJ$Jgj3a@v;-jlNWr`;CFsdtn<2VtM#*Ngt=eKj&PC5yrv)gJt zAMK&TCp>+sWuOur=cK-E;i1gMkm8GxQI|IX{r!Dj`_H~etWMtS1cH9QgPiPzxaUCg z3m}|;06`GQ=^q&8Z=r%`=}h87Na>Ti4ai{~v}HsNn_dI5O3W9MuK|@4DCYr#eqDpgHJtdd8&>G0LI3D`(h-!y#ae;D6av=S&M~MJl$z%Fd z1&rI%j%LE^u#lJh7=VvLwtRfvMa!FJ?Sv>*iQd1;{K6i#8 zOYG;&fSbj0d7S?RZmXapIDX8N_(;HJp{>Si;AIYz8);7D3NnrCv7g5 zchGH`A#6Sq9dW9BN9}$BE;=^Qe1j*5!>SO<)y7$|r%BcFo9bG$O9Hl8T&k_~tPTF`E=_Y|HA6ZjgT@0Vb*#oo$V8C|JN`Qi62@9jVPv_Io1Y9v zI8=eRI1KpT>Wzh_Ykn*gfX?2{a(+G^=Ni9~n!8`AF1oIU3lHn9jB}qme1J5{fv!g( z?a%Qe%$Go&>d@EUST5|5T)fgOhbrRYw2O#c;qD1Tw-BLYWb@t0fk%l8HglYCba=Y1 zR(G<>h?~6JanUQ!cR1t3-kXkXou?vz(WS4J*CfFNXL1nlf>ht{UqsWu?$fU}P|8pYI; zXiGe_~&|&!Z)iJ)qjH|>rF_jlt`&rcj#lr z?Oa{@M2c(oeR|*l7~FT#I;;fH+L-<7z5j;$!$FRDY;=hyU*)|jxlf&gi{R%+(x*ZG zZ_E$Tu=Bld)D{OySjq-i)AIH|xKl@n@%iUVYD+HXo_3N$2Ia8=LH7T!>*(6vN&RH! z4Ru?8^B@rB%Dp}_R#~#njvQ*)(4L@Ro~gUcuyKU;e@5K;D+yx3OsR}>fvk}Ey>*%$ zyhhb3qnf3-IRex%wugdx8~k|lvE9Z~97>|V>8D~zPE~g`9A5Cs{)+bKjxqRpaAx(Tc_4;?SuhBe9ZNV ztbXu-ZQ67*P6AUWZJA|SR7oYG?z;}k?IE-*cdRDMO>ygL@ZcwYIFShUQ%FRCX?+PVOjG5SOM9rC>ln$?6;F53cXL|5OrNT&y&dlBi?Q2Xeoo>R28 z_Z?JiNaPa}rz3t9sZK_Wc ztlJO8Ap<6?!}o|a_ogsr@8t9Q3FX;HpLa>*Oa!{!PSuf=s!ceB1({;+(AQ?9v2OBL zv=_R18`X?Xn~!iY(q-?ith$mirL;#GxZXjkYgb_a>E6z-loyh>p3Hv*CcM8^fsamY zAW9@b58UwQEz8R*$+>-CzRPPUn^4)_!Of>m6OboQFd(%D$Mvg6X$tZT!{}r|v(Gx{HSxoO)VU z)h$_fUKZzLNcxVpCmN*gNuG+uA?2cls@q?`bYtpkndo{eV)zs1LUn1Ydl-oFK51_J zXboo%2@i&n3qIhDh709&>E6F1Zu^?8lh`2crI9;=etqfk^AD%1N;m|3AKrQsP-zoF z8Qa60C5!9#lc^~ByAtv*%@eRGolu9DBylm#uJqaC>C)RuyfeJBA$P6 zUp0SwuZn<86|lz2;F3PR)Ngn|v9Ppc$?>LOhRon@+>AQO<@ZzWgFUmA&;J2AS^p6yCnwl{wg2dUZdp0mIKkLB*x0$a**JMPc)(cMIREv)NLl|6 z@bbSL>F(-g^79`{p4Ju?_W#T3e^31H*8hiW|1I2q@BF{IM-uxDY!6Rc7Xs2EQBVm= z%>ML}sC^|YNyO_Gp?&-M0r(R0I{o~yiNX^2Ha-3d z=xPv258ccvv{Ktpw}xLn!V5<#ro3}jK07p0PAKPtm);ua{Q!erqfcHg#M;nI5)V|z zyEJm7P@ETWWOcjM9BKxy(mUbAE~ny48CVjRHNUe&Pqbfi<%PtlaZkP0Jxp`$MjmOV ziTT;IaZK3u{X?Ki_nTRZea-u8J~>;-H%DozBf35lLiezu_n*S-2ntT7YIXync}*=! z(X5Ud$208FF%BXObS~``so0E^;O=C5o4%!$OD~rZ@da-0;8)rqTt(pjS6|bAnEQ_g O{-c5aXyE^I4g5dpx}dTE literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/rb-inotify-0.9.10.gem b/vendor/bundle/ruby/2.3.0/cache/rb-inotify-0.9.10.gem new file mode 100644 index 0000000000000000000000000000000000000000..cd3d5858582413ef98bf2be5b7ac5a574ba5c73a GIT binary patch literal 14848 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�m+T=23c_Xo$BO>7>Q?K9t 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 R;y(!d2Z8?}@V^Lw{|o0sKA8Xj literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/rouge-3.1.0.gem b/vendor/bundle/ruby/2.3.0/cache/rouge-3.1.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..d889949ef9c0907dadbaccbefe99f1c5389f53ff GIT binary patch literal 282624 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ⅈ$uY>Ns?9oGhSf-Qi}weWn}$^e=Q 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 Qv$@4NTDd+#%B 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

%v|w9 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�Kp2$Z}SgfmV?XKdAM-_7$*MY?GL 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/ruby_dep-1.5.0.gem b/vendor/bundle/ruby/2.3.0/cache/ruby_dep-1.5.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..04b330408ef8b9b5f849bbf15dc97003e130ef1b GIT binary patch literal 11776 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 pz4BI9f;puwm2Z8?}@c$nK{u_MIZbtwB literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/cache/sass-3.5.5.gem b/vendor/bundle/ruby/2.3.0/cache/sass-3.5.5.gem new file mode 100644 index 0000000000000000000000000000000000000000..6016f9d90496df3a058abf8d9c9e1de70cabf148 GIT binary patch literal 320000 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.Gr<%Vch$VxS!KAo}?f%7$iuPHdzO zOQex;sd%dwFfG#xIDP~X4-~Hm=e@{y4;OJfVS~G0cNFpnmlZQfRFMhPNe$fn@FE5& z9wEe??{s(!V@PTxv5TVQ$Ll~{NWXNJkvMFzE<#q#1VE^F}gM^C~X%2Wq_IEX`ZWH-N&LiJyt`?&o z>GOcefSH6sWHXV`Bn>W6h#0d=(T{7m6d?4;4G!a43yknE&XZu=M7-OAD~W#t(G2jllMDhY+@eZ|9i%c2jM#$$fc+Ki0A5fV}mE&wg`MqRdxiuV8Qk`_13r!; z@r?tPc<}Jog{)< zW8L5Lrh}4L_vuGPFn>tQsUIuz+@W>dL3}LY*3Oa=Nbp>_cmtZS3b6lzX2)$@AuHIxdrI#Cm0}233NDt^gzfX7s|;kRzJP*;tc| z_lWk_rh{VIn4|!nW6jcr8G?~WXsL4GM)q1ryQ;~M6&~SJD2->xP(pt|RC6XK-f351 zh+4B*A>%+LKn*E8SxGGNjB%BseM5&tCq;FObx(B|b{}5?W&jUnLdK9D=>3VFZDPIn zpdw~B z+>6*efrs37?6(@RKF6Nc+~;eti%et11Le*rJWa3!gy2ESGEB2b3e!RvLN-)69z-?k zbT0djI`|qK=1c}(!nPnXL)c*uEpC?TXzNt37r5(C_IYf_Oo->Ejz-pFZs(d2A2wwh04-=kcgcv! z@_BS4xj$|1a;j4ZOE&DUv3+4P#2HW#BkWx$I`Wc{%Wp(t=8$pVP1;)U9+IRcbQpAR zIbizqEQ6YI>{zmOo^L|nAkWN<%u3u{V2&`>U>>3?Gg4AWq#T5|NxY>TmRiN|J zWVGiJEqEWF*@OxjG2P%sv;OljLMis=xTL0xE=(7>;Ga*}VIaNV$Ixx+++iiS+Cb(;VXpy-Lzt zvl3w{oFSn@PKC0m9)E$=-w3hgj%e=0mHQkcW+LT82UjFt%1YC`fCSKC7IWp9p}-k9 zI?(IT7g$gYs(>8y*=U7wpHbTCJrA)(|Hr|kR({RfsueiNXz1co&&%F51dIM4nvmS2 zr7F=$Y=C9xC$#9tvuYA_a=V#yIuBkYM? z@KE&}s#)mGL=otrNMmKT{@@ZkB1>7vMBRXS9SD&K)sTNKYW7+r7zL3Y0|*<7RK1wEL8D3qz> zVl`~dF)@&flv~)=c@uRmVB=SKCMp;~gbjOO-}6iYj0{GM1Ym|h-xJ4}$V(gMSz6fX z=o6&=h-DS2jGjdDJ|JKuN+L=kH#P*t7!OLa`yig>yqy;m945(jJIpMv*z2jV#u0?h z(Z;>u8sJGGLppRxn>V^*>2!@TO*N!xmQi5iosDU)Pf5#opp9!Ie4iXb8zFeI+5!^! zT#nn&=*Oxt>BW}Y8D9(^EuVwE{;VK<65qu*(_jAEg7eskZxCCDv{hYU|yMzn+AlSf~;U5?}Cd6;7_r;${_{31zz!yl`F zrnm&z_aIS&O<&)rT*3gml2lp6HhWNkOU=g#6k$b?^ryU~4Txqf(QLN8A)bJ*Su_hr zIc*N8MW3e`(lxKx{`VOuHer?=dQe~+BaDMnq(McmsH)|L7Cy;VtXf&p&@*foJinvU z>Z-g?EiJuhE8^>MQ}ye-iTJe*(*NM}`9}G5`DSHy=fCe(GvK?W@Au~7H?Y_tpRcnI z2;_SOHdn`>vDO;><_n6w5YYMUPoodHqzxkJO-mJ!c^=VI0ARxh4aWHehM z`)?Uea@XM+R8u^5aQEHCshD{sZ>Y&f_Te1aRd$63 zzKX&%jGAf1w*eC|(Xt1%k-)hnBQdt!<=o;R9!&b9ah&ibiDLO&BGt;&_A2HQ(TV_x zZ5<5cuH8g%!m$GVu?4myex!@xkxBCJn|Ur?4=0q^dk3i{k^%O7SH2W$ZOe-Q%iu*i zCO*2|TF_od>u8=)ZPS)gYgd&fsUBIh;)>ava@@7F($x;oQsi`luAKoAsOcU$MjW|Piip;?mVcXvy@mns0|Oco1%F; za?Lm0j260n7R63b_ZD*aCu5x7I^P;{SNOrqz|UOQChulZqbGD9F8=-0&BD}oyCkR# zp6w0(H_eMd#7vLD2(Y!Qef!?+=W}KNLFxG$tnu?>rg}T~I&N)y)9cyI+x?dEp7h`5 zrXWha8_1GyvE(NxZ;Jf&jZhEf&Sh?JZTg+d#YaP)RDzwILgTPO97Edk!O zeUEReC(%wfzeltGU$AWlZ|_gxb(tBs%@(Tjrm(!ScYuEc>HU14OMeDP*%j+LWTZi7AFRO6tYf)M# z(CCSU?+52_0%8B`yWN$Ao1Z)=8<95MyJoOvKCVS||8@SY^N5+?ZBg9>OsLO!J_gEv zYvmFJJ39#NL9+BY_<FfyO#oDY~m9PB@HcwKR}LUJd9Ie1p*K zTb^VY@RqOw-OA1llW^G4edYHyzl!ldc8MmmTS@{FYR-tYaP2?1f>W_O$1B2JKmR=X z39U}l4>M2CqNKc+8L%rAmINUb+Hjk=jYMaaG&cNBgbSD!#boCbF0@ZhLcU-rG>LD` zn3Mw9EPNigv?H4V$%=3v(`JH~zUPZRJyixB&Y%!IK}xSoIbLAdlbWn?oud~2(h&NW zW6ft@yuH&!)14xC!3!^B zVvFcR4(Y_>lm404d&RtAS5p@w?73q5prQ|}BDudTlrk+^nG#$p?uO{FXE0A8HQJ@y z?&bixlbwow&vA;Y@L%HeB*v-m(ey9O7BO(6NkZri1E<$_XD56F4j6H+^)VUR5PC`tVI z0Cc59u3(s$Vi&^Gwf+nE#h1yk>NLcdeE3o|8a9o4C6)!YZEt+BP!@AbEPG0&+L(qR|$ zc8jVZOV|gRMloJWm@w7p3dR0JlP|uzq}eBfYs#|iB@hzVQb`&U6K;Q_Odb$95fMM3 zcp2Rg++Nz;&WxSJ|7=NaQf+-RWUIB>f&FW9$b~dZla>rZo2HT?1gQNP0+-~e!ULhl zq;b6KZf#vxd&nl{g6nK9)S z(7v`rf$U8CPH^~gE$Sa0FVjGp`(lGSoMp)qMUwsR z-&7wnbl`g>IkgbRYR_x!64M=kdUUb{!2p*+0VT5nFWTC2(Ku99|-l1!@ zRZtJwk~+->RW+-n{jI@7YP6V>X6$*Eo+(kkO*3$KlL6nu&`V_SLZVP4b;YR>-d_ z8Znd3Co{*}72i|RYJht{)W4Z~k0eY=r>d~Piz2h#iaa&x zZT!Za$2TrNv){@eKG-O30GG-fCe4`IaK9_SdUqnJgW!2{7Z%|PPcK>jQrPm~%)^va zbAXGniSHeF1-xBX6KHS5_7zK}6KkADg7jkwPJkFa4|gKs?}OP!LlZL$&t0q)4;Wk8 zA}6rUL3^VZDCV#`3(j@-%&V*_+`FM7VH-8WJWsokEJQ?nMo@^7dW_o8zh7-7QZ`1W z=p`x>7$T!cH?ei9h0(w0_%TPEGS#Mz1rK;&`JMU}uDE=kUwymhostG460Iu=l?Yng zpkdl2m^`NfYoW*YHor7K z{cRJpfzoG{d32js%|)nm20i6fYgQmI5iBc?iZLh7YAN)>M;tWG>z-=Gb1+nD*vSJ~ zfAvfC@sIG$YyRXEB96&cU>=_}&&^k@55k9dG-3)vmHncrgSf&4D}rwp71P5WA^^2% zhfCrFzrwGwOM67N#RcoUVnG-azx>r5YstDdW(BC-Gilz@`+~WQ8nLX_kPt>zdOw{! z3B%Db$nJ6Qw-Bt8lfIpzxOda$5+3#n4B?`Lk>AuKH7TjF=A))2*iCKj1uIK|Tc7=O z!p}VB;j1f(sNu&^FZb@ zNVRK1LV^N#Nu`lxhQ$m#m@4|@hRO~v=`>fK#iHb3M6BrrkE*0@ybvyyHYu}&FRInp6DcS&+_g5V7+c4=Hmd(JU}`HW)hIp_4FkaOgb z0g3^4OX8@h1D!WmCHd+sRibjE5==@QKf$An=de*v)f|08x5+`cH@f{5d>9O53WJz<$1+ zLATn=P!)`sk|GwIHf10z7u$?#narexa8|k36|vKKCzWwRuBYzN zp2)4&%fha*oN>Y>8kTbZbIk4-Ue`I$JahV26EREVkVqw;k-%Nlbdhv$6yI%^qsBOg zN~Z_BW8Gf^;v3JrVrlmzFzF)FWb;SrEIf3_rqPJ9xrIA?KdMJFSOk{160mi+4v5Xj z_Cq~$kE_zv)2Tsx55 zaihut!kIjc}P#sqdcVCPJ_Dw8zzIa44smN8uc z;lV7RlTtb`i}?}%mD@F$@~I2kdN}KSt;Cqa^u)@+wV15*XI2q7NP`vLY(M$Z-N1wB zTIy1aF^#~N2T4a`^_eG1l9i-ji8p^sjQv(3ZHO;>t4H&0P#|BwMz)U_UE~0S@Nr?@ zLyxl&Kvy0cCch`}(e)f^DnBsbU8B$}+F&k;M&|P*ktCD`^7)Zl=&7uEO(LkAT~n;2 zl?rWi(j9#wbN!7Jxp`nC$y_rtFka#N9Y$`cyGAx*3L^57no%Mhb>Z{EZy#6k$}EL{ z+f|HILaE^yqhdu~6YEgO=!%j&2|sqma36Pw)cP1>+K2(>MZb4w8{jv%L3O()n=dNW%Bep)eNu|M>Lt18nxuSv3Fa>+kr(KPQO9k-`q_egvLP6jR32zVz+xi~&FB2z?*R$+nlZ znZ$6vDWHppLWU%}=`&!w3thv%wjL$+vBZAwwd$P7h3{A14ekPeMx6T4g6YeL&1BNPA2;}Z}*+d4MSwWFDp{D2xlb9%PL;|5)<$ba(potrgbmwg*g~hfFT=vkMuv(zh-v%d4`?cSErdh$2p#^oZSF`~>p@=zG)GGO@R0xb5L$Z$swJItjlEsc3H?750qbXb!O1 zTZ-lhq@BygQapWMo?L4B(YS2yvHJzLXO!)T{b z)ub!EU{#Qx=a+2&fBZk<*_6uf zD-=;hRRD+IMW^v6tnbc9g9u(U3LM>8l<#CXn6;bKvS0x!wGyq=&3E!WLh^InQ{j(F z-9bjzrrKHB%O28qc~Ia7AatOi2)w5aFzbBh+%$S6Qt(|%fFqOd-?iv|WZKPbUmI1D zL`$4*QUU18bx&U54sLB9n_W=&U7+Hq2%kr&h(V1t{hb-|ei5hZl`aGn9_m=eRw84w zn_edD|0zjn@=RbNp6+Ho}tj`|7F@B+7WymO~8VZ{UEm%dHM6?W{Iebtw@68@~0 zVHxR~h3Y!K`F!p=sl`k7pB|xi`(Pi4n6-Z(^zgL$!Ys;&8qf4zHd`Su$HYlSSgv7-dmCmy_3TNPeyX zYbdq5*D7Mkq#E$H(40oMz!AFOcCA-Il`XqqZYhyVj&Ls$BcfLAM5EaasmK(TZlWfY zml%eFJ*wz_Pub@W#yjWb!Ny94$`0!<^GI^jD(NH_|+OZJGF zpLap~8VMLM(dt=Cvi2}r=2|><$Uov5_V5|I_wYVXI$vNFF~5((KveB}*Hw2^s@QYn zmXIZypnGR`qJ>ko{`DaL#KsyuNMntqJFYp4(QhJ8(O%Og-$)Tq#fmoJosq3xypG+OEX@5 zk%OknGv*rMitKOf-rm{OYTsraucOG1SBX7Y#ua%)IhAFL!{CE{A5ZM|Z1sFH2JW%v z4K4RUU=CCv&51oaD3wur6-D}^vuJhL8)FtlGQ~Rkf79o~7bHAX>0ZlUO0Iu1*3yG~8R##yqZjY#^^)M0P6Ss4gl@0?uX zGmElx=+l)X)VMrm8J!^Ld=r< zuKNVjJmIXOa4k6qbK+Y@N;{U}F>Aa=%Gxr0`DbY&GY>6#5fT26!+!3jSCG_sL1+iD z*br=1_-TtgyE@f|%Ad3&GzXoiLb}%qkZMd2=3K-7c95Ar7mlTRnyK@hFQRXaFP8FW z=>-px7)plJv^?k1FA8=Gz+eK^Z%nIoa`GNARpy&z2~TQ=k2@sAiq&dI;uRSrPk1L| zFp9$phc7+cZ)P??(|4(AWH@RsvkI-ihI9%G(o_Fex~O#~w#{J;lbO`vDCONu(n>t4BDylsB6_SA4i@;;H^L%AH!c%L_vVCrQ(@U z!w5TkO*VCGe{M}OxV6Dd@_-B?5Q4^%VlnL2a%-V(A=^qG_R=&}17qY53hHU(27Q1z z+~3T&HI;}($fPq%jT!11O~hs+&<>I^z-wP0@Z_w)DJsUf*k~J^i;=SehemXG6`=O^ z4-AXU#bOqY%H;=!7Pr82m>aI~Pi8mLHst$XgaabaSGWvYkM{zzQx5RXr9*0xUktlq zo`Mm@ME)!G9(+*`@}Qz>&kTXRH4!rlQdjnuUy!54p~kLBKf+;fLn<=CQs$NQ!L~p4 z_9BPEHia|VhU78mLT&1nplQ6lLs#XNZIoECA7}C^ftTh4MgFf|gy zog7O+=q!l*qFB36k?b&&ftA}{q5;)-h=&aAeYVcDhqPYZkkwOiJcV{I1!j`Ckh0g> z2TFyH|As~|RH7qxxzC>Y?6^mrieaCrKE;NKf4Wg#LlptUMRe%Fsr1W@?3|vUL%oJ0 zNwM>;BzuTB=U>c;qd-3$l4)-g*yPNuHK9Qz9b7mYmUr)0fy$xht6|+%VH7wJtJ!lGhFmayt~v3A zKdprFtt~2f_V?82f+}oa93v(6^0W^`n|4}R9-bK2E>Ya}_e3%eZeObfpNI>$c_fiw zKcRV`n2>!RGi}>dqUA@LhQsr4In5Rma@di>!9Oa)U|cHGY9Y3!P$A9PI<~N;-c4~x#dT=6;nH|^fag5XO$3}B8ELc#2@SwsS>5!Mk-#|g=Rc=u!Q(b{7{h7>Pm+f%%LJLwI}6!O4srhm&S#MD@(99VmHWJNc{U*w5#d?y@H zez&+@N9uc@7NWdWwTBNq8KVOeIgA@3?!X+;zJAAN`xTQ%$LBstdl6yzDei6Bem$GE zE-~B~Ua$q*HH1-m z%0GEQvjN)!x6o4Syady_J*C>9q#o)Qc3be=9}0S@WbhG+*>-7Y&P6I5yFDy`BYMhA z<_-vbnRl5)?21}8pq8dPtG>xAf=A<*8!5zl+Z7ols?4GYDbt%Z%_`ro{8MLonnCU~ z6_k#@$eesU+Xx@u=-)0v+_9-P`cONR9Y}v8EZ?xENn9DhbRH>+V-g`>nf}?0@$#!? zY*>jz&)MHsHvSdTH6y$G-mY`c2QPyQ?ww>ocs+^}ZfY_PM8A)YAq;donyaO5LJwf| zTpz6Hb9oN1)%mB~q4)jd{`(!+JPQO)KK6{<)yBW|4XpP*z7zgDE&v^FkAdDF!16`l zejmiQ#gNW*(8kPQW4_`~#ABb*j{(rF77utn!Krxj49vg$I$S3Ne;0EV<@%r?COZy1 zvWzw6#BS<}lb#q4R9%qZA8gqX(lv8jBpQgY#WO<2NdehZ)A#C3#8)*`#=h3n&bj+` zrT}G|)l}Y}U(EO{l5%cp^g;K!n{YAXk}j=nyD$Es9;}HoxmhH`CzkbvLl|Ejz6vMy zmFD_HXUmvDZA$2a%eI_kH2GuL-0|d{Ib()k7}Mm$9T|qok(AnI;e|Dyp_gI|cc7Tc zCj${fG-g7%UY`kL@%=pEk9%9n`4)I8ZsJ6TV}OTm`va%-Fte#y{{h7deBI0)Du#S7 zPGB?_&G8#6gbIDzua-P2BF16=<5g5g-jvGmj4;S75q=WbP|n1!8Gi=zky`6{IQ}R% zf@#EDl5sOTx%_e_+O^}4e{*Z+vk+7pDgK&zb`p+*7o>gk8{_rJ%E>Rt#Z6t3yCm+`#5&G8V7x`4J_d)#U#(DUO@*FdxnU2p$=f#N!58HAIy1_p4Kly!s38%5*e?U;nz!kX zUCPUN+Be`m=j+>ljBuL!zATJYG;$E3@aH23Zk>4JjW&WZg0qOR%lO{?U5%Rx1nfzr z6t$>xA*T^<%e>1%n`cK*yqzE_hW>N*fF+xLr;+jTyJDmF>;6Ejumy;MJ8j3%pBF@& z6^_W+$m22ib&JCm->v>fnKE~*JTb4pAK3?gWfb)MpJD%h?*<0-IY3Fp)tmoL9Vu{C z+E8|gt}quzr?*+YN(-5B-U12V?XrXgHDn@nPK{rPTc7<4Wy33MF*suIme&2s$}uzt zPn?yR;4s5^p(Jo}w=mo*Ydm1HDRZEEzPCK(rEq-6!&aBjS38b0JEjP!mOV9_%qi;V zw8n%dvH`~tGC?LAzx8hE0~*X}up28{I2+&J)T~tmuY3R&IlyL;7=thKQoW9NRIx1Z zP)yH$)qcKS9zhcF&g&q>o6w?i2HiDs_@j8q9tGxGUhPk_IFc{CW8wABcbfT5^4e zRd0jtjoq!AzI8sY%E3D$bGgvhnsyw_fy*|{L99jc9MH)kV<*@eqnalWYKW&f?p#uf zpC+*P*YPf3;or8IBnLK`xYFjAh#``MNR~9+QnY@SDXc6S7a@r*>REGX`9$sqEDu2i zxf6=nY2Vdr>Vhpq`)^HzW` zU()wQ-ILYEMe(XD9=u0GRMNhRD|=JG4y~uHykrV*eM-gC=<5;2o{QX?_*8^Fw-7Qp zwvWJ6QM8a36qI=4GZ-ubpe1uK`ove7F6I*RmH|=$);KOK^hcnEof$@WomXodZ>}aH z(TSIO4zkVUA#}biPqN}M0hzHu+)X~twApQNoMf3}b!>9#c60te6Ai zYBdT0KSS1n-)V()ZngxB7%>E=$Pj@^*cuk`Ftb67IrkCH0>)V<{K8RxxT60H9&H@M z!pq#f7^QhqC8J!`Q3p-tb_fBZd%qK^*zy+@lxFeS z-P4_HO3b3HTv=6FM>+cjo$3_}>`@&JmF`ka~fhyqPmt3gmdtAiW;kH;? z{Olhjmr<7(9^oMgLH)Rn@__M}%Z}+*DM7B45(f+vM0I-mQe61!Wr&$^CISVlq&N?- zSi_#U?z*+(AJ(@I(yLL#@}nx&vS6D(vf(cs>@kRh94(KDkSQmXhX5OaV`D!AT}$F2 z4nrnKVAAU;c9`ZzoH6Y)p5Pj}U)za`?rz_qLZ^tQE_GCDvZmZ9%K~;wq)WT5JHoQ6 zzFyo@(YAFi67z=@4@c$TIO;@QbvJ5!Jz{-XaEh_=wd!zawrXSM*=sUUz7J&}h|^<{ zOE2TpC4oAaLPH`h3?7*yo~Gq=Wr%?S80mSWN_BNu4uxC5k5XL!&hL>Q2P>MxmP)p- z!W!aJHaHY)8fl!EI}mU0r=m|n1;xqCO*=LCDAJn#1T#zaZFtqa=F=gV3;ifo-2UT8 z`%3&vXj-=$_@R6s=dEOI4Vb5MmU#W&e)6drY=Hk=JnZ#IB(FN@8IR1ukEI%0@U z%0@(p9b;>5UUXf5r;!5B5qg-|21Yc@6Ti9``2+s=ze{`t%>tKw-`aH?r73D!oy)@- zx7B+Yd*6l_TYsId64gDF@xe7cZVCTxAbp#L3dZ*wA~34GyHeiZw#xg%{8M%_pgnv@xLa-i+w0P`LMi% z-U1p|PN-a04`>EuOvuet?!%`qzUi#ea+f{5tm7g)&K^%Fc1#(68OIP`7g|HINRq0S zViiV?9)J7qxeF#Ng+V|45~el98o18upWAbtb>QXsM)Buo-<&sa4DL_L;Jafhn2L?u z9Wj=G)MOMDorT*hGYFR+bvn*^q?h&q9Ca@#c~q$^yRxZ~WhEqGXSPY5gWU0i zr=s@VzGbd5=rl+J7+T$(*DqfFlEg+`v4h5(&}V1n&W1ojyZ;SMK(fDKD#zFG-i23P)-@4~ktGtahu+Yi%3d8IT>1XjLaLrj1UceI>{!xxX);QuYx`B<*Oe*(|EX5gO z7c-XDX)$^_>!G8lGo3$Ii^vQdt>KS>=57Gh%C#XZsx=e1vZxNvgq&Ou>l&};lyAYT zjx@rHV{02>i3c(OrmCnLK+RfDu7>VW>g6$hJ|)8riombbl>9R6tji|j1I$KDJr{Pf zbIoB|^_7m>m2;$B9tAelQD#-m(r2r*UUo!h1r8&Cwk$Uloqa%2fTM_4c0k5t zhmne7*5k;a?D!->%W;gYZWslrF)=ucP!*Oo3u>b@UJn_;K$dxI@@}7h8fnkzB(fEZ^1^R+(=!;ys-bI~O9$aV%NUU6=8mwQW zIMVhFC3d_q@kfRjgb#gz*sxC>{T-A>*_b~sHW^78nzeFk!QWLPtKmpf0Qzt2O!uF(i{8;q|EgRdlZ zLt&8|r>M2RjF@{ytcBOHNC#29Ad?64)oqkjpr-j~J&{7+K%19iCc1_tZA+W9%FQu zvFUymj0%qv0K?KfHmN7c=w~}R$1J=qqTfynri!I#Mrvladowf;3-6%n zjSNUgZyO8apxy`d`zO`^vR>+wDS&RX|9<-IdP)ED?fUw?{og;8{s)yQL6@l(TkcKB zZf~k$(bFqLSLc-KN2z`eWnLdt{q`JP$V0ISa^Kks>q}UtEN!Lm(h=TqlfEv0wxT$J zN^y#c&Z7f*8^wSoId2v4?@?iz_yt7(e8**Vi4JrAq@Mx=tVTsxvaM#8>r(pp5p~8cExM5gi{9wuhO*2{5bp|Fs)s+!p-tNOA_=gT%+A- zAC-Fj2-t%694{YadOI5pbWQ>Dmoz7{cu0F!s9?R3T^+Caz8{^cX`(>-fyC0KlVui^ zxH!92J3X|^`~6{rvmXCj{KY3A0=MA*$B)bLUmmSJy2t;Y`Th^L9Ph{T$_3yOq99fF zHL8Cx&lR#OGpmd@U+AZ0`%h({T2eYJ)F8PWRcDXN8R=fU(m3A!Xw3a3)(rGm8v(-R9NJf1!EMk+V zY8!Pa>YTjZ)i)*nK&7;+&fM&N38FT)wssCZ15dLcui?9t`$b9VlWQ*sW0|M1FLRZ! ztanlqE?2hOR(uRRwiX4!pmrOvgAE#j%$)T7551F<56>QcdAizWHn8#KmtU?u9yP?5 zz3E$R4sBwg zcr0vj#BSyD>C9B9L(`VmousyOlQjxw#l)c5MlI2%s708%N6ni3*J%ejY)mu7xEHLJ zpj?!w3%S!U=>D=#_bOR9vr@D2#-T?=-H>cWNJn;QU9;EgDJ&M*+yY&HQbmEw1nYi$ zfT=!|epcoQYfB$Pq0{3YG<;fSQCYcAE(uRh?IOO^@&g%t*6NMIaMmBDvnw?B#<%)` z=<)CQ?2{^J?7`s*<4ln2q_RDl!Vg%dcICJ6N@q@KBxBgqI1I8XWb-cMVe#PhJ-sLD z|2*_RnaA;Gv;SQC_G#Jv^ILpK*a=19PpJO>H8>UZeQHw%ZD0TC!LIbLI8 zU^Fk0SIA^OV{2(v_>OZVTa;E$fJ3MxI!~kVW%zywB#*fbz%-Oi7Pya5IGCTGqsZ&p zRoVoLIgUMae0TVbMMMVB-y#BYXQfK*P5s9T%QO;&jb(1XnkFxSMgdAK(I`{-qj0Kq z{^J;Vy!^Are|!A&QJMdL@_6mZ{rUg==N}pU7=wRah75$t40@tI`xGw8Cva!r;6 zXR4YG*g!Rn3&~a-u{AT=nvX_im}v2dKlFW^&SHO-TFtWoxf#h!rkuu0K{3F9c61jC zG6@Exvdjy)8x&(Oi8*4Xnvem45^S?6I#*C0yeu-!lXEhbW*bXRDlXJDpqz+)&1f--H-7;$EF69^BL@+Rp1gHm3fte>nmoszH#P6t@4BeF1e zn=_-Akv;S`cO~BDHOnxC!SEtT>4F~mX}Rm`532JIG8W*qGG@JDdky9gSqQr0&Ff%49q!^o(+K@ zjHSXWNxM&?rCIxycBXcP^<{mR#QNI?QZvm;8Qa|9n1*!9!9gX1DtgwKJzVQQS?)Fb z-yatPZaM$==-Y3el=;7J)}P+kebfb5!ELyvokqY7aFawF zV|O ztjcygA9WIH=Zpq>aC9{kwHiV++RiXSEBY7eipCUDi98gLp+*XfCM3QS5v;gOMLxqI zkG@x9rK7;NE~XUOuc!hXmPPFDYlc-r{)Q=J*`!$7o9Cu&`OTk(83v+1jV>~Ske|tt)?F?(35kfla;GI@0t>x zobN3$W#E`G8ZzzC=xQGozN<`coVDXC4??Fntqqk)P_o*%ta?$E&@-4v@u-gkl_j=D zkphnh)o&Udy_3oq>T7|fQJ!U4QW-Xx4rR)l2fq10fur$NADLE)a^LD1gPb2MV6mh6 zh$e>bY3sm#GVHZ%*Mb4tG$qZV^9aNngX>Z^u2=~G)P^ZU*+Et6X=z`6S4^}!MMe8# z;-X0zorctRhO`J0o~!k9i(4|fWfnwYbZs+oRS^%A5Au=&ZmFD~8+=$Dk`5|GHdj0X zl8aP7S zv=BW2!<6T5IN=$xP0oT;P76V8oAX5|11|jD&%>DPSo4(z$eaf)rzDdHofJ%RN zpUyBmY0=NZaX$k_+I=~u1VTy8o56fAh+zzKQogvAfLzq|kH!WI294iqcau~=boNxe za)3kL-5hZ^gPfW-)fJ^ldc_Pa)lb+ctO{SUDv^&|wy0;^BK%FgO_)0sdO~rry;n|S_EcVi= zh3rCIGs`PWRcCgmQg<83M?=`+)9k|6G?+c8gRhmEy#T&&Isp3Sla6sqkvKkW zm&%oa9BrWbLue2rx4%~ktL;L2d>WQ|P%2n65zFM)*?5VeAC!;JYc$5FdFr330ByO=qCn5_+m4bIW6oU}9Kg@sYn5t)V!I-MY^b;P`dg3Y#5C}YA(=AK= zJDuK-K{=Dpd8AzYtmdejK!vmH(Wms4|d0 z1|vBrsRk#R2GsDelyJGj-nZVm|_^rIHG0(VlJRgJUmkjC7r0Jun#bVvg-BcGt3f1bs72Vdj zr`Pspv^p%KYOAJ04;EC<%k`^*QWc<3qD9?$%#1|6?g!7yu{#A71tS?nl*|>cgydk1 z7ML6*R-7@`u5^pAqo-yasln*wCLtM^<#oj4?kk&4EF!*4?l$UbI%rPfZHXPjST5)- zRLH_;HK?~n)CRni#us7Vocp|0soGwMHkWbQ4_ihUamm%!6){D zS%ubHAe9{cE!L!6<%Vn}QH6)}4QplHT!`}Aj73&$XX;|}<~OQ2??&KCy2y`FbKFTW zTB~aPl!R!(eE~+g`7Gj!J%B$%Qi0aYWB@Yt4`(7Ol2MV;jn@rQffBscl(NMx-E5t@ z6WPFp>Ki!+v&^L#RF}xB^s4Ztdsse(rL;|N(VJCW{>W>#+6$c<>uQK1(BkEM{yQ&r zZn>(u3n4?v&h@uysMvAijajm{ ztog%f#nxh3N5%r#sNEl8KWYw3Ym;1QO82b7JA;FV0q9Qr)c;N4K+J^(DzRHgU=VP9w zBF+Aog?d(586!g2>r+)FJ7DDaa(sji*)+aj#s7E5BhdaIqY(30lcm+C_5-=i|M#1< za{S*XPoLb!|M`>re=R@|mmFV?jp3z3KT-1m=H7@BPS-tTeOn+M?$FLiVciw^%*`OW zsq%JjTYYIKUXw>$Wq-rgiHk3;W@OiAjgcCZ3*%|&ivzuWDVs0Tqe>*)f%>NOF zBX-Ya&xUQMZ6TgNhwABNf0WKq(<5u<+8|nC zGOJ53Rn!FS>{&Y)m2wjVz(s>yFb!qzxp0z}YUL^lV)7q-v`u%x z#vw)aVujkIS#4BD@5y|+G=d?ygAs}+C19b-xI%V9_;Pz{e<~3V00=ZZ|@{oxt8;~ zX|(TyOfBU9I1Tb2;sU&s|670j&HAH9W&hu&kJs<{zt0-~8)&WN$jiB4R`W@)zAS-l z`JF{GD_+6m1+zL!^JvNI4AZPFcsC7ZclJT17pMmAFMbPr@8Y+pN5|XHg$2;Pa`D@d z(iJZ*G7U#ju=sU8pJB@5e8~_24{~1Q#bwZy1|xef8AkLzO8P+FZY#3zH93?mTSs6-+19RORPkauH=|LRt4J(H633R@B8{ zs5~oz;k!!9xV`0vI@@}s34pq=vhsw$R?r<+ApoNwI3t;=C(f7! zKck1eO6VJEVYQ|@242DHtmkhX(i$oKBeaXM(O}@1q*j5&;W)8H62=z3EfIP^Nx9VV|8kkH5!uY%2EU_>E^3eS;Zb01~ZJk zF;XUnb=5IA1jmx3JRh=!A|GGg;8-Hq=NwMCrKCE;4KP4t7SaKen!Q>Gl^9%D zQbTN4USg@%%vDyXSDdCWE7;GADzbvf9_7_+!AY6tVb&dI5#Y-B$~iYmjb?XcHOUUY z)F}Dnt43dB>6EMhDc{9Zy78(8dg!jNV{M#u;3vA-0-B@m=*Ta(V$;lz?-&y4HjZO* z8nHn^$K5vZJYd&QC3d%F)nLkPX7j;SO%pA(f$iGXa5_?^$KA1jPet}J2n0Y+M!eWk zt#9D1(0oYhs8)}q{2pR0_(R7K{#wTceo>He(X(I(AHqgrsAd`%8K67CbtZsO;xN}p zMTKqTOc>QfnL2#MZ6Ru`z!5ruOsi>jCMTKliez;waG-P&M?q7&weGOoiR)lHjdKMV z&Sb-`DTCGMG8FQU3u+xMH!9V)sD)I)Q2Mr3Z^PF0l44LtyI0yZ9m~X3s+|?UgSe;8 zoI8A{fR%Mb2oEqq3TOjZuLvm+iHcrH*KK^=jwxJ5<*tGO(Xw6G^z$%t`=WrCI8cs% z;%q6!KyllmY-o!c!$~Kk6jS5Z;T-D2H=L#8F~&Mr)S_$*1~j;WS!1iISr~)CY03E7 zu@obSVk6FHGG}U0(25#c@{S^<#ja44Slh+b%u;fv8o_SCfTt2^Yj9psT;J+orvyf2Q|C=$)q z{_EE}dq@4PmzxKu`fSm=b$UmEl$-(|J_zgmR_XN;gDB2o9e|8laQq=+QWG}p*6Ty`){`^BYf~lm(W_3$_k>z zz-VNc6FdBz+}@fMd{{rexeUPtM>-`-Et#<@6Iz|bZEo)#>}(zF{=B1Gd~U*_S|d-= zq$}+*jW@;4;nwCGSyK>*pPbax=8McgiD?}6nedDq$_wYqR{uKq7&Y~J_rG`d`rA7% zcK3EsJ+BA4p}N{tadHu%jC3y;iA@K9t8K+p zpRJm3!vL1er4|h!!H7tl)W{x-UzZC(n+@nnN=wyJVa1f~fDTPp0yP<;P6e#vzyad= zL;qbzTzn80bS-()cG3{xOwTmCa3&i^geg-tBY<VxfS=Bw>P5urk2CG;=GHsM=Hm zXS%BIPUEYXlolwde(2OyBDrglNFj0Qqz=584{gRCT&xv?zK6g)KX~x3P+r_O`O6**7u1) zT1-0VEg4`802u`;2LUb`kzs>Ua-~E>01eN{Kmvogh9lh?qQ$?@Bcg(FirXJe!^$4V z6w;bWb6#3RddIRtUR_9o8Zl^MtM>WVv@pJT)Yj2xX65Km%J6WetPY81Cr_`I3PIg^ z1C4OrN%Sv~CG|t&A#gje&d5oiU6+@MesbpO|ZwmRUaCREaqh5_)B4L~Xy@`tW zYRP)(&>^@Gs$H`l`as&|mlp2d)`P;C<5Ji;x$F9a)f-V~1Ty_23+oF{N=dm=~dX?ODFR3)}E4pI#Fp z^t&aUZXkbg>C|JQa!aMO#=l5c;HzCYR#Y^Y18ui)u>IOGMO)B7f*59T1D3&_Zem$5 z%WIo6yD8;awM?zFdK#s2kSI{YCxf5b3NBtXm68|vPMN{gxR?{t1eu)|67V7j-lYG) zez~P4=2t8NOLZqY+V~b(AGzMadWu0O?SffukWPorjetp%k69WN}qZ z5bMNMwI=lYSgOO{&r9BFDB#<^v2B{u#?te*IIf%wI0nIthU z_@L!T07Dbrw!W$0&P`d7axFwzQ4|}UvrgsQDMwVc!MwhfhwkW3IDRiWxoB9+AXB(<>ehj298q=51Zb9^S-r z=%U`Yr#@7D$3JkhJ2B(@L5+FW4_PZ6d zov=13&u^Efe{*nkcyDl*099Eaa!r+q%m226)5q6+4O}e;0!tnd{kv58{fF%?y_Ak1 zsfqhCr(2JW1v{cAaYHqry_Z z;X?TlRSZrV5of*a&)pH-O{I1zmX!MR-4RvwDEG-H{*dGob%m{^{wbt88R?a$0>9{_ zU3S()^j~aI{)Px~e;aj?cx;lPzFe~~qvB_AkvLhU*7)lqrA@tR_RkgTPvu3M?C{Er z(6`bdn&HUV_w8pb=_=Tff?#gE2isMg6QJEkAF%m6Z^`lLi#Z56bVq#~!qR z&IO^!l%X0oDJjpP+r&4{3|7E0UumX^tM~7)02KsLNtn|A z2nuEK;WbO@xe9NmkX~Z7e7bp%z@3ujjkyi7)Xh#_KKdcU@uU8&wX~VGmAy(U_$(hn zmC>g{JxIs${r5Wu2W^k@30c{_3=`Ee42|Yystl0Eif$UXz0|BO8Yo=^5nD!*VJ{Od zKnIi}x6}}Ft7y#|CGX&`@4+}7^^;b@f9AP1Y$ryX<1gxl(<<5d*x3mbrZtSADi5(F z;$Y2SGS^&QhFj_KC@s;~GLXXhxjcZYP48KEo0Z!io-rJz*wSt~9kkv3DTn*}*WItJ zd0wPb>&i{aLNetr)?G2nBXb5j`)5?2O0==o4mPGFIhJslqVd{j%EdQ$40-=diBfOm zmV1&kIMy;hJMONZ;+@#DlVnk86$EW*v#SqRL|LBPXw;Mhfwb3Cwg_)F4-R(@{4gH| zvv83(Vf7*&uBs$yn!MGlWi<{#iS;ZqN(Q4^xR)-)DPx*>hN{~>zbIWb)+Jj*&+mn_ zLy>hny~DmCz;IwE0orSjuO^(5mz(SUBz(`ln|2N^JIG;6rn-7wYg7Ob1;TcC5hCsH zU_aA8*)Y0G&plaEr<+!8nE?Jd3?>OX{GvrtbX~&x5rXGAC7)fjOug8BqNlqU= z`(m|C;Xs*Ul6^agBJ`IwuwRnlm96O>xp+cNy<*z%4C?0jA0bZG^udH~yOzD)fGoAQed}q{;hIWkXYtl7257zR8nE5%gAKbC(9OZ4zRG&T=Ms(# zEvm*0VyfYQ@Zjop_$`lI9g*m_HfXZ~a4KMiHL<;{9e2=Z>6u;J z;bY)$tekCyVaZ&+59OjDLl^|SvsQw^<5PSNhzv>`N2g3nR1RabV%<=0@Q8UP2dBgE zaiW%%w36ToZN*nnP4UA9wO8TX_@(Ff9rX&s`hp5*f<%)(zpTaW%djsxFK{2r)%2+K z3*`RVa_Y8C^nLtoC%r}KT88Xq10wQPB}H4(WmmF-?&RX=9l8PNkQJOrTI0fU41UVu zO7`Ev+@=~tPOlfOiF|G8{i#Sf8eLWVPbj7c6*jQq?1OdWoE55WZ@F!?;-+CIXJCpP z>s&_9E{Ra;mBQT4+e&@}9R7z&mZGK5=IWO2mdZmH)Z=?*k`gaUUZW~Hvn?r~-Io|e zQD!7^Q(i2%c&;pDO|4{9k#jt!(d9$@hyj+0-X$w>xl%`OAtwP}G%kBqw@hIPuvOEk zRH0#u!LXEvnxc`A<`0iq;Vsy31;Z6z43piQvaysa@SCp}?zUYF^HQyQ%gd2RA(MrC zK6udjGP@Qh4_8nA&kZoo&64O!L*p8p8SGruIoVu2d5BfS!*ZqiE|G8?BgI9}B&*@2 z5b27>bqHZu)S90Hxu`|)A zQZ5#gA?gm@IbGd&mDG4nMm(9frj*>Va!GAedF91UEZpg`#)iz*r2=zOnY*~OHk9i3 z-^=)^%mTMPE1ar~_^Ju#&C0cm+3FBW4&3TK>Um^7t-_iCl?iiHYjAj`$0>bk~PW2vs$Eo_Me2h8Si@Ckd*oOlmazR*ORa05e>Qmk4E!m0-p`%P8QmhJ#W z7ssC*w(pBaa?fncV0x}|j#Hk)6p#{&4TO3QOL$t{^p13$8HC0jaJP~!tVR@@K{6kC69i*%AJdSA#`xN_=-nAFA z)fli4BeoX(I`$ROHw^geb$v^#Lc=tB%~CTR8BA@%Yz6CC?9FH!cv-5qBgCOsq$f@q z93q*Ty*X(t)YtL#1DzaYo`LFRCKF|ity_>xz&hN~oS!KroES=Ea7*I|;YG@>Oa>X_gk0Mn$n(o5#F zyLcj{VH@xxQKUr`JN9f4tlOgNuqGwat`DOU*3^R*!@6_+q{o!(2t70v;;at3UDJur z)8LySI=1GHR$6Bt;8WKN-OBbQ3%!xSfccV@M^L1F8fzx|Z&jA8-R^vnHVr(LTfFmS za?RS*i1tKjo_%3+1+W)No^9C|kW|zT7gMTaEBu@~Zb+C?Ege2)37Mo;tk^K#M|#c(BNNNOGu25~qrfa8;To})>H4#i{Id`)drI=+rB&SoM_pZmi zlZPk%>4%e**0TpE*X>muZDg_TN#Vr})2>2;)EzyEI=X( zcX+Nkx|JD~S?1f|(~m|@hGrR>X+zY*SjS!*Q%i~gi$HaB3uM|RI3vpUd{_Ma8}O_> z0Sm|8-jZBBS@q+0uL5UIgBB@;&GP3-K8eOfOT$*%g*1JA@si?cD$O{EEMv6E3=Hul zr6DTq2O+QyZ0mc->vvRWIGWU2JSCyfLUJVuRF*_veDf(JIx=Z;d>oj@` zml5%9bIAYi&~Ss(kPVoq!TdzRa9VPP+BDS{m)np zezJKXZEvI9KD~XkbvQhHKg%?3<4g`MEtShgeyFajD-G9ojZOPDiSh9@Ah#+HR9zCR zd|J7frd$CE^SlA*tQV4`cEN6w4{F?u3xPSD>S8rRCc3-)H>S&u4K|AOrU`@OwRDM1zcD#6#(0NmY@9@Lhix ze-LA|Eo?rJu{fL9pM1ngU7I&;?~eL%>H+6zcga&-WT0<{&!f8~3>+C`=^O)`sbsEN zZ%cPSq$+Z9urQvpG`RSdI6;hyWrZQ7Fn^aghf8$p9$_Rlx=0~!bH=0L-{$~SGN^@Y znJmYnB!@Qnx&$_+r(69ZqZ`;b&3eGakG}Ji!Z_>4le{mL9UEfZ)oDY`b&h+>v8tM1 zs4ETbZ)1@r*}WifyP*)3Yu@i7M{fIUC8xC_Of7zvORp&gpKt6?9&clgY+$Qh^G*U; zoj1f{6=}_d-d0V7`Er>`_;Vv_5KHXH(zjKK(>cm94`fwsn1*#9nYxvL=C)8*v5?Rd zTeo$(NVrx-tsq7Y+4gF0Cp%&(9kfLqD?tFATOD<+R=!iiv96=ZDMJS5R-8l50LY%> zKn!isl&z`Jz!t44T4*H7h__@%xjH4wjN?b7pT=Cd0H_(pqaBOYRgB`Y`p{|?BT5HF zU$+7yYLWe{l!I!g!$vH%d!%r7{R?JS5jbk9)IF|`nIU6wdJ6((Scd4DgDcB?@}%QT z+T}`1EavzQ+rm8=@hpykI-?|chS7$l?cQV=w$+l8fkWl?7@4`%N~_?uu^d6!qPVwY zq5O}(;QDkb(%aioGZ_NyD|mG});ip#WvFa%oqY1i?n5fN0exR}$dNUUdvrHKSw{#? z5Sz%PN)&SkmEQ1$k}ASqyzj;$sixLFG~>ZHXa|h#j4_82%m)8Z#z1^XEI53joOP7P zgaW2e8WYZ{q?(fn6tOnNVky&^yIiX2G9Ak@zQ*uCUY#kntOa~od$l7TweQ9>>TY_X z`MimN%q2spUzFA1CZPoSCIBc|sdMC$b+Y@=kG=Ag`cj*0nkuqZv)cq*+i$ihK=sws z&|kCR1{1h#RjxR4*t1rHS9|5!Eqr6vztIuZ9ni9as}HjH$9cjzbb!+6rkv?WqS8GM zy8l?~{^#k}-POo8@qcAbgRlaHF~r_mXdM)C>N1q-a)Y9&2Fy3zm7-rGO6aT^K4_cQ;BHIJv4?ae0|+3!-{A|8-S|;|RyBZf-JHkI7oTlucH!2Tu+$P7-L9J(LT@3s z+{UfrJxrzR>ei)0$3I4d6!shiCQ`G%abszWHNn#DzXE3h!}^Q~JoqOZAs>!^J`wy0 z;Q3HAka_1{Ve=#z<;UMGkp_N4`^70)Kh%zignpYX6A6{YZDSYN+uDEJ-fOlFC@_3~ zd;kBTq>XC9=6X9V0C^`>p6SCX322(0b>@Tado#&_KNm|kufxytYOZ-HPZlan;GWAJ24dIG?UN&5*I)D}SPPtMglR%vtvUq_a(2tm+X6 zlv4g0wY_6tc7sqkqJlE-y(8fd*jVO29pA_KIP*umiRZMkIHOH@j3s%Q&Qsl6EL(P# z&hjBuGE7G!8(VM8!n`;D>%>Kea#5}eOzT1Ut!boKUv$(X&?RgN^H)MYJIq-+;Tnpk z?4FFBE^@ql5=>pHi$!2YS5B~NrXdlTcCgVL>qKGf6P)WLJ3dC0q48d>Bt0~%x;*uP zx1-;D<2IuaM#<`y=3s~APTaXZzMVGWU5Ym6X>m4S^E03_TchC*wtxrPPRSuhC4Q;C z@8{SX{?qQ!ulB6Co}EsM`N?TVo?@aoFY6bP1WuC$tBfPU8o@~(VUDCr-0S1~1f%FM z0qw=lpa>`Lm~w-|RLVni20g72}T2EYK6@R>(B-=inj{gBz^k8^F z?;8v*JvzQH{hiWC(OFVc>blR{gGC0BS<$N3OJPRF+a2T*o0T&;x6$)TaRYa|@IN`f zckz(sljSG1{EZ*g>a1>Xg!9RJ9X?JNqm_O5;6}$!?I0f#-9J*7AHQWmh5Jl z4gUTIQf%Bd&Xv_$4aEsczB!W$uPDxS5d{5SWI8>up{O?OEK#9%ewy`Fe%#8F z`w@RZAu$!=!~#^}>w;+mH?DNZ6ksA2ft@XuXQin3+oL$diOzI$G|ketW(oW#F}$R< zI?)X9e#5V~*7h8(&KiwAl8b?-yx;sf%)7DDrF^8u+?XCHAyx-nZsRx+~4MLrQTx^kG=v5)jD(QG5aJJN+GL9v5a=hR} zZzjH%9^kq-ZN`FAf;a=`t5}wLc>>L%8!X49xTs^DQ4yUY&yw%#?c6D#Fz5*yfr~$4~#)f(R1W#A% zIK8o57NX9LH-ZKto$$&Hnbag~yOl0DsjjIDgf&a?o*}C)qiM_!kFU+2=Y@EEuZoO+ z{pJey)tDB6r_+7k5iA!n z`asdi%eFd5hE$XG!@KXon0!W$Wg(e#ha2jHQ5o0QX2`w!2Y%L*Xr_TJ9iA6nzI%XC z*Pm^5R^||JgxMX|TNBQ;iKZcwAyVFk60RUx?!0Q+^%2g&+QFU4?a23godBz@LEXY1 zrdNM!pU!6Iz20uWhuSvHDObO4PNcSj!{?tN0(TV;m5XZBKvE2uRGZA8{ zF~%AiqbOcWLZ$EeLA;_)6g8wy`Pf+35rJYeHWkFW7zjMYbTn9e2~oW&|LJaAxMF=l zu(u*R8;ZE<`VdbBZ1glc4#GYapuy%pdHLcE20qHxKa!vv-1gq*ot?_=%KO`3q{@#I z?70I%cHG-{;a6=An^=|6H6ri@ausg^YbFq(V-LnaPBGATJ{fT^xcMUE&)T-En`z!2 zRp5&2-drHy4Lyr^c+Zj_Q$TWv(EC!Fx=ecku`wA09l_cE{Q8k}zBSFMPxH4f*>P~) zg7nDeBY6aVJ=*g&ySyl-BXhXn!38yElH@#xel5}z-TivX6eUZ`<`7`dcR#*(LfI<~ zxiS%pH%A%M^R{k|%h5>zdLv9SP$iDee^h+>NOzfA{N>l#chYX{>&)%1Sc>>R#^s#L zZFW@ICzOgSwFV!l8Zu6JHqH2nl%KWwr-nXhEa};gYY{P2^?IPkBH=kHfFBBP?hFav zW=k%|Yd5?~4ro&}Mdkbl@l;LI?5uc4<=-m>AMICrl)N!kI+-*P&8@r1-L0mE!25`K zNCh2ib%tbT|L#_D_cO1igMq^Pu(|m>P=m40((^mX)%Ex~8JozFzwO^`Cp#GA+uGl5 zQ5KH&*yQ=yNt(^1PvxiZ#4Lj0BwwY#v*i2LYy_|xO)MWFBmKR|C%93`UHTH1O>V|y zF7|xeK-d!ucP(9ZmEt%_9WQlvYn@L?Xl=58mz=L*g~N~6=du+qKSo1)8t$pkmuPki zZvV(f{bl(ol>LXP4o-6TwoJA+u};*8k84U+CmyXV$Y)MqlA_;7m;iM0E(7sw)N}Q) zmMam1W9*;Fn2TZ~CT;$cQ@DOK=U=r`&#-DvTVYBFMgglx(Rp`BVC_Q^LM6RFck(yjEvx-kBWi4ZR*!HqY{Z$ zdm-iC$lFuKEXGm-5tDIHsuZ~Po$n0SO)o{;xp)7-uOTUkW$~TSx>9P`&HHdaOWy-+ z-;-y(Vl?v7AM!ZO{e3vhN!xsN69oi#-rBfo)tT)4u6y^oiRyg-Q2kQ1d0}4f+N>gS zpNd`7t{*Q@N9_-TUZ8YE1SH_rv;VO>rIb7=r`_d z-@EtK7hn9_J^m;7@AjAXzu5k_?FaYoKlt*??Jw`$hxT9o>A}5!OYVJ)1(>7q7C^Z; z&9d>5cB|fpllz_gGtGXUgT$G%FnX=gI4edNZh#j}!?1nnQAsJexE3ezR^;+J&VIp= zheTlxzrfxic)%ds;m^=_*EJ-%!Ef;5fh*D#n=NKppOf~@&qwKuOAh6w%gRTO;W|gO zy-cU0t$cEtO>?xEoTlX|psy)xWCT6Dhy6x_bT|aIxtO;7)H6Y=X_k(%6>To?Z@-Na zLn5D!4$7%CGqfCi^Uda~AOHN{-DEKM?%DI*!2tiFeAu>b@SlNxMcH`< zn4M>{)#=n1lEEPd^<%al$-5FoIQwIdb4rmAD&ZXXTHHu$$Mf&O^C@gSIdk<*j}WrF zG;ao+2yiC?qey;t3?#rV#GwWr09`<$zp5O(%`RhuM5eLE$MuA857)wn2m-waK47e@ zUT;wv1r8}38CyXNe+m5EwUM+|1AaMJ<6{y0TC=BufGQGSEy8l3ZYM1tSl!9mi3F`Y z<$|;2Dnu|C)syWHKO=9~o?axCAGz-?DLPtvVuFu0B3LmlfLy=lqWeqf;ZAH_Bb$$q z@cOL=McTm)(_0hMY7So@C*rkcRB-25@NQ(H?eOkOb|)t&oHjUkZ8jB(o%E$o!@c3N zoAf!HF7lk!AJrEo)r0}b1S`l-&$p#fdov~dcc~qMwBDvaiHc7EDm!S+0NhKu8BOSo zN3k8P7>tSb?IQ18z2+j%55G-b9{nACj}N?Epo=?son_W4eTA}rpK_wU+Wl_#)$WTY zyS=l~#!Km8cgqYhDu(kjQ~P|;^8t}Vyr+1O1N>aFf3?By77a(9^I4vbL1YshyeXmU zw6^fm7TC6JR1s6B!*Hrv((yTBBE-UobNJStwMW2|4&OpoLsBH+nkWG9B?TY%RRP{d z64Ck4duBDW>Y*xct)I#cmi}WxkKmcD=jlC_V4g}?!A8OfAxdQGFrhN5WOCj@KH{2* z4D>0cNc^9RVw|Ou1G`N=5!NdeJMQWOCgZa#82tihREt(AMl_hCS(jb_(3L`^9fv%M z5V$?TosTdS{I(MV*KC}oPCkr1&VP+buTubsB7lnt{L2XS8^nzBJdTRdrO&8S8tdRI z`6RyfS9?@8_ZuAskD9M!I`~u<7D@9Rwt-V~S3W!~!AUSHAbL zF$$Lpr|r-Xd=u4um`lk_SFK`K8fa2}TQJ@dGeRv8drtY@E&abwI4Za1k5R1cRPNr-*8&blj(=LWo3WF>wL zo(y{#j{XqP^w3sVG5nJ4MfX9lo;7@(krD)x=@gh@C|O48;?wiVyMpVUBTgCCN#UFM z{Bd}&?8mSKgq|NWVZ2L3R($e+0AO>%RU!@clj(@*(7?%B8lwS*Y8zKP0rsye=U_=Q zO!D(KTY`obyF4o`42xQ;y_%9p_w3{kVm>G959DM}t?JQt z!NglEy5sSB=Z(ft>B%PX8|HSkj7FDu50@lqL)fi=9TC1qdecz7bV*mXDo_(_aevE%YgD;ZGUxpb`cp*td zE`1S-niA)LJ~qNCkhnR^&d?7wLwOIgFpz`sC?VdQGv3*zoTmZ@$A(84ib0anuZ`FG zIc1^)`r1(v@OaFf30+wZluy7IMly5m%nKzw|Abu1C`-vvk?wodP$bPfa3Cwt#PSZy zxLKts&Vi;qnV%gYS36-hSz)P7S-Kn`1@UptdNsN$kagiaQPYgVyK#JIfO&nGAR}Z) zu*A5|S@|^!rL3gJL%Kh(FBhBwEt`R0s^<6_Q|}l7KtYCl*}UX5fifdnFMvmXS4Je%fl*NI%5j&KNCMt}}}Y2bJfC1l~}*)nVu8D`_Id>O7o)>rXl(V^EX`&1}vkB-y#p z^pbQcvZ#nHtns)^inDws&JRB51v4APG(X8PE4^LLu0CTET6OFX+XJUOKfd(P2XHdA zg7M)rD~I#!u%`}6VI40JvT{C^!-@-RKM7bhp5*{oMj|N|NaU?IMG`gOu*hSpWfpeF zoj_o6USn~?bULEnN=kEED5%P(2tSff95E?-4OJKtHC-@A6qc|XDhzO;f&WT#bn^5; zBh3J6V#bW=mp%1;=}Q}qpFb{8g@$9i%`VHnC#M}+pVdQo(q|=FdS<~V$_J410ig-m zBjJc<*GgLe91B_)XHht0#VH!iR4;&ngcE|t6=ZU3lgDOVrC4t8&RjzCYR>=Z=0b5 zv+P-UV*9cpvXZ{gw#8wW7;wE!;05*Xj7z6AcpbmWV)`?Huq&U|F*1(?L`-E+o>;xT zx6Imc8uOmn7i}6Zst3CH>GWvL(D?e_@R$bs*hNHFwh5e;8O10Ky{U5SjB=A-HMiKY z_fOpNX;nMm@u51mQ34P}R694PGp?H$wTRBDp7ShL&MpM**<_ZTnA#y0Iu&&l2aW=? zLf9UUMs)EI>RTI$K_K8R30OB)5Ipd)k6i5m2`A0znc;PBnjtL7)%D;li1ydXJF>Yi z!iD&rcn&6T#d$Do!%a%tHgOiY@J44vIRoIbbKof?Jh_1XnrIEfdXdH@M`jJ-%8%wV z%K;b*!g)5#kJ+l#Wx9G&Q1B9GAg->Q1Bq0A5lG zBAR2ejTH`~D&E_y0q0PDB5{;8$cE<7ud+%a> zNSfNFOfA?G;)D6jUjjRb*S)Mea)I`n7|!#)SS+c}<+R)ynVHS4!)J4wtj1zS-**hj z1#l2GC?k#A7%LNy2n_h3Ecq#X30N3Ob4;;0xeCl7BzPE{wY}U$+f?4z8JuO)ldMf6 zI1Qej9L5~NIz5ygH{{6by|x)y`zg}(M y88C1xg9ZFv=8^dA+_aa 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

B{7J@Eyf`V_*9T_>nIsyg$qe((o+iJ_pZR$M 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 C4^;U8 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/fastfilereaderext.bundle b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/fastfilereaderext.bundle new file mode 100755 index 0000000000000000000000000000000000000000..13fdf2c3c459ba615f28670fac854d266f2202d3 GIT binary patch literal 34484 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 Jp2p$*e*m=ch&%uQ literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/gem.build_complete b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/gem.build_complete new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/gem_make.out b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/gem_make.out new file mode 100644 index 0000000..10f69f4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/gem_make.out @@ -0,0 +1,25 @@ +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader +/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20180108-62297-1cjcn5o.rb extconf.rb +/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/universal-darwin17/rbconfig.rb:214: warning: Insecure world writable dir /usr/local/apache-maven-2.2.1/bin in PATH, mode 040777 +creating Makefile + +To see why this extension failed to compile, please check the mkmf.log which can be found here: + + /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/mkmf.log + +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader +make "DESTDIR=" clean + +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader +make "DESTDIR=" +compiling mapper.cpp +compiling rubymain.cpp +linking shared-object fastfilereaderext.bundle +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' + +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader +make "DESTDIR=" install +/usr/bin/install -c -m 0755 fastfilereaderext.bundle ./.gem.20180108-62297-e2xkl2 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/mkmf.log b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/mkmf.log new file mode 100644 index 0000000..ce79338 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/mkmf.log @@ -0,0 +1,15 @@ +"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib -arch x86_64 -arch i386 -lruby.2.3.0 -lpthread -ldl -lobjc " +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return 0; +6: } +/* end */ + diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/rubyeventmachine.bundle b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/eventmachine-1.2.5/rubyeventmachine.bundle new file mode 100755 index 0000000000000000000000000000000000000000..46ee82fbccc90cca444635a080aa53615cefedeb GIT binary patch literal 461356 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%0D}SB1K|oR3TuJeH|AXK(4&TQ;?erhdIz_#<86C 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∓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 L4O=oP5{dkOw0F#Y literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/ffi_c.bundle b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/ffi_c.bundle new file mode 100755 index 0000000000000000000000000000000000000000..c6c4767c2277cb8a83cac90e733b39192f290e5f GIT binary patch literal 349780 zcmeFad3Y4X7B)Ts27(YKDA9;Sf`SBBq6`voBqIcRWTGgdxF9MnxPmaFAX_xag|=rH{1|cf}+$IR0ItON`CKqPETiudcWWE{r5eOd7epkpL6Qe zsZ&*_PMxZ*UcGzql0YEPDk~6ZhimIVAQw-Iw&1=aehO=~2C%=K?!j>R>+dfO{H1}v zH1L-O{?fo-8u&{Ce`(+^4g95nzclcd2L95(UmEy-Ndxcf{BAcU`B|9w2eR?/R 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�`Hp#7-}a{Z-d&P3(TsA&CTFg~rwsobF2 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

X{}o(@*XOjSqkM?*cH-ODxXI6~b}g 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 a_j1Sj`pJG17j@k?U*^-Ou{oWZn)+WG;($E> literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/gem.build_complete b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/gem.build_complete new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/gem_make.out b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/gem_make.out new file mode 100644 index 0000000..a410476 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/gem_make.out @@ -0,0 +1,260 @@ +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c +/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20180108-62297-gp7v1i.rb extconf.rb +/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/universal-darwin17/rbconfig.rb:214: warning: Insecure world writable dir /usr/local/apache-maven-2.2.1/bin in PATH, mode 040777 +checking for ffi.h... no +checking for ffi.h in /usr/local/include,/usr/include/ffi... no +checking for shlwapi.h... no +checking for rb_thread_blocking_region()... no +checking for rb_thread_call_with_gvl()... yes +checking for rb_thread_call_without_gvl()... yes +checking for ffi_prep_cif_var()... no +creating extconf.h +creating Makefile + +To see why this extension failed to compile, please check the mkmf.log which can be found here: + + /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/mkmf.log + +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c +make "DESTDIR=" clean + +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c +make "DESTDIR=" +mkdir -p "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-i386; (if [ ! -f "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-i386/Makefile ]; then echo "Configuring libffi for i386"; cd "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-i386 && env CC=" xcrun clang" CFLAGS="-arch i386 " LDFLAGS="-arch i386" "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi"/configure --disable-static --with-pic=yes --disable-dependency-tracking --host=i386-apple-darwin > /dev/null; fi); env MACOSX_DEPLOYMENT_TARGET=10.4 /Applications/Xcode.app/Contents/Developer/usr/bin/make -C "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-i386 +Configuring libffi for i386 +configure: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used +clang: error: unsupported option '-print-multi-os-directory' +clang: error: no input files +/Applications/Xcode.app/Contents/Developer/usr/bin/make "AR_FLAGS=" "CC_FOR_BUILD=" "CFLAGS=-arch i386 -Wall -fexceptions" "CXXFLAGS=" "CFLAGS_FOR_BUILD=" "CFLAGS_FOR_TARGET=" "INSTALL=/usr/bin/install -c" "INSTALL_DATA=/usr/bin/install -c -m 644" "INSTALL_PROGRAM=/usr/bin/install -c" "INSTALL_SCRIPT=/usr/bin/install -c" "JC1FLAGS=" "LDFLAGS=-arch i386" "LIBCFLAGS=" "LIBCFLAGS_FOR_TARGET=" "MAKE=/Applications/Xcode.app/Contents/Developer/usr/bin/make" "MAKEINFO=/bin/sh /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo " "PICFLAG=" "PICFLAG_FOR_TARGET=" "RUNTESTFLAGS=" "SHELL=/bin/sh" "exec_prefix=/usr/local" "infodir=/usr/local/share/info" "libdir=/usr/local/lib" "mandir=/usr/local/share/man" "prefix=/usr/local" "AR=ar" "AS=as" "CC=xcrun clang" "CXX=c++" "LD=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" "NM=nm" "RANLIB=ranlib" "DESTDIR=" all-recursive +Making all in include +make[3]: Nothing to be done for `all'. +Making all in testsuite +make[3]: Nothing to be done for `all'. +Making all in man +make[3]: Nothing to be done for `all'. +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c -o src/debug.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/debug.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/debug.c -fno-common -DPIC -o src/.libs/debug.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c -o src/prep_cif.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/prep_cif.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/prep_cif.c -fno-common -DPIC -o src/.libs/prep_cif.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c -o src/types.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/types.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/types.c -fno-common -DPIC -o src/.libs/types.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c -o src/raw_api.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c -fno-common -DPIC -o src/.libs/raw_api.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c -o src/java_raw_api.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/java_raw_api.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/java_raw_api.c -fno-common -DPIC -o src/.libs/java_raw_api.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c -o src/closures.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/closures.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/closures.c -fno-common -DPIC -o src/.libs/closures.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c -o src/x86/ffi.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c -fno-common -DPIC -o src/x86/.libs/ffi.o +/bin/sh ./libtool --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -arch i386 -c -o src/x86/darwin.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin.S +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -arch i386 -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin.S -fno-common -DPIC -o src/x86/.libs/darwin.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c -o src/x86/ffi64.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi64.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch i386 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi64.c -fno-common -DPIC -o src/x86/.libs/ffi64.o +/bin/sh ./libtool --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -arch i386 -c -o src/x86/darwin64.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin64.S +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -arch i386 -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin64.S -fno-common -DPIC -o src/x86/.libs/darwin64.o +/bin/sh ./libtool --tag=CC --mode=link xcrun clang -g -arch i386 -Wall -fexceptions -version-info `grep -v '^#' /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libtool-version` -arch i386 -o libffi.la -rpath /usr/local/lib src/debug.lo src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi.lo src/x86/darwin.lo src/x86/ffi64.lo src/x86/darwin64.lo +libtool: link: xcrun clang -dynamiclib -Wl,-flat_namespace -Wl,-undefined -Wl,suppress -o .libs/libffi.5.dylib src/.libs/debug.o src/.libs/prep_cif.o src/.libs/types.o src/.libs/raw_api.o src/.libs/java_raw_api.o src/.libs/closures.o src/x86/.libs/ffi.o src/x86/.libs/darwin.o src/x86/.libs/ffi64.o src/x86/.libs/darwin64.o -arch i386 -arch i386 -install_name /usr/local/lib/libffi.5.dylib -compatibility_version 6 -current_version 6.10 -Wl,-single_module +ld: warning: could not create compact unwind for .LFB3: non-standard register 5 being saved in prolog +libtool: link: (cd ".libs" && rm -f "libffi.dylib" && ln -s "libffi.5.dylib" "libffi.dylib") +libtool: link: ( cd ".libs" && rm -f "libffi.la" && ln -s "../libffi.la" "libffi.la" ) +/bin/sh ./libtool --tag=CC --mode=link xcrun clang -g -arch i386 -Wall -fexceptions -arch i386 -o libffi_convenience.la src/debug.lo src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi.lo src/x86/darwin.lo src/x86/ffi64.lo src/x86/darwin64.lo +libtool: link: ar cru .libs/libffi_convenience.a src/.libs/debug.o src/.libs/prep_cif.o src/.libs/types.o src/.libs/raw_api.o src/.libs/java_raw_api.o src/.libs/closures.o src/x86/.libs/ffi.o src/x86/.libs/darwin.o src/x86/.libs/ffi64.o src/x86/.libs/darwin64.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: .libs/libffi_convenience.a(ffi64.o) has no symbols +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: .libs/libffi_convenience.a(darwin64.o) has no symbols +libtool: link: ranlib .libs/libffi_convenience.a +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: .libs/libffi_convenience.a(ffi64.o) has no symbols +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: .libs/libffi_convenience.a(darwin64.o) has no symbols +libtool: link: ( cd ".libs" && rm -f "libffi_convenience.la" && ln -s "../libffi_convenience.la" "libffi_convenience.la" ) +mkdir -p "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-x86_64; (if [ ! -f "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-x86_64/Makefile ]; then echo "Configuring libffi for x86_64"; cd "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-x86_64 && env CC=" xcrun clang" CFLAGS="-arch x86_64 " LDFLAGS="-arch x86_64" "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi"/configure --disable-static --with-pic=yes --disable-dependency-tracking --host=x86_64-apple-darwin > /dev/null; fi); env MACOSX_DEPLOYMENT_TARGET=10.4 /Applications/Xcode.app/Contents/Developer/usr/bin/make -C "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-x86_64 +Configuring libffi for x86_64 +configure: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used +clang: error: unsupported option '-print-multi-os-directory' +clang: error: no input files +/Applications/Xcode.app/Contents/Developer/usr/bin/make "AR_FLAGS=" "CC_FOR_BUILD=" "CFLAGS=-arch x86_64 -Wall -fexceptions" "CXXFLAGS=" "CFLAGS_FOR_BUILD=" "CFLAGS_FOR_TARGET=" "INSTALL=/usr/bin/install -c" "INSTALL_DATA=/usr/bin/install -c -m 644" "INSTALL_PROGRAM=/usr/bin/install -c" "INSTALL_SCRIPT=/usr/bin/install -c" "JC1FLAGS=" "LDFLAGS=-arch x86_64" "LIBCFLAGS=" "LIBCFLAGS_FOR_TARGET=" "MAKE=/Applications/Xcode.app/Contents/Developer/usr/bin/make" "MAKEINFO=/bin/sh /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo " "PICFLAG=" "PICFLAG_FOR_TARGET=" "RUNTESTFLAGS=" "SHELL=/bin/sh" "exec_prefix=/usr/local" "infodir=/usr/local/share/info" "libdir=/usr/local/lib" "mandir=/usr/local/share/man" "prefix=/usr/local" "AR=ar" "AS=as" "CC=xcrun clang" "CXX=c++" "LD=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" "NM=nm" "RANLIB=ranlib" "DESTDIR=" all-recursive +Making all in include +make[3]: Nothing to be done for `all'. +Making all in testsuite +make[3]: Nothing to be done for `all'. +Making all in man +make[3]: Nothing to be done for `all'. +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c -o src/debug.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/debug.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/debug.c -fno-common -DPIC -o src/.libs/debug.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c -o src/prep_cif.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/prep_cif.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/prep_cif.c -fno-common -DPIC -o src/.libs/prep_cif.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c -o src/types.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/types.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/types.c -fno-common -DPIC -o src/.libs/types.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c -o src/raw_api.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c -fno-common -DPIC -o src/.libs/raw_api.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c -o src/java_raw_api.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/java_raw_api.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/java_raw_api.c -fno-common -DPIC -o src/.libs/java_raw_api.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c -o src/closures.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/closures.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/closures.c -fno-common -DPIC -o src/.libs/closures.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c -o src/x86/ffi.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c -fno-common -DPIC -o src/x86/.libs/ffi.o +/bin/sh ./libtool --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -arch x86_64 -c -o src/x86/darwin.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin.S +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -arch x86_64 -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin.S -fno-common -DPIC -o src/x86/.libs/darwin.o +/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c -o src/x86/ffi64.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi64.c +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -g -arch x86_64 -Wall -fexceptions -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi64.c -fno-common -DPIC -o src/x86/.libs/ffi64.o +/bin/sh ./libtool --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -arch x86_64 -c -o src/x86/darwin64.lo /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin64.S +libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -I. -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include -Iinclude -I/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src -arch x86_64 -c /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin64.S -fno-common -DPIC -o src/x86/.libs/darwin64.o +/bin/sh ./libtool --tag=CC --mode=link xcrun clang -g -arch x86_64 -Wall -fexceptions -version-info `grep -v '^#' /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libtool-version` -arch x86_64 -o libffi.la -rpath /usr/local/lib src/debug.lo src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi.lo src/x86/darwin.lo src/x86/ffi64.lo src/x86/darwin64.lo +libtool: link: xcrun clang -dynamiclib -Wl,-flat_namespace -Wl,-undefined -Wl,suppress -o .libs/libffi.5.dylib src/.libs/debug.o src/.libs/prep_cif.o src/.libs/types.o src/.libs/raw_api.o src/.libs/java_raw_api.o src/.libs/closures.o src/x86/.libs/ffi.o src/x86/.libs/darwin.o src/x86/.libs/ffi64.o src/x86/.libs/darwin64.o -arch x86_64 -arch x86_64 -install_name /usr/local/lib/libffi.5.dylib -compatibility_version 6 -current_version 6.10 -Wl,-single_module +ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame +libtool: link: (cd ".libs" && rm -f "libffi.dylib" && ln -s "libffi.5.dylib" "libffi.dylib") +libtool: link: ( cd ".libs" && rm -f "libffi.la" && ln -s "../libffi.la" "libffi.la" ) +/bin/sh ./libtool --tag=CC --mode=link xcrun clang -g -arch x86_64 -Wall -fexceptions -arch x86_64 -o libffi_convenience.la src/debug.lo src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi.lo src/x86/darwin.lo src/x86/ffi64.lo src/x86/darwin64.lo +libtool: link: ar cru .libs/libffi_convenience.a src/.libs/debug.o src/.libs/prep_cif.o src/.libs/types.o src/.libs/raw_api.o src/.libs/java_raw_api.o src/.libs/closures.o src/x86/.libs/ffi.o src/x86/.libs/darwin.o src/x86/.libs/ffi64.o src/x86/.libs/darwin64.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: .libs/libffi_convenience.a(ffi.o) has no symbols +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: .libs/libffi_convenience.a(darwin.o) has no symbols +libtool: link: ranlib .libs/libffi_convenience.a +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: .libs/libffi_convenience.a(ffi.o) has no symbols +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: .libs/libffi_convenience.a(darwin.o) has no symbols +libtool: link: ( cd ".libs" && rm -f "libffi_convenience.la" && ln -s "../libffi_convenience.la" "libffi_convenience.la" ) +# Assemble into a FAT (x86_64, i386, ppc) library +/usr/bin/libtool -static -o "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17"/.libs/libffi_convenience.a \ + "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-i386/.libs/libffi_convenience.a "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-x86_64/.libs/libffi_convenience.a +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: for architecture: i386 file: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi_convenience.a(ffi64.o) has no symbols +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: for architecture: i386 file: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi_convenience.a(darwin64.o) has no symbols +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: for architecture: x86_64 file: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi_convenience.a(ffi.o) has no symbols +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: for architecture: x86_64 file: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi_convenience.a(darwin.o) has no symbols +rm -f "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17"/include/ffi.h +compiling Thread.c +compiling Buffer.c +compiling DynamicLibrary.c +compiling Variadic.c +compiling ffi.c +compiling Pointer.c +compiling MemoryPointer.c +compiling Platform.c +compiling LongDouble.c +compiling Function.c +Function.c:563:9: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration] + rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w); + ^ +1 warning generated. +Function.c:563:9: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration] + rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w); + ^ +1 warning generated. +compiling MappedType.c +compiling Type.c +compiling Types.c +compiling StructLayout.c +compiling DataConverter.c +compiling ArrayType.c +compiling StructByReference.c +compiling LastError.c +compiling Struct.c +compiling Call.c +Call.c:355:5: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration] + rbffi_thread_blocking_region(call_blocking_function, data, (void *) -1, NULL); + ^ +./Thread.h:78:39: note: expanded from macro 'rbffi_thread_blocking_region' +# define rbffi_thread_blocking_region rb_thread_call_without_gvl + ^ +1 warning generated. +Call.c:355:5: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration] + rbffi_thread_blocking_region(call_blocking_function, data, (void *) -1, NULL); + ^ +./Thread.h:78:39: note: expanded from macro 'rbffi_thread_blocking_region' +# define rbffi_thread_blocking_region rb_thread_call_without_gvl + ^ +1 warning generated. +compiling MethodHandle.c +compiling AbstractMemory.c +compiling FunctionInfo.c +compiling ClosurePool.c +compiling StructByValue.c +linking shared-object ffi_c.bundle +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +ld: warning: could not create compact unwind for .LFB3: non-standard register 5 being saved in prolog + +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c +make "DESTDIR=" install +mkdir -p "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-i386; (if [ ! -f "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-i386/Makefile ]; then echo "Configuring libffi for i386"; cd "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-i386 && env CC=" xcrun clang" CFLAGS="-arch i386 " LDFLAGS="-arch i386" "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi"/configure --disable-static --with-pic=yes --disable-dependency-tracking --host=i386-apple-darwin > /dev/null; fi); env MACOSX_DEPLOYMENT_TARGET=10.4 /Applications/Xcode.app/Contents/Developer/usr/bin/make -C "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-i386 +/Applications/Xcode.app/Contents/Developer/usr/bin/make "AR_FLAGS=" "CC_FOR_BUILD=" "CFLAGS=-arch i386 -Wall -fexceptions" "CXXFLAGS=" "CFLAGS_FOR_BUILD=" "CFLAGS_FOR_TARGET=" "INSTALL=/usr/bin/install -c" "INSTALL_DATA=/usr/bin/install -c -m 644" "INSTALL_PROGRAM=/usr/bin/install -c" "INSTALL_SCRIPT=/usr/bin/install -c" "JC1FLAGS=" "LDFLAGS=-arch i386" "LIBCFLAGS=" "LIBCFLAGS_FOR_TARGET=" "MAKE=/Applications/Xcode.app/Contents/Developer/usr/bin/make" "MAKEINFO=/bin/sh /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo " "PICFLAG=" "PICFLAG_FOR_TARGET=" "RUNTESTFLAGS=" "SHELL=/bin/sh" "exec_prefix=/usr/local" "infodir=/usr/local/share/info" "libdir=/usr/local/lib" "mandir=/usr/local/share/man" "prefix=/usr/local" "AR=ar" "AS=as" "CC=xcrun clang" "CXX=c++" "LD=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" "NM=nm" "RANLIB=ranlib" "DESTDIR=" all-recursive +Making all in include +make[3]: Nothing to be done for `all'. +Making all in testsuite +make[3]: Nothing to be done for `all'. +Making all in man +make[3]: Nothing to be done for `all'. +make[3]: Nothing to be done for `all-am'. +mkdir -p "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-x86_64; (if [ ! -f "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-x86_64/Makefile ]; then echo "Configuring libffi for x86_64"; cd "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-x86_64 && env CC=" xcrun clang" CFLAGS="-arch x86_64 " LDFLAGS="-arch x86_64" "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi"/configure --disable-static --with-pic=yes --disable-dependency-tracking --host=x86_64-apple-darwin > /dev/null; fi); env MACOSX_DEPLOYMENT_TARGET=10.4 /Applications/Xcode.app/Contents/Developer/usr/bin/make -C "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-x86_64 +/Applications/Xcode.app/Contents/Developer/usr/bin/make "AR_FLAGS=" "CC_FOR_BUILD=" "CFLAGS=-arch x86_64 -Wall -fexceptions" "CXXFLAGS=" "CFLAGS_FOR_BUILD=" "CFLAGS_FOR_TARGET=" "INSTALL=/usr/bin/install -c" "INSTALL_DATA=/usr/bin/install -c -m 644" "INSTALL_PROGRAM=/usr/bin/install -c" "INSTALL_SCRIPT=/usr/bin/install -c" "JC1FLAGS=" "LDFLAGS=-arch x86_64" "LIBCFLAGS=" "LIBCFLAGS_FOR_TARGET=" "MAKE=/Applications/Xcode.app/Contents/Developer/usr/bin/make" "MAKEINFO=/bin/sh /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo " "PICFLAG=" "PICFLAG_FOR_TARGET=" "RUNTESTFLAGS=" "SHELL=/bin/sh" "exec_prefix=/usr/local" "infodir=/usr/local/share/info" "libdir=/usr/local/lib" "mandir=/usr/local/share/man" "prefix=/usr/local" "AR=ar" "AS=as" "CC=xcrun clang" "CXX=c++" "LD=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" "NM=nm" "RANLIB=ranlib" "DESTDIR=" all-recursive +Making all in include +make[3]: Nothing to be done for `all'. +Making all in testsuite +make[3]: Nothing to be done for `all'. +Making all in man +make[3]: Nothing to be done for `all'. +make[3]: Nothing to be done for `all-am'. +# Assemble into a FAT (x86_64, i386, ppc) library +/usr/bin/libtool -static -o "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17"/.libs/libffi_convenience.a \ + "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-i386/.libs/libffi_convenience.a "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c"/libffi-x86_64/.libs/libffi_convenience.a +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: for architecture: i386 file: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi_convenience.a(ffi64.o) has no symbols +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: for architecture: i386 file: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi_convenience.a(darwin64.o) has no symbols +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: for architecture: x86_64 file: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi_convenience.a(ffi.o) has no symbols +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: for architecture: x86_64 file: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi_convenience.a(darwin.o) has no symbols +rm -f "/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17"/include/ffi.h +compiling Thread.c +compiling Buffer.c +compiling DynamicLibrary.c +compiling Variadic.c +compiling ffi.c +compiling Pointer.c +compiling MemoryPointer.c +compiling Platform.c +compiling LongDouble.c +compiling Function.c +Function.c:563:9: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration] + rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w); + ^ +1 warning generated. +Function.c:563:9: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration] + rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w); + ^ +1 warning generated. +compiling MappedType.c +compiling Type.c +compiling Types.c +compiling StructLayout.c +compiling DataConverter.c +compiling ArrayType.c +compiling StructByReference.c +compiling LastError.c +compiling Struct.c +compiling Call.c +Call.c:355:5: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration] + rbffi_thread_blocking_region(call_blocking_function, data, (void *) -1, NULL); + ^ +./Thread.h:78:39: note: expanded from macro 'rbffi_thread_blocking_region' +# define rbffi_thread_blocking_region rb_thread_call_without_gvl + ^ +1 warning generated. +Call.c:355:5: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration] + rbffi_thread_blocking_region(call_blocking_function, data, (void *) -1, NULL); + ^ +./Thread.h:78:39: note: expanded from macro 'rbffi_thread_blocking_region' +# define rbffi_thread_blocking_region rb_thread_call_without_gvl + ^ +1 warning generated. +compiling MethodHandle.c +compiling AbstractMemory.c +compiling FunctionInfo.c +compiling ClosurePool.c +compiling StructByValue.c +linking shared-object ffi_c.bundle +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +ld: warning: could not create compact unwind for .LFB3: non-standard register 5 being saved in prolog +/usr/bin/install -c -m 0755 ffi_c.bundle ./.gem.20180108-62297-xzhdbb diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/mkmf.log b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/mkmf.log new file mode 100644 index 0000000..64ae00b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.18/mkmf.log @@ -0,0 +1,301 @@ +package configuration for libffi is not found +have_header: checking for ffi.h... -------------------- no + +"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib -arch x86_64 -arch i386 -lruby.2.3.0 -lpthread -ldl -lobjc " +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return 0; +6: } +/* end */ + +"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include -arch x86_64 -arch i386 -c conftest.c" +conftest.c:3:10: fatal error: 'ffi.h' file not found +#include + ^~~~~~~ +1 error generated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +find_header: checking for ffi.h in /usr/local/include,/usr/include/ffi... -------------------- no + +"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include -arch x86_64 -arch i386 -c conftest.c" +conftest.c:3:10: fatal error: 'ffi.h' file not found +#include + ^~~~~~~ +1 error generated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include -arch x86_64 -arch i386 -I/usr/local/include -c conftest.c" +conftest.c:3:10: fatal error: 'ffi.h' file not found +#include + ^~~~~~~ +1 error generated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include -arch x86_64 -arch i386 -I/usr/include/ffi -c conftest.c" +conftest.c:3:10: fatal error: 'ffi.h' file not found +#include + ^~~~~~~ +1 error generated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +have_header: checking for shlwapi.h... -------------------- no + +"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include -arch x86_64 -arch i386 -c conftest.c" +conftest.c:3:10: fatal error: 'shlwapi.h' file not found +#include + ^~~~~~~~~~~ +1 error generated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +have_func: checking for rb_thread_blocking_region()... -------------------- no + +"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib -arch x86_64 -arch i386 -lruby.2.3.0 -lpthread -ldl -lobjc " +conftest.c:13:57: error: use of undeclared identifier 'rb_thread_blocking_region' +int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_blocking_region; return !p; } + ^ +1 error generated. +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: printf("%p", &t); + 9: } +10: +11: return 0; +12: } +13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_blocking_region; return !p; } +/* end */ + +"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib -arch x86_64 -arch i386 -lruby.2.3.0 -lpthread -ldl -lobjc " +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +Undefined symbols for architecture x86_64: + "_rb_thread_blocking_region", referenced from: + _t in conftest-ed89f4.o +ld: symbol(s) not found for architecture x86_64 +clang: error: linker command failed with exit code 1 (use -v to see invocation) +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: printf("%p", &t); + 9: } +10: +11: return 0; +12: } +13: extern void rb_thread_blocking_region(); +14: int t(void) { rb_thread_blocking_region(); return 0; } +/* end */ + +-------------------- + +have_func: checking for rb_thread_call_with_gvl()... -------------------- yes + +"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib -arch x86_64 -arch i386 -lruby.2.3.0 -lpthread -ldl -lobjc " +conftest.c:13:57: error: use of undeclared identifier 'rb_thread_call_with_gvl' +int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_with_gvl; return !p; } + ^ +1 error generated. +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: printf("%p", &t); + 9: } +10: +11: return 0; +12: } +13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_with_gvl; return !p; } +/* end */ + +"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib -arch x86_64 -arch i386 -lruby.2.3.0 -lpthread -ldl -lobjc " +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: printf("%p", &t); + 9: } +10: +11: return 0; +12: } +13: extern void rb_thread_call_with_gvl(); +14: int t(void) { rb_thread_call_with_gvl(); return 0; } +/* end */ + +-------------------- + +have_func: checking for rb_thread_call_without_gvl()... -------------------- yes + +"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib -arch x86_64 -arch i386 -lruby.2.3.0 -lpthread -ldl -lobjc " +conftest.c:13:57: error: use of undeclared identifier 'rb_thread_call_without_gvl' +int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_without_gvl; return !p; } + ^ +1 error generated. +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: printf("%p", &t); + 9: } +10: +11: return 0; +12: } +13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_without_gvl; return !p; } +/* end */ + +"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib -arch x86_64 -arch i386 -lruby.2.3.0 -lpthread -ldl -lobjc " +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: printf("%p", &t); + 9: } +10: +11: return 0; +12: } +13: extern void rb_thread_call_without_gvl(); +14: int t(void) { rb_thread_call_without_gvl(); return 0; } +/* end */ + +-------------------- + +have_func: checking for ffi_prep_cif_var()... -------------------- no + +"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib -arch x86_64 -arch i386 -lruby.2.3.0 -lpthread -ldl -lobjc " +conftest.c:13:57: error: use of undeclared identifier 'ffi_prep_cif_var' +int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_cif_var; return !p; } + ^ +1 error generated. +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: printf("%p", &t); + 9: } +10: +11: return 0; +12: } +13: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_cif_var; return !p; } +/* end */ + +"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib -arch x86_64 -arch i386 -lruby.2.3.0 -lpthread -ldl -lobjc " +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +Undefined symbols for architecture x86_64: + "_ffi_prep_cif_var", referenced from: + _t in conftest-608c7c.o +ld: symbol(s) not found for architecture x86_64 +clang: error: linker command failed with exit code 1 (use -v to see invocation) +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: printf("%p", &t); + 9: } +10: +11: return 0; +12: } +13: extern void ffi_prep_cif_var(); +14: int t(void) { ffi_prep_cif_var(); return 0; } +/* end */ + +-------------------- + +extconf.h is: +/* begin */ +1: #ifndef EXTCONF_H +2: #define EXTCONF_H +3: #define HAVE_RB_THREAD_CALL_WITH_GVL 1 +4: #define HAVE_RB_THREAD_CALL_WITHOUT_GVL 1 +5: #define USE_INTERNAL_LIBFFI 1 +6: #define RUBY_1_9 1 +7: #endif +/* end */ + diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/http_parser.rb-0.6.0/gem.build_complete b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/http_parser.rb-0.6.0/gem.build_complete new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/http_parser.rb-0.6.0/gem_make.out b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/http_parser.rb-0.6.0/gem_make.out new file mode 100644 index 0000000..8447060 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/http_parser.rb-0.6.0/gem_make.out @@ -0,0 +1,21 @@ +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser +/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20180108-62297-15avpmh.rb extconf.rb +/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/universal-darwin17/rbconfig.rb:214: warning: Insecure world writable dir /usr/local/apache-maven-2.2.1/bin in PATH, mode 040777 +creating Makefile + +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser +make "DESTDIR=" clean + +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser +make "DESTDIR=" +compiling ryah_http_parser.c +compiling ruby_http_parser.c +linking shared-object ruby_http_parser.bundle +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib' +ld: warning: directory not found for option '-L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib' + +current directory: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser +make "DESTDIR=" install +/usr/bin/install -c -m 0755 ruby_http_parser.bundle ./.gem.20180108-62297-1o3nfht diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/http_parser.rb-0.6.0/ruby_http_parser.bundle b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-17/2.3.0/http_parser.rb-0.6.0/ruby_http_parser.bundle new file mode 100755 index 0000000000000000000000000000000000000000..36efa99f25006fd9008734e75b931fe330e7aed6 GIT binary patch literal 76260 zcmeFa34ByV_CI<%=_DOUxB(+XKxqXeVGChVmPFE$rK1T6Bmoqm386y*A&E&hiw@G# z-NL1fqN5HoZn%uUIKOcQ)L~OG5rp6xal_>&ps0PPQBlW`Md|ecI@Be$h z_kWLkQn%`yQ|DCGsj5?J-}~CRefuRz3e!na6#Q^Wii3Ce0z6{i1a3Qm$|-?^cj51X z1}v_YbvUiSt_c^su3epUO_%*YY^N7cPnp*)UI}tVJZ@3V^OsBLEB377Xph7 zrl59GRcWbPw`ys1rKQGJi+r75o+ggui6S%cRG*i!5Pw)K%d5MzM&;}-FHYnqkgfB` z8`e!;Wy!DQZ;24(6+8q7=a0&p)J`!E!5kiWyHGyCzh1A)N^B)v351sSOd+RD z6;TKd&R-WN4_Pcr>$-YbPyHndo6s1<7%We8mjIR8i5bpf$<3L4eP%|E;Fp$&C=-M) z;04JXCcOpAxPvuIfDV}tK}*(4Qd@sX zqV87!M}M8djfFo7aS{pH%b)o-l9Y8G+7RF)18|ILfCK z+lRT)8caC+(PnE69PzTM4iA&U;gSp2)!D48l5;DT)|S++OU|k-S!G>QUAwX_d9How zy76TioIKB3TUP-akvwtyq-1+tZE|JBQgXEv4Y=_W#xGk37zyBy(xWyINKZP2W~GyY zIeF6Kul*-{kkXy6dg+SN@upxdNxBlTSoxv@(7K={a z)hWBKh=(av?9F-g`k4Cc(XjU?Jq&xf*1R{eFdw>`pjA$?` zdE0X8Gh+OpZqHM`%2hI3e5)uG-*RW0&9=bVW|!T?FqEc4*F=NFKt% zWVZ()&<4h(?+#PPflLu)bu>jRl-)x(X5c`zzo6;Vej*g5>JiG6_m6jUPF-_}$&;=3 zH=2}eeVQ&^C&^CdMUaN9nB-k==9Iqbn^I;v93}OCuD@@LqrH#penDob>8^h6YTqS} zcBAZi6c|T)wCs97kj6bXPWkxUYmSaIdDC^ssl4l`xqiyeFgoVa_y^3oAN-%E_K{t` z!C;UYE4ys)O^#9Fspg!+*#>iXy7jA0J9<)JrWx;Bx>%nbu{?f;GBc8FgB0P=u z@f2-1i)JfRFD0b_y=G8`qMG+f7yxMeGRsfACU4w}LQ@^Se8!tS81Xh|>r!>H>v5oS zJ((@)cSr;!%@*E(Xv*6CjWJ^>CeMibVW`IJT)#uIO*MNmo6R1x0jv0n3?m#dVc0&C$y6(cv)TM2b4&H0OxHK^ z<_(l7<%`TMqcW5ejoz>ZqwIdfAW026+5I=n(sMl72D7uxFS|0(M$GO;*}W72B<|fb z6bp$)+2zEl!qj>&d`ExTwGQDOdbJiFvfYUIIdaA!TjbUz zz3l1>U7?M*WojEjKRM0~21$15C<9=arp_RS)+j{pgvL18ErXMl;yvh?;>{4X7mMbB z+H35py~Lo}YdlZwMF!X2a^!^7UZZ*dnpBz`O)XS~&Lx-to8;a3@wy}RF^atVNWII@ z;-}W6WXF$eLnzIQ>5#nfPOz!BB3IP-Hvpi)!K`cYpQLyZYD_GIqDNi}-FFMzDD^GEIXCFh z24AO2VR}D-5VBHn4Lo_jUdLPIV_?crvJE6`vU)!;ve@q+HdT%5b+mUhtBIT~rau}A z8uQmsWR7RP!K}2Hn@;G>x@PmV7J1`uA&tvbgk1GnDkqdUoqWif2w$B-S#|u9DZ8Sv z3`Ph=YA5Y(i5l^9jLx(<$~QAu(@O;>o+E_ec@v#V{Rx>S?YIRo zQay;79AWANCQ5ylFwjkYCyjo2*n>she|#1Kfrtg zwIO^<{B+svLu}Vk+5H84l6R5%9?GAZEW5W5D=>-b5n!lTZR zSGXQS9#}VAiU2WBWJ-md+=DKRnpW+kSak8RLV60UW>{*R>}sU!50G6=K}Z|mom-M?U2KpC5^{)iA6&+E_~$apHGfz~KyJU1W=06`M+p|#hYW-Zr|1LJFyN=Q$gUqT(5E}jVMv&U3P^vo1_LN{k7CM(m|I+rFuF$uJc?ovQL=-gr12snO zt5^Wm=Lu19$)dq513~>O6p5x7n1Q+I(v&(9jR3=>X|qhF8K+LB>59B-K4v5xG(4h( zL&cbW)K77c5eUpVp&$dF+Js5!IU2UX&+U@zK1@x^xqeUA^dKQc zBmb{0js1C7KX>(vJ-35Oh~-Ye3YgwCS60i@2b8OV67p$bAKrl{4x?$CiAD6K6) z{Qxa52>I#;+5I_Cq9sp2{$K}w^82a#iD{?oO2z1hsb`d$Ov4~)h^f?eF&lG&i+mRq z+1+ZJECj|;fk)A7w&zSXJh-q6k!@Dk26Z_>El8-LKM$Dnl}6R}!H;~> zlu7^_nlRvpBRhOW*3PSVpn+Co4?-mGMK7UWK|SHJ`#I`iCfQX3T57TEswRJ~>~0i{ zG3rvvNY~W4YDc&&EQQaV=LnLs!-n-1)avZ0lHHR;8T4uj(YIuWpQGsEu&A2`fhO;2 zMjsfEBuUfbQ!v#4DmB_RQ4Q}NJ5JuDVhYG(f0rm?e?YTBS$2QGD={oueS<<>iS&~< zJsV&8@h7AL#Q1zTTrad);Tc~eG!?Kc`* z3b94X?i9fmqmlumI=qc$gQ(S={cT}8_3p+UI$N01%sbbs8&HR`>u+FIBVjDr2suGg zeN;s-5?{dYGSU~Jo#lA)4d(iI#ay3J(1MAF>|B9vr?z!hB=WeulN8wkwGW~^#!Qsm z^*~V`>miji5~n&T)TKz&Rz-l#J4&$4BerPSJx{RpS980wMaY{b2H0NI*oG0CUUm-? zYy;Gbc}SP6_C<)z$(DJc8o&cjaV7fl>( zx}WUY`kmj85R!Wu5ghGk&f5idg8BeL%y`kfKvTTzUTx@Zz}z#DW3@)GNxti$qk%eK z26R;IUN={cF z7N|(|L7=cYx_$z!p7lC+Bi3XX{Pv(4kOf+qA%o$}#Ef^g)nS>|Am82jjoO~t^B!2o+6xgP7D9OutE=P`fE5w_nU-`}Kb zLKIp(BZ98k*%oH@EZQbJn<*W(dxpJ)X4(BAD_g5=LXKxPA5Lo|xlh?9ftig6qw|tZFlKC#b?5IkC}a!%-IO@npP38^RL!yiR|beXiM)g+Uu5%Wr`~!Tgvn%dR`RghWvTRP9}eX!Rj#S3HS+>fK$y zV09w^By1p_7tnts^_nimzP>WSmEgNcgkpVjMJUE+7NJ4DYecAzZ?Xu*`$m%qodMH` z`Ft8*3fZpSq4!M^F)sEQM2KdUgDBjv!EQiqh7z2YgbMpn{p;WTer@_jbC+YJT()tR zPHM0X5-K2e)+$)>8#b`Qj9fn>d(a`N9e`7kHHOXML$eu7^i2DcP4(H@gIr&@W#r7d`0&$q2 z@>86=hm#Kyc_?xJg_AdN^6xqMk3>EZ2J+pUT+Ye2aPl2Qo=My_oSehS3pu%k$k$>n z;hn?Dqd7U1lg&gPOIe%9$$dHbQcg}H@-iY{#L1^w@u!?)UThyCKTPC*U;`NCev^}r zbFvTKzCTmi?{o5BIJuFN-yrf+MBc^8cXRS%oIH_)?;-Nyk8<)_PTs=F z4-olTY7P!gzJZfha`GA?FDC91kmX@gK8$nh*M9#p_%65?;As3f4%dVsn8up{7=}i` zy$d)K{#&ZwUk3k6zmg z&?CKvyncTI=&yX`_wPY?7Vs+Q?*Wbn?*Z`q4A+b}BN6{@(Blv<3$%HFPZ1u@1>7UR z{T^FCk7G&vYi0M5Xi4(q-k#c|_H&-p`QrCW>5`P8ob@imZH$y7 z81?UO!nDG@4$a4T;2USBjK!3WT5yCLD06AdHomPd?|KXSwb58h?12H49I5>!tRxWA z9GeVbtGqz?D{=IB&Vrm4^#*t zedLX9PMvPsU~=#xA#P+{rLVe2inTX!X7JU{VZnDD?P0Z9Cg-`Cwvl*FmtCKeIOn-! z`xy025tLmAcxa|QiUtYE7Z1&~>_OkAeD$e~*aJ;S3r&j`9l#b8)zzXak#ABx)s_8A z#5zwskto!Y?~q_hB&I7grXA;JB04eMBba_18N`IWBpjR~`@^xR#zQk@S1Cg34S28| zsYMim9hKDU5Q4c(Vn%fe)fXmHqXF%E5(V=91$EnqzW5WI5qm15;AX(x3+IIU67EH~ zK@cOsO@MPDE;%d0e}F47gHIvGCVXG8PmDCard4!tdG zN0_^n_6(G!&G|aV@jpqBok`WlE<#^~Yy-C;u}nBFv)k(UX16GFJ>?1#^~dFF@#DP)7tHQGnDo+lRx9m zNZ;5D<%coF&B|Li=PY_&k3E!(=Oc9z+gN}1bL?tQ9ufTkXp={nl((_e%$fF?ywQes z;avZoWHUM&z0S4>mT2vK#MX~+wnf^8`L5^r$N-&%5UKX+lq05A{Rq8nJR)X{h%tNC zH=A{bQ(E_7g(7*Mh8<&Z&1qk>O}sI|8H_bA!k8|>qMU+oaToi94+F+37`5D7DU)}IJv>mKE$SX9kIuu zQ4X=ANFy9*tJ#CJ##h6d&XhK20Hs+6XrIA=(tL~aaB4w?1!kqw^W0`q)A!i!N@*-p zX2rwB!3{7Uo;3lnB{?zTKVV$s{Z!-_1dtc@Ovv(H{6nLNEfd$?td0?&gK^AzyfdqMCszR8qbj@zREpm}M z23VdE)4W2n$C8j+KjlLhtCZGUjHwS3k21^XUCaZC9DN6eCLp5=u>3aIE;W0m{09uJ zw+IwEsA3e)l-~m9O8_vHqQTIUPJD5QeLE;AM^hTTr?Ddp6EY)W4KVgtXlV%zo_kSM zex;e2e^NJD8nb7u(M$In$vTNTK#t8GQB0&T6#Q!`5wmjEtbE{YL2R?)bWpMp-WM5f zkP?C~EWr$X2s4oDsZPl8*il9240dcBEo#Z}{Ehf?6#Lp2NOX?!FoQko6TQq&bK<42BXQDUCQx)z4)4h+sIt=@c=nWnsH=j^|EnFcr7Zhy;5 zM}}tQc&_r5S$V~`G6!?jgno7WN(~5<3wQ*&X-mL!eDg}$M-R^ ztDMu~W!GYaaJ9vG0_RLLBVpliY$}O4#5KTaiM{5f%QCs>^1i7^?A!<>HU!!I5OV`$ zcRLZ4ug%IK?;r$y@vy}&fwYh87zo}~lyT&Sa!e}ojs>D2$~L4yXJ4!|IZuW=+rw-{ z$YQ*GESvTCvdvFpUg@`uH+u}ulf!U3A<90OwL>Nsn2TWa>rCARV-oN7jD#+4Q0LLs%L9imp z(hLHHS(=UDU|EP|S?H$2o?0uy(&H?~ch*t&Z$%!wblt|R9LP{!*i2bc7AC;FH^W%M zq)&x2n_i>_nyZv9K&dm7bKYZENOd0=K%4-sdpTG4L81O)ANHd$+T7GZdzdg_pV0_Q zcO})waI8ma*&l`!7OBN(iv*^$E>d$um|f6Vq)rzg>u|!f)4j~1LbLL2j?!vU{QDsc z`9JQ>L?G8wYD9m*nH-R<2cm2Vtp{}WE0kl-6J$5+Xuc7zBfGu=^VtKe^Im4IpJniw zfd5az!?t(E+c5-093(J_nucvChBW(!z&Qwav7pPu1{MvMNj23RfV9GZv|*5j-f{@@U(yfj z07Zpp`l!nNG}of-*V&-vc%pDI!!GAI563lm`@u-Sj{6LGp5<|Qo(&01MKlCn!Qw8) zeT+|Rw@{mb44RcXhA|bw1m!9xz31M;j<#~haqA#y?PYn>zOtFjXJ;)TZQ1)ERL=BP zh`E|?B$_e?&RI*$&J$;0mvlMK&-{71vw2DX$W_keDxZ4?BE>xAAJ^AsjL-!avI?UJ zSJ`w-u~5j9n4_6JX{#wG^;1?bB#xLVKZihK<)4SLw_>Kk%Hu6&9GHus=fvbHHB)ny zGi->34&{LOPtfBae&hLN^be7d9wg&+3=g7KxeU5WbDn&>i6edJAdnApkc>?M8HHR% z2O^(Gh7uy9AV|infDD<-*d=7J*%sGD4&%QSdGOmV^*)U)j+7&)4%ThVSoNC&HUY}{ z0T!PZY(HkRP>!{yz&3P#SZoM9VjGy!=)jzDFH*-*g&Ct4oA5zWLqL*^OB&Ks5?vS7 zBwa1$=Zkwg+9@&{OPbO#HP9 zHbN|J-lWHsMK{}`m`v<#fJd8-Lgu{znKaXc%!r;cw*|>eY?Z=oF~LIQU26w=i@#^n z2%(aX7(>KW0oh?(_S3+JsDaKJwEPZ5UgN2UP+lcnkGy_GD+6ABOz5cmJ>{K_?2^~l z?7?-eKm+)X0DB#0AKa6jHqy215PM=5dwGC;GH3q;aYIT|6~aEDi#;j8{u3r^$oxY+ z*^@)qYr5F~4)e;(zKgRj66~~kP=17wHBY_Q_2eEe+P>k2ZKBu1WNt~ ztn|%F#Bu74^;6rkoSWsd3W$Q>xigC^bvA`qW&jEMWT||&7;oaQ9oqeCZZrH>OB+{rbP1I z$fHi;QQzZH#|1^bg`%QiOWtH2HI7H!%cHVKY|c|QuLI9LRv9R}Tdkbx1CILnJcECYxIwSyD40Lw$fat~)Qa+Z67SiZzubwAp* zFG)Pkdu#b@^EbZbK!I)24vd%1~=V_hw!N=HYc+^d{5f%Ir&*mP69Vd^#EsG z&uNcy+G0+-h0{tn?QTxHlhbIij3hHT&B1A(aN4z;mc(h*oHh{ibEJ1Ar^RyGVosaQ zX?-~Dd+Mq6Q)YA8U7YqU+7!}zpVO}4v{yLoD5ve^wDFwwC8zD;w1+uuFsB)?NI+ix zz-hO0T3=2Z!)dp1nw8UZoHiRYu2KspXL0gRn1Vy&Pcv3-@zpfM*y%GO0DH!>=Ro#MV9&wqIg~vwV^1S{UcsIt*z-#EOk~f|>^YV_$Ft`I z_MFI`H1hdJUd5hM*^~BR{3CHJfSuV(e?gZw75Ybh1AlAzM3h0r0h_-(i$b4LsFXrS zDYS+{%@nGq(0&R%O`+#0bcjNKqR=S{ZKu#L6ncO{15wrLofMizp^X&ErO;Xm(M4Rf zibB)`)nydAn?g5I=m`oHQ0Q+I%A!y+g;FW>F@+{l$VZ_>3hB_h)XOMDcahY13XP&r z9}3N+5SOY(LNpCkKc~=@6gozsYKr$3LbdBk$}QzKTaBfrq_)ml zYq74imfCGrDU>k2R5BM86<7*Pa|<))S~BO(ot>Y^d6JB2X-0EFrX~M+3BLiavXFQXR>*lU*8mMpVM6O310 zX}qGiYGqaRnkr+t6}VcwC85M-y+Y6m%d72`%c@4%jLWSy#Hh87zd|Z4w^yySE|XST ztu^CHDl1l7rP9jkI;+I9Iqn*f0SnK7@$xhyOR0Bqac*w@>}*S(X+c0nRV}hZ1x^W| z$|_5i*BP%gW?5#Li)Z7f-~mcVg5a7U3Sh4)FR5BqXC#l7hu8v(}Z?R@AWi4{brbg;|hQ>2g%A zb!`nAN|yr86Wxxw<88rY!%xQ{wraW2R&A^)0R>NLu*QliBg?6#$c)U~%%V&wJF`eK zXPPpkg8afFsi3$>nw39$cIK=iDZij7Cx3RKR5aH#D-+m)8>HO)S=UQ>*U!q&mGbiE zWl9Be^9!@C8JHIF=>jtT?_}ao*b91iEgoLgzmswCu9IPCq7E5V)Nv(8wMO|G@NvSol zv^+@?y{gV$T584H3kaNbtz{L$CCjarrPk#YRg$gTYOJp6jx?5*R8}r6DP3tSE2%&$ z(>O`_B0hq>#R_hTTJ&JtKjC9-G=z`gex0ulF9umvQ)z|q5n1GEcHw*Dr-rWaP`I~v zn%+Xw3B{k6KWFwlQ*KU%B{M(EQdnd{6Qe#-vdUYMCmp#;an2sjT~H)SBwr5UQ!j9N?`f!6*~VJEu5v?hUBCxjD151F>$lTWi_1oMzZkd z<%Xp!G6g9C38L<+Z0FNh4)Qy9wkcQi4;t6)81ie;M1wj;1)-`+D!IXCC8jEYWu{6f zwHa5TQ5j3>VBBdO3ASJbrebsiF}xZp>i9^&n-)qrJAeLciS|+7R96EnTLqX&hQiNHgtxi83Um$^xPGG)+oPWwSC1o0ZMfCVDgZ)Iqa3 zY~r!1WCcpggB4YQAU7f0>R_CJ)v4t=WAh2215K`ly*a37z4gGPaa~+aljVQZ#KNXUWo1G@0e)6)RR&uBxi8xw#fE;#$3C?YdhK zVXD3GyYD6t0e|FU<%suxKpF5Zm%?=KEQrwc z@2l6*d+y9YlGEN0TNx zg)JN*>1swu(#{c5cocftJ)@-X+(bz_oG9r_lO)}?BuRho7%A-Wv3SQ-vJ__5GR9^9 zw?6xsxcCI&Um^VXbdJAF_=&=wDEw66X9>SR_%{lFneeNGzgGAgg@32;9}xa_;r~ha z&kKLQ@SBByRQR6?|10625q^j8^`abOg)fOeLk17X!oNuP3Btcr_?HVmN%$$kzgqaI z!pBmK{bdV3SNO%kw+O#X_^X7!R`|CIf0OXH3jcS)e@yt#2>&_Zi{eP{3;0vvpAvq% z@Gr~cF_VO!A^Zix|Bdjs3jcZGzajj82w!`d+EChY!rx@!-z5B6;omR(r-lEa@V^oM z$ZXC(P579yvcD4H-y-~a;Xfw)ox*=f_-_gS6XBm0e!KAdP$$LTAmL9Cex~qm6#h!# z-zxljg#Rbu9}@ma;m71~xx(Y+U0z=R=_#=0vwQz*O&ACt*ay0G6eAn>}9L@4ydg`JZkpD(2=TB*en^#VxhADru{9b2-DUDydsp3$cW$ z0j8|h%ED{84)C^Z3wEb#*Ad;J>q1sp*C1~7DoaT%c7Q?L97L?K*Oe1)tH70(TT543 z*w!_$+XR+&S}k}@Hgsg6&2-|}uF5x9zF6Y=JM!nA1^cIYvYP>wKO0~M<+xV%7^ z%>q+fQh^h1Ahv1xRNpC5o77JAep+p`Ux}z-g^#+Q%BLq)-=@qO> z_Am-wu5MYoid7cNW@8vy5_oMm>;OM@`z+WCjO=ktFXge#dZ|JjSNx)b@}=j)=31o( z^f@?3u+V$kgYTF~xXc@_-7~?(j|!Xgg07}SI*D(0{5$|#g!~}JLiafMiGftF!(r;Z zIvnWW&Vtm4h~7EaisZ-ORaWb=It#8YNIP{@=ag${7vlV3E_NS3rpGsP5u4q0_)r&o zN8wY%+F6JQzCuL6eFAoz@S~1y9<+h>R1s)TE&y#lKPj?EcZH#J;Ziuu_aDRPqK5RR zFxKV%8isr=0LP9S@MyRZA2`sCLZlDF=h0Vf+;TbXee!=C9%5 z(%u^(;lqVU*di(6T}R;3AHl({h)55Hv(qGe6d+tWy%5o#xd{(v2_E%J@o2_HCj+Zb z>F4k|>2-b3q0WzbP5*8BE;U)3;VIbr6$H`cQARS)^a|&^pfikn*>BI#K3lJ8wpY zOG+6c-$#$T%E3X6>h}>nPH?2V(3S#9ZWIxM^!0HBQ}po&P0{a11QdNL0>W1yg`@O% zU?mPLMzC`vS5&z49bxE}lypxdI}Vh5P>ObN^;qO8=_zD+?0h~(#1%^*Hm1<9TCc)J>p|Ez&TraRW;zKSHX@>?X;NrXDdA883Xaa2IqcQe@9 z>9MC4kF)gnz7CJmHX65o9?&xNp~#8p7iCPJaV|W=yte-%x{FO8=(p%z(B1lwPL7fL zcIX^o8TgxX-OBkzHx04@vHN$)q#MT3W#fE$m8_8pu~&_@KpL>~c%a{%^7@N7JSVd8&dB&S~-#rZXO zBw!aO1^7wcP&#P9pC&IDCV5_zi~b%K@-&#@6aPda;!oobhKYZ05~u%7@N2NfpU%kv z{$QB+ZxsCWvuM(X25bCuwVM72o{dK^O#G_^|7U_ykFUxWWu{*MKJwcyv_ zf0h5Tt9beE7W^8l@e6Yv&|ff2<*yd}PYQkw*7&dE;sgA_F!Apd{JR9d25bB)L->PX z;vaD}kMO$S*I(!O@W%p97w{JXHVfD%-~s{D zFPTWb_6^Ty0WT5siv(OQ;3NUp2>5CNuNAOKzzzXlC*aKjzEQwi1-w$g+XPH6hM@dx z7w{_rZV>Qy0^T9uq5XLLJp#@VaHD`%3%FUpPYAe0z%2qkCg5KLd_urfKg;ML{zhZq z>jzj{KTRh%Xg++c2Ip~x91Wh$;Ts9Yn5NB#R|r^}53eUUsQxz*41FYu{QN<{69i0O zu_5|Y0XGOZUBEj9Y!)!RqJ`oY2>5LQFA(sD0$w8ElL9Um@L2)Z2sk2+%Udg8S-=hf zCkS}6fD;A0Rlw5(yiLHR0^Tm*tpaWk@Jj;TA>h9Yc#nVwVPZ|?YZP#XfSUz;vw&L! z{D^>$37EbbMEoZNOw&{u^{w?^{PdQ=+WdZ;fVK68Nx<6rp;*A${0+NEj9;4%t`o2} zKT!m%*}EqMtl8h^1gwo`hXkyRFCPn78?U|*ur_{%p)6D$Z9a9efVJ^`w1Bno;u-;K z_K$v)NBo*ST_Ip?esY_DwfW8?0`4c~BlOl};@9RQp9okR-@X&DHeaL*k`!MXKj=O2 z1Z(pN`q>`A+Wa-Ad&tnEMiR>0bR!jl5l_BUP>u(qCfRlwSM z=>q|4>z}U$tgT;u7O=Ly>xX?7%D=Y07%pIK{YF1}Cc3u&lPO?rzv3nVYwLgd1Q5m7 z*7I8d14OF)@5vDO*${Yt2u!~Q2S5J#-_a15J{lHG|0x8Hz&IC7?;ipW4S`38z*mL9 z*M`7zLf|DKussC!gusu7z|V)kheF`bL*O$ZFt%X3m6yKq6N7a5SI7U-~Hc zG#5*TqxW&9z)ggk1UDHj6^_39^FNVCqhvY%X^w>-{AdRx>?9-v$IePZaO~hj;KUh0 zHz;u8pkcKW3k~jh7SNqiCk0^Ix#vGD>5k&N^WAZ50ozXqUT+4+Cy6$%dX+Y>y@?oO~^;N}E_ z#Jvd?7Plr?xa-aY1G_F25J+vR+ie1d>~W1C2wNI-e;^1gE)E1^_>F-eOpmJqMC-c3 z!65Ad2Lamk0Sb4&H$a%K3j*^Yfj^~La?gp@+xD>#`{5Aju`85C*>N@`?P&@e7 z!kS3JQzf#a{vaY4*cm@Rfe#$+2Tt{STscWD#*Z%RlJRDOTI-tRg4$}j*HJglG%?wP zOB`z^j$dA3E4MElUs0WGsjDqbUX9;ASJx&l#r=&+Yciel(>L44Pe@*FT~(LNx;Jac zwc~4-j+-$4Dp0IzZ7d@1s+^j9zPC;MPvs@FD~_-Jwf-FFr~JqJ$)=i`$_iZ0zzvhji48wNg`V4eOs;0xajOUMSZ2`JkvxAhg%o*6tJK7YBQsMHVe|?@flRm0Mj+(u+asSUmwH%pJ;`J>+0}Ij^x~m zrL`DQlCx^@B9S%KwJYnA=Ry(V@mqNgC(q+=6sRN1(5>xK-Hqesf>{oFP*V;RFJu7b z^PnKLbd9@Q&wN_ZW8TQG!2CP&5+M#PjbBaCW;y4X_yq=bjR!Njpe&wu{`Jo$Z|9rv zX|sRhg}4;6tdsLTMET*;Vp&ySMZFZXDt;~&5;=#d}FGYg%-w87-f2Q0_G670Ei2j z|9Z^vDHH#l$dmt_$XES4k*EF}kta_0cOw5g1)TWr6ma6dQ^1KRV2w6;7vtFf{c+B6 zp*07$`wOkPn>PMiTQlE9{eS=St&VTb;c6T1L-KbR;8;vrfW198d~BIXEqGWgMVSl4 zISEkwub|5(ey~WmvdI1{78}+p0)Q9FZ^qrOn{jSVeqck9qU$9GdGu$o;41ji>PoD- z>`NKkJrDbEko_0n$)|j3e})JygYp6yV8*Pk5-SG=cb8F~&i4(;@0JfC11yk1%R`Jr z1mG{UEDx9@DGKL!t{eHmX$K17{1_CQQU!TF`S#QB;ee62lDozkDhQiXcp)lq{>;^*TZOA)~z zoHo?~eVdB@ESAcWUz0Hwyrd!WgJn=&5=j95dg`%zIktnB_J+w1mchCC)570!6F`NQ z<@6l>{tohcm$4MTi|P6cm0_4GNlOGdSO)1|`=c;jov>JPbLi!VIa>c(0^|fZ_@|Q4 zwh#>FyF!v2L?(JXymRGU537c}tyH4PNw6AAO@ zIZu!EQppy2@(f!{gHl=>HrViX^%b5 z`O4|Tna7CF*&**CU%vK`lKGyaeFBFv0G)8OkMDv$t=C_pWWG_KagATeZ1$`-s6${q zw&d&7i{LxfpTbAvD`3hT?f9tE5(Mzg@d4`H41+JoTUY=ec=`gF*cq0JugC8Oiau3u zz{Ml*sk+NkX@%SMN%Id%xID?9Wivi>3D|uCgU0H8;@rn zUm~9IzANyI^bN%`+&2(U*%ycB#lAjxM)~x3_M?x&w`LE*2dV3E=fsm4<1x@DzJC}1 zZJdso?|;X6FwWgb-=vPh2d$9{eA`-fy$iDXI0gXan7$>okL-K~1#uo|Q7ne0&S8or zM%{@Rsim^}uPD!!f#l^z68IW>WRJtU(5wXs97X={i$*GX;8PFv~ZDc6cG3Zyc5z= zV`TTO@PUursaO94Ll1(3Sn>5cb?O5^I66(T`ye9WJD9Tj1s*$YXPCMUL}#1Lc9pZu zF1tTxRT5@U-^CDyQpxIT2sk9T=hdD?UZ0T>j3Bt^ecO)qXxTNA#~8PB9AYT=@7(<6xi=lZq{*9xpiuIzpFHbN zd!FANITVA)IsaFlJTH^2ye_+b#+c#gjFnwKQeafLqtm>Xe#xrj$KWfGvU?@MsETmj zS}X~H)ej6XVR9^(AC)4X}Lw1!{Y&SSNVr@mv4kL@P0~H7U;lyuSs=kJTBW`_q ztFvvOa(qp{ebG|7BtP+ryfF4N7dF;)~an+1GIo5j%sDYe@QlR2d>I9A~BIJi0 zIZ_=GgnWe~uT&#BGMQpN!;y*V_pmXZ%u}gUM%P=Iho{CewT?qkAb+g-E+Qz$@p)1h zvpuZ)dHb*!FF=G)h$r9BHy>ZR^I@3!lteMLkAQHn>e!N3mqlpy}Iv*)a;LfHhI1Y#ZQg zi?zi%+sv}N4T?ZEBUr+&AMs9obum(hYMB=4LmD7Qsqd44ex=3HLCSGH12lv%g+g6XitD|0vTIJXCK*>j(R3j;HIDHpqJ?;N?a{d0IR2v znsVH^L61f~1kD{aO0}4W50Z@q2%EkICLOc%R5bDDpnZ9NBedSsHVo=VI+NA=(B75f ztR>KA2ACnE7KS{_u1C?GNXDH^hNB%qp2af6GvA<`^K6Jw)}NA}{7|p7;0v_!{*RQ8 zn%alyj`eS!)}p*Nr1+G)@ms2It%sc?;4D&y6;lTzSof`(e zw=X#>-+N%U&UjqT{NCl4Gg~mCv)ny|c9i1JRu1SomA9QAN=W>0CYxdaJMFk|$* z0a^pgiP9p1?{ z0N|a>wFW`;9#+TR)J&?lbI?d?5%hx(L;}AhYQ)bNiKC#(NHqtswKn<<%Eyo?B#l`F zx~C14L8Tvi{Kz&0(&%;{6>sCM zU{(KwOdzYw_{_nyNWB<{fTrk!XiQVeE3)f)0Ns1`sTiaF(NuiJdowHKK;$`G=X~WQ zXU70}lZ^zS!@2Ic3mXHvX8#Gy1R~Tne6mFAv8)G;R=-0-=W3yRIgdh7C_xTiH9kcxHEzxhQy+sYp)GeN64)}V z^#Bar)ewcWrtZMxHr*aYHViCV@&`4Zh{7j-4fyc%AR5BcQB?Xo=p}4Y+QN!%i^0d= zWcP6B&mlYbfMKLMu%A(%=2eO+d^?qlpHq)Cc_Sq&ouu}ovIRH&FG#t8rawmg1~y07 zs1JC9^N5=^ZJw0`g)AoPR#;IW7gc13)MBJ!CPC4^YC zE4hQFm|_koyJ+#oZDu>h!>0f_+FAX({>;MDW%o2*f@D52vaiFefZAe=%rcKt|B8+t zXkoJRZd932lrSOq!d@dYeey;p8HH86Qkkic-H)I}IM<(mN?L4_SiQ!eUXwhT7$r~i zGX2qu>Ca$f4W&7pc>+3@)Q5ib`!U-HbG8kjI@?5-ryZ{unI*ja94!T43DG%GYaPs7 zg-Po72smWDNGAC-A&Q%`RJFdbP4#1;Ry8>7J;e(YhCw^K}5>AYaz(Y0tA+&va1qb z5X90nN?n2g5+5f_t?eSU1N^`Ujm9vIeyU9-vCid-f=_$VX1LJiK2*-(%uksrKZfeC z-gS478aneSQ|{O^em`62>k)t=`l?R_zMKNpTvUOWkuSlD`odptSZ9#siVM(<}SPFEQR%j zH!%8$PV*wGJ6)Q3jvL}s^(O=zoduYYBY7-`SrMN`7$q}cMZ6q~5tNpplku6p)Nt87 z3O+5NT~ClII*Vo3b{4=cMm6V*QSSvNXk@6`5pD}hVMD_mND&k)vt`%kkmPKulHF@C zb;Sx>ua<+lB|n_m0<2Z#O^ZOm4vzAp$9{UcYv9&tu+yK(?ku3O2DV+LUe%2wPTn-8 zJI8~9Bc5@{vO59{NGn?X8QSPdtDn4yJ`*35)}ICE$4mzp-Ct+w3+to4(v7pfylHoL z&KCsdcE%YeyYJzgebvp~IHTlE>$`KlDLBg*XQb?&&pBgM+D~Wo`7+u6gK?(k!}>YcE*UyI>P&Dn9}9DKN764mx}^!eajSmh8kUa%f$KeF&wK7OHtI z`_Oo$v!B|3(K&!MKnQ&GA{v51v-HS^lLuV2h`UVEE?PK~tRhH8lOtqm}sx~sY~#0!S` z#1L)I14Dmbc7P#5-jvpzVVGdJk{I-MY=(smpv^E{vM&}kU3RbihMA44(W0|v*x!)d zQ%>VEZH>YhI9QRN z_)y+h2dtw#%|4w(rYF$cbqP>t!i9c5qmy0vBxn{1irPGDkeW^)lN+tJpd|rs06wKP zOC1>?4OaDN#5`I*^=a1NNJ2mLG{VXm#2#ah(;ZTOP&H|N)pr8X`uf&!-UMF_4-ED# z=Yc`K#XJzJJ{E}I$CtyA@#>ucWQ=bz>xz@f*3-P)mc-`dwh=q@KBExgi{pV9-#i|; z7|QY$1on2_qhTyH39~DkHVZ}&Rnl-M8+sa zCDFRY7=hN}`?MG05F)5PwAP^aSGn5(6wt|A8L-mk|9`jb71%{w&G=qekzU{&Pfk_f9`Z zbZhVQ2ueRwqxaNL6f3_*@0tGBto*&xjja3_K6|MjHurzEcluD`|6}j;6Bv+HcklF> z#BT+?e&hQ+8YE4dRCDjlW2tb7z0;Qw-OxMzVWN96r1nzyKU4b6z0;o}dV@x%AG~(& zPgq? zPPY@C<^#RRf0i0YdGGYa#BT=uY0P+%psYji`vdtM{OjTCu_zq`w*=wa;l?7I2Uh~O z5iSzzgje9d3%3n)TJJVM&iUMLfG0;ZEgb46LS6)vLSLMw-*G0xkHkuG62^*A@aeag z6$rnHf?bceF=*Yl0R9T_AK@cED-8nm-zO`Vu4M)`8sl5dJ<0Cj42zzrf*@bP`QT>9@s%r>W`?INDdByCK>+ zZ;bM;@|G72lErm&?EufFLrEB+a<@%xQu{ei>U@_uPaDdmbV(}QT>PVV-X)kH6#s~U zIpqkZ9rrh3*V~;4^*RrI<2)zJn>IqU$F-YQBDyyJ33=CRdyJ6ncu`)Q2w!&7yBSg% z(;Xed_g+qj%w|W&OcqDZY*Oi$qI)hQhK|v)i+*S7=t!1b^n*~WvmLKI%05r-=)ksQ z0&psQhE{pUam46o5~TLQ@x+aFVhIi&tc!Pc05;(wzrm*ik*z08^-_0sB`ywNDbDec$U8`3e%E zMc&&pGSMmWBRwMD>FgYC+eEqE$Yw(M&F?n8tN z%4xp|Q=@;NddjwLMohXMa1xH1WhWfn1*6{>(^790+`Td~$kX+#^ouMuCoUvvP>^RP#_ z#n9RmZW|@O8lsHbLHf^!AQ7z+;QOy<-BBwnelyxoi$dwEecwP5ddO^i}wP-^0pnmDB< zK`BVs61Vv+$5-Kw&wn=jusP1zu6tH*3wt)qeT3Ge$~&9QI>(Yh4y4J88c4?3era8d z$JHE(v{-5CH$RLPSif~A8hpK@9^pCVTVVd?7I-(Kcl5&k`jr9p#f-g{v6HAd z4rgZ8G-=pgxG_QF7; zC+~&L#%%h`w0G=LW&Vr@B7Gy3jxoiCGNtG)ec9oRyCQWG_HN((T=`MnJt_KwGG&tT znUZ%V8^>eQKCE>(8@-fI+W;itY>TL!Chv}Pwnf_d`H~47m2#vtQg0hB@6L)rHR_tM z0lcEm3Tck_dl+xnz%)NL@m9xzTWQw%TbYs-mU6`REgN%5=k;4AkOJ?mMYy1xUVn+U zZh(NYtv@6C{ZY#Q9qty$dM3mz6tLzm0lZw`s)TQcAJh_Vq~>oPwE0cPmm3_v46*55 z-`EpStL~%E4zY)&9Ce&@7|;X<@dmc>3>9rlIhsTLy&oZ5P;M}=0**qpL+rc)kKKU& z=wDqh&-)9eLNszTLPzm%ac~3nP*o~fLzS!%N|y0(RyshyW+f}vc~H+=Ig{dUwN-f# zPd~y-S3Nw4kKjctXr!Ql1rsUw3kFY5)>sPC{Tol#1PXr5f|DuuDGN@e;5#g6rr;qK z%%$K92nN!JPOuJ*T%;}nmi4=!mT#f%T$6x8rhHPrDH=Aou)r&J(@`$36Fevx=!KkI z;C+e-k3*3?SyP>DdfSzxqTP3ofC9ZYb0QLqqxL3oynppn-zA>eiA-J2cD*fL5Pu7% zIo?RllyYRorr!Z!?{hedUaW$?l+)ETc{NjZ(~(`h-yY|;$M|c8di8?4%Lo>D^5SUy zTx{^vCV1xMIy?0COAcq5^^l3Y&MEMIfcXk46V>GF2Vrvx=6YY^D0F_U;(DsdlVwJM z?Mppbxv1n9NS?Ad7a|M%tBv04xrAxQJc~2z*`7_d;UL4XWEmCg)}vA2nC-Noe$(d| zJyt+hi+KDQi%#1!NyZAD_Yme;=!?Fo1gobYf5xM0A;vznA>6itdUrf_&7AH1=+G<7 z7Ns;{mSZbc4ygCBvgr%_cCX)l#``J+sSh%K%7%R~rF=I}d5&_}dy*w&D46fFq5SoC ze?fT)gJyPt;IpFsGCT(7$zjg+2;~5_YN!k-3CeJ$TN!@OGh9%(BFq~t!bsn5Kdr9C zfSK}1x7aI1s)gP!Fu6npfa+guCgt^Gq&UxdoPEZiu$MLH>^aPCQbA3r{cJP#lHr98 z?9slIr(t&ew!tEgQFfZ>t?(CkH*mSWe$dPj{XVK8*wIMa+f z?gVI$Ih?IEXdZSRAupqE~)MdMwgjGnTz`K~s3o;3W7banHm-bLYWH07`ILG@V-^->< z6a&#c6FpV7(6c^B?EZD!@R+Tx~>6Lw`Sx;S@yH$2IATk;X4m@oGTMy`z zcKcXoXP7+&2gJA2uO56e&K{ty!U=lY&F)X^!-;qrlUmYHdmjRSCNM%d zTt7>X6zi3(7#QdHCwM(PT_r2S=?}BXPQT7Rn2aojhp9d?w@Q;ohp@+_M;zst*1<^T zKS<_I&n7)`L_+T_6GBs&Py^H#WNa5uTV9XjbQ*hCM9lZTh?OQ4d06XVqrI>5u%QW7 z`-@?|NRP#Ut3XUK^SpF{lVYugVr;80gg`aW&6#?~aT?a@#Jp4q9+lbx8nV#{B5IOzbIX5oDQ>JiEzEfwX*`ivnu zt&E<$GoITAp^!{t>#!6cjagWRFq=P9f6sp43Jd1?cMij%!J7$6u;E$HN{WkrN3lkx zGUUf$yS@)8)s#rB-E+q%7-*7ymxAdEN!M}d=N04WDF#=cNz4f>^!`_SR|6eob*As+ z4`CJXr^enLt;uIKE@oV+*By!W~H zyWjopcki8hzwdozHdp9uxUqxjP|j?sv$H8v+1z8Y`2(hcEKU3b+58C$C>bX;LuJ!! zvUyBrGu6uGhWE$nei_eARZRG|>Ir-tK@2>M?6%gj-}@WRbq*ZCFmr&9fZVyyb%67Q zu`2UZkoi{8f9ne5-PbUofaIUBDDUS!+xd1e$4uY5aov~2n7jA7_Nwf@j~TG6xzlu6 zH%fl)yhho1O&_zzJ$B5V`ZM~TT{iN^iLdlm3s--`NEcewJRio*moVu>sqx#My^}gx zz#MHK=7p?aJmEU%b=sjaP?d7-m_2o9J@`#=!&>}yJf**Sq>FjV%-{QX>x~~`xj>#s zi_UtFOrHBh+;-OIAZt9WP&szl$o+{TW}H^$yG+KPU`EC=Ut?uF*wuU+KPgnfCmj>{ zi4m%pnB`QS%?lR8Ha7oHQRPsTa~TfAE4u^7F<15o@)_*PZeSelD%ohhj1xEujR)ly z>E(Y3osz7Wi*)(#mFaR_v2Y7#d!{qT6CU>lZg(t}4T})__IAGlX%E&F{pjwgSvHSr08llZwNhh2Hzy+_eCvhKFE z>Z9K!kHB_dpEox8`g<3H;v1NyiqQAM*50s8j2ZP(#2hc1H-BKPj_lneuPdS=OoW(Y zxZhF6zTPc5rgse!?I97P)vG4D58t=;_L!V+R5>f&z$1o*?h34agj@Ei`F`&$V6G_e z4ID5W#`g8LN#<=f^ENWa`Ud#att=8_`+8d?^P4vFAILn@H$YQ|lF8V<-iT!0V>9_v zV#NsGz+A&*Y+vtc$=qo(pVoPfH%!L%_4Y{SeKzxDGI2(~!%~VoI%9Dqd;@P8&0?8q zx1Ea5zON|s4eT=<#>!L=7|kk~>H#~|n@m;Y8`x?%jFqY4MiZ2&9NVe zOf}nR*hy^deZ)@1NA_95^9+ZvGSvv92}=!rKc4mp=AioOKZMyLhVTAfJV8q(ThhSY zMmbw4*?tCYkjk;skM;MqLfyaZ2o5>lH&17@K}GlX24v)?EDvV7I+k`#QQdfcvA?$x zQ{et>g}7B)lJVsxb+3%1S=>}4ji@4VfA7y^Bp(h>MSkMakzeBcdfUZmku=vTQ#Smb zkyoZgavfDhE|MwvR!r)2?lX~3$;h^}$jv5_+grF((;}Cf$ZKU}S6U=(KgwgiBqP_S zMbglujJy!LhW*>Nq(zQ3k$1_++tMPBV%(Q0e=Q?-rbWJDB1^Cn+rRCBw8(!kkue$h zNLu6$6Zs<<`E*+3^(OLD8Oa@-)Kyt(A`_S$V|5@crAJ1pA3ocUU%+>zk6%zG!x=KX zRE8BYtdwE34C`drAVZ%F{W4r2!$mS&BExnWcF3?(hTSqu$Z)L;H^^|K3^&X0CK=u$ z!|gJ>Q-*iTa0kMU0tp4e?H%Pfk3)ETN{9-G>WFx?J5W$@=r9rHvUp;hXd=-Y zMAwk_GEkOTFk>(&GXj>o>im9Rz~^pm@iYfK&CN~TVrfVvHrbgy+o|(;0^Yd-_6MS{ zNeA<4qC3{LcHJ~f0hoZF!)cx2=<-B|NW_BC__Aguj>K?Q~{jvvmJS)!J}In8oW)lfkyX&WFFBN{EP8~rzcg*I)lsO&P1msP*vB; zSL~B983#nFGJOItsRk>4o#A#zpI33QK2K@)5{4mTE1fycbmuasY_c=OF|o?$SXL}; zvSlf011ViQ*{NW`GmXZ)a>zjoBiOrtNiuz>-}w_s?Jk2*NglcJ-m z9a*;lzjv-DRpF^L=)=@~l9mY9+mGW18az$4)@h|BOCM8n=E5;4&{Dt9lRV}095`w^ z?BR2!Mo;N?Ta|zV;@U?OxoWH)(cf(mWd9P{`@-9>}2Q@Bqg+e_slmU-_ zIid+ey0Z+$YDXAz)+n#B&YF&J)KPY+IjLA0E)kXO%6zl2<*7zq>0`BulMg4_l~7}l zBkx8uj7Tipxy~uRV0{ng7Wg+=)a#o|U0z3ZgEAA|Zo((WFp+L=Fx?opP<9HXLBz~% zUO=I8PIZ#h$qvyXo2~&h+|@0VnM7?2oY|mkLTVmkKIN@T%8Q2GDJDmbwm1 zzRL2FQrccxvoy0+U5w{sdC1Rr@wEvTOq>MI15@anuxxtyMKdm*d5Q6>B7#dpXfn$? zA}dyQu8MYbua3be*tKicu3L|+uL&$ULHq`B-H?a>yb1XEa8e)P%F8b(EE;jjNS$od zU!8i|=rM!mF+}|5eSV)gf0s+R2LGHWZtzs8n9p3i&zb?&<%BKx#VN4eB|r9m{Bo4` z^k(2cg?91yA;vlu>}Tu^LE@0LkZ(XXLHZ!KLB0jq z0l5$IJ;*;o{u%NNp$OjNt9iH8Sd=*jx zxg62}X@jhQtbuHY?1nr6c@grTkPjiF>S13D;)ZlWZh$-pc?R+-RDd;HojpNv0U3LvwW~^{3sQ> zdMa}WsI}@qED;sk#p*JtOM3Q$W(G9UX%z6K>YP(v{-CQ!>C%1uA+9nNCq4c_RjsQn z<(m)6I;G6=(1)l79hK#$4{^SKRdK(A&1?hU_xexk9Y5FYxePAq64CAT~ zns%j0ci0Dghtj9q_CeQa>*%}>x^7EHe|u0RluA4DgJP{#Xm@_lY|t9z)DMb{E~Qbv z{h-)v6e$;f(B7oASSN>vA6bA~ER`<6_H>o<`-jwbX6U(`9SO0>cgq-hC`)<)gm#Au z4F`uxV7~z@d|UxhD2lSS%0;7GB^MFBpYSIaR_(=OdCg&QS3y12@|A}{NmAS9;_eY5 z-#qJqhc6-t@uaIeDBf}9i~VDVq)_fjznw34bl?CX zU;KCx=(jIM@aYl+$AbtS3BlQka&Y#?{J40rz}i?jT43t`lY%raVTTHh8!qvi!Va;q zC>9oYwl^>7IqjALaa#fEs~tz!8%FuChZ#?(Yp;E`?kli8R%zu6NOUlaM2DFuAzm$j zH#7kU(|OvF+HVTDtE=``ep-YJybR>q8601Z6l_%Y6lU$Bh+EN?l9jwy6Ri4ry--&4 zTZN{ge^HpM=ywZo^&>dK6DtsGT8UskgKeESV7K@~A$v5j8IMT*mKu5r7Pl4Q8JuuT zyoX9Ln@9H*trGX6$WN|9%+_Kx-=@_{IF-rR-YO$GB;q% zMeI}Vz@c`oMnqg3FS2)!`VjHXY9!koLvV<}LvaM(OHjvW$#CZkTz;@{_LX1q&YAOK z{#7*_U1vP*np8KCzs2>aYm@6%*SK-xMt$J=$W@Eal7{HjZJqvVeAZ+8XVC;9{=-!u z_7`J46)W+NO~INs{=Zg;HEL##PjgWUhk=*Dh{7-SHuGsS>6e;*Zusu<1Sp89N48=B zZ^sZfAuzZExNIWUc}FNd@m~XP29F<;_8=DgO!}nTzgULS%&aX9}*zmcXLEMDE zVDif^#Jm2QPdpTVH8^MD8t_^W8$J!m5i@^-nSaGp*bC8oVsd!xu7VgoaV4o;u}nU8}5wY z^N9_AlEpWeeC}IZr}@N&UuW?RCZBs8+ccl}JHVOu(ExbNrwM_|*rGnom3we-k)#Nx||E55?aP zPP^t455*rd6Kz@Zi4A{=Repn6{w{Ft(R^aVZ?O0Vlm8?*-`9L%!;e~ggUO$K3EG_I z6C3{37T;jrOU)-X{7#E+F!}YD3h}At6C1wY;u}o%U;E;|#O&uU)R=t~ZCg>#`m(t{O4t;VU%e9R6=L=I@I; zH0E!IT^jRu%2OJ1?)1FIoa4QsG3Rf;(wOtHKWfZ*=4d?N#N%=v^)-z-pPZsGe{*>> z=5LTi8gu@?R%6cXw*w;^MiM;#W8nb{)6_c%l2cfa!lzsKJPS{; z@Ff9{Usz5(ZW zB;Ah1GM!v+%h0KFx0dBH;>`-4S_>T{GP!P-jF&Hhs3pUcPOm2#g;~#(Yk8TrO#L2xp`AzTSNv!wrBu?$($*-x+E`H70=90>+4K7O? z;`Sn3TXWsmQk&bEd8*`i`=qBcY;&?UvY0-#sVKjhEk%AYyIaKR`&!hbcC=F8SyIm{M^EGO7)GIYqSQ7~atkWC_ms5> zTH1z2l?LLmQ0cXJNv0u-JfdLs#Ih)dc2nWMU^G1 zC|#)1b-@n1z=7mVoV+;$eEUk2y1TnOBiKU38&2`k1$>XLB-q_uTBY8Rj+a)4uMKy0 z!JT}muQQmyyGp31#$d?XvY@0}D=bb+^;{D@y{u&VMJ4g}mD1UCBpT}MX%Cl%_|8#D zhZwZCQ{&yA(OqVpqUw!gdetvm{cnzrIxBs$W^z=Y?zR$LE5lKY&3J1%yjBFFsEuG} z>XlhND6_fZ4Po$PVek!y?}`Ny!KH#t&b}~TWV^{M3fhfNz6bW_PJIkdO`EJyMGxI( zNWuRT4_yBjt?(~*uWs5duiZ4&UC5q;0h@C2^fE?WHTkisB{kTpdR8-xtjVIDP@cqO zL}$l#7fJ*$kdJ&wC3)CO2_8dtUm>Lz zflyjol;7<+@gTphFop)yOSYIp;4zg@2c|PQPd*2;WP16@kY}6>dFIKGFFgrzdD+R3 vPv!*6Pv!*6Pv!*6af03K_N{U3vyXGbtr_o|N0aS-xHYHM#^>6au@LpY$l~(r literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/CHANGELOG.md b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/CHANGELOG.md new file mode 100644 index 0000000..12cacd2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/CHANGELOG.md @@ -0,0 +1,216 @@ +# Addressable 2.5.2 +- better support for frozen string literals +- fixed bug w/ uppercase characters in scheme +- IDNA errors w/ emoji URLs +- compatibility w/ public_suffix 3.x + +# Addressable 2.5.1 +- allow unicode normalization to be disabled for URI Template expansion +- removed duplicate test + +# Addressable 2.5.0 +- dropping support for Ruby 1.9 +- adding support for Ruby 2.4 preview +- add support for public suffixes and tld; first runtime dependency +- hostname escaping should match RFC; underscores in hostnames no longer escaped +- paths beginning with // and missing an authority are now considered invalid +- validation now also takes place after setting a path +- handle backslashes in authority more like a browser for `heuristic_parse` +- unescaped backslashes in host now raise an `InvalidURIError` +- `merge!`, `join!`, `omit!` and `normalize!` don't disable deferred validation +- `heuristic_parse` now trims whitespace before parsing +- host parts longer than 63 bytes will be ignored and not passed to libidn +- normalized values always encoded as UTF-8 + +# Addressable 2.4.0 +- support for 1.8.x dropped +- double quotes in a host now raises an error +- newlines in host will no longer get unescaped during normalization +- stricter handling of bogus scheme values +- stricter handling of encoded port values +- calling `require 'addressable'` will now load both the URI and Template files +- assigning to the `hostname` component with an `IPAddr` object is now supported +- assigning to the `origin` component is now supported +- fixed minor bug where an exception would be thrown for a missing ACE suffix +- better partial expansion of URI templates + +# Addressable 2.3.8 +- fix warnings +- update dependency gems +- support for 1.8.x officially deprecated + +# Addressable 2.3.7 +- fix scenario in which invalid URIs don't get an exception until inspected +- handle hostnames with two adjacent periods correctly +- upgrade of RSpec + +# Addressable 2.3.6 +- normalization drops empty query string +- better handling in template extract for missing values +- template modifier for `'?'` now treated as optional +- fixed issue where character class parameters were modified +- templates can now be tested for equality +- added `:sorted` option to normalization of query strings +- fixed issue with normalization of hosts given in `'example.com.'` form + +# Addressable 2.3.5 +- added Addressable::URI#empty? method +- Addressable::URI#hostname methods now strip square brackets from IPv6 hosts +- compatibility with Net::HTTP in Ruby 2.0.0 +- Addressable::URI#route_from should always give relative URIs + +# Addressable 2.3.4 +- fixed issue with encoding altering its inputs +- query string normalization now leaves ';' characters alone +- FakeFS is detected before attempting to load unicode tables +- additional testing to ensure frozen objects don't cause problems + +# Addressable 2.3.3 +- fixed issue with converting common primitives during template expansion +- fixed port encoding issue +- removed a few warnings +- normalize should now ignore %2B in query strings +- the IDNA logic should now be handled by libidn in Ruby 1.9 +- no template match should now result in nil instead of an empty MatchData +- added license information to gemspec + +# Addressable 2.3.2 +- added Addressable::URI#default_port method +- fixed issue with Marshalling Unicode data on Windows +- improved heuristic parsing to better handle IPv4 addresses + +# Addressable 2.3.1 +- fixed missing unicode data file + +# Addressable 2.3.0 +- updated Addressable::Template to use RFC 6570, level 4 +- fixed compatibility problems with some versions of Ruby +- moved unicode tables into a data file for performance reasons +- removing support for multiple query value notations + +# Addressable 2.2.8 +- fixed issues with dot segment removal code +- form encoding can now handle multiple values per key +- updated development environment + +# Addressable 2.2.7 +- fixed issues related to Addressable::URI#query_values= +- the Addressable::URI.parse method is now polymorphic + +# Addressable 2.2.6 +- changed the way ambiguous paths are handled +- fixed bug with frozen URIs +- https supported in heuristic parsing + +# Addressable 2.2.5 +- 'parsing' a pre-parsed URI object is now a dup operation +- introduced conditional support for libidn +- fixed normalization issue on ampersands in query strings +- added additional tests around handling of query strings + +# Addressable 2.2.4 +- added origin support from draft-ietf-websec-origin-00 +- resolved issue with attempting to navigate below root +- fixed bug with string splitting in query strings + +# Addressable 2.2.3 +- added :flat_array notation for query strings + +# Addressable 2.2.2 +- fixed issue with percent escaping of '+' character in query strings + +# Addressable 2.2.1 +- added support for application/x-www-form-urlencoded. + +# Addressable 2.2.0 +- added site methods +- improved documentation + +# Addressable 2.1.2 +- added HTTP request URI methods +- better handling of Windows file paths +- validation_deferred boolean replaced with defer_validation block +- normalization of percent-encoded paths should now be correct +- fixed issue with constructing URIs with relative paths +- fixed warnings + +# Addressable 2.1.1 +- more type checking changes +- fixed issue with unicode normalization +- added method to find template defaults +- symbolic keys are now allowed in template mappings +- numeric values and symbolic values are now allowed in template mappings + +# Addressable 2.1.0 +- refactored URI template support out into its own class +- removed extract method due to being useless and unreliable +- removed Addressable::URI.expand_template +- removed Addressable::URI#extract_mapping +- added partial template expansion +- fixed minor bugs in the parse and heuristic_parse methods +- fixed incompatibility with Ruby 1.9.1 +- fixed bottleneck in Addressable::URI#hash and Addressable::URI#to_s +- fixed unicode normalization exception +- updated query_values methods to better handle subscript notation +- worked around issue with freezing URIs +- improved specs + +# Addressable 2.0.2 +- fixed issue with URI template expansion +- fixed issue with percent escaping characters 0-15 + +# Addressable 2.0.1 +- fixed issue with query string assignment +- fixed issue with improperly encoded components + +# Addressable 2.0.0 +- the initialize method now takes an options hash as its only parameter +- added query_values method to URI class +- completely replaced IDNA implementation with pure Ruby +- renamed Addressable::ADDRESSABLE_VERSION to Addressable::VERSION +- completely reworked the Rakefile +- changed the behavior of the port method significantly +- Addressable::URI.encode_segment, Addressable::URI.unencode_segment renamed +- documentation is now in YARD format +- more rigorous type checking +- to_str method implemented, implicit conversion to Strings now allowed +- Addressable::URI#omit method added, Addressable::URI#merge method replaced +- updated URI Template code to match v 03 of the draft spec +- added a bunch of new specifications + +# Addressable 1.0.4 +- switched to using RSpec's pending system for specs that rely on IDN +- fixed issue with creating URIs with paths that are not prefixed with '/' + +# Addressable 1.0.3 +- implemented a hash method + +# Addressable 1.0.2 +- fixed minor bug with the extract_mapping method + +# Addressable 1.0.1 +- fixed minor bug with the extract_mapping method + +# Addressable 1.0.0 +- heuristic parse method added +- parsing is slightly more strict +- replaced to_h with to_hash +- fixed routing methods +- improved specifications +- improved heckle rake task +- no surviving heckle mutations + +# Addressable 0.1.2 +- improved normalization +- fixed bug in joining algorithm +- updated specifications + +# Addressable 0.1.1 +- updated documentation +- added URI Template variable extraction + +# Addressable 0.1.0 +- initial release +- implementation based on RFC 3986, 3987 +- support for IRIs via libidn +- support for the URI Template draft spec diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Gemfile b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Gemfile new file mode 100644 index 0000000..c2344b6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Gemfile @@ -0,0 +1,32 @@ +source 'https://rubygems.org' + +gemspec + +group :test do + gem 'rspec', '~> 3.0' + gem 'rspec-its', '~> 1.1' +end + +group :development do + gem 'launchy', '~> 2.4', '>= 2.4.3' + gem 'redcarpet', :platform => :mri_19 + gem 'yard' +end + +group :test, :development do + gem 'rake', '> 10.0', '< 12' + gem 'simplecov', :require => false + gem 'coveralls', :require => false, :platforms => [ + :ruby_20, :ruby_21, :ruby_22, :ruby_23 + ] + # Used to test compatibility. + gem 'rack-mount', git: 'https://github.com/sporkmonger/rack-mount.git', require: 'rack/mount' + + if RUBY_VERSION.start_with?('2.0', '2.1') + gem 'rack', '< 2', :require => false + else + gem 'rack', :require => false + end +end + +gem 'idn-ruby', :platform => [:mri_20, :mri_21, :mri_22, :mri_23, :mri_24] diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/LICENSE.txt b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/LICENSE.txt new file mode 100644 index 0000000..ef51da2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/README.md b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/README.md new file mode 100644 index 0000000..e01fd0e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/README.md @@ -0,0 +1,121 @@ +# Addressable + +

+
Homepage
github.com/sporkmonger/addressable
+
Author
Bob Aman
+
Copyright
Copyright © Bob Aman
+
License
Apache 2.0
+
+ +[![Gem Version](http://img.shields.io/gem/dt/addressable.svg)][gem] +[![Build Status](https://secure.travis-ci.org/sporkmonger/addressable.svg?branch=master)][travis] +[![Dependency Status](https://gemnasium.com/sporkmonger/addressable.svg?travis)][gemnasium] +[![Test Coverage Status](https://img.shields.io/coveralls/sporkmonger/addressable.svg)][coveralls] +[![Documentation Coverage Status](http://inch-ci.org/github/sporkmonger/addressable.svg?branch=master)][inch] + +[gem]: https://rubygems.org/gems/addressable +[travis]: http://travis-ci.org/sporkmonger/addressable +[gemnasium]: https://gemnasium.com/sporkmonger/addressable +[coveralls]: https://coveralls.io/r/sporkmonger/addressable +[inch]: http://inch-ci.org/github/sporkmonger/addressable + +# Description + +Addressable is a replacement for the URI implementation that is part of +Ruby's standard library. It more closely conforms to RFC 3986, RFC 3987, and +RFC 6570 (level 4), providing support for IRIs and URI templates. + +# Reference + +- {Addressable::URI} +- {Addressable::Template} + +# Example usage + +```ruby +require "addressable/uri" + +uri = Addressable::URI.parse("http://example.com/path/to/resource/") +uri.scheme +#=> "http" +uri.host +#=> "example.com" +uri.path +#=> "/path/to/resource/" + +uri = Addressable::URI.parse("http://www.詹姆斯.com/") +uri.normalize +#=> # +``` + + +# URI Templates + +For more details, see [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.txt). + + +```ruby + +require "addressable/template" + +template = Addressable::Template.new("http://example.com/{?query*}/") +template.expand({ + "query" => { + 'foo' => 'bar', + 'color' => 'red' + } +}) +#=> # + +template = Addressable::Template.new("http://example.com/{?one,two,three}") +template.partial_expand({"one" => "1", "three" => 3}).pattern +#=> "http://example.com/?one=1{&two}&three=3" + +template = Addressable::Template.new( + "http://{host}{/segments*}/{?one,two,bogus}{#fragment}" +) +uri = Addressable::URI.parse( + "http://example.com/a/b/c/?one=1&two=2#foo" +) +template.extract(uri) +#=> +# { +# "host" => "example.com", +# "segments" => ["a", "b", "c"], +# "one" => "1", +# "two" => "2", +# "fragment" => "foo" +# } +``` + +# Install + +```console +$ gem install addressable +``` + +You may optionally turn on native IDN support by installing libidn and the +idn gem: + +```console +$ sudo apt-get install idn # Debian/Ubuntu +$ brew install libidn # OS X +$ gem install idn-ruby +``` + +# Semantic Versioning + +This project uses sementic versioning. You can (and should) specify your +dependency using a pessimistic version constraint covering the major and minor +values: + +```ruby +spec.add_dependency 'addressable', '~> 2.5' +``` + +If you need a specific bug fix, you can also specify minimum tiny versions +without preventing updates to the latest minor release: + +```ruby +spec.add_dependency 'addressable', '~> 2.3', '>= 2.3.7' +``` diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Rakefile b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Rakefile new file mode 100644 index 0000000..ffdcb8c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Rakefile @@ -0,0 +1,32 @@ +require 'rubygems' +require 'rake' + +require File.join(File.dirname(__FILE__), 'lib', 'addressable', 'version') + +PKG_DISPLAY_NAME = 'Addressable' +PKG_NAME = PKG_DISPLAY_NAME.downcase +PKG_VERSION = Addressable::VERSION::STRING +PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" + +RELEASE_NAME = "REL #{PKG_VERSION}" + +PKG_SUMMARY = "URI Implementation" +PKG_DESCRIPTION = <<-TEXT +Addressable is a replacement for the URI implementation that is part of +Ruby's standard library. It more closely conforms to the relevant RFCs and +adds support for IRIs and URI templates. +TEXT + +PKG_FILES = FileList[ + "lib/**/*", "spec/**/*", "vendor/**/*", "data/**/*", + "tasks/**/*", + "[A-Z]*", "Rakefile" +].exclude(/pkg/).exclude(/database\.yml/). + exclude(/Gemfile\.lock/).exclude(/[_\.]git$/) + +task :default => "spec" + +WINDOWS = (RUBY_PLATFORM =~ /mswin|win32|mingw|bccwin|cygwin/) rescue false +SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS']) + +Dir['tasks/**/*.rake'].each { |rake| load rake } diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/data/unicode.data b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/data/unicode.data new file mode 100644 index 0000000000000000000000000000000000000000..cdfc22418a51396f2b89cfc1afb2c892b30d7e3f GIT binary patch literal 115740 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 0 && segment.size < 64 + IDN::Idna.toASCII(segment, IDN::Idna::ALLOW_UNASSIGNED) + elsif segment.size >= 64 + segment + else + '' + end + end.join('.') + end + + def self.to_unicode(value) + value.to_s.split('.', -1).map do |segment| + if segment.size > 0 && segment.size < 64 + IDN::Idna.toUnicode(segment, IDN::Idna::ALLOW_UNASSIGNED) + elsif segment.size >= 64 + segment + else + '' + end + end.join('.') + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb new file mode 100644 index 0000000..33f026a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb @@ -0,0 +1,677 @@ +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +module Addressable + module IDNA + # This module is loosely based on idn_actionmailer by Mick Staugaard, + # the unicode library by Yoshida Masato, and the punycode implementation + # by Kazuhiro Nishiyama. Most of the code was copied verbatim, but + # some reformatting was done, and some translation from C was done. + # + # Without their code to work from as a base, we'd all still be relying + # on the presence of libidn. Which nobody ever seems to have installed. + # + # Original sources: + # http://github.com/staugaard/idn_actionmailer + # http://www.yoshidam.net/Ruby.html#unicode + # http://rubyforge.org/frs/?group_id=2550 + + + UNICODE_TABLE = File.expand_path( + File.join(File.dirname(__FILE__), '../../..', 'data/unicode.data') + ) + + ACE_PREFIX = "xn--" + + UTF8_REGEX = /\A(?: + [\x09\x0A\x0D\x20-\x7E] # ASCII + | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte + | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs + | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte + | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates + | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 + | [\xF1-\xF3][\x80-\xBF]{3} # planes 4nil5 + | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 + )*\z/mnx + + UTF8_REGEX_MULTIBYTE = /(?: + [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte + | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs + | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte + | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates + | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 + | [\xF1-\xF3][\x80-\xBF]{3} # planes 4nil5 + | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 + )/mnx + + # :startdoc: + + # Converts from a Unicode internationalized domain name to an ASCII + # domain name as described in RFC 3490. + def self.to_ascii(input) + input = input.to_s unless input.is_a?(String) + input = input.dup + if input.respond_to?(:force_encoding) + input.force_encoding(Encoding::ASCII_8BIT) + end + if input =~ UTF8_REGEX && input =~ UTF8_REGEX_MULTIBYTE + parts = unicode_downcase(input).split('.') + parts.map! do |part| + if part.respond_to?(:force_encoding) + part.force_encoding(Encoding::ASCII_8BIT) + end + if part =~ UTF8_REGEX && part =~ UTF8_REGEX_MULTIBYTE + ACE_PREFIX + punycode_encode(unicode_normalize_kc(part)) + else + part + end + end + parts.join('.') + else + input + end + end + + # Converts from an ASCII domain name to a Unicode internationalized + # domain name as described in RFC 3490. + def self.to_unicode(input) + input = input.to_s unless input.is_a?(String) + parts = input.split('.') + parts.map! do |part| + if part =~ /^#{ACE_PREFIX}(.+)/ + begin + punycode_decode(part[/^#{ACE_PREFIX}(.+)/, 1]) + rescue Addressable::IDNA::PunycodeBadInput + # toUnicode is explicitly defined as never-fails by the spec + part + end + else + part + end + end + output = parts.join('.') + if output.respond_to?(:force_encoding) + output.force_encoding(Encoding::UTF_8) + end + output + end + + # Unicode normalization form KC. + def self.unicode_normalize_kc(input) + input = input.to_s unless input.is_a?(String) + unpacked = input.unpack("U*") + unpacked = + unicode_compose(unicode_sort_canonical(unicode_decompose(unpacked))) + return unpacked.pack("U*") + end + + ## + # Unicode aware downcase method. + # + # @api private + # @param [String] input + # The input string. + # @return [String] The downcased result. + def self.unicode_downcase(input) + input = input.to_s unless input.is_a?(String) + unpacked = input.unpack("U*") + unpacked.map! { |codepoint| lookup_unicode_lowercase(codepoint) } + return unpacked.pack("U*") + end + (class <= HANGUL_LBASE && ch_one < HANGUL_LBASE + HANGUL_LCOUNT && + ch_two >= HANGUL_VBASE && ch_two < HANGUL_VBASE + HANGUL_VCOUNT + # Hangul L + V + return HANGUL_SBASE + ( + (ch_one - HANGUL_LBASE) * HANGUL_VCOUNT + (ch_two - HANGUL_VBASE) + ) * HANGUL_TCOUNT + elsif ch_one >= HANGUL_SBASE && + ch_one < HANGUL_SBASE + HANGUL_SCOUNT && + (ch_one - HANGUL_SBASE) % HANGUL_TCOUNT == 0 && + ch_two >= HANGUL_TBASE && ch_two < HANGUL_TBASE + HANGUL_TCOUNT + # Hangul LV + T + return ch_one + (ch_two - HANGUL_TBASE) + end + + p = [] + ucs4_to_utf8 = lambda do |ch| + if ch < 128 + p << ch + elsif ch < 2048 + p << (ch >> 6 | 192) + p << (ch & 63 | 128) + elsif ch < 0x10000 + p << (ch >> 12 | 224) + p << (ch >> 6 & 63 | 128) + p << (ch & 63 | 128) + elsif ch < 0x200000 + p << (ch >> 18 | 240) + p << (ch >> 12 & 63 | 128) + p << (ch >> 6 & 63 | 128) + p << (ch & 63 | 128) + elsif ch < 0x4000000 + p << (ch >> 24 | 248) + p << (ch >> 18 & 63 | 128) + p << (ch >> 12 & 63 | 128) + p << (ch >> 6 & 63 | 128) + p << (ch & 63 | 128) + elsif ch < 0x80000000 + p << (ch >> 30 | 252) + p << (ch >> 24 & 63 | 128) + p << (ch >> 18 & 63 | 128) + p << (ch >> 12 & 63 | 128) + p << (ch >> 6 & 63 | 128) + p << (ch & 63 | 128) + end + end + + ucs4_to_utf8.call(ch_one) + ucs4_to_utf8.call(ch_two) + + return lookup_unicode_composition(p) + end + (class < cc + unpacked[i] = last + unpacked[i-1] = ch + i -= 1 if i > 1 + else + i += 1 + end + end + return unpacked + end + (class <= HANGUL_SBASE && cp < HANGUL_SBASE + HANGUL_SCOUNT + l, v, t = unicode_decompose_hangul(cp) + unpacked_result << l + unpacked_result << v if v + unpacked_result << t if t + else + dc = lookup_unicode_compatibility(cp) + unless dc + unpacked_result << cp + else + unpacked_result.concat(unicode_decompose(dc.unpack("U*"))) + end + end + end + return unpacked_result + end + (class <= HANGUL_SCOUNT + l = codepoint + v = t = nil + return l, v, t + end + l = HANGUL_LBASE + sindex / HANGUL_NCOUNT + v = HANGUL_VBASE + (sindex % HANGUL_NCOUNT) / HANGUL_TCOUNT + t = HANGUL_TBASE + sindex % HANGUL_TCOUNT + if t == HANGUL_TBASE + t = nil + end + return l, v, t + end + (class <?" + + "@ABCDEFGHIJKLMNO" + + "PQRSTUVWXYZ[\\]^_" + + "`abcdefghijklmno" + + "pqrstuvwxyz{|}~\n" + + # Input is invalid. + class PunycodeBadInput < StandardError; end + # Output would exceed the space provided. + class PunycodeBigOutput < StandardError; end + # Input needs wider integers to process. + class PunycodeOverflow < StandardError; end + + def self.punycode_encode(unicode) + unicode = unicode.to_s unless unicode.is_a?(String) + input = unicode.unpack("U*") + output = [0] * (ACE_MAX_LENGTH + 1) + input_length = input.size + output_length = [ACE_MAX_LENGTH] + + # Initialize the state + n = PUNYCODE_INITIAL_N + delta = out = 0 + max_out = output_length[0] + bias = PUNYCODE_INITIAL_BIAS + + # Handle the basic code points: + input_length.times do |j| + if punycode_basic?(input[j]) + if max_out - out < 2 + raise PunycodeBigOutput, + "Output would exceed the space provided." + end + output[out] = input[j] + out += 1 + end + end + + h = b = out + + # h is the number of code points that have been handled, b is the + # number of basic code points, and out is the number of characters + # that have been output. + + if b > 0 + output[out] = PUNYCODE_DELIMITER + out += 1 + end + + # Main encoding loop: + + while h < input_length + # All non-basic code points < n have been + # handled already. Find the next larger one: + + m = PUNYCODE_MAXINT + input_length.times do |j| + m = input[j] if (n...m) === input[j] + end + + # Increase delta enough to advance the decoder's + # state to , but guard against overflow: + + if m - n > (PUNYCODE_MAXINT - delta) / (h + 1) + raise PunycodeOverflow, "Input needs wider integers to process." + end + delta += (m - n) * (h + 1) + n = m + + input_length.times do |j| + # Punycode does not need to check whether input[j] is basic: + if input[j] < n + delta += 1 + if delta == 0 + raise PunycodeOverflow, + "Input needs wider integers to process." + end + end + + if input[j] == n + # Represent delta as a generalized variable-length integer: + + q = delta; k = PUNYCODE_BASE + while true + if out >= max_out + raise PunycodeBigOutput, + "Output would exceed the space provided." + end + t = ( + if k <= bias + PUNYCODE_TMIN + elsif k >= bias + PUNYCODE_TMAX + PUNYCODE_TMAX + else + k - bias + end + ) + break if q < t + output[out] = + punycode_encode_digit(t + (q - t) % (PUNYCODE_BASE - t)) + out += 1 + q = (q - t) / (PUNYCODE_BASE - t) + k += PUNYCODE_BASE + end + + output[out] = punycode_encode_digit(q) + out += 1 + bias = punycode_adapt(delta, h + 1, h == b) + delta = 0 + h += 1 + end + end + + delta += 1 + n += 1 + end + + output_length[0] = out + + outlen = out + outlen.times do |j| + c = output[j] + unless c >= 0 && c <= 127 + raise StandardError, "Invalid output char." + end + unless PUNYCODE_PRINT_ASCII[c] + raise PunycodeBadInput, "Input is invalid." + end + end + + output[0..outlen].map { |x| x.chr }.join("").sub(/\0+\z/, "") + end + (class <= 0 && c <= 127 + raise PunycodeBadInput, "Input is invalid." + end + input.push(c) + end + + input_length = input.length + output_length = [UNICODE_MAX_LENGTH] + + # Initialize the state + n = PUNYCODE_INITIAL_N + + out = i = 0 + max_out = output_length[0] + bias = PUNYCODE_INITIAL_BIAS + + # Handle the basic code points: Let b be the number of input code + # points before the last delimiter, or 0 if there is none, then + # copy the first b code points to the output. + + b = 0 + input_length.times do |j| + b = j if punycode_delimiter?(input[j]) + end + if b > max_out + raise PunycodeBigOutput, "Output would exceed the space provided." + end + + b.times do |j| + unless punycode_basic?(input[j]) + raise PunycodeBadInput, "Input is invalid." + end + output[out] = input[j] + out+=1 + end + + # Main decoding loop: Start just after the last delimiter if any + # basic code points were copied; start at the beginning otherwise. + + in_ = b > 0 ? b + 1 : 0 + while in_ < input_length + + # in_ is the index of the next character to be consumed, and + # out is the number of code points in the output array. + + # Decode a generalized variable-length integer into delta, + # which gets added to i. The overflow checking is easier + # if we increase i as we go, then subtract off its starting + # value at the end to obtain delta. + + oldi = i; w = 1; k = PUNYCODE_BASE + while true + if in_ >= input_length + raise PunycodeBadInput, "Input is invalid." + end + digit = punycode_decode_digit(input[in_]) + in_+=1 + if digit >= PUNYCODE_BASE + raise PunycodeBadInput, "Input is invalid." + end + if digit > (PUNYCODE_MAXINT - i) / w + raise PunycodeOverflow, "Input needs wider integers to process." + end + i += digit * w + t = ( + if k <= bias + PUNYCODE_TMIN + elsif k >= bias + PUNYCODE_TMAX + PUNYCODE_TMAX + else + k - bias + end + ) + break if digit < t + if w > PUNYCODE_MAXINT / (PUNYCODE_BASE - t) + raise PunycodeOverflow, "Input needs wider integers to process." + end + w *= PUNYCODE_BASE - t + k += PUNYCODE_BASE + end + + bias = punycode_adapt(i - oldi, out + 1, oldi == 0) + + # I was supposed to wrap around from out + 1 to 0, + # incrementing n each time, so we'll fix that now: + + if i / (out + 1) > PUNYCODE_MAXINT - n + raise PunycodeOverflow, "Input needs wider integers to process." + end + n += i / (out + 1) + i %= out + 1 + + # Insert n at position i of the output: + + # not needed for Punycode: + # raise PUNYCODE_INVALID_INPUT if decode_digit(n) <= base + if out >= max_out + raise PunycodeBigOutput, "Output would exceed the space provided." + end + + #memmove(output + i + 1, output + i, (out - i) * sizeof *output) + output[i + 1, out - i] = output[i, out - i] + output[i] = n + i += 1 + + out += 1 + end + + output_length[0] = out + + output.pack("U*") + end + (class <> 1 + # delta >> 1 is a faster way of doing delta / 2 + delta += delta / numpoints + difference = PUNYCODE_BASE - PUNYCODE_TMIN + + k = 0 + while delta > (difference * PUNYCODE_TMAX) / 2 + delta /= difference + k += PUNYCODE_BASE + end + + k + (difference + 1) * delta / (delta + PUNYCODE_SKEW) + end + (class < '?', + '/' => '/', + '#' => '#', + '.' => '.', + ';' => ';', + '&' => '&' + } + JOINERS = { + '?' => '&', + '.' => '.', + ';' => ';', + '&' => '&', + '/' => '/' + } + + ## + # Raised if an invalid template value is supplied. + class InvalidTemplateValueError < StandardError + end + + ## + # Raised if an invalid template operator is used in a pattern. + class InvalidTemplateOperatorError < StandardError + end + + ## + # Raised if an invalid template operator is used in a pattern. + class TemplateOperatorAbortedError < StandardError + end + + ## + # This class represents the data that is extracted when a Template + # is matched against a URI. + class MatchData + ## + # Creates a new MatchData object. + # MatchData objects should never be instantiated directly. + # + # @param [Addressable::URI] uri + # The URI that the template was matched against. + def initialize(uri, template, mapping) + @uri = uri.dup.freeze + @template = template + @mapping = mapping.dup.freeze + end + + ## + # @return [Addressable::URI] + # The URI that the Template was matched against. + attr_reader :uri + + ## + # @return [Addressable::Template] + # The Template used for the match. + attr_reader :template + + ## + # @return [Hash] + # The mapping that resulted from the match. + # Note that this mapping does not include keys or values for + # variables that appear in the Template, but are not present + # in the URI. + attr_reader :mapping + + ## + # @return [Array] + # The list of variables that were present in the Template. + # Note that this list will include variables which do not appear + # in the mapping because they were not present in URI. + def variables + self.template.variables + end + alias_method :keys, :variables + alias_method :names, :variables + + ## + # @return [Array] + # The list of values that were captured by the Template. + # Note that this list will include nils for any variables which + # were in the Template, but did not appear in the URI. + def values + @values ||= self.variables.inject([]) do |accu, key| + accu << self.mapping[key] + accu + end + end + alias_method :captures, :values + + ## + # Accesses captured values by name or by index. + # + # @param [String, Symbol, Fixnum] key + # Capture index or name. Note that when accessing by with index + # of 0, the full URI will be returned. The intention is to mimic + # the ::MatchData#[] behavior. + # + # @param [#to_int, nil] len + # If provided, an array of values will be returend with the given + # parameter used as length. + # + # @return [Array, String, nil] + # The captured value corresponding to the index or name. If the + # value was not provided or the key is unknown, nil will be + # returned. + # + # If the second parameter is provided, an array of that length will + # be returned instead. + def [](key, len = nil) + if len + to_a[key, len] + elsif String === key or Symbol === key + mapping[key.to_s] + else + to_a[key] + end + end + + ## + # @return [Array] + # Array with the matched URI as first element followed by the captured + # values. + def to_a + [to_s, *values] + end + + ## + # @return [String] + # The matched URI as String. + def to_s + uri.to_s + end + alias_method :string, :to_s + + # Returns multiple captured values at once. + # + # @param [String, Symbol, Fixnum] *indexes + # Indices of the captures to be returned + # + # @return [Array] + # Values corresponding to given indices. + # + # @see Addressable::Template::MatchData#[] + def values_at(*indexes) + indexes.map { |i| self[i] } + end + + ## + # Returns a String representation of the MatchData's state. + # + # @return [String] The MatchData's state, as a String. + def inspect + sprintf("#<%s:%#0x RESULT:%s>", + self.class.to_s, self.object_id, self.mapping.inspect) + end + + ## + # Dummy method for code expecting a ::MatchData instance + # + # @return [String] An empty string. + def pre_match + "" + end + alias_method :post_match, :pre_match + end + + ## + # Creates a new Addressable::Template object. + # + # @param [#to_str] pattern The URI Template pattern. + # + # @return [Addressable::Template] The initialized Template object. + def initialize(pattern) + if !pattern.respond_to?(:to_str) + raise TypeError, "Can't convert #{pattern.class} into String." + end + @pattern = pattern.to_str.dup.freeze + end + + ## + # Freeze URI, initializing instance variables. + # + # @return [Addressable::URI] The frozen URI object. + def freeze + self.variables + self.variable_defaults + self.named_captures + super + end + + ## + # @return [String] The Template object's pattern. + attr_reader :pattern + + ## + # Returns a String representation of the Template object's state. + # + # @return [String] The Template object's state, as a String. + def inspect + sprintf("#<%s:%#0x PATTERN:%s>", + self.class.to_s, self.object_id, self.pattern) + end + + ## + # Returns true if the Template objects are equal. This method + # does NOT normalize either Template before doing the comparison. + # + # @param [Object] template The Template to compare. + # + # @return [TrueClass, FalseClass] + # true if the Templates are equivalent, false + # otherwise. + def ==(template) + return false unless template.kind_of?(Template) + return self.pattern == template.pattern + end + + ## + # Addressable::Template makes no distinction between `==` and `eql?`. + # + # @see #== + alias_method :eql?, :== + + ## + # Extracts a mapping from the URI using a URI Template pattern. + # + # @param [Addressable::URI, #to_str] uri + # The URI to extract from. + # + # @param [#restore, #match] processor + # A template processor object may optionally be supplied. + # + # The object should respond to either the restore or + # match messages or both. The restore method should + # take two parameters: `[String] name` and `[String] value`. + # The restore method should reverse any transformations that + # have been performed on the value to ensure a valid URI. + # The match method should take a single + # parameter: `[String] name`. The match method should return + # a String containing a regular expression capture group for + # matching on that particular variable. The default value is `".*?"`. + # The match method has no effect on multivariate operator + # expansions. + # + # @return [Hash, NilClass] + # The Hash mapping that was extracted from the URI, or + # nil if the URI didn't match the template. + # + # @example + # class ExampleProcessor + # def self.restore(name, value) + # return value.gsub(/\+/, " ") if name == "query" + # return value + # end + # + # def self.match(name) + # return ".*?" if name == "first" + # return ".*" + # end + # end + # + # uri = Addressable::URI.parse( + # "http://example.com/search/an+example+search+query/" + # ) + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).extract(uri, ExampleProcessor) + # #=> {"query" => "an example search query"} + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # Addressable::Template.new( + # "http://example.com/{first}/{second}/" + # ).extract(uri, ExampleProcessor) + # #=> {"first" => "a", "second" => "b/c"} + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # Addressable::Template.new( + # "http://example.com/{first}/{-list|/|second}/" + # ).extract(uri) + # #=> {"first" => "a", "second" => ["b", "c"]} + def extract(uri, processor=nil) + match_data = self.match(uri, processor) + return (match_data ? match_data.mapping : nil) + end + + ## + # Extracts match data from the URI using a URI Template pattern. + # + # @param [Addressable::URI, #to_str] uri + # The URI to extract from. + # + # @param [#restore, #match] processor + # A template processor object may optionally be supplied. + # + # The object should respond to either the restore or + # match messages or both. The restore method should + # take two parameters: `[String] name` and `[String] value`. + # The restore method should reverse any transformations that + # have been performed on the value to ensure a valid URI. + # The match method should take a single + # parameter: `[String] name`. The match method should return + # a String containing a regular expression capture group for + # matching on that particular variable. The default value is `".*?"`. + # The match method has no effect on multivariate operator + # expansions. + # + # @return [Hash, NilClass] + # The Hash mapping that was extracted from the URI, or + # nil if the URI didn't match the template. + # + # @example + # class ExampleProcessor + # def self.restore(name, value) + # return value.gsub(/\+/, " ") if name == "query" + # return value + # end + # + # def self.match(name) + # return ".*?" if name == "first" + # return ".*" + # end + # end + # + # uri = Addressable::URI.parse( + # "http://example.com/search/an+example+search+query/" + # ) + # match = Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).match(uri, ExampleProcessor) + # match.variables + # #=> ["query"] + # match.captures + # #=> ["an example search query"] + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # match = Addressable::Template.new( + # "http://example.com/{first}/{+second}/" + # ).match(uri, ExampleProcessor) + # match.variables + # #=> ["first", "second"] + # match.captures + # #=> ["a", "b/c"] + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # match = Addressable::Template.new( + # "http://example.com/{first}{/second*}/" + # ).match(uri) + # match.variables + # #=> ["first", "second"] + # match.captures + # #=> ["a", ["b", "c"]] + def match(uri, processor=nil) + uri = Addressable::URI.parse(uri) + mapping = {} + + # First, we need to process the pattern, and extract the values. + expansions, expansion_regexp = + parse_template_pattern(pattern, processor) + + return nil unless uri.to_str.match(expansion_regexp) + unparsed_values = uri.to_str.scan(expansion_regexp).flatten + + if uri.to_str == pattern + return Addressable::Template::MatchData.new(uri, self, mapping) + elsif expansions.size > 0 + index = 0 + expansions.each do |expansion| + _, operator, varlist = *expansion.match(EXPRESSION) + varlist.split(',').each do |varspec| + _, name, modifier = *varspec.match(VARSPEC) + mapping[name] ||= nil + case operator + when nil, '+', '#', '/', '.' + unparsed_value = unparsed_values[index] + name = varspec[VARSPEC, 1] + value = unparsed_value + value = value.split(JOINERS[operator]) if value && modifier == '*' + when ';', '?', '&' + if modifier == '*' + if unparsed_values[index] + value = unparsed_values[index].split(JOINERS[operator]) + value = value.inject({}) do |acc, v| + key, val = v.split('=') + val = "" if val.nil? + acc[key] = val + acc + end + end + else + if (unparsed_values[index]) + name, value = unparsed_values[index].split('=') + value = "" if value.nil? + end + end + end + if processor != nil && processor.respond_to?(:restore) + value = processor.restore(name, value) + end + if processor == nil + if value.is_a?(Hash) + value = value.inject({}){|acc, (k, v)| + acc[Addressable::URI.unencode_component(k)] = + Addressable::URI.unencode_component(v) + acc + } + elsif value.is_a?(Array) + value = value.map{|v| Addressable::URI.unencode_component(v) } + else + value = Addressable::URI.unencode_component(value) + end + end + if !mapping.has_key?(name) || mapping[name].nil? + # Doesn't exist, set to value (even if value is nil) + mapping[name] = value + end + index = index + 1 + end + end + return Addressable::Template::MatchData.new(uri, self, mapping) + else + return nil + end + end + + ## + # Expands a URI template into another URI template. + # + # @param [Hash] mapping The mapping that corresponds to the pattern. + # @param [#validate, #transform] processor + # An optional processor object may be supplied. + # @param [Boolean] normalize_values + # Optional flag to enable/disable unicode normalization. Default: true + # + # The object should respond to either the validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError + # exception will be raised if the value is invalid. The transform + # method should return the transformed variable value as a String. + # If a transform method is used, the value will not be percent + # encoded automatically. Unicode normalization will be performed both + # before and after sending the value to the transform method. + # + # @return [Addressable::Template] The partially expanded URI template. + # + # @example + # Addressable::Template.new( + # "http://example.com/{one}/{two}/" + # ).partial_expand({"one" => "1"}).pattern + # #=> "http://example.com/1/{two}/" + # + # Addressable::Template.new( + # "http://example.com/{?one,two}/" + # ).partial_expand({"one" => "1"}).pattern + # #=> "http://example.com/?one=1{&two}/" + # + # Addressable::Template.new( + # "http://example.com/{?one,two,three}/" + # ).partial_expand({"one" => "1", "three" => 3}).pattern + # #=> "http://example.com/?one=1{&two}&three=3" + def partial_expand(mapping, processor=nil, normalize_values=true) + result = self.pattern.dup + mapping = normalize_keys(mapping) + result.gsub!( EXPRESSION ) do |capture| + transform_partial_capture(mapping, capture, processor, normalize_values) + end + return Addressable::Template.new(result) + end + + ## + # Expands a URI template into a full URI. + # + # @param [Hash] mapping The mapping that corresponds to the pattern. + # @param [#validate, #transform] processor + # An optional processor object may be supplied. + # @param [Boolean] normalize_values + # Optional flag to enable/disable unicode normalization. Default: true + # + # The object should respond to either the validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError + # exception will be raised if the value is invalid. The transform + # method should return the transformed variable value as a String. + # If a transform method is used, the value will not be percent + # encoded automatically. Unicode normalization will be performed both + # before and after sending the value to the transform method. + # + # @return [Addressable::URI] The expanded URI template. + # + # @example + # class ExampleProcessor + # def self.validate(name, value) + # return !!(value =~ /^[\w ]+$/) if name == "query" + # return true + # end + # + # def self.transform(name, value) + # return value.gsub(/ /, "+") if name == "query" + # return value + # end + # end + # + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).expand( + # {"query" => "an example search query"}, + # ExampleProcessor + # ).to_str + # #=> "http://example.com/search/an+example+search+query/" + # + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).expand( + # {"query" => "an example search query"} + # ).to_str + # #=> "http://example.com/search/an%20example%20search%20query/" + # + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).expand( + # {"query" => "bogus!"}, + # ExampleProcessor + # ).to_str + # #=> Addressable::Template::InvalidTemplateValueError + def expand(mapping, processor=nil, normalize_values=true) + result = self.pattern.dup + mapping = normalize_keys(mapping) + result.gsub!( EXPRESSION ) do |capture| + transform_capture(mapping, capture, processor, normalize_values) + end + return Addressable::URI.parse(result) + end + + ## + # Returns an Array of variables used within the template pattern. + # The variables are listed in the Array in the order they appear within + # the pattern. Multiple occurrences of a variable within a pattern are + # not represented in this Array. + # + # @return [Array] The variables present in the template's pattern. + def variables + @variables ||= ordered_variable_defaults.map { |var, val| var }.uniq + end + alias_method :keys, :variables + alias_method :names, :variables + + ## + # Returns a mapping of variables to their default values specified + # in the template. Variables without defaults are not returned. + # + # @return [Hash] Mapping of template variables to their defaults + def variable_defaults + @variable_defaults ||= + Hash[*ordered_variable_defaults.reject { |k, v| v.nil? }.flatten] + end + + ## + # Coerces a template into a `Regexp` object. This regular expression will + # behave very similarly to the actual template, and should match the same + # URI values, but it cannot fully handle, for example, values that would + # extract to an `Array`. + # + # @return [Regexp] A regular expression which should match the template. + def to_regexp + _, source = parse_template_pattern(pattern) + Regexp.new(source) + end + + ## + # Returns the source of the coerced `Regexp`. + # + # @return [String] The source of the `Regexp` given by {#to_regexp}. + # + # @api private + def source + self.to_regexp.source + end + + ## + # Returns the named captures of the coerced `Regexp`. + # + # @return [Hash] The named captures of the `Regexp` given by {#to_regexp}. + # + # @api private + def named_captures + self.to_regexp.named_captures + end + + ## + # Generates a route result for a given set of parameters. + # Should only be used by rack-mount. + # + # @param params [Hash] The set of parameters used to expand the template. + # @param recall [Hash] Default parameters used to expand the template. + # @param options [Hash] Either a `:processor` or a `:parameterize` block. + # + # @api private + def generate(params={}, recall={}, options={}) + merged = recall.merge(params) + if options[:processor] + processor = options[:processor] + elsif options[:parameterize] + # TODO: This is sending me into fits trying to shoe-horn this into + # the existing API. I think I've got this backwards and processors + # should be a set of 4 optional blocks named :validate, :transform, + # :match, and :restore. Having to use a singleton here is a huge + # code smell. + processor = Object.new + class <validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError exception + # will be raised if the value is invalid. The transform method + # should return the transformed variable value as a String. If a + # transform method is used, the value will not be percent encoded + # automatically. Unicode normalization will be performed both before and + # after sending the value to the transform method. + # + # @return [String] The expanded expression + def transform_partial_capture(mapping, capture, processor = nil, + normalize_values = true) + _, operator, varlist = *capture.match(EXPRESSION) + + vars = varlist.split(',') + + if '?' == operator + # partial expansion of form style query variables sometimes requires a + # slight reordering of the variables to produce a valid url. + first_to_expand = vars.find { |varspec| + _, name, _ = *varspec.match(VARSPEC) + mapping.key? name + } + + vars = [first_to_expand] + vars.reject {|varspec| varspec == first_to_expand} if first_to_expand + end + + vars + .zip(operator_sequence(operator).take(vars.length)) + .reduce("".dup) do |acc, (varspec, op)| + _, name, _ = *varspec.match(VARSPEC) + + acc << if mapping.key? name + transform_capture(mapping, "{#{op}#{varspec}}", + processor, normalize_values) + else + "{#{op}#{varspec}}" + end + end + end + + ## + # Creates a lazy Enumerator of the operators that should be used to expand + # variables in a varlist starting with `operator`. For example, an operator + # `"?"` results in the sequence `"?","&","&"...` + # + # @param [String] operator from which to generate a sequence + # + # @return [Enumerator] sequence of operators + def operator_sequence(operator) + rest_operator = if "?" == operator + "&" + else + operator + end + head_operator = operator + + Enumerator.new do |y| + y << head_operator.to_s + while true + y << rest_operator.to_s + end + end + end + + ## + # Transforms a mapped value so that values can be substituted into the + # template. + # + # @param [Hash] mapping The mapping to replace captures + # @param [String] capture + # The expression to replace + # @param [#validate, #transform] processor + # An optional processor object may be supplied. + # @param [Boolean] normalize_values + # Optional flag to enable/disable unicode normalization. Default: true + # + # + # The object should respond to either the validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError exception + # will be raised if the value is invalid. The transform method + # should return the transformed variable value as a String. If a + # transform method is used, the value will not be percent encoded + # automatically. Unicode normalization will be performed both before and + # after sending the value to the transform method. + # + # @return [String] The expanded expression + def transform_capture(mapping, capture, processor=nil, + normalize_values=true) + _, operator, varlist = *capture.match(EXPRESSION) + return_value = varlist.split(',').inject([]) do |acc, varspec| + _, name, modifier = *varspec.match(VARSPEC) + value = mapping[name] + unless value == nil || value == {} + allow_reserved = %w(+ #).include?(operator) + # Common primitives where the .to_s output is well-defined + if Numeric === value || Symbol === value || + value == true || value == false + value = value.to_s + end + length = modifier.gsub(':', '').to_i if modifier =~ /^:\d+/ + + unless (Hash === value) || + value.respond_to?(:to_ary) || value.respond_to?(:to_str) + raise TypeError, + "Can't convert #{value.class} into String or Array." + end + + value = normalize_value(value) if normalize_values + + if processor == nil || !processor.respond_to?(:transform) + # Handle percent escaping + if allow_reserved + encode_map = + Addressable::URI::CharacterClasses::RESERVED + + Addressable::URI::CharacterClasses::UNRESERVED + else + encode_map = Addressable::URI::CharacterClasses::UNRESERVED + end + if value.kind_of?(Array) + transformed_value = value.map do |val| + if length + Addressable::URI.encode_component(val[0...length], encode_map) + else + Addressable::URI.encode_component(val, encode_map) + end + end + unless modifier == "*" + transformed_value = transformed_value.join(',') + end + elsif value.kind_of?(Hash) + transformed_value = value.map do |key, val| + if modifier == "*" + "#{ + Addressable::URI.encode_component( key, encode_map) + }=#{ + Addressable::URI.encode_component( val, encode_map) + }" + else + "#{ + Addressable::URI.encode_component( key, encode_map) + },#{ + Addressable::URI.encode_component( val, encode_map) + }" + end + end + unless modifier == "*" + transformed_value = transformed_value.join(',') + end + else + if length + transformed_value = Addressable::URI.encode_component( + value[0...length], encode_map) + else + transformed_value = Addressable::URI.encode_component( + value, encode_map) + end + end + end + + # Process, if we've got a processor + if processor != nil + if processor.respond_to?(:validate) + if !processor.validate(name, value) + display_value = value.kind_of?(Array) ? value.inspect : value + raise InvalidTemplateValueError, + "#{name}=#{display_value} is an invalid template value." + end + end + if processor.respond_to?(:transform) + transformed_value = processor.transform(name, value) + if normalize_values + transformed_value = normalize_value(transformed_value) + end + end + end + acc << [name, transformed_value] + end + acc + end + return "" if return_value.empty? + join_values(operator, return_value) + end + + ## + # Takes a set of values, and joins them together based on the + # operator. + # + # @param [String, Nil] operator One of the operators from the set + # (?,&,+,#,;,/,.), or nil if there wasn't one. + # @param [Array] return_value + # The set of return values (as [variable_name, value] tuples) that will + # be joined together. + # + # @return [String] The transformed mapped value + def join_values(operator, return_value) + leader = LEADERS.fetch(operator, '') + joiner = JOINERS.fetch(operator, ',') + case operator + when '&', '?' + leader + return_value.map{|k,v| + if v.is_a?(Array) && v.first =~ /=/ + v.join(joiner) + elsif v.is_a?(Array) + v.map{|inner_value| "#{k}=#{inner_value}"}.join(joiner) + else + "#{k}=#{v}" + end + }.join(joiner) + when ';' + return_value.map{|k,v| + if v.is_a?(Array) && v.first =~ /=/ + ';' + v.join(";") + elsif v.is_a?(Array) + ';' + v.map{|inner_value| "#{k}=#{inner_value}"}.join(";") + else + v && v != '' ? ";#{k}=#{v}" : ";#{k}" + end + }.join + else + leader + return_value.map{|k,v| v}.join(joiner) + end + end + + ## + # Takes a set of values, and joins them together based on the + # operator. + # + # @param [Hash, Array, String] value + # Normalizes keys and values with IDNA#unicode_normalize_kc + # + # @return [Hash, Array, String] The normalized values + def normalize_value(value) + unless value.is_a?(Hash) + value = value.respond_to?(:to_ary) ? value.to_ary : value.to_str + end + + # Handle unicode normalization + if value.kind_of?(Array) + value.map! { |val| Addressable::IDNA.unicode_normalize_kc(val) } + elsif value.kind_of?(Hash) + value = value.inject({}) { |acc, (k, v)| + acc[Addressable::IDNA.unicode_normalize_kc(k)] = + Addressable::IDNA.unicode_normalize_kc(v) + acc + } + else + value = Addressable::IDNA.unicode_normalize_kc(value) + end + value + end + + ## + # Generates a hash with string keys + # + # @param [Hash] mapping A mapping hash to normalize + # + # @return [Hash] + # A hash with stringified keys + def normalize_keys(mapping) + return mapping.inject({}) do |accu, pair| + name, value = pair + if Symbol === name + name = name.to_s + elsif name.respond_to?(:to_str) + name = name.to_str + else + raise TypeError, + "Can't convert #{name.class} into String." + end + accu[name] = value + accu + end + end + + ## + # Generates the Regexp that parses a template pattern. + # + # @param [String] pattern The URI template pattern. + # @param [#match] processor The template processor to use. + # + # @return [Regexp] + # A regular expression which may be used to parse a template pattern. + def parse_template_pattern(pattern, processor=nil) + # Escape the pattern. The two gsubs restore the escaped curly braces + # back to their original form. Basically, escape everything that isn't + # within an expansion. + escaped_pattern = Regexp.escape( + pattern + ).gsub(/\\\{(.*?)\\\}/) do |escaped| + escaped.gsub(/\\(.)/, "\\1") + end + + expansions = [] + + # Create a regular expression that captures the values of the + # variables in the URI. + regexp_string = escaped_pattern.gsub( EXPRESSION ) do |expansion| + + expansions << expansion + _, operator, varlist = *expansion.match(EXPRESSION) + leader = Regexp.escape(LEADERS.fetch(operator, '')) + joiner = Regexp.escape(JOINERS.fetch(operator, ',')) + combined = varlist.split(',').map do |varspec| + _, name, modifier = *varspec.match(VARSPEC) + + result = processor && processor.respond_to?(:match) ? processor.match(name) : nil + if result + "(?<#{name}>#{ result })" + else + group = case operator + when '+' + "#{ RESERVED }*?" + when '#' + "#{ RESERVED }*?" + when '/' + "#{ UNRESERVED }*?" + when '.' + "#{ UNRESERVED.gsub('\.', '') }*?" + when ';' + "#{ UNRESERVED }*=?#{ UNRESERVED }*?" + when '?' + "#{ UNRESERVED }*=#{ UNRESERVED }*?" + when '&' + "#{ UNRESERVED }*=#{ UNRESERVED }*?" + else + "#{ UNRESERVED }*?" + end + if modifier == '*' + "(?<#{name}>#{group}(?:#{joiner}?#{group})*)?" + else + "(?<#{name}>#{group})?" + end + end + end.join("#{joiner}?") + "(?:|#{leader}#{combined})" + end + + # Ensure that the regular expression matches the whole URI. + regexp_string = "^#{regexp_string}$" + return expansions, Regexp.new(regexp_string) + end + + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb new file mode 100644 index 0000000..a4fa1a7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb @@ -0,0 +1,2492 @@ +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +require "addressable/version" +require "addressable/idna" +require "public_suffix" + +## +# Addressable is a library for processing links and URIs. +module Addressable + ## + # This is an implementation of a URI parser based on + # RFC 3986, + # RFC 3987. + class URI + ## + # Raised if something other than a uri is supplied. + class InvalidURIError < StandardError + end + + ## + # Container for the character classes specified in + # RFC 3986. + module CharacterClasses + ALPHA = "a-zA-Z" + DIGIT = "0-9" + GEN_DELIMS = "\\:\\/\\?\\#\\[\\]\\@" + SUB_DELIMS = "\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=" + RESERVED = GEN_DELIMS + SUB_DELIMS + UNRESERVED = ALPHA + DIGIT + "\\-\\.\\_\\~" + PCHAR = UNRESERVED + SUB_DELIMS + "\\:\\@" + SCHEME = ALPHA + DIGIT + "\\-\\+\\." + HOST = UNRESERVED + SUB_DELIMS + "\\[\\:\\]" + AUTHORITY = PCHAR + PATH = PCHAR + "\\/" + QUERY = PCHAR + "\\/\\?" + FRAGMENT = PCHAR + "\\/\\?" + end + + SLASH = '/' + EMPTY_STR = '' + + URIREGEX = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/ + + PORT_MAPPING = { + "http" => 80, + "https" => 443, + "ftp" => 21, + "tftp" => 69, + "sftp" => 22, + "ssh" => 22, + "svn+ssh" => 22, + "telnet" => 23, + "nntp" => 119, + "gopher" => 70, + "wais" => 210, + "ldap" => 389, + "prospero" => 1525 + } + + ## + # Returns a URI object based on the parsed string. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI string to parse. + # No parsing is performed if the object is already an + # Addressable::URI. + # + # @return [Addressable::URI] The parsed URI. + def self.parse(uri) + # If we were given nil, return nil. + return nil unless uri + # If a URI object is passed, just return itself. + return uri.dup if uri.kind_of?(self) + + # If a URI object of the Ruby standard library variety is passed, + # convert it to a string, then parse the string. + # We do the check this way because we don't want to accidentally + # cause a missing constant exception to be thrown. + if uri.class.name =~ /^URI\b/ + uri = uri.to_s + end + + # Otherwise, convert to a String + begin + uri = uri.to_str + rescue TypeError, NoMethodError + raise TypeError, "Can't convert #{uri.class} into String." + end if not uri.is_a? String + + # This Regexp supplied as an example in RFC 3986, and it works great. + scan = uri.scan(URIREGEX) + fragments = scan[0] + scheme = fragments[1] + authority = fragments[3] + path = fragments[4] + query = fragments[6] + fragment = fragments[8] + user = nil + password = nil + host = nil + port = nil + if authority != nil + # The Regexp above doesn't split apart the authority. + userinfo = authority[/^([^\[\]]*)@/, 1] + if userinfo != nil + user = userinfo.strip[/^([^:]*):?/, 1] + password = userinfo.strip[/:(.*)$/, 1] + end + host = authority.gsub( + /^([^\[\]]*)@/, EMPTY_STR + ).gsub( + /:([^:@\[\]]*?)$/, EMPTY_STR + ) + port = authority[/:([^:@\[\]]*?)$/, 1] + end + if port == EMPTY_STR + port = nil + end + + return new( + :scheme => scheme, + :user => user, + :password => password, + :host => host, + :port => port, + :path => path, + :query => query, + :fragment => fragment + ) + end + + ## + # Converts an input to a URI. The input does not have to be a valid + # URI — the method will use heuristics to guess what URI was intended. + # This is not standards-compliant, merely user-friendly. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI string to parse. + # No parsing is performed if the object is already an + # Addressable::URI. + # @param [Hash] hints + # A Hash of hints to the heuristic parser. + # Defaults to {:scheme => "http"}. + # + # @return [Addressable::URI] The parsed URI. + def self.heuristic_parse(uri, hints={}) + # If we were given nil, return nil. + return nil unless uri + # If a URI object is passed, just return itself. + return uri.dup if uri.kind_of?(self) + + # If a URI object of the Ruby standard library variety is passed, + # convert it to a string, then parse the string. + # We do the check this way because we don't want to accidentally + # cause a missing constant exception to be thrown. + if uri.class.name =~ /^URI\b/ + uri = uri.to_s + end + + if !uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{uri.class} into String." + end + # Otherwise, convert to a String + uri = uri.to_str.dup.strip + hints = { + :scheme => "http" + }.merge(hints) + case uri + when /^http:\/+/ + uri.gsub!(/^http:\/+/, "http://") + when /^https:\/+/ + uri.gsub!(/^https:\/+/, "https://") + when /^feed:\/+http:\/+/ + uri.gsub!(/^feed:\/+http:\/+/, "feed:http://") + when /^feed:\/+/ + uri.gsub!(/^feed:\/+/, "feed://") + when /^file:\/+/ + uri.gsub!(/^file:\/+/, "file:///") + when /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ + uri.gsub!(/^/, hints[:scheme] + "://") + end + match = uri.match(URIREGEX) + fragments = match.captures + authority = fragments[3] + if authority && authority.length > 0 + new_authority = authority.gsub(/\\/, '/').gsub(/ /, '%20') + # NOTE: We want offset 4, not 3! + offset = match.offset(4) + uri[offset[0]...offset[1]] = new_authority + end + parsed = self.parse(uri) + if parsed.scheme =~ /^[^\/?#\.]+\.[^\/?#]+$/ + parsed = self.parse(hints[:scheme] + "://" + uri) + end + if parsed.path.include?(".") + new_host = parsed.path[/^([^\/]+\.[^\/]*)/, 1] + if new_host + parsed.defer_validation do + new_path = parsed.path.gsub( + Regexp.new("^" + Regexp.escape(new_host)), EMPTY_STR) + parsed.host = new_host + parsed.path = new_path + parsed.scheme = hints[:scheme] unless parsed.scheme + end + end + end + return parsed + end + + ## + # Converts a path to a file scheme URI. If the path supplied is + # relative, it will be returned as a relative URI. If the path supplied + # is actually a non-file URI, it will parse the URI as if it had been + # parsed with Addressable::URI.parse. Handles all of the + # various Microsoft-specific formats for specifying paths. + # + # @param [String, Addressable::URI, #to_str] path + # Typically a String path to a file or directory, but + # will return a sensible return value if an absolute URI is supplied + # instead. + # + # @return [Addressable::URI] + # The parsed file scheme URI or the original URI if some other URI + # scheme was provided. + # + # @example + # base = Addressable::URI.convert_path("/absolute/path/") + # uri = Addressable::URI.convert_path("relative/path") + # (base + uri).to_s + # #=> "file:///absolute/path/relative/path" + # + # Addressable::URI.convert_path( + # "c:\\windows\\My Documents 100%20\\foo.txt" + # ).to_s + # #=> "file:///c:/windows/My%20Documents%20100%20/foo.txt" + # + # Addressable::URI.convert_path("http://example.com/").to_s + # #=> "http://example.com/" + def self.convert_path(path) + # If we were given nil, return nil. + return nil unless path + # If a URI object is passed, just return itself. + return path if path.kind_of?(self) + if !path.respond_to?(:to_str) + raise TypeError, "Can't convert #{path.class} into String." + end + # Otherwise, convert to a String + path = path.to_str.strip + + path.gsub!(/^file:\/?\/?/, EMPTY_STR) if path =~ /^file:\/?\/?/ + path = SLASH + path if path =~ /^([a-zA-Z])[\|:]/ + uri = self.parse(path) + + if uri.scheme == nil + # Adjust windows-style uris + uri.path.gsub!(/^\/?([a-zA-Z])[\|:][\\\/]/) do + "/#{$1.downcase}:/" + end + uri.path.gsub!(/\\/, SLASH) + if File.exist?(uri.path) && + File.stat(uri.path).directory? + uri.path.gsub!(/\/$/, EMPTY_STR) + uri.path = uri.path + '/' + end + + # If the path is absolute, set the scheme and host. + if uri.path =~ /^\// + uri.scheme = "file" + uri.host = EMPTY_STR + end + uri.normalize! + end + + return uri + end + + ## + # Joins several URIs together. + # + # @param [String, Addressable::URI, #to_str] *uris + # The URIs to join. + # + # @return [Addressable::URI] The joined URI. + # + # @example + # base = "http://example.com/" + # uri = Addressable::URI.parse("relative/path") + # Addressable::URI.join(base, uri) + # #=> # + def self.join(*uris) + uri_objects = uris.collect do |uri| + if !uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{uri.class} into String." + end + uri.kind_of?(self) ? uri : self.parse(uri.to_str) + end + result = uri_objects.shift.dup + for uri in uri_objects + result.join!(uri) + end + return result + end + + ## + # Percent encodes a URI component. + # + # @param [String, #to_str] component The URI component to encode. + # + # @param [String, Regexp] character_class + # The characters which are not percent encoded. If a String + # is passed, the String must be formatted as a regular + # expression character class. (Do not include the surrounding square + # brackets.) For example, "b-zB-Z0-9" would cause + # everything but the letters 'b' through 'z' and the numbers '0' through + # '9' to be percent encoded. If a Regexp is passed, the + # value /[^b-zB-Z0-9]/ would have the same effect. A set of + # useful String values may be found in the + # Addressable::URI::CharacterClasses module. The default + # value is the reserved plus unreserved character classes specified in + # RFC 3986. + # + # @param [Regexp] upcase_encoded + # A string of characters that may already be percent encoded, and whose + # encodings should be upcased. This allows normalization of percent + # encodings for characters not included in the + # character_class. + # + # @return [String] The encoded component. + # + # @example + # Addressable::URI.encode_component("simple/example", "b-zB-Z0-9") + # => "simple%2Fex%61mple" + # Addressable::URI.encode_component("simple/example", /[^b-zB-Z0-9]/) + # => "simple%2Fex%61mple" + # Addressable::URI.encode_component( + # "simple/example", Addressable::URI::CharacterClasses::UNRESERVED + # ) + # => "simple%2Fexample" + def self.encode_component(component, character_class= + CharacterClasses::RESERVED + CharacterClasses::UNRESERVED, + upcase_encoded='') + return nil if component.nil? + + begin + if component.kind_of?(Symbol) || + component.kind_of?(Numeric) || + component.kind_of?(TrueClass) || + component.kind_of?(FalseClass) + component = component.to_s + else + component = component.to_str + end + rescue TypeError, NoMethodError + raise TypeError, "Can't convert #{component.class} into String." + end if !component.is_a? String + + if ![String, Regexp].include?(character_class.class) + raise TypeError, + "Expected String or Regexp, got #{character_class.inspect}" + end + if character_class.kind_of?(String) + character_class = /[^#{character_class}]/ + end + # We can't perform regexps on invalid UTF sequences, but + # here we need to, so switch to ASCII. + component = component.dup + component.force_encoding(Encoding::ASCII_8BIT) + # Avoiding gsub! because there are edge cases with frozen strings + component = component.gsub(character_class) do |sequence| + (sequence.unpack('C*').map { |c| "%" + ("%02x" % c).upcase }).join + end + if upcase_encoded.length > 0 + component = component.gsub(/%(#{upcase_encoded.chars.map do |char| + char.unpack('C*').map { |c| '%02x' % c }.join + end.join('|')})/i) { |s| s.upcase } + end + return component + end + + class << self + alias_method :encode_component, :encode_component + end + + ## + # Unencodes any percent encoded characters within a URI component. + # This method may be used for unencoding either components or full URIs, + # however, it is recommended to use the unencode_component + # alias when unencoding components. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI or component to unencode. + # + # @param [Class] return_type + # The type of object to return. + # This value may only be set to String or + # Addressable::URI. All other values are invalid. Defaults + # to String. + # + # @param [String] leave_encoded + # A string of characters to leave encoded. If a percent encoded character + # in this list is encountered then it will remain percent encoded. + # + # @return [String, Addressable::URI] + # The unencoded component or URI. + # The return type is determined by the return_type + # parameter. + def self.unencode(uri, return_type=String, leave_encoded='') + return nil if uri.nil? + + begin + uri = uri.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{uri.class} into String." + end if !uri.is_a? String + if ![String, ::Addressable::URI].include?(return_type) + raise TypeError, + "Expected Class (String or Addressable::URI), " + + "got #{return_type.inspect}" + end + uri = uri.dup + # Seriously, only use UTF-8. I'm really not kidding! + uri.force_encoding("utf-8") + leave_encoded = leave_encoded.dup.force_encoding("utf-8") + result = uri.gsub(/%[0-9a-f]{2}/iu) do |sequence| + c = sequence[1..3].to_i(16).chr + c.force_encoding("utf-8") + leave_encoded.include?(c) ? sequence : c + end + result.force_encoding("utf-8") + if return_type == String + return result + elsif return_type == ::Addressable::URI + return ::Addressable::URI.parse(result) + end + end + + class << self + alias_method :unescape, :unencode + alias_method :unencode_component, :unencode + alias_method :unescape_component, :unencode + end + + + ## + # Normalizes the encoding of a URI component. + # + # @param [String, #to_str] component The URI component to encode. + # + # @param [String, Regexp] character_class + # The characters which are not percent encoded. If a String + # is passed, the String must be formatted as a regular + # expression character class. (Do not include the surrounding square + # brackets.) For example, "b-zB-Z0-9" would cause + # everything but the letters 'b' through 'z' and the numbers '0' + # through '9' to be percent encoded. If a Regexp is passed, + # the value /[^b-zB-Z0-9]/ would have the same effect. A + # set of useful String values may be found in the + # Addressable::URI::CharacterClasses module. The default + # value is the reserved plus unreserved character classes specified in + # RFC 3986. + # + # @param [String] leave_encoded + # When character_class is a String then + # leave_encoded is a string of characters that should remain + # percent encoded while normalizing the component; if they appear percent + # encoded in the original component, then they will be upcased ("%2f" + # normalized to "%2F") but otherwise left alone. + # + # @return [String] The normalized component. + # + # @example + # Addressable::URI.normalize_component("simpl%65/%65xampl%65", "b-zB-Z") + # => "simple%2Fex%61mple" + # Addressable::URI.normalize_component( + # "simpl%65/%65xampl%65", /[^b-zB-Z]/ + # ) + # => "simple%2Fex%61mple" + # Addressable::URI.normalize_component( + # "simpl%65/%65xampl%65", + # Addressable::URI::CharacterClasses::UNRESERVED + # ) + # => "simple%2Fexample" + # Addressable::URI.normalize_component( + # "one%20two%2fthree%26four", + # "0-9a-zA-Z &/", + # "/" + # ) + # => "one two%2Fthree&four" + def self.normalize_component(component, character_class= + CharacterClasses::RESERVED + CharacterClasses::UNRESERVED, + leave_encoded='') + return nil if component.nil? + + begin + component = component.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{component.class} into String." + end if !component.is_a? String + + if ![String, Regexp].include?(character_class.class) + raise TypeError, + "Expected String or Regexp, got #{character_class.inspect}" + end + if character_class.kind_of?(String) + leave_re = if leave_encoded.length > 0 + character_class = "#{character_class}%" unless character_class.include?('%') + + "|%(?!#{leave_encoded.chars.map do |char| + seq = char.unpack('C*').map { |c| '%02x' % c }.join + [seq.upcase, seq.downcase] + end.flatten.join('|')})" + end + + character_class = /[^#{character_class}]#{leave_re}/ + end + # We can't perform regexps on invalid UTF sequences, but + # here we need to, so switch to ASCII. + component = component.dup + component.force_encoding(Encoding::ASCII_8BIT) + unencoded = self.unencode_component(component, String, leave_encoded) + begin + encoded = self.encode_component( + Addressable::IDNA.unicode_normalize_kc(unencoded), + character_class, + leave_encoded + ) + rescue ArgumentError + encoded = self.encode_component(unencoded) + end + encoded.force_encoding(Encoding::UTF_8) + return encoded + end + + ## + # Percent encodes any special characters in the URI. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI to encode. + # + # @param [Class] return_type + # The type of object to return. + # This value may only be set to String or + # Addressable::URI. All other values are invalid. Defaults + # to String. + # + # @return [String, Addressable::URI] + # The encoded URI. + # The return type is determined by the return_type + # parameter. + def self.encode(uri, return_type=String) + return nil if uri.nil? + + begin + uri = uri.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{uri.class} into String." + end if !uri.is_a? String + + if ![String, ::Addressable::URI].include?(return_type) + raise TypeError, + "Expected Class (String or Addressable::URI), " + + "got #{return_type.inspect}" + end + uri_object = uri.kind_of?(self) ? uri : self.parse(uri) + encoded_uri = Addressable::URI.new( + :scheme => self.encode_component(uri_object.scheme, + Addressable::URI::CharacterClasses::SCHEME), + :authority => self.encode_component(uri_object.authority, + Addressable::URI::CharacterClasses::AUTHORITY), + :path => self.encode_component(uri_object.path, + Addressable::URI::CharacterClasses::PATH), + :query => self.encode_component(uri_object.query, + Addressable::URI::CharacterClasses::QUERY), + :fragment => self.encode_component(uri_object.fragment, + Addressable::URI::CharacterClasses::FRAGMENT) + ) + if return_type == String + return encoded_uri.to_s + elsif return_type == ::Addressable::URI + return encoded_uri + end + end + + class << self + alias_method :escape, :encode + end + + ## + # Normalizes the encoding of a URI. Characters within a hostname are + # not percent encoded to allow for internationalized domain names. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI to encode. + # + # @param [Class] return_type + # The type of object to return. + # This value may only be set to String or + # Addressable::URI. All other values are invalid. Defaults + # to String. + # + # @return [String, Addressable::URI] + # The encoded URI. + # The return type is determined by the return_type + # parameter. + def self.normalized_encode(uri, return_type=String) + begin + uri = uri.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{uri.class} into String." + end if !uri.is_a? String + + if ![String, ::Addressable::URI].include?(return_type) + raise TypeError, + "Expected Class (String or Addressable::URI), " + + "got #{return_type.inspect}" + end + uri_object = uri.kind_of?(self) ? uri : self.parse(uri) + components = { + :scheme => self.unencode_component(uri_object.scheme), + :user => self.unencode_component(uri_object.user), + :password => self.unencode_component(uri_object.password), + :host => self.unencode_component(uri_object.host), + :port => (uri_object.port.nil? ? nil : uri_object.port.to_s), + :path => self.unencode_component(uri_object.path), + :query => self.unencode_component(uri_object.query), + :fragment => self.unencode_component(uri_object.fragment) + } + components.each do |key, value| + if value != nil + begin + components[key] = + Addressable::IDNA.unicode_normalize_kc(value.to_str) + rescue ArgumentError + # Likely a malformed UTF-8 character, skip unicode normalization + components[key] = value.to_str + end + end + end + encoded_uri = Addressable::URI.new( + :scheme => self.encode_component(components[:scheme], + Addressable::URI::CharacterClasses::SCHEME), + :user => self.encode_component(components[:user], + Addressable::URI::CharacterClasses::UNRESERVED), + :password => self.encode_component(components[:password], + Addressable::URI::CharacterClasses::UNRESERVED), + :host => components[:host], + :port => components[:port], + :path => self.encode_component(components[:path], + Addressable::URI::CharacterClasses::PATH), + :query => self.encode_component(components[:query], + Addressable::URI::CharacterClasses::QUERY), + :fragment => self.encode_component(components[:fragment], + Addressable::URI::CharacterClasses::FRAGMENT) + ) + if return_type == String + return encoded_uri.to_s + elsif return_type == ::Addressable::URI + return encoded_uri + end + end + + ## + # Encodes a set of key/value pairs according to the rules for the + # application/x-www-form-urlencoded MIME type. + # + # @param [#to_hash, #to_ary] form_values + # The form values to encode. + # + # @param [TrueClass, FalseClass] sort + # Sort the key/value pairs prior to encoding. + # Defaults to false. + # + # @return [String] + # The encoded value. + def self.form_encode(form_values, sort=false) + if form_values.respond_to?(:to_hash) + form_values = form_values.to_hash.to_a + elsif form_values.respond_to?(:to_ary) + form_values = form_values.to_ary + else + raise TypeError, "Can't convert #{form_values.class} into Array." + end + + form_values = form_values.inject([]) do |accu, (key, value)| + if value.kind_of?(Array) + value.each do |v| + accu << [key.to_s, v.to_s] + end + else + accu << [key.to_s, value.to_s] + end + accu + end + + if sort + # Useful for OAuth and optimizing caching systems + form_values = form_values.sort + end + escaped_form_values = form_values.map do |(key, value)| + # Line breaks are CRLF pairs + [ + self.encode_component( + key.gsub(/(\r\n|\n|\r)/, "\r\n"), + CharacterClasses::UNRESERVED + ).gsub("%20", "+"), + self.encode_component( + value.gsub(/(\r\n|\n|\r)/, "\r\n"), + CharacterClasses::UNRESERVED + ).gsub("%20", "+") + ] + end + return escaped_form_values.map do |(key, value)| + "#{key}=#{value}" + end.join("&") + end + + ## + # Decodes a String according to the rules for the + # application/x-www-form-urlencoded MIME type. + # + # @param [String, #to_str] encoded_value + # The form values to decode. + # + # @return [Array] + # The decoded values. + # This is not a Hash because of the possibility for + # duplicate keys. + def self.form_unencode(encoded_value) + if !encoded_value.respond_to?(:to_str) + raise TypeError, "Can't convert #{encoded_value.class} into String." + end + encoded_value = encoded_value.to_str + split_values = encoded_value.split("&").map do |pair| + pair.split("=", 2) + end + return split_values.map do |(key, value)| + [ + key ? self.unencode_component( + key.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n") : nil, + value ? (self.unencode_component( + value.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n")) : nil + ] + end + end + + ## + # Creates a new uri object from component parts. + # + # @option [String, #to_str] scheme The scheme component. + # @option [String, #to_str] user The user component. + # @option [String, #to_str] password The password component. + # @option [String, #to_str] userinfo + # The userinfo component. If this is supplied, the user and password + # components must be omitted. + # @option [String, #to_str] host The host component. + # @option [String, #to_str] port The port component. + # @option [String, #to_str] authority + # The authority component. If this is supplied, the user, password, + # userinfo, host, and port components must be omitted. + # @option [String, #to_str] path The path component. + # @option [String, #to_str] query The query component. + # @option [String, #to_str] fragment The fragment component. + # + # @return [Addressable::URI] The constructed URI object. + def initialize(options={}) + if options.has_key?(:authority) + if (options.keys & [:userinfo, :user, :password, :host, :port]).any? + raise ArgumentError, + "Cannot specify both an authority and any of the components " + + "within the authority." + end + end + if options.has_key?(:userinfo) + if (options.keys & [:user, :password]).any? + raise ArgumentError, + "Cannot specify both a userinfo and either the user or password." + end + end + + self.defer_validation do + # Bunch of crazy logic required because of the composite components + # like userinfo and authority. + self.scheme = options[:scheme] if options[:scheme] + self.user = options[:user] if options[:user] + self.password = options[:password] if options[:password] + self.userinfo = options[:userinfo] if options[:userinfo] + self.host = options[:host] if options[:host] + self.port = options[:port] if options[:port] + self.authority = options[:authority] if options[:authority] + self.path = options[:path] if options[:path] + self.query = options[:query] if options[:query] + self.query_values = options[:query_values] if options[:query_values] + self.fragment = options[:fragment] if options[:fragment] + end + self.to_s + end + + ## + # Freeze URI, initializing instance variables. + # + # @return [Addressable::URI] The frozen URI object. + def freeze + self.normalized_scheme + self.normalized_user + self.normalized_password + self.normalized_userinfo + self.normalized_host + self.normalized_port + self.normalized_authority + self.normalized_site + self.normalized_path + self.normalized_query + self.normalized_fragment + self.hash + super + end + + ## + # The scheme component for this URI. + # + # @return [String] The scheme component. + def scheme + return defined?(@scheme) ? @scheme : nil + end + + ## + # The scheme component for this URI, normalized. + # + # @return [String] The scheme component, normalized. + def normalized_scheme + return nil unless self.scheme + @normalized_scheme ||= begin + if self.scheme =~ /^\s*ssh\+svn\s*$/i + "svn+ssh".dup + else + Addressable::URI.normalize_component( + self.scheme.strip.downcase, + Addressable::URI::CharacterClasses::SCHEME + ) + end + end + # All normalized values should be UTF-8 + @normalized_scheme.force_encoding(Encoding::UTF_8) if @normalized_scheme + @normalized_scheme + end + + ## + # Sets the scheme component for this URI. + # + # @param [String, #to_str] new_scheme The new scheme component. + def scheme=(new_scheme) + if new_scheme && !new_scheme.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_scheme.class} into String." + elsif new_scheme + new_scheme = new_scheme.to_str + end + if new_scheme && new_scheme !~ /\A[a-z][a-z0-9\.\+\-]*\z/i + raise InvalidURIError, "Invalid scheme format: #{new_scheme}" + end + @scheme = new_scheme + @scheme = nil if @scheme.to_s.strip.empty? + + # Reset dependent values + remove_instance_variable(:@normalized_scheme) if defined?(@normalized_scheme) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The user component for this URI. + # + # @return [String] The user component. + def user + return defined?(@user) ? @user : nil + end + + ## + # The user component for this URI, normalized. + # + # @return [String] The user component, normalized. + def normalized_user + return nil unless self.user + return @normalized_user if defined?(@normalized_user) + @normalized_user ||= begin + if normalized_scheme =~ /https?/ && self.user.strip.empty? && + (!self.password || self.password.strip.empty?) + nil + else + Addressable::URI.normalize_component( + self.user.strip, + Addressable::URI::CharacterClasses::UNRESERVED + ) + end + end + # All normalized values should be UTF-8 + @normalized_user.force_encoding(Encoding::UTF_8) if @normalized_user + @normalized_user + end + + ## + # Sets the user component for this URI. + # + # @param [String, #to_str] new_user The new user component. + def user=(new_user) + if new_user && !new_user.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_user.class} into String." + end + @user = new_user ? new_user.to_str : nil + + # You can't have a nil user with a non-nil password + if password != nil + @user = EMPTY_STR if @user.nil? + end + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_user) if defined?(@normalized_user) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The password component for this URI. + # + # @return [String] The password component. + def password + return defined?(@password) ? @password : nil + end + + ## + # The password component for this URI, normalized. + # + # @return [String] The password component, normalized. + def normalized_password + return nil unless self.password + return @normalized_password if defined?(@normalized_password) + @normalized_password ||= begin + if self.normalized_scheme =~ /https?/ && self.password.strip.empty? && + (!self.user || self.user.strip.empty?) + nil + else + Addressable::URI.normalize_component( + self.password.strip, + Addressable::URI::CharacterClasses::UNRESERVED + ) + end + end + # All normalized values should be UTF-8 + if @normalized_password + @normalized_password.force_encoding(Encoding::UTF_8) + end + @normalized_password + end + + ## + # Sets the password component for this URI. + # + # @param [String, #to_str] new_password The new password component. + def password=(new_password) + if new_password && !new_password.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_password.class} into String." + end + @password = new_password ? new_password.to_str : nil + + # You can't have a nil user with a non-nil password + @password ||= nil + @user ||= nil + if @password != nil + @user = EMPTY_STR if @user.nil? + end + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_password) if defined?(@normalized_password) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The userinfo component for this URI. + # Combines the user and password components. + # + # @return [String] The userinfo component. + def userinfo + current_user = self.user + current_password = self.password + (current_user || current_password) && @userinfo ||= begin + if current_user && current_password + "#{current_user}:#{current_password}" + elsif current_user && !current_password + "#{current_user}" + end + end + end + + ## + # The userinfo component for this URI, normalized. + # + # @return [String] The userinfo component, normalized. + def normalized_userinfo + return nil unless self.userinfo + return @normalized_userinfo if defined?(@normalized_userinfo) + @normalized_userinfo ||= begin + current_user = self.normalized_user + current_password = self.normalized_password + if !current_user && !current_password + nil + elsif current_user && current_password + "#{current_user}:#{current_password}".dup + elsif current_user && !current_password + "#{current_user}".dup + end + end + # All normalized values should be UTF-8 + if @normalized_userinfo + @normalized_userinfo.force_encoding(Encoding::UTF_8) + end + @normalized_userinfo + end + + ## + # Sets the userinfo component for this URI. + # + # @param [String, #to_str] new_userinfo The new userinfo component. + def userinfo=(new_userinfo) + if new_userinfo && !new_userinfo.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_userinfo.class} into String." + end + new_user, new_password = if new_userinfo + [ + new_userinfo.to_str.strip[/^(.*):/, 1], + new_userinfo.to_str.strip[/:(.*)$/, 1] + ] + else + [nil, nil] + end + + # Password assigned first to ensure validity in case of nil + self.password = new_password + self.user = new_user + + # Reset dependent values + remove_instance_variable(:@authority) if defined?(@authority) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The host component for this URI. + # + # @return [String] The host component. + def host + return defined?(@host) ? @host : nil + end + + ## + # The host component for this URI, normalized. + # + # @return [String] The host component, normalized. + def normalized_host + return nil unless self.host + @normalized_host ||= begin + if !self.host.strip.empty? + result = ::Addressable::IDNA.to_ascii( + URI.unencode_component(self.host.strip.downcase) + ) + if result =~ /[^\.]\.$/ + # Single trailing dots are unnecessary. + result = result[0...-1] + end + result = Addressable::URI.normalize_component( + result, + CharacterClasses::HOST) + result + else + EMPTY_STR.dup + end + end + # All normalized values should be UTF-8 + @normalized_host.force_encoding(Encoding::UTF_8) if @normalized_host + @normalized_host + end + + ## + # Sets the host component for this URI. + # + # @param [String, #to_str] new_host The new host component. + def host=(new_host) + if new_host && !new_host.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_host.class} into String." + end + @host = new_host ? new_host.to_str : nil + + # Reset dependent values + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_host) if defined?(@normalized_host) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # This method is same as URI::Generic#host except + # brackets for IPv6 (and 'IPvFuture') addresses are removed. + # + # @see Addressable::URI#host + # + # @return [String] The hostname for this URI. + def hostname + v = self.host + /\A\[(.*)\]\z/ =~ v ? $1 : v + end + + ## + # This method is same as URI::Generic#host= except + # the argument can be a bare IPv6 address (or 'IPvFuture'). + # + # @see Addressable::URI#host= + # + # @param [String, #to_str] new_hostname The new hostname for this URI. + def hostname=(new_hostname) + if new_hostname && + (new_hostname.respond_to?(:ipv4?) || new_hostname.respond_to?(:ipv6?)) + new_hostname = new_hostname.to_s + elsif new_hostname && !new_hostname.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_hostname.class} into String." + end + v = new_hostname ? new_hostname.to_str : nil + v = "[#{v}]" if /\A\[.*\]\z/ !~ v && /:/ =~ v + self.host = v + end + + ## + # Returns the top-level domain for this host. + # + # @example + # Addressable::URI.parse("www.example.co.uk").tld # => "co.uk" + def tld + PublicSuffix.parse(self.host, ignore_private: true).tld + end + + ## + # Returns the public suffix domain for this host. + # + # @example + # Addressable::URI.parse("www.example.co.uk").domain # => "example.co.uk" + def domain + PublicSuffix.domain(self.host, ignore_private: true) + end + + ## + # The authority component for this URI. + # Combines the user, password, host, and port components. + # + # @return [String] The authority component. + def authority + self.host && @authority ||= begin + authority = String.new + if self.userinfo != nil + authority << "#{self.userinfo}@" + end + authority << self.host + if self.port != nil + authority << ":#{self.port}" + end + authority + end + end + + ## + # The authority component for this URI, normalized. + # + # @return [String] The authority component, normalized. + def normalized_authority + return nil unless self.authority + @normalized_authority ||= begin + authority = String.new + if self.normalized_userinfo != nil + authority << "#{self.normalized_userinfo}@" + end + authority << self.normalized_host + if self.normalized_port != nil + authority << ":#{self.normalized_port}" + end + authority + end + # All normalized values should be UTF-8 + if @normalized_authority + @normalized_authority.force_encoding(Encoding::UTF_8) + end + @normalized_authority + end + + ## + # Sets the authority component for this URI. + # + # @param [String, #to_str] new_authority The new authority component. + def authority=(new_authority) + if new_authority + if !new_authority.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_authority.class} into String." + end + new_authority = new_authority.to_str + new_userinfo = new_authority[/^([^\[\]]*)@/, 1] + if new_userinfo + new_user = new_userinfo.strip[/^([^:]*):?/, 1] + new_password = new_userinfo.strip[/:(.*)$/, 1] + end + new_host = new_authority.gsub( + /^([^\[\]]*)@/, EMPTY_STR + ).gsub( + /:([^:@\[\]]*?)$/, EMPTY_STR + ) + new_port = + new_authority[/:([^:@\[\]]*?)$/, 1] + end + + # Password assigned first to ensure validity in case of nil + self.password = defined?(new_password) ? new_password : nil + self.user = defined?(new_user) ? new_user : nil + self.host = defined?(new_host) ? new_host : nil + self.port = defined?(new_port) ? new_port : nil + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The origin for this URI, serialized to ASCII, as per + # RFC 6454, section 6.2. + # + # @return [String] The serialized origin. + def origin + if self.scheme && self.authority + if self.normalized_port + "#{self.normalized_scheme}://#{self.normalized_host}" + + ":#{self.normalized_port}" + else + "#{self.normalized_scheme}://#{self.normalized_host}" + end + else + "null" + end + end + + ## + # Sets the origin for this URI, serialized to ASCII, as per + # RFC 6454, section 6.2. This assignment will reset the `userinfo` + # component. + # + # @param [String, #to_str] new_origin The new origin component. + def origin=(new_origin) + if new_origin + if !new_origin.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_origin.class} into String." + end + new_origin = new_origin.to_str + new_scheme = new_origin[/^([^:\/?#]+):\/\//, 1] + unless new_scheme + raise InvalidURIError, 'An origin cannot omit the scheme.' + end + new_host = new_origin[/:\/\/([^\/?#:]+)/, 1] + unless new_host + raise InvalidURIError, 'An origin cannot omit the host.' + end + new_port = new_origin[/:([^:@\[\]\/]*?)$/, 1] + end + + self.scheme = defined?(new_scheme) ? new_scheme : nil + self.host = defined?(new_host) ? new_host : nil + self.port = defined?(new_port) ? new_port : nil + self.userinfo = nil + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_authority) if defined?(@normalized_authority) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + # Returns an array of known ip-based schemes. These schemes typically + # use a similar URI form: + # //:@:/ + def self.ip_based_schemes + return self.port_mapping.keys + end + + # Returns a hash of common IP-based schemes and their default port + # numbers. Adding new schemes to this hash, as necessary, will allow + # for better URI normalization. + def self.port_mapping + PORT_MAPPING + end + + ## + # The port component for this URI. + # This is the port number actually given in the URI. This does not + # infer port numbers from default values. + # + # @return [Integer] The port component. + def port + return defined?(@port) ? @port : nil + end + + ## + # The port component for this URI, normalized. + # + # @return [Integer] The port component, normalized. + def normalized_port + return nil unless self.port + return @normalized_port if defined?(@normalized_port) + @normalized_port ||= begin + if URI.port_mapping[self.normalized_scheme] == self.port + nil + else + self.port + end + end + end + + ## + # Sets the port component for this URI. + # + # @param [String, Integer, #to_s] new_port The new port component. + def port=(new_port) + if new_port != nil && new_port.respond_to?(:to_str) + new_port = Addressable::URI.unencode_component(new_port.to_str) + end + + if new_port.respond_to?(:valid_encoding?) && !new_port.valid_encoding? + raise InvalidURIError, "Invalid encoding in port" + end + + if new_port != nil && !(new_port.to_s =~ /^\d+$/) + raise InvalidURIError, + "Invalid port number: #{new_port.inspect}" + end + + @port = new_port.to_s.to_i + @port = nil if @port == 0 + + # Reset dependent values + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_port) if defined?(@normalized_port) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The inferred port component for this URI. + # This method will normalize to the default port for the URI's scheme if + # the port isn't explicitly specified in the URI. + # + # @return [Integer] The inferred port component. + def inferred_port + if self.port.to_i == 0 + self.default_port + else + self.port.to_i + end + end + + ## + # The default port for this URI's scheme. + # This method will always returns the default port for the URI's scheme + # regardless of the presence of an explicit port in the URI. + # + # @return [Integer] The default port. + def default_port + URI.port_mapping[self.scheme.strip.downcase] if self.scheme + end + + ## + # The combination of components that represent a site. + # Combines the scheme, user, password, host, and port components. + # Primarily useful for HTTP and HTTPS. + # + # For example, "http://example.com/path?query" would have a + # site value of "http://example.com". + # + # @return [String] The components that identify a site. + def site + (self.scheme || self.authority) && @site ||= begin + site_string = "".dup + site_string << "#{self.scheme}:" if self.scheme != nil + site_string << "//#{self.authority}" if self.authority != nil + site_string + end + end + + ## + # The normalized combination of components that represent a site. + # Combines the scheme, user, password, host, and port components. + # Primarily useful for HTTP and HTTPS. + # + # For example, "http://example.com/path?query" would have a + # site value of "http://example.com". + # + # @return [String] The normalized components that identify a site. + def normalized_site + return nil unless self.site + @normalized_site ||= begin + site_string = "".dup + if self.normalized_scheme != nil + site_string << "#{self.normalized_scheme}:" + end + if self.normalized_authority != nil + site_string << "//#{self.normalized_authority}" + end + site_string + end + # All normalized values should be UTF-8 + @normalized_site.force_encoding(Encoding::UTF_8) if @normalized_site + @normalized_site + end + + ## + # Sets the site value for this URI. + # + # @param [String, #to_str] new_site The new site value. + def site=(new_site) + if new_site + if !new_site.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_site.class} into String." + end + new_site = new_site.to_str + # These two regular expressions derived from the primary parsing + # expression + self.scheme = new_site[/^(?:([^:\/?#]+):)?(?:\/\/(?:[^\/?#]*))?$/, 1] + self.authority = new_site[ + /^(?:(?:[^:\/?#]+):)?(?:\/\/([^\/?#]*))?$/, 1 + ] + else + self.scheme = nil + self.authority = nil + end + end + + ## + # The path component for this URI. + # + # @return [String] The path component. + def path + return defined?(@path) ? @path : EMPTY_STR + end + + NORMPATH = /^(?!\/)[^\/:]*:.*$/ + ## + # The path component for this URI, normalized. + # + # @return [String] The path component, normalized. + def normalized_path + @normalized_path ||= begin + path = self.path.to_s + if self.scheme == nil && path =~ NORMPATH + # Relative paths with colons in the first segment are ambiguous. + path = path.sub(":", "%2F") + end + # String#split(delimeter, -1) uses the more strict splitting behavior + # found by default in Python. + result = path.strip.split(SLASH, -1).map do |segment| + Addressable::URI.normalize_component( + segment, + Addressable::URI::CharacterClasses::PCHAR + ) + end.join(SLASH) + + result = URI.normalize_path(result) + if result.empty? && + ["http", "https", "ftp", "tftp"].include?(self.normalized_scheme) + result = SLASH.dup + end + result + end + # All normalized values should be UTF-8 + @normalized_path.force_encoding(Encoding::UTF_8) if @normalized_path + @normalized_path + end + + ## + # Sets the path component for this URI. + # + # @param [String, #to_str] new_path The new path component. + def path=(new_path) + if new_path && !new_path.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_path.class} into String." + end + @path = (new_path || EMPTY_STR).to_str + if !@path.empty? && @path[0..0] != SLASH && host != nil + @path = "/#{@path}" + end + + # Reset dependent values + remove_instance_variable(:@normalized_path) if defined?(@normalized_path) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The basename, if any, of the file in the path component. + # + # @return [String] The path's basename. + def basename + # Path cannot be nil + return File.basename(self.path).gsub(/;[^\/]*$/, EMPTY_STR) + end + + ## + # The extname, if any, of the file in the path component. + # Empty string if there is no extension. + # + # @return [String] The path's extname. + def extname + return nil unless self.path + return File.extname(self.basename) + end + + ## + # The query component for this URI. + # + # @return [String] The query component. + def query + return defined?(@query) ? @query : nil + end + + ## + # The query component for this URI, normalized. + # + # @return [String] The query component, normalized. + def normalized_query(*flags) + return nil unless self.query + return @normalized_query if defined?(@normalized_query) + @normalized_query ||= begin + modified_query_class = Addressable::URI::CharacterClasses::QUERY.dup + # Make sure possible key-value pair delimiters are escaped. + modified_query_class.sub!("\\&", "").sub!("\\;", "") + pairs = (self.query || "").split("&", -1) + pairs.sort! if flags.include?(:sorted) + component = pairs.map do |pair| + Addressable::URI.normalize_component(pair, modified_query_class, "+") + end.join("&") + component == "" ? nil : component + end + # All normalized values should be UTF-8 + @normalized_query.force_encoding(Encoding::UTF_8) if @normalized_query + @normalized_query + end + + ## + # Sets the query component for this URI. + # + # @param [String, #to_str] new_query The new query component. + def query=(new_query) + if new_query && !new_query.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_query.class} into String." + end + @query = new_query ? new_query.to_str : nil + + # Reset dependent values + remove_instance_variable(:@normalized_query) if defined?(@normalized_query) + remove_composite_values + end + + ## + # Converts the query component to a Hash value. + # + # @param [Class] return_type The return type desired. Value must be either + # `Hash` or `Array`. + # + # @return [Hash, Array, nil] The query string parsed as a Hash or Array + # or nil if the query string is blank. + # + # @example + # Addressable::URI.parse("?one=1&two=2&three=3").query_values + # #=> {"one" => "1", "two" => "2", "three" => "3"} + # Addressable::URI.parse("?one=two&one=three").query_values(Array) + # #=> [["one", "two"], ["one", "three"]] + # Addressable::URI.parse("?one=two&one=three").query_values(Hash) + # #=> {"one" => "three"} + # Addressable::URI.parse("?").query_values + # #=> {} + # Addressable::URI.parse("").query_values + # #=> nil + def query_values(return_type=Hash) + empty_accumulator = Array == return_type ? [] : {} + if return_type != Hash && return_type != Array + raise ArgumentError, "Invalid return type. Must be Hash or Array." + end + return nil if self.query == nil + split_query = self.query.split("&").map do |pair| + pair.split("=", 2) if pair && !pair.empty? + end.compact + return split_query.inject(empty_accumulator.dup) do |accu, pair| + # I'd rather use key/value identifiers instead of array lookups, + # but in this case I really want to maintain the exact pair structure, + # so it's best to make all changes in-place. + pair[0] = URI.unencode_component(pair[0]) + if pair[1].respond_to?(:to_str) + # I loathe the fact that I have to do this. Stupid HTML 4.01. + # Treating '+' as a space was just an unbelievably bad idea. + # There was nothing wrong with '%20'! + # If it ain't broke, don't fix it! + pair[1] = URI.unencode_component(pair[1].to_str.gsub(/\+/, " ")) + end + if return_type == Hash + accu[pair[0]] = pair[1] + else + accu << pair + end + accu + end + end + + ## + # Sets the query component for this URI from a Hash object. + # An empty Hash or Array will result in an empty query string. + # + # @param [Hash, #to_hash, Array] new_query_values The new query values. + # + # @example + # uri.query_values = {:a => "a", :b => ["c", "d", "e"]} + # uri.query + # # => "a=a&b=c&b=d&b=e" + # uri.query_values = [['a', 'a'], ['b', 'c'], ['b', 'd'], ['b', 'e']] + # uri.query + # # => "a=a&b=c&b=d&b=e" + # uri.query_values = [['a', 'a'], ['b', ['c', 'd', 'e']]] + # uri.query + # # => "a=a&b=c&b=d&b=e" + # uri.query_values = [['flag'], ['key', 'value']] + # uri.query + # # => "flag&key=value" + def query_values=(new_query_values) + if new_query_values == nil + self.query = nil + return nil + end + + if !new_query_values.is_a?(Array) + if !new_query_values.respond_to?(:to_hash) + raise TypeError, + "Can't convert #{new_query_values.class} into Hash." + end + new_query_values = new_query_values.to_hash + new_query_values = new_query_values.map do |key, value| + key = key.to_s if key.kind_of?(Symbol) + [key, value] + end + # Useful default for OAuth and caching. + # Only to be used for non-Array inputs. Arrays should preserve order. + new_query_values.sort! + end + + # new_query_values have form [['key1', 'value1'], ['key2', 'value2']] + buffer = "".dup + new_query_values.each do |key, value| + encoded_key = URI.encode_component( + key, CharacterClasses::UNRESERVED + ) + if value == nil + buffer << "#{encoded_key}&" + elsif value.kind_of?(Array) + value.each do |sub_value| + encoded_value = URI.encode_component( + sub_value, CharacterClasses::UNRESERVED + ) + buffer << "#{encoded_key}=#{encoded_value}&" + end + else + encoded_value = URI.encode_component( + value, CharacterClasses::UNRESERVED + ) + buffer << "#{encoded_key}=#{encoded_value}&" + end + end + self.query = buffer.chop + end + + ## + # The HTTP request URI for this URI. This is the path and the + # query string. + # + # @return [String] The request URI required for an HTTP request. + def request_uri + return nil if self.absolute? && self.scheme !~ /^https?$/i + return ( + (!self.path.empty? ? self.path : SLASH) + + (self.query ? "?#{self.query}" : EMPTY_STR) + ) + end + + ## + # Sets the HTTP request URI for this URI. + # + # @param [String, #to_str] new_request_uri The new HTTP request URI. + def request_uri=(new_request_uri) + if !new_request_uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_request_uri.class} into String." + end + if self.absolute? && self.scheme !~ /^https?$/i + raise InvalidURIError, + "Cannot set an HTTP request URI for a non-HTTP URI." + end + new_request_uri = new_request_uri.to_str + path_component = new_request_uri[/^([^\?]*)\?(?:.*)$/, 1] + query_component = new_request_uri[/^(?:[^\?]*)\?(.*)$/, 1] + path_component = path_component.to_s + path_component = (!path_component.empty? ? path_component : SLASH) + self.path = path_component + self.query = query_component + + # Reset dependent values + remove_composite_values + end + + ## + # The fragment component for this URI. + # + # @return [String] The fragment component. + def fragment + return defined?(@fragment) ? @fragment : nil + end + + ## + # The fragment component for this URI, normalized. + # + # @return [String] The fragment component, normalized. + def normalized_fragment + return nil unless self.fragment + return @normalized_fragment if defined?(@normalized_fragment) + @normalized_fragment ||= begin + component = Addressable::URI.normalize_component( + self.fragment, + Addressable::URI::CharacterClasses::FRAGMENT + ) + component == "" ? nil : component + end + # All normalized values should be UTF-8 + if @normalized_fragment + @normalized_fragment.force_encoding(Encoding::UTF_8) + end + @normalized_fragment + end + + ## + # Sets the fragment component for this URI. + # + # @param [String, #to_str] new_fragment The new fragment component. + def fragment=(new_fragment) + if new_fragment && !new_fragment.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_fragment.class} into String." + end + @fragment = new_fragment ? new_fragment.to_str : nil + + # Reset dependent values + remove_instance_variable(:@normalized_fragment) if defined?(@normalized_fragment) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # Determines if the scheme indicates an IP-based protocol. + # + # @return [TrueClass, FalseClass] + # true if the scheme indicates an IP-based protocol. + # false otherwise. + def ip_based? + if self.scheme + return URI.ip_based_schemes.include?( + self.scheme.strip.downcase) + end + return false + end + + ## + # Determines if the URI is relative. + # + # @return [TrueClass, FalseClass] + # true if the URI is relative. false + # otherwise. + def relative? + return self.scheme.nil? + end + + ## + # Determines if the URI is absolute. + # + # @return [TrueClass, FalseClass] + # true if the URI is absolute. false + # otherwise. + def absolute? + return !relative? + end + + ## + # Joins two URIs together. + # + # @param [String, Addressable::URI, #to_str] The URI to join with. + # + # @return [Addressable::URI] The joined URI. + def join(uri) + if !uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{uri.class} into String." + end + if !uri.kind_of?(URI) + # Otherwise, convert to a String, then parse. + uri = URI.parse(uri.to_str) + end + if uri.to_s.empty? + return self.dup + end + + joined_scheme = nil + joined_user = nil + joined_password = nil + joined_host = nil + joined_port = nil + joined_path = nil + joined_query = nil + joined_fragment = nil + + # Section 5.2.2 of RFC 3986 + if uri.scheme != nil + joined_scheme = uri.scheme + joined_user = uri.user + joined_password = uri.password + joined_host = uri.host + joined_port = uri.port + joined_path = URI.normalize_path(uri.path) + joined_query = uri.query + else + if uri.authority != nil + joined_user = uri.user + joined_password = uri.password + joined_host = uri.host + joined_port = uri.port + joined_path = URI.normalize_path(uri.path) + joined_query = uri.query + else + if uri.path == nil || uri.path.empty? + joined_path = self.path + if uri.query != nil + joined_query = uri.query + else + joined_query = self.query + end + else + if uri.path[0..0] == SLASH + joined_path = URI.normalize_path(uri.path) + else + base_path = self.path.dup + base_path = EMPTY_STR if base_path == nil + base_path = URI.normalize_path(base_path) + + # Section 5.2.3 of RFC 3986 + # + # Removes the right-most path segment from the base path. + if base_path =~ /\// + base_path.gsub!(/\/[^\/]+$/, SLASH) + else + base_path = EMPTY_STR + end + + # If the base path is empty and an authority segment has been + # defined, use a base path of SLASH + if base_path.empty? && self.authority != nil + base_path = SLASH + end + + joined_path = URI.normalize_path(base_path + uri.path) + end + joined_query = uri.query + end + joined_user = self.user + joined_password = self.password + joined_host = self.host + joined_port = self.port + end + joined_scheme = self.scheme + end + joined_fragment = uri.fragment + + return self.class.new( + :scheme => joined_scheme, + :user => joined_user, + :password => joined_password, + :host => joined_host, + :port => joined_port, + :path => joined_path, + :query => joined_query, + :fragment => joined_fragment + ) + end + alias_method :+, :join + + ## + # Destructive form of join. + # + # @param [String, Addressable::URI, #to_str] The URI to join with. + # + # @return [Addressable::URI] The joined URI. + # + # @see Addressable::URI#join + def join!(uri) + replace_self(self.join(uri)) + end + + ## + # Merges a URI with a Hash of components. + # This method has different behavior from join. Any + # components present in the hash parameter will override the + # original components. The path component is not treated specially. + # + # @param [Hash, Addressable::URI, #to_hash] The components to merge with. + # + # @return [Addressable::URI] The merged URI. + # + # @see Hash#merge + def merge(hash) + if !hash.respond_to?(:to_hash) + raise TypeError, "Can't convert #{hash.class} into Hash." + end + hash = hash.to_hash + + if hash.has_key?(:authority) + if (hash.keys & [:userinfo, :user, :password, :host, :port]).any? + raise ArgumentError, + "Cannot specify both an authority and any of the components " + + "within the authority." + end + end + if hash.has_key?(:userinfo) + if (hash.keys & [:user, :password]).any? + raise ArgumentError, + "Cannot specify both a userinfo and either the user or password." + end + end + + uri = self.class.new + uri.defer_validation do + # Bunch of crazy logic required because of the composite components + # like userinfo and authority. + uri.scheme = + hash.has_key?(:scheme) ? hash[:scheme] : self.scheme + if hash.has_key?(:authority) + uri.authority = + hash.has_key?(:authority) ? hash[:authority] : self.authority + end + if hash.has_key?(:userinfo) + uri.userinfo = + hash.has_key?(:userinfo) ? hash[:userinfo] : self.userinfo + end + if !hash.has_key?(:userinfo) && !hash.has_key?(:authority) + uri.user = + hash.has_key?(:user) ? hash[:user] : self.user + uri.password = + hash.has_key?(:password) ? hash[:password] : self.password + end + if !hash.has_key?(:authority) + uri.host = + hash.has_key?(:host) ? hash[:host] : self.host + uri.port = + hash.has_key?(:port) ? hash[:port] : self.port + end + uri.path = + hash.has_key?(:path) ? hash[:path] : self.path + uri.query = + hash.has_key?(:query) ? hash[:query] : self.query + uri.fragment = + hash.has_key?(:fragment) ? hash[:fragment] : self.fragment + end + + return uri + end + + ## + # Destructive form of merge. + # + # @param [Hash, Addressable::URI, #to_hash] The components to merge with. + # + # @return [Addressable::URI] The merged URI. + # + # @see Addressable::URI#merge + def merge!(uri) + replace_self(self.merge(uri)) + end + + ## + # Returns the shortest normalized relative form of this URI that uses the + # supplied URI as a base for resolution. Returns an absolute URI if + # necessary. This is effectively the opposite of route_to. + # + # @param [String, Addressable::URI, #to_str] uri The URI to route from. + # + # @return [Addressable::URI] + # The normalized relative URI that is equivalent to the original URI. + def route_from(uri) + uri = URI.parse(uri).normalize + normalized_self = self.normalize + if normalized_self.relative? + raise ArgumentError, "Expected absolute URI, got: #{self.to_s}" + end + if uri.relative? + raise ArgumentError, "Expected absolute URI, got: #{uri.to_s}" + end + if normalized_self == uri + return Addressable::URI.parse("##{normalized_self.fragment}") + end + components = normalized_self.to_hash + if normalized_self.scheme == uri.scheme + components[:scheme] = nil + if normalized_self.authority == uri.authority + components[:user] = nil + components[:password] = nil + components[:host] = nil + components[:port] = nil + if normalized_self.path == uri.path + components[:path] = nil + if normalized_self.query == uri.query + components[:query] = nil + end + else + if uri.path != SLASH and components[:path] + self_splitted_path = split_path(components[:path]) + uri_splitted_path = split_path(uri.path) + self_dir = self_splitted_path.shift + uri_dir = uri_splitted_path.shift + while !self_splitted_path.empty? && !uri_splitted_path.empty? and self_dir == uri_dir + self_dir = self_splitted_path.shift + uri_dir = uri_splitted_path.shift + end + components[:path] = (uri_splitted_path.fill('..') + [self_dir] + self_splitted_path).join(SLASH) + end + end + end + end + # Avoid network-path references. + if components[:host] != nil + components[:scheme] = normalized_self.scheme + end + return Addressable::URI.new( + :scheme => components[:scheme], + :user => components[:user], + :password => components[:password], + :host => components[:host], + :port => components[:port], + :path => components[:path], + :query => components[:query], + :fragment => components[:fragment] + ) + end + + ## + # Returns the shortest normalized relative form of the supplied URI that + # uses this URI as a base for resolution. Returns an absolute URI if + # necessary. This is effectively the opposite of route_from. + # + # @param [String, Addressable::URI, #to_str] uri The URI to route to. + # + # @return [Addressable::URI] + # The normalized relative URI that is equivalent to the supplied URI. + def route_to(uri) + return URI.parse(uri).route_from(self) + end + + ## + # Returns a normalized URI object. + # + # NOTE: This method does not attempt to fully conform to specifications. + # It exists largely to correct other people's failures to read the + # specifications, and also to deal with caching issues since several + # different URIs may represent the same resource and should not be + # cached multiple times. + # + # @return [Addressable::URI] The normalized URI. + def normalize + # This is a special exception for the frequently misused feed + # URI scheme. + if normalized_scheme == "feed" + if self.to_s =~ /^feed:\/*http:\/*/ + return URI.parse( + self.to_s[/^feed:\/*(http:\/*.*)/, 1] + ).normalize + end + end + + return self.class.new( + :scheme => normalized_scheme, + :authority => normalized_authority, + :path => normalized_path, + :query => normalized_query, + :fragment => normalized_fragment + ) + end + + ## + # Destructively normalizes this URI object. + # + # @return [Addressable::URI] The normalized URI. + # + # @see Addressable::URI#normalize + def normalize! + replace_self(self.normalize) + end + + ## + # Creates a URI suitable for display to users. If semantic attacks are + # likely, the application should try to detect these and warn the user. + # See RFC 3986, + # section 7.6 for more information. + # + # @return [Addressable::URI] A URI suitable for display purposes. + def display_uri + display_uri = self.normalize + display_uri.host = ::Addressable::IDNA.to_unicode(display_uri.host) + return display_uri + end + + ## + # Returns true if the URI objects are equal. This method + # normalizes both URIs before doing the comparison, and allows comparison + # against Strings. + # + # @param [Object] uri The URI to compare. + # + # @return [TrueClass, FalseClass] + # true if the URIs are equivalent, false + # otherwise. + def ===(uri) + if uri.respond_to?(:normalize) + uri_string = uri.normalize.to_s + else + begin + uri_string = ::Addressable::URI.parse(uri).normalize.to_s + rescue InvalidURIError, TypeError + return false + end + end + return self.normalize.to_s == uri_string + end + + ## + # Returns true if the URI objects are equal. This method + # normalizes both URIs before doing the comparison. + # + # @param [Object] uri The URI to compare. + # + # @return [TrueClass, FalseClass] + # true if the URIs are equivalent, false + # otherwise. + def ==(uri) + return false unless uri.kind_of?(URI) + return self.normalize.to_s == uri.normalize.to_s + end + + ## + # Returns true if the URI objects are equal. This method + # does NOT normalize either URI before doing the comparison. + # + # @param [Object] uri The URI to compare. + # + # @return [TrueClass, FalseClass] + # true if the URIs are equivalent, false + # otherwise. + def eql?(uri) + return false unless uri.kind_of?(URI) + return self.to_s == uri.to_s + end + + ## + # A hash value that will make a URI equivalent to its normalized + # form. + # + # @return [Integer] A hash of the URI. + def hash + @hash ||= self.to_s.hash * -1 + end + + ## + # Clones the URI object. + # + # @return [Addressable::URI] The cloned URI. + def dup + duplicated_uri = self.class.new( + :scheme => self.scheme ? self.scheme.dup : nil, + :user => self.user ? self.user.dup : nil, + :password => self.password ? self.password.dup : nil, + :host => self.host ? self.host.dup : nil, + :port => self.port, + :path => self.path ? self.path.dup : nil, + :query => self.query ? self.query.dup : nil, + :fragment => self.fragment ? self.fragment.dup : nil + ) + return duplicated_uri + end + + ## + # Omits components from a URI. + # + # @param [Symbol] *components The components to be omitted. + # + # @return [Addressable::URI] The URI with components omitted. + # + # @example + # uri = Addressable::URI.parse("http://example.com/path?query") + # #=> # + # uri.omit(:scheme, :authority) + # #=> # + def omit(*components) + invalid_components = components - [ + :scheme, :user, :password, :userinfo, :host, :port, :authority, + :path, :query, :fragment + ] + unless invalid_components.empty? + raise ArgumentError, + "Invalid component names: #{invalid_components.inspect}." + end + duplicated_uri = self.dup + duplicated_uri.defer_validation do + components.each do |component| + duplicated_uri.send((component.to_s + "=").to_sym, nil) + end + duplicated_uri.user = duplicated_uri.normalized_user + end + duplicated_uri + end + + ## + # Destructive form of omit. + # + # @param [Symbol] *components The components to be omitted. + # + # @return [Addressable::URI] The URI with components omitted. + # + # @see Addressable::URI#omit + def omit!(*components) + replace_self(self.omit(*components)) + end + + ## + # Determines if the URI is an empty string. + # + # @return [TrueClass, FalseClass] + # Returns true if empty, false otherwise. + def empty? + return self.to_s.empty? + end + + ## + # Converts the URI to a String. + # + # @return [String] The URI's String representation. + def to_s + if self.scheme == nil && self.path != nil && !self.path.empty? && + self.path =~ NORMPATH + raise InvalidURIError, + "Cannot assemble URI string with ambiguous path: '#{self.path}'" + end + @uri_string ||= begin + uri_string = String.new + uri_string << "#{self.scheme}:" if self.scheme != nil + uri_string << "//#{self.authority}" if self.authority != nil + uri_string << self.path.to_s + uri_string << "?#{self.query}" if self.query != nil + uri_string << "##{self.fragment}" if self.fragment != nil + uri_string.force_encoding(Encoding::UTF_8) + uri_string + end + end + + ## + # URI's are glorified Strings. Allow implicit conversion. + alias_method :to_str, :to_s + + ## + # Returns a Hash of the URI components. + # + # @return [Hash] The URI as a Hash of components. + def to_hash + return { + :scheme => self.scheme, + :user => self.user, + :password => self.password, + :host => self.host, + :port => self.port, + :path => self.path, + :query => self.query, + :fragment => self.fragment + } + end + + ## + # Returns a String representation of the URI object's state. + # + # @return [String] The URI object's state, as a String. + def inspect + sprintf("#<%s:%#0x URI:%s>", URI.to_s, self.object_id, self.to_s) + end + + ## + # This method allows you to make several changes to a URI simultaneously, + # which separately would cause validation errors, but in conjunction, + # are valid. The URI will be revalidated as soon as the entire block has + # been executed. + # + # @param [Proc] block + # A set of operations to perform on a given URI. + def defer_validation(&block) + raise LocalJumpError, "No block given." unless block + @validation_deferred = true + block.call() + @validation_deferred = false + validate + return nil + end + + protected + SELF_REF = '.' + PARENT = '..' + + RULE_2A = /\/\.\/|\/\.$/ + RULE_2B_2C = /\/([^\/]*)\/\.\.\/|\/([^\/]*)\/\.\.$/ + RULE_2D = /^\.\.?\/?/ + RULE_PREFIXED_PARENT = /^\/\.\.?\/|^(\/\.\.?)+\/?$/ + + ## + # Resolves paths to their simplest form. + # + # @param [String] path The path to normalize. + # + # @return [String] The normalized path. + def self.normalize_path(path) + # Section 5.2.4 of RFC 3986 + + return nil if path.nil? + normalized_path = path.dup + begin + mod = nil + mod ||= normalized_path.gsub!(RULE_2A, SLASH) + + pair = normalized_path.match(RULE_2B_2C) + parent, current = pair[1], pair[2] if pair + if pair && ((parent != SELF_REF && parent != PARENT) || + (current != SELF_REF && current != PARENT)) + mod ||= normalized_path.gsub!( + Regexp.new( + "/#{Regexp.escape(parent.to_s)}/\\.\\./|" + + "(/#{Regexp.escape(current.to_s)}/\\.\\.$)" + ), SLASH + ) + end + + mod ||= normalized_path.gsub!(RULE_2D, EMPTY_STR) + # Non-standard, removes prefixed dotted segments from path. + mod ||= normalized_path.gsub!(RULE_PREFIXED_PARENT, SLASH) + end until mod.nil? + + return normalized_path + end + + ## + # Ensures that the URI is valid. + def validate + return if !!@validation_deferred + if self.scheme != nil && self.ip_based? && + (self.host == nil || self.host.empty?) && + (self.path == nil || self.path.empty?) + raise InvalidURIError, + "Absolute URI missing hierarchical segment: '#{self.to_s}'" + end + if self.host == nil + if self.port != nil || + self.user != nil || + self.password != nil + raise InvalidURIError, "Hostname not supplied: '#{self.to_s}'" + end + end + if self.path != nil && !self.path.empty? && self.path[0..0] != SLASH && + self.authority != nil + raise InvalidURIError, + "Cannot have a relative path with an authority set: '#{self.to_s}'" + end + if self.path != nil && !self.path.empty? && + self.path[0..1] == SLASH + SLASH && self.authority == nil + raise InvalidURIError, + "Cannot have a path with two leading slashes " + + "without an authority set: '#{self.to_s}'" + end + unreserved = CharacterClasses::UNRESERVED + sub_delims = CharacterClasses::SUB_DELIMS + if !self.host.nil? && (self.host =~ /[<>{}\/\\\?\#\@"[[:space:]]]/ || + (self.host[/^\[(.*)\]$/, 1] != nil && self.host[/^\[(.*)\]$/, 1] !~ + Regexp.new("^[#{unreserved}#{sub_delims}:]*$"))) + raise InvalidURIError, "Invalid character in host: '#{self.host.to_s}'" + end + return nil + end + + ## + # Replaces the internal state of self with the specified URI's state. + # Used in destructive operations to avoid massive code repetition. + # + # @param [Addressable::URI] uri The URI to replace self with. + # + # @return [Addressable::URI] self. + def replace_self(uri) + # Reset dependent values + instance_variables.each do |var| + if instance_variable_defined?(var) && var != :@validation_deferred + remove_instance_variable(var) + end + end + + @scheme = uri.scheme + @user = uri.user + @password = uri.password + @host = uri.host + @port = uri.port + @path = uri.path + @query = uri.query + @fragment = uri.fragment + return self + end + + ## + # Splits path string with "/" (slash). + # It is considered that there is empty string after last slash when + # path ends with slash. + # + # @param [String] path The path to split. + # + # @return [Array] An array of parts of path. + def split_path(path) + splitted = path.split(SLASH) + splitted << EMPTY_STR if path.end_with? SLASH + splitted + end + + ## + # Resets composite values for the entire URI + # + # @api private + def remove_composite_values + remove_instance_variable(:@uri_string) if defined?(@uri_string) + remove_instance_variable(:@hash) if defined?(@hash) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/version.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/version.rb new file mode 100644 index 0000000..4d28465 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/version.rb @@ -0,0 +1,30 @@ +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +# Used to prevent the class/module from being loaded more than once +if !defined?(Addressable::VERSION) + module Addressable + module VERSION + MAJOR = 2 + MINOR = 5 + TINY = 2 + + STRING = [MAJOR, MINOR, TINY].join('.') + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb new file mode 100644 index 0000000..2f47ec3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb @@ -0,0 +1,298 @@ +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +# Have to use RubyGems to load the idn gem. +require "rubygems" + +require "addressable/idna" + +shared_examples_for "converting from unicode to ASCII" do + it "should convert 'www.google.com' correctly" do + expect(Addressable::IDNA.to_ascii("www.google.com")).to eq("www.google.com") + end + + LONG = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com' + it "should convert '#{LONG}' correctly" do + expect(Addressable::IDNA.to_ascii(LONG)).to eq(LONG) + end + + it "should convert 'www.詹姆斯.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "www.詹姆斯.com" + )).to eq("www.xn--8ws00zhy3a.com") + end + + it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do + "www.Iñtërnâtiônàlizætiøn.com" + expect(Addressable::IDNA.to_ascii( + "www.I\xC3\xB1t\xC3\xABrn\xC3\xA2ti\xC3\xB4" + + "n\xC3\xA0liz\xC3\xA6ti\xC3\xB8n.com" + )).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com") + end + + it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "www.In\xCC\x83te\xCC\x88rna\xCC\x82tio\xCC\x82n" + + "a\xCC\x80liz\xC3\xA6ti\xC3\xB8n.com" + )).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com") + end + + it "should convert " + + "'www.ã»ã‚“ã¨ã†ã«ãªãŒã„ã‚ã‘ã®ã‚ã‹ã‚‰ãªã„ã©ã‚ã„ã‚“ã‚ã„ã®ã‚‰ã¹ã‚‹ã¾ã ãªãŒãã—ãªã„ã¨ãŸã‚Šãªã„.w3.mag.keio.ac.jp' " + + "correctly" do + expect(Addressable::IDNA.to_ascii( + "www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" + + "\201\252\343\201\214\343\201\204\343\202\217\343\201\221\343\201\256" + + "\343\202\217\343\201\213\343\202\211\343\201\252\343\201\204\343\201" + + "\251\343\202\201\343\201\204\343\202\223\343\202\201\343\201\204\343" + + "\201\256\343\202\211\343\201\271\343\202\213\343\201\276\343\201\240" + + "\343\201\252\343\201\214\343\201\217\343\201\227\343\201\252\343\201" + + "\204\343\201\250\343\201\237\343\202\212\343\201\252\343\201\204." + + "w3.mag.keio.ac.jp" + )).to eq( + "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + + "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + ) + end + + it "should convert " + + "'www.ã»ã‚“ã¨ã†ã«ãªãŒã„ã‚ã‘ã®ã‚ã‹ã‚‰ãªã„ã©ã‚ã„ã‚“ã‚ã„ã®ã‚‰ã¹ã‚‹ã¾ã ãªãŒãã—ãªã„ã¨ãŸã‚Šãªã„.w3.mag.keio.ac.jp' " + + "correctly" do + expect(Addressable::IDNA.to_ascii( + "www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" + + "\201\252\343\201\213\343\202\231\343\201\204\343\202\217\343\201\221" + + "\343\201\256\343\202\217\343\201\213\343\202\211\343\201\252\343\201" + + "\204\343\201\250\343\202\231\343\202\201\343\201\204\343\202\223\343" + + "\202\201\343\201\204\343\201\256\343\202\211\343\201\270\343\202\231" + + "\343\202\213\343\201\276\343\201\237\343\202\231\343\201\252\343\201" + + "\213\343\202\231\343\201\217\343\201\227\343\201\252\343\201\204\343" + + "\201\250\343\201\237\343\202\212\343\201\252\343\201\204." + + "w3.mag.keio.ac.jp" + )).to eq( + "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + + "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + ) + end + + it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do + expect(Addressable::IDNA.to_ascii( + "点心和烤鸭.w3.mag.keio.ac.jp" + )).to eq("xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp") + end + + it "should convert 'ê°€ê°ê°‚갃간갅갆갇갈갉힢힣.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "ê°€ê°ê°‚갃간갅갆갇갈갉힢힣.com" + )).to eq("xn--o39acdefghijk5883jma.com") + end + + it "should convert " + + "'\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com" + )).to eq("xn--9cs565brid46mda086o.com") + end + + it "should convert 'リ宠í±ã€¹.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "\357\276\230\345\256\240\355\220\261\343\200\271.com" + )).to eq("xn--eek174hoxfpr4k.com") + end + + it "should convert 'リ宠í±å„.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "\343\203\252\345\256\240\355\220\261\345\215\204.com" + )).to eq("xn--eek174hoxfpr4k.com") + end + + it "should convert 'ᆵ' correctly" do + expect(Addressable::IDNA.to_ascii( + "\341\206\265" + )).to eq("xn--4ud") + end + + it "should convert 'ᆵ' correctly" do + expect(Addressable::IDNA.to_ascii( + "\357\276\257" + )).to eq("xn--4ud") + end + + it "should convert '🌹🌹🌹.ws' correctly" do + expect(Addressable::IDNA.to_ascii( + "\360\237\214\271\360\237\214\271\360\237\214\271.ws" + )).to eq("xn--2h8haa.ws") + end + + it "should handle two adjacent '.'s correctly" do + expect(Addressable::IDNA.to_ascii( + "example..host" + )).to eq("example..host") + end +end + +shared_examples_for "converting from ASCII to unicode" do + LONG = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com' + it "should convert '#{LONG}' correctly" do + expect(Addressable::IDNA.to_unicode(LONG)).to eq(LONG) + end + + it "should return the identity conversion when punycode decode fails" do + expect(Addressable::IDNA.to_unicode("xn--zckp1cyg1.sblo.jp")).to eq( + "xn--zckp1cyg1.sblo.jp") + end + + it "should return the identity conversion when the ACE prefix has no suffix" do + expect(Addressable::IDNA.to_unicode("xn--...-")).to eq("xn--...-") + end + + it "should convert 'www.google.com' correctly" do + expect(Addressable::IDNA.to_unicode("www.google.com")).to eq( + "www.google.com") + end + + it "should convert 'www.詹姆斯.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "www.xn--8ws00zhy3a.com" + )).to eq("www.詹姆斯.com") + end + + it "should convert '詹姆斯.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--8ws00zhy3a.com" + )).to eq("詹姆斯.com") + end + + it "should convert 'www.iñtërnâtiônàlizætiøn.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "www.xn--itrntinliztin-vdb0a5exd8ewcye.com" + )).to eq("www.iñtërnâtiônàlizætiøn.com") + end + + it "should convert 'iñtërnâtiônàlizætiøn.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--itrntinliztin-vdb0a5exd8ewcye.com" + )).to eq("iñtërnâtiônàlizætiøn.com") + end + + it "should convert " + + "'www.ã»ã‚“ã¨ã†ã«ãªãŒã„ã‚ã‘ã®ã‚ã‹ã‚‰ãªã„ã©ã‚ã„ã‚“ã‚ã„ã®ã‚‰ã¹ã‚‹ã¾ã ãªãŒãã—ãªã„ã¨ãŸã‚Šãªã„.w3.mag.keio.ac.jp' " + + "correctly" do + expect(Addressable::IDNA.to_unicode( + "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + + "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + )).to eq( + "www.ã»ã‚“ã¨ã†ã«ãªãŒã„ã‚ã‘ã®ã‚ã‹ã‚‰ãªã„ã©ã‚ã„ã‚“ã‚ã„ã®ã‚‰ã¹ã‚‹ã¾ã ãªãŒãã—ãªã„ã¨ãŸã‚Šãªã„.w3.mag.keio.ac.jp" + ) + end + + it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp" + )).to eq("点心和烤鸭.w3.mag.keio.ac.jp") + end + + it "should convert 'ê°€ê°ê°‚갃간갅갆갇갈갉힢힣.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--o39acdefghijk5883jma.com" + )).to eq("ê°€ê°ê°‚갃간갅갆갇갈갉힢힣.com") + end + + it "should convert " + + "'\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--9cs565brid46mda086o.com" + )).to eq( + "\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com" + ) + end + + it "should convert 'リ宠í±å„.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--eek174hoxfpr4k.com" + )).to eq("\343\203\252\345\256\240\355\220\261\345\215\204.com") + end + + it "should convert 'ᆵ' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--4ud" + )).to eq("\341\206\265") + end + + it "should convert '🌹🌹🌹.ws' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--2h8haa.ws" + )).to eq("\360\237\214\271\360\237\214\271\360\237\214\271.ws") + end + + it "should handle two adjacent '.'s correctly" do + expect(Addressable::IDNA.to_unicode( + "example..host" + )).to eq("example..host") + end + + it "should normalize 'string' correctly" do + expect(Addressable::IDNA.unicode_normalize_kc(:'string')).to eq("string") + expect(Addressable::IDNA.unicode_normalize_kc("string")).to eq("string") + end +end + +describe Addressable::IDNA, "when using the pure-Ruby implementation" do + before do + Addressable.send(:remove_const, :IDNA) + load "addressable/idna/pure.rb" + end + + it_should_behave_like "converting from unicode to ASCII" + it_should_behave_like "converting from ASCII to unicode" + + begin + require "fiber" + + it "should not blow up inside fibers" do + f = Fiber.new do + Addressable.send(:remove_const, :IDNA) + load "addressable/idna/pure.rb" + end + f.resume + end + rescue LoadError + # Fibers aren't supported in this version of Ruby, skip this test. + warn('Fibers unsupported.') + end +end + +begin + require "idn" + + describe Addressable::IDNA, "when using the native-code implementation" do + before do + Addressable.send(:remove_const, :IDNA) + load "addressable/idna/native.rb" + end + + it_should_behave_like "converting from unicode to ASCII" + it_should_behave_like "converting from ASCII to unicode" + end +rescue LoadError + # Cannot test the native implementation without libidn support. + warn('Could not load native IDN implementation.') +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb new file mode 100644 index 0000000..eee3f86 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb @@ -0,0 +1,28 @@ +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "addressable/uri" +require "net/http" + +describe Net::HTTP do + it "should be compatible with Addressable" do + response_body = + Net::HTTP.get(Addressable::URI.parse('http://www.google.com/')) + expect(response_body).not_to be_nil + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb new file mode 100644 index 0000000..622a4ab --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb @@ -0,0 +1,104 @@ +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "addressable/uri" +require "addressable/template" +require "rack/mount" + +describe Rack::Mount do + let(:app_one) do + proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 1'] } + end + let(:app_two) do + proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 2'] } + end + let(:app_three) do + proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 3'] } + end + let(:routes) do + s = Rack::Mount::RouteSet.new do |set| + set.add_route(app_one, { + :request_method => 'GET', + :path_info => Addressable::Template.new('/one/{id}/') + }, {:id => 'unidentified'}, :one) + set.add_route(app_two, { + :request_method => 'GET', + :path_info => Addressable::Template.new('/two/') + }, {:id => 'unidentified'}, :two) + set.add_route(app_three, { + :request_method => 'GET', + :path_info => Addressable::Template.new('/three/{id}/').to_regexp + }, {:id => 'unidentified'}, :three) + end + s.rehash + s + end + + it "should generate from routes with Addressable::Template" do + path, _ = routes.generate(:path_info, :one, {:id => '123'}) + expect(path).to eq '/one/123/' + end + + it "should generate from routes with Addressable::Template using defaults" do + path, _ = routes.generate(:path_info, :one, {}) + expect(path).to eq '/one/unidentified/' + end + + it "should recognize routes with Addressable::Template" do + request = Rack::Request.new( + 'REQUEST_METHOD' => 'GET', + 'PATH_INFO' => '/one/123/' + ) + route, _, params = routes.recognize(request) + expect(route).not_to be_nil + expect(route.app).to eq app_one + expect(params).to eq({id: '123'}) + end + + it "should generate from routes with Addressable::Template" do + path, _ = routes.generate(:path_info, :two, {:id => '654'}) + expect(path).to eq '/two/' + end + + it "should generate from routes with Addressable::Template using defaults" do + path, _ = routes.generate(:path_info, :two, {}) + expect(path).to eq '/two/' + end + + it "should recognize routes with Addressable::Template" do + request = Rack::Request.new( + 'REQUEST_METHOD' => 'GET', + 'PATH_INFO' => '/two/' + ) + route, _, params = routes.recognize(request) + expect(route).not_to be_nil + expect(route.app).to eq app_two + expect(params).to eq({id: 'unidentified'}) + end + + it "should recognize routes with derived Regexp" do + request = Rack::Request.new( + 'REQUEST_METHOD' => 'GET', + 'PATH_INFO' => '/three/789/' + ) + route, _, params = routes.recognize(request) + expect(route).not_to be_nil + expect(route.app).to eq app_three + expect(params).to eq({id: '789'}) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb new file mode 100644 index 0000000..3275494 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb @@ -0,0 +1,57 @@ +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "addressable/uri" + +describe Addressable::URI, "when created with a URI known to cause crashes " + + "in certain browsers" do + it "should parse correctly" do + uri = Addressable::URI.parse('%%30%30') + expect(uri.path).to eq('%%30%30') + expect(uri.normalize.path).to eq('%2500') + end + + it "should parse correctly as a full URI" do + uri = Addressable::URI.parse('http://www.example.com/%%30%30') + expect(uri.path).to eq('/%%30%30') + expect(uri.normalize.path).to eq('/%2500') + end +end + +describe Addressable::URI, "when created with a URI known to cause crashes " + + "in certain browsers" do + it "should parse correctly" do + uri = Addressable::URI.parse('Ù„ÙØµÙ‘بÙÙ„ÙÙ„ØµÙ‘Ø¨ÙØ±Ø±Ù‹ ॣ ॣh ॣ ॣ 冗') + expect(uri.path).to eq('Ù„ÙØµÙ‘بÙÙ„ÙÙ„ØµÙ‘Ø¨ÙØ±Ø±Ù‹ ॣ ॣh ॣ ॣ 冗') + expect(uri.normalize.path).to eq( + '%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' + + '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' + + '%A3%20%E0%A5%A3%20%E5%86%97' + ) + end + + it "should parse correctly as a full URI" do + uri = Addressable::URI.parse('http://www.example.com/Ù„ÙØµÙ‘بÙÙ„ÙÙ„ØµÙ‘Ø¨ÙØ±Ø±Ù‹ ॣ ॣh ॣ ॣ 冗') + expect(uri.path).to eq('/Ù„ÙØµÙ‘بÙÙ„ÙÙ„ØµÙ‘Ø¨ÙØ±Ø±Ù‹ ॣ ॣh ॣ ॣ 冗') + expect(uri.normalize.path).to eq( + '/%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' + + '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' + + '%A3%20%E0%A5%A3%20%E5%86%97' + ) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb new file mode 100644 index 0000000..bd8ab12 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb @@ -0,0 +1,1419 @@ +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "bigdecimal" +require "addressable/template" + +shared_examples_for 'expands' do |tests| + tests.each do |template, expansion| + exp = expansion.is_a?(Array) ? expansion.first : expansion + it "#{template} to #{exp}" do + tmpl = Addressable::Template.new(template).expand(subject) + if expansion.is_a?(Array) + expect(expansion.any?{|i| i == tmpl.to_str}).to be true + else + expect(tmpl.to_str).to eq(expansion) + end + end + end +end + +describe "eql?" do + let(:template) { Addressable::Template.new('https://www.example.com/{foo}') } + it 'is equal when the pattern matches' do + other_template = Addressable::Template.new('https://www.example.com/{foo}') + expect(template).to be_eql(other_template) + expect(other_template).to be_eql(template) + end + it 'is not equal when the pattern differs' do + other_template = Addressable::Template.new('https://www.example.com/{bar}') + expect(template).to_not be_eql(other_template) + expect(other_template).to_not be_eql(template) + end + it 'is not equal to non-templates' do + uri = 'https://www.example.com/foo/bar' + addressable_template = Addressable::Template.new uri + addressable_uri = Addressable::URI.parse uri + expect(addressable_template).to_not be_eql(addressable_uri) + expect(addressable_uri).to_not be_eql(addressable_template) + end +end + +describe "==" do + let(:template) { Addressable::Template.new('https://www.example.com/{foo}') } + it 'is equal when the pattern matches' do + other_template = Addressable::Template.new('https://www.example.com/{foo}') + expect(template).to eq other_template + expect(other_template).to eq template + end + it 'is not equal when the pattern differs' do + other_template = Addressable::Template.new('https://www.example.com/{bar}') + expect(template).not_to eq other_template + expect(other_template).not_to eq template + end + it 'is not equal to non-templates' do + uri = 'https://www.example.com/foo/bar' + addressable_template = Addressable::Template.new uri + addressable_uri = Addressable::URI.parse uri + expect(addressable_template).not_to eq addressable_uri + expect(addressable_uri).not_to eq addressable_template + end +end + +describe "Type conversion" do + subject { + { + :var => true, + :hello => 1234, + :nothing => nil, + :sym => :symbolic, + :decimal => BigDecimal.new('1') + } + } + + it_behaves_like 'expands', { + '{var}' => 'true', + '{hello}' => '1234', + '{nothing}' => '', + '{sym}' => 'symbolic', + '{decimal}' => RUBY_VERSION < '2.4.0' ? '0.1E1' : '0.1e1' + } +end + +describe "Level 1:" do + subject { + {:var => "value", :hello => "Hello World!"} + } + it_behaves_like 'expands', { + '{var}' => 'value', + '{hello}' => 'Hello%20World%21' + } +end + +describe "Level 2" do + subject { + { + :var => "value", + :hello => "Hello World!", + :path => "/foo/bar" + } + } + context "Operator +:" do + it_behaves_like 'expands', { + '{+var}' => 'value', + '{+hello}' => 'Hello%20World!', + '{+path}/here' => '/foo/bar/here', + 'here?ref={+path}' => 'here?ref=/foo/bar' + } + end + context "Operator #:" do + it_behaves_like 'expands', { + 'X{#var}' => 'X#value', + 'X{#hello}' => 'X#Hello%20World!' + } + end +end + +describe "Level 3" do + subject { + { + :var => "value", + :hello => "Hello World!", + :empty => "", + :path => "/foo/bar", + :x => "1024", + :y => "768" + } + } + context "Operator nil (multiple vars):" do + it_behaves_like 'expands', { + 'map?{x,y}' => 'map?1024,768', + '{x,hello,y}' => '1024,Hello%20World%21,768' + } + end + context "Operator + (multiple vars):" do + it_behaves_like 'expands', { + '{+x,hello,y}' => '1024,Hello%20World!,768', + '{+path,x}/here' => '/foo/bar,1024/here' + } + end + context "Operator # (multiple vars):" do + it_behaves_like 'expands', { + '{#x,hello,y}' => '#1024,Hello%20World!,768', + '{#path,x}/here' => '#/foo/bar,1024/here' + } + end + context "Operator ." do + it_behaves_like 'expands', { + 'X{.var}' => 'X.value', + 'X{.x,y}' => 'X.1024.768' + } + end + context "Operator /" do + it_behaves_like 'expands', { + '{/var}' => '/value', + '{/var,x}/here' => '/value/1024/here' + } + end + context "Operator ;" do + it_behaves_like 'expands', { + '{;x,y}' => ';x=1024;y=768', + '{;x,y,empty}' => ';x=1024;y=768;empty' + } + end + context "Operator ?" do + it_behaves_like 'expands', { + '{?x,y}' => '?x=1024&y=768', + '{?x,y,empty}' => '?x=1024&y=768&empty=' + } + end + context "Operator &" do + it_behaves_like 'expands', { + '?fixed=yes{&x}' => '?fixed=yes&x=1024', + '{&x,y,empty}' => '&x=1024&y=768&empty=' + } + end +end + +describe "Level 4" do + subject { + { + :var => "value", + :hello => "Hello World!", + :path => "/foo/bar", + :semi => ";", + :list => %w(red green blue), + :keys => {"semi" => ';', "dot" => '.', "comma" => ','} + } + } + context "Expansion with value modifiers" do + it_behaves_like 'expands', { + '{var:3}' => 'val', + '{var:30}' => 'value', + '{list}' => 'red,green,blue', + '{list*}' => 'red,green,blue', + '{keys}' => [ + 'semi,%3B,dot,.,comma,%2C', + 'dot,.,semi,%3B,comma,%2C', + 'comma,%2C,semi,%3B,dot,.', + 'semi,%3B,comma,%2C,dot,.', + 'dot,.,comma,%2C,semi,%3B', + 'comma,%2C,dot,.,semi,%3B' + ], + '{keys*}' => [ + 'semi=%3B,dot=.,comma=%2C', + 'dot=.,semi=%3B,comma=%2C', + 'comma=%2C,semi=%3B,dot=.', + 'semi=%3B,comma=%2C,dot=.', + 'dot=.,comma=%2C,semi=%3B', + 'comma=%2C,dot=.,semi=%3B' + ] + } + end + context "Operator + with value modifiers" do + it_behaves_like 'expands', { + '{+path:6}/here' => '/foo/b/here', + '{+list}' => 'red,green,blue', + '{+list*}' => 'red,green,blue', + '{+keys}' => [ + 'semi,;,dot,.,comma,,', + 'dot,.,semi,;,comma,,', + 'comma,,,semi,;,dot,.', + 'semi,;,comma,,,dot,.', + 'dot,.,comma,,,semi,;', + 'comma,,,dot,.,semi,;' + ], + '{+keys*}' => [ + 'semi=;,dot=.,comma=,', + 'dot=.,semi=;,comma=,', + 'comma=,,semi=;,dot=.', + 'semi=;,comma=,,dot=.', + 'dot=.,comma=,,semi=;', + 'comma=,,dot=.,semi=;' + ] + } + end + context "Operator # with value modifiers" do + it_behaves_like 'expands', { + '{#path:6}/here' => '#/foo/b/here', + '{#list}' => '#red,green,blue', + '{#list*}' => '#red,green,blue', + '{#keys}' => [ + '#semi,;,dot,.,comma,,', + '#dot,.,semi,;,comma,,', + '#comma,,,semi,;,dot,.', + '#semi,;,comma,,,dot,.', + '#dot,.,comma,,,semi,;', + '#comma,,,dot,.,semi,;' + ], + '{#keys*}' => [ + '#semi=;,dot=.,comma=,', + '#dot=.,semi=;,comma=,', + '#comma=,,semi=;,dot=.', + '#semi=;,comma=,,dot=.', + '#dot=.,comma=,,semi=;', + '#comma=,,dot=.,semi=;' + ] + } + end + context "Operator . with value modifiers" do + it_behaves_like 'expands', { + 'X{.var:3}' => 'X.val', + 'X{.list}' => 'X.red,green,blue', + 'X{.list*}' => 'X.red.green.blue', + 'X{.keys}' => [ + 'X.semi,%3B,dot,.,comma,%2C', + 'X.dot,.,semi,%3B,comma,%2C', + 'X.comma,%2C,semi,%3B,dot,.', + 'X.semi,%3B,comma,%2C,dot,.', + 'X.dot,.,comma,%2C,semi,%3B', + 'X.comma,%2C,dot,.,semi,%3B' + ], + 'X{.keys*}' => [ + 'X.semi=%3B.dot=..comma=%2C', + 'X.dot=..semi=%3B.comma=%2C', + 'X.comma=%2C.semi=%3B.dot=.', + 'X.semi=%3B.comma=%2C.dot=.', + 'X.dot=..comma=%2C.semi=%3B', + 'X.comma=%2C.dot=..semi=%3B' + ] + } + end + context "Operator / with value modifiers" do + it_behaves_like 'expands', { + '{/var:1,var}' => '/v/value', + '{/list}' => '/red,green,blue', + '{/list*}' => '/red/green/blue', + '{/list*,path:4}' => '/red/green/blue/%2Ffoo', + '{/keys}' => [ + '/semi,%3B,dot,.,comma,%2C', + '/dot,.,semi,%3B,comma,%2C', + '/comma,%2C,semi,%3B,dot,.', + '/semi,%3B,comma,%2C,dot,.', + '/dot,.,comma,%2C,semi,%3B', + '/comma,%2C,dot,.,semi,%3B' + ], + '{/keys*}' => [ + '/semi=%3B/dot=./comma=%2C', + '/dot=./semi=%3B/comma=%2C', + '/comma=%2C/semi=%3B/dot=.', + '/semi=%3B/comma=%2C/dot=.', + '/dot=./comma=%2C/semi=%3B', + '/comma=%2C/dot=./semi=%3B' + ] + } + end + context "Operator ; with value modifiers" do + it_behaves_like 'expands', { + '{;hello:5}' => ';hello=Hello', + '{;list}' => ';list=red,green,blue', + '{;list*}' => ';list=red;list=green;list=blue', + '{;keys}' => [ + ';keys=semi,%3B,dot,.,comma,%2C', + ';keys=dot,.,semi,%3B,comma,%2C', + ';keys=comma,%2C,semi,%3B,dot,.', + ';keys=semi,%3B,comma,%2C,dot,.', + ';keys=dot,.,comma,%2C,semi,%3B', + ';keys=comma,%2C,dot,.,semi,%3B' + ], + '{;keys*}' => [ + ';semi=%3B;dot=.;comma=%2C', + ';dot=.;semi=%3B;comma=%2C', + ';comma=%2C;semi=%3B;dot=.', + ';semi=%3B;comma=%2C;dot=.', + ';dot=.;comma=%2C;semi=%3B', + ';comma=%2C;dot=.;semi=%3B' + ] + } + end + context "Operator ? with value modifiers" do + it_behaves_like 'expands', { + '{?var:3}' => '?var=val', + '{?list}' => '?list=red,green,blue', + '{?list*}' => '?list=red&list=green&list=blue', + '{?keys}' => [ + '?keys=semi,%3B,dot,.,comma,%2C', + '?keys=dot,.,semi,%3B,comma,%2C', + '?keys=comma,%2C,semi,%3B,dot,.', + '?keys=semi,%3B,comma,%2C,dot,.', + '?keys=dot,.,comma,%2C,semi,%3B', + '?keys=comma,%2C,dot,.,semi,%3B' + ], + '{?keys*}' => [ + '?semi=%3B&dot=.&comma=%2C', + '?dot=.&semi=%3B&comma=%2C', + '?comma=%2C&semi=%3B&dot=.', + '?semi=%3B&comma=%2C&dot=.', + '?dot=.&comma=%2C&semi=%3B', + '?comma=%2C&dot=.&semi=%3B' + ] + } + end + context "Operator & with value modifiers" do + it_behaves_like 'expands', { + '{&var:3}' => '&var=val', + '{&list}' => '&list=red,green,blue', + '{&list*}' => '&list=red&list=green&list=blue', + '{&keys}' => [ + '&keys=semi,%3B,dot,.,comma,%2C', + '&keys=dot,.,semi,%3B,comma,%2C', + '&keys=comma,%2C,semi,%3B,dot,.', + '&keys=semi,%3B,comma,%2C,dot,.', + '&keys=dot,.,comma,%2C,semi,%3B', + '&keys=comma,%2C,dot,.,semi,%3B' + ], + '{&keys*}' => [ + '&semi=%3B&dot=.&comma=%2C', + '&dot=.&semi=%3B&comma=%2C', + '&comma=%2C&semi=%3B&dot=.', + '&semi=%3B&comma=%2C&dot=.', + '&dot=.&comma=%2C&semi=%3B', + '&comma=%2C&dot=.&semi=%3B' + ] + } + end +end +describe "Modifiers" do + subject { + { + :var => "value", + :semi => ";", + :year => %w(1965 2000 2012), + :dom => %w(example com) + } + } + context "length" do + it_behaves_like 'expands', { + '{var:3}' => 'val', + '{var:30}' => 'value', + '{var}' => 'value', + '{semi}' => '%3B', + '{semi:2}' => '%3B' + } + end + context "explode" do + it_behaves_like 'expands', { + 'find{?year*}' => 'find?year=1965&year=2000&year=2012', + 'www{.dom*}' => 'www.example.com', + } + end +end +describe "Expansion" do + subject { + { + :count => ["one", "two", "three"], + :dom => ["example", "com"], + :dub => "me/too", + :hello => "Hello World!", + :half => "50%", + :var => "value", + :who => "fred", + :base => "http://example.com/home/", + :path => "/foo/bar", + :list => ["red", "green", "blue"], + :keys => {"semi" => ";","dot" => ".","comma" => ","}, + :v => "6", + :x => "1024", + :y => "768", + :empty => "", + :empty_keys => {}, + :undef => nil + } + } + context "concatenation" do + it_behaves_like 'expands', { + '{count}' => 'one,two,three', + '{count*}' => 'one,two,three', + '{/count}' => '/one,two,three', + '{/count*}' => '/one/two/three', + '{;count}' => ';count=one,two,three', + '{;count*}' => ';count=one;count=two;count=three', + '{?count}' => '?count=one,two,three', + '{?count*}' => '?count=one&count=two&count=three', + '{&count*}' => '&count=one&count=two&count=three' + } + end + context "simple expansion" do + it_behaves_like 'expands', { + '{var}' => 'value', + '{hello}' => 'Hello%20World%21', + '{half}' => '50%25', + 'O{empty}X' => 'OX', + 'O{undef}X' => 'OX', + '{x,y}' => '1024,768', + '{x,hello,y}' => '1024,Hello%20World%21,768', + '?{x,empty}' => '?1024,', + '?{x,undef}' => '?1024', + '?{undef,y}' => '?768', + '{var:3}' => 'val', + '{var:30}' => 'value', + '{list}' => 'red,green,blue', + '{list*}' => 'red,green,blue', + '{keys}' => [ + 'semi,%3B,dot,.,comma,%2C', + 'dot,.,semi,%3B,comma,%2C', + 'comma,%2C,semi,%3B,dot,.', + 'semi,%3B,comma,%2C,dot,.', + 'dot,.,comma,%2C,semi,%3B', + 'comma,%2C,dot,.,semi,%3B' + ], + '{keys*}' => [ + 'semi=%3B,dot=.,comma=%2C', + 'dot=.,semi=%3B,comma=%2C', + 'comma=%2C,semi=%3B,dot=.', + 'semi=%3B,comma=%2C,dot=.', + 'dot=.,comma=%2C,semi=%3B', + 'comma=%2C,dot=.,semi=%3B' + ] + } + end + context "reserved expansion (+)" do + it_behaves_like 'expands', { + '{+var}' => 'value', + '{+hello}' => 'Hello%20World!', + '{+half}' => '50%25', + '{base}index' => 'http%3A%2F%2Fexample.com%2Fhome%2Findex', + '{+base}index' => 'http://example.com/home/index', + 'O{+empty}X' => 'OX', + 'O{+undef}X' => 'OX', + '{+path}/here' => '/foo/bar/here', + 'here?ref={+path}' => 'here?ref=/foo/bar', + 'up{+path}{var}/here' => 'up/foo/barvalue/here', + '{+x,hello,y}' => '1024,Hello%20World!,768', + '{+path,x}/here' => '/foo/bar,1024/here', + '{+path:6}/here' => '/foo/b/here', + '{+list}' => 'red,green,blue', + '{+list*}' => 'red,green,blue', + '{+keys}' => [ + 'semi,;,dot,.,comma,,', + 'dot,.,semi,;,comma,,', + 'comma,,,semi,;,dot,.', + 'semi,;,comma,,,dot,.', + 'dot,.,comma,,,semi,;', + 'comma,,,dot,.,semi,;' + ], + '{+keys*}' => [ + 'semi=;,dot=.,comma=,', + 'dot=.,semi=;,comma=,', + 'comma=,,semi=;,dot=.', + 'semi=;,comma=,,dot=.', + 'dot=.,comma=,,semi=;', + 'comma=,,dot=.,semi=;' + ] + } + end + context "fragment expansion (#)" do + it_behaves_like 'expands', { + '{#var}' => '#value', + '{#hello}' => '#Hello%20World!', + '{#half}' => '#50%25', + 'foo{#empty}' => 'foo#', + 'foo{#undef}' => 'foo', + '{#x,hello,y}' => '#1024,Hello%20World!,768', + '{#path,x}/here' => '#/foo/bar,1024/here', + '{#path:6}/here' => '#/foo/b/here', + '{#list}' => '#red,green,blue', + '{#list*}' => '#red,green,blue', + '{#keys}' => [ + '#semi,;,dot,.,comma,,', + '#dot,.,semi,;,comma,,', + '#comma,,,semi,;,dot,.', + '#semi,;,comma,,,dot,.', + '#dot,.,comma,,,semi,;', + '#comma,,,dot,.,semi,;' + ], + '{#keys*}' => [ + '#semi=;,dot=.,comma=,', + '#dot=.,semi=;,comma=,', + '#comma=,,semi=;,dot=.', + '#semi=;,comma=,,dot=.', + '#dot=.,comma=,,semi=;', + '#comma=,,dot=.,semi=;' + ] + } + end + context "label expansion (.)" do + it_behaves_like 'expands', { + '{.who}' => '.fred', + '{.who,who}' => '.fred.fred', + '{.half,who}' => '.50%25.fred', + 'www{.dom*}' => 'www.example.com', + 'X{.var}' => 'X.value', + 'X{.empty}' => 'X.', + 'X{.undef}' => 'X', + 'X{.var:3}' => 'X.val', + 'X{.list}' => 'X.red,green,blue', + 'X{.list*}' => 'X.red.green.blue', + 'X{.keys}' => [ + 'X.semi,%3B,dot,.,comma,%2C', + 'X.dot,.,semi,%3B,comma,%2C', + 'X.comma,%2C,semi,%3B,dot,.', + 'X.semi,%3B,comma,%2C,dot,.', + 'X.dot,.,comma,%2C,semi,%3B', + 'X.comma,%2C,dot,.,semi,%3B' + ], + 'X{.keys*}' => [ + 'X.semi=%3B.dot=..comma=%2C', + 'X.dot=..semi=%3B.comma=%2C', + 'X.comma=%2C.semi=%3B.dot=.', + 'X.semi=%3B.comma=%2C.dot=.', + 'X.dot=..comma=%2C.semi=%3B', + 'X.comma=%2C.dot=..semi=%3B' + ], + 'X{.empty_keys}' => 'X', + 'X{.empty_keys*}' => 'X' + } + end + context "path expansion (/)" do + it_behaves_like 'expands', { + '{/who}' => '/fred', + '{/who,who}' => '/fred/fred', + '{/half,who}' => '/50%25/fred', + '{/who,dub}' => '/fred/me%2Ftoo', + '{/var}' => '/value', + '{/var,empty}' => '/value/', + '{/var,undef}' => '/value', + '{/var,x}/here' => '/value/1024/here', + '{/var:1,var}' => '/v/value', + '{/list}' => '/red,green,blue', + '{/list*}' => '/red/green/blue', + '{/list*,path:4}' => '/red/green/blue/%2Ffoo', + '{/keys}' => [ + '/semi,%3B,dot,.,comma,%2C', + '/dot,.,semi,%3B,comma,%2C', + '/comma,%2C,semi,%3B,dot,.', + '/semi,%3B,comma,%2C,dot,.', + '/dot,.,comma,%2C,semi,%3B', + '/comma,%2C,dot,.,semi,%3B' + ], + '{/keys*}' => [ + '/semi=%3B/dot=./comma=%2C', + '/dot=./semi=%3B/comma=%2C', + '/comma=%2C/semi=%3B/dot=.', + '/semi=%3B/comma=%2C/dot=.', + '/dot=./comma=%2C/semi=%3B', + '/comma=%2C/dot=./semi=%3B' + ] + } + end + context "path-style expansion (;)" do + it_behaves_like 'expands', { + '{;who}' => ';who=fred', + '{;half}' => ';half=50%25', + '{;empty}' => ';empty', + '{;v,empty,who}' => ';v=6;empty;who=fred', + '{;v,bar,who}' => ';v=6;who=fred', + '{;x,y}' => ';x=1024;y=768', + '{;x,y,empty}' => ';x=1024;y=768;empty', + '{;x,y,undef}' => ';x=1024;y=768', + '{;hello:5}' => ';hello=Hello', + '{;list}' => ';list=red,green,blue', + '{;list*}' => ';list=red;list=green;list=blue', + '{;keys}' => [ + ';keys=semi,%3B,dot,.,comma,%2C', + ';keys=dot,.,semi,%3B,comma,%2C', + ';keys=comma,%2C,semi,%3B,dot,.', + ';keys=semi,%3B,comma,%2C,dot,.', + ';keys=dot,.,comma,%2C,semi,%3B', + ';keys=comma,%2C,dot,.,semi,%3B' + ], + '{;keys*}' => [ + ';semi=%3B;dot=.;comma=%2C', + ';dot=.;semi=%3B;comma=%2C', + ';comma=%2C;semi=%3B;dot=.', + ';semi=%3B;comma=%2C;dot=.', + ';dot=.;comma=%2C;semi=%3B', + ';comma=%2C;dot=.;semi=%3B' + ] + } + end + context "form query expansion (?)" do + it_behaves_like 'expands', { + '{?who}' => '?who=fred', + '{?half}' => '?half=50%25', + '{?x,y}' => '?x=1024&y=768', + '{?x,y,empty}' => '?x=1024&y=768&empty=', + '{?x,y,undef}' => '?x=1024&y=768', + '{?var:3}' => '?var=val', + '{?list}' => '?list=red,green,blue', + '{?list*}' => '?list=red&list=green&list=blue', + '{?keys}' => [ + '?keys=semi,%3B,dot,.,comma,%2C', + '?keys=dot,.,semi,%3B,comma,%2C', + '?keys=comma,%2C,semi,%3B,dot,.', + '?keys=semi,%3B,comma,%2C,dot,.', + '?keys=dot,.,comma,%2C,semi,%3B', + '?keys=comma,%2C,dot,.,semi,%3B' + ], + '{?keys*}' => [ + '?semi=%3B&dot=.&comma=%2C', + '?dot=.&semi=%3B&comma=%2C', + '?comma=%2C&semi=%3B&dot=.', + '?semi=%3B&comma=%2C&dot=.', + '?dot=.&comma=%2C&semi=%3B', + '?comma=%2C&dot=.&semi=%3B' + ] + } + end + context "form query expansion (&)" do + it_behaves_like 'expands', { + '{&who}' => '&who=fred', + '{&half}' => '&half=50%25', + '?fixed=yes{&x}' => '?fixed=yes&x=1024', + '{&x,y,empty}' => '&x=1024&y=768&empty=', + '{&x,y,undef}' => '&x=1024&y=768', + '{&var:3}' => '&var=val', + '{&list}' => '&list=red,green,blue', + '{&list*}' => '&list=red&list=green&list=blue', + '{&keys}' => [ + '&keys=semi,%3B,dot,.,comma,%2C', + '&keys=dot,.,semi,%3B,comma,%2C', + '&keys=comma,%2C,semi,%3B,dot,.', + '&keys=semi,%3B,comma,%2C,dot,.', + '&keys=dot,.,comma,%2C,semi,%3B', + '&keys=comma,%2C,dot,.,semi,%3B' + ], + '{&keys*}' => [ + '&semi=%3B&dot=.&comma=%2C', + '&dot=.&semi=%3B&comma=%2C', + '&comma=%2C&semi=%3B&dot=.', + '&semi=%3B&comma=%2C&dot=.', + '&dot=.&comma=%2C&semi=%3B', + '&comma=%2C&dot=.&semi=%3B' + ] + } + end + context "non-string key in match data" do + subject {Addressable::Template.new("http://example.com/{one}")} + + it "raises TypeError" do + expect { subject.expand(Object.new => "1") }.to raise_error TypeError + end + end +end + +class ExampleTwoProcessor + def self.restore(name, value) + return value.gsub(/-/, " ") if name == "query" + return value + end + + def self.match(name) + return ".*?" if name == "first" + return ".*" + end + def self.validate(name, value) + return !!(value =~ /^[\w ]+$/) if name == "query" + return true + end + + def self.transform(name, value) + return value.gsub(/ /, "+") if name == "query" + return value + end +end + +class DumbProcessor + def self.match(name) + return ".*?" if name == "first" + end +end + +describe Addressable::Template do + describe 'initialize' do + context 'with a non-string' do + it 'raises a TypeError' do + expect { Addressable::Template.new(nil) }.to raise_error(TypeError) + end + end + end + + describe 'freeze' do + subject { Addressable::Template.new("http://example.com/{first}/{+second}/") } + it 'freezes the template' do + expect(subject.freeze).to be_frozen + end + end + + describe "Matching" do + let(:uri){ + Addressable::URI.parse( + "http://example.com/search/an-example-search-query/" + ) + } + let(:uri2){ + Addressable::URI.parse("http://example.com/a/b/c/") + } + let(:uri3){ + Addressable::URI.parse("http://example.com/;a=1;b=2;c=3;first=foo") + } + let(:uri4){ + Addressable::URI.parse("http://example.com/?a=1&b=2&c=3&first=foo") + } + let(:uri5){ + "http://example.com/foo" + } + context "first uri with ExampleTwoProcessor" do + subject { + Addressable::Template.new( + "http://example.com/search/{query}/" + ).match(uri, ExampleTwoProcessor) + } + its(:variables){ should == ["query"] } + its(:captures){ should == ["an example search query"] } + end + + context "second uri with ExampleTwoProcessor" do + subject { + Addressable::Template.new( + "http://example.com/{first}/{+second}/" + ).match(uri2, ExampleTwoProcessor) + } + its(:variables){ should == ["first", "second"] } + its(:captures){ should == ["a", "b/c"] } + end + + context "second uri with DumbProcessor" do + subject { + Addressable::Template.new( + "http://example.com/{first}/{+second}/" + ).match(uri2, DumbProcessor) + } + its(:variables){ should == ["first", "second"] } + its(:captures){ should == ["a", "b/c"] } + end + + context "second uri" do + subject { + Addressable::Template.new( + "http://example.com/{first}{/second*}/" + ).match(uri2) + } + its(:variables){ should == ["first", "second"] } + its(:captures){ should == ["a", ["b","c"]] } + end + context "third uri" do + subject { + Addressable::Template.new( + "http://example.com/{;hash*,first}" + ).match(uri3) + } + its(:variables){ should == ["hash", "first"] } + its(:captures){ should == [ + {"a" => "1", "b" => "2", "c" => "3", "first" => "foo"}, nil] } + end + # Note that this expansion is impossible to revert deterministically - the + # * operator means first could have been a key of hash or a separate key. + # Semantically, a separate key is more likely, but both are possible. + context "fourth uri" do + subject { + Addressable::Template.new( + "http://example.com/{?hash*,first}" + ).match(uri4) + } + its(:variables){ should == ["hash", "first"] } + its(:captures){ should == [ + {"a" => "1", "b" => "2", "c" => "3", "first"=> "foo"}, nil] } + end + context "fifth uri" do + subject { + Addressable::Template.new( + "http://example.com/{path}{?hash*,first}" + ).match(uri5) + } + its(:variables){ should == ["path", "hash", "first"] } + its(:captures){ should == ["foo", nil, nil] } + end + end + + describe 'match' do + subject { Addressable::Template.new('http://example.com/first/second/') } + context 'when the URI is the same as the template' do + it 'returns the match data itself with an empty mapping' do + uri = Addressable::URI.parse('http://example.com/first/second/') + match_data = subject.match(uri) + expect(match_data).to be_an Addressable::Template::MatchData + expect(match_data.uri).to eq(uri) + expect(match_data.template).to eq(subject) + expect(match_data.mapping).to be_empty + expect(match_data.inspect).to be_an String + end + end + end + + describe "extract" do + let(:template) { + Addressable::Template.new( + "http://{host}{/segments*}/{?one,two,bogus}{#fragment}" + ) + } + let(:uri){ "http://example.com/a/b/c/?one=1&two=2#foo" } + let(:uri2){ "http://example.com/a/b/c/#foo" } + it "should be able to extract with queries" do + expect(template.extract(uri)).to eq({ + "host" => "example.com", + "segments" => %w(a b c), + "one" => "1", + "bogus" => nil, + "two" => "2", + "fragment" => "foo" + }) + end + it "should be able to extract without queries" do + expect(template.extract(uri2)).to eq({ + "host" => "example.com", + "segments" => %w(a b c), + "one" => nil, + "bogus" => nil, + "two" => nil, + "fragment" => "foo" + }) + end + + context "issue #137" do + subject { Addressable::Template.new('/path{?page,per_page}') } + + it "can match empty" do + data = subject.extract("/path") + expect(data["page"]).to eq(nil) + expect(data["per_page"]).to eq(nil) + expect(data.keys.sort).to eq(['page', 'per_page']) + end + + it "can match first var" do + data = subject.extract("/path?page=1") + expect(data["page"]).to eq("1") + expect(data["per_page"]).to eq(nil) + expect(data.keys.sort).to eq(['page', 'per_page']) + end + + it "can match second var" do + data = subject.extract("/path?per_page=1") + expect(data["page"]).to eq(nil) + expect(data["per_page"]).to eq("1") + expect(data.keys.sort).to eq(['page', 'per_page']) + end + + it "can match both vars" do + data = subject.extract("/path?page=2&per_page=1") + expect(data["page"]).to eq("2") + expect(data["per_page"]).to eq("1") + expect(data.keys.sort).to eq(['page', 'per_page']) + end + end + end + + describe "Partial expand with symbols" do + context "partial_expand with two simple values" do + subject { + Addressable::Template.new("http://example.com/{one}/{two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1").pattern).to eq( + "http://example.com/1/{two}/" + ) + end + end + context "partial_expand query with missing param in middle" do + subject { + Addressable::Template.new("http://example.com/{?one,two,three}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1", :three => "3").pattern).to eq( + "http://example.com/?one=1{&two}&three=3/" + ) + end + end + context "partial_expand form style query with missing param at beginning" do + subject { + Addressable::Template.new("http://example.com/{?one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:two => "2").pattern).to eq( + "http://example.com/?two=2{&one}/" + ) + end + end + context "partial_expand with query string" do + subject { + Addressable::Template.new("http://example.com/{?two,one}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1").pattern).to eq( + "http://example.com/?one=1{&two}/" + ) + end + end + context "partial_expand with path operator" do + subject { + Addressable::Template.new("http://example.com{/one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1").pattern).to eq( + "http://example.com/1{/two}/" + ) + end + end + context "partial expand with unicode values" do + subject do + Addressable::Template.new("http://example.com/{resource}/{query}/") + end + it "normalizes unicode by default" do + template = subject.partial_expand("query" => "Cafe\u0301") + expect(template.pattern).to eq( + "http://example.com/{resource}/Caf%C3%A9/" + ) + end + + it "does not normalize unicode when byte semantics requested" do + template = subject.partial_expand({"query" => "Cafe\u0301"}, nil, false) + expect(template.pattern).to eq( + "http://example.com/{resource}/Cafe%CC%81/" + ) + end + end + end + describe "Partial expand with strings" do + context "partial_expand with two simple values" do + subject { + Addressable::Template.new("http://example.com/{one}/{two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/1/{two}/" + ) + end + end + context "partial_expand query with missing param in middle" do + subject { + Addressable::Template.new("http://example.com/{?one,two,three}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq( + "http://example.com/?one=1{&two}&three=3/" + ) + end + end + context "partial_expand with query string" do + subject { + Addressable::Template.new("http://example.com/{?two,one}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/?one=1{&two}/" + ) + end + end + context "partial_expand with path operator" do + subject { + Addressable::Template.new("http://example.com{/one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/1{/two}/" + ) + end + end + end + describe "Expand" do + context "expand with unicode values" do + subject do + Addressable::Template.new("http://example.com/search/{query}/") + end + it "normalizes unicode by default" do + uri = subject.expand("query" => "Cafe\u0301").to_str + expect(uri).to eq("http://example.com/search/Caf%C3%A9/") + end + + it "does not normalize unicode when byte semantics requested" do + uri = subject.expand({ "query" => "Cafe\u0301" }, nil, false).to_str + expect(uri).to eq("http://example.com/search/Cafe%CC%81/") + end + end + context "expand with a processor" do + subject { + Addressable::Template.new("http://example.com/search/{query}/") + } + it "processes spaces" do + expect(subject.expand({"query" => "an example search query"}, + ExampleTwoProcessor).to_str).to eq( + "http://example.com/search/an+example+search+query/" + ) + end + it "validates" do + expect{ + subject.expand({"query" => "Bogus!"}, + ExampleTwoProcessor).to_str + }.to raise_error(Addressable::Template::InvalidTemplateValueError) + end + end + context "partial_expand query with missing param in middle" do + subject { + Addressable::Template.new("http://example.com/{?one,two,three}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq( + "http://example.com/?one=1{&two}&three=3/" + ) + end + end + context "partial_expand with query string" do + subject { + Addressable::Template.new("http://example.com/{?two,one}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/?one=1{&two}/" + ) + end + end + context "partial_expand with path operator" do + subject { + Addressable::Template.new("http://example.com{/one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/1{/two}/" + ) + end + end + end + context "Matching with operators" do + describe "Level 1:" do + subject { Addressable::Template.new("foo{foo}/{bar}baz") } + it "can match" do + data = subject.match("foofoo/bananabaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("banana") + end + it "can fail" do + expect(subject.match("bar/foo")).to be_nil + expect(subject.match("foobaz")).to be_nil + end + it "can match empty" do + data = subject.match("foo/baz") + expect(data.mapping["foo"]).to eq(nil) + expect(data.mapping["bar"]).to eq(nil) + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + + describe "Level 2:" do + subject { Addressable::Template.new("foo{+foo}{#bar}baz") } + it "can match" do + data = subject.match("foo/test/banana#bazbaz") + expect(data.mapping["foo"]).to eq("/test/banana") + expect(data.mapping["bar"]).to eq("baz") + end + it "can match empty level 2 #" do + data = subject.match("foo/test/bananabaz") + expect(data.mapping["foo"]).to eq("/test/banana") + expect(data.mapping["bar"]).to eq(nil) + data = subject.match("foo/test/banana#baz") + expect(data.mapping["foo"]).to eq("/test/banana") + expect(data.mapping["bar"]).to eq("") + end + it "can match empty level 2 +" do + data = subject.match("foobaz") + expect(data.mapping["foo"]).to eq(nil) + expect(data.mapping["bar"]).to eq(nil) + data = subject.match("foo#barbaz") + expect(data.mapping["foo"]).to eq(nil) + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + + describe "Level 3:" do + context "no operator" do + subject { Addressable::Template.new("foo{foo,bar}baz") } + it "can match" do + data = subject.match("foofoo,barbaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context "+ operator" do + subject { Addressable::Template.new("foo{+foo,bar}baz") } + it "can match" do + data = subject.match("foofoo/bar,barbaz") + expect(data.mapping["bar"]).to eq("foo/bar,bar") + expect(data.mapping["foo"]).to eq("") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context ". operator" do + subject { Addressable::Template.new("foo{.foo,bar}baz") } + it "can match" do + data = subject.match("foo.foo.barbaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context "/ operator" do + subject { Addressable::Template.new("foo{/foo,bar}baz") } + it "can match" do + data = subject.match("foo/foo/barbaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context "; operator" do + subject { Addressable::Template.new("foo{;foo,bar,baz}baz") } + it "can match" do + data = subject.match("foo;foo=bar%20baz;bar=foo;bazbaz") + expect(data.mapping["foo"]).to eq("bar baz") + expect(data.mapping["bar"]).to eq("foo") + expect(data.mapping["baz"]).to eq("") + end + it "lists vars" do + expect(subject.variables).to eq(%w(foo bar baz)) + end + end + context "? operator" do + context "test" do + subject { Addressable::Template.new("foo{?foo,bar}baz") } + it "can match" do + data = subject.match("foo?foo=bar%20baz&bar=foobaz") + expect(data.mapping["foo"]).to eq("bar baz") + expect(data.mapping["bar"]).to eq("foo") + end + it "lists vars" do + expect(subject.variables).to eq(%w(foo bar)) + end + end + + context "issue #137" do + subject { Addressable::Template.new('/path{?page,per_page}') } + + it "can match empty" do + data = subject.match("/path") + expect(data.mapping["page"]).to eq(nil) + expect(data.mapping["per_page"]).to eq(nil) + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + + it "can match first var" do + data = subject.match("/path?page=1") + expect(data.mapping["page"]).to eq("1") + expect(data.mapping["per_page"]).to eq(nil) + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + + it "can match second var" do + data = subject.match("/path?per_page=1") + expect(data.mapping["page"]).to eq(nil) + expect(data.mapping["per_page"]).to eq("1") + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + + it "can match both vars" do + data = subject.match("/path?page=2&per_page=1") + expect(data.mapping["page"]).to eq("2") + expect(data.mapping["per_page"]).to eq("1") + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + end + + context "issue #71" do + subject { Addressable::Template.new("http://cyberscore.dev/api/users{?username}") } + it "can match" do + data = subject.match("http://cyberscore.dev/api/users?username=foobaz") + expect(data.mapping["username"]).to eq("foobaz") + end + it "lists vars" do + expect(subject.variables).to eq(%w(username)) + expect(subject.keys).to eq(%w(username)) + end + end + end + context "& operator" do + subject { Addressable::Template.new("foo{&foo,bar}baz") } + it "can match" do + data = subject.match("foo&foo=bar%20baz&bar=foobaz") + expect(data.mapping["foo"]).to eq("bar baz") + expect(data.mapping["bar"]).to eq("foo") + end + it "lists vars" do + expect(subject.variables).to eq(%w(foo bar)) + end + end + end + end + + context "support regexes:" do + context "EXPRESSION" do + subject { Addressable::Template::EXPRESSION } + it "should be able to match an expression" do + expect(subject).to match("{foo}") + expect(subject).to match("{foo,9}") + expect(subject).to match("{foo.bar,baz}") + expect(subject).to match("{+foo.bar,baz}") + expect(subject).to match("{foo,foo%20bar}") + expect(subject).to match("{#foo:20,baz*}") + expect(subject).to match("stuff{#foo:20,baz*}things") + end + it "should fail on non vars" do + expect(subject).not_to match("!{foo") + expect(subject).not_to match("{foo.bar.}") + expect(subject).not_to match("!{}") + end + end + context "VARNAME" do + subject { Addressable::Template::VARNAME } + it "should be able to match a variable" do + expect(subject).to match("foo") + expect(subject).to match("9") + expect(subject).to match("foo.bar") + expect(subject).to match("foo_bar") + expect(subject).to match("foo_bar.baz") + expect(subject).to match("foo%20bar") + expect(subject).to match("foo%20bar.baz") + end + it "should fail on non vars" do + expect(subject).not_to match("!foo") + expect(subject).not_to match("foo.bar.") + expect(subject).not_to match("foo%2%00bar") + expect(subject).not_to match("foo_ba%r") + expect(subject).not_to match("foo_bar*") + expect(subject).not_to match("foo_bar:20") + end + end + context "VARIABLE_LIST" do + subject { Addressable::Template::VARIABLE_LIST } + it "should be able to match a variable list" do + expect(subject).to match("foo,bar") + expect(subject).to match("foo") + expect(subject).to match("foo,bar*,baz") + expect(subject).to match("foo.bar,bar_baz*,baz:12") + end + it "should fail on non vars" do + expect(subject).not_to match(",foo,bar*,baz") + expect(subject).not_to match("foo,*bar,baz") + expect(subject).not_to match("foo,,bar*,baz") + end + end + context "VARSPEC" do + subject { Addressable::Template::VARSPEC } + it "should be able to match a variable with modifier" do + expect(subject).to match("9:8") + expect(subject).to match("foo.bar*") + expect(subject).to match("foo_bar:12") + expect(subject).to match("foo_bar.baz*") + expect(subject).to match("foo%20bar:12") + expect(subject).to match("foo%20bar.baz*") + end + it "should fail on non vars" do + expect(subject).not_to match("!foo") + expect(subject).not_to match("*foo") + expect(subject).not_to match("fo*o") + expect(subject).not_to match("fo:o") + expect(subject).not_to match("foo:") + end + end + end +end + +describe Addressable::Template::MatchData do + let(:template) { Addressable::Template.new('{foo}/{bar}') } + subject(:its) { template.match('ab/cd') } + its(:uri) { should == Addressable::URI.parse('ab/cd') } + its(:template) { should == template } + its(:mapping) { should == { 'foo' => 'ab', 'bar' => 'cd' } } + its(:variables) { should == ['foo', 'bar'] } + its(:keys) { should == ['foo', 'bar'] } + its(:names) { should == ['foo', 'bar'] } + its(:values) { should == ['ab', 'cd'] } + its(:captures) { should == ['ab', 'cd'] } + its(:to_a) { should == ['ab/cd', 'ab', 'cd'] } + its(:to_s) { should == 'ab/cd' } + its(:string) { should == its.to_s } + its(:pre_match) { should == "" } + its(:post_match) { should == "" } + + describe 'values_at' do + it 'returns an array with the values' do + expect(its.values_at(0, 2)).to eq(['ab/cd', 'cd']) + end + it 'allows mixing integer an string keys' do + expect(its.values_at('foo', 1)).to eq(['ab', 'ab']) + end + it 'accepts unknown keys' do + expect(its.values_at('baz', 'foo')).to eq([nil, 'ab']) + end + end + + describe '[]' do + context 'string key' do + it 'returns the corresponding capture' do + expect(its['foo']).to eq('ab') + expect(its['bar']).to eq('cd') + end + it 'returns nil for unknown keys' do + expect(its['baz']).to be_nil + end + end + context 'symbol key' do + it 'returns the corresponding capture' do + expect(its[:foo]).to eq('ab') + expect(its[:bar]).to eq('cd') + end + it 'returns nil for unknown keys' do + expect(its[:baz]).to be_nil + end + end + context 'integer key' do + it 'returns the full URI for index 0' do + expect(its[0]).to eq('ab/cd') + end + it 'returns the corresponding capture' do + expect(its[1]).to eq('ab') + expect(its[2]).to eq('cd') + end + it 'returns nil for unknown keys' do + expect(its[3]).to be_nil + end + end + context 'other key' do + it 'raises an exception' do + expect { its[Object.new] }.to raise_error(TypeError) + end + end + context 'with length' do + it 'returns an array starting at index with given length' do + expect(its[0, 2]).to eq(['ab/cd', 'ab']) + expect(its[2, 1]).to eq(['cd']) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb new file mode 100644 index 0000000..9a15c28 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb @@ -0,0 +1,6468 @@ +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "addressable/uri" +require "uri" +require "ipaddr" + +if !"".respond_to?("force_encoding") + class String + def force_encoding(encoding) + @encoding = encoding + end + + def encoding + @encoding ||= Encoding::ASCII_8BIT + end + end + + class Encoding + def initialize(name) + @name = name + end + + def to_s + return @name + end + + UTF_8 = Encoding.new("UTF-8") + ASCII_8BIT = Encoding.new("US-ASCII") + end +end + +module Fake + module URI + class HTTP + def initialize(uri) + @uri = uri + end + + def to_s + return @uri.to_s + end + + alias :to_str :to_s + end + end +end + +describe Addressable::URI, "when created with a non-numeric port number" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:port => "bogus") + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a invalid encoded port number" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:port => "%eb") + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a non-string scheme" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:scheme => :bogus) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string user" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:user => :bogus) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string password" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:password => :bogus) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string userinfo" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:userinfo => :bogus) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string host" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:host => :bogus) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string authority" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:authority => :bogus) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string path" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:path => :bogus) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string query" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:query => :bogus) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string fragment" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:fragment => :bogus) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a scheme but no hierarchical " + + "segment" do + it "should raise an error" do + expect(lambda do + Addressable::URI.parse("http:") + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "quote handling" do + describe 'in host name' do + it "should raise an error for single quote" do + expect(lambda do + Addressable::URI.parse("http://local\"host/") + end).to raise_error(Addressable::URI::InvalidURIError) + end + end +end + +describe Addressable::URI, "newline normalization" do + it "should not accept newlines in scheme" do + expect(lambda do + Addressable::URI.parse("ht%0atp://localhost/") + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not unescape newline in path" do + uri = Addressable::URI.parse("http://localhost/%0a").normalize + expect(uri.to_s).to eq("http://localhost/%0A") + end + + it "should not unescape newline in hostname" do + uri = Addressable::URI.parse("http://local%0ahost/").normalize + expect(uri.to_s).to eq("http://local%0Ahost/") + end + + it "should not unescape newline in username" do + uri = Addressable::URI.parse("http://foo%0abar@localhost/").normalize + expect(uri.to_s).to eq("http://foo%0Abar@localhost/") + end + + it "should not unescape newline in username" do + uri = Addressable::URI.parse("http://example:foo%0abar@example/").normalize + expect(uri.to_s).to eq("http://example:foo%0Abar@example/") + end + + it "should not accept newline in hostname" do + uri = Addressable::URI.parse("http://localhost/") + expect(lambda do + uri.host = "local\nhost" + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with ambiguous path" do + it "should raise an error" do + expect(lambda do + Addressable::URI.parse("::http") + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with an invalid host" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:host => "") + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a host consisting of " + + "sub-delims characters" do + it "should not raise an error" do + expect(lambda do + Addressable::URI.new( + :host => Addressable::URI::CharacterClasses::SUB_DELIMS.gsub(/\\/, '') + ) + end).not_to raise_error + end +end + +describe Addressable::URI, "when created with a host consisting of " + + "unreserved characters" do + it "should not raise an error" do + expect(lambda do + Addressable::URI.new( + :host => Addressable::URI::CharacterClasses::UNRESERVED.gsub(/\\/, '') + ) + end).not_to raise_error + end +end + +describe Addressable::URI, "when created from nil components" do + before do + @uri = Addressable::URI.new + end + + it "should have a nil site value" do + expect(@uri.site).to eq(nil) + end + + it "should have an empty path" do + expect(@uri.path).to eq("") + end + + it "should be an empty uri" do + expect(@uri.to_s).to eq("") + end + + it "should have a nil default port" do + expect(@uri.default_port).to eq(nil) + end + + it "should be empty" do + expect(@uri).to be_empty + end + + it "should raise an error if the scheme is set to whitespace" do + expect(lambda do + @uri.scheme = "\t \n" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if the scheme is set to all digits" do + expect(lambda do + @uri.scheme = "123" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if the scheme begins with a digit" do + expect(lambda do + @uri.scheme = "1scheme" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if the scheme begins with a plus" do + expect(lambda do + @uri.scheme = "+scheme" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if the scheme begins with a dot" do + expect(lambda do + @uri.scheme = ".scheme" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if the scheme begins with a dash" do + expect(lambda do + @uri.scheme = "-scheme" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if the scheme contains an illegal character" do + expect(lambda do + @uri.scheme = "scheme!" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if the scheme contains whitespace" do + expect(lambda do + @uri.scheme = "sch eme" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if the scheme contains a newline" do + expect(lambda do + @uri.scheme = "sch\neme" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect(lambda do + @uri.user = "user" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect(lambda do + @uri.password = "pass" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect(lambda do + @uri.scheme = "http" + @uri.fragment = "fragment" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect(lambda do + @uri.fragment = "fragment" + @uri.scheme = "http" + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when initialized from individual components" do + before do + @uri = Addressable::URI.new( + :scheme => "http", + :user => "user", + :password => "password", + :host => "example.com", + :port => 8080, + :path => "/path", + :query => "query=value", + :fragment => "fragment" + ) + end + + it "returns 'http' for #scheme" do + expect(@uri.scheme).to eq("http") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + end + + it "returns 'user' for #user" do + expect(@uri.user).to eq("user") + end + + it "returns 'user' for #normalized_user" do + expect(@uri.normalized_user).to eq("user") + end + + it "returns 'password' for #password" do + expect(@uri.password).to eq("password") + end + + it "returns 'password' for #normalized_password" do + expect(@uri.normalized_password).to eq("password") + end + + it "returns 'user:password' for #userinfo" do + expect(@uri.userinfo).to eq("user:password") + end + + it "returns 'user:password' for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq("user:password") + end + + it "returns 'example.com' for #host" do + expect(@uri.host).to eq("example.com") + end + + it "returns 'example.com' for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + end + + it "returns 'com' for #tld" do + expect(@uri.tld).to eq("com") + end + + it "returns 'user:password@example.com:8080' for #authority" do + expect(@uri.authority).to eq("user:password@example.com:8080") + end + + it "returns 'user:password@example.com:8080' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("user:password@example.com:8080") + end + + it "returns 8080 for #port" do + expect(@uri.port).to eq(8080) + end + + it "returns 8080 for #normalized_port" do + expect(@uri.normalized_port).to eq(8080) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'http://user:password@example.com:8080' for #site" do + expect(@uri.site).to eq("http://user:password@example.com:8080") + end + + it "returns 'http://user:password@example.com:8080' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") + end + + it "returns '/path' for #path" do + expect(@uri.path).to eq("/path") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + end + + it "returns 'query=value' for #query" do + expect(@uri.query).to eq("query=value") + end + + it "returns 'query=value' for #normalized_query" do + expect(@uri.normalized_query).to eq("query=value") + end + + it "returns 'fragment' for #fragment" do + expect(@uri.fragment).to eq("fragment") + end + + it "returns 'fragment' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("fragment") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq( + "http://user:password@example.com:8080/path?query=value#fragment" + ) + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should not be frozen" do + expect(@uri).not_to be_frozen + end + + it "should allow destructive operations" do + expect { @uri.normalize! }.not_to raise_error + end +end + +describe Addressable::URI, "when initialized from " + + "frozen individual components" do + before do + @uri = Addressable::URI.new( + :scheme => "http".freeze, + :user => "user".freeze, + :password => "password".freeze, + :host => "example.com".freeze, + :port => "8080".freeze, + :path => "/path".freeze, + :query => "query=value".freeze, + :fragment => "fragment".freeze + ) + end + + it "returns 'http' for #scheme" do + expect(@uri.scheme).to eq("http") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + end + + it "returns 'user' for #user" do + expect(@uri.user).to eq("user") + end + + it "returns 'user' for #normalized_user" do + expect(@uri.normalized_user).to eq("user") + end + + it "returns 'password' for #password" do + expect(@uri.password).to eq("password") + end + + it "returns 'password' for #normalized_password" do + expect(@uri.normalized_password).to eq("password") + end + + it "returns 'user:password' for #userinfo" do + expect(@uri.userinfo).to eq("user:password") + end + + it "returns 'user:password' for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq("user:password") + end + + it "returns 'example.com' for #host" do + expect(@uri.host).to eq("example.com") + end + + it "returns 'example.com' for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + end + + it "returns 'user:password@example.com:8080' for #authority" do + expect(@uri.authority).to eq("user:password@example.com:8080") + end + + it "returns 'user:password@example.com:8080' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("user:password@example.com:8080") + end + + it "returns 8080 for #port" do + expect(@uri.port).to eq(8080) + end + + it "returns 8080 for #normalized_port" do + expect(@uri.normalized_port).to eq(8080) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'http://user:password@example.com:8080' for #site" do + expect(@uri.site).to eq("http://user:password@example.com:8080") + end + + it "returns 'http://user:password@example.com:8080' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") + end + + it "returns '/path' for #path" do + expect(@uri.path).to eq("/path") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + end + + it "returns 'query=value' for #query" do + expect(@uri.query).to eq("query=value") + end + + it "returns 'query=value' for #normalized_query" do + expect(@uri.normalized_query).to eq("query=value") + end + + it "returns 'fragment' for #fragment" do + expect(@uri.fragment).to eq("fragment") + end + + it "returns 'fragment' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("fragment") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq( + "http://user:password@example.com:8080/path?query=value#fragment" + ) + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should not be frozen" do + expect(@uri).not_to be_frozen + end + + it "should allow destructive operations" do + expect { @uri.normalize! }.not_to raise_error + end +end + +describe Addressable::URI, "when parsed from a frozen string" do + before do + @uri = Addressable::URI.parse( + "http://user:password@example.com:8080/path?query=value#fragment".freeze + ) + end + + it "returns 'http' for #scheme" do + expect(@uri.scheme).to eq("http") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + end + + it "returns 'user' for #user" do + expect(@uri.user).to eq("user") + end + + it "returns 'user' for #normalized_user" do + expect(@uri.normalized_user).to eq("user") + end + + it "returns 'password' for #password" do + expect(@uri.password).to eq("password") + end + + it "returns 'password' for #normalized_password" do + expect(@uri.normalized_password).to eq("password") + end + + it "returns 'user:password' for #userinfo" do + expect(@uri.userinfo).to eq("user:password") + end + + it "returns 'user:password' for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq("user:password") + end + + it "returns 'example.com' for #host" do + expect(@uri.host).to eq("example.com") + end + + it "returns 'example.com' for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + end + + it "returns 'user:password@example.com:8080' for #authority" do + expect(@uri.authority).to eq("user:password@example.com:8080") + end + + it "returns 'user:password@example.com:8080' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("user:password@example.com:8080") + end + + it "returns 8080 for #port" do + expect(@uri.port).to eq(8080) + end + + it "returns 8080 for #normalized_port" do + expect(@uri.normalized_port).to eq(8080) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'http://user:password@example.com:8080' for #site" do + expect(@uri.site).to eq("http://user:password@example.com:8080") + end + + it "returns 'http://user:password@example.com:8080' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") + end + + it "returns '/path' for #path" do + expect(@uri.path).to eq("/path") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + end + + it "returns 'query=value' for #query" do + expect(@uri.query).to eq("query=value") + end + + it "returns 'query=value' for #normalized_query" do + expect(@uri.normalized_query).to eq("query=value") + end + + it "returns 'fragment' for #fragment" do + expect(@uri.fragment).to eq("fragment") + end + + it "returns 'fragment' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("fragment") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq( + "http://user:password@example.com:8080/path?query=value#fragment" + ) + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should not be frozen" do + expect(@uri).not_to be_frozen + end + + it "should allow destructive operations" do + expect { @uri.normalize! }.not_to raise_error + end +end + +describe Addressable::URI, "when frozen" do + before do + @uri = Addressable::URI.new.freeze + end + + it "returns nil for #scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "returns nil for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq(nil) + end + + it "returns nil for #user" do + expect(@uri.user).to eq(nil) + end + + it "returns nil for #normalized_user" do + expect(@uri.normalized_user).to eq(nil) + end + + it "returns nil for #password" do + expect(@uri.password).to eq(nil) + end + + it "returns nil for #normalized_password" do + expect(@uri.normalized_password).to eq(nil) + end + + it "returns nil for #userinfo" do + expect(@uri.userinfo).to eq(nil) + end + + it "returns nil for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq(nil) + end + + it "returns nil for #host" do + expect(@uri.host).to eq(nil) + end + + it "returns nil for #normalized_host" do + expect(@uri.normalized_host).to eq(nil) + end + + it "returns nil for #authority" do + expect(@uri.authority).to eq(nil) + end + + it "returns nil for #normalized_authority" do + expect(@uri.normalized_authority).to eq(nil) + end + + it "returns nil for #port" do + expect(@uri.port).to eq(nil) + end + + it "returns nil for #normalized_port" do + expect(@uri.normalized_port).to eq(nil) + end + + it "returns nil for #default_port" do + expect(@uri.default_port).to eq(nil) + end + + it "returns nil for #site" do + expect(@uri.site).to eq(nil) + end + + it "returns nil for #normalized_site" do + expect(@uri.normalized_site).to eq(nil) + end + + it "returns '' for #path" do + expect(@uri.path).to eq('') + end + + it "returns '' for #normalized_path" do + expect(@uri.normalized_path).to eq('') + end + + it "returns nil for #query" do + expect(@uri.query).to eq(nil) + end + + it "returns nil for #normalized_query" do + expect(@uri.normalized_query).to eq(nil) + end + + it "returns nil for #fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "returns nil for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq(nil) + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq('') + end + + it "should be empty" do + expect(@uri).to be_empty + end + + it "should be frozen" do + expect(@uri).to be_frozen + end + + it "should not be frozen after duping" do + expect(@uri.dup).not_to be_frozen + end + + it "should not allow destructive operations" do + expect { @uri.normalize! }.to raise_error { |error| + expect(error.message).to match(/can't modify frozen/) + expect(error).to satisfy { |e| RuntimeError === e || TypeError === e } + } + end +end + +describe Addressable::URI, "when frozen" do + before do + @uri = Addressable::URI.parse( + "HTTP://example.com.:%38%30/%70a%74%68?a=%31#1%323" + ).freeze + end + + it "returns 'HTTP' for #scheme" do + expect(@uri.scheme).to eq("HTTP") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + expect(@uri.normalize.scheme).to eq("http") + end + + it "returns nil for #user" do + expect(@uri.user).to eq(nil) + end + + it "returns nil for #normalized_user" do + expect(@uri.normalized_user).to eq(nil) + end + + it "returns nil for #password" do + expect(@uri.password).to eq(nil) + end + + it "returns nil for #normalized_password" do + expect(@uri.normalized_password).to eq(nil) + end + + it "returns nil for #userinfo" do + expect(@uri.userinfo).to eq(nil) + end + + it "returns nil for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq(nil) + end + + it "returns 'example.com.' for #host" do + expect(@uri.host).to eq("example.com.") + end + + it "returns nil for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + expect(@uri.normalize.host).to eq("example.com") + end + + it "returns 'example.com.:80' for #authority" do + expect(@uri.authority).to eq("example.com.:80") + end + + it "returns 'example.com:80' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("example.com") + expect(@uri.normalize.authority).to eq("example.com") + end + + it "returns 80 for #port" do + expect(@uri.port).to eq(80) + end + + it "returns nil for #normalized_port" do + expect(@uri.normalized_port).to eq(nil) + expect(@uri.normalize.port).to eq(nil) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'HTTP://example.com.:80' for #site" do + expect(@uri.site).to eq("HTTP://example.com.:80") + end + + it "returns 'http://example.com' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://example.com") + expect(@uri.normalize.site).to eq("http://example.com") + end + + it "returns '/%70a%74%68' for #path" do + expect(@uri.path).to eq("/%70a%74%68") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + expect(@uri.normalize.path).to eq("/path") + end + + it "returns 'a=%31' for #query" do + expect(@uri.query).to eq("a=%31") + end + + it "returns 'a=1' for #normalized_query" do + expect(@uri.normalized_query).to eq("a=1") + expect(@uri.normalize.query).to eq("a=1") + end + + it "returns '/%70a%74%68?a=%31' for #request_uri" do + expect(@uri.request_uri).to eq("/%70a%74%68?a=%31") + end + + it "returns '1%323' for #fragment" do + expect(@uri.fragment).to eq("1%323") + end + + it "returns '123' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("123") + expect(@uri.normalize.fragment).to eq("123") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq('HTTP://example.com.:80/%70a%74%68?a=%31#1%323') + expect(@uri.normalize.to_s).to eq('http://example.com/path?a=1#123') + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should be frozen" do + expect(@uri).to be_frozen + end + + it "should not be frozen after duping" do + expect(@uri.dup).not_to be_frozen + end + + it "should not allow destructive operations" do + expect { @uri.normalize! }.to raise_error { |error| + expect(error.message).to match(/can't modify frozen/) + expect(error).to satisfy { |e| RuntimeError === e || TypeError === e } + } + end +end + +describe Addressable::URI, "when created from string components" do + before do + @uri = Addressable::URI.new( + :scheme => "http", :host => "example.com" + ) + end + + it "should have a site value of 'http://example.com'" do + expect(@uri.site).to eq("http://example.com") + end + + it "should be equal to the equivalent parsed URI" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should raise an error if invalid components omitted" do + expect(lambda do + @uri.omit(:bogus) + end).to raise_error(ArgumentError) + expect(lambda do + @uri.omit(:scheme, :bogus, :path) + end).to raise_error(ArgumentError) + end +end + +describe Addressable::URI, "when created with a nil host but " + + "non-nil authority components" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:user => "user", :password => "pass", :port => 80) + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with both an authority and a user" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new( + :user => "user", :authority => "user@example.com:80" + ) + end).to raise_error(ArgumentError) + end +end + +describe Addressable::URI, "when created with an authority and no port" do + before do + @uri = Addressable::URI.new(:authority => "user@example.com") + end + + it "should not infer a port" do + expect(@uri.port).to eq(nil) + expect(@uri.default_port).to eq(nil) + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a site value of '//user@example.com'" do + expect(@uri.site).to eq("//user@example.com") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when created with a host with trailing dots" do + before do + @uri = Addressable::URI.new(:authority => "example...") + end + + it "should have a stable normalized form" do + expect(@uri.normalize.normalize.normalize.host).to eq( + @uri.normalize.host + ) + end +end + +describe Addressable::URI, "when created with a host with a backslash" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:authority => "example\\example") + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a host with a slash" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:authority => "example/example") + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a host with a space" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:authority => "example example") + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with both a userinfo and a user" do + it "should raise an error" do + expect(lambda do + Addressable::URI.new(:user => "user", :userinfo => "user:pass") + end).to raise_error(ArgumentError) + end +end + +describe Addressable::URI, "when created with a path that hasn't been " + + "prefixed with a '/' but a host specified" do + before do + @uri = Addressable::URI.new( + :scheme => "http", :host => "example.com", :path => "path" + ) + end + + it "should prefix a '/' to the path" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/path")) + end + + it "should have a site value of 'http://example.com'" do + expect(@uri.site).to eq("http://example.com") + end + + it "should have an origin of 'http://example.com" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when created with a path that hasn't been " + + "prefixed with a '/' but no host specified" do + before do + @uri = Addressable::URI.new( + :scheme => "http", :path => "path" + ) + end + + it "should not prefix a '/' to the path" do + expect(@uri).to eq(Addressable::URI.parse("http:path")) + end + + it "should have a site value of 'http:'" do + expect(@uri.site).to eq("http:") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from an Addressable::URI object" do + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.parse(original_uri) + new_uri.host = 'www.example.com' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('http://www.example.com/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end + + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.heuristic_parse(original_uri) + new_uri.host = 'www.example.com' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('http://www.example.com/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end + + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.parse(original_uri) + new_uri.origin = 'https://www.example.com:8080' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('https://www.example.com:8080/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end + + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.heuristic_parse(original_uri) + new_uri.origin = 'https://www.example.com:8080' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('https://www.example.com:8080/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end +end + +describe Addressable::URI, "when parsed from something that looks " + + "like a URI object" do + it "should parse without error" do + uri = Addressable::URI.parse(Fake::URI::HTTP.new("http://example.com/")) + expect(lambda do + Addressable::URI.parse(uri) + end).not_to raise_error + end +end + +describe Addressable::URI, "when parsed from a standard library URI object" do + it "should parse without error" do + uri = Addressable::URI.parse(URI.parse("http://example.com/")) + expect(lambda do + Addressable::URI.parse(uri) + end).not_to raise_error + end +end + +describe Addressable::URI, "when parsed from ''" do + before do + @uri = Addressable::URI.parse("") + end + + it "should have no scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of ''" do + expect(@uri.path).to eq("") + end + + it "should have a request URI of '/'" do + expect(@uri.request_uri).to eq("/") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'ftp://ftp.is.co.za/rfc/rfc1808.txt'" do + before do + @uri = Addressable::URI.parse("ftp://ftp.is.co.za/rfc/rfc1808.txt") + end + + it "should use the 'ftp' scheme" do + expect(@uri.scheme).to eq("ftp") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a host of 'ftp.is.co.za'" do + expect(@uri.host).to eq("ftp.is.co.za") + end + + it "should have inferred_port of 21" do + expect(@uri.inferred_port).to eq(21) + end + + it "should have a path of '/rfc/rfc1808.txt'" do + expect(@uri.path).to eq("/rfc/rfc1808.txt") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have an origin of 'ftp://ftp.is.co.za'" do + expect(@uri.origin).to eq('ftp://ftp.is.co.za') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'http://www.ietf.org/rfc/rfc2396.txt'" do + before do + @uri = Addressable::URI.parse("http://www.ietf.org/rfc/rfc2396.txt") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a host of 'www.ietf.org'" do + expect(@uri.host).to eq("www.ietf.org") + end + + it "should have inferred_port of 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/rfc/rfc2396.txt'" do + expect(@uri.path).to eq("/rfc/rfc2396.txt") + end + + it "should have a request URI of '/rfc/rfc2396.txt'" do + expect(@uri.request_uri).to eq("/rfc/rfc2396.txt") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should correctly omit components" do + expect(@uri.omit(:scheme).to_s).to eq("//www.ietf.org/rfc/rfc2396.txt") + expect(@uri.omit(:path).to_s).to eq("http://www.ietf.org") + end + + it "should correctly omit components destructively" do + @uri.omit!(:scheme) + expect(@uri.to_s).to eq("//www.ietf.org/rfc/rfc2396.txt") + end + + it "should have an origin of 'http://www.ietf.org'" do + expect(@uri.origin).to eq('http://www.ietf.org') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'ldap://[2001:db8::7]/c=GB?objectClass?one'" do + before do + @uri = Addressable::URI.parse("ldap://[2001:db8::7]/c=GB?objectClass?one") + end + + it "should use the 'ldap' scheme" do + expect(@uri.scheme).to eq("ldap") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a host of '[2001:db8::7]'" do + expect(@uri.host).to eq("[2001:db8::7]") + end + + it "should have inferred_port of 389" do + expect(@uri.inferred_port).to eq(389) + end + + it "should have a path of '/c=GB'" do + expect(@uri.path).to eq("/c=GB") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should not allow request URI assignment" do + expect(lambda do + @uri.request_uri = "/" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should have a query of 'objectClass?one'" do + expect(@uri.query).to eq("objectClass?one") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should correctly omit components" do + expect(@uri.omit(:scheme, :authority).to_s).to eq("/c=GB?objectClass?one") + expect(@uri.omit(:path).to_s).to eq("ldap://[2001:db8::7]?objectClass?one") + end + + it "should correctly omit components destructively" do + @uri.omit!(:scheme, :authority) + expect(@uri.to_s).to eq("/c=GB?objectClass?one") + end + + it "should raise an error if omission would create an invalid URI" do + expect(lambda do + @uri.omit(:authority, :path) + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should have an origin of 'ldap://[2001:db8::7]'" do + expect(@uri.origin).to eq('ldap://[2001:db8::7]') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'mailto:John.Doe@example.com'" do + before do + @uri = Addressable::URI.parse("mailto:John.Doe@example.com") + end + + it "should use the 'mailto' scheme" do + expect(@uri.scheme).to eq("mailto") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a path of 'John.Doe@example.com'" do + expect(@uri.path).to eq("John.Doe@example.com") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 2 of RFC 6068 +describe Addressable::URI, "when parsed from " + + "'mailto:?to=addr1@an.example,addr2@an.example'" do + before do + @uri = Addressable::URI.parse( + "mailto:?to=addr1@an.example,addr2@an.example" + ) + end + + it "should use the 'mailto' scheme" do + expect(@uri.scheme).to eq("mailto") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a path of ''" do + expect(@uri.path).to eq("") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should have the To: field value parameterized" do + expect(@uri.query_values(Hash)["to"]).to eq( + "addr1@an.example,addr2@an.example" + ) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'news:comp.infosystems.www.servers.unix'" do + before do + @uri = Addressable::URI.parse("news:comp.infosystems.www.servers.unix") + end + + it "should use the 'news' scheme" do + expect(@uri.scheme).to eq("news") + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of 'comp.infosystems.www.servers.unix'" do + expect(@uri.path).to eq("comp.infosystems.www.servers.unix") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'tel:+1-816-555-1212'" do + before do + @uri = Addressable::URI.parse("tel:+1-816-555-1212") + end + + it "should use the 'tel' scheme" do + expect(@uri.scheme).to eq("tel") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a path of '+1-816-555-1212'" do + expect(@uri.path).to eq("+1-816-555-1212") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'telnet://192.0.2.16:80/'" do + before do + @uri = Addressable::URI.parse("telnet://192.0.2.16:80/") + end + + it "should use the 'telnet' scheme" do + expect(@uri.scheme).to eq("telnet") + end + + it "should have a host of '192.0.2.16'" do + expect(@uri.host).to eq("192.0.2.16") + end + + it "should have a port of 80" do + expect(@uri.port).to eq(80) + end + + it "should have a inferred_port of 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a default_port of 23" do + expect(@uri.default_port).to eq(23) + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have an origin of 'telnet://192.0.2.16:80'" do + expect(@uri.origin).to eq('telnet://192.0.2.16:80') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'urn:oasis:names:specification:docbook:dtd:xml:4.1.2'" do + before do + @uri = Addressable::URI.parse( + "urn:oasis:names:specification:docbook:dtd:xml:4.1.2") + end + + it "should use the 'urn' scheme" do + expect(@uri.scheme).to eq("urn") + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of " + + "'oasis:names:specification:docbook:dtd:xml:4.1.2'" do + expect(@uri.path).to eq("oasis:names:specification:docbook:dtd:xml:4.1.2") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when heuristically parsed from " + + "'192.0.2.16:8000/path'" do + before do + @uri = Addressable::URI.heuristic_parse("192.0.2.16:8000/path") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a host of '192.0.2.16'" do + expect(@uri.host).to eq("192.0.2.16") + end + + it "should have a port of '8000'" do + expect(@uri.port).to eq(8000) + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a path of '/path'" do + expect(@uri.path).to eq("/path") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have an origin of 'http://192.0.2.16:8000'" do + expect(@uri.origin).to eq('http://192.0.2.16:8000') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com'" do + before do + @uri = Addressable::URI.parse("http://example.com") + end + + it "when inspected, should have the correct URI" do + expect(@uri.inspect).to include("http://example.com") + end + + it "when inspected, should have the correct class name" do + expect(@uri.inspect).to include("Addressable::URI") + end + + it "when inspected, should have the correct object id" do + expect(@uri.inspect).to include("%#0x" % @uri.object_id) + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should be considered ip-based" do + expect(@uri).to be_ip_based + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not have a specified port" do + expect(@uri.port).to eq(nil) + end + + it "should have an empty path" do + expect(@uri.path).to eq("") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + expect(@uri.query_values).to eq(nil) + end + + it "should have a request URI of '/'" do + expect(@uri.request_uri).to eq("/") + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should not be exactly equal to 42" do + expect(@uri.eql?(42)).to eq(false) + end + + it "should not be equal to 42" do + expect(@uri == 42).to eq(false) + end + + it "should not be roughly equal to 42" do + expect(@uri === 42).to eq(false) + end + + it "should be exactly equal to http://example.com" do + expect(@uri.eql?(Addressable::URI.parse("http://example.com"))).to eq(true) + end + + it "should be roughly equal to http://example.com/" do + expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true) + end + + it "should be roughly equal to the string 'http://example.com/'" do + expect(@uri === "http://example.com/").to eq(true) + end + + it "should not be roughly equal to the string " + + "'http://example.com:bogus/'" do + expect(lambda do + expect(@uri === "http://example.com:bogus/").to eq(false) + end).not_to raise_error + end + + it "should result in itself when joined with itself" do + expect(@uri.join(@uri).to_s).to eq("http://example.com") + expect(@uri.join!(@uri).to_s).to eq("http://example.com") + end + + it "should be equivalent to http://EXAMPLE.com" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com")) + end + + it "should be equivalent to http://EXAMPLE.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/")) + end + + it "should have the same hash as http://example.com" do + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash) + end + + it "should have the same hash as http://EXAMPLE.com after assignment" do + @uri.origin = "http://EXAMPLE.com" + expect(@uri.hash).to eq(Addressable::URI.parse("http://EXAMPLE.com").hash) + end + + it "should have a different hash from http://EXAMPLE.com" do + expect(@uri.hash).not_to eq(Addressable::URI.parse("http://EXAMPLE.com").hash) + end + + it "should not allow origin assignment without scheme" do + expect(lambda do + @uri.origin = "example.com" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow origin assignment without host" do + expect(lambda do + @uri.origin = "http://" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow origin assignment with bogus type" do + expect(lambda do + @uri.origin = :bogus + end).to raise_error(TypeError) + end + + # Section 6.2.3 of RFC 3986 + it "should be equivalent to http://example.com/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equivalent to http://example.com:/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equivalent to http://example.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) + end + + # Section 6.2.2.1 of RFC 3986 + it "should be equivalent to http://EXAMPLE.COM/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/")) + end + + it "should have a route of '/path/' to 'http://example.com/path/'" do + expect(@uri.route_to("http://example.com/path/")).to eq( + Addressable::URI.parse("/path/") + ) + end + + it "should have a route of '..' from 'http://example.com/path/'" do + expect(@uri.route_from("http://example.com/path/")).to eq( + Addressable::URI.parse("..") + ) + end + + it "should have a route of '#' to 'http://example.com/'" do + expect(@uri.route_to("http://example.com/")).to eq( + Addressable::URI.parse("#") + ) + end + + it "should have a route of 'http://elsewhere.com/' to " + + "'http://elsewhere.com/'" do + expect(@uri.route_to("http://elsewhere.com/")).to eq( + Addressable::URI.parse("http://elsewhere.com/") + ) + end + + it "when joined with 'relative/path' should be " + + "'http://example.com/relative/path'" do + expect(@uri.join('relative/path')).to eq( + Addressable::URI.parse("http://example.com/relative/path") + ) + end + + it "when joined with a bogus object a TypeError should be raised" do + expect(lambda do + @uri.join(42) + end).to raise_error(TypeError) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://newuser@example.com") + end + + it "should have the correct username after assignment" do + @uri.user = "user@123!" + expect(@uri.user).to eq("user@123!") + expect(@uri.normalized_user).to eq("user%40123%21") + expect(@uri.password).to eq(nil) + expect(@uri.normalize.to_s).to eq("http://user%40123%21@example.com/") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "#secret@123!" + expect(@uri.password).to eq("#secret@123!") + expect(@uri.normalized_password).to eq("%23secret%40123%21") + expect(@uri.user).to eq("") + expect(@uri.normalize.to_s).to eq("http://:%23secret%40123%21@example.com/") + expect(@uri.omit(:password).to_s).to eq("http://example.com") + end + + it "should have the correct user/pass after repeated assignment" do + @uri.user = nil + expect(@uri.user).to eq(nil) + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + # Username cannot be nil if the password is set + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + @uri.password = nil + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://newuser@example.com") + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + @uri.password = "" + expect(@uri.password).to eq("") + expect(@uri.to_s).to eq("http://newuser:@example.com") + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + @uri.user = nil + # Username cannot be nil if the password is set + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct user/pass after userinfo assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + @uri.userinfo = nil + expect(@uri.userinfo).to eq(nil) + expect(@uri.user).to eq(nil) + expect(@uri.password).to eq(nil) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +# Section 5.1.2 of RFC 2616 +describe Addressable::URI, "when parsed from " + + "'HTTP://www.w3.org/pub/WWW/TheProject.html'" do + before do + @uri = Addressable::URI.parse("HTTP://www.w3.org/pub/WWW/TheProject.html") + end + + it "should have the correct request URI" do + expect(@uri.request_uri).to eq("/pub/WWW/TheProject.html") + end + + it "should have the correct request URI after assignment" do + @uri.request_uri = "/some/where/else.html?query?string" + expect(@uri.request_uri).to eq("/some/where/else.html?query?string") + expect(@uri.path).to eq("/some/where/else.html") + expect(@uri.query).to eq("query?string") + end + + it "should have the correct request URI after assignment" do + @uri.request_uri = "?x=y" + expect(@uri.request_uri).to eq("/?x=y") + expect(@uri.path).to eq("/") + expect(@uri.query).to eq("x=y") + end + + it "should raise an error if the site value is set to something bogus" do + expect(lambda do + @uri.site = 42 + end).to raise_error(TypeError) + end + + it "should raise an error if the request URI is set to something bogus" do + expect(lambda do + @uri.request_uri = 42 + end).to raise_error(TypeError) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "HTTP", + :user => nil, + :password => nil, + :host => "www.w3.org", + :port => nil, + :path => "/pub/WWW/TheProject.html", + :query => nil, + :fragment => nil + }) + end + + it "should have an origin of 'http://www.w3.org'" do + expect(@uri.origin).to eq('http://www.w3.org') + end +end + +describe Addressable::URI, "when parsing IPv6 addresses" do + it "should not raise an error for " + + "'http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[fe80:0:0:0:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[fe80:0:0:0:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[fe80::200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[fe80::200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[::1]/'" do + Addressable::URI.parse("http://[::1]/") + end + + it "should not raise an error for " + + "'http://[fe80::1]/'" do + Addressable::URI.parse("http://[fe80::1]/") + end + + it "should raise an error for " + + "'http://[]/'" do + expect(lambda do + Addressable::URI.parse("http://[]/") + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when parsing IPv6 address" do + subject { Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") } + its(:host) { should == '[3ffe:1900:4545:3:200:f8ff:fe21:67cf]' } + its(:hostname) { should == '3ffe:1900:4545:3:200:f8ff:fe21:67cf' } +end + +describe Addressable::URI, "when assigning IPv6 address" do + it "should allow to set bare IPv6 address as hostname" do + uri = Addressable::URI.parse("http://[::1]/") + uri.hostname = '3ffe:1900:4545:3:200:f8ff:fe21:67cf' + expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/') + end + + it "should allow to set bare IPv6 address as hostname with IPAddr object" do + uri = Addressable::URI.parse("http://[::1]/") + uri.hostname = IPAddr.new('3ffe:1900:4545:3:200:f8ff:fe21:67cf') + expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/') + end + + it "should not allow to set bare IPv6 address as host" do + uri = Addressable::URI.parse("http://[::1]/") + skip "not checked" + expect(lambda do + uri.host = '3ffe:1900:4545:3:200:f8ff:fe21:67cf' + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when parsing IPvFuture addresses" do + it "should not raise an error for " + + "'http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[v12.fe80::200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[v12.fe80::200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[va0.::1]/'" do + Addressable::URI.parse("http://[va0.::1]/") + end + + it "should not raise an error for " + + "'http://[v255.fe80::1]/'" do + Addressable::URI.parse("http://[v255.fe80::1]/") + end + + it "should raise an error for " + + "'http://[v0.]/'" do + expect(lambda do + Addressable::URI.parse("http://[v0.]/") + end).to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/'" do + before do + @uri = Addressable::URI.parse("http://example.com/") + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to HTTP://example.com/" do + expect(@uri).to eq(Addressable::URI.parse("HTTP://example.com/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com:/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://Example.com/" do + expect(@uri).to eq(Addressable::URI.parse("http://Example.com/")) + end + + it "should have the correct username after assignment" do + @uri.user = nil + expect(@uri.user).to eq(nil) + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should have the correct password after assignment" do + @uri.password = nil + expect(@uri.password).to eq(nil) + expect(@uri.user).to eq(nil) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should have a request URI of '/'" do + expect(@uri.request_uri).to eq("/") + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have the same hash as its duplicate" do + expect(@uri.hash).to eq(@uri.dup.hash) + end + + it "should have a different hash from its equivalent String value" do + expect(@uri.hash).not_to eq(@uri.to_s.hash) + end + + it "should have the same hash as an equal URI" do + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash) + end + + it "should be equivalent to http://EXAMPLE.com" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com")) + end + + it "should be equivalent to http://EXAMPLE.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/")) + end + + it "should have the same hash as http://example.com/" do + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash) + end + + it "should have the same hash as http://example.com after assignment" do + @uri.path = "" + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash) + end + + it "should have the same hash as http://example.com/? after assignment" do + @uri.query = "" + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash) + end + + it "should have the same hash as http://example.com/? after assignment" do + @uri.query_values = {} + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash) + end + + it "should have the same hash as http://example.com/# after assignment" do + @uri.fragment = "" + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/#").hash) + end + + it "should have a different hash from http://example.com" do + expect(@uri.hash).not_to eq(Addressable::URI.parse("http://example.com").hash) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com?#'" do + before do + @uri = Addressable::URI.parse("http://example.com?#") + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "", + :query => "", + :fragment => "" + }) + end + + it "should have a request URI of '/?'" do + expect(@uri.request_uri).to eq("/?") + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq("http://example.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://@example.com/'" do + before do + @uri = Addressable::URI.parse("http://@example.com/") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => "", + :password => nil, + :host => "example.com", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com./'" do + before do + @uri = Addressable::URI.parse("http://example.com./") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://:@example.com/'" do + before do + @uri = Addressable::URI.parse("http://:@example.com/") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => "", + :password => "", + :host => "example.com", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'HTTP://EXAMPLE.COM/'" do + before do + @uri = Addressable::URI.parse("HTTP://EXAMPLE.COM/") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "HTTP", + :user => nil, + :password => nil, + :host => "EXAMPLE.COM", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end + + it "should have a tld of 'com'" do + expect(@uri.tld).to eq('com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.example.co.uk/'" do + before do + @uri = Addressable::URI.parse("http://www.example.co.uk/") + end + + it "should have an origin of 'http://www.example.co.uk'" do + expect(@uri.origin).to eq('http://www.example.co.uk') + end + + it "should have a tld of 'co.uk'" do + expect(@uri.tld).to eq('co.uk') + end + + it "should have a domain of 'example.co.uk'" do + expect(@uri.domain).to eq('example.co.uk') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://sub_domain.blogspot.com/'" do + before do + @uri = Addressable::URI.parse("http://sub_domain.blogspot.com/") + end + + it "should have an origin of 'http://sub_domain.blogspot.com'" do + expect(@uri.origin).to eq('http://sub_domain.blogspot.com') + end + + it "should have a tld of 'com'" do + expect(@uri.tld).to eq('com') + end + + it "should have a domain of 'blogspot.com'" do + expect(@uri.domain).to eq('blogspot.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/~smith/'" do + before do + @uri = Addressable::URI.parse("http://example.com/~smith/") + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com/%7Esmith/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7Esmith/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com/%7esmith/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7esmith/")) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/%E8'" do + before do + @uri = Addressable::URI.parse("http://example.com/%E8") + end + + it "should not raise an exception when normalized" do + expect(lambda do + @uri.normalize + end).not_to raise_error + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/%E8" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/%E8" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path%2Fsegment/'" do + before do + @uri = Addressable::URI.parse("http://example.com/path%2Fsegment/") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should be equal to 'http://example.com/path%2Fsegment/'" do + expect(@uri.normalize).to be_eql( + Addressable::URI.parse("http://example.com/path%2Fsegment/") + ) + end + + it "should not be equal to 'http://example.com/path/segment/'" do + expect(@uri).not_to eq( + Addressable::URI.parse("http://example.com/path/segment/") + ) + end + + it "should not be equal to 'http://example.com/path/segment/'" do + expect(@uri.normalize).not_to be_eql( + Addressable::URI.parse("http://example.com/path/segment/") + ) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?%F6'" do + before do + @uri = Addressable::URI.parse("http://example.com/?%F6") + end + + it "should not raise an exception when normalized" do + expect(lambda do + @uri.normalize + end).not_to raise_error + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/?%F6" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/?%F6" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/#%F6'" do + before do + @uri = Addressable::URI.parse("http://example.com/#%F6") + end + + it "should not raise an exception when normalized" do + expect(lambda do + @uri.normalize + end).not_to raise_error + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/#%F6" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/#%F6" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/%C3%87'" do + before do + @uri = Addressable::URI.parse("http://example.com/%C3%87") + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to 'http://example.com/C%CC%A7'" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/C%CC%A7")) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/%C3%87" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/%C3%87" + end + + it "should raise an error if encoding with an unexpected return type" do + expect(lambda do + Addressable::URI.normalized_encode(@uri, Integer) + end).to raise_error(TypeError) + end + + it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do + expect(Addressable::URI.encode(@uri).to_s).to eq( + "http://example.com/%25C3%2587" + ) + end + + it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do + expect(Addressable::URI.encode(@uri, Addressable::URI)).to eq( + Addressable::URI.parse("http://example.com/%25C3%2587") + ) + end + + it "should raise an error if encoding with an unexpected return type" do + expect(lambda do + Addressable::URI.encode(@uri, Integer) + end).to raise_error(TypeError) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=string'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=string") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should have a query string of 'q=string'" do + expect(@uri.query).to eq("q=string") + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com:80/'" do + before do + @uri = Addressable::URI.parse("http://example.com:80/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com:80'" do + expect(@uri.authority).to eq("example.com:80") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have explicit port 80" do + expect(@uri.port).to eq(80) + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be exactly equal to http://example.com:80/" do + expect(@uri.eql?(Addressable::URI.parse("http://example.com:80/"))).to eq(true) + end + + it "should be roughly equal to http://example.com/" do + expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true) + end + + it "should be roughly equal to the string 'http://example.com/'" do + expect(@uri === "http://example.com/").to eq(true) + end + + it "should not be roughly equal to the string " + + "'http://example.com:bogus/'" do + expect(lambda do + expect(@uri === "http://example.com:bogus/").to eq(false) + end).not_to raise_error + end + + it "should result in itself when joined with itself" do + expect(@uri.join(@uri).to_s).to eq("http://example.com:80/") + expect(@uri.join!(@uri).to_s).to eq("http://example.com:80/") + end + + # Section 6.2.3 of RFC 3986 + it "should be equal to http://example.com/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equal to http://example.com:/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equal to http://example.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) + end + + # Section 6.2.2.1 of RFC 3986 + it "should be equal to http://EXAMPLE.COM/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => 80, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com:80/" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com:80/" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com:8080/'" do + before do + @uri = Addressable::URI.parse("http://example.com:8080/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com:8080'" do + expect(@uri.authority).to eq("example.com:8080") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 8080" do + expect(@uri.inferred_port).to eq(8080) + end + + it "should have explicit port 8080" do + expect(@uri.port).to eq(8080) + end + + it "should have default port 80" do + expect(@uri.default_port).to eq(80) + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be exactly equal to http://example.com:8080/" do + expect(@uri.eql?(Addressable::URI.parse( + "http://example.com:8080/"))).to eq(true) + end + + it "should have a route of 'http://example.com:8080/' from " + + "'http://example.com/path/to/'" do + expect(@uri.route_from("http://example.com/path/to/")).to eq( + Addressable::URI.parse("http://example.com:8080/") + ) + end + + it "should have a route of 'http://example.com:8080/' from " + + "'http://example.com:80/path/to/'" do + expect(@uri.route_from("http://example.com:80/path/to/")).to eq( + Addressable::URI.parse("http://example.com:8080/") + ) + end + + it "should have a route of '../../' from " + + "'http://example.com:8080/path/to/'" do + expect(@uri.route_from("http://example.com:8080/path/to/")).to eq( + Addressable::URI.parse("../../") + ) + end + + it "should have a route of 'http://example.com:8080/' from " + + "'http://user:pass@example.com/path/to/'" do + expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq( + Addressable::URI.parse("http://example.com:8080/") + ) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => 8080, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com:8080'" do + expect(@uri.origin).to eq('http://example.com:8080') + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com:8080/" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com:8080/" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com:%38%30/'" do + before do + @uri = Addressable::URI.parse("http://example.com:%38%30/") + end + + it "should have the correct port" do + expect(@uri.port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/%2E/'" do + before do + @uri = Addressable::URI.parse("http://example.com/%2E/") + end + + it "should be considered to be in normal form" do + skip( + 'path segment normalization should happen before ' + + 'percent escaping normalization' + ) + @uri.normalize.should be_eql(@uri) + end + + it "should normalize to 'http://example.com/%2E/'" do + skip( + 'path segment normalization should happen before ' + + 'percent escaping normalization' + ) + expect(@uri.normalize).to eq("http://example.com/%2E/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/..'" do + before do + @uri = Addressable::URI.parse("http://example.com/..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/../..'" do + before do + @uri = Addressable::URI.parse("http://example.com/../..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path(/..'" do + before do + @uri = Addressable::URI.parse("http://example.com/path(/..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/(path)/..'" do + before do + @uri = Addressable::URI.parse("http://example.com/(path)/..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path(/../'" do + before do + @uri = Addressable::URI.parse("http://example.com/path(/../") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/(path)/../'" do + before do + @uri = Addressable::URI.parse("http://example.com/(path)/../") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'/..//example.com'" do + before do + @uri = Addressable::URI.parse("/..//example.com") + end + + it "should become invalid when normalized" do + expect(lambda do + @uri.normalize + end).to raise_error(Addressable::URI::InvalidURIError, /authority/) + end + + it "should have a path of '/..//example.com'" do + expect(@uri.path).to eq("/..//example.com") + end +end + +describe Addressable::URI, "when parsed from '/a/b/c/./../../g'" do + before do + @uri = Addressable::URI.parse("/a/b/c/./../../g") + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + # Section 5.2.4 of RFC 3986 + it "should normalize to '/a/g'" do + expect(@uri.normalize.to_s).to eq("/a/g") + end +end + +describe Addressable::URI, "when parsed from 'mid/content=5/../6'" do + before do + @uri = Addressable::URI.parse("mid/content=5/../6") + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + # Section 5.2.4 of RFC 3986 + it "should normalize to 'mid/6'" do + expect(@uri.normalize.to_s).to eq("mid/6") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.example.com///../'" do + before do + @uri = Addressable::URI.parse('http://www.example.com///../') + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://www.example.com//'" do + expect(@uri.normalize.to_s).to eq("http://www.example.com//") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path/to/resource/'" do + before do + @uri = Addressable::URI.parse("http://example.com/path/to/resource/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/path/to/resource/'" do + expect(@uri.path).to eq("/path/to/resource/") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be exactly equal to http://example.com:8080/" do + expect(@uri.eql?(Addressable::URI.parse( + "http://example.com/path/to/resource/"))).to eq(true) + end + + it "should have a route of 'resource/' from " + + "'http://example.com/path/to/'" do + expect(@uri.route_from("http://example.com/path/to/")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of '../' from " + + "'http://example.com/path/to/resource/sub'" do + expect(@uri.route_from("http://example.com/path/to/resource/sub")).to eq( + Addressable::URI.parse("../") + ) + end + + + it "should have a route of 'resource/' from " + + "'http://example.com/path/to/another'" do + expect(@uri.route_from("http://example.com/path/to/another")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of 'resource/' from " + + "'http://example.com/path/to/res'" do + expect(@uri.route_from("http://example.com/path/to/res")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of 'resource/' from " + + "'http://example.com:80/path/to/'" do + expect(@uri.route_from("http://example.com:80/path/to/")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of 'http://example.com/path/to/' from " + + "'http://example.com:8080/path/to/'" do + expect(@uri.route_from("http://example.com:8080/path/to/")).to eq( + Addressable::URI.parse("http://example.com/path/to/resource/") + ) + end + + it "should have a route of 'http://example.com/path/to/' from " + + "'http://user:pass@example.com/path/to/'" do + expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq( + Addressable::URI.parse("http://example.com/path/to/resource/") + ) + end + + it "should have a route of '../../path/to/resource/' from " + + "'http://example.com/to/resource/'" do + expect(@uri.route_from("http://example.com/to/resource/")).to eq( + Addressable::URI.parse("../../path/to/resource/") + ) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "/path/to/resource/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'relative/path/to/resource'" do + before do + @uri = Addressable::URI.parse("relative/path/to/resource") + end + + it "should not have a scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should not be considered ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an authority segment" do + expect(@uri.authority).to eq(nil) + end + + it "should not have a host" do + expect(@uri.host).to eq(nil) + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should not have a port" do + expect(@uri.port).to eq(nil) + end + + it "should have a path of 'relative/path/to/resource'" do + expect(@uri.path).to eq("relative/path/to/resource") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should not be considered absolute" do + expect(@uri).not_to be_absolute + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should raise an error if routing is attempted" do + expect(lambda do + @uri.route_to("http://example.com/") + end).to raise_error(ArgumentError, /relative\/path\/to\/resource/) + expect(lambda do + @uri.route_from("http://example.com/") + end).to raise_error(ArgumentError, /relative\/path\/to\/resource/) + end + + it "when joined with 'another/relative/path' should be " + + "'relative/path/to/another/relative/path'" do + expect(@uri.join('another/relative/path')).to eq( + Addressable::URI.parse("relative/path/to/another/relative/path") + ) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'relative_path_with_no_slashes'" do + before do + @uri = Addressable::URI.parse("relative_path_with_no_slashes") + end + + it "should not have a scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should not be considered ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an authority segment" do + expect(@uri.authority).to eq(nil) + end + + it "should not have a host" do + expect(@uri.host).to eq(nil) + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should not have a port" do + expect(@uri.port).to eq(nil) + end + + it "should have a path of 'relative_path_with_no_slashes'" do + expect(@uri.path).to eq("relative_path_with_no_slashes") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should not be considered absolute" do + expect(@uri).not_to be_absolute + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "when joined with 'another_relative_path' should be " + + "'another_relative_path'" do + expect(@uri.join('another_relative_path')).to eq( + Addressable::URI.parse("another_relative_path") + ) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/file.txt'" do + before do + @uri = Addressable::URI.parse("http://example.com/file.txt") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/file.txt'" do + expect(@uri.path).to eq("/file.txt") + end + + it "should have a basename of 'file.txt'" do + expect(@uri.basename).to eq("file.txt") + end + + it "should have an extname of '.txt'" do + expect(@uri.extname).to eq(".txt") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/file.txt;parameter'" do + before do + @uri = Addressable::URI.parse("http://example.com/file.txt;parameter") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/file.txt;parameter'" do + expect(@uri.path).to eq("/file.txt;parameter") + end + + it "should have a basename of 'file.txt'" do + expect(@uri.basename).to eq("file.txt") + end + + it "should have an extname of '.txt'" do + expect(@uri.extname).to eq(".txt") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/file.txt;x=y'" do + before do + @uri = Addressable::URI.parse("http://example.com/file.txt;x=y") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/file.txt;x=y'" do + expect(@uri.path).to eq("/file.txt;x=y") + end + + it "should have an extname of '.txt'" do + expect(@uri.extname).to eq(".txt") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'svn+ssh://developername@rubyforge.org/var/svn/project'" do + before do + @uri = Addressable::URI.parse( + "svn+ssh://developername@rubyforge.org/var/svn/project" + ) + end + + it "should have a scheme of 'svn+ssh'" do + expect(@uri.scheme).to eq("svn+ssh") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a path of '/var/svn/project'" do + expect(@uri.path).to eq("/var/svn/project") + end + + it "should have a username of 'developername'" do + expect(@uri.user).to eq("developername") + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'ssh+svn://developername@RUBYFORGE.ORG/var/svn/project'" do + before do + @uri = Addressable::URI.parse( + "ssh+svn://developername@RUBYFORGE.ORG/var/svn/project" + ) + end + + it "should have a scheme of 'ssh+svn'" do + expect(@uri.scheme).to eq("ssh+svn") + end + + it "should have a normalized scheme of 'svn+ssh'" do + expect(@uri.normalized_scheme).to eq("svn+ssh") + end + + it "should have a normalized site of 'svn+ssh'" do + expect(@uri.normalized_site).to eq("svn+ssh://developername@rubyforge.org") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of '/var/svn/project'" do + expect(@uri.path).to eq("/var/svn/project") + end + + it "should have a username of 'developername'" do + expect(@uri.user).to eq("developername") + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'mailto:user@example.com'" do + before do + @uri = Addressable::URI.parse("mailto:user@example.com") + end + + it "should have a scheme of 'mailto'" do + expect(@uri.scheme).to eq("mailto") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of 'user@example.com'" do + expect(@uri.path).to eq("user@example.com") + end + + it "should have no user" do + expect(@uri.user).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'tag:example.com,2006-08-18:/path/to/something'" do + before do + @uri = Addressable::URI.parse( + "tag:example.com,2006-08-18:/path/to/something") + end + + it "should have a scheme of 'tag'" do + expect(@uri.scheme).to eq("tag") + end + + it "should be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of " + + "'example.com,2006-08-18:/path/to/something'" do + expect(@uri.path).to eq("example.com,2006-08-18:/path/to/something") + end + + it "should have no user" do + expect(@uri.user).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/x;y/'" do + before do + @uri = Addressable::URI.parse("http://example.com/x;y/") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?x=1&y=2'" do + before do + @uri = Addressable::URI.parse("http://example.com/?x=1&y=2") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'view-source:http://example.com/'" do + before do + @uri = Addressable::URI.parse("view-source:http://example.com/") + end + + it "should have a scheme of 'view-source'" do + expect(@uri.scheme).to eq("view-source") + end + + it "should have a path of 'http://example.com/'" do + expect(@uri.path).to eq("http://example.com/") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do + before do + @uri = Addressable::URI.parse( + "http://user:pass@example.com/path/to/resource?query=x#fragment") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'user:pass@example.com'" do + expect(@uri.authority).to eq("user:pass@example.com") + end + + it "should have a username of 'user'" do + expect(@uri.user).to eq("user") + end + + it "should have a password of 'pass'" do + expect(@uri.password).to eq("pass") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/path/to/resource'" do + expect(@uri.path).to eq("/path/to/resource") + end + + it "should have a query string of 'query=x'" do + expect(@uri.query).to eq("query=x") + end + + it "should have a fragment of 'fragment'" do + expect(@uri.fragment).to eq("fragment") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a route of '../../' to " + + "'http://user:pass@example.com/path/'" do + expect(@uri.route_to("http://user:pass@example.com/path/")).to eq( + Addressable::URI.parse("../../") + ) + end + + it "should have a route of 'to/resource?query=x#fragment' " + + "from 'http://user:pass@example.com/path/'" do + expect(@uri.route_from("http://user:pass@example.com/path/")).to eq( + Addressable::URI.parse("to/resource?query=x#fragment") + ) + end + + it "should have a route of '?query=x#fragment' " + + "from 'http://user:pass@example.com/path/to/resource'" do + expect(@uri.route_from("http://user:pass@example.com/path/to/resource")).to eq( + Addressable::URI.parse("?query=x#fragment") + ) + end + + it "should have a route of '#fragment' " + + "from 'http://user:pass@example.com/path/to/resource?query=x'" do + expect(@uri.route_from( + "http://user:pass@example.com/path/to/resource?query=x")).to eq( + Addressable::URI.parse("#fragment") + ) + end + + it "should have a route of '#fragment' from " + + "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do + expect(@uri.route_from( + "http://user:pass@example.com/path/to/resource?query=x#fragment" + )).to eq(Addressable::URI.parse("#fragment")) + end + + it "should have a route of 'http://elsewhere.com/' to " + + "'http://elsewhere.com/'" do + expect(@uri.route_to("http://elsewhere.com/")).to eq( + Addressable::URI.parse("http://elsewhere.com/") + ) + end + + it "should have a route of " + + "'http://user:pass@example.com/path/to/resource?query=x#fragment' " + + "from 'http://example.com/path/to/'" do + expect(@uri.route_from("http://elsewhere.com/path/to/")).to eq( + Addressable::URI.parse( + "http://user:pass@example.com/path/to/resource?query=x#fragment") + ) + end + + it "should have the correct scheme after assignment" do + @uri.scheme = "ftp" + expect(@uri.scheme).to eq("ftp") + expect(@uri.to_s).to eq( + "ftp://user:pass@example.com/path/to/resource?query=x#fragment" + ) + expect(@uri.to_str).to eq( + "ftp://user:pass@example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct site segment after assignment" do + @uri.site = "https://newuser:newpass@example.com:443" + expect(@uri.scheme).to eq("https") + expect(@uri.authority).to eq("newuser:newpass@example.com:443") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.normalized_userinfo).to eq("newuser:newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(443) + expect(@uri.inferred_port).to eq(443) + expect(@uri.to_s).to eq( + "https://newuser:newpass@example.com:443" + + "/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct authority segment after assignment" do + @uri.authority = "newuser:newpass@example.com:80" + expect(@uri.authority).to eq("newuser:newpass@example.com:80") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.normalized_userinfo).to eq("newuser:newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(80) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq( + "http://newuser:newpass@example.com:80" + + "/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct userinfo segment after assignment" do + @uri.userinfo = "newuser:newpass" + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.authority).to eq("newuser:newpass@example.com") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq( + "http://newuser:newpass@example.com" + + "/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.authority).to eq("newuser:pass@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.authority).to eq("user:newpass@example.com") + end + + it "should have the correct host after assignment" do + @uri.host = "newexample.com" + expect(@uri.host).to eq("newexample.com") + expect(@uri.authority).to eq("user:pass@newexample.com") + end + + it "should have the correct host after assignment" do + @uri.hostname = "newexample.com" + expect(@uri.host).to eq("newexample.com") + expect(@uri.hostname).to eq("newexample.com") + expect(@uri.authority).to eq("user:pass@newexample.com") + end + + it "should raise an error if assigning a bogus object to the hostname" do + expect(lambda do + @uri.hostname = Object.new + end).to raise_error + end + + it "should have the correct port after assignment" do + @uri.port = 8080 + expect(@uri.port).to eq(8080) + expect(@uri.authority).to eq("user:pass@example.com:8080") + end + + it "should have the correct origin after assignment" do + @uri.origin = "http://newexample.com" + expect(@uri.host).to eq("newexample.com") + expect(@uri.authority).to eq("newexample.com") + end + + it "should have the correct path after assignment" do + @uri.path = "/newpath/to/resource" + expect(@uri.path).to eq("/newpath/to/resource") + expect(@uri.to_s).to eq( + "http://user:pass@example.com/newpath/to/resource?query=x#fragment" + ) + end + + it "should have the correct scheme and authority after nil assignment" do + @uri.site = nil + expect(@uri.scheme).to eq(nil) + expect(@uri.authority).to eq(nil) + expect(@uri.to_s).to eq("/path/to/resource?query=x#fragment") + end + + it "should have the correct scheme and authority after assignment" do + @uri.site = "file://" + expect(@uri.scheme).to eq("file") + expect(@uri.authority).to eq("") + expect(@uri.to_s).to eq("file:///path/to/resource?query=x#fragment") + end + + it "should have the correct path after nil assignment" do + @uri.path = nil + expect(@uri.path).to eq("") + expect(@uri.to_s).to eq( + "http://user:pass@example.com?query=x#fragment" + ) + end + + it "should have the correct query string after assignment" do + @uri.query = "newquery=x" + expect(@uri.query).to eq("newquery=x") + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?newquery=x#fragment" + ) + @uri.query = nil + expect(@uri.query).to eq(nil) + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource#fragment" + ) + end + + it "should have the correct query string after hash assignment" do + @uri.query_values = {"?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther"} + expect(@uri.query.split("&")).to include("%3Fuestion%20mark=%3Dsign") + expect(@uri.query.split("&")).to include("hello=g%C3%BCnther") + expect(@uri.query_values).to eq({ + "?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther" + }) + end + + it "should have the correct query string after flag hash assignment" do + @uri.query_values = {'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil} + expect(@uri.query.split("&")).to include("flag%3F1") + expect(@uri.query.split("&")).to include("fl%3Dag2") + expect(@uri.query.split("&")).to include("flag3") + expect(@uri.query_values(Array).sort).to eq([["fl=ag2"], ["flag3"], ["flag?1"]]) + expect(@uri.query_values(Hash)).to eq({ + 'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil + }) + end + + it "should raise an error if query values are set to a bogus type" do + expect(lambda do + @uri.query_values = "bogus" + end).to raise_error(TypeError) + end + + it "should have the correct fragment after assignment" do + @uri.fragment = "newfragment" + expect(@uri.fragment).to eq("newfragment") + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x#newfragment" + ) + + @uri.fragment = nil + expect(@uri.fragment).to eq(nil) + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:fragment => "newfragment").to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x#newfragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:fragment => nil).to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:userinfo => "newuser:newpass").to_s).to eq( + "http://newuser:newpass@example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:userinfo => nil).to_s).to eq( + "http://example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:path => "newpath").to_s).to eq( + "http://user:pass@example.com/newpath?query=x#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:port => "42", :path => "newpath", :query => "").to_s).to eq( + "http://user:pass@example.com:42/newpath?#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:authority => "foo:bar@baz:42").to_s).to eq( + "http://foo:bar@baz:42/path/to/resource?query=x#fragment" + ) + # Ensure the operation was not destructive + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct values after a destructive merge" do + @uri.merge!(:authority => "foo:bar@baz:42") + # Ensure the operation was destructive + expect(@uri.to_s).to eq( + "http://foo:bar@baz:42/path/to/resource?query=x#fragment" + ) + end + + it "should fail to merge with bogus values" do + expect(lambda do + @uri.merge(:port => "bogus") + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should fail to merge with bogus values" do + expect(lambda do + @uri.merge(:authority => "bar@baz:bogus") + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should fail to merge with bogus parameters" do + expect(lambda do + @uri.merge(42) + end).to raise_error(TypeError) + end + + it "should fail to merge with bogus parameters" do + expect(lambda do + @uri.merge("http://example.com/") + end).to raise_error(TypeError) + end + + it "should fail to merge with both authority and subcomponents" do + expect(lambda do + @uri.merge(:authority => "foo:bar@baz:42", :port => "42") + end).to raise_error(ArgumentError) + end + + it "should fail to merge with both userinfo and subcomponents" do + expect(lambda do + @uri.merge(:userinfo => "foo:bar", :user => "foo") + end).to raise_error(ArgumentError) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/search?q=Q%26A'" do + + before do + @uri = Addressable::URI.parse("http://example.com/search?q=Q%26A") + end + + it "should have a query of 'q=Q%26A'" do + expect(@uri.query).to eq("q=Q%26A") + end + + it "should have query_values of {'q' => 'Q&A'}" do + expect(@uri.query_values).to eq({ 'q' => 'Q&A' }) + end + + it "should normalize to the original uri " + + "(with the ampersand properly percent-encoded)" do + expect(@uri.normalize.to_s).to eq("http://example.com/search?q=Q%26A") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?&x=b") + end + + it "should have a query of '&x=b'" do + expect(@uri.query).to eq("&x=b") + end + + it "should have query_values of {'x' => 'b'}" do + expect(@uri.query_values).to eq({'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q='one;two'&x=1'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q='one;two'&x=1") + end + + it "should have a query of 'q='one;two'&x=1'" do + expect(@uri.query).to eq("q='one;two'&x=1") + end + + it "should have query_values of {\"q\" => \"'one;two'\", \"x\" => \"1\"}" do + expect(@uri.query_values).to eq({"q" => "'one;two'", "x" => "1"}) + end + + it "should escape the ';' character when normalizing to avoid ambiguity " + + "with the W3C HTML 4.01 specification" do + # HTML 4.01 Section B.2.2 + expect(@uri.normalize.query).to eq("q='one%3Btwo'&x=1") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?&&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?&&x=b") + end + + it "should have a query of '&&x=b'" do + expect(@uri.query).to eq("&&x=b") + end + + it "should have query_values of {'x' => 'b'}" do + expect(@uri.query_values).to eq({'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=a&&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=a&&x=b") + end + + it "should have a query of 'q=a&&x=b'" do + expect(@uri.query).to eq("q=a&&x=b") + end + + it "should have query_values of {'q' => 'a, 'x' => 'b'}" do + expect(@uri.query_values).to eq({'q' => 'a', 'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q&&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q&&x=b") + end + + it "should have a query of 'q&&x=b'" do + expect(@uri.query).to eq("q&&x=b") + end + + it "should have query_values of {'q' => true, 'x' => 'b'}" do + expect(@uri.query_values).to eq({'q' => nil, 'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=a+b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=a+b") + end + + it "should have a query of 'q=a+b'" do + expect(@uri.query).to eq("q=a+b") + end + + it "should have query_values of {'q' => 'a b'}" do + expect(@uri.query_values).to eq({'q' => 'a b'}) + end + + it "should have a normalized query of 'q=a+b'" do + expect(@uri.normalized_query).to eq("q=a+b") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=a%2bb'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=a%2bb") + end + + it "should have a query of 'q=a+b'" do + expect(@uri.query).to eq("q=a%2bb") + end + + it "should have query_values of {'q' => 'a+b'}" do + expect(@uri.query_values).to eq({'q' => 'a+b'}) + end + + it "should have a normalized query of 'q=a%2Bb'" do + expect(@uri.normalized_query).to eq("q=a%2Bb") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7'" do + before do + @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7") + end + + it "should have a normalized query of 'v=~&w=%25&x=%25&y=%2B&z=%C3%87'" do + expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=%2B&z=%C3%87") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7'" do + before do + @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7") + end + + it "should have a normalized query of 'v=~&w=%25&x=%25&y=+&z=%C3%87'" do + expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=+&z=%C3%87") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/sound%2bvision'" do + before do + @uri = Addressable::URI.parse("http://example.com/sound%2bvision") + end + + it "should have a normalized path of '/sound+vision'" do + expect(@uri.normalized_path).to eq('/sound+vision') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q='" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=") + end + + it "should have a query of 'q='" do + expect(@uri.query).to eq("q=") + end + + it "should have query_values of {'q' => ''}" do + expect(@uri.query_values).to eq({'q' => ''}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://user@example.com'" do + before do + @uri = Addressable::URI.parse("http://user@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of 'user'" do + expect(@uri.user).to eq("user") + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should have a userinfo of 'user'" do + expect(@uri.userinfo).to eq("user") + end + + it "should have a normalized userinfo of 'user'" do + expect(@uri.normalized_userinfo).to eq("user") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have default_port 80" do + expect(@uri.default_port).to eq(80) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://newuser@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.to_s).to eq("http://user:newpass@example.com") + end + + it "should have the correct userinfo segment after assignment" do + @uri.userinfo = "newuser:newpass" + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://newuser:newpass@example.com") + end + + it "should have the correct userinfo segment after nil assignment" do + @uri.userinfo = nil + expect(@uri.userinfo).to eq(nil) + expect(@uri.user).to eq(nil) + expect(@uri.password).to eq(nil) + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = "newuser@example.com" + expect(@uri.authority).to eq("newuser@example.com") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq(nil) + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://newuser@example.com") + end + + it "should raise an error after nil assignment of authority segment" do + expect(lambda do + # This would create an invalid URI + @uri.authority = nil + end).to raise_error + end +end + +describe Addressable::URI, "when parsed from " + + "'http://user:@example.com'" do + before do + @uri = Addressable::URI.parse("http://user:@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of 'user'" do + expect(@uri.user).to eq("user") + end + + it "should have a password of ''" do + expect(@uri.password).to eq("") + end + + it "should have a normalized userinfo of 'user:'" do + expect(@uri.normalized_userinfo).to eq("user:") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("") + expect(@uri.to_s).to eq("http://newuser:@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.to_s).to eq("http://user:newpass@example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = "newuser:@example.com" + expect(@uri.authority).to eq("newuser:@example.com") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://newuser:@example.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://:pass@example.com'" do + before do + @uri = Addressable::URI.parse("http://:pass@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of ''" do + expect(@uri.user).to eq("") + end + + it "should have a password of 'pass'" do + expect(@uri.password).to eq("pass") + end + + it "should have a userinfo of ':pass'" do + expect(@uri.userinfo).to eq(":pass") + end + + it "should have a normalized userinfo of ':pass'" do + expect(@uri.normalized_userinfo).to eq(":pass") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("pass") + expect(@uri.to_s).to eq("http://newuser:pass@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = ":newpass@example.com" + expect(@uri.authority).to eq(":newpass@example.com") + expect(@uri.user).to eq("") + expect(@uri.password).to eq("newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://:newpass@example.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://:@example.com'" do + before do + @uri = Addressable::URI.parse("http://:@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of ''" do + expect(@uri.user).to eq("") + end + + it "should have a password of ''" do + expect(@uri.password).to eq("") + end + + it "should have a normalized userinfo of nil" do + expect(@uri.normalized_userinfo).to eq(nil) + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("") + expect(@uri.to_s).to eq("http://newuser:@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = ":@newexample.com" + expect(@uri.authority).to eq(":@newexample.com") + expect(@uri.user).to eq("") + expect(@uri.password).to eq("") + expect(@uri.host).to eq("newexample.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://:@newexample.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'#example'" do + before do + @uri = Addressable::URI.parse("#example") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should have a host of nil" do + expect(@uri.host).to eq(nil) + end + + it "should have a site of nil" do + expect(@uri.site).to eq(nil) + end + + it "should have a normalized_site of nil" do + expect(@uri.normalized_site).to eq(nil) + end + + it "should have a path of ''" do + expect(@uri.path).to eq("") + end + + it "should have a query string of nil" do + expect(@uri.query).to eq(nil) + end + + it "should have a fragment of 'example'" do + expect(@uri.fragment).to eq("example") + end +end + +describe Addressable::URI, "when parsed from " + + "the network-path reference '//example.com/'" do + before do + @uri = Addressable::URI.parse("//example.com/") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should raise an error if routing is attempted" do + expect(lambda do + @uri.route_to("http://example.com/") + end).to raise_error(ArgumentError, /\/\/example.com\//) + expect(lambda do + @uri.route_from("http://example.com/") + end).to raise_error(ArgumentError, /\/\/example.com\//) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'feed://http://example.com/'" do + before do + @uri = Addressable::URI.parse("feed://http://example.com/") + end + + it "should have a host of 'http'" do + expect(@uri.host).to eq("http") + end + + it "should have a path of '//example.com/'" do + expect(@uri.path).to eq("//example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'feed:http://example.com/'" do + before do + @uri = Addressable::URI.parse("feed:http://example.com/") + end + + it "should have a path of 'http://example.com/'" do + expect(@uri.path).to eq("http://example.com/") + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + expect(@uri.normalize!.to_s).to eq("http://example.com/") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'example://a/b/c/%7Bfoo%7D'" do + before do + @uri = Addressable::URI.parse("example://a/b/c/%7Bfoo%7D") + end + + # Section 6.2.2 of RFC 3986 + it "should be equivalent to eXAMPLE://a/./b/../b/%63/%7bfoo%7d" do + expect(@uri).to eq( + Addressable::URI.parse("eXAMPLE://a/./b/../b/%63/%7bfoo%7d") + ) + end + + it "should have an origin of 'example://a'" do + expect(@uri.origin).to eq('example://a') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/indirect/path/./to/../resource/'" do + before do + @uri = Addressable::URI.parse( + "http://example.com/indirect/path/./to/../resource/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/indirect/path/./to/../resource/'" do + expect(@uri.path).to eq("/indirect/path/./to/../resource/") + end + + # Section 6.2.2.3 of RFC 3986 + it "should have a normalized path of '/indirect/path/resource/'" do + expect(@uri.normalize.path).to eq("/indirect/path/resource/") + expect(@uri.normalize!.path).to eq("/indirect/path/resource/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://under_score.example.com/'" do + it "should not cause an error" do + expect(lambda do + Addressable::URI.parse("http://under_score.example.com/") + end).not_to raise_error + end +end + +describe Addressable::URI, "when parsed from " + + "'./this:that'" do + before do + @uri = Addressable::URI.parse("./this:that") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should have no scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'this:that'" do + before do + @uri = Addressable::URI.parse("this:that") + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should have a scheme of 'this'" do + expect(@uri.scheme).to eq("this") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from '?'" do + before do + @uri = Addressable::URI.parse("?") + end + + it "should normalize to ''" do + expect(@uri.normalize.to_s).to eq("") + end + + it "should have the correct return type" do + expect(@uri.query_values).to eq({}) + expect(@uri.query_values(Hash)).to eq({}) + expect(@uri.query_values(Array)).to eq([]) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from '?one=1&two=2&three=3'" do + before do + @uri = Addressable::URI.parse("?one=1&two=2&three=3") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({"one" => "1", "two" => "2", "three" => "3"}) + end + + it "should raise an error for invalid return type values" do + expect(lambda do + @uri.query_values(Fixnum) + end).to raise_error(ArgumentError) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one", "1"], ["two", "2"], ["three", "3"] + ]) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from '?one=1=uno&two=2=dos'" do + before do + @uri = Addressable::URI.parse("?one=1=uno&two=2=dos") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({"one" => "1=uno", "two" => "2=dos"}) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one", "1=uno"], ["two", "2=dos"] + ]) + end +end + +describe Addressable::URI, "when parsed from '?one[two][three]=four'" do + before do + @uri = Addressable::URI.parse("?one[two][three]=four") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({"one[two][three]" => "four"}) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one[two][three]", "four"] + ]) + end +end + +describe Addressable::URI, "when parsed from '?one.two.three=four'" do + before do + @uri = Addressable::URI.parse("?one.two.three=four") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one.two.three" => "four" + }) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one.two.three", "four"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three]=four&one[two][five]=six'" do + before do + @uri = Addressable::URI.parse("?one[two][three]=four&one[two][five]=six") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three]" => "four", "one[two][five]" => "six" + }) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one[two][three]", "four"], ["one[two][five]", "six"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one.two.three=four&one.two.five=six'" do + before do + @uri = Addressable::URI.parse("?one.two.three=four&one.two.five=six") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one.two.three" => "four", "one.two.five" => "six" + }) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one.two.three", "four"], ["one.two.five", "six"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one=two&one=three'" do + before do + @uri = Addressable::URI.parse( + "?one=two&one=three&one=four" + ) + end + + it "should have correct array query values" do + expect(@uri.query_values(Array)).to eq( + [['one', 'two'], ['one', 'three'], ['one', 'four']] + ) + end + + it "should have correct hash query values" do + skip("This is probably more desirable behavior.") + expect(@uri.query_values(Hash)).to eq( + {'one' => ['two', 'three', 'four']} + ) + end + + it "should handle assignment with keys of mixed type" do + @uri.query_values = @uri.query_values(Hash).merge({:one => 'three'}) + expect(@uri.query_values(Hash)).to eq({'one' => 'three'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][]=four&one[two][three][]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][]=four&one[two][three][]=five" + ) + end + + it "should have correct query values" do + expect(@uri.query_values(Hash)).to eq({"one[two][three][]" => "five"}) + end + + it "should have correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one[two][three][]", "four"], ["one[two][three][]", "five"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][0]=four&one[two][three][1]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][0]=four&one[two][three][1]=five" + ) + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three][0]" => "four", "one[two][three][1]" => "five" + }) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][1]=four&one[two][three][0]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][1]=four&one[two][three][0]=five" + ) + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three][1]" => "four", "one[two][three][0]" => "five" + }) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][2]=four&one[two][three][1]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][2]=four&one[two][three][1]=five" + ) + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three][2]" => "four", "one[two][three][1]" => "five" + }) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.詹姆斯.com/'" do + before do + @uri = Addressable::URI.parse("http://www.詹姆斯.com/") + end + + it "should be equivalent to 'http://www.xn--8ws00zhy3a.com/'" do + expect(@uri).to eq( + Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/") + ) + end + + it "should not have domain name encoded during normalization" do + expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq( + "http://www.詹姆斯.com/" + ) + end + + it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do + expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.詹姆斯.com/ some spaces /'" do + before do + @uri = Addressable::URI.parse("http://www.詹姆斯.com/ some spaces /") + end + + it "should be equivalent to " + + "'http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/'" do + expect(@uri).to eq( + Addressable::URI.parse( + "http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/") + ) + end + + it "should not have domain name encoded during normalization" do + expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq( + "http://www.詹姆斯.com/%20some%20spaces%20/" + ) + end + + it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do + expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.xn--8ws00zhy3a.com/'" do + before do + @uri = Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/") + end + + it "should be displayed as http://www.詹姆斯.com/" do + expect(@uri.display_uri.to_s).to eq("http://www.詹姆斯.com/") + end + + it "should properly force the encoding" do + display_string = @uri.display_uri.to_str + expect(display_string).to eq("http://www.詹姆斯.com/") + if display_string.respond_to?(:encoding) + expect(display_string.encoding.to_s).to eq(Encoding::UTF_8.to_s) + end + end + + it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do + expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.詹姆斯.com/atomtests/iri/詹.html'" do + before do + @uri = Addressable::URI.parse("http://www.詹姆斯.com/atomtests/iri/詹.html") + end + + it "should normalize to " + + "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" do + expect(@uri.normalize.to_s).to eq( + "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" + ) + expect(@uri.normalize!.to_s).to eq( + "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" + ) + end +end + +describe Addressable::URI, "when parsed from a percent-encoded IRI" do + before do + @uri = Addressable::URI.parse( + "http://www.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA" + + "%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3" + + "%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82" + + "%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0" + + "%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3" + + "%81%9F%E3%82%8A%E3%81%AA%E3%81%84.w3.mag.keio.ac.jp" + ) + end + + it "should normalize to something sane" do + expect(@uri.normalize.to_s).to eq( + "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + + "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/" + ) + expect(@uri.normalize!.to_s).to eq( + "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + + "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/" + ) + end + + it "should have the correct origin" do + expect(@uri.origin).to eq( + "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + + "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + ) + end +end + +describe Addressable::URI, "with a base uri of 'http://a/b/c/d;p?q'" do + before do + @uri = Addressable::URI.parse("http://a/b/c/d;p?q") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g:h' should resolve to g:h" do + expect((@uri + "g:h").to_s).to eq("g:h") + expect(Addressable::URI.join(@uri, "g:h").to_s).to eq("g:h") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g' should resolve to http://a/b/c/g" do + expect((@uri + "g").to_s).to eq("http://a/b/c/g") + expect(Addressable::URI.join(@uri.to_s, "g").to_s).to eq("http://a/b/c/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with './g' should resolve to http://a/b/c/g" do + expect((@uri + "./g").to_s).to eq("http://a/b/c/g") + expect(Addressable::URI.join(@uri.to_s, "./g").to_s).to eq("http://a/b/c/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g/' should resolve to http://a/b/c/g/" do + expect((@uri + "g/").to_s).to eq("http://a/b/c/g/") + expect(Addressable::URI.join(@uri.to_s, "g/").to_s).to eq("http://a/b/c/g/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '/g' should resolve to http://a/g" do + expect((@uri + "/g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "/g").to_s).to eq("http://a/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '//g' should resolve to http://g" do + expect((@uri + "//g").to_s).to eq("http://g") + expect(Addressable::URI.join(@uri.to_s, "//g").to_s).to eq("http://g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '?y' should resolve to http://a/b/c/d;p?y" do + expect((@uri + "?y").to_s).to eq("http://a/b/c/d;p?y") + expect(Addressable::URI.join(@uri.to_s, "?y").to_s).to eq("http://a/b/c/d;p?y") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g?y' should resolve to http://a/b/c/g?y" do + expect((@uri + "g?y").to_s).to eq("http://a/b/c/g?y") + expect(Addressable::URI.join(@uri.to_s, "g?y").to_s).to eq("http://a/b/c/g?y") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '#s' should resolve to http://a/b/c/d;p?q#s" do + expect((@uri + "#s").to_s).to eq("http://a/b/c/d;p?q#s") + expect(Addressable::URI.join(@uri.to_s, "#s").to_s).to eq( + "http://a/b/c/d;p?q#s" + ) + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g#s' should resolve to http://a/b/c/g#s" do + expect((@uri + "g#s").to_s).to eq("http://a/b/c/g#s") + expect(Addressable::URI.join(@uri.to_s, "g#s").to_s).to eq("http://a/b/c/g#s") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g?y#s' should resolve to http://a/b/c/g?y#s" do + expect((@uri + "g?y#s").to_s).to eq("http://a/b/c/g?y#s") + expect(Addressable::URI.join( + @uri.to_s, "g?y#s").to_s).to eq("http://a/b/c/g?y#s") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with ';x' should resolve to http://a/b/c/;x" do + expect((@uri + ";x").to_s).to eq("http://a/b/c/;x") + expect(Addressable::URI.join(@uri.to_s, ";x").to_s).to eq("http://a/b/c/;x") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g;x' should resolve to http://a/b/c/g;x" do + expect((@uri + "g;x").to_s).to eq("http://a/b/c/g;x") + expect(Addressable::URI.join(@uri.to_s, "g;x").to_s).to eq("http://a/b/c/g;x") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g;x?y#s' should resolve to http://a/b/c/g;x?y#s" do + expect((@uri + "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s") + expect(Addressable::URI.join( + @uri.to_s, "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '' should resolve to http://a/b/c/d;p?q" do + expect((@uri + "").to_s).to eq("http://a/b/c/d;p?q") + expect(Addressable::URI.join(@uri.to_s, "").to_s).to eq("http://a/b/c/d;p?q") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '.' should resolve to http://a/b/c/" do + expect((@uri + ".").to_s).to eq("http://a/b/c/") + expect(Addressable::URI.join(@uri.to_s, ".").to_s).to eq("http://a/b/c/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with './' should resolve to http://a/b/c/" do + expect((@uri + "./").to_s).to eq("http://a/b/c/") + expect(Addressable::URI.join(@uri.to_s, "./").to_s).to eq("http://a/b/c/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '..' should resolve to http://a/b/" do + expect((@uri + "..").to_s).to eq("http://a/b/") + expect(Addressable::URI.join(@uri.to_s, "..").to_s).to eq("http://a/b/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../' should resolve to http://a/b/" do + expect((@uri + "../").to_s).to eq("http://a/b/") + expect(Addressable::URI.join(@uri.to_s, "../").to_s).to eq("http://a/b/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../g' should resolve to http://a/b/g" do + expect((@uri + "../g").to_s).to eq("http://a/b/g") + expect(Addressable::URI.join(@uri.to_s, "../g").to_s).to eq("http://a/b/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../..' should resolve to http://a/" do + expect((@uri + "../..").to_s).to eq("http://a/") + expect(Addressable::URI.join(@uri.to_s, "../..").to_s).to eq("http://a/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../../' should resolve to http://a/" do + expect((@uri + "../../").to_s).to eq("http://a/") + expect(Addressable::URI.join(@uri.to_s, "../../").to_s).to eq("http://a/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../../g' should resolve to http://a/g" do + expect((@uri + "../../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "../../g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '../../../g' should resolve to http://a/g" do + expect((@uri + "../../../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "../../../g").to_s).to eq("http://a/g") + end + + it "when joined with '../.././../g' should resolve to http://a/g" do + expect((@uri + "../.././../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "../.././../g").to_s).to eq( + "http://a/g" + ) + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '../../../../g' should resolve to http://a/g" do + expect((@uri + "../../../../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join( + @uri.to_s, "../../../../g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '/./g' should resolve to http://a/g" do + expect((@uri + "/./g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "/./g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '/../g' should resolve to http://a/g" do + expect((@uri + "/../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "/../g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g.' should resolve to http://a/b/c/g." do + expect((@uri + "g.").to_s).to eq("http://a/b/c/g.") + expect(Addressable::URI.join(@uri.to_s, "g.").to_s).to eq("http://a/b/c/g.") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '.g' should resolve to http://a/b/c/.g" do + expect((@uri + ".g").to_s).to eq("http://a/b/c/.g") + expect(Addressable::URI.join(@uri.to_s, ".g").to_s).to eq("http://a/b/c/.g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g..' should resolve to http://a/b/c/g.." do + expect((@uri + "g..").to_s).to eq("http://a/b/c/g..") + expect(Addressable::URI.join(@uri.to_s, "g..").to_s).to eq("http://a/b/c/g..") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '..g' should resolve to http://a/b/c/..g" do + expect((@uri + "..g").to_s).to eq("http://a/b/c/..g") + expect(Addressable::URI.join(@uri.to_s, "..g").to_s).to eq("http://a/b/c/..g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with './../g' should resolve to http://a/b/g" do + expect((@uri + "./../g").to_s).to eq("http://a/b/g") + expect(Addressable::URI.join(@uri.to_s, "./../g").to_s).to eq("http://a/b/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with './g/.' should resolve to http://a/b/c/g/" do + expect((@uri + "./g/.").to_s).to eq("http://a/b/c/g/") + expect(Addressable::URI.join(@uri.to_s, "./g/.").to_s).to eq("http://a/b/c/g/") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g/./h' should resolve to http://a/b/c/g/h" do + expect((@uri + "g/./h").to_s).to eq("http://a/b/c/g/h") + expect(Addressable::URI.join(@uri.to_s, "g/./h").to_s).to eq("http://a/b/c/g/h") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g/../h' should resolve to http://a/b/c/h" do + expect((@uri + "g/../h").to_s).to eq("http://a/b/c/h") + expect(Addressable::URI.join(@uri.to_s, "g/../h").to_s).to eq("http://a/b/c/h") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g;x=1/./y' " + + "should resolve to http://a/b/c/g;x=1/y" do + expect((@uri + "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y") + expect(Addressable::URI.join( + @uri.to_s, "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g;x=1/../y' should resolve to http://a/b/c/y" do + expect((@uri + "g;x=1/../y").to_s).to eq("http://a/b/c/y") + expect(Addressable::URI.join( + @uri.to_s, "g;x=1/../y").to_s).to eq("http://a/b/c/y") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g?y/./x' " + + "should resolve to http://a/b/c/g?y/./x" do + expect((@uri + "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x") + expect(Addressable::URI.join( + @uri.to_s, "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g?y/../x' " + + "should resolve to http://a/b/c/g?y/../x" do + expect((@uri + "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x") + expect(Addressable::URI.join( + @uri.to_s, "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g#s/./x' " + + "should resolve to http://a/b/c/g#s/./x" do + expect((@uri + "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x") + expect(Addressable::URI.join( + @uri.to_s, "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g#s/../x' " + + "should resolve to http://a/b/c/g#s/../x" do + expect((@uri + "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x") + expect(Addressable::URI.join( + @uri.to_s, "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'http:g' should resolve to http:g" do + expect((@uri + "http:g").to_s).to eq("http:g") + expect(Addressable::URI.join(@uri.to_s, "http:g").to_s).to eq("http:g") + end + + # Edge case to be sure + it "when joined with '//example.com/' should " + + "resolve to http://example.com/" do + expect((@uri + "//example.com/").to_s).to eq("http://example.com/") + expect(Addressable::URI.join( + @uri.to_s, "//example.com/").to_s).to eq("http://example.com/") + end + + it "when joined with a bogus object a TypeError should be raised" do + expect(lambda do + Addressable::URI.join(@uri, 42) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when converting the path " + + "'relative/path/to/something'" do + before do + @path = 'relative/path/to/something' + end + + it "should convert to " + + "\'relative/path/to/something\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("relative/path/to/something") + end + + it "should join with an absolute file path correctly" do + @base = Addressable::URI.convert_path("/absolute/path/") + @uri = Addressable::URI.convert_path(@path) + expect((@base + @uri).to_str).to eq( + "file:///absolute/path/relative/path/to/something" + ) + end +end + +describe Addressable::URI, "when converting a bogus path" do + it "should raise a TypeError" do + expect(lambda do + Addressable::URI.convert_path(42) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when given a UNIX root directory" do + before do + @path = "/" + end + + it "should convert to \'file:///\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given a Windows root directory" do + before do + @path = "C:\\" + end + + it "should convert to \'file:///c:/\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path '/one/two/'" do + before do + @path = '/one/two/' + end + + it "should convert to " + + "\'file:///one/two/\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///one/two/") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file://c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "file://c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file:c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "file:c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file:/c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "file:/c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file:///c|/windows/My%20Documents%20100%20/foo.txt'" do + before do + @path = "file:///c|/windows/My%20Documents%20100%20/foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given an http protocol URI" do + before do + @path = "http://example.com/" + end + + it "should not do any conversion at all" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("http://example.com/") + end +end + +class SuperString + def initialize(string) + @string = string.to_s + end + + def to_str + return @string + end +end + +describe Addressable::URI, "when parsing a non-String object" do + it "should correctly parse anything with a 'to_str' method" do + Addressable::URI.parse(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect(lambda do + Addressable::URI.parse(42) + end).to raise_error(TypeError) + end + + it "should correctly parse heuristically anything with a 'to_str' method" do + Addressable::URI.heuristic_parse(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect(lambda do + Addressable::URI.heuristic_parse(42) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when form encoding a hash" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + [["&one", "/1"], ["=two", "?2"], [":three", "#3"]] + )).to eq("%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + {"q" => "one two three"} + )).to eq("q=one+two+three") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + {"key" => nil} + )).to eq("key=") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + {"q" => ["one", "two", "three"]} + )).to eq("q=one&q=two&q=three") + end + + it "should result in correctly encoded newlines" do + expect(Addressable::URI.form_encode( + {"text" => "one\ntwo\rthree\r\nfour\n\r"} + )).to eq("text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A") + end + + it "should result in a sorted percent encoded sequence" do + expect(Addressable::URI.form_encode( + [["a", "1"], ["dup", "3"], ["dup", "2"]], true + )).to eq("a=1&dup=2&dup=3") + end +end + +describe Addressable::URI, "when form encoding a non-Array object" do + it "should raise a TypeError for objects than cannot be converted" do + expect(lambda do + Addressable::URI.form_encode(42) + end).to raise_error(TypeError) + end +end + +# See https://tools.ietf.org/html/rfc6749#appendix-B +describe Addressable::URI, "when form encoding the example value from OAuth 2" do + it "should result in correct values" do + expect(Addressable::URI.form_encode( + {"value" => " %&+£€"} + )).to eq("value=+%25%26%2B%C2%A3%E2%82%AC") + end +end + +# See https://tools.ietf.org/html/rfc6749#appendix-B +describe Addressable::URI, "when form unencoding the example value from OAuth 2" do + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "value=+%25%26%2B%C2%A3%E2%82%AC" + )).to eq([["value", " %&+£€"]]) + end +end + +describe Addressable::URI, "when form unencoding a string" do + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233" + )).to eq([["&one", "/1"], ["=two", "?2"], [":three", "#3"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "q=one+two+three" + )).to eq([["q", "one two three"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A" + )).to eq([["text", "one\ntwo\nthree\nfour\n\n"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "a=1&dup=2&dup=3" + )).to eq([["a", "1"], ["dup", "2"], ["dup", "3"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "key" + )).to eq([["key", nil]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode("GivenName=Ren%C3%A9")).to eq( + [["GivenName", "René"]] + ) + end +end + +describe Addressable::URI, "when form unencoding a non-String object" do + it "should correctly parse anything with a 'to_str' method" do + Addressable::URI.form_unencode(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect(lambda do + Addressable::URI.form_unencode(42) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when normalizing a non-String object" do + it "should correctly parse anything with a 'to_str' method" do + Addressable::URI.normalize_component(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect(lambda do + Addressable::URI.normalize_component(42) + end).to raise_error(TypeError) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect(lambda do + Addressable::URI.normalize_component("component", 42) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when normalizing a path with an encoded slash" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.parse("/path%2Fsegment/").normalize.path).to eq( + "/path%2Fsegment/" + ) + end +end + +describe Addressable::URI, "when normalizing a partially encoded string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "partially % encoded%21" + )).to eq("partially%20%25%20encoded!") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "partially %25 encoded!" + )).to eq("partially%20%25%20encoded!") + end +end + +describe Addressable::URI, "when normalizing a unicode sequence" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "/C%CC%A7" + )).to eq("/%C3%87") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "/%C3%87" + )).to eq("/%C3%87") + end +end + +describe Addressable::URI, "when normalizing a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component("günther")).to eq( + "g%C3%BCnther" + ) + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component("g%C3%BCnther")).to eq( + "g%C3%BCnther" + ) + end +end + +describe Addressable::URI, "when normalizing a string but leaving some characters encoded" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component("%58X%59Y%5AZ", "0-9a-zXY", "Y")).to eq( + "XX%59Y%5A%5A" + ) + end + + it "should not modify the character class" do + character_class = "0-9a-zXY" + + character_class_copy = character_class.dup + + Addressable::URI.normalize_component("%58X%59Y%5AZ", character_class, "Y") + + expect(character_class).to eq(character_class_copy) + end +end + +describe Addressable::URI, "when encoding a string with existing encodings to upcase" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component("JK%4c", "0-9A-IKM-Za-z%", "L")).to eq("%4AK%4C") + end +end + +describe Addressable::URI, "when encoding a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component("günther")).to eq("g%C3%BCnther") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component( + "günther", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/ + )).to eq("g%C3%BCnther") + end +end + +describe Addressable::URI, "when form encoding a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode({"GivenName" => "René"})).to eq( + "GivenName=Ren%C3%A9" + ) + end +end + +describe Addressable::URI, "when encoding a string with ASCII chars 0-15" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component("one\ntwo")).to eq("one%0Atwo") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component( + "one\ntwo", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/ + )).to eq("one%0Atwo") + end +end + +describe Addressable::URI, "when unencoding a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.unencode_component("g%C3%BCnther")).to eq("günther") + end + + it "should consistently use UTF-8 internally" do + expect(Addressable::URI.unencode_component("ski=%BA%DAÉ«")).to eq("ski=\xBA\xDAÉ«") + end + + it "should result in correct percent encoded sequence as a URI" do + expect(Addressable::URI.unencode( + "/path?g%C3%BCnther", ::Addressable::URI + )).to eq(Addressable::URI.new( + :path => "/path", :query => "günther" + )) + end +end + +describe Addressable::URI, "when partially unencoding a string" do + it "should unencode all characters by default" do + expect(Addressable::URI.unencode('%%25~%7e+%2b', String)).to eq('%%~~++') + end + + it "should unencode characters not in leave_encoded" do + expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '~')).to eq('%%~%7e++') + end + + it "should leave characters in leave_encoded alone" do + expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '%~+')).to eq('%%25~%7e+%2b') + end +end + +describe Addressable::URI, "when unencoding a bogus object" do + it "should raise a TypeError" do + expect(lambda do + Addressable::URI.unencode_component(42) + end).to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect(lambda do + Addressable::URI.unencode("/path?g%C3%BCnther", Integer) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when encoding a bogus object" do + it "should raise a TypeError" do + expect(lambda do + Addressable::URI.encode(Object.new) + end).to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect(lambda do + Addressable::URI.normalized_encode(Object.new) + end).to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect(lambda do + Addressable::URI.encode_component("günther", Object.new) + end).to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect(lambda do + Addressable::URI.encode_component(Object.new) + end).to raise_error(TypeError) + end +end + +describe Addressable::URI, "when given the input " + + "'http://example.com/'" do + before do + @input = "http://example.com/" + end + + it "should heuristically parse to 'http://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should not raise error when frozen" do + expect(lambda do + Addressable::URI.heuristic_parse(@input).freeze.to_s + end).not_to raise_error + end +end + +describe Addressable::URI, "when given the input " + + "'https://example.com/'" do + before do + @input = "https://example.com/" + end + + it "should heuristically parse to 'https://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("https://example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http:example.com/'" do + before do + @input = "http:example.com/" + end + + it "should heuristically parse to 'http://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should heuristically parse to 'http://example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'https:example.com/'" do + before do + @input = "https:example.com/" + end + + it "should heuristically parse to 'https://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("https://example.com/") + end + + it "should heuristically parse to 'https://example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("https://example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://example.com/example.com/'" do + before do + @input = "http://example.com/example.com/" + end + + it "should heuristically parse to 'http://example.com/example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://prefix\\.example.com/'" do + before do + @input = "http://prefix\\.example.com/" + end + + it "should heuristically parse to 'http://prefix/.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("prefix") + expect(@uri.to_s).to eq("http://prefix/.example.com/") + end + + it "should heuristically parse to 'http://prefix/.example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://prefix/.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://p:\\/'" do + before do + @input = "http://p:\\/" + end + + it "should heuristically parse to 'http://p//'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("p") + expect(@uri.to_s).to eq("http://p//") + end + + it "should heuristically parse to 'http://p//' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://p//") + end +end + +describe Addressable::URI, "when given the input " + + "'http://p://'" do + before do + @input = "http://p://" + end + + it "should heuristically parse to 'http://p//'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("p") + expect(@uri.to_s).to eq("http://p//") + end + + it "should heuristically parse to 'http://p//' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://p//") + end +end + +describe Addressable::URI, "when given the input " + + "'http://p://p'" do + before do + @input = "http://p://p" + end + + it "should heuristically parse to 'http://p//p'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("p") + expect(@uri.to_s).to eq("http://p//p") + end + + it "should heuristically parse to 'http://p//p' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://p//p") + end +end + +describe Addressable::URI, "when given the input " + + "'http://prefix .example.com/'" do + before do + @input = "http://prefix .example.com/" + end + + # Justification here being that no browser actually tries to resolve this. + # They all treat this as a web search. + it "should heuristically parse to 'http://prefix%20.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("prefix%20.example.com") + expect(@uri.to_s).to eq("http://prefix%20.example.com/") + end + + it "should heuristically parse to 'http://prefix%20.example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://prefix%20.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "' http://www.example.com/ '" do + before do + @input = " http://www.example.com/ " + end + + it "should heuristically parse to 'http://prefix%20.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.scheme).to eq("http") + expect(@uri.path).to eq("/") + expect(@uri.to_s).to eq("http://www.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://prefix%2F.example.com/'" do + before do + @input = "http://prefix%2F.example.com/" + end + + it "should heuristically parse to 'http://prefix%2F.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("prefix%2F.example.com") + expect(@uri.to_s).to eq("http://prefix%2F.example.com/") + end + + it "should heuristically parse to 'http://prefix%2F.example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://prefix%2F.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'/path/to/resource'" do + before do + @input = "/path/to/resource" + end + + it "should heuristically parse to '/path/to/resource'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("/path/to/resource") + end +end + +describe Addressable::URI, "when given the input " + + "'relative/path/to/resource'" do + before do + @input = "relative/path/to/resource" + end + + it "should heuristically parse to 'relative/path/to/resource'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("relative/path/to/resource") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com'" do + before do + @input = "example.com" + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com' and a scheme hint of 'ftp'" do + before do + @input = "example.com" + @hints = {:scheme => 'ftp'} + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input, @hints) + expect(@uri.to_s).to eq("ftp://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com:21' and a scheme hint of 'ftp'" do + before do + @input = "example.com:21" + @hints = {:scheme => 'ftp'} + end + + it "should heuristically parse to 'http://example.com:21'" do + @uri = Addressable::URI.heuristic_parse(@input, @hints) + expect(@uri.to_s).to eq("ftp://example.com:21") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com/path/to/resource'" do + before do + @input = "example.com/path/to/resource" + end + + it "should heuristically parse to 'http://example.com/path/to/resource'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/path/to/resource") + end +end + +describe Addressable::URI, "when given the input " + + "'http:///example.com'" do + before do + @input = "http:///example.com" + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "'feed:///example.com'" do + before do + @input = "feed:///example.com" + end + + it "should heuristically parse to 'feed://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("feed://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "'file://path/to/resource/'" do + before do + @input = "file://path/to/resource/" + end + + it "should heuristically parse to 'file:///path/to/resource/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("file:///path/to/resource/") + end +end + +describe Addressable::URI, "when given the input " + + "'feed://http://example.com'" do + before do + @input = "feed://http://example.com" + end + + it "should heuristically parse to 'feed:http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("feed:http://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "::URI.parse('http://example.com')" do + before do + @input = ::URI.parse('http://example.com') + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com") + end +end + +describe Addressable::URI, "when assigning query values" do + before do + @uri = Addressable::URI.new + end + + it "should correctly assign {:a => 'a', :b => ['c', 'd', 'e']}" do + @uri.query_values = {:a => "a", :b => ["c", "d", "e"]} + expect(@uri.query).to eq("a=a&b=c&b=d&b=e") + end + + it "should raise an error attempting to assign {'a' => {'b' => ['c']}}" do + expect(lambda do + @uri.query_values = { 'a' => {'b' => ['c'] } } + end).to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:b => '2', :a => {:c => '1'}}" do + expect(lambda do + @uri.query_values = {:b => '2', :a => {:c => '1'}} + end).to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => [{:c => 'c', :d => 'd'}, " + + "{:e => 'e', :f => 'f'}]}" do + expect(lambda do + @uri.query_values = { + :a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}] + } + end).to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => [{:c => true, :d => 'd'}, " + + "{:e => 'e', :f => 'f'}]}" do + expect(lambda do + @uri.query_values = { + :a => 'a', :b => [{:c => true, :d => 'd'}, {:e => 'e', :f => 'f'}] + } + end).to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => {:c => true, :d => 'd'}}" do + expect(lambda do + @uri.query_values = { + :a => 'a', :b => {:c => true, :d => 'd'} + } + end).to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => {:c => true, :d => 'd'}}" do + expect(lambda do + @uri.query_values = { + :a => 'a', :b => {:c => true, :d => 'd'} + } + end).to raise_error(TypeError) + end + + it "should correctly assign {:a => 1, :b => 1.5}" do + @uri.query_values = { :a => 1, :b => 1.5 } + expect(@uri.query).to eq("a=1&b=1.5") + end + + it "should raise an error attempting to assign " + + "{:z => 1, :f => [2, {999.1 => [3,'4']}, ['h', 'i']], " + + ":a => {:b => ['c', 'd'], :e => true, :y => 0.5}}" do + expect(lambda do + @uri.query_values = { + :z => 1, + :f => [ 2, {999.1 => [3,'4']}, ['h', 'i'] ], + :a => { :b => ['c', 'd'], :e => true, :y => 0.5 } + } + end).to raise_error(TypeError) + end + + it "should correctly assign {}" do + @uri.query_values = {} + expect(@uri.query).to eq('') + end + + it "should correctly assign nil" do + @uri.query_values = nil + expect(@uri.query).to eq(nil) + end + + it "should correctly sort {'ab' => 'c', :ab => 'a', :a => 'x'}" do + @uri.query_values = {'ab' => 'c', :ab => 'a', :a => 'x'} + expect(@uri.query).to eq("a=x&ab=a&ab=c") + end + + it "should correctly assign " + + "[['b', 'c'], ['b', 'a'], ['a', 'a']]" do + # Order can be guaranteed in this format, so preserve it. + @uri.query_values = [['b', 'c'], ['b', 'a'], ['a', 'a']] + expect(@uri.query).to eq("b=c&b=a&a=a") + end + + it "should preserve query string order" do + query_string = (('a'..'z').to_a.reverse.map { |e| "#{e}=#{e}" }).join("&") + @uri.query = query_string + original_uri = @uri.to_s + @uri.query_values = @uri.query_values(Array) + expect(@uri.to_s).to eq(original_uri) + end + + describe 'when a hash with mixed types is assigned to query_values' do + it 'should not raise an error' do + skip 'Issue #94' + expect { subject.query_values = { "page" => "1", :page => 2 } }.to_not raise_error + end + end +end + +describe Addressable::URI, "when assigning path values" do + before do + @uri = Addressable::URI.new + end + + it "should correctly assign paths containing colons" do + @uri.path = "acct:bob@sporkmonger.com" + expect(@uri.path).to eq("acct:bob@sporkmonger.com") + expect(@uri.normalize.to_str).to eq("acct%2Fbob@sporkmonger.com") + expect(lambda { @uri.to_s }).to raise_error( + Addressable::URI::InvalidURIError + ) + end + + it "should correctly assign paths containing colons" do + @uri.path = "/acct:bob@sporkmonger.com" + @uri.authority = "example.com" + expect(@uri.normalize.to_str).to eq("//example.com/acct:bob@sporkmonger.com") + end + + it "should correctly assign paths containing colons" do + @uri.path = "acct:bob@sporkmonger.com" + @uri.scheme = "something" + expect(@uri.normalize.to_str).to eq("something:acct:bob@sporkmonger.com") + end + + it "should not allow relative paths to be assigned on absolute URIs" do + expect(lambda do + @uri.scheme = "http" + @uri.host = "example.com" + @uri.path = "acct:bob@sporkmonger.com" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow relative paths to be assigned on absolute URIs" do + expect(lambda do + @uri.path = "acct:bob@sporkmonger.com" + @uri.scheme = "http" + @uri.host = "example.com" + end).to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow relative paths to be assigned on absolute URIs" do + expect(lambda do + @uri.path = "uuid:0b3ecf60-3f93-11df-a9c3-001f5bfffe12" + @uri.scheme = "urn" + end).not_to raise_error + end +end + +describe Addressable::URI, "when initializing a subclass of Addressable::URI" do + before do + @uri = Class.new(Addressable::URI).new + end + + it "should have the same class after being parsed" do + expect(@uri.class).to eq(Addressable::URI.parse(@uri).class) + end + + it "should have the same class as its duplicate" do + expect(@uri.class).to eq(@uri.dup.class) + end + + it "should have the same class after being normalized" do + expect(@uri.class).to eq(@uri.normalize.class) + end + + it "should have the same class after being merged" do + expect(@uri.class).to eq(@uri.merge(:path => 'path').class) + end + + it "should have the same class after being joined" do + expect(@uri.class).to eq(@uri.join('path').class) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/spec_helper.rb b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/spec_helper.rb new file mode 100644 index 0000000..0b53829 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/spec_helper.rb @@ -0,0 +1,21 @@ +require 'bundler/setup' +require 'rspec/its' + +begin + require 'coveralls' + Coveralls.wear! do + add_filter "spec/" + add_filter "vendor/" + end +rescue LoadError + warn "warning: coveralls gem not found; skipping Coveralls" + require 'simplecov' + SimpleCov.start do + add_filter "spec/" + add_filter "vendor/" + end +end + +RSpec.configure do |config| + config.warnings = true +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/clobber.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/clobber.rake new file mode 100644 index 0000000..093ce81 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/clobber.rake @@ -0,0 +1,2 @@ +desc "Remove all build products" +task "clobber" diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/gem.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/gem.rake new file mode 100644 index 0000000..b4052c0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/gem.rake @@ -0,0 +1,91 @@ +require "rubygems/package_task" + +namespace :gem do + GEM_SPEC = Gem::Specification.new do |s| + s.name = PKG_NAME + s.version = PKG_VERSION + s.summary = PKG_SUMMARY + s.description = PKG_DESCRIPTION + + s.files = PKG_FILES.to_a + + s.has_rdoc = true + s.extra_rdoc_files = %w( README.md ) + s.rdoc_options.concat ["--main", "README.md"] + + if !s.respond_to?(:add_development_dependency) + puts "Cannot build Gem with this version of RubyGems." + exit(1) + end + + s.required_ruby_version = '>= 2.0' + + s.add_runtime_dependency 'public_suffix', '>= 2.0.2', '< 4.0' + s.add_development_dependency 'bundler', '~> 1.0' + + s.require_path = "lib" + + s.author = "Bob Aman" + s.email = "bob@sporkmonger.com" + s.homepage = "https://github.com/sporkmonger/addressable" + s.license = "Apache-2.0" + end + + Gem::PackageTask.new(GEM_SPEC) do |p| + p.gem_spec = GEM_SPEC + p.need_tar = true + p.need_zip = true + end + + desc "Generates .gemspec file" + task :gemspec do + spec_string = GEM_SPEC.to_ruby + File.open("#{GEM_SPEC.name}.gemspec", 'w') do |file| + file.write spec_string + end + end + + desc "Show information about the gem" + task :debug do + puts GEM_SPEC.to_ruby + end + + desc "Install the gem" + task :install => ["clobber", "gem:package"] do + sh "#{SUDO} gem install --local pkg/#{GEM_SPEC.full_name}" + end + + desc "Uninstall the gem" + task :uninstall do + installed_list = Gem.source_index.find_name(PKG_NAME) + if installed_list && + (installed_list.collect { |s| s.version.to_s}.include?(PKG_VERSION)) + sh( + "#{SUDO} gem uninstall --version '#{PKG_VERSION}' " + + "--ignore-dependencies --executables #{PKG_NAME}" + ) + end + end + + desc "Reinstall the gem" + task :reinstall => [:uninstall, :install] + + desc 'Package for release' + task :release => ["gem:package", "gem:gemspec"] do |t| + v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z' + abort "Versions don't match #{v} vs #{PROJ.version}" if v != PKG_VERSION + pkg = "pkg/#{GEM_SPEC.full_name}" + + changelog = File.open("CHANGELOG.md") { |file| file.read } + + puts "Releasing #{PKG_NAME} v. #{PKG_VERSION}" + Rake::Task["git:tag:create"].invoke + end +end + +desc "Alias to gem:package" +task "gem" => "gem:package" + +task "gem:release" => "gem:gemspec" + +task "clobber" => ["gem:clobber_package"] diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/git.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/git.rake new file mode 100644 index 0000000..74ec2fd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/git.rake @@ -0,0 +1,45 @@ +namespace :git do + namespace :tag do + desc "List tags from the Git repository" + task :list do + tags = `git tag -l` + tags.gsub!("\r", "") + tags = tags.split("\n").sort {|a, b| b <=> a } + puts tags.join("\n") + end + + desc "Create a new tag in the Git repository" + task :create do + changelog = File.open("CHANGELOG.md", "r") { |file| file.read } + puts "-" * 80 + puts changelog + puts "-" * 80 + puts + + v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z" + abort "Versions don't match #{v} vs #{PKG_VERSION}" if v != PKG_VERSION + + git_status = `git status` + if git_status !~ /^nothing to commit/ + abort "Working directory isn't clean." + end + + tag = "#{PKG_NAME}-#{PKG_VERSION}" + msg = "Release #{PKG_NAME}-#{PKG_VERSION}" + + existing_tags = `git tag -l #{PKG_NAME}-*`.split('\n') + if existing_tags.include?(tag) + warn("Tag already exists, deleting...") + unless system "git tag -d #{tag}" + abort "Tag deletion failed." + end + end + puts "Creating git tag '#{tag}'..." + unless system "git tag -a -m \"#{msg}\" #{tag}" + abort "Tag creation failed." + end + end + end +end + +task "gem:release" => "git:tag:create" diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/metrics.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/metrics.rake new file mode 100644 index 0000000..41fc5c2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/metrics.rake @@ -0,0 +1,22 @@ +namespace :metrics do + task :lines do + lines, codelines, total_lines, total_codelines = 0, 0, 0, 0 + for file_name in FileList["lib/**/*.rb"] + f = File.open(file_name) + while line = f.gets + lines += 1 + next if line =~ /^\s*$/ + next if line =~ /^\s*#/ + codelines += 1 + end + puts "L: #{sprintf("%4d", lines)}, " + + "LOC #{sprintf("%4d", codelines)} | #{file_name}" + total_lines += lines + total_codelines += codelines + + lines, codelines = 0, 0 + end + + puts "Total: Lines #{total_lines}, LOC #{total_codelines}" + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/rspec.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/rspec.rake new file mode 100644 index 0000000..e74a6c8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/rspec.rake @@ -0,0 +1,21 @@ +require "rspec/core/rake_task" + +namespace :spec do + RSpec::Core::RakeTask.new(:simplecov) do |t| + t.pattern = FileList['spec/**/*_spec.rb'] + t.rspec_opts = ['--color', '--format', 'documentation'] + end + + namespace :simplecov do + desc "Browse the code coverage report." + task :browse => "spec:simplecov" do + require "launchy" + Launchy.open("coverage/index.html") + end + end +end + +desc "Alias to spec:simplecov" +task "spec" => "spec:simplecov" + +task "clobber" => ["spec:clobber_simplecov"] diff --git a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/yard.rake b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/yard.rake new file mode 100644 index 0000000..68e4491 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/yard.rake @@ -0,0 +1,27 @@ +require "rake" + +begin + require "yard" + require "yard/rake/yardoc_task" + + namespace :doc do + desc "Generate Yardoc documentation" + YARD::Rake::YardocTask.new do |yardoc| + yardoc.name = "yard" + yardoc.options = ["--verbose", "--markup", "markdown"] + yardoc.files = FileList[ + "lib/**/*.rb", "ext/**/*.c", + "README.md", "CHANGELOG.md", "LICENSE.txt" + ].exclude(/idna/) + end + end + + task "clobber" => ["doc:clobber_yard"] + + desc "Alias to doc:yard" + task "doc" => "doc:yard" +rescue LoadError + # If yard isn't available, it's not the end of the world + desc "Alias to doc:rdoc" + task "doc" => "doc:rdoc" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Gemfile b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Gemfile new file mode 100644 index 0000000..044fba3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Gemfile @@ -0,0 +1,11 @@ +source "https://rubygems.org" +gemspec + +gem "rake" +group :development do + gem "rspec-helpers", :require => false + gem "luna-rspec-formatters", :require => false + gem "pry", :require => false unless ENV[ + "CI" + ] +end diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/History.markdown b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/History.markdown new file mode 100644 index 0000000..bac4270 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/History.markdown @@ -0,0 +1,25 @@ +## 1.1.0 / 2016-06-28 + +### Minor Enhancements + +* Support jruby (#8) + +## 1.0.0 / 2016-04-28 + +### Major enhancements + +- Merge Simple::ANSI and Colorator. (#7) + +### Minor Enhancements + +- Delete unnecessary `Symbol#to_sym` (#2) +- Change argument name of `Enumerator#each` for better code legibility (#3) + +### Development Fixes + +- Convert to new RSpec expectation syntax (#1) +- Fix `String#blue` result in README (#4) + +## 0.1 / 2013-04-13 + +Birthday! diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/LICENSE b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/LICENSE new file mode 100644 index 0000000..b3b6be9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) Parker Moore + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/README.markdown b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/README.markdown new file mode 100644 index 0000000..9cf886d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/README.markdown @@ -0,0 +1,47 @@ +# colorator + +Colorize your text for the terminal + +[![Build Status](https://travis-ci.org/octopress/colorator.png?branch=master)](https://travis-ci.org/octopress/colorator) + +## Example + +```ruby +"this string".red +# => \e[31mthis string\e[0m +"my string".blue +# => \e[34mmy string\e[0m +# etc... +``` + +## Supported Colors + +- `red` +- `black` +- `green` +- `yellow` +- `magenta` +- `white` +- `blue` +- `cyan` +- `bold` + +## Other supported Ansi methods + +- `clear_line` +- `has_ansi?`, `has_color?` +- `strip_ansi`, `strip_color` +- `reset_ansi`, `reset_color` +- `clear_screen` +- `ansi_jump` + +## Why + +There are a bunch of gems that provide functionality like this, but none have +as simple an API as this. Just call `"string".color` and your text will be +colorized. + +## License + +MIT. Written as a single Ruby file by Brandon Mathis, converted into a gem by +Parker Moore. diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Rakefile b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Rakefile new file mode 100644 index 0000000..b7e9ed5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Rakefile @@ -0,0 +1,6 @@ +require "bundler/gem_tasks" +require "rspec/core/rake_task" + +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/colorator.gemspec b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/colorator.gemspec new file mode 100644 index 0000000..a4bd0cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/colorator.gemspec @@ -0,0 +1,23 @@ +# coding: utf-8 + +require File.expand_path('lib/colorator.rb', __dir__) + +Gem::Specification.new do |spec| + spec.name = "colorator" + spec.summary = "Colorize your text in the terminal." + spec.version = Colorator::VERSION + spec.authors = ["Parker Moore", "Brandon Mathis"] + spec.email = ["parkrmoore@gmail.com", "brandon@imathis.com"] + spec.homepage = "https://github.com/octopress/colorator" + spec.licenses = ["MIT"] + + all = `git ls-files -z`.split("\x0").reject { |f| f.start_with?(".") } + spec.files = all.select { |f| File.basename(f) == f || f =~ %r{^(bin|lib)/} } + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.require_paths = ["lib"] + + spec.extra_rdoc_files = ["README.markdown", "LICENSE"] + spec.rdoc_options = ["--charset=UTF-8"] + + spec.add_development_dependency "rspec", "~> 3.1" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator.rb b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator.rb new file mode 100644 index 0000000..107f6e3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator.rb @@ -0,0 +1,111 @@ +$:.unshift File.dirname(__FILE__) + +module Colorator + module_function + VERSION = "1.1.0" + + # -------------------------------------------------------------------------- + + ANSI_MATCHR = /\x1b.*?[jkmsuABGKH]/ + ANSI_COLORS = { + :black => 30, + :red => 31, + :green => 32, + :yellow => 33, + :blue => 34, + :magenta => 35, + :cyan => 36, + :white => 37, + :bold => 1 + } + + # -------------------------------------------------------------------------- + # Allows you to check if a string currently has ansi. + # -------------------------------------------------------------------------- + + def has_ansi?(str) + str.match(ANSI_MATCHR).is_a?( + MatchData + ) + end + + # -------------------------------------------------------------------------- + # Jump the cursor, moving it up and then back down to it's spot, allowing + # you to do fancy things like multiple output (downloads) the way that Docker + # does them in an async way without breaking term. + # -------------------------------------------------------------------------- + + def ansi_jump(str, num) + "\x1b[#{num}A#{clear_line(str)}\x1b[#{ + num + }B" + end + + # -------------------------------------------------------------------------- + + def reset_ansi(str = "") + "\x1b[0m#{ + str + }" + end + + # -------------------------------------------------------------------------- + + def clear_line(str = "") + "\x1b[2K\r#{ + str + }" + end + + # -------------------------------------------------------------------------- + # Strip ANSI from the current string, making it just a normal string. + # -------------------------------------------------------------------------- + + def strip_ansi(str) + str.gsub( + ANSI_MATCHR, "" + ) + end + + # -------------------------------------------------------------------------- + # Clear the screen's current view, so the user gets a clean output. + # -------------------------------------------------------------------------- + + def clear_screen(str = "") + "\x1b[H\x1b[2J#{ + str + }" + end + + # -------------------------------------------------------------------------- + + def colorize(str = "", color) + "\x1b[#{color}m#{str}\x1b[0m" + end + + # -------------------------------------------------------------------------- + + Colorator::ANSI_COLORS.each do |color, code| + define_singleton_method color do |str| + colorize( + str, code + ) + end + end + + # -------------------------------------------------------------------------- + + class << self + alias reset_color reset_ansi + alias strip_color strip_ansi + alias has_color? has_ansi? + end + + # -------------------------------------------------------------------------- + + CORE_METHODS = ( + public_methods - Object.methods + ) +end + +require "colorator/core_ext" diff --git a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb new file mode 100644 index 0000000..f2e0bf0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb @@ -0,0 +1,9 @@ +class String + Colorator::CORE_METHODS.each do |method| + define_method method do |*args| + Colorator.public_send(method, + self, *args + ) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/CHANGELOG.md b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/CHANGELOG.md new file mode 100644 index 0000000..d603348 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/CHANGELOG.md @@ -0,0 +1,387 @@ +## Release v1.0.5, edge v0.3.1 (26 Feb 2017) + +concurrent-ruby: + +* Documentation for Event and Semaphore +* Use Unsafe#fullFence and #loadFence directly since the shortcuts were removed in JRuby +* Do not depend on org.jruby.util.unsafe.UnsafeHolder + +concurrent-ruby-edge: + +* (#620) Actors on Pool raise an error +* (#624) Delayed promises did not interact correctly with flatting + * Fix arguments yielded by callback methods +* Overridable default executor in promises factory methods +* Asking actor to terminate will always resolve to `true` + +## Release v1.0.4, edge v0.3.0 (27 Dec 2016) + +concurrent-ruby: + +* Nothing + +concurrent-ruby-edge: + +* New promises' API renamed, lots of improvements, edge bumped to 0.3.0 + * **Incompatible** with previous 0.2.3 version + * see https://github.com/ruby-concurrency/concurrent-ruby/pull/522 + +## Release v1.0.3 (17 Dec 2016) + +* Trigger execution of flattened delayed futures +* Avoid forking for processor_count if possible +* Semaphore Mutex and JRuby parity +* Adds Map#each as alias to Map#each_pair +* Fix uninitialized instance variables +* Make Fixnum, Bignum merger ready +* Allows Promise#then to receive an executor +* TimerSet now survives a fork +* Reject promise on any exception +* Allow ThreadLocalVar to be initialized with a block +* Support Alpha with `Concurrent::processor_count` +* Fixes format-security error when compiling ruby_193_compatible.h +* Concurrent::Atom#swap fixed: reraise the exceptions from block + +## Release v1.0.2 (2 May 2016) + +* Fix bug with `Concurrent::Map` MRI backend `#inspect` method +* Fix bug with `Concurrent::Map` MRI backend using `Hash#value?` +* Improved documentation and examples +* Minor updates to Edge + +## Release v1.0.1 (27 February 2016) + +* Fix "uninitialized constant Concurrent::ReentrantReadWriteLock" error. +* Better handling of `autoload` vs. `require`. +* Improved API for Edge `Future` zipping. +* Fix reference leak in Edge `Future` constructor . +* Fix bug which prevented thread pools from surviving a `fork`. +* Fix bug in which `TimerTask` did not correctly specify all its dependencies. +* Improved support for JRuby+Truffle +* Improved error messages. +* Improved documentation. +* Updated README and CONTRIBUTING. + +## Release v1.0.0 (13 November 2015) + +* Rename `attr_volatile_with_cas` to `attr_atomic` +* Add `clear_each` to `LockFreeStack` +* Update `AtomicReference` documentation +* Further updates and improvements to the synchronization layer. +* Performance and memory usage performance with `Actor` logging. +* Fixed `ThreadPoolExecutor` task count methods. +* Improved `Async` performance for both short and long-lived objects. +* Fixed bug in `LockFreeLinkedSet`. +* Fixed bug in which `Agent#await` triggered a validation failure. +* Further `Channel` updates. +* Adopted a project Code of Conduct +* Cleared interpreter warnings +* Fixed bug in `ThreadPoolExecutor` task count methods +* Fixed bug in 'LockFreeLinkedSet' +* Improved Java extension loading +* Handle Exception children in Edge::Future +* Continued improvements to channel +* Removed interpreter warnings. +* Shared constants now in `lib/concurrent/constants.rb` +* Refactored many tests. +* Improved synchronization layer/memory model documentation. +* Bug fix in Edge `Future#flat` +* Brand new `Channel` implementation in Edge gem. +* Simplification of `RubySingleThreadExecutor` +* `Async` improvements + - Each object uses its own `SingleThreadExecutor` instead of the global thread pool. + - No longers supports executor injection + - Much better documentation +* `Atom` updates + - No longer `Dereferenceable` + - Now `Observable` + - Added a `#reset` method +* Brand new `Agent` API and implementation. Now functionally equivalent to Clojure. +* Continued improvements to the synchronization layer +* Merged in the `thread_safe` gem + - `Concurrent::Array` + - `Concurrent::Hash` + - `Concurrent::Map` (formerly ThreadSafe::Cache) + - `Concurrent::Tuple` +* Minor improvements to Concurrent::Map +* Complete rewrite of `Exchanger` +* Removed all deprecated code (classes, methods, constants, etc.) +* Updated Agent, MutexAtomic, and BufferedChannel to inherit from Synchronization::Object. +* Many improved tests +* Some internal reorganization + +## Release v0.9.1 (09 August 2015) + +* Fixed a Rubiniux bug in synchronization object +* Fixed all interpreter warnings (except circular references) +* Fixed require statements when requiring `Atom` alone +* Significantly improved `ThreadLocalVar` on non-JRuby platforms +* Fixed error handling in Edge `Concurrent.zip` +* `AtomicFixnum` methods `#increment` and `#decrement` now support optional delta +* New `AtomicFixnum#update` method +* Minor optimizations in `ReadWriteLock` +* New `ReentrantReadWriteLock` class +* `ThreadLocalVar#bind` method is now public +* Refactored many tests + +## Release v0.9.0 (10 July 2015) + +* Updated `AtomicReference` + - `AtomicReference#try_update` now simply returns instead of raising exception + - `AtomicReference#try_update!` was added to raise exceptions if an update + fails. Note: this is the same behavior as the old `try_update` +* Pure Java implementations of + - `AtomicBoolean` + - `AtomicFixnum` + - `Semaphore` +* Fixed bug when pruning Ruby thread pools +* Fixed bug in time calculations within `ScheduledTask` +* Default `count` in `CountDownLatch` to 1 +* Use monotonic clock for all timers via `Concurrent.monotonic_time` + - Use `Process.clock_gettime(Process::CLOCK_MONOTONIC)` when available + - Fallback to `java.lang.System.nanoTime()` on unsupported JRuby versions + - Pure Ruby implementation for everything else + - Effects `Concurrent.timer`, `Concurrent.timeout`, `TimerSet`, `TimerTask`, and `ScheduledTask` +* Deprecated all clock-time based timer scheduling + - Only support scheduling by delay + - Effects `Concurrent.timer`, `TimerSet`, and `ScheduledTask` +* Added new `ReadWriteLock` class +* Consistent `at_exit` behavior for Java and Ruby thread pools. +* Added `at_exit` handler to Ruby thread pools (already in Java thread pools) + - Ruby handler stores the object id and retrieves from `ObjectSpace` + - JRuby disables `ObjectSpace` by default so that handler stores the object reference +* Added a `:stop_on_exit` option to thread pools to enable/disable `at_exit` handler +* Updated thread pool docs to better explain shutting down thread pools +* Simpler `:executor` option syntax for all abstractions which support this option +* Added `Executor#auto_terminate?` predicate method (for thread pools) +* Added `at_exit` handler to `TimerSet` +* Simplified auto-termination of the global executors + - Can now disable auto-termination of global executors + - Added shutdown/kill/wait_for_termination variants for global executors +* Can now disable auto-termination for *all* executors (the nuclear option) +* Simplified auto-termination of the global executors +* Deprecated terms "task pool" and "operation pool" + - New terms are "io executor" and "fast executor" + - New functions added with new names + - Deprecation warnings added to functions referencing old names +* Moved all thread pool related functions from `Concurrent::Configuration` to `Concurrent` + - Old functions still exist with deprecation warnings + - New functions have updated names as appropriate +* All high-level abstractions default to the "io executor" +* Fixed bug in `Actor` causing it to prematurely warm global thread pools on gem load + - This also fixed a `RejectedExecutionError` bug when running with minitest/autorun via JRuby +* Moved global logger up to the `Concurrent` namespace and refactored the code +* Optimized the performance of `Delay` + - Fixed a bug in which no executor option on construction caused block execution on a global thread pool +* Numerous improvements and bug fixes to `TimerSet` +* Fixed deadlock of `Future` when the handler raises Exception +* Added shared specs for more classes +* New concurrency abstractions including: + - `Atom` + - `Maybe` + - `ImmutableStruct` + - `MutableStruct` + - `SettableStruct` +* Created an Edge gem for unstable abstractions including + - `Actor` + - `Agent` + - `Channel` + - `Exchanger` + - `LazyRegister` + - **new Future Framework** - unified + implementation of Futures and Promises which combines Features of previous `Future`, + `Promise`, `IVar`, `Event`, `Probe`, `dataflow`, `Delay`, `TimerTask` into single framework. It uses extensively + new synchronization layer to make all the paths **lock-free** with exception of blocking threads on `#wait`. + It offers better performance and does not block threads when not required. +* Actor framework changes: + - fixed reset loop in Pool + - Pool can use any actor as a worker, abstract worker class is no longer needed. + - Actor events not have format `[:event_name, *payload]` instead of just the Symbol. + - Actor now uses new Future/Promise Framework instead of `IVar` for better interoperability + - Behaviour definition array was simplified to `[BehaviourClass1, [BehaviourClass2, *initialization_args]]` + - Linking behavior responds to :linked message by returning array of linked actors + - Supervised behavior is removed in favour of just Linking + - RestartingContext is supervised by default now, `supervise: true` is not required any more + - Events can be private and public, so far only difference is that Linking will + pass to linked actors only public messages. Adding private :restarting and + :resetting events which are send before the actor restarts or resets allowing + to add callbacks to cleanup current child actors. + - Print also object_id in Reference to_s + - Add AbstractContext#default_executor to be able to override executor class wide + - Add basic IO example + - Documentation somewhat improved + - All messages should have same priority. It's now possible to send `actor << job1 << job2 << :terminate!` and + be sure that both jobs are processed first. +* Refactored `Channel` to use newer synchronization objects +* Added `#reset` and `#cancel` methods to `TimerSet` +* Added `#cancel` method to `Future` and `ScheduledTask` +* Refactored `TimerSet` to use `ScheduledTask` +* Updated `Async` with a factory that initializes the object +* Deprecated `Concurrent.timer` and `Concurrent.timeout` +* Reduced max threads on pure-Ruby thread pools (abends around 14751 threads) +* Moved many private/internal classes/modules into "namespace" modules +* Removed brute-force killing of threads in tests +* Fixed a thread pool bug when the operating system cannot allocate more threads + +## Release v0.8.0 (25 January 2015) + +* C extension for MRI have been extracted into the `concurrent-ruby-ext` companion gem. + Please see the README for more detail. +* Better variable isolation in `Promise` and `Future` via an `:args` option +* Continued to update intermittently failing tests + +## Release v0.7.2 (24 January 2015) + +* New `Semaphore` class based on [java.util.concurrent.Semaphore](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html) +* New `Promise.all?` and `Promise.any?` class methods +* Renamed `:overflow_policy` on thread pools to `:fallback_policy` +* Thread pools still accept the `:overflow_policy` option but display a warning +* Thread pools now implement `fallback_policy` behavior when not running (rather than universally rejecting tasks) +* Fixed minor `set_deref_options` constructor bug in `Promise` class +* Fixed minor `require` bug in `ThreadLocalVar` class +* Fixed race condition bug in `TimerSet` class +* Fixed race condition bug in `TimerSet` class +* Fixed signal bug in `TimerSet#post` method +* Numerous non-functional updates to clear warning when running in debug mode +* Fixed more intermittently failing tests +* Tests now run on new Travis build environment +* Multiple documentation updates + +## Release v0.7.1 (4 December 2014) + +Please see the [roadmap](https://github.com/ruby-concurrency/concurrent-ruby/issues/142) for more information on the next planned release. + +* Added `flat_map` method to `Promise` +* Added `zip` method to `Promise` +* Fixed bug with logging in `Actor` +* Improvements to `Promise` tests +* Removed actor-experimental warning +* Added an `IndirectImmediateExecutor` class +* Allow disabling auto termination of global executors +* Fix thread leaking in `ThreadLocalVar` (uses `Ref` gem on non-JRuby systems) +* Fix thread leaking when pruning pure-Ruby thread pools +* Prevent `Actor` from using an `ImmediateExecutor` (causes deadlock) +* Added missing synchronizations to `TimerSet` +* Fixed bug with return value of `Concurrent::Actor::Utils::Pool#ask` +* Fixed timing bug in `TimerTask` +* Fixed bug when creating a `JavaThreadPoolExecutor` with minimum pool size of zero +* Removed confusing warning when not using native extenstions +* Improved documentation + +## Release v0.7.0 (13 August 2014) + +* Merge the [atomic](https://github.com/ruby-concurrency/atomic) gem + - Pure Ruby `MutexAtomic` atomic reference class + - Platform native atomic reference classes `CAtomic`, `JavaAtomic`, and `RbxAtomic` + - Automated [build process](https://github.com/ruby-concurrency/rake-compiler-dev-box) + - Fat binary releases for [multiple platforms](https://rubygems.org/gems/concurrent-ruby/versions) including Windows (32/64), Linux (32/64), OS X (64-bit), Solaris (64-bit), and JRuby +* C native `CAtomicBoolean` +* C native `CAtomicFixnum` +* Refactored intermittently failing tests +* Added `dataflow!` and `dataflow_with!` methods to match `Future#value!` method +* Better handling of timeout in `Agent` +* Actor Improvements + - Fine-grained implementation using chain of behaviors. Each behavior is responsible for single aspect like: `Termination`, `Pausing`, `Linking`, `Supervising`, etc. Users can create custom Actors easily based on their needs. + - Supervision was added. `RestartingContext` will pause on error waiting on its supervisor to decide what to do next ( options are `:terminate!`, `:resume!`, `:reset!`, `:restart!`). Supervising behavior also supports strategies `:one_for_one` and `:one_for_all`. + - Linking was added to be able to monitor actor's events like: `:terminated`, `:paused`, `:restarted`, etc. + - Dead letter routing added. Rejected envelopes are collected in a configurable actor (default: `Concurrent::Actor.root.ask!(:dead_letter_routing)`) + - Old `Actor` class removed and replaced by new implementation previously called `Actress`. `Actress` was kept as an alias for `Actor` to keep compatibility. + - `Utils::Broadcast` actor which allows Publish–subscribe pattern. +* More executors for managing serialized operations + - `SerializedExecution` mixin module + - `SerializedExecutionDelegator` for serializing *any* executor +* Updated `Async` with serialized execution +* Updated `ImmediateExecutor` and `PerThreadExecutor` with full executor service lifecycle +* Added a `Delay` to root `Actress` initialization +* Minor bug fixes to thread pools +* Refactored many intermittently failing specs +* Removed Java interop warning `executor.rb:148 warning: ambiguous Java methods found, using submit(java.lang.Runnable)` +* Fixed minor bug in `RubyCachedThreadPool` overflow policy +* Updated tests to use [RSpec 3.0](http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3) +* Removed deprecated `Actor` class +* Better support for Rubinius + +## Release v0.6.1 (14 June 2014) + +* Many improvements to `Concurrent::Actress` +* Bug fixes to `Concurrent::RubyThreadPoolExecutor` +* Fixed several brittle tests +* Moved documentation to http://ruby-concurrency.github.io/concurrent-ruby/frames.html + +## Release v0.6.0 (25 May 2014) + +* Added `Concurrent::Observable` to encapsulate our thread safe observer sets +* Improvements to new `Channel` +* Major improvements to `CachedThreadPool` and `FixedThreadPool` +* Added `SingleThreadExecutor` +* Added `Current::timer` function +* Added `TimerSet` executor +* Added `AtomicBoolean` +* `ScheduledTask` refactoring +* Pure Ruby and JRuby-optimized `PriorityQueue` classes +* Updated `Agent` behavior to more closely match Clojure +* Observer sets support block callbacks to the `add_observer` method +* New algorithm for thread creation in `RubyThreadPoolExecutor` +* Minor API updates to `Event` +* Rewritten `TimerTask` now an `Executor` instead of a `Runnable` +* Fixed many brittle specs +* Renamed `FixedThreadPool` and `CachedThreadPool` to `RubyFixedThreadPool` and `RubyCachedThreadPool` +* Created JRuby optimized `JavaFixedThreadPool` and `JavaCachedThreadPool` +* Consolidated fixed thread pool tests into `spec/concurrent/fixed_thread_pool_shared.rb` and `spec/concurrent/cached_thread_pool_shared.rb` +* `FixedThreadPool` now subclasses `RubyFixedThreadPool` or `JavaFixedThreadPool` as appropriate +* `CachedThreadPool` now subclasses `RubyCachedThreadPool` or `JavaCachedThreadPool` as appropriate +* New `Delay` class +* `Concurrent::processor_count` helper function +* New `Async` module +* Renamed `NullThreadPool` to `PerThreadExecutor` +* Deprecated `Channel` (we are planning a new implementation based on [Go](http://golangtutorials.blogspot.com/2011/06/channels-in-go.html)) +* Added gem-level [configuration](http://robots.thoughtbot.com/mygem-configure-block) +* Deprecated `$GLOBAL_THREAD_POOL` in lieu of gem-level configuration +* Removed support for Ruby [1.9.2](https://www.ruby-lang.org/en/news/2013/12/17/maintenance-of-1-8-7-and-1-9-2/) +* New `RubyThreadPoolExecutor` and `JavaThreadPoolExecutor` classes +* All thread pools now extend the appropriate thread pool executor classes +* All thread pools now support `:overflow_policy` (based on Java's [reject policies](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html)) +* Deprecated `UsesGlobalThreadPool` in lieu of explicit `:executor` option (dependency injection) on `Future`, `Promise`, and `Agent` +* Added `Concurrent::dataflow_with(executor, *inputs)` method to support executor dependency injection for dataflow +* Software transactional memory with `TVar` and `Concurrent::atomically` +* First implementation of [new, high-performance](https://github.com/ruby-concurrency/concurrent-ruby/pull/49) `Channel` +* `Actor` is deprecated in favor of new experimental actor implementation [#73](https://github.com/ruby-concurrency/concurrent-ruby/pull/73). To avoid namespace collision it is living in `Actress` namespace until `Actor` is removed in next release. + +## Release v0.5.0 + +This is the most significant release of this gem since its inception. This release includes many improvements and optimizations. It also includes several bug fixes. The major areas of focus for this release were: + +* Stability improvements on Ruby versions with thread-level parallelism ([JRuby](http://jruby.org/) and [Rubinius](http://rubini.us/)) +* Creation of new low-level concurrency abstractions +* Internal refactoring to use the new low-level abstractions + +Most of these updates had no effect on the gem API. There are a few notable exceptions which were unavoidable. Please read the [release notes](API-Updates-in-v0.5.0) for more information. + +Specific changes include: + +* New class `IVar` +* New class `MVar` +* New class `ThreadLocalVar` +* New class `AtomicFixnum` +* New class method `dataflow` +* New class `Condition` +* New class `CountDownLatch` +* New class `DependencyCounter` +* New class `SafeTaskExecutor` +* New class `CopyOnNotifyObserverSet` +* New class `CopyOnWriteObserverSet` +* `Future` updated with `execute` API +* `ScheduledTask` updated with `execute` API +* New `Promise` API +* `Future` now extends `IVar` +* `Postable#post?` now returns an `IVar` +* Thread safety fixes to `Dereferenceable` +* Thread safety fixes to `Obligation` +* Thread safety fixes to `Supervisor` +* Thread safety fixes to `Event` +* Various other thread safety (race condition) fixes +* Refactored brittle tests +* Implemented pending tests +* Added JRuby and Rubinius as Travis CI build targets +* Added [CodeClimate](https://codeclimate.com/) code review +* Improved YARD documentation diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/LICENSE.txt b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/LICENSE.txt new file mode 100644 index 0000000..47474f1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/LICENSE.txt @@ -0,0 +1,21 @@ +Copyright (c) Jerry D'Antonio -- released under the MIT license. + +http://www.opensource.org/licenses/mit-license.php + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/README.md b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/README.md new file mode 100644 index 0000000..dafef0d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/README.md @@ -0,0 +1,247 @@ +# Concurrent Ruby + +[![Gem Version](https://badge.fury.io/rb/concurrent-ruby.svg)](http://badge.fury.io/rb/concurrent-ruby) +[![Build Status](https://travis-ci.org/ruby-concurrency/concurrent-ruby.svg?branch=master)](https://travis-ci.org/ruby-concurrency/concurrent-ruby) +[![Build status](https://ci.appveyor.com/api/projects/status/iq8aboyuu3etad4w?svg=true)](https://ci.appveyor.com/project/rubyconcurrency/concurrent-ruby) +[![Code Climate](https://codeclimate.com/github/ruby-concurrency/concurrent-ruby.svg)](https://codeclimate.com/github/ruby-concurrency/concurrent-ruby) +[![Inline docs](http://inch-ci.org/github/ruby-concurrency/concurrent-ruby.svg)](http://inch-ci.org/github/ruby-concurrency/concurrent-ruby) +[![Dependency Status](https://gemnasium.com/ruby-concurrency/concurrent-ruby.svg)](https://gemnasium.com/ruby-concurrency/concurrent-ruby) +[![License](https://img.shields.io/badge/license-MIT-green.svg)](http://opensource.org/licenses/MIT) +[![Gitter chat](https://img.shields.io/badge/IRC%20(gitter)-devs%20%26%20users-brightgreen.svg)](https://gitter.im/ruby-concurrency/concurrent-ruby) + +Modern concurrency tools for Ruby. Inspired by +[Erlang](http://www.erlang.org/doc/reference_manual/processes.html), +[Clojure](http://clojure.org/concurrent_programming), +[Scala](http://akka.io/), +[Haskell](http://www.haskell.org/haskellwiki/Applications_and_libraries/Concurrency_and_parallelism#Concurrent_Haskell), +[F#](http://blogs.msdn.com/b/dsyme/archive/2010/02/15/async-and-parallel-design-patterns-in-f-part-3-agents.aspx), +[C#](http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx), +[Java](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html), +and classic concurrency patterns. + + + +The design goals of this gem are: + +* Be an 'unopinionated' toolbox that provides useful utilities without debating which is better or why +* Remain free of external gem dependencies +* Stay true to the spirit of the languages providing inspiration +* But implement in a way that makes sense for Ruby +* Keep the semantics as idiomatic Ruby as possible +* Support features that make sense in Ruby +* Exclude features that don't make sense in Ruby +* Be small, lean, and loosely coupled + +### Supported Ruby versions + +MRI 1.9.3, 2.0 and above, JRuby 1.7x in 1.9 mode, JRuby 9000, and Rubinius 2.x are supported. +This gem should be fully compatible with any interpreter that is compliant with Ruby 1.9.3 or newer. +Java 8 is preferred for JRuby but every Java version on which JRuby 9000 runs is supported. + +## Thread Safety + +*Concurrent Ruby makes the strongest thread safety guarantees of any Ruby concurrency library. We are the only library with a published [memory model](https://github.com/ruby-concurrency/concurrent-ruby/blob/master/doc/synchronization.md) which provides consistent behavior and guarantees on all three of the main Ruby interpreters (MRI/CRuby, JRuby, and Rubinius).* + +Every abstraction in this library is thread safe. Similarly, all are deadlock free and many are fully lock free. Specific thread safety guarantees are documented with each abstraction. + +It is critical to remember, however, that Ruby is a language of mutable references. *No* concurrency library for Ruby can ever prevent the user from making thread safety mistakes (such as sharing a mutable object between threads and modifying it on both threads) or from creating deadlocks through incorrect use of locks. All the library can do is provide safe abstractions which encourage safe practices. Concurrent Ruby provides more safe concurrency abstractions than any other Ruby library, many of which support the mantra of ["Do not communicate by sharing memory; instead, share memory by communicating"](https://blog.golang.org/share-memory-by-communicating). Concurrent Ruby is also the only Ruby library which provides a full suite of thread safe and immutable variable types and data structures. + +## Features & Documentation + +The primary site for documentation is the automatically generated [API documentation](http://ruby-concurrency.github.io/concurrent-ruby/frames.html) + +We also have a [mailing list](http://groups.google.com/group/concurrent-ruby) and [IRC (gitter)](https://gitter.im/ruby-concurrency/concurrent-ruby). + +#### General-purpose Concurrency Abstractions + +* [Async](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Async.html): A mixin module that provides simple asynchronous behavior to a class. Loosely based on Erlang's [gen_server](http://www.erlang.org/doc/man/gen_server.html). +* [Future](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Future.html): An asynchronous operation that produces a value. + * [Dataflow](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent.html#dataflow-class_method): Built on Futures, Dataflow allows you to create a task that will be scheduled when all of its data dependencies are available. +* [Promise](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Promise.html): Similar to Futures, with more features. +* [ScheduledTask](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ScheduledTask.html): Like a Future scheduled for a specific future time. +* [TimerTask](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/TimerTask.html): A Thread that periodically wakes up to perform work at regular intervals. + +#### Thread-safe Value Objects, Structures, and Collections + +Collection classes that were originally part of the (deprecated) `thread_safe` gem: + +* [Array](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Array.html) A thread-safe subclass of Ruby's standard [Array](http://ruby-doc.org/core-2.2.0/Array.html). +* [Hash](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Hash.html) A thread-safe subclass of Ruby's standard [Hash](http://ruby-doc.org/core-2.2.0/Hash.html). +* [Map](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Map.html) A hash-like object that should have much better performance characteristics, especially under high concurrency, than `Concurrent::Hash`. +* [Tuple](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Tuple.html) A fixed size array with volatile (synchronized, thread safe) getters/setters. + +Value objects inspired by other languages: + +* [Maybe](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Maybe.html) A thread-safe, immutable object representing an optional value, based on + [Haskell Data.Maybe](https://hackage.haskell.org/package/base-4.2.0.1/docs/Data-Maybe.html). +* [Delay](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Delay.html) Lazy evaluation of a block yielding an immutable result. Based on Clojure's [delay](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Delay.html). + +Structure classes derived from Ruby's [Struct](http://ruby-doc.org/core-2.2.0/Struct.html): + +* [ImmutableStruct](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ImmutableStruct.html) Immutable struct where values are set at construction and cannot be changed later. +* [MutableStruct](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/MutableStruct.html) Synchronized, mutable struct where values can be safely changed at any time. +* [SettableStruct](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/SettableStruct.html) Synchronized, write-once struct where values can be set at most once, either at construction or any time thereafter. + +Thread-safe variables: + +* [Agent](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Agent.html): A way to manage shared, mutable, *asynchronous*, independent state. Based on Clojure's [Agent](http://clojure.org/agents). +* [Atom](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Atom.html): A way to manage shared, mutable, *synchronous*, independent state. Based on Clojure's [Atom](http://clojure.org/atoms). +* [AtomicBoolean](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/AtomicBoolean.html) A boolean value that can be updated atomically. +* [AtomicFixnum](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/AtomicFixnum.html) A numeric value that can be updated atomically. +* [AtomicReference](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/MutexAtomic.html) An object reference that may be updated atomically. +* [Exchanger](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Exchanger.html) A synchronization point at which threads can pair and swap elements within pairs. Based on Java's [Exchanger](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html). +* [MVar](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/MVar.html) A synchronized single element container. Based on Haskell's [MVar](https://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Concurrent-MVar.html) and Scala's [MVar](http://docs.typelevel.org/api/scalaz/nightly/index.html#scalaz.concurrent.MVar$). +* [ThreadLocalVar](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ThreadLocalVar.html) A variable where the value is different for each thread. +* [TVar](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/TVar.html) A transactional variable implementing software transactional memory (STM). Based on Clojure's [Ref](http://clojure.org/refs). + +#### Java-inspired ThreadPools and Other Executors + +* See the [thread pool](http://ruby-concurrency.github.io/concurrent-ruby/file.thread_pools.html) overview, which also contains a list of other Executors available. + +#### Thread Synchronization Classes and Algorithms + +* [CountDownLatch](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/CountDownLatch.html) A synchronization object that allows one thread to wait on multiple other threads. +* [CyclicBarrier](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/CyclicBarrier.html) A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. +* [Event](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Event.html) Old school kernel-style event. +* [IVar](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/IVar.html) Similar to a "future" but can be manually assigned once, after which it becomes immutable. +* [ReadWriteLock](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ReadWriteLock.html) A lock that supports multiple readers but only one writer. +* [ReentrantReadWriteLock](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ReentrantReadWriteLock.html) A read/write lock with reentrant and upgrade features. +* [Semaphore](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Semaphore.html) A counting-based locking mechanism that uses permits. + +### Edge Features + +These are available in the `concurrent-ruby-edge` companion gem. + +These features are under active development and may change frequently. They are expected not to +keep backward compatibility (there may also lack tests and documentation). Semantic versions will +be obeyed though. Features developed in `concurrent-ruby-edge` are expected to move to `concurrent-ruby` when final. + +* [Promises Framework](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Promises.html): + Unified implementation of futures and promises which combines features of previous `Future`, + `Promise`, `IVar`, `Event`, `dataflow`, `Delay`, and `TimerTask` into a single framework. It extensively uses the + new synchronization layer to make all the features **non-blocking** and **lock-free**, with the exception of obviously blocking + operations like `#wait`, `#value`. It also offers better performance. +* [Actor](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Actor.html): + Implements the Actor Model, where concurrent actors exchange messages. +* [Channel](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Edge/Channel.html): + Communicating Sequential Processes ([CSP](https://en.wikipedia.org/wiki/Communicating_sequential_processes)). + Functionally equivalent to Go [channels](https://tour.golang.org/concurrency/2) with additional + inspiration from Clojure [core.async](https://clojure.github.io/core.async/). +* [LazyRegister](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/LazyRegister.html) +* [AtomicMarkableReference](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Edge/AtomicMarkableReference.html) +* [LockFreeLinkedSet](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Edge/LockFreeLinkedSet.html) +* [LockFreeStack](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/LockFreeStack.html) + +#### Statuses: + +*Why are these not in core?* + +- **Promises Framework** - They are being finalized to be able to be moved to core. They'll deprecate old + implementation. +- **Actor** - Partial documentation and tests; depends on new future/promise framework; stability is good. +- **Channel** - Brand new implementation; partial documentation and tests; stability is good. +- **LazyRegister** - Missing documentation and tests. +- **AtomicMarkableReference, LockFreeLinkedSet, LockFreeStack** - Need real world battle testing. + +## Usage + +Everything within this gem can be loaded simply by requiring it: + +```ruby +require 'concurrent' +``` + +To use the tools in the Edge gem it must be required separately: + +```ruby +require 'concurrent-edge' +``` + +If the library does not behave as expected, `Concurrent.use_stdlib_logger(Logger::DEBUG)` could help to reveal the problem. + +## Installation + +```shell +gem install concurrent-ruby +``` + +or add the following line to Gemfile: + +```ruby +gem 'concurrent-ruby', require: 'concurrent' +``` + +and run `bundle install` from your shell. + +### Edge Gem Installation + +The Edge gem must be installed separately from the core gem: + +```shell +gem install concurrent-ruby-edge +``` + +or add the following line to Gemfile: + +```ruby +gem 'concurrent-ruby-edge', require: 'concurrent-edge' +``` + +and run `bundle install` from your shell. + + +### C Extensions for MRI + +Potential performance improvements may be achieved under MRI by installing optional C extensions. +To minimize installation errors the C extensions are available in the `concurrent-ruby-ext` extension +gem. `concurrent-ruby` and `concurrent-ruby-ext` are always released together with same version. +Simply install the extension gem too: + +```ruby +gem install concurrent-ruby-ext +``` + +or add the following line to Gemfile: + +```ruby +gem 'concurrent-ruby-ext' +``` + +and run `bundle install` from your shell. + +In code it is only necessary to + +```ruby +require 'concurrent' +``` + +The `concurrent-ruby` gem will automatically detect the presence of the `concurrent-ruby-ext` gem +and load the appropriate C extensions. + +#### Note For gem developers + +No gems should depend on `concurrent-ruby-ext`. Doing so will force C extensions on your users. +The best practice is to depend on `concurrent-ruby` and let users to decide if they want C extensions. + +## Maintainers + +* [Petr Chalupa](https://github.com/pitr-ch) (lead maintainer) +* [Jerry D'Antonio](https://github.com/jdantonio) (creator) +* [Michele Della Torre](https://github.com/mighe) +* [Chris Seaton](https://github.com/chrisseaton) +* [PaweÅ‚ Obrok](https://github.com/obrok) +* [Lucas Allan](https://github.com/lucasallan) + +### Special Thanks + +* [Brian Durand](https://github.com/bdurand) for the `ref` gem +* [Charles Oliver Nutter](https://github.com/headius) for the `atomic` and `thread_safe` gems +* [thedarkone](https://github.com/thedarkone) for the `thread_safe` gem + +## License and Copyright + +*Concurrent Ruby* is free software released under the [MIT License](http://www.opensource.org/licenses/MIT). + +The *Concurrent Ruby* [logo](https://github.com/ruby-concurrency/concurrent-ruby/wiki/Logo) +was designed by [David Jones](https://twitter.com/zombyboy). +It is Copyright © 2014 [Jerry D'Antonio](https://twitter.com/jerrydantonio). All Rights Reserved. diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent.rb new file mode 100644 index 0000000..a6f4e58 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent.rb @@ -0,0 +1,130 @@ +require 'concurrent/version' +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/configuration' + +require 'concurrent/atomics' +require 'concurrent/executors' +require 'concurrent/synchronization' + +require 'concurrent/atomic/atomic_reference' +require 'concurrent/agent' +require 'concurrent/atom' +require 'concurrent/array' +require 'concurrent/hash' +require 'concurrent/map' +require 'concurrent/tuple' +require 'concurrent/async' +require 'concurrent/dataflow' +require 'concurrent/delay' +require 'concurrent/exchanger' +require 'concurrent/future' +require 'concurrent/immutable_struct' +require 'concurrent/ivar' +require 'concurrent/maybe' +require 'concurrent/mutable_struct' +require 'concurrent/mvar' +require 'concurrent/promise' +require 'concurrent/scheduled_task' +require 'concurrent/settable_struct' +require 'concurrent/timer_task' +require 'concurrent/tvar' + +require 'concurrent/thread_safe/synchronized_delegator' +require 'concurrent/thread_safe/util' + +require 'concurrent/options' + +# @!macro [new] internal_implementation_note +# +# @note **Private Implementation:** This abstraction is a private, internal +# implementation detail. It should never be used directly. + +# @!macro [new] monotonic_clock_warning +# +# @note Time calculations one all platforms and languages are sensitive to +# changes to the system clock. To alleviate the potential problems +# associated with changing the system clock while an application is running, +# most modern operating systems provide a monotonic clock that operates +# independently of the system clock. A monotonic clock cannot be used to +# determine human-friendly clock times. A monotonic clock is used exclusively +# for calculating time intervals. Not all Ruby platforms provide access to an +# operating system monotonic clock. On these platforms a pure-Ruby monotonic +# clock will be used as a fallback. An operating system monotonic clock is both +# faster and more reliable than the pure-Ruby implementation. The pure-Ruby +# implementation should be fast and reliable enough for most non-realtime +# operations. At this time the common Ruby platforms that provide access to an +# operating system monotonic clock are MRI 2.1 and above and JRuby (all versions). +# +# @see http://linux.die.net/man/3/clock_gettime Linux clock_gettime(3) + +# @!macro [new] copy_options +# +# ## Copy Options +# +# Object references in Ruby are mutable. This can lead to serious +# problems when the {#value} of an object is a mutable reference. Which +# is always the case unless the value is a `Fixnum`, `Symbol`, or similar +# "primitive" data type. Each instance can be configured with a few +# options that can help protect the program from potentially dangerous +# operations. Each of these options can be optionally set when the object +# instance is created: +# +# * `:dup_on_deref` When true the object will call the `#dup` method on +# the `value` object every time the `#value` method is called +# (default: false) +# * `:freeze_on_deref` When true the object will call the `#freeze` +# method on the `value` object every time the `#value` method is called +# (default: false) +# * `:copy_on_deref` When given a `Proc` object the `Proc` will be run +# every time the `#value` method is called. The `Proc` will be given +# the current `value` as its only argument and the result returned by +# the block will be the return value of the `#value` call. When `nil` +# this option will be ignored (default: nil) +# +# When multiple deref options are set the order of operations is strictly defined. +# The order of deref operations is: +# * `:copy_on_deref` +# * `:dup_on_deref` +# * `:freeze_on_deref` +# +# Because of this ordering there is no need to `#freeze` an object created by a +# provided `:copy_on_deref` block. Simply set `:freeze_on_deref` to `true`. +# Setting both `:dup_on_deref` to `true` and `:freeze_on_deref` to `true` is +# as close to the behavior of a "pure" functional language (like Erlang, Clojure, +# or Haskell) as we are likely to get in Ruby. + +# @!macro [attach] deref_options +# +# @option opts [Boolean] :dup_on_deref (false) Call `#dup` before +# returning the data from {#value} +# @option opts [Boolean] :freeze_on_deref (false) Call `#freeze` before +# returning the data from {#value} +# @option opts [Proc] :copy_on_deref (nil) When calling the {#value} +# method, call the given proc passing the internal value as the sole +# argument then return the new value returned from the proc. + +# @!macro [attach] executor_and_deref_options +# +# @param [Hash] opts the options used to define the behavior at update and deref +# and to specify the executor on which to perform actions +# @option opts [Executor] :executor when set use the given `Executor` instance. +# Three special values are also supported: `:task` returns the global task pool, +# `:operation` returns the global operation pool, and `:immediate` returns a new +# `ImmediateExecutor` object. +# @!macro deref_options + +# Modern concurrency tools for Ruby. Inspired by Erlang, Clojure, Scala, Haskell, +# F#, C#, Java, and classic concurrency patterns. +# +# The design goals of this gem are: +# +# * Stay true to the spirit of the languages providing inspiration +# * But implement in a way that makes sense for Ruby +# * Keep the semantics as idiomatic Ruby as possible +# * Support features that make sense in Ruby +# * Exclude features that don't make sense in Ruby +# * Be small, lean, and loosely coupled +module Concurrent + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/agent.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/agent.rb new file mode 100644 index 0000000..dfb9a92 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/agent.rb @@ -0,0 +1,587 @@ +require 'concurrent/configuration' +require 'concurrent/atomic/atomic_reference' +require 'concurrent/atomic/thread_local_var' +require 'concurrent/collection/copy_on_write_observer_set' +require 'concurrent/concern/observable' +require 'concurrent/synchronization' + +module Concurrent + + # `Agent` is inspired by Clojure's [agent](http://clojure.org/agents) + # function. An agent is a shared, mutable variable providing independent, + # uncoordinated, *asynchronous* change of individual values. Best used when + # the value will undergo frequent, complex updates. Suitable when the result + # of an update does not need to be known immediately. `Agent` is (mostly) + # functionally equivalent to Clojure's agent, except where the runtime + # prevents parity. + # + # Agents are reactive, not autonomous - there is no imperative message loop + # and no blocking receive. The state of an Agent should be itself immutable + # and the `#value` of an Agent is always immediately available for reading by + # any thread without any messages, i.e. observation does not require + # cooperation or coordination. + # + # Agent action dispatches are made using the various `#send` methods. These + # methods always return immediately. At some point later, in another thread, + # the following will happen: + # + # 1. The given `action` will be applied to the state of the Agent and the + # `args`, if any were supplied. + # 2. The return value of `action` will be passed to the validator lambda, + # if one has been set on the Agent. + # 3. If the validator succeeds or if no validator was given, the return value + # of the given `action` will become the new `#value` of the Agent. See + # `#initialize` for details. + # 4. If any observers were added to the Agent, they will be notified. See + # `#add_observer` for details. + # 5. If during the `action` execution any other dispatches are made (directly + # or indirectly), they will be held until after the `#value` of the Agent + # has been changed. + # + # If any exceptions are thrown by an action function, no nested dispatches + # will occur, and the exception will be cached in the Agent itself. When an + # Agent has errors cached, any subsequent interactions will immediately throw + # an exception, until the agent's errors are cleared. Agent errors can be + # examined with `#error` and the agent restarted with `#restart`. + # + # The actions of all Agents get interleaved amongst threads in a thread pool. + # At any point in time, at most one action for each Agent is being executed. + # Actions dispatched to an agent from another single agent or thread will + # occur in the order they were sent, potentially interleaved with actions + # dispatched to the same agent from other sources. The `#send` method should + # be used for actions that are CPU limited, while the `#send_off` method is + # appropriate for actions that may block on IO. + # + # Unlike in Clojure, `Agent` cannot participate in `Concurrent::TVar` transactions. + # + # ## Example + # + # ``` + # def next_fibonacci(set = nil) + # return [0, 1] if set.nil? + # set + [set[-2..-1].reduce{|sum,x| sum + x }] + # end + # + # # create an agent with an initial value + # agent = Concurrent::Agent.new(next_fibonacci) + # + # # send a few update requests + # 5.times do + # agent.send{|set| next_fibonacci(set) } + # end + # + # # wait for them to complete + # agent.await + # + # # get the current value + # agent.value #=> [0, 1, 1, 2, 3, 5, 8] + # ``` + # + # ## Observation + # + # Agents support observers through the {Concurrent::Observable} mixin module. + # Notification of observers occurs every time an action dispatch returns and + # the new value is successfully validated. Observation will *not* occur if the + # action raises an exception, if validation fails, or when a {#restart} occurs. + # + # When notified the observer will receive three arguments: `time`, `old_value`, + # and `new_value`. The `time` argument is the time at which the value change + # occurred. The `old_value` is the value of the Agent when the action began + # processing. The `new_value` is the value to which the Agent was set when the + # action completed. Note that `old_value` and `new_value` may be the same. + # This is not an error. It simply means that the action returned the same + # value. + # + # ## Nested Actions + # + # It is possible for an Agent action to post further actions back to itself. + # The nested actions will be enqueued normally then processed *after* the + # outer action completes, in the order they were sent, possibly interleaved + # with action dispatches from other threads. Nested actions never deadlock + # with one another and a failure in a nested action will never affect the + # outer action. + # + # Nested actions can be called using the Agent reference from the enclosing + # scope or by passing the reference in as a "send" argument. Nested actions + # cannot be post using `self` from within the action block/proc/lambda; `self` + # in this context will not reference the Agent. The preferred method for + # dispatching nested actions is to pass the Agent as an argument. This allows + # Ruby to more effectively manage the closing scope. + # + # Prefer this: + # + # ``` + # agent = Concurrent::Agent.new(0) + # agent.send(agent) do |value, this| + # this.send {|v| v + 42 } + # 3.14 + # end + # agent.value #=> 45.14 + # ``` + # + # Over this: + # + # ``` + # agent = Concurrent::Agent.new(0) + # agent.send do |value| + # agent.send {|v| v + 42 } + # 3.14 + # end + # ``` + # + # @!macro [new] agent_await_warning + # + # **NOTE** Never, *under any circumstances*, call any of the "await" methods + # ({#await}, {#await_for}, {#await_for!}, and {#wait}) from within an action + # block/proc/lambda. The call will block the Agent and will always fail. + # Calling either {#await} or {#wait} (with a timeout of `nil`) will + # hopelessly deadlock the Agent with no possibility of recovery. + # + # @!macro thread_safe_variable_comparison + # + # @see http://clojure.org/Agents Clojure Agents + # @see http://clojure.org/state Values and Change - Clojure's approach to Identity and State + class Agent < Synchronization::LockableObject + include Concern::Observable + + ERROR_MODES = [:continue, :fail].freeze + private_constant :ERROR_MODES + + AWAIT_FLAG = Object.new + private_constant :AWAIT_FLAG + + AWAIT_ACTION = ->(value, latch) { latch.count_down; AWAIT_FLAG } + private_constant :AWAIT_ACTION + + DEFAULT_ERROR_HANDLER = ->(agent, error) { nil } + private_constant :DEFAULT_ERROR_HANDLER + + DEFAULT_VALIDATOR = ->(value) { true } + private_constant :DEFAULT_VALIDATOR + + Job = Struct.new(:action, :args, :executor, :caller) + private_constant :Job + + # Raised during action processing or any other time in an Agent's lifecycle. + class Error < StandardError + def initialize(message = nil) + message ||= 'agent must be restarted before jobs can post' + super(message) + end + end + + # Raised when a new value obtained during action processing or at `#restart` + # fails validation. + class ValidationError < Error + def initialize(message = nil) + message ||= 'invalid value' + super(message) + end + end + + # The error mode this Agent is operating in. See {#initialize} for details. + attr_reader :error_mode + + # Create a new `Agent` with the given initial value and options. + # + # The `:validator` option must be `nil` or a side-effect free proc/lambda + # which takes one argument. On any intended value change the validator, if + # provided, will be called. If the new value is invalid the validator should + # return `false` or raise an error. + # + # The `:error_handler` option must be `nil` or a proc/lambda which takes two + # arguments. When an action raises an error or validation fails, either by + # returning false or raising an error, the error handler will be called. The + # arguments to the error handler will be a reference to the agent itself and + # the error object which was raised. + # + # The `:error_mode` may be either `:continue` (the default if an error + # handler is given) or `:fail` (the default if error handler nil or not + # given). + # + # If an action being run by the agent throws an error or doesn't pass + # validation the error handler, if present, will be called. After the + # handler executes if the error mode is `:continue` the Agent will continue + # as if neither the action that caused the error nor the error itself ever + # happened. + # + # If the mode is `:fail` the Agent will become {#failed?} and will stop + # accepting new action dispatches. Any previously queued actions will be + # held until {#restart} is called. The {#value} method will still work, + # returning the value of the Agent before the error. + # + # @param [Object] initial the initial value + # @param [Hash] opts the configuration options + # + # @option opts [Symbol] :error_mode either `:continue` or `:fail` + # @option opts [nil, Proc] :error_handler the (optional) error handler + # @option opts [nil, Proc] :validator the (optional) validation procedure + def initialize(initial, opts = {}) + super() + synchronize { ns_initialize(initial, opts) } + end + + # The current value (state) of the Agent, irrespective of any pending or + # in-progress actions. The value is always available and is non-blocking. + # + # @return [Object] the current value + def value + @current.value # TODO (pitr 12-Sep-2015): broken unsafe read? + end + + alias_method :deref, :value + + # When {#failed?} and {#error_mode} is `:fail`, returns the error object + # which caused the failure, else `nil`. When {#error_mode} is `:continue` + # will *always* return `nil`. + # + # @return [nil, Error] the error which caused the failure when {#failed?} + def error + @error.value + end + + alias_method :reason, :error + + # @!macro [attach] agent_send + # + # Dispatches an action to the Agent and returns immediately. Subsequently, + # in a thread from a thread pool, the {#value} will be set to the return + # value of the action. Action dispatches are only allowed when the Agent + # is not {#failed?}. + # + # The action must be a block/proc/lambda which takes 1 or more arguments. + # The first argument is the current {#value} of the Agent. Any arguments + # passed to the send method via the `args` parameter will be passed to the + # action as the remaining arguments. The action must return the new value + # of the Agent. + # + # * {#send} and {#send!} should be used for actions that are CPU limited + # * {#send_off}, {#send_off!}, and {#<<} are appropriate for actions that + # may block on IO + # * {#send_via} and {#send_via!} are used when a specific executor is to + # be used for the action + # + # @param [Array] args zero or more arguments to be passed to + # the action + # @param [Proc] action the action dispatch to be enqueued + # + # @yield [agent, value, *args] process the old value and return the new + # @yieldparam [Object] value the current {#value} of the Agent + # @yieldparam [Array] args zero or more arguments to pass to the + # action + # @yieldreturn [Object] the new value of the Agent + # + # @!macro [attach] send_return + # @return [Boolean] true if the action is successfully enqueued, false if + # the Agent is {#failed?} + def send(*args, &action) + enqueue_action_job(action, args, Concurrent.global_fast_executor) + end + + # @!macro agent_send + # + # @!macro [attach] send_bang_return_and_raise + # @return [Boolean] true if the action is successfully enqueued + # @raise [Concurrent::Agent::Error] if the Agent is {#failed?} + def send!(*args, &action) + raise Error.new unless send(*args, &action) + true + end + + # @!macro agent_send + # @!macro send_return + def send_off(*args, &action) + enqueue_action_job(action, args, Concurrent.global_io_executor) + end + + alias_method :post, :send_off + + # @!macro agent_send + # @!macro send_bang_return_and_raise + def send_off!(*args, &action) + raise Error.new unless send_off(*args, &action) + true + end + + # @!macro agent_send + # @!macro send_return + # @param [Concurrent::ExecutorService] executor the executor on which the + # action is to be dispatched + def send_via(executor, *args, &action) + enqueue_action_job(action, args, executor) + end + + # @!macro agent_send + # @!macro send_bang_return_and_raise + # @param [Concurrent::ExecutorService] executor the executor on which the + # action is to be dispatched + def send_via!(executor, *args, &action) + raise Error.new unless send_via(executor, *args, &action) + true + end + + # Dispatches an action to the Agent and returns immediately. Subsequently, + # in a thread from a thread pool, the {#value} will be set to the return + # value of the action. Appropriate for actions that may block on IO. + # + # @param [Proc] action the action dispatch to be enqueued + # @return [Concurrent::Agent] self + # @see {#send_off} + def <<(action) + send_off(&action) + self + end + + # Blocks the current thread (indefinitely!) until all actions dispatched + # thus far, from this thread or nested by the Agent, have occurred. Will + # block when {#failed?}. Will never return if a failed Agent is {#restart} + # with `:clear_actions` true. + # + # Returns a reference to `self` to support method chaining: + # + # ``` + # current_value = agent.await.value + # ``` + # + # @return [Boolean] self + # + # @!macro agent_await_warning + def await + wait(nil) + self + end + + # Blocks the current thread until all actions dispatched thus far, from this + # thread or nested by the Agent, have occurred, or the timeout (in seconds) + # has elapsed. + # + # @param [Float] timeout the maximum number of seconds to wait + # @return [Boolean] true if all actions complete before timeout else false + # + # @!macro agent_await_warning + def await_for(timeout) + wait(timeout.to_f) + end + + # Blocks the current thread until all actions dispatched thus far, from this + # thread or nested by the Agent, have occurred, or the timeout (in seconds) + # has elapsed. + # + # @param [Float] timeout the maximum number of seconds to wait + # @return [Boolean] true if all actions complete before timeout + # + # @raise [Concurrent::TimeoutError] when timout is reached + # + # @!macro agent_await_warning + def await_for!(timeout) + raise Concurrent::TimeoutError unless wait(timeout.to_f) + true + end + + # Blocks the current thread until all actions dispatched thus far, from this + # thread or nested by the Agent, have occurred, or the timeout (in seconds) + # has elapsed. Will block indefinitely when timeout is nil or not given. + # + # Provided mainly for consistency with other classes in this library. Prefer + # the various `await` methods instead. + # + # @param [Float] timeout the maximum number of seconds to wait + # @return [Boolean] true if all actions complete before timeout else false + # + # @!macro agent_await_warning + def wait(timeout = nil) + latch = Concurrent::CountDownLatch.new(1) + enqueue_await_job(latch) + latch.wait(timeout) + end + + # Is the Agent in a failed state? + # + # @see {#restart} + def failed? + !@error.value.nil? + end + + alias_method :stopped?, :failed? + + # When an Agent is {#failed?}, changes the Agent {#value} to `new_value` + # then un-fails the Agent so that action dispatches are allowed again. If + # the `:clear_actions` option is give and true, any actions queued on the + # Agent that were being held while it was failed will be discarded, + # otherwise those held actions will proceed. The `new_value` must pass the + # validator if any, or `restart` will raise an exception and the Agent will + # remain failed with its old {#value} and {#error}. Observers, if any, will + # not be notified of the new state. + # + # @param [Object] new_value the new value for the Agent once restarted + # @param [Hash] opts the configuration options + # @option opts [Symbol] :clear_actions true if all enqueued but unprocessed + # actions should be discarded on restart, else false (default: false) + # @return [Boolean] true + # + # @raise [Concurrent:AgentError] when not failed + def restart(new_value, opts = {}) + clear_actions = opts.fetch(:clear_actions, false) + synchronize do + raise Error.new('agent is not failed') unless failed? + raise ValidationError unless ns_validate(new_value) + @current.value = new_value + @error.value = nil + @queue.clear if clear_actions + ns_post_next_job unless @queue.empty? + end + true + end + + class << self + + # Blocks the current thread (indefinitely!) until all actions dispatched + # thus far to all the given Agents, from this thread or nested by the + # given Agents, have occurred. Will block when any of the agents are + # failed. Will never return if a failed Agent is restart with + # `:clear_actions` true. + # + # @param [Array] agents the Agents on which to wait + # @return [Boolean] true + # + # @!macro agent_await_warning + def await(*agents) + agents.each { |agent| agent.await } + true + end + + # Blocks the current thread until all actions dispatched thus far to all + # the given Agents, from this thread or nested by the given Agents, have + # occurred, or the timeout (in seconds) has elapsed. + # + # @param [Float] timeout the maximum number of seconds to wait + # @param [Array] agents the Agents on which to wait + # @return [Boolean] true if all actions complete before timeout else false + # + # @!macro agent_await_warning + def await_for(timeout, *agents) + end_at = Concurrent.monotonic_time + timeout.to_f + ok = agents.length.times do |i| + break false if (delay = end_at - Concurrent.monotonic_time) < 0 + break false unless agents[i].await_for(delay) + end + !!ok + end + + # Blocks the current thread until all actions dispatched thus far to all + # the given Agents, from this thread or nested by the given Agents, have + # occurred, or the timeout (in seconds) has elapsed. + # + # @param [Float] timeout the maximum number of seconds to wait + # @param [Array] agents the Agents on which to wait + # @return [Boolean] true if all actions complete before timeout + # + # @raise [Concurrent::TimeoutError] when timout is reached + # @!macro agent_await_warning + def await_for!(timeout, *agents) + raise Concurrent::TimeoutError unless await_for(timeout, *agents) + true + end + end + + private + + def ns_initialize(initial, opts) + @error_mode = opts[:error_mode] + @error_handler = opts[:error_handler] + + if @error_mode && !ERROR_MODES.include?(@error_mode) + raise ArgumentError.new('unrecognized error mode') + elsif @error_mode.nil? + @error_mode = @error_handler ? :continue : :fail + end + + @error_handler ||= DEFAULT_ERROR_HANDLER + @validator = opts.fetch(:validator, DEFAULT_VALIDATOR) + @current = Concurrent::AtomicReference.new(initial) + @error = Concurrent::AtomicReference.new(nil) + @caller = Concurrent::ThreadLocalVar.new(nil) + @queue = [] + + self.observers = Collection::CopyOnNotifyObserverSet.new + end + + def enqueue_action_job(action, args, executor) + raise ArgumentError.new('no action given') unless action + job = Job.new(action, args, executor, @caller.value || Thread.current.object_id) + synchronize { ns_enqueue_job(job) } + end + + def enqueue_await_job(latch) + synchronize do + if (index = ns_find_last_job_for_thread) + job = Job.new(AWAIT_ACTION, [latch], Concurrent.global_immediate_executor, + Thread.current.object_id) + ns_enqueue_job(job, index+1) + else + latch.count_down + true + end + end + end + + def ns_enqueue_job(job, index = nil) + # a non-nil index means this is an await job + return false if index.nil? && failed? + index ||= @queue.length + @queue.insert(index, job) + # if this is the only job, post to executor + ns_post_next_job if @queue.length == 1 + true + end + + def ns_post_next_job + @queue.first.executor.post { execute_next_job } + end + + def execute_next_job + job = synchronize { @queue.first } + old_value = @current.value + + @caller.value = job.caller # for nested actions + new_value = job.action.call(old_value, *job.args) + @caller.value = nil + + return if new_value == AWAIT_FLAG + + if ns_validate(new_value) + @current.value = new_value + observers.notify_observers(Time.now, old_value, new_value) + else + handle_error(ValidationError.new) + end + rescue => error + handle_error(error) + ensure + synchronize do + @queue.shift + unless failed? || @queue.empty? + ns_post_next_job + end + end + end + + def ns_validate(value) + @validator.call(value) + rescue + false + end + + def handle_error(error) + # stop new jobs from posting + @error.value = error if @error_mode == :fail + @error_handler.call(self, error) + rescue + # do nothing + end + + def ns_find_last_job_for_thread + @queue.rindex { |job| job.caller == Thread.current.object_id } + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/array.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/array.rb new file mode 100644 index 0000000..59e5264 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/array.rb @@ -0,0 +1,39 @@ +require 'concurrent/utility/engine' +require 'concurrent/thread_safe/util' + +module Concurrent + if Concurrent.on_cruby? + + # Because MRI never runs code in parallel, the existing + # non-thread-safe structures should usually work fine. + + # @!macro [attach] concurrent_array + # + # A thread-safe subclass of Array. This version locks against the object + # itself for every method call, ensuring only one thread can be reading + # or writing at a time. This includes iteration methods like `#each`. + # + # @see http://ruby-doc.org/core-2.2.0/Array.html Ruby standard library `Array` + class Array < ::Array; + end + + elsif Concurrent.on_jruby? + require 'jruby/synchronized' + + # @!macro concurrent_array + class Array < ::Array + include JRuby::Synchronized + end + + elsif Concurrent.on_rbx? || Concurrent.on_truffle? + require 'monitor' + require 'concurrent/thread_safe/util/array_hash_rbx' + + # @!macro concurrent_array + class Array < ::Array + end + + ThreadSafe::Util.make_synchronized_on_rbx Array + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/async.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/async.rb new file mode 100644 index 0000000..2312429 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/async.rb @@ -0,0 +1,445 @@ +require 'concurrent/configuration' +require 'concurrent/ivar' +require 'concurrent/synchronization/lockable_object' + +module Concurrent + + # A mixin module that provides simple asynchronous behavior to a class, + # turning it into a simple actor. Loosely based on Erlang's + # [gen_server](http://www.erlang.org/doc/man/gen_server.html), but without + # supervision or linking. + # + # A more feature-rich {Concurrent::Actor} is also available when the + # capabilities of `Async` are too limited. + # + # ```cucumber + # Feature: + # As a stateful, plain old Ruby class + # I want safe, asynchronous behavior + # So my long-running methods don't block the main thread + # ``` + # + # The `Async` module is a way to mix simple yet powerful asynchronous + # capabilities into any plain old Ruby object or class, turning each object + # into a simple Actor. Method calls are processed on a background thread. The + # caller is free to perform other actions while processing occurs in the + # background. + # + # Method calls to the asynchronous object are made via two proxy methods: + # `async` (alias `cast`) and `await` (alias `call`). These proxy methods post + # the method call to the object's background thread and return a "future" + # which will eventually contain the result of the method call. + # + # This behavior is loosely patterned after Erlang's `gen_server` behavior. + # When an Erlang module implements the `gen_server` behavior it becomes + # inherently asynchronous. The `start` or `start_link` function spawns a + # process (similar to a thread but much more lightweight and efficient) and + # returns the ID of the process. Using the process ID, other processes can + # send messages to the `gen_server` via the `cast` and `call` methods. Unlike + # Erlang's `gen_server`, however, `Async` classes do not support linking or + # supervision trees. + # + # ## Basic Usage + # + # When this module is mixed into a class, objects of the class become inherently + # asynchronous. Each object gets its own background thread on which to post + # asynchronous method calls. Asynchronous method calls are executed in the + # background one at a time in the order they are received. + # + # To create an asynchronous class, simply mix in the `Concurrent::Async` module: + # + # ``` + # class Hello + # include Concurrent::Async + # + # def hello(name) + # "Hello, #{name}!" + # end + # end + # ``` + # + # When defining a constructor it is critical that the first line be a call to + # `super` with no arguments. The `super` method initializes the background + # thread and other asynchronous components. + # + # ``` + # class BackgroundLogger + # include Concurrent::Async + # + # def initialize(level) + # super() + # @logger = Logger.new(STDOUT) + # @logger.level = level + # end + # + # def info(msg) + # @logger.info(msg) + # end + # end + # ``` + # + # Mixing this module into a class provides each object two proxy methods: + # `async` and `await`. These methods are thread safe with respect to the + # enclosing object. The former proxy allows methods to be called + # asynchronously by posting to the object's internal thread. The latter proxy + # allows a method to be called synchronously but does so safely with respect + # to any pending asynchronous method calls and ensures proper ordering. Both + # methods return a {Concurrent::IVar} which can be inspected for the result + # of the proxied method call. Calling a method with `async` will return a + # `:pending` `IVar` whereas `await` will return a `:complete` `IVar`. + # + # ``` + # class Echo + # include Concurrent::Async + # + # def echo(msg) + # print "#{msg}\n" + # end + # end + # + # horn = Echo.new + # horn.echo('zero') # synchronous, not thread-safe + # # returns the actual return value of the method + # + # horn.async.echo('one') # asynchronous, non-blocking, thread-safe + # # returns an IVar in the :pending state + # + # horn.await.echo('two') # synchronous, blocking, thread-safe + # # returns an IVar in the :complete state + # ``` + # + # ## Let It Fail + # + # The `async` and `await` proxy methods have built-in error protection based + # on Erlang's famous "let it fail" philosophy. Instance methods should not be + # programmed defensively. When an exception is raised by a delegated method + # the proxy will rescue the exception, expose it to the caller as the `reason` + # attribute of the returned future, then process the next method call. + # + # ## Calling Methods Internally + # + # External method calls should *always* use the `async` and `await` proxy + # methods. When one method calls another method, the `async` proxy should + # rarely be used and the `await` proxy should *never* be used. + # + # When an object calls one of its own methods using the `await` proxy the + # second call will be enqueued *behind* the currently running method call. + # Any attempt to wait on the result will fail as the second call will never + # run until after the current call completes. + # + # Calling a method using the `await` proxy from within a method that was + # itself called using `async` or `await` will irreversibly deadlock the + # object. Do *not* do this, ever. + # + # ## Instance Variables and Attribute Accessors + # + # Instance variables do not need to be thread-safe so long as they are private. + # Asynchronous method calls are processed in the order they are received and + # are processed one at a time. Therefore private instance variables can only + # be accessed by one thread at a time. This is inherently thread-safe. + # + # When using private instance variables within asynchronous methods, the best + # practice is to read the instance variable into a local variable at the start + # of the method then update the instance variable at the *end* of the method. + # This way, should an exception be raised during method execution the internal + # state of the object will not have been changed. + # + # ### Reader Attributes + # + # The use of `attr_reader` is discouraged. Internal state exposed externally, + # when necessary, should be done through accessor methods. The instance + # variables exposed by these methods *must* be thread-safe, or they must be + # called using the `async` and `await` proxy methods. These two approaches are + # subtly different. + # + # When internal state is accessed via the `async` and `await` proxy methods, + # the returned value represents the object's state *at the time the call is + # processed*, which may *not* be the state of the object at the time the call + # is made. + # + # To get the state *at the current* time, irrespective of an enqueued method + # calls, a reader method must be called directly. This is inherently unsafe + # unless the instance variable is itself thread-safe, preferrably using one + # of the thread-safe classes within this library. Because the thread-safe + # classes within this library are internally-locking or non-locking, they can + # be safely used from within asynchronous methods without causing deadlocks. + # + # Generally speaking, the best practice is to *not* expose internal state via + # reader methods. The best practice is to simply use the method's return value. + # + # ### Writer Attributes + # + # Writer attributes should never be used with asynchronous classes. Changing + # the state externally, even when done in the thread-safe way, is not logically + # consistent. Changes to state need to be timed with respect to all asynchronous + # method calls which my be in-process or enqueued. The only safe practice is to + # pass all necessary data to each method as arguments and let the method update + # the internal state as necessary. + # + # ## Class Constants, Variables, and Methods + # + # ### Class Constants + # + # Class constants do not need to be thread-safe. Since they are read-only and + # immutable they may be safely read both externally and from within + # asynchronous methods. + # + # ### Class Variables + # + # Class variables should be avoided. Class variables represent shared state. + # Shared state is anathema to concurrency. Should there be a need to share + # state using class variables they *must* be thread-safe, preferrably + # using the thread-safe classes within this library. When updating class + # variables, never assign a new value/object to the variable itself. Assignment + # is not thread-safe in Ruby. Instead, use the thread-safe update functions + # of the variable itself to change the value. + # + # The best practice is to *never* use class variables with `Async` classes. + # + # ### Class Methods + # + # Class methods which are pure functions are safe. Class methods which modify + # class variables should be avoided, for all the reasons listed above. + # + # ## An Important Note About Thread Safe Guarantees + # + # > Thread safe guarantees can only be made when asynchronous method calls + # > are not mixed with direct method calls. Use only direct method calls + # > when the object is used exclusively on a single thread. Use only + # > `async` and `await` when the object is shared between threads. Once you + # > call a method using `async` or `await`, you should no longer call methods + # > directly on the object. Use `async` and `await` exclusively from then on. + # + # @example + # + # class Echo + # include Concurrent::Async + # + # def echo(msg) + # print "#{msg}\n" + # end + # end + # + # horn = Echo.new + # horn.echo('zero') # synchronous, not thread-safe + # # returns the actual return value of the method + # + # horn.async.echo('one') # asynchronous, non-blocking, thread-safe + # # returns an IVar in the :pending state + # + # horn.await.echo('two') # synchronous, blocking, thread-safe + # # returns an IVar in the :complete state + # + # @see Concurrent::Actor + # @see https://en.wikipedia.org/wiki/Actor_model "Actor Model" at Wikipedia + # @see http://www.erlang.org/doc/man/gen_server.html Erlang gen_server + # @see http://c2.com/cgi/wiki?LetItCrash "Let It Crash" at http://c2.com/ + module Async + + # @!method self.new(*args, &block) + # + # Instanciate a new object and ensure proper initialization of the + # synchronization mechanisms. + # + # @param [Array] args Zero or more arguments to be passed to the + # object's initializer. + # @param [Proc] block Optional block to pass to the object's initializer. + # @return [Object] A properly initialized object of the asynchronous class. + + # Check for the presence of a method on an object and determine if a given + # set of arguments matches the required arity. + # + # @param [Object] obj the object to check against + # @param [Symbol] method the method to check the object for + # @param [Array] args zero or more arguments for the arity check + # + # @raise [NameError] the object does not respond to `method` method + # @raise [ArgumentError] the given `args` do not match the arity of `method` + # + # @note This check is imperfect because of the way Ruby reports the arity of + # methods with a variable number of arguments. It is possible to determine + # if too few arguments are given but impossible to determine if too many + # arguments are given. This check may also fail to recognize dynamic behavior + # of the object, such as methods simulated with `method_missing`. + # + # @see http://www.ruby-doc.org/core-2.1.1/Method.html#method-i-arity Method#arity + # @see http://ruby-doc.org/core-2.1.0/Object.html#method-i-respond_to-3F Object#respond_to? + # @see http://www.ruby-doc.org/core-2.1.0/BasicObject.html#method-i-method_missing BasicObject#method_missing + # + # @!visibility private + def self.validate_argc(obj, method, *args) + argc = args.length + arity = obj.method(method).arity + + if arity >= 0 && argc != arity + raise ArgumentError.new("wrong number of arguments (#{argc} for #{arity})") + elsif arity < 0 && (arity = (arity + 1).abs) > argc + raise ArgumentError.new("wrong number of arguments (#{argc} for #{arity}..*)") + end + end + + # @!visibility private + def self.included(base) + base.singleton_class.send(:alias_method, :original_new, :new) + base.extend(ClassMethods) + super(base) + end + + # @!visibility private + module ClassMethods + def new(*args, &block) + obj = original_new(*args, &block) + obj.send(:init_synchronization) + obj + end + end + private_constant :ClassMethods + + # Delegates asynchronous, thread-safe method calls to the wrapped object. + # + # @!visibility private + class AsyncDelegator < Synchronization::LockableObject + safe_initialization! + + # Create a new delegator object wrapping the given delegate. + # + # @param [Object] delegate the object to wrap and delegate method calls to + def initialize(delegate) + super() + @delegate = delegate + @queue = [] + @executor = Concurrent.global_io_executor + end + + # Delegates method calls to the wrapped object. + # + # @param [Symbol] method the method being called + # @param [Array] args zero or more arguments to the method + # + # @return [IVar] the result of the method call + # + # @raise [NameError] the object does not respond to `method` method + # @raise [ArgumentError] the given `args` do not match the arity of `method` + def method_missing(method, *args, &block) + super unless @delegate.respond_to?(method) + Async::validate_argc(@delegate, method, *args) + + ivar = Concurrent::IVar.new + synchronize do + @queue.push [ivar, method, args, block] + @executor.post { perform } if @queue.length == 1 + end + + ivar + end + + # Perform all enqueued tasks. + # + # This method must be called from within the executor. It must not be + # called while already running. It will loop until the queue is empty. + def perform + loop do + ivar, method, args, block = synchronize { @queue.first } + break unless ivar # queue is empty + + begin + ivar.set(@delegate.send(method, *args, &block)) + rescue => error + ivar.fail(error) + end + + synchronize do + @queue.shift + return if @queue.empty? + end + end + end + end + private_constant :AsyncDelegator + + # Delegates synchronous, thread-safe method calls to the wrapped object. + # + # @!visibility private + class AwaitDelegator + + # Create a new delegator object wrapping the given delegate. + # + # @param [AsyncDelegator] delegate the object to wrap and delegate method calls to + def initialize(delegate) + @delegate = delegate + end + + # Delegates method calls to the wrapped object. + # + # @param [Symbol] method the method being called + # @param [Array] args zero or more arguments to the method + # + # @return [IVar] the result of the method call + # + # @raise [NameError] the object does not respond to `method` method + # @raise [ArgumentError] the given `args` do not match the arity of `method` + def method_missing(method, *args, &block) + ivar = @delegate.send(method, *args, &block) + ivar.wait + ivar + end + end + private_constant :AwaitDelegator + + # Causes the chained method call to be performed asynchronously on the + # object's thread. The delegated method will return a future in the + # `:pending` state and the method call will have been scheduled on the + # object's thread. The final disposition of the method call can be obtained + # by inspecting the returned future. + # + # @!macro [attach] async_thread_safety_warning + # @note The method call is guaranteed to be thread safe with respect to + # all other method calls against the same object that are called with + # either `async` or `await`. The mutable nature of Ruby references + # (and object orientation in general) prevent any other thread safety + # guarantees. Do NOT mix direct method calls with delegated method calls. + # Use *only* delegated method calls when sharing the object between threads. + # + # @return [Concurrent::IVar] the pending result of the asynchronous operation + # + # @raise [NameError] the object does not respond to the requested method + # @raise [ArgumentError] the given `args` do not match the arity of + # the requested method + def async + @__async_delegator__ + end + alias_method :cast, :async + + # Causes the chained method call to be performed synchronously on the + # current thread. The delegated will return a future in either the + # `:fulfilled` or `:rejected` state and the delegated method will have + # completed. The final disposition of the delegated method can be obtained + # by inspecting the returned future. + # + # @!macro async_thread_safety_warning + # + # @return [Concurrent::IVar] the completed result of the synchronous operation + # + # @raise [NameError] the object does not respond to the requested method + # @raise [ArgumentError] the given `args` do not match the arity of the + # requested method + def await + @__await_delegator__ + end + alias_method :call, :await + + # Initialize the internal serializer and other stnchronization mechanisms. + # + # @note This method *must* be called immediately upon object construction. + # This is the only way thread-safe initialization can be guaranteed. + # + # @!visibility private + def init_synchronization + return self if @__async_initialized__ + @__async_initialized__ = true + @__async_delegator__ = AsyncDelegator.new(self) + @__await_delegator__ = AwaitDelegator.new(@__async_delegator__) + self + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atom.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atom.rb new file mode 100644 index 0000000..82b158d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atom.rb @@ -0,0 +1,222 @@ +require 'concurrent/atomic/atomic_reference' +require 'concurrent/collection/copy_on_notify_observer_set' +require 'concurrent/concern/observable' +require 'concurrent/synchronization' + +# @!macro [new] thread_safe_variable_comparison +# +# ## Thread-safe Variable Classes +# +# Each of the thread-safe variable classes is designed to solve a different +# problem. In general: +# +# * *{Concurrent::Agent}:* Shared, mutable variable providing independent, +# uncoordinated, *asynchronous* change of individual values. Best used when +# the value will undergo frequent, complex updates. Suitable when the result +# of an update does not need to be known immediately. +# * *{Concurrent::Atom}:* Shared, mutable variable providing independent, +# uncoordinated, *synchronous* change of individual values. Best used when +# the value will undergo frequent reads but only occasional, though complex, +# updates. Suitable when the result of an update must be known immediately. +# * *{Concurrent::AtomicReference}:* A simple object reference that can be +# atomically. Updates are synchronous but fast. Best used when updates a +# simple set operations. Not suitable when updates are complex. +# {Concurrent::AtomicBoolean} and {Concurrent::AtomicFixnum} are similar +# but optimized for the given data type. +# * *{Concurrent::Exchanger}:* Shared, stateless synchronization point. Used +# when two or more threads need to exchange data. The threads will pair then +# block on each other until the exchange is complete. +# * *{Concurrent::MVar}:* Shared synchronization point. Used when one thread +# must give a value to another, which must take the value. The threads will +# block on each other until the exchange is complete. +# * *{Concurrent::ThreadLocalVar}:* Shared, mutable, isolated variable which +# holds a different value for each thread which has access. Often used as +# an instance variable in objects which must maintain different state +# for different threads. +# * *{Concurrent::TVar}:* Shared, mutable variables which provide +# *coordinated*, *synchronous*, change of *many* stated. Used when multiple +# value must change together, in an all-or-nothing transaction. + + +module Concurrent + + # Atoms provide a way to manage shared, synchronous, independent state. + # + # An atom is initialized with an initial value and an optional validation + # proc. At any time the value of the atom can be synchronously and safely + # changed. If a validator is given at construction then any new value + # will be checked against the validator and will be rejected if the + # validator returns false or raises an exception. + # + # There are two ways to change the value of an atom: {#compare_and_set} and + # {#swap}. The former will set the new value if and only if it validates and + # the current value matches the new value. The latter will atomically set the + # new value to the result of running the given block if and only if that + # value validates. + # + # ## Example + # + # ``` + # def next_fibonacci(set = nil) + # return [0, 1] if set.nil? + # set + [set[-2..-1].reduce{|sum,x| sum + x }] + # end + # + # # create an atom with an initial value + # atom = Concurrent::Atom.new(next_fibonacci) + # + # # send a few update requests + # 5.times do + # atom.swap{|set| next_fibonacci(set) } + # end + # + # # get the current value + # atom.value #=> [0, 1, 1, 2, 3, 5, 8] + # ``` + # + # ## Observation + # + # Atoms support observers through the {Concurrent::Observable} mixin module. + # Notification of observers occurs every time the value of the Atom changes. + # When notified the observer will receive three arguments: `time`, `old_value`, + # and `new_value`. The `time` argument is the time at which the value change + # occurred. The `old_value` is the value of the Atom when the change began + # The `new_value` is the value to which the Atom was set when the change + # completed. Note that `old_value` and `new_value` may be the same. This is + # not an error. It simply means that the change operation returned the same + # value. + # + # Unlike in Clojure, `Atom` cannot participate in {Concurrent::TVar} transactions. + # + # @!macro thread_safe_variable_comparison + # + # @see http://clojure.org/atoms Clojure Atoms + # @see http://clojure.org/state Values and Change - Clojure's approach to Identity and State + class Atom < Synchronization::Object + include Concern::Observable + + safe_initialization! + private(*attr_atomic(:value)) + public :value + + # Create a new atom with the given initial value. + # + # @param [Object] value The initial value + # @param [Hash] opts The options used to configure the atom + # @option opts [Proc] :validator (nil) Optional proc used to validate new + # values. It must accept one and only one argument which will be the + # intended new value. The validator will return true if the new value + # is acceptable else return false (preferrably) or raise an exception. + # + # @!macro deref_options + # + # @raise [ArgumentError] if the validator is not a `Proc` (when given) + def initialize(value, opts = {}) + super() + @Validator = opts.fetch(:validator, -> v { true }) + self.observers = Collection::CopyOnNotifyObserverSet.new + self.value = value + end + + # @!method value + # The current value of the atom. + # + # @return [Object] The current value. + + alias_method :deref, :value + + # Atomically swaps the value of atom using the given block. The current + # value will be passed to the block, as will any arguments passed as + # arguments to the function. The new value will be validated against the + # (optional) validator proc given at construction. If validation fails the + # value will not be changed. + # + # Internally, {#swap} reads the current value, applies the block to it, and + # attempts to compare-and-set it in. Since another thread may have changed + # the value in the intervening time, it may have to retry, and does so in a + # spin loop. The net effect is that the value will always be the result of + # the application of the supplied block to a current value, atomically. + # However, because the block might be called multiple times, it must be free + # of side effects. + # + # @note The given block may be called multiple times, and thus should be free + # of side effects. + # + # @param [Object] args Zero or more arguments passed to the block. + # + # @yield [value, args] Calculates a new value for the atom based on the + # current value and any supplied arguments. + # @yieldparam value [Object] The current value of the atom. + # @yieldparam args [Object] All arguments passed to the function, in order. + # @yieldreturn [Object] The intended new value of the atom. + # + # @return [Object] The final value of the atom after all operations and + # validations are complete. + # + # @raise [ArgumentError] When no block is given. + def swap(*args) + raise ArgumentError.new('no block given') unless block_given? + + loop do + old_value = value + new_value = yield(old_value, *args) + begin + break old_value unless valid?(new_value) + break new_value if compare_and_set(old_value, new_value) + rescue + break old_value + end + end + end + + # Atomically sets the value of atom to the new value if and only if the + # current value of the atom is identical to the old value and the new + # value successfully validates against the (optional) validator given + # at construction. + # + # @param [Object] old_value The expected current value. + # @param [Object] new_value The intended new value. + # + # @return [Boolean] True if the value is changed else false. + def compare_and_set(old_value, new_value) + if valid?(new_value) && compare_and_set_value(old_value, new_value) + observers.notify_observers(Time.now, old_value, new_value) + true + else + false + end + end + + # Atomically sets the value of atom to the new value without regard for the + # current value so long as the new value successfully validates against the + # (optional) validator given at construction. + # + # @param [Object] new_value The intended new value. + # + # @return [Object] The final value of the atom after all operations and + # validations are complete. + def reset(new_value) + old_value = value + if valid?(new_value) + self.value = new_value + observers.notify_observers(Time.now, old_value, new_value) + new_value + else + old_value + end + end + + private + + # Is the new value valid? + # + # @param [Object] new_value The intended new value. + # @return [Boolean] false if the validator function returns false or raises + # an exception else true + def valid?(new_value) + @Validator.call(new_value) + rescue + false + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/abstract_thread_local_var.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/abstract_thread_local_var.rb new file mode 100644 index 0000000..fcdeed7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/abstract_thread_local_var.rb @@ -0,0 +1,66 @@ +require 'concurrent/constants' + +module Concurrent + + # @!macro thread_local_var + # @!macro internal_implementation_note + # @!visibility private + class AbstractThreadLocalVar + + # @!macro thread_local_var_method_initialize + def initialize(default = nil, &default_block) + if default && block_given? + raise ArgumentError, "Cannot use both value and block as default value" + end + + if block_given? + @default_block = default_block + @default = nil + else + @default_block = nil + @default = default + end + + allocate_storage + end + + # @!macro thread_local_var_method_get + def value + raise NotImplementedError + end + + # @!macro thread_local_var_method_set + def value=(value) + raise NotImplementedError + end + + # @!macro thread_local_var_method_bind + def bind(value, &block) + if block_given? + old_value = self.value + begin + self.value = value + yield + ensure + self.value = old_value + end + end + end + + protected + + # @!visibility private + def allocate_storage + raise NotImplementedError + end + + # @!visibility private + def default + if @default_block + self.value = @default_block.call + else + @default + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_boolean.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_boolean.rb new file mode 100644 index 0000000..fc76976 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_boolean.rb @@ -0,0 +1,122 @@ +require 'concurrent/atomic/mutex_atomic_boolean' +require 'concurrent/synchronization' + +module Concurrent + + ################################################################### + + # @!macro [new] atomic_boolean_method_initialize + # + # Creates a new `AtomicBoolean` with the given initial value. + # + # @param [Boolean] initial the initial value + + # @!macro [new] atomic_boolean_method_value_get + # + # Retrieves the current `Boolean` value. + # + # @return [Boolean] the current value + + # @!macro [new] atomic_boolean_method_value_set + # + # Explicitly sets the value. + # + # @param [Boolean] value the new value to be set + # + # @return [Boolean] the current value + + # @!macro [new] atomic_boolean_method_true_question + # + # Is the current value `true` + # + # @return [Boolean] true if the current value is `true`, else false + + # @!macro [new] atomic_boolean_method_false_question + # + # Is the current value `false` + # + # @return [Boolean] true if the current value is `false`, else false + + # @!macro [new] atomic_boolean_method_make_true + # + # Explicitly sets the value to true. + # + # @return [Boolean] true is value has changed, otherwise false + + # @!macro [new] atomic_boolean_method_make_false + # + # Explicitly sets the value to false. + # + # @return [Boolean] true is value has changed, otherwise false + + ################################################################### + + # @!macro [new] atomic_boolean_public_api + # + # @!method initialize(initial = false) + # @!macro atomic_boolean_method_initialize + # + # @!method value + # @!macro atomic_boolean_method_value_get + # + # @!method value=(value) + # @!macro atomic_boolean_method_value_set + # + # @!method true? + # @!macro atomic_boolean_method_true_question + # + # @!method false? + # @!macro atomic_boolean_method_false_question + # + # @!method make_true + # @!macro atomic_boolean_method_make_true + # + # @!method make_false + # @!macro atomic_boolean_method_make_false + + ################################################################### + + # @!visibility private + # @!macro internal_implementation_note + AtomicBooleanImplementation = case + when defined?(JavaAtomicBoolean) + JavaAtomicBoolean + when defined?(CAtomicBoolean) + CAtomicBoolean + else + MutexAtomicBoolean + end + private_constant :AtomicBooleanImplementation + + # @!macro [attach] atomic_boolean + # + # A boolean value that can be updated atomically. Reads and writes to an atomic + # boolean and thread-safe and guaranteed to succeed. Reads and writes may block + # briefly but no explicit locking is required. + # + # @!macro thread_safe_variable_comparison + # + # Testing with ruby 2.1.2 + # Testing with Concurrent::MutexAtomicBoolean... + # 2.790000 0.000000 2.790000 ( 2.791454) + # Testing with Concurrent::CAtomicBoolean... + # 0.740000 0.000000 0.740000 ( 0.740206) + # + # Testing with jruby 1.9.3 + # Testing with Concurrent::MutexAtomicBoolean... + # 5.240000 2.520000 7.760000 ( 3.683000) + # Testing with Concurrent::JavaAtomicBoolean... + # 3.340000 0.010000 3.350000 ( 0.855000) + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html java.util.concurrent.atomic.AtomicBoolean + # + # @!macro atomic_boolean_public_api + class AtomicBoolean < AtomicBooleanImplementation + # @return [String] Short string representation. + def to_s + format '<#%s:0x%x value:%s>', self.class, object_id << 1, value + end + + alias_method :inspect, :to_s + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_fixnum.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_fixnum.rb new file mode 100644 index 0000000..ddadf18 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_fixnum.rb @@ -0,0 +1,139 @@ +require 'concurrent/atomic/mutex_atomic_fixnum' +require 'concurrent/synchronization' + +module Concurrent + + ################################################################### + + # @!macro [new] atomic_fixnum_method_initialize + # + # Creates a new `AtomicFixnum` with the given initial value. + # + # @param [Fixnum] initial the initial value + # @raise [ArgumentError] if the initial value is not a `Fixnum` + + # @!macro [new] atomic_fixnum_method_value_get + # + # Retrieves the current `Fixnum` value. + # + # @return [Fixnum] the current value + + # @!macro [new] atomic_fixnum_method_value_set + # + # Explicitly sets the value. + # + # @param [Fixnum] value the new value to be set + # + # @return [Fixnum] the current value + # + # @raise [ArgumentError] if the new value is not a `Fixnum` + + # @!macro [new] atomic_fixnum_method_increment + # + # Increases the current value by the given amount (defaults to 1). + # + # @param [Fixnum] delta the amount by which to increase the current value + # + # @return [Fixnum] the current value after incrementation + + # @!macro [new] atomic_fixnum_method_decrement + # + # Decreases the current value by the given amount (defaults to 1). + # + # @param [Fixnum] delta the amount by which to decrease the current value + # + # @return [Fixnum] the current value after decrementation + + # @!macro [new] atomic_fixnum_method_compare_and_set + # + # Atomically sets the value to the given updated value if the current + # value == the expected value. + # + # @param [Fixnum] expect the expected value + # @param [Fixnum] update the new value + # + # @return [Fixnum] true if the value was updated else false + + # @!macro [new] atomic_fixnum_method_update + # + # Pass the current value to the given block, replacing it + # with the block's result. May retry if the value changes + # during the block's execution. + # + # @yield [Object] Calculate a new value for the atomic reference using + # given (old) value + # @yieldparam [Object] old_value the starting value of the atomic reference + # + # @return [Object] the new value + + ################################################################### + + # @!macro [new] atomic_fixnum_public_api + # + # @!method initialize(initial = 0) + # @!macro atomic_fixnum_method_initialize + # + # @!method value + # @!macro atomic_fixnum_method_value_get + # + # @!method value=(value) + # @!macro atomic_fixnum_method_value_set + # + # @!method increment + # @!macro atomic_fixnum_method_increment + # + # @!method decrement + # @!macro atomic_fixnum_method_decrement + # + # @!method compare_and_set(expect, update) + # @!macro atomic_fixnum_method_compare_and_set + # + # @!method update + # @!macro atomic_fixnum_method_update + + ################################################################### + + # @!visibility private + # @!macro internal_implementation_note + AtomicFixnumImplementation = case + when defined?(JavaAtomicFixnum) + JavaAtomicFixnum + when defined?(CAtomicFixnum) + CAtomicFixnum + else + MutexAtomicFixnum + end + private_constant :AtomicFixnumImplementation + + # @!macro [attach] atomic_fixnum + # + # A numeric value that can be updated atomically. Reads and writes to an atomic + # fixnum and thread-safe and guaranteed to succeed. Reads and writes may block + # briefly but no explicit locking is required. + # + # @!macro thread_safe_variable_comparison + # + # Testing with ruby 2.1.2 + # Testing with Concurrent::MutexAtomicFixnum... + # 3.130000 0.000000 3.130000 ( 3.136505) + # Testing with Concurrent::CAtomicFixnum... + # 0.790000 0.000000 0.790000 ( 0.785550) + # + # Testing with jruby 1.9.3 + # Testing with Concurrent::MutexAtomicFixnum... + # 5.460000 2.460000 7.920000 ( 3.715000) + # Testing with Concurrent::JavaAtomicFixnum... + # 4.520000 0.030000 4.550000 ( 1.187000) + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLong.html java.util.concurrent.atomic.AtomicLong + # + # @!macro atomic_fixnum_public_api + class AtomicFixnum < AtomicFixnumImplementation + # @return [String] Short string representation. + def to_s + format '<#%s:0x%x value:%s>', self.class, object_id << 1, value + end + + alias_method :inspect, :to_s + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_reference.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_reference.rb new file mode 100644 index 0000000..12a91c0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/atomic_reference.rb @@ -0,0 +1,51 @@ +require 'concurrent/synchronization' +require 'concurrent/utility/engine' +require 'concurrent/atomic_reference/concurrent_update_error' +require 'concurrent/atomic_reference/mutex_atomic' + +begin + # force fallback impl with FORCE_ATOMIC_FALLBACK=1 + if /[^0fF]/ =~ ENV['FORCE_ATOMIC_FALLBACK'] + ruby_engine = 'mutex_atomic' + else + ruby_engine = Concurrent.ruby_engine + end + + require "concurrent/atomic_reference/#{ruby_engine}" +rescue LoadError + #warn 'Compiled extensions not installed, pure Ruby Atomic will be used.' +end + +if defined? Concurrent::JavaAtomicReference + + # @!macro atomic_reference + class Concurrent::AtomicReference < Concurrent::JavaAtomicReference + end + +elsif defined? Concurrent::RbxAtomicReference + + # @!macro atomic_reference + class Concurrent::AtomicReference < Concurrent::RbxAtomicReference + end + +elsif defined? Concurrent::CAtomicReference + + # @!macro atomic_reference + class Concurrent::AtomicReference < Concurrent::CAtomicReference + end + +else + + # @!macro atomic_reference + class Concurrent::AtomicReference < Concurrent::MutexAtomicReference + end +end + +class Concurrent::AtomicReference + # @return [String] Short string representation. + def to_s + format '<#%s:0x%x value:%s>', self.class, object_id << 1, get + end + + alias_method :inspect, :to_s +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/count_down_latch.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/count_down_latch.rb new file mode 100644 index 0000000..6cad016 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/count_down_latch.rb @@ -0,0 +1,100 @@ +require 'concurrent/atomic/mutex_count_down_latch' +require 'concurrent/atomic/java_count_down_latch' +require 'concurrent/utility/engine' + +module Concurrent + + ################################################################### + + # @!macro [new] count_down_latch_method_initialize + # + # Create a new `CountDownLatch` with the initial `count`. + # + # @param [new] count the initial count + # + # @raise [ArgumentError] if `count` is not an integer or is less than zero + + # @!macro [new] count_down_latch_method_wait + # + # Block on the latch until the counter reaches zero or until `timeout` is reached. + # + # @param [Fixnum] timeout the number of seconds to wait for the counter or `nil` + # to block indefinitely + # @return [Boolean] `true` if the `count` reaches zero else false on `timeout` + + # @!macro [new] count_down_latch_method_count_down + # + # Signal the latch to decrement the counter. Will signal all blocked threads when + # the `count` reaches zero. + + # @!macro [attach] count_down_latch_method_count + # + # The current value of the counter. + # + # @return [Fixnum] the current value of the counter + + ################################################################### + + # @!macro [new] count_down_latch_public_api + # + # @!method initialize(count = 1) + # @!macro count_down_latch_method_initialize + # + # @!method wait(timeout = nil) + # @!macro count_down_latch_method_wait + # + # @!method count_down + # @!macro count_down_latch_method_count_down + # + # @!method count + # @!macro count_down_latch_method_count + + ################################################################### + + # @!visibility private + # @!macro internal_implementation_note + CountDownLatchImplementation = case + when Concurrent.on_jruby? + JavaCountDownLatch + else + MutexCountDownLatch + end + private_constant :CountDownLatchImplementation + + # @!macro [attach] count_down_latch + # + # A synchronization object that allows one thread to wait on multiple other threads. + # The thread that will wait creates a `CountDownLatch` and sets the initial value + # (normally equal to the number of other threads). The initiating thread passes the + # latch to the other threads then waits for the other threads by calling the `#wait` + # method. Each of the other threads calls `#count_down` when done with its work. + # When the latch counter reaches zero the waiting thread is unblocked and continues + # with its work. A `CountDownLatch` can be used only once. Its value cannot be reset. + # + # @!macro count_down_latch_public_api + # @example Waiter and Decrementer + # latch = Concurrent::CountDownLatch.new(3) + # + # waiter = Thread.new do + # latch.wait() + # puts ("Waiter released") + # end + # + # decrementer = Thread.new do + # sleep(1) + # latch.count_down + # puts latch.count + # + # sleep(1) + # latch.count_down + # puts latch.count + # + # sleep(1) + # latch.count_down + # puts latch.count + # end + # + # [waiter, decrementer].each(&:join) + class CountDownLatch < CountDownLatchImplementation + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/cyclic_barrier.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/cyclic_barrier.rb new file mode 100644 index 0000000..634cefd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/cyclic_barrier.rb @@ -0,0 +1,128 @@ +require 'concurrent/synchronization' +require 'concurrent/utility/native_integer' + +module Concurrent + + # A synchronization aid that allows a set of threads to all wait for each + # other to reach a common barrier point. + # @example + # barrier = Concurrent::CyclicBarrier.new(3) + # jobs = Array.new(3) { |i| -> { sleep i; p done: i } } + # process = -> (i) do + # # waiting to start at the same time + # barrier.wait + # # execute job + # jobs[i].call + # # wait for others to finish + # barrier.wait + # end + # threads = 2.times.map do |i| + # Thread.new(i, &process) + # end + # + # # use main as well + # process.call 2 + # + # # here we can be sure that all jobs are processed + class CyclicBarrier < Synchronization::LockableObject + + # @!visibility private + Generation = Struct.new(:status) + private_constant :Generation + + # Create a new `CyclicBarrier` that waits for `parties` threads + # + # @param [Fixnum] parties the number of parties + # @yield an optional block that will be executed that will be executed after + # the last thread arrives and before the others are released + # + # @raise [ArgumentError] if `parties` is not an integer or is less than zero + def initialize(parties, &block) + Utility::NativeInteger.ensure_integer_and_bounds parties + Utility::NativeInteger.ensure_positive_and_no_zero parties + + super(&nil) + synchronize { ns_initialize parties, &block } + end + + # @return [Fixnum] the number of threads needed to pass the barrier + def parties + synchronize { @parties } + end + + # @return [Fixnum] the number of threads currently waiting on the barrier + def number_waiting + synchronize { @number_waiting } + end + + # Blocks on the barrier until the number of waiting threads is equal to + # `parties` or until `timeout` is reached or `reset` is called + # If a block has been passed to the constructor, it will be executed once by + # the last arrived thread before releasing the others + # @param [Fixnum] timeout the number of seconds to wait for the counter or + # `nil` to block indefinitely + # @return [Boolean] `true` if the `count` reaches zero else false on + # `timeout` or on `reset` or if the barrier is broken + def wait(timeout = nil) + synchronize do + + return false unless @generation.status == :waiting + + @number_waiting += 1 + + if @number_waiting == @parties + @action.call if @action + ns_generation_done @generation, :fulfilled + true + else + generation = @generation + if ns_wait_until(timeout) { generation.status != :waiting } + generation.status == :fulfilled + else + ns_generation_done generation, :broken, false + false + end + end + end + end + + # resets the barrier to its initial state + # If there is at least one waiting thread, it will be woken up, the `wait` + # method will return false and the barrier will be broken + # If the barrier is broken, this method restores it to the original state + # + # @return [nil] + def reset + synchronize { ns_generation_done @generation, :reset } + end + + # A barrier can be broken when: + # - a thread called the `reset` method while at least one other thread was waiting + # - at least one thread timed out on `wait` method + # + # A broken barrier can be restored using `reset` it's safer to create a new one + # @return [Boolean] true if the barrier is broken otherwise false + def broken? + synchronize { @generation.status != :waiting } + end + + protected + + def ns_generation_done(generation, status, continue = true) + generation.status = status + ns_next_generation if continue + ns_broadcast + end + + def ns_next_generation + @generation = Generation.new(:waiting) + @number_waiting = 0 + end + + def ns_initialize(parties, &block) + @parties = parties + @action = block + ns_next_generation + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/event.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/event.rb new file mode 100644 index 0000000..72d5c3b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/event.rb @@ -0,0 +1,109 @@ +require 'thread' +require 'concurrent/synchronization' + +module Concurrent + + # Old school kernel-style event reminiscent of Win32 programming in C++. + # + # When an `Event` is created it is in the `unset` state. Threads can choose to + # `#wait` on the event, blocking until released by another thread. When one + # thread wants to alert all blocking threads it calls the `#set` method which + # will then wake up all listeners. Once an `Event` has been set it remains set. + # New threads calling `#wait` will return immediately. An `Event` may be + # `#reset` at any time once it has been set. + # + # @see http://msdn.microsoft.com/en-us/library/windows/desktop/ms682655.aspx + # @example + # event = Concurrent::Event.new + # + # t1 = Thread.new do + # puts "t1 is waiting" + # event.wait(1) + # puts "event ocurred" + # end + # + # t2 = Thread.new do + # puts "t2 calling set" + # event.set + # end + # + # [t1, t2].each(&:join) + # + # # prints: + # # t2 calling set + # # t1 is waiting + # # event ocurred + class Event < Synchronization::LockableObject + + # Creates a new `Event` in the unset state. Threads calling `#wait` on the + # `Event` will block. + def initialize + super + synchronize { ns_initialize } + end + + # Is the object in the set state? + # + # @return [Boolean] indicating whether or not the `Event` has been set + def set? + synchronize { @set } + end + + # Trigger the event, setting the state to `set` and releasing all threads + # waiting on the event. Has no effect if the `Event` has already been set. + # + # @return [Boolean] should always return `true` + def set + synchronize { ns_set } + end + + def try? + synchronize { @set ? false : ns_set } + end + + # Reset a previously set event back to the `unset` state. + # Has no effect if the `Event` has not yet been set. + # + # @return [Boolean] should always return `true` + def reset + synchronize do + if @set + @set = false + @iteration +=1 + end + true + end + end + + # Wait a given number of seconds for the `Event` to be set by another + # thread. Will wait forever when no `timeout` value is given. Returns + # immediately if the `Event` has already been set. + # + # @return [Boolean] true if the `Event` was set before timeout else false + def wait(timeout = nil) + synchronize do + unless @set + iteration = @iteration + ns_wait_until(timeout) { iteration < @iteration || @set } + else + true + end + end + end + + protected + + def ns_set + unless @set + @set = true + ns_broadcast + end + true + end + + def ns_initialize + @set = false + @iteration = 0 + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/java_count_down_latch.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/java_count_down_latch.rb new file mode 100644 index 0000000..e23a606 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/java_count_down_latch.rb @@ -0,0 +1,39 @@ +if Concurrent.on_jruby? + + module Concurrent + + # @!macro count_down_latch + # @!visibility private + # @!macro internal_implementation_note + class JavaCountDownLatch + + # @!macro count_down_latch_method_initialize + def initialize(count = 1) + unless count.is_a?(Fixnum) && count >= 0 + raise ArgumentError.new('count must be in integer greater than or equal zero') + end + @latch = java.util.concurrent.CountDownLatch.new(count) + end + + # @!macro count_down_latch_method_wait + def wait(timeout = nil) + if timeout.nil? + @latch.await + true + else + @latch.await(1000 * timeout, java.util.concurrent.TimeUnit::MILLISECONDS) + end + end + + # @!macro count_down_latch_method_count_down + def count_down + @latch.countDown + end + + # @!macro count_down_latch_method_count + def count + @latch.getCount + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/java_thread_local_var.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/java_thread_local_var.rb new file mode 100644 index 0000000..b41018f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/java_thread_local_var.rb @@ -0,0 +1,37 @@ +require 'concurrent/atomic/abstract_thread_local_var' + +if Concurrent.on_jruby? + + module Concurrent + + # @!visibility private + # @!macro internal_implementation_note + class JavaThreadLocalVar < AbstractThreadLocalVar + + # @!macro thread_local_var_method_get + def value + value = @var.get + + if value.nil? + default + elsif value == NULL + nil + else + value + end + end + + # @!macro thread_local_var_method_set + def value=(value) + @var.set(value) + end + + protected + + # @!visibility private + def allocate_storage + @var = java.lang.ThreadLocal.new + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_atomic_boolean.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_atomic_boolean.rb new file mode 100644 index 0000000..ffa3e36 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_atomic_boolean.rb @@ -0,0 +1,60 @@ +require 'concurrent/synchronization' + +module Concurrent + + # @!macro atomic_boolean + # @!visibility private + # @!macro internal_implementation_note + class MutexAtomicBoolean < Synchronization::LockableObject + + # @!macro atomic_boolean_method_initialize + def initialize(initial = false) + super() + synchronize { ns_initialize(initial) } + end + + # @!macro atomic_boolean_method_value_get + def value + synchronize { @value } + end + + # @!macro atomic_boolean_method_value_set + def value=(value) + synchronize { @value = !!value } + end + + # @!macro atomic_boolean_method_true_question + def true? + synchronize { @value } + end + + # @!macro atomic_boolean_method_false_question + def false? + synchronize { !@value } + end + + # @!macro atomic_boolean_method_make_true + def make_true + synchronize { ns_make_value(true) } + end + + # @!macro atomic_boolean_method_make_false + def make_false + synchronize { ns_make_value(false) } + end + + protected + + # @!visibility private + def ns_initialize(initial) + @value = !!initial + end + + # @!visibility private + def ns_make_value(value) + old = @value + @value = value + old != @value + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_atomic_fixnum.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_atomic_fixnum.rb new file mode 100644 index 0000000..77b91d2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_atomic_fixnum.rb @@ -0,0 +1,75 @@ +require 'concurrent/synchronization' +require 'concurrent/utility/native_integer' + +module Concurrent + + # @!macro atomic_fixnum + # @!visibility private + # @!macro internal_implementation_note + class MutexAtomicFixnum < Synchronization::LockableObject + + # @!macro atomic_fixnum_method_initialize + def initialize(initial = 0) + super() + synchronize { ns_initialize(initial) } + end + + # @!macro atomic_fixnum_method_value_get + def value + synchronize { @value } + end + + # @!macro atomic_fixnum_method_value_set + def value=(value) + synchronize { ns_set(value) } + end + + # @!macro atomic_fixnum_method_increment + def increment(delta = 1) + synchronize { ns_set(@value + delta.to_i) } + end + + alias_method :up, :increment + + # @!macro atomic_fixnum_method_decrement + def decrement(delta = 1) + synchronize { ns_set(@value - delta.to_i) } + end + + alias_method :down, :decrement + + # @!macro atomic_fixnum_method_compare_and_set + def compare_and_set(expect, update) + synchronize do + if @value == expect.to_i + @value = update.to_i + true + else + false + end + end + end + + # @!macro atomic_fixnum_method_update + def update + synchronize do + @value = yield @value + end + end + + protected + + # @!visibility private + def ns_initialize(initial) + ns_set(initial) + end + + private + + # @!visibility private + def ns_set(value) + Utility::NativeInteger.ensure_integer_and_bounds value + @value = value + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_count_down_latch.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_count_down_latch.rb new file mode 100644 index 0000000..ac8229c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_count_down_latch.rb @@ -0,0 +1,43 @@ +require 'concurrent/synchronization' + +module Concurrent + + # @!macro count_down_latch + # @!visibility private + # @!macro internal_implementation_note + class MutexCountDownLatch < Synchronization::LockableObject + + # @!macro count_down_latch_method_initialize + def initialize(count = 1) + Utility::NativeInteger.ensure_integer_and_bounds count + Utility::NativeInteger.ensure_positive count + + super() + synchronize { ns_initialize count } + end + + # @!macro count_down_latch_method_wait + def wait(timeout = nil) + synchronize { ns_wait_until(timeout) { @count == 0 } } + end + + # @!macro count_down_latch_method_count_down + def count_down + synchronize do + @count -= 1 if @count > 0 + ns_broadcast if @count == 0 + end + end + + # @!macro count_down_latch_method_count + def count + synchronize { @count } + end + + protected + + def ns_initialize(count) + @count = count + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_semaphore.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_semaphore.rb new file mode 100644 index 0000000..2042f73 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/mutex_semaphore.rb @@ -0,0 +1,115 @@ +require 'concurrent/synchronization' +require 'concurrent/utility/native_integer' + +module Concurrent + + # @!macro semaphore + # @!visibility private + # @!macro internal_implementation_note + class MutexSemaphore < Synchronization::LockableObject + + # @!macro semaphore_method_initialize + def initialize(count) + Utility::NativeInteger.ensure_integer_and_bounds count + + super() + synchronize { ns_initialize count } + end + + # @!macro semaphore_method_acquire + def acquire(permits = 1) + Utility::NativeInteger.ensure_integer_and_bounds permits + Utility::NativeInteger.ensure_positive permits + + synchronize do + try_acquire_timed(permits, nil) + nil + end + end + + # @!macro semaphore_method_available_permits + def available_permits + synchronize { @free } + end + + # @!macro semaphore_method_drain_permits + # + # Acquires and returns all permits that are immediately available. + # + # @return [Integer] + def drain_permits + synchronize do + @free.tap { |_| @free = 0 } + end + end + + # @!macro semaphore_method_try_acquire + def try_acquire(permits = 1, timeout = nil) + Utility::NativeInteger.ensure_integer_and_bounds permits + Utility::NativeInteger.ensure_positive permits + + synchronize do + if timeout.nil? + try_acquire_now(permits) + else + try_acquire_timed(permits, timeout) + end + end + end + + # @!macro semaphore_method_release + def release(permits = 1) + Utility::NativeInteger.ensure_integer_and_bounds permits + Utility::NativeInteger.ensure_positive permits + + synchronize do + @free += permits + permits.times { ns_signal } + end + nil + end + + # Shrinks the number of available permits by the indicated reduction. + # + # @param [Fixnum] reduction Number of permits to remove. + # + # @raise [ArgumentError] if `reduction` is not an integer or is negative + # + # @raise [ArgumentError] if `@free` - `@reduction` is less than zero + # + # @return [nil] + # + # @!visibility private + def reduce_permits(reduction) + Utility::NativeInteger.ensure_integer_and_bounds reduction + Utility::NativeInteger.ensure_positive reduction + + synchronize { @free -= reduction } + nil + end + + protected + + # @!visibility private + def ns_initialize(count) + @free = count + end + + private + + # @!visibility private + def try_acquire_now(permits) + if @free >= permits + @free -= permits + true + else + false + end + end + + # @!visibility private + def try_acquire_timed(permits, timeout) + ns_wait_until(timeout) { try_acquire_now(permits) } + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/read_write_lock.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/read_write_lock.rb new file mode 100644 index 0000000..435d8f0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/read_write_lock.rb @@ -0,0 +1,253 @@ +require 'thread' +require 'concurrent/atomic/atomic_fixnum' +require 'concurrent/errors' +require 'concurrent/synchronization' + +module Concurrent + + # Ruby read-write lock implementation + # + # Allows any number of concurrent readers, but only one concurrent writer + # (And if the "write" lock is taken, any readers who come along will have to wait) + # + # If readers are already active when a writer comes along, the writer will wait for + # all the readers to finish before going ahead. + # Any additional readers that come when the writer is already waiting, will also + # wait (so writers are not starved). + # + # This implementation is based on `java.util.concurrent.ReentrantReadWriteLock`. + # + # @example + # lock = Concurrent::ReadWriteLock.new + # lock.with_read_lock { data.retrieve } + # lock.with_write_lock { data.modify! } + # + # @note Do **not** try to acquire the write lock while already holding a read lock + # **or** try to acquire the write lock while you already have it. + # This will lead to deadlock + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html java.util.concurrent.ReentrantReadWriteLock + class ReadWriteLock < Synchronization::Object + + # @!visibility private + WAITING_WRITER = 1 << 15 + + # @!visibility private + RUNNING_WRITER = 1 << 29 + + # @!visibility private + MAX_READERS = WAITING_WRITER - 1 + + # @!visibility private + MAX_WRITERS = RUNNING_WRITER - MAX_READERS - 1 + + safe_initialization! + + # Implementation notes: + # A goal is to make the uncontended path for both readers/writers lock-free + # Only if there is reader-writer or writer-writer contention, should locks be used + # Internal state is represented by a single integer ("counter"), and updated + # using atomic compare-and-swap operations + # When the counter is 0, the lock is free + # Each reader increments the counter by 1 when acquiring a read lock + # (and decrements by 1 when releasing the read lock) + # The counter is increased by (1 << 15) for each writer waiting to acquire the + # write lock, and by (1 << 29) if the write lock is taken + + # Create a new `ReadWriteLock` in the unlocked state. + def initialize + super() + @Counter = AtomicFixnum.new(0) # single integer which represents lock state + @ReadLock = Synchronization::Lock.new + @WriteLock = Synchronization::Lock.new + end + + # Execute a block operation within a read lock. + # + # @yield the task to be performed within the lock. + # + # @return [Object] the result of the block operation. + # + # @raise [ArgumentError] when no block is given. + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def with_read_lock + raise ArgumentError.new('no block given') unless block_given? + acquire_read_lock + begin + yield + ensure + release_read_lock + end + end + + # Execute a block operation within a write lock. + # + # @yield the task to be performed within the lock. + # + # @return [Object] the result of the block operation. + # + # @raise [ArgumentError] when no block is given. + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def with_write_lock + raise ArgumentError.new('no block given') unless block_given? + acquire_write_lock + begin + yield + ensure + release_write_lock + end + end + + # Acquire a read lock. If a write lock has been acquired will block until + # it is released. Will not block if other read locks have been acquired. + # + # @return [Boolean] true if the lock is successfully acquired + # + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def acquire_read_lock + while true + c = @Counter.value + raise ResourceLimitError.new('Too many reader threads') if max_readers?(c) + + # If a writer is waiting when we first queue up, we need to wait + if waiting_writer?(c) + @ReadLock.wait_until { !waiting_writer? } + + # after a reader has waited once, they are allowed to "barge" ahead of waiting writers + # but if a writer is *running*, the reader still needs to wait (naturally) + while true + c = @Counter.value + if running_writer?(c) + @ReadLock.wait_until { !running_writer? } + else + return if @Counter.compare_and_set(c, c+1) + end + end + else + break if @Counter.compare_and_set(c, c+1) + end + end + true + end + + # Release a previously acquired read lock. + # + # @return [Boolean] true if the lock is successfully released + def release_read_lock + while true + c = @Counter.value + if @Counter.compare_and_set(c, c-1) + # If one or more writers were waiting, and we were the last reader, wake a writer up + if waiting_writer?(c) && running_readers(c) == 1 + @WriteLock.signal + end + break + end + end + true + end + + # Acquire a write lock. Will block and wait for all active readers and writers. + # + # @return [Boolean] true if the lock is successfully acquired + # + # @raise [Concurrent::ResourceLimitError] if the maximum number of writers + # is exceeded. + def acquire_write_lock + while true + c = @Counter.value + raise ResourceLimitError.new('Too many writer threads') if max_writers?(c) + + if c == 0 # no readers OR writers running + # if we successfully swap the RUNNING_WRITER bit on, then we can go ahead + break if @Counter.compare_and_set(0, RUNNING_WRITER) + elsif @Counter.compare_and_set(c, c+WAITING_WRITER) + while true + # Now we have successfully incremented, so no more readers will be able to increment + # (they will wait instead) + # However, readers OR writers could decrement right here, OR another writer could increment + @WriteLock.wait_until do + # So we have to do another check inside the synchronized section + # If a writer OR reader is running, then go to sleep + c = @Counter.value + !running_writer?(c) && !running_readers?(c) + end + + # We just came out of a wait + # If we successfully turn the RUNNING_WRITER bit on with an atomic swap, + # Then we are OK to stop waiting and go ahead + # Otherwise go back and wait again + c = @Counter.value + break if !running_writer?(c) && !running_readers?(c) && @Counter.compare_and_set(c, c+RUNNING_WRITER-WAITING_WRITER) + end + break + end + end + true + end + + # Release a previously acquired write lock. + # + # @return [Boolean] true if the lock is successfully released + def release_write_lock + c = @Counter.update { |counter| counter-RUNNING_WRITER } + @ReadLock.broadcast + @WriteLock.signal if waiting_writers(c) > 0 + true + end + + # Queries if the write lock is held by any thread. + # + # @return [Boolean] true if the write lock is held else false` + def write_locked? + @Counter.value >= RUNNING_WRITER + end + + # Queries whether any threads are waiting to acquire the read or write lock. + # + # @return [Boolean] true if any threads are waiting for a lock else false + def has_waiters? + waiting_writer?(@Counter.value) + end + + private + + # @!visibility private + def running_readers(c = @Counter.value) + c & MAX_READERS + end + + # @!visibility private + def running_readers?(c = @Counter.value) + (c & MAX_READERS) > 0 + end + + # @!visibility private + def running_writer?(c = @Counter.value) + c >= RUNNING_WRITER + end + + # @!visibility private + def waiting_writers(c = @Counter.value) + (c & MAX_WRITERS) / WAITING_WRITER + end + + # @!visibility private + def waiting_writer?(c = @Counter.value) + c >= WAITING_WRITER + end + + # @!visibility private + def max_readers?(c = @Counter.value) + (c & MAX_READERS) == MAX_READERS + end + + # @!visibility private + def max_writers?(c = @Counter.value) + (c & MAX_WRITERS) == MAX_WRITERS + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/reentrant_read_write_lock.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/reentrant_read_write_lock.rb new file mode 100644 index 0000000..3f29169 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/reentrant_read_write_lock.rb @@ -0,0 +1,377 @@ +require 'thread' +require 'concurrent/atomic/atomic_reference' +require 'concurrent/errors' +require 'concurrent/synchronization' +require 'concurrent/atomic/thread_local_var' + +module Concurrent + + # Re-entrant read-write lock implementation + # + # Allows any number of concurrent readers, but only one concurrent writer + # (And while the "write" lock is taken, no read locks can be obtained either. + # Hence, the write lock can also be called an "exclusive" lock.) + # + # If another thread has taken a read lock, any thread which wants a write lock + # will block until all the readers release their locks. However, once a thread + # starts waiting to obtain a write lock, any additional readers that come along + # will also wait (so writers are not starved). + # + # A thread can acquire both a read and write lock at the same time. A thread can + # also acquire a read lock OR a write lock more than once. Only when the read (or + # write) lock is released as many times as it was acquired, will the thread + # actually let it go, allowing other threads which might have been waiting + # to proceed. + # + # If both read and write locks are acquired by the same thread, it is not strictly + # necessary to release them in the same order they were acquired. In other words, + # the following code is legal: + # + # @example + # lock = Concurrent::ReentrantReadWriteLock.new + # lock.acquire_write_lock + # lock.acquire_read_lock + # lock.release_write_lock + # # At this point, the current thread is holding only a read lock, not a write + # # lock. So other threads can take read locks, but not a write lock. + # lock.release_read_lock + # # Now the current thread is not holding either a read or write lock, so + # # another thread could potentially acquire a write lock. + # + # This implementation was inspired by `java.util.concurrent.ReentrantReadWriteLock`. + # + # @example + # lock = Concurrent::ReentrantReadWriteLock.new + # lock.with_read_lock { data.retrieve } + # lock.with_write_lock { data.modify! } + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html java.util.concurrent.ReentrantReadWriteLock + class ReentrantReadWriteLock < Synchronization::Object + + # Implementation notes: + # + # A goal is to make the uncontended path for both readers/writers mutex-free + # Only if there is reader-writer or writer-writer contention, should mutexes be used + # Otherwise, a single CAS operation is all we need to acquire/release a lock + # + # Internal state is represented by a single integer ("counter"), and updated + # using atomic compare-and-swap operations + # When the counter is 0, the lock is free + # Each thread which has one OR MORE read locks increments the counter by 1 + # (and decrements by 1 when releasing the read lock) + # The counter is increased by (1 << 15) for each writer waiting to acquire the + # write lock, and by (1 << 29) if the write lock is taken + # + # Additionally, each thread uses a thread-local variable to count how many times + # it has acquired a read lock, AND how many times it has acquired a write lock. + # It uses a similar trick; an increment of 1 means a read lock was taken, and + # an increment of (1 << 15) means a write lock was taken + # This is what makes re-entrancy possible + # + # 2 rules are followed to ensure good liveness properties: + # 1) Once a writer has queued up and is waiting for a write lock, no other thread + # can take a lock without waiting + # 2) When a write lock is released, readers are given the "first chance" to wake + # up and acquire a read lock + # Following these rules means readers and writers tend to "take turns", so neither + # can starve the other, even under heavy contention + + # @!visibility private + READER_BITS = 15 + # @!visibility private + WRITER_BITS = 14 + + # Used with @Counter: + # @!visibility private + WAITING_WRITER = 1 << READER_BITS + # @!visibility private + RUNNING_WRITER = 1 << (READER_BITS + WRITER_BITS) + # @!visibility private + MAX_READERS = WAITING_WRITER - 1 + # @!visibility private + MAX_WRITERS = RUNNING_WRITER - MAX_READERS - 1 + + # Used with @HeldCount: + # @!visibility private + WRITE_LOCK_HELD = 1 << READER_BITS + # @!visibility private + READ_LOCK_MASK = WRITE_LOCK_HELD - 1 + # @!visibility private + WRITE_LOCK_MASK = MAX_WRITERS + + safe_initialization! + + # Create a new `ReentrantReadWriteLock` in the unlocked state. + def initialize + super() + @Counter = AtomicFixnum.new(0) # single integer which represents lock state + @ReadQueue = Synchronization::Lock.new # used to queue waiting readers + @WriteQueue = Synchronization::Lock.new # used to queue waiting writers + @HeldCount = ThreadLocalVar.new(0) # indicates # of R & W locks held by this thread + end + + # Execute a block operation within a read lock. + # + # @yield the task to be performed within the lock. + # + # @return [Object] the result of the block operation. + # + # @raise [ArgumentError] when no block is given. + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def with_read_lock + raise ArgumentError.new('no block given') unless block_given? + acquire_read_lock + begin + yield + ensure + release_read_lock + end + end + + # Execute a block operation within a write lock. + # + # @yield the task to be performed within the lock. + # + # @return [Object] the result of the block operation. + # + # @raise [ArgumentError] when no block is given. + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def with_write_lock + raise ArgumentError.new('no block given') unless block_given? + acquire_write_lock + begin + yield + ensure + release_write_lock + end + end + + # Acquire a read lock. If a write lock is held by another thread, will block + # until it is released. + # + # @return [Boolean] true if the lock is successfully acquired + # + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def acquire_read_lock + if (held = @HeldCount.value) > 0 + # If we already have a lock, there's no need to wait + if held & READ_LOCK_MASK == 0 + # But we do need to update the counter, if we were holding a write + # lock but not a read lock + @Counter.update { |c| c + 1 } + end + @HeldCount.value = held + 1 + return true + end + + while true + c = @Counter.value + raise ResourceLimitError.new('Too many reader threads') if max_readers?(c) + + # If a writer is waiting OR running when we first queue up, we need to wait + if waiting_or_running_writer?(c) + # Before going to sleep, check again with the ReadQueue mutex held + @ReadQueue.synchronize do + @ReadQueue.ns_wait if waiting_or_running_writer? + end + # Note: the above 'synchronize' block could have used #wait_until, + # but that waits repeatedly in a loop, checking the wait condition + # each time it wakes up (to protect against spurious wakeups) + # But we are already in a loop, which is only broken when we successfully + # acquire the lock! So we don't care about spurious wakeups, and would + # rather not pay the extra overhead of using #wait_until + + # After a reader has waited once, they are allowed to "barge" ahead of waiting writers + # But if a writer is *running*, the reader still needs to wait (naturally) + while true + c = @Counter.value + if running_writer?(c) + @ReadQueue.synchronize do + @ReadQueue.ns_wait if running_writer? + end + elsif @Counter.compare_and_set(c, c+1) + @HeldCount.value = held + 1 + return true + end + end + elsif @Counter.compare_and_set(c, c+1) + @HeldCount.value = held + 1 + return true + end + end + end + + # Try to acquire a read lock and return true if we succeed. If it cannot be + # acquired immediately, return false. + # + # @return [Boolean] true if the lock is successfully acquired + def try_read_lock + if (held = @HeldCount.value) > 0 + if held & READ_LOCK_MASK == 0 + # If we hold a write lock, but not a read lock... + @Counter.update { |c| c + 1 } + end + @HeldCount.value = held + 1 + return true + else + c = @Counter.value + if !waiting_or_running_writer?(c) && @Counter.compare_and_set(c, c+1) + @HeldCount.value = held + 1 + return true + end + end + false + end + + # Release a previously acquired read lock. + # + # @return [Boolean] true if the lock is successfully released + def release_read_lock + held = @HeldCount.value = @HeldCount.value - 1 + rlocks_held = held & READ_LOCK_MASK + if rlocks_held == 0 + c = @Counter.update { |counter| counter - 1 } + # If one or more writers were waiting, and we were the last reader, wake a writer up + if waiting_or_running_writer?(c) && running_readers(c) == 0 + @WriteQueue.signal + end + elsif rlocks_held == READ_LOCK_MASK + raise IllegalOperationError, "Cannot release a read lock which is not held" + end + true + end + + # Acquire a write lock. Will block and wait for all active readers and writers. + # + # @return [Boolean] true if the lock is successfully acquired + # + # @raise [Concurrent::ResourceLimitError] if the maximum number of writers + # is exceeded. + def acquire_write_lock + if (held = @HeldCount.value) >= WRITE_LOCK_HELD + # if we already have a write (exclusive) lock, there's no need to wait + @HeldCount.value = held + WRITE_LOCK_HELD + return true + end + + while true + c = @Counter.value + raise ResourceLimitError.new('Too many writer threads') if max_writers?(c) + + # To go ahead and take the lock without waiting, there must be no writer + # running right now, AND no writers who came before us still waiting to + # acquire the lock + # Additionally, if any read locks have been taken, we must hold all of them + if c == held + # If we successfully swap the RUNNING_WRITER bit on, then we can go ahead + if @Counter.compare_and_set(c, c+RUNNING_WRITER) + @HeldCount.value = held + WRITE_LOCK_HELD + return true + end + elsif @Counter.compare_and_set(c, c+WAITING_WRITER) + while true + # Now we have successfully incremented, so no more readers will be able to increment + # (they will wait instead) + # However, readers OR writers could decrement right here + @WriteQueue.synchronize do + # So we have to do another check inside the synchronized section + # If a writer OR another reader is running, then go to sleep + c = @Counter.value + @WriteQueue.ns_wait if running_writer?(c) || running_readers(c) != held + end + # Note: if you are thinking of replacing the above 'synchronize' block + # with #wait_until, read the comment in #acquire_read_lock first! + + # We just came out of a wait + # If we successfully turn the RUNNING_WRITER bit on with an atomic swap, + # then we are OK to stop waiting and go ahead + # Otherwise go back and wait again + c = @Counter.value + if !running_writer?(c) && + running_readers(c) == held && + @Counter.compare_and_set(c, c+RUNNING_WRITER-WAITING_WRITER) + @HeldCount.value = held + WRITE_LOCK_HELD + return true + end + end + end + end + end + + # Try to acquire a write lock and return true if we succeed. If it cannot be + # acquired immediately, return false. + # + # @return [Boolean] true if the lock is successfully acquired + def try_write_lock + if (held = @HeldCount.value) >= WRITE_LOCK_HELD + @HeldCount.value = held + WRITE_LOCK_HELD + return true + else + c = @Counter.value + if !waiting_or_running_writer?(c) && + running_readers(c) == held && + @Counter.compare_and_set(c, c+RUNNING_WRITER) + @HeldCount.value = held + WRITE_LOCK_HELD + return true + end + end + false + end + + # Release a previously acquired write lock. + # + # @return [Boolean] true if the lock is successfully released + def release_write_lock + held = @HeldCount.value = @HeldCount.value - WRITE_LOCK_HELD + wlocks_held = held & WRITE_LOCK_MASK + if wlocks_held == 0 + c = @Counter.update { |counter| counter - RUNNING_WRITER } + @ReadQueue.broadcast + @WriteQueue.signal if waiting_writers(c) > 0 + elsif wlocks_held == WRITE_LOCK_MASK + raise IllegalOperationError, "Cannot release a write lock which is not held" + end + true + end + + private + + # @!visibility private + def running_readers(c = @Counter.value) + c & MAX_READERS + end + + # @!visibility private + def running_readers?(c = @Counter.value) + (c & MAX_READERS) > 0 + end + + # @!visibility private + def running_writer?(c = @Counter.value) + c >= RUNNING_WRITER + end + + # @!visibility private + def waiting_writers(c = @Counter.value) + (c & MAX_WRITERS) >> READER_BITS + end + + # @!visibility private + def waiting_or_running_writer?(c = @Counter.value) + c >= WAITING_WRITER + end + + # @!visibility private + def max_readers?(c = @Counter.value) + (c & MAX_READERS) == MAX_READERS + end + + # @!visibility private + def max_writers?(c = @Counter.value) + (c & MAX_WRITERS) == MAX_WRITERS + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/ruby_thread_local_var.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/ruby_thread_local_var.rb new file mode 100644 index 0000000..06afae7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/ruby_thread_local_var.rb @@ -0,0 +1,161 @@ +require 'thread' +require 'concurrent/atomic/abstract_thread_local_var' + +module Concurrent + + # @!visibility private + # @!macro internal_implementation_note + class RubyThreadLocalVar < AbstractThreadLocalVar + + # Each thread has a (lazily initialized) array of thread-local variable values + # Each time a new thread-local var is created, we allocate an "index" for it + # For example, if the allocated index is 1, that means slot #1 in EVERY + # thread's thread-local array will be used for the value of that TLV + # + # The good thing about using a per-THREAD structure to hold values, rather + # than a per-TLV structure, is that no synchronization is needed when + # reading and writing those values (since the structure is only ever + # accessed by a single thread) + # + # Of course, when a TLV is GC'd, 1) we need to recover its index for use + # by other new TLVs (otherwise the thread-local arrays could get bigger + # and bigger with time), and 2) we need to null out all the references + # held in the now-unused slots (both to avoid blocking GC of those objects, + # and also to prevent "stale" values from being passed on to a new TLV + # when the index is reused) + # Because we need to null out freed slots, we need to keep references to + # ALL the thread-local arrays -- ARRAYS is for that + # But when a Thread is GC'd, we need to drop the reference to its thread-local + # array, so we don't leak memory + + # @!visibility private + FREE = [] + LOCK = Mutex.new + ARRAYS = {} # used as a hash set + @@next = 0 + private_constant :FREE, :LOCK, :ARRAYS + + # @!macro thread_local_var_method_get + def value + if array = get_threadlocal_array + value = array[@index] + if value.nil? + default + elsif value.equal?(NULL) + nil + else + value + end + else + default + end + end + + # @!macro thread_local_var_method_set + def value=(value) + me = Thread.current + # We could keep the thread-local arrays in a hash, keyed by Thread + # But why? That would require locking + # Using Ruby's built-in thread-local storage is faster + unless array = get_threadlocal_array(me) + array = set_threadlocal_array([], me) + LOCK.synchronize { ARRAYS[array.object_id] = array } + ObjectSpace.define_finalizer(me, self.class.thread_finalizer(array)) + end + array[@index] = (value.nil? ? NULL : value) + value + end + + protected + + # @!visibility private + def allocate_storage + @index = LOCK.synchronize do + FREE.pop || begin + result = @@next + @@next += 1 + result + end + end + ObjectSpace.define_finalizer(self, self.class.threadlocal_finalizer(@index)) + end + + # @!visibility private + def self.threadlocal_finalizer(index) + proc do + Thread.new do # avoid error: can't be called from trap context + LOCK.synchronize do + FREE.push(index) + # The cost of GC'ing a TLV is linear in the number of threads using TLVs + # But that is natural! More threads means more storage is used per TLV + # So naturally more CPU time is required to free more storage + ARRAYS.each_value do |array| + array[index] = nil + end + end + end + end + end + + # @!visibility private + def self.thread_finalizer(array) + proc do + Thread.new do # avoid error: can't be called from trap context + LOCK.synchronize do + # The thread which used this thread-local array is now gone + # So don't hold onto a reference to the array (thus blocking GC) + ARRAYS.delete(array.object_id) + end + end + end + end + + private + + if Thread.instance_methods.include?(:thread_variable_get) + + def get_threadlocal_array(thread = Thread.current) + thread.thread_variable_get(:__threadlocal_array__) + end + + def set_threadlocal_array(array, thread = Thread.current) + thread.thread_variable_set(:__threadlocal_array__, array) + end + + else + + def get_threadlocal_array(thread = Thread.current) + thread[:__threadlocal_array__] + end + + def set_threadlocal_array(array, thread = Thread.current) + thread[:__threadlocal_array__] = array + end + end + + # This exists only for use in testing + # @!visibility private + def value_for(thread) + if array = get_threadlocal_array(thread) + value = array[@index] + if value.nil? + default_for(thread) + elsif value.equal?(NULL) + nil + else + value + end + else + default_for(thread) + end + end + + def default_for(thread) + if @default_block + raise "Cannot use default_for with default block" + else + @default + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/semaphore.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/semaphore.rb new file mode 100644 index 0000000..340ea03 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/semaphore.rb @@ -0,0 +1,145 @@ +require 'concurrent/atomic/mutex_semaphore' +require 'concurrent/synchronization' + +module Concurrent + + ################################################################### + + # @!macro [new] semaphore_method_initialize + # + # Create a new `Semaphore` with the initial `count`. + # + # @param [Fixnum] count the initial count + # + # @raise [ArgumentError] if `count` is not an integer or is less than zero + + # @!macro [new] semaphore_method_acquire + # + # Acquires the given number of permits from this semaphore, + # blocking until all are available. + # + # @param [Fixnum] permits Number of permits to acquire + # + # @raise [ArgumentError] if `permits` is not an integer or is less than + # one + # + # @return [nil] + + # @!macro [new] semaphore_method_available_permits + # + # Returns the current number of permits available in this semaphore. + # + # @return [Integer] + + # @!macro [new] semaphore_method_drain_permits + # + # Acquires and returns all permits that are immediately available. + # + # @return [Integer] + + # @!macro [new] semaphore_method_try_acquire + # + # Acquires the given number of permits from this semaphore, + # only if all are available at the time of invocation or within + # `timeout` interval + # + # @param [Fixnum] permits the number of permits to acquire + # + # @param [Fixnum] timeout the number of seconds to wait for the counter + # or `nil` to return immediately + # + # @raise [ArgumentError] if `permits` is not an integer or is less than + # one + # + # @return [Boolean] `false` if no permits are available, `true` when + # acquired a permit + + # @!macro [new] semaphore_method_release + # + # Releases the given number of permits, returning them to the semaphore. + # + # @param [Fixnum] permits Number of permits to return to the semaphore. + # + # @raise [ArgumentError] if `permits` is not a number or is less than one + # + # @return [nil] + + ################################################################### + + # @!macro [new] semaphore_public_api + # + # @!method initialize(count) + # @!macro semaphore_method_initialize + # + # @!method acquire(permits = 1) + # @!macro semaphore_method_acquire + # + # @!method available_permits + # @!macro semaphore_method_available_permits + # + # @!method drain_permits + # @!macro semaphore_method_drain_permits + # + # @!method try_acquire(permits = 1, timeout = nil) + # @!macro semaphore_method_try_acquire + # + # @!method release(permits = 1) + # @!macro semaphore_method_release + + ################################################################### + + # @!visibility private + # @!macro internal_implementation_note + SemaphoreImplementation = case + when defined?(JavaSemaphore) + JavaSemaphore + else + MutexSemaphore + end + private_constant :SemaphoreImplementation + + # @!macro [attach] semaphore + # + # A counting semaphore. Conceptually, a semaphore maintains a set of + # permits. Each {#acquire} blocks if necessary until a permit is + # available, and then takes it. Each {#release} adds a permit, potentially + # releasing a blocking acquirer. + # However, no actual permit objects are used; the Semaphore just keeps a + # count of the number available and acts accordingly. + # + # @!macro semaphore_public_api + # @example + # semaphore = Concurrent::Semaphore.new(2) + # + # t1 = Thread.new do + # semaphore.acquire + # puts "Thread 1 acquired semaphore" + # end + # + # t2 = Thread.new do + # semaphore.acquire + # puts "Thread 2 acquired semaphore" + # end + # + # t3 = Thread.new do + # semaphore.acquire + # puts "Thread 3 acquired semaphore" + # end + # + # t4 = Thread.new do + # sleep(2) + # puts "Thread 4 releasing semaphore" + # semaphore.release + # end + # + # [t1, t2, t3, t4].each(&:join) + # + # # prints: + # # Thread 3 acquired semaphore + # # Thread 2 acquired semaphore + # # Thread 4 releasing semaphore + # # Thread 1 acquired semaphore + # + class Semaphore < SemaphoreImplementation + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/thread_local_var.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/thread_local_var.rb new file mode 100644 index 0000000..f86de15 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic/thread_local_var.rb @@ -0,0 +1,104 @@ +require 'concurrent/atomic/ruby_thread_local_var' +require 'concurrent/atomic/java_thread_local_var' +require 'concurrent/utility/engine' + +module Concurrent + + ################################################################### + + # @!macro [new] thread_local_var_method_initialize + # + # Creates a thread local variable. + # + # @param [Object] default the default value when otherwise unset + # @param [Proc] default_block Optional block that gets called to obtain the + # default value for each thread + + # @!macro [new] thread_local_var_method_get + # + # Returns the value in the current thread's copy of this thread-local variable. + # + # @return [Object] the current value + + # @!macro [new] thread_local_var_method_set + # + # Sets the current thread's copy of this thread-local variable to the specified value. + # + # @param [Object] value the value to set + # @return [Object] the new value + + # @!macro [new] thread_local_var_method_bind + # + # Bind the given value to thread local storage during + # execution of the given block. + # + # @param [Object] value the value to bind + # @yield the operation to be performed with the bound variable + # @return [Object] the value + + + ################################################################### + + # @!macro [new] thread_local_var_public_api + # + # @!method initialize(default = nil) + # @!macro thread_local_var_method_initialize + # + # @!method value + # @!macro thread_local_var_method_get + # + # @!method value=(value) + # @!macro thread_local_var_method_set + # + # @!method bind(value, &block) + # @!macro thread_local_var_method_bind + + ################################################################### + + # @!visibility private + # @!macro internal_implementation_note + ThreadLocalVarImplementation = case + when Concurrent.on_jruby? + JavaThreadLocalVar + else + RubyThreadLocalVar + end + private_constant :ThreadLocalVarImplementation + + # @!macro [attach] thread_local_var + # + # A `ThreadLocalVar` is a variable where the value is different for each thread. + # Each variable may have a default value, but when you modify the variable only + # the current thread will ever see that change. + # + # @!macro thread_safe_variable_comparison + # + # @example + # v = ThreadLocalVar.new(14) + # v.value #=> 14 + # v.value = 2 + # v.value #=> 2 + # + # @example + # v = ThreadLocalVar.new(14) + # + # t1 = Thread.new do + # v.value #=> 14 + # v.value = 1 + # v.value #=> 1 + # end + # + # t2 = Thread.new do + # v.value #=> 14 + # v.value = 2 + # v.value #=> 2 + # end + # + # v.value #=> 14 + # + # @see https://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html Java ThreadLocal + # + # @!macro thread_local_var_public_api + class ThreadLocalVar < ThreadLocalVarImplementation + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/concurrent_update_error.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/concurrent_update_error.rb new file mode 100644 index 0000000..bc98c48 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/concurrent_update_error.rb @@ -0,0 +1,8 @@ +module Concurrent + + # @!macro atomic_reference + class ConcurrentUpdateError < ThreadError + # frozen pre-allocated backtrace to speed ConcurrentUpdateError + CONC_UP_ERR_BACKTRACE = ['backtrace elided; set verbose to enable'].freeze + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/direct_update.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/direct_update.rb new file mode 100644 index 0000000..e25abe3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/direct_update.rb @@ -0,0 +1,81 @@ +require 'concurrent/atomic_reference/concurrent_update_error' + +module Concurrent + + # Define update methods that use direct paths + # + # @!visibility private + # @!macro internal_implementation_note + module AtomicDirectUpdate + + # @!macro [attach] atomic_reference_method_update + # + # Pass the current value to the given block, replacing it + # with the block's result. May retry if the value changes + # during the block's execution. + # + # @yield [Object] Calculate a new value for the atomic reference using + # given (old) value + # @yieldparam [Object] old_value the starting value of the atomic reference + # + # @return [Object] the new value + def update + true until compare_and_set(old_value = get, new_value = yield(old_value)) + new_value + end + + # @!macro [attach] atomic_reference_method_try_update + # + # Pass the current value to the given block, replacing it + # with the block's result. Return nil if the update fails. + # + # @yield [Object] Calculate a new value for the atomic reference using + # given (old) value + # @yieldparam [Object] old_value the starting value of the atomic reference + # + # @note This method was altered to avoid raising an exception by default. + # Instead, this method now returns `nil` in case of failure. For more info, + # please see: https://github.com/ruby-concurrency/concurrent-ruby/pull/336 + # + # @return [Object] the new value, or nil if update failed + def try_update + old_value = get + new_value = yield old_value + + return unless compare_and_set old_value, new_value + + new_value + end + + # @!macro [attach] atomic_reference_method_try_update! + # + # Pass the current value to the given block, replacing it + # with the block's result. Raise an exception if the update + # fails. + # + # @yield [Object] Calculate a new value for the atomic reference using + # given (old) value + # @yieldparam [Object] old_value the starting value of the atomic reference + # + # @note This behavior mimics the behavior of the original + # `AtomicReference#try_update` API. The reason this was changed was to + # avoid raising exceptions (which are inherently slow) by default. For more + # info: https://github.com/ruby-concurrency/concurrent-ruby/pull/336 + # + # @return [Object] the new value + # + # @raise [Concurrent::ConcurrentUpdateError] if the update fails + def try_update! + old_value = get + new_value = yield old_value + unless compare_and_set(old_value, new_value) + if $VERBOSE + raise ConcurrentUpdateError, "Update failed" + else + raise ConcurrentUpdateError, "Update failed", ConcurrentUpdateError::CONC_UP_ERR_BACKTRACE + end + end + new_value + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/jruby+truffle.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/jruby+truffle.rb new file mode 100644 index 0000000..ebb52dc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/jruby+truffle.rb @@ -0,0 +1,2 @@ +require 'atomic' +require 'concurrent/atomic_reference/rbx' diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/jruby.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/jruby.rb new file mode 100644 index 0000000..40e46f9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/jruby.rb @@ -0,0 +1,16 @@ +require 'concurrent/synchronization' + +if defined?(Concurrent::JavaAtomicReference) + require 'concurrent/atomic_reference/direct_update' + + module Concurrent + + # @!macro atomic_reference + # + # @!visibility private + # @!macro internal_implementation_note + class JavaAtomicReference + include Concurrent::AtomicDirectUpdate + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/mutex_atomic.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/mutex_atomic.rb new file mode 100644 index 0000000..a2becc0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/mutex_atomic.rb @@ -0,0 +1,61 @@ +require 'concurrent/synchronization' +require 'concurrent/atomic_reference/direct_update' +require 'concurrent/atomic_reference/numeric_cas_wrapper' + +module Concurrent + + # @!macro atomic_reference + # + # @!visibility private + # @!macro internal_implementation_note + class MutexAtomicReference < Synchronization::LockableObject + include Concurrent::AtomicDirectUpdate + include Concurrent::AtomicNumericCompareAndSetWrapper + + # @!macro atomic_reference_method_initialize + def initialize(value = nil) + super() + synchronize { ns_initialize(value) } + end + + # @!macro atomic_reference_method_get + def get + synchronize { @value } + end + alias_method :value, :get + + # @!macro atomic_reference_method_set + def set(new_value) + synchronize { @value = new_value } + end + alias_method :value=, :set + + # @!macro atomic_reference_method_get_and_set + def get_and_set(new_value) + synchronize do + old_value = @value + @value = new_value + old_value + end + end + alias_method :swap, :get_and_set + + # @!macro atomic_reference_method_compare_and_set + def _compare_and_set(old_value, new_value) + synchronize do + if @value.equal? old_value + @value = new_value + true + else + false + end + end + end + + protected + + def ns_initialize(value) + @value = value + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/numeric_cas_wrapper.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/numeric_cas_wrapper.rb new file mode 100644 index 0000000..9f3e8bf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/numeric_cas_wrapper.rb @@ -0,0 +1,28 @@ +module Concurrent + + # Special "compare and set" handling of numeric values. + # + # @!visibility private + # @!macro internal_implementation_note + module AtomicNumericCompareAndSetWrapper + + # @!macro atomic_reference_method_compare_and_set + def compare_and_set(old_value, new_value) + if old_value.kind_of? Numeric + while true + old = get + + return false unless old.kind_of? Numeric + + return false unless old == old_value + + result = _compare_and_set(old, new_value) + return result if result + end + else + _compare_and_set(old_value, new_value) + end + end + alias_method :compare_and_swap, :compare_and_set + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/rbx.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/rbx.rb new file mode 100644 index 0000000..ff900e0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/rbx.rb @@ -0,0 +1,22 @@ +require 'concurrent/atomic_reference/direct_update' +require 'concurrent/atomic_reference/numeric_cas_wrapper' + +module Concurrent + + # @!macro atomic_reference + # + # @note Extends `Rubinius::AtomicReference` version adding aliases + # and numeric logic. + # + # @!visibility private + # @!macro internal_implementation_note + class RbxAtomicReference < Rubinius::AtomicReference + alias _compare_and_set compare_and_set + include Concurrent::AtomicDirectUpdate + include Concurrent::AtomicNumericCompareAndSetWrapper + + alias_method :value, :get + alias_method :value=, :set + alias_method :swap, :get_and_set + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/ruby.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/ruby.rb new file mode 100644 index 0000000..2497306 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomic_reference/ruby.rb @@ -0,0 +1,32 @@ +if defined? Concurrent::CAtomicReference + require 'concurrent/synchronization' + require 'concurrent/atomic_reference/direct_update' + require 'concurrent/atomic_reference/numeric_cas_wrapper' + + module Concurrent + + # @!macro atomic_reference + # + # @!visibility private + # @!macro internal_implementation_note + class CAtomicReference + include Concurrent::AtomicDirectUpdate + include Concurrent::AtomicNumericCompareAndSetWrapper + + # @!method initialize + # @!macro atomic_reference_method_initialize + + # @!method get + # @!macro atomic_reference_method_get + + # @!method set + # @!macro atomic_reference_method_set + + # @!method get_and_set + # @!macro atomic_reference_method_get_and_set + + # @!method _compare_and_set + # @!macro atomic_reference_method_compare_and_set + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomics.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomics.rb new file mode 100644 index 0000000..5262942 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/atomics.rb @@ -0,0 +1,53 @@ +# @!macro [new] atomic_reference +# +# An object reference that may be updated atomically. All read and write +# operations have java volatile semantic. +# +# @!macro thread_safe_variable_comparison +# +# @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html +# @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html +# +# @!method initialize +# @!macro [new] atomic_reference_method_initialize +# @param [Object] value The initial value. +# +# @!method get +# @!macro [new] atomic_reference_method_get +# Gets the current value. +# @return [Object] the current value +# +# @!method set +# @!macro [new] atomic_reference_method_set +# Sets to the given value. +# @param [Object] new_value the new value +# @return [Object] the new value +# +# @!method get_and_set +# @!macro [new] atomic_reference_method_get_and_set +# Atomically sets to the given value and returns the old value. +# @param [Object] new_value the new value +# @return [Object] the old value +# +# @!method compare_and_set +# @!macro [new] atomic_reference_method_compare_and_set +# +# Atomically sets the value to the given updated value if +# the current value == the expected value. +# +# @param [Object] old_value the expected value +# @param [Object] new_value the new value +# +# @return [Boolean] `true` if successful. A `false` return indicates +# that the actual value was not equal to the expected value. + +require 'concurrent/atomic/atomic_reference' +require 'concurrent/atomic/atomic_boolean' +require 'concurrent/atomic/atomic_fixnum' +require 'concurrent/atomic/cyclic_barrier' +require 'concurrent/atomic/count_down_latch' +require 'concurrent/atomic/event' +require 'concurrent/atomic/read_write_lock' +require 'concurrent/atomic/reentrant_read_write_lock' +require 'concurrent/atomic/semaphore' +require 'concurrent/atomic/thread_local_var' diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/copy_on_notify_observer_set.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/copy_on_notify_observer_set.rb new file mode 100644 index 0000000..50d52a6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/copy_on_notify_observer_set.rb @@ -0,0 +1,107 @@ +require 'concurrent/synchronization' + +module Concurrent + module Collection + + # A thread safe observer set implemented using copy-on-read approach: + # observers are added and removed from a thread safe collection; every time + # a notification is required the internal data structure is copied to + # prevent concurrency issues + # + # @api private + class CopyOnNotifyObserverSet < Synchronization::LockableObject + + def initialize + super() + synchronize { ns_initialize } + end + + # @!macro observable_add_observer + def add_observer(observer = nil, func = :update, &block) + if observer.nil? && block.nil? + raise ArgumentError, 'should pass observer as a first argument or block' + elsif observer && block + raise ArgumentError.new('cannot provide both an observer and a block') + end + + if block + observer = block + func = :call + end + + synchronize do + @observers[observer] = func + observer + end + end + + # @!macro observable_delete_observer + def delete_observer(observer) + synchronize do + @observers.delete(observer) + observer + end + end + + # @!macro observable_delete_observers + def delete_observers + synchronize do + @observers.clear + self + end + end + + # @!macro observable_count_observers + def count_observers + synchronize { @observers.count } + end + + # Notifies all registered observers with optional args + # @param [Object] args arguments to be passed to each observer + # @return [CopyOnWriteObserverSet] self + def notify_observers(*args, &block) + observers = duplicate_observers + notify_to(observers, *args, &block) + self + end + + # Notifies all registered observers with optional args and deletes them. + # + # @param [Object] args arguments to be passed to each observer + # @return [CopyOnWriteObserverSet] self + def notify_and_delete_observers(*args, &block) + observers = duplicate_and_clear_observers + notify_to(observers, *args, &block) + self + end + + protected + + def ns_initialize + @observers = {} + end + + private + + def duplicate_and_clear_observers + synchronize do + observers = @observers.dup + @observers.clear + observers + end + end + + def duplicate_observers + synchronize { @observers.dup } + end + + def notify_to(observers, *args) + raise ArgumentError.new('cannot give arguments and a block') if block_given? && !args.empty? + observers.each do |observer, function| + args = yield if block_given? + observer.send(function, *args) + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/copy_on_write_observer_set.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/copy_on_write_observer_set.rb new file mode 100644 index 0000000..3f3f7cc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/copy_on_write_observer_set.rb @@ -0,0 +1,111 @@ +require 'concurrent/synchronization' + +module Concurrent + module Collection + + # A thread safe observer set implemented using copy-on-write approach: + # every time an observer is added or removed the whole internal data structure is + # duplicated and replaced with a new one. + # + # @api private + class CopyOnWriteObserverSet < Synchronization::LockableObject + + def initialize + super() + synchronize { ns_initialize } + end + + # @!macro observable_add_observer + def add_observer(observer = nil, func = :update, &block) + if observer.nil? && block.nil? + raise ArgumentError, 'should pass observer as a first argument or block' + elsif observer && block + raise ArgumentError.new('cannot provide both an observer and a block') + end + + if block + observer = block + func = :call + end + + synchronize do + new_observers = @observers.dup + new_observers[observer] = func + @observers = new_observers + observer + end + end + + # @!macro observable_delete_observer + def delete_observer(observer) + synchronize do + new_observers = @observers.dup + new_observers.delete(observer) + @observers = new_observers + observer + end + end + + # @!macro observable_delete_observers + def delete_observers + self.observers = {} + self + end + + # @!macro observable_count_observers + def count_observers + observers.count + end + + # Notifies all registered observers with optional args + # @param [Object] args arguments to be passed to each observer + # @return [CopyOnWriteObserverSet] self + def notify_observers(*args, &block) + notify_to(observers, *args, &block) + self + end + + # Notifies all registered observers with optional args and deletes them. + # + # @param [Object] args arguments to be passed to each observer + # @return [CopyOnWriteObserverSet] self + def notify_and_delete_observers(*args, &block) + old = clear_observers_and_return_old + notify_to(old, *args, &block) + self + end + + protected + + def ns_initialize + @observers = {} + end + + private + + def notify_to(observers, *args) + raise ArgumentError.new('cannot give arguments and a block') if block_given? && !args.empty? + observers.each do |observer, function| + args = yield if block_given? + observer.send(function, *args) + end + end + + def observers + synchronize { @observers } + end + + def observers=(new_set) + synchronize { @observers = new_set } + end + + def clear_observers_and_return_old + synchronize do + old_observers = @observers + @observers = {} + old_observers + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/java_non_concurrent_priority_queue.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/java_non_concurrent_priority_queue.rb new file mode 100644 index 0000000..2be9e43 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/java_non_concurrent_priority_queue.rb @@ -0,0 +1,84 @@ +if Concurrent.on_jruby? + + module Concurrent + module Collection + + + # @!macro priority_queue + # + # @!visibility private + # @!macro internal_implementation_note + class JavaNonConcurrentPriorityQueue + + # @!macro priority_queue_method_initialize + def initialize(opts = {}) + order = opts.fetch(:order, :max) + if [:min, :low].include?(order) + @queue = java.util.PriorityQueue.new(11) # 11 is the default initial capacity + else + @queue = java.util.PriorityQueue.new(11, java.util.Collections.reverseOrder()) + end + end + + # @!macro priority_queue_method_clear + def clear + @queue.clear + true + end + + # @!macro priority_queue_method_delete + def delete(item) + found = false + while @queue.remove(item) do + found = true + end + found + end + + # @!macro priority_queue_method_empty + def empty? + @queue.size == 0 + end + + # @!macro priority_queue_method_include + def include?(item) + @queue.contains(item) + end + alias_method :has_priority?, :include? + + # @!macro priority_queue_method_length + def length + @queue.size + end + alias_method :size, :length + + # @!macro priority_queue_method_peek + def peek + @queue.peek + end + + # @!macro priority_queue_method_pop + def pop + @queue.poll + end + alias_method :deq, :pop + alias_method :shift, :pop + + # @!macro priority_queue_method_push + def push(item) + raise ArgumentError.new('cannot enqueue nil') if item.nil? + @queue.add(item) + end + alias_method :<<, :push + alias_method :enq, :push + + # @!macro priority_queue_method_from_list + def self.from_list(list, opts = {}) + queue = new(opts) + list.each{|item| queue << item } + queue + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/atomic_reference_map_backend.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/atomic_reference_map_backend.rb new file mode 100644 index 0000000..aac6399 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/atomic_reference_map_backend.rb @@ -0,0 +1,927 @@ +require 'concurrent/constants' +require 'concurrent/thread_safe/util' +require 'concurrent/thread_safe/util/adder' +require 'concurrent/thread_safe/util/cheap_lockable' +require 'concurrent/thread_safe/util/power_of_two_tuple' +require 'concurrent/thread_safe/util/volatile' +require 'concurrent/thread_safe/util/xor_shift_random' + +module Concurrent + + # @!visibility private + module Collection + + # A Ruby port of the Doug Lea's jsr166e.ConcurrentHashMapV8 class version 1.59 + # available in public domain. + # + # Original source code available here: + # http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/ConcurrentHashMapV8.java?revision=1.59 + # + # The Ruby port skips out the +TreeBin+ (red-black trees for use in bins whose + # size exceeds a threshold). + # + # A hash table supporting full concurrency of retrievals and high expected + # concurrency for updates. However, even though all operations are + # thread-safe, retrieval operations do _not_ entail locking, and there is + # _not_ any support for locking the entire table in a way that prevents all + # access. + # + # Retrieval operations generally do not block, so may overlap with update + # operations. Retrievals reflect the results of the most recently _completed_ + # update operations holding upon their onset. (More formally, an update + # operation for a given key bears a _happens-before_ relation with any (non + # +nil+) retrieval for that key reporting the updated value.) For aggregate + # operations such as +clear()+, concurrent retrievals may reflect insertion or + # removal of only some entries. Similarly, the +each_pair+ iterator yields + # elements reflecting the state of the hash table at some point at or since + # the start of the +each_pair+. Bear in mind that the results of aggregate + # status methods including +size()+ and +empty?+} are typically useful only + # when a map is not undergoing concurrent updates in other threads. Otherwise + # the results of these methods reflect transient states that may be adequate + # for monitoring or estimation purposes, but not for program control. + # + # The table is dynamically expanded when there are too many collisions (i.e., + # keys that have distinct hash codes but fall into the same slot modulo the + # table size), with the expected average effect of maintaining roughly two + # bins per mapping (corresponding to a 0.75 load factor threshold for + # resizing). There may be much variance around this average as mappings are + # added and removed, but overall, this maintains a commonly accepted + # time/space tradeoff for hash tables. However, resizing this or any other + # kind of hash table may be a relatively slow operation. When possible, it is + # a good idea to provide a size estimate as an optional :initial_capacity + # initializer argument. An additional optional :load_factor constructor + # argument provides a further means of customizing initial table capacity by + # specifying the table density to be used in calculating the amount of space + # to allocate for the given number of elements. Note that using many keys with + # exactly the same +hash+ is a sure way to slow down performance of any hash + # table. + # + # ## Design overview + # + # The primary design goal of this hash table is to maintain concurrent + # readability (typically method +[]+, but also iteration and related methods) + # while minimizing update contention. Secondary goals are to keep space + # consumption about the same or better than plain +Hash+, and to support high + # initial insertion rates on an empty table by many threads. + # + # Each key-value mapping is held in a +Node+. The validation-based approach + # explained below leads to a lot of code sprawl because retry-control + # precludes factoring into smaller methods. + # + # The table is lazily initialized to a power-of-two size upon the first + # insertion. Each bin in the table normally contains a list of +Node+s (most + # often, the list has only zero or one +Node+). Table accesses require + # volatile/atomic reads, writes, and CASes. The lists of nodes within bins are + # always accurately traversable under volatile reads, so long as lookups check + # hash code and non-nullness of value before checking key equality. + # + # We use the top two bits of +Node+ hash fields for control purposes -- they + # are available anyway because of addressing constraints. As explained further + # below, these top bits are used as follows: + # + # - 00 - Normal + # - 01 - Locked + # - 11 - Locked and may have a thread waiting for lock + # - 10 - +Node+ is a forwarding node + # + # The lower 28 bits of each +Node+'s hash field contain a the key's hash code, + # except for forwarding nodes, for which the lower bits are zero (and so + # always have hash field == +MOVED+). + # + # Insertion (via +[]=+ or its variants) of the first node in an empty bin is + # performed by just CASing it to the bin. This is by far the most common case + # for put operations under most key/hash distributions. Other update + # operations (insert, delete, and replace) require locks. We do not want to + # waste the space required to associate a distinct lock object with each bin, + # so instead use the first node of a bin list itself as a lock. Blocking + # support for these locks relies +Concurrent::ThreadSafe::Util::CheapLockable. However, we also need a + # +try_lock+ construction, so we overlay these by using bits of the +Node+ + # hash field for lock control (see above), and so normally use builtin + # monitors only for blocking and signalling using + # +cheap_wait+/+cheap_broadcast+ constructions. See +Node#try_await_lock+. + # + # Using the first node of a list as a lock does not by itself suffice though: + # When a node is locked, any update must first validate that it is still the + # first node after locking it, and retry if not. Because new nodes are always + # appended to lists, once a node is first in a bin, it remains first until + # deleted or the bin becomes invalidated (upon resizing). However, operations + # that only conditionally update may inspect nodes until the point of update. + # This is a converse of sorts to the lazy locking technique described by + # Herlihy & Shavit. + # + # The main disadvantage of per-bin locks is that other update operations on + # other nodes in a bin list protected by the same lock can stall, for example + # when user +eql?+ or mapping functions take a long time. However, + # statistically, under random hash codes, this is not a common problem. + # Ideally, the frequency of nodes in bins follows a Poisson distribution + # (http://en.wikipedia.org/wiki/Poisson_distribution) with a parameter of + # about 0.5 on average, given the resizing threshold of 0.75, although with a + # large variance because of resizing granularity. Ignoring variance, the + # expected occurrences of list size k are (exp(-0.5) * pow(0.5, k) / + # factorial(k)). The first values are: + # + # - 0: 0.60653066 + # - 1: 0.30326533 + # - 2: 0.07581633 + # - 3: 0.01263606 + # - 4: 0.00157952 + # - 5: 0.00015795 + # - 6: 0.00001316 + # - 7: 0.00000094 + # - 8: 0.00000006 + # - more: less than 1 in ten million + # + # Lock contention probability for two threads accessing distinct elements is + # roughly 1 / (8 * #elements) under random hashes. + # + # The table is resized when occupancy exceeds a percentage threshold + # (nominally, 0.75, but see below). Only a single thread performs the resize + # (using field +size_control+, to arrange exclusion), but the table otherwise + # remains usable for reads and updates. Resizing proceeds by transferring + # bins, one by one, from the table to the next table. Because we are using + # power-of-two expansion, the elements from each bin must either stay at same + # index, or move with a power of two offset. We eliminate unnecessary node + # creation by catching cases where old nodes can be reused because their next + # fields won't change. On average, only about one-sixth of them need cloning + # when a table doubles. The nodes they replace will be garbage collectable as + # soon as they are no longer referenced by any reader thread that may be in + # the midst of concurrently traversing table. Upon transfer, the old table bin + # contains only a special forwarding node (with hash field +MOVED+) that + # contains the next table as its key. On encountering a forwarding node, + # access and update operations restart, using the new table. + # + # Each bin transfer requires its bin lock. However, unlike other cases, a + # transfer can skip a bin if it fails to acquire its lock, and revisit it + # later. Method +rebuild+ maintains a buffer of TRANSFER_BUFFER_SIZE bins that + # have been skipped because of failure to acquire a lock, and blocks only if + # none are available (i.e., only very rarely). The transfer operation must + # also ensure that all accessible bins in both the old and new table are + # usable by any traversal. When there are no lock acquisition failures, this + # is arranged simply by proceeding from the last bin (+table.size - 1+) up + # towards the first. Upon seeing a forwarding node, traversals arrange to move + # to the new table without revisiting nodes. However, when any node is skipped + # during a transfer, all earlier table bins may have become visible, so are + # initialized with a reverse-forwarding node back to the old table until the + # new ones are established. (This sometimes requires transiently locking a + # forwarding node, which is possible under the above encoding.) These more + # expensive mechanics trigger only when necessary. + # + # The traversal scheme also applies to partial traversals of + # ranges of bins (via an alternate Traverser constructor) + # to support partitioned aggregate operations. Also, read-only + # operations give up if ever forwarded to a null table, which + # provides support for shutdown-style clearing, which is also not + # currently implemented. + # + # Lazy table initialization minimizes footprint until first use. + # + # The element count is maintained using a +Concurrent::ThreadSafe::Util::Adder+, + # which avoids contention on updates but can encounter cache thrashing + # if read too frequently during concurrent access. To avoid reading so + # often, resizing is attempted either when a bin lock is + # contended, or upon adding to a bin already holding two or more + # nodes (checked before adding in the +x_if_absent+ methods, after + # adding in others). Under uniform hash distributions, the + # probability of this occurring at threshold is around 13%, + # meaning that only about 1 in 8 puts check threshold (and after + # resizing, many fewer do so). But this approximation has high + # variance for small table sizes, so we check on any collision + # for sizes <= 64. The bulk putAll operation further reduces + # contention by only committing count updates upon these size + # checks. + # + # @!visibility private + class AtomicReferenceMapBackend + + # @!visibility private + class Table < Concurrent::ThreadSafe::Util::PowerOfTwoTuple + def cas_new_node(i, hash, key, value) + cas(i, nil, Node.new(hash, key, value)) + end + + def try_to_cas_in_computed(i, hash, key) + succeeded = false + new_value = nil + new_node = Node.new(locked_hash = hash | LOCKED, key, NULL) + if cas(i, nil, new_node) + begin + if NULL == (new_value = yield(NULL)) + was_null = true + else + new_node.value = new_value + end + succeeded = true + ensure + volatile_set(i, nil) if !succeeded || was_null + new_node.unlock_via_hash(locked_hash, hash) + end + end + return succeeded, new_value + end + + def try_lock_via_hash(i, node, node_hash) + node.try_lock_via_hash(node_hash) do + yield if volatile_get(i) == node + end + end + + def delete_node_at(i, node, predecessor_node) + if predecessor_node + predecessor_node.next = node.next + else + volatile_set(i, node.next) + end + end + end + + # Key-value entry. Nodes with a hash field of +MOVED+ are special, and do + # not contain user keys or values. Otherwise, keys are never +nil+, and + # +NULL+ +value+ fields indicate that a node is in the process of being + # deleted or created. For purposes of read-only access, a key may be read + # before a value, but can only be used after checking value to be +!= NULL+. + # + # @!visibility private + class Node + extend Concurrent::ThreadSafe::Util::Volatile + attr_volatile :hash, :value, :next + + include Concurrent::ThreadSafe::Util::CheapLockable + + bit_shift = Concurrent::ThreadSafe::Util::FIXNUM_BIT_SIZE - 2 # need 2 bits for ourselves + # Encodings for special uses of Node hash fields. See above for explanation. + MOVED = ('10' << ('0' * bit_shift)).to_i(2) # hash field for forwarding nodes + LOCKED = ('01' << ('0' * bit_shift)).to_i(2) # set/tested only as a bit + WAITING = ('11' << ('0' * bit_shift)).to_i(2) # both bits set/tested together + HASH_BITS = ('00' << ('1' * bit_shift)).to_i(2) # usable bits of normal node hash + + SPIN_LOCK_ATTEMPTS = Concurrent::ThreadSafe::Util::CPU_COUNT > 1 ? Concurrent::ThreadSafe::Util::CPU_COUNT * 2 : 0 + + attr_reader :key + + def initialize(hash, key, value, next_node = nil) + super() + @key = key + self.lazy_set_hash(hash) + self.lazy_set_value(value) + self.next = next_node + end + + # Spins a while if +LOCKED+ bit set and this node is the first of its bin, + # and then sets +WAITING+ bits on hash field and blocks (once) if they are + # still set. It is OK for this method to return even if lock is not + # available upon exit, which enables these simple single-wait mechanics. + # + # The corresponding signalling operation is performed within callers: Upon + # detecting that +WAITING+ has been set when unlocking lock (via a failed + # CAS from non-waiting +LOCKED+ state), unlockers acquire the + # +cheap_synchronize+ lock and perform a +cheap_broadcast+. + def try_await_lock(table, i) + if table && i >= 0 && i < table.size # bounds check, TODO: why are we bounds checking? + spins = SPIN_LOCK_ATTEMPTS + randomizer = base_randomizer = Concurrent::ThreadSafe::Util::XorShiftRandom.get + while equal?(table.volatile_get(i)) && self.class.locked_hash?(my_hash = hash) + if spins >= 0 + if (randomizer = (randomizer >> 1)).even? # spin at random + if (spins -= 1) == 0 + Thread.pass # yield before blocking + else + randomizer = base_randomizer = Concurrent::ThreadSafe::Util::XorShiftRandom.xorshift(base_randomizer) if randomizer.zero? + end + end + elsif cas_hash(my_hash, my_hash | WAITING) + force_aquire_lock(table, i) + break + end + end + end + end + + def key?(key) + @key.eql?(key) + end + + def matches?(key, hash) + pure_hash == hash && key?(key) + end + + def pure_hash + hash & HASH_BITS + end + + def try_lock_via_hash(node_hash = hash) + if cas_hash(node_hash, locked_hash = node_hash | LOCKED) + begin + yield + ensure + unlock_via_hash(locked_hash, node_hash) + end + end + end + + def locked? + self.class.locked_hash?(hash) + end + + def unlock_via_hash(locked_hash, node_hash) + unless cas_hash(locked_hash, node_hash) + self.hash = node_hash + cheap_synchronize { cheap_broadcast } + end + end + + private + def force_aquire_lock(table, i) + cheap_synchronize do + if equal?(table.volatile_get(i)) && (hash & WAITING) == WAITING + cheap_wait + else + cheap_broadcast # possibly won race vs signaller + end + end + end + + class << self + def locked_hash?(hash) + (hash & LOCKED) != 0 + end + end + end + + # shorthands + MOVED = Node::MOVED + LOCKED = Node::LOCKED + WAITING = Node::WAITING + HASH_BITS = Node::HASH_BITS + + NOW_RESIZING = -1 + DEFAULT_CAPACITY = 16 + MAX_CAPACITY = Concurrent::ThreadSafe::Util::MAX_INT + + # The buffer size for skipped bins during transfers. The + # value is arbitrary but should be large enough to avoid + # most locking stalls during resizes. + TRANSFER_BUFFER_SIZE = 32 + + extend Concurrent::ThreadSafe::Util::Volatile + attr_volatile :table, # The array of bins. Lazily initialized upon first insertion. Size is always a power of two. + + # Table initialization and resizing control. When negative, the + # table is being initialized or resized. Otherwise, when table is + # null, holds the initial table size to use upon creation, or 0 + # for default. After initialization, holds the next element count + # value upon which to resize the table. + :size_control + + def initialize(options = nil) + super() + @counter = Concurrent::ThreadSafe::Util::Adder.new + initial_capacity = options && options[:initial_capacity] || DEFAULT_CAPACITY + self.size_control = (capacity = table_size_for(initial_capacity)) > MAX_CAPACITY ? MAX_CAPACITY : capacity + end + + def get_or_default(key, else_value = nil) + hash = key_hash(key) + current_table = table + while current_table + node = current_table.volatile_get_by_hash(hash) + current_table = + while node + if (node_hash = node.hash) == MOVED + break node.key + elsif (node_hash & HASH_BITS) == hash && node.key?(key) && NULL != (value = node.value) + return value + end + node = node.next + end + end + else_value + end + + def [](key) + get_or_default(key) + end + + def key?(key) + get_or_default(key, NULL) != NULL + end + + def []=(key, value) + get_and_set(key, value) + value + end + + def compute_if_absent(key) + hash = key_hash(key) + current_table = table || initialize_table + while true + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + succeeded, new_value = current_table.try_to_cas_in_computed(i, hash, key) { yield } + if succeeded + increment_size + return new_value + end + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif NULL != (current_value = find_value_in_node_list(node, key, hash, node_hash & HASH_BITS)) + return current_value + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, value = attempt_internal_compute_if_absent(key, hash, current_table, i, node, node_hash) { yield } + return value if succeeded + end + end + end + + def compute_if_present(key) + new_value = nil + internal_replace(key) do |old_value| + if (new_value = yield(NULL == old_value ? nil : old_value)).nil? + NULL + else + new_value + end + end + new_value + end + + def compute(key) + internal_compute(key) do |old_value| + if (new_value = yield(NULL == old_value ? nil : old_value)).nil? + NULL + else + new_value + end + end + end + + def merge_pair(key, value) + internal_compute(key) do |old_value| + if NULL == old_value || !(value = yield(old_value)).nil? + value + else + NULL + end + end + end + + def replace_pair(key, old_value, new_value) + NULL != internal_replace(key, old_value) { new_value } + end + + def replace_if_exists(key, new_value) + if (result = internal_replace(key) { new_value }) && NULL != result + result + end + end + + def get_and_set(key, value) # internalPut in the original CHMV8 + hash = key_hash(key) + current_table = table || initialize_table + while true + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + if current_table.cas_new_node(i, hash, key, value) + increment_size + break + end + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, old_value = attempt_get_and_set(key, value, hash, current_table, i, node, node_hash) + break old_value if succeeded + end + end + end + + def delete(key) + replace_if_exists(key, NULL) + end + + def delete_pair(key, value) + result = internal_replace(key, value) { NULL } + if result && NULL != result + !!result + else + false + end + end + + def each_pair + return self unless current_table = table + current_table_size = base_size = current_table.size + i = base_index = 0 + while base_index < base_size + if node = current_table.volatile_get(i) + if node.hash == MOVED + current_table = node.key + current_table_size = current_table.size + else + begin + if NULL != (value = node.value) # skip deleted or special nodes + yield node.key, value + end + end while node = node.next + end + end + + if (i_with_base = i + base_size) < current_table_size + i = i_with_base # visit upper slots if present + else + i = base_index += 1 + end + end + self + end + + def size + (sum = @counter.sum) < 0 ? 0 : sum # ignore transient negative values + end + + def empty? + size == 0 + end + + # Implementation for clear. Steps through each bin, removing all nodes. + def clear + return self unless current_table = table + current_table_size = current_table.size + deleted_count = i = 0 + while i < current_table_size + if !(node = current_table.volatile_get(i)) + i += 1 + elsif (node_hash = node.hash) == MOVED + current_table = node.key + current_table_size = current_table.size + elsif Node.locked_hash?(node_hash) + decrement_size(deleted_count) # opportunistically update count + deleted_count = 0 + node.try_await_lock(current_table, i) + else + current_table.try_lock_via_hash(i, node, node_hash) do + begin + deleted_count += 1 if NULL != node.value # recheck under lock + node.value = nil + end while node = node.next + current_table.volatile_set(i, nil) + i += 1 + end + end + end + decrement_size(deleted_count) + self + end + + private + # Internal versions of the insertion methods, each a + # little more complicated than the last. All have + # the same basic structure: + # 1. If table uninitialized, create + # 2. If bin empty, try to CAS new node + # 3. If bin stale, use new table + # 4. Lock and validate; if valid, scan and add or update + # + # The others interweave other checks and/or alternative actions: + # * Plain +get_and_set+ checks for and performs resize after insertion. + # * compute_if_absent prescans for mapping without lock (and fails to add + # if present), which also makes pre-emptive resize checks worthwhile. + # + # Someday when details settle down a bit more, it might be worth + # some factoring to reduce sprawl. + def internal_replace(key, expected_old_value = NULL, &block) + hash = key_hash(key) + current_table = table + while current_table + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + break + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif (node_hash & HASH_BITS) != hash && !node.next # precheck + break # rules out possible existence + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, old_value = attempt_internal_replace(key, expected_old_value, hash, current_table, i, node, node_hash, &block) + return old_value if succeeded + end + end + NULL + end + + def attempt_internal_replace(key, expected_old_value, hash, current_table, i, node, node_hash) + current_table.try_lock_via_hash(i, node, node_hash) do + predecessor_node = nil + old_value = NULL + begin + if node.matches?(key, hash) && NULL != (current_value = node.value) + if NULL == expected_old_value || expected_old_value == current_value # NULL == expected_old_value means whatever value + old_value = current_value + if NULL == (node.value = yield(old_value)) + current_table.delete_node_at(i, node, predecessor_node) + decrement_size + end + end + break + end + + predecessor_node = node + end while node = node.next + + return true, old_value + end + end + + def find_value_in_node_list(node, key, hash, pure_hash) + do_check_for_resize = false + while true + if pure_hash == hash && node.key?(key) && NULL != (value = node.value) + return value + elsif node = node.next + do_check_for_resize = true # at least 2 nodes -> check for resize + pure_hash = node.pure_hash + else + return NULL + end + end + ensure + check_for_resize if do_check_for_resize + end + + def internal_compute(key, &block) + hash = key_hash(key) + current_table = table || initialize_table + while true + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + succeeded, new_value = current_table.try_to_cas_in_computed(i, hash, key, &block) + if succeeded + if NULL == new_value + break nil + else + increment_size + break new_value + end + end + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, new_value = attempt_compute(key, hash, current_table, i, node, node_hash, &block) + break new_value if succeeded + end + end + end + + def attempt_internal_compute_if_absent(key, hash, current_table, i, node, node_hash) + added = false + current_table.try_lock_via_hash(i, node, node_hash) do + while true + if node.matches?(key, hash) && NULL != (value = node.value) + return true, value + end + last = node + unless node = node.next + last.next = Node.new(hash, key, value = yield) + added = true + increment_size + return true, value + end + end + end + ensure + check_for_resize if added + end + + def attempt_compute(key, hash, current_table, i, node, node_hash) + added = false + current_table.try_lock_via_hash(i, node, node_hash) do + predecessor_node = nil + while true + if node.matches?(key, hash) && NULL != (value = node.value) + if NULL == (node.value = value = yield(value)) + current_table.delete_node_at(i, node, predecessor_node) + decrement_size + value = nil + end + return true, value + end + predecessor_node = node + unless node = node.next + if NULL == (value = yield(NULL)) + value = nil + else + predecessor_node.next = Node.new(hash, key, value) + added = true + increment_size + end + return true, value + end + end + end + ensure + check_for_resize if added + end + + def attempt_get_and_set(key, value, hash, current_table, i, node, node_hash) + node_nesting = nil + current_table.try_lock_via_hash(i, node, node_hash) do + node_nesting = 1 + old_value = nil + found_old_value = false + while node + if node.matches?(key, hash) && NULL != (old_value = node.value) + found_old_value = true + node.value = value + break + end + last = node + unless node = node.next + last.next = Node.new(hash, key, value) + break + end + node_nesting += 1 + end + + return true, old_value if found_old_value + increment_size + true + end + ensure + check_for_resize if node_nesting && (node_nesting > 1 || current_table.size <= 64) + end + + def initialize_copy(other) + super + @counter = Concurrent::ThreadSafe::Util::Adder.new + self.table = nil + self.size_control = (other_table = other.table) ? other_table.size : DEFAULT_CAPACITY + self + end + + def try_await_lock(current_table, i, node) + check_for_resize # try resizing if can't get lock + node.try_await_lock(current_table, i) + end + + def key_hash(key) + key.hash & HASH_BITS + end + + # Returns a power of two table size for the given desired capacity. + def table_size_for(entry_count) + size = 2 + size <<= 1 while size < entry_count + size + end + + # Initializes table, using the size recorded in +size_control+. + def initialize_table + until current_table ||= table + if (size_ctrl = size_control) == NOW_RESIZING + Thread.pass # lost initialization race; just spin + else + try_in_resize_lock(current_table, size_ctrl) do + initial_size = size_ctrl > 0 ? size_ctrl : DEFAULT_CAPACITY + current_table = self.table = Table.new(initial_size) + initial_size - (initial_size >> 2) # 75% load factor + end + end + end + current_table + end + + # If table is too small and not already resizing, creates next table and + # transfers bins. Rechecks occupancy after a transfer to see if another + # resize is already needed because resizings are lagging additions. + def check_for_resize + while (current_table = table) && MAX_CAPACITY > (table_size = current_table.size) && NOW_RESIZING != (size_ctrl = size_control) && size_ctrl < @counter.sum + try_in_resize_lock(current_table, size_ctrl) do + self.table = rebuild(current_table) + (table_size << 1) - (table_size >> 1) # 75% load factor + end + end + end + + def try_in_resize_lock(current_table, size_ctrl) + if cas_size_control(size_ctrl, NOW_RESIZING) + begin + if current_table == table # recheck under lock + size_ctrl = yield # get new size_control + end + ensure + self.size_control = size_ctrl + end + end + end + + # Moves and/or copies the nodes in each bin to new table. See above for explanation. + def rebuild(table) + old_table_size = table.size + new_table = table.next_in_size_table + # puts "#{old_table_size} -> #{new_table.size}" + forwarder = Node.new(MOVED, new_table, NULL) + rev_forwarder = nil + locked_indexes = nil # holds bins to revisit; nil until needed + locked_arr_idx = 0 + bin = old_table_size - 1 + i = bin + while true + if !(node = table.volatile_get(i)) + # no lock needed (or available) if bin >= 0, because we're not popping values from locked_indexes until we've run through the whole table + redo unless (bin >= 0 ? table.cas(i, nil, forwarder) : lock_and_clean_up_reverse_forwarders(table, old_table_size, new_table, i, forwarder)) + elsif Node.locked_hash?(node_hash = node.hash) + locked_indexes ||= Array.new + if bin < 0 && locked_arr_idx > 0 + locked_arr_idx -= 1 + i, locked_indexes[locked_arr_idx] = locked_indexes[locked_arr_idx], i # swap with another bin + redo + end + if bin < 0 || locked_indexes.size >= TRANSFER_BUFFER_SIZE + node.try_await_lock(table, i) # no other options -- block + redo + end + rev_forwarder ||= Node.new(MOVED, table, NULL) + redo unless table.volatile_get(i) == node && node.locked? # recheck before adding to list + locked_indexes << i + new_table.volatile_set(i, rev_forwarder) + new_table.volatile_set(i + old_table_size, rev_forwarder) + else + redo unless split_old_bin(table, new_table, i, node, node_hash, forwarder) + end + + if bin > 0 + i = (bin -= 1) + elsif locked_indexes && !locked_indexes.empty? + bin = -1 + i = locked_indexes.pop + locked_arr_idx = locked_indexes.size - 1 + else + return new_table + end + end + end + + def lock_and_clean_up_reverse_forwarders(old_table, old_table_size, new_table, i, forwarder) + # transiently use a locked forwarding node + locked_forwarder = Node.new(moved_locked_hash = MOVED | LOCKED, new_table, NULL) + if old_table.cas(i, nil, locked_forwarder) + new_table.volatile_set(i, nil) # kill the potential reverse forwarders + new_table.volatile_set(i + old_table_size, nil) # kill the potential reverse forwarders + old_table.volatile_set(i, forwarder) + locked_forwarder.unlock_via_hash(moved_locked_hash, MOVED) + true + end + end + + # Splits a normal bin with list headed by e into lo and hi parts; installs in given table. + def split_old_bin(table, new_table, i, node, node_hash, forwarder) + table.try_lock_via_hash(i, node, node_hash) do + split_bin(new_table, i, node, node_hash) + table.volatile_set(i, forwarder) + end + end + + def split_bin(new_table, i, node, node_hash) + bit = new_table.size >> 1 # bit to split on + run_bit = node_hash & bit + last_run = nil + low = nil + high = nil + current_node = node + # this optimises for the lowest amount of volatile writes and objects created + while current_node = current_node.next + unless (b = current_node.hash & bit) == run_bit + run_bit = b + last_run = current_node + end + end + if run_bit == 0 + low = last_run + else + high = last_run + end + current_node = node + until current_node == last_run + pure_hash = current_node.pure_hash + if (pure_hash & bit) == 0 + low = Node.new(pure_hash, current_node.key, current_node.value, low) + else + high = Node.new(pure_hash, current_node.key, current_node.value, high) + end + current_node = current_node.next + end + new_table.volatile_set(i, low) + new_table.volatile_set(i + bit, high) + end + + def increment_size + @counter.increment + end + + def decrement_size(by = 1) + @counter.add(-by) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/mri_map_backend.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/mri_map_backend.rb new file mode 100644 index 0000000..d5d809d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/mri_map_backend.rb @@ -0,0 +1,66 @@ +require 'thread' +require 'concurrent/collection/map/non_concurrent_map_backend' + +module Concurrent + + # @!visibility private + module Collection + + # @!visibility private + class MriMapBackend < NonConcurrentMapBackend + + def initialize(options = nil) + super(options) + @write_lock = Mutex.new + end + + def []=(key, value) + @write_lock.synchronize { super } + end + + def compute_if_absent(key) + if stored_value = _get(key) # fast non-blocking path for the most likely case + stored_value + else + @write_lock.synchronize { super } + end + end + + def compute_if_present(key) + @write_lock.synchronize { super } + end + + def compute(key) + @write_lock.synchronize { super } + end + + def merge_pair(key, value) + @write_lock.synchronize { super } + end + + def replace_pair(key, old_value, new_value) + @write_lock.synchronize { super } + end + + def replace_if_exists(key, new_value) + @write_lock.synchronize { super } + end + + def get_and_set(key, value) + @write_lock.synchronize { super } + end + + def delete(key) + @write_lock.synchronize { super } + end + + def delete_pair(key, value) + @write_lock.synchronize { super } + end + + def clear + @write_lock.synchronize { super } + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb new file mode 100644 index 0000000..ba86d7c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb @@ -0,0 +1,141 @@ +require 'concurrent/constants' + +module Concurrent + + # @!visibility private + module Collection + + # @!visibility private + class NonConcurrentMapBackend + + # WARNING: all public methods of the class must operate on the @backend + # directly without calling each other. This is important because of the + # SynchronizedMapBackend which uses a non-reentrant mutex for perfomance + # reasons. + def initialize(options = nil) + @backend = {} + end + + def [](key) + @backend[key] + end + + def []=(key, value) + @backend[key] = value + end + + def compute_if_absent(key) + if NULL != (stored_value = @backend.fetch(key, NULL)) + stored_value + else + @backend[key] = yield + end + end + + def replace_pair(key, old_value, new_value) + if pair?(key, old_value) + @backend[key] = new_value + true + else + false + end + end + + def replace_if_exists(key, new_value) + if NULL != (stored_value = @backend.fetch(key, NULL)) + @backend[key] = new_value + stored_value + end + end + + def compute_if_present(key) + if NULL != (stored_value = @backend.fetch(key, NULL)) + store_computed_value(key, yield(stored_value)) + end + end + + def compute(key) + store_computed_value(key, yield(@backend[key])) + end + + def merge_pair(key, value) + if NULL == (stored_value = @backend.fetch(key, NULL)) + @backend[key] = value + else + store_computed_value(key, yield(stored_value)) + end + end + + def get_and_set(key, value) + stored_value = @backend[key] + @backend[key] = value + stored_value + end + + def key?(key) + @backend.key?(key) + end + + def delete(key) + @backend.delete(key) + end + + def delete_pair(key, value) + if pair?(key, value) + @backend.delete(key) + true + else + false + end + end + + def clear + @backend.clear + self + end + + def each_pair + return enum_for :each_pair unless block_given? + dupped_backend.each_pair do |k, v| + yield k, v + end + self + end + + def size + @backend.size + end + + def get_or_default(key, default_value) + @backend.fetch(key, default_value) + end + + alias_method :_get, :[] + alias_method :_set, :[]= + private :_get, :_set + private + def initialize_copy(other) + super + @backend = {} + self + end + + def dupped_backend + @backend.dup + end + + def pair?(key, expected_value) + NULL != (stored_value = @backend.fetch(key, NULL)) && expected_value.equal?(stored_value) + end + + def store_computed_value(key, new_value) + if new_value.nil? + @backend.delete(key) + nil + else + @backend[key] = new_value + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/synchronized_map_backend.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/synchronized_map_backend.rb new file mode 100644 index 0000000..190c8d9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/map/synchronized_map_backend.rb @@ -0,0 +1,82 @@ +require 'concurrent/collection/map/non_concurrent_map_backend' + +module Concurrent + + # @!visibility private + module Collection + + # @!visibility private + class SynchronizedMapBackend < NonConcurrentMapBackend + + require 'mutex_m' + include Mutex_m + # WARNING: Mutex_m is a non-reentrant lock, so the synchronized methods are + # not allowed to call each other. + + def [](key) + synchronize { super } + end + + def []=(key, value) + synchronize { super } + end + + def compute_if_absent(key) + synchronize { super } + end + + def compute_if_present(key) + synchronize { super } + end + + def compute(key) + synchronize { super } + end + + def merge_pair(key, value) + synchronize { super } + end + + def replace_pair(key, old_value, new_value) + synchronize { super } + end + + def replace_if_exists(key, new_value) + synchronize { super } + end + + def get_and_set(key, value) + synchronize { super } + end + + def key?(key) + synchronize { super } + end + + def delete(key) + synchronize { super } + end + + def delete_pair(key, value) + synchronize { super } + end + + def clear + synchronize { super } + end + + def size + synchronize { super } + end + + def get_or_default(key, default_value) + synchronize { super } + end + + private + def dupped_backend + synchronize { super } + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/non_concurrent_priority_queue.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/non_concurrent_priority_queue.rb new file mode 100644 index 0000000..d043340 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/non_concurrent_priority_queue.rb @@ -0,0 +1,143 @@ +require 'concurrent/collection/java_non_concurrent_priority_queue' +require 'concurrent/collection/ruby_non_concurrent_priority_queue' +require 'concurrent/utility/engine' + +module Concurrent + module Collection + + # @!visibility private + # @!macro internal_implementation_note + NonConcurrentPriorityQueueImplementation = case + when Concurrent.on_jruby? + JavaNonConcurrentPriorityQueue + else + RubyNonConcurrentPriorityQueue + end + private_constant :NonConcurrentPriorityQueueImplementation + + # @!macro [attach] priority_queue + # + # A queue collection in which the elements are sorted based on their + # comparison (spaceship) operator `<=>`. Items are added to the queue + # at a position relative to their priority. On removal the element + # with the "highest" priority is removed. By default the sort order is + # from highest to lowest, but a lowest-to-highest sort order can be + # set on construction. + # + # The API is based on the `Queue` class from the Ruby standard library. + # + # The pure Ruby implementation, `RubyNonConcurrentPriorityQueue` uses a heap algorithm + # stored in an array. The algorithm is based on the work of Robert Sedgewick + # and Kevin Wayne. + # + # The JRuby native implementation is a thin wrapper around the standard + # library `java.util.NonConcurrentPriorityQueue`. + # + # When running under JRuby the class `NonConcurrentPriorityQueue` extends `JavaNonConcurrentPriorityQueue`. + # When running under all other interpreters it extends `RubyNonConcurrentPriorityQueue`. + # + # @note This implementation is *not* thread safe. + # + # @see http://en.wikipedia.org/wiki/Priority_queue + # @see http://ruby-doc.org/stdlib-2.0.0/libdoc/thread/rdoc/Queue.html + # + # @see http://algs4.cs.princeton.edu/24pq/index.php#2.6 + # @see http://algs4.cs.princeton.edu/24pq/MaxPQ.java.html + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html + # + # @!visibility private + class NonConcurrentPriorityQueue < NonConcurrentPriorityQueueImplementation + + alias_method :has_priority?, :include? + + alias_method :size, :length + + alias_method :deq, :pop + alias_method :shift, :pop + + alias_method :<<, :push + alias_method :enq, :push + + # @!method initialize(opts = {}) + # @!macro [new] priority_queue_method_initialize + # + # Create a new priority queue with no items. + # + # @param [Hash] opts the options for creating the queue + # @option opts [Symbol] :order (:max) dictates the order in which items are + # stored: from highest to lowest when `:max` or `:high`; from lowest to + # highest when `:min` or `:low` + + # @!method clear + # @!macro [new] priority_queue_method_clear + # + # Removes all of the elements from this priority queue. + + # @!method delete(item) + # @!macro [new] priority_queue_method_delete + # + # Deletes all items from `self` that are equal to `item`. + # + # @param [Object] item the item to be removed from the queue + # @return [Object] true if the item is found else false + + # @!method empty? + # @!macro [new] priority_queue_method_empty + # + # Returns `true` if `self` contains no elements. + # + # @return [Boolean] true if there are no items in the queue else false + + # @!method include?(item) + # @!macro [new] priority_queue_method_include + # + # Returns `true` if the given item is present in `self` (that is, if any + # element == `item`), otherwise returns false. + # + # @param [Object] item the item to search for + # + # @return [Boolean] true if the item is found else false + + # @!method length + # @!macro [new] priority_queue_method_length + # + # The current length of the queue. + # + # @return [Fixnum] the number of items in the queue + + # @!method peek + # @!macro [new] priority_queue_method_peek + # + # Retrieves, but does not remove, the head of this queue, or returns `nil` + # if this queue is empty. + # + # @return [Object] the head of the queue or `nil` when empty + + # @!method pop + # @!macro [new] priority_queue_method_pop + # + # Retrieves and removes the head of this queue, or returns `nil` if this + # queue is empty. + # + # @return [Object] the head of the queue or `nil` when empty + + # @!method push(item) + # @!macro [new] priority_queue_method_push + # + # Inserts the specified element into this priority queue. + # + # @param [Object] item the item to insert onto the queue + + # @!method self.from_list(list, opts = {}) + # @!macro [new] priority_queue_method_from_list + # + # Create a new priority queue from the given list. + # + # @param [Enumerable] list the list to build the queue from + # @param [Hash] opts the options for creating the queue + # + # @return [NonConcurrentPriorityQueue] the newly created and populated queue + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/ruby_non_concurrent_priority_queue.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/ruby_non_concurrent_priority_queue.rb new file mode 100644 index 0000000..bdf3cba --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/collection/ruby_non_concurrent_priority_queue.rb @@ -0,0 +1,150 @@ +module Concurrent + module Collection + + # @!macro priority_queue + # + # @!visibility private + # @!macro internal_implementation_note + class RubyNonConcurrentPriorityQueue + + # @!macro priority_queue_method_initialize + def initialize(opts = {}) + order = opts.fetch(:order, :max) + @comparator = [:min, :low].include?(order) ? -1 : 1 + clear + end + + # @!macro priority_queue_method_clear + def clear + @queue = [nil] + @length = 0 + true + end + + # @!macro priority_queue_method_delete + def delete(item) + return false if empty? + original_length = @length + k = 1 + while k <= @length + if @queue[k] == item + swap(k, @length) + @length -= 1 + sink(k) + @queue.pop + else + k += 1 + end + end + @length != original_length + end + + # @!macro priority_queue_method_empty + def empty? + size == 0 + end + + # @!macro priority_queue_method_include + def include?(item) + @queue.include?(item) + end + alias_method :has_priority?, :include? + + # @!macro priority_queue_method_length + def length + @length + end + alias_method :size, :length + + # @!macro priority_queue_method_peek + def peek + empty? ? nil : @queue[1] + end + + # @!macro priority_queue_method_pop + def pop + return nil if empty? + max = @queue[1] + swap(1, @length) + @length -= 1 + sink(1) + @queue.pop + max + end + alias_method :deq, :pop + alias_method :shift, :pop + + # @!macro priority_queue_method_push + def push(item) + raise ArgumentError.new('cannot enqueue nil') if item.nil? + @length += 1 + @queue << item + swim(@length) + true + end + alias_method :<<, :push + alias_method :enq, :push + + # @!macro priority_queue_method_from_list + def self.from_list(list, opts = {}) + queue = new(opts) + list.each{|item| queue << item } + queue + end + + private + + # Exchange the values at the given indexes within the internal array. + # + # @param [Integer] x the first index to swap + # @param [Integer] y the second index to swap + # + # @!visibility private + def swap(x, y) + temp = @queue[x] + @queue[x] = @queue[y] + @queue[y] = temp + end + + # Are the items at the given indexes ordered based on the priority + # order specified at construction? + # + # @param [Integer] x the first index from which to retrieve a comparable value + # @param [Integer] y the second index from which to retrieve a comparable value + # + # @return [Boolean] true if the two elements are in the correct priority order + # else false + # + # @!visibility private + def ordered?(x, y) + (@queue[x] <=> @queue[y]) == @comparator + end + + # Percolate down to maintain heap invariant. + # + # @param [Integer] k the index at which to start the percolation + # + # @!visibility private + def sink(k) + while (j = (2 * k)) <= @length do + j += 1 if j < @length && ! ordered?(j, j+1) + break if ordered?(k, j) + swap(k, j) + k = j + end + end + + # Percolate up to maintain heap invariant. + # + # @param [Integer] k the index at which to start the percolation + # + # @!visibility private + def swim(k) + while k > 1 && ! ordered?(k/2, k) do + swap(k, k/2) + k = k/2 + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/deprecation.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/deprecation.rb new file mode 100644 index 0000000..35ae4b2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/deprecation.rb @@ -0,0 +1,34 @@ +require 'concurrent/concern/logging' + +module Concurrent + module Concern + + # @!visibility private + # @!macro internal_implementation_note + module Deprecation + # TODO require additional parameter: a version. Display when it'll be removed based on that. Error if not removed. + include Concern::Logging + + def deprecated(message, strip = 2) + caller_line = caller(strip).first if strip > 0 + klass = if Module === self + self + else + self.class + end + message = if strip > 0 + format("[DEPRECATED] %s\ncalled on: %s", message, caller_line) + else + format('[DEPRECATED] %s', message) + end + log WARN, klass.to_s, message + end + + def deprecated_method(old_name, new_name) + deprecated "`#{old_name}` is deprecated and it'll removed in next release, use `#{new_name}` instead", 3 + end + + extend self + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/dereferenceable.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/dereferenceable.rb new file mode 100644 index 0000000..b58d2ce --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/dereferenceable.rb @@ -0,0 +1,73 @@ +module Concurrent + module Concern + + # Object references in Ruby are mutable. This can lead to serious problems when + # the `#value` of a concurrent object is a mutable reference. Which is always the + # case unless the value is a `Fixnum`, `Symbol`, or similar "primitive" data type. + # Most classes in this library that expose a `#value` getter method do so using the + # `Dereferenceable` mixin module. + # + # @!macro copy_options + module Dereferenceable + # NOTE: This module is going away in 2.0. In the mean time we need it to + # play nicely with the synchronization layer. This means that the + # including class SHOULD be synchronized and it MUST implement a + # `#synchronize` method. Not doing so will lead to runtime errors. + + # Return the value this object represents after applying the options specified + # by the `#set_deref_options` method. + # + # @return [Object] the current value of the object + def value + synchronize { apply_deref_options(@value) } + end + alias_method :deref, :value + + protected + + # Set the internal value of this object + # + # @param [Object] value the new value + def value=(value) + synchronize{ @value = value } + end + + # @!macro [attach] dereferenceable_set_deref_options + # Set the options which define the operations #value performs before + # returning data to the caller (dereferencing). + # + # @note Most classes that include this module will call `#set_deref_options` + # from within the constructor, thus allowing these options to be set at + # object creation. + # + # @param [Hash] opts the options defining dereference behavior. + # @option opts [String] :dup_on_deref (false) call `#dup` before returning the data + # @option opts [String] :freeze_on_deref (false) call `#freeze` before returning the data + # @option opts [String] :copy_on_deref (nil) call the given `Proc` passing + # the internal value and returning the value returned from the proc + def set_deref_options(opts = {}) + synchronize{ ns_set_deref_options(opts) } + end + + # @!macro dereferenceable_set_deref_options + # @!visibility private + def ns_set_deref_options(opts) + @dup_on_deref = opts[:dup_on_deref] || opts[:dup] + @freeze_on_deref = opts[:freeze_on_deref] || opts[:freeze] + @copy_on_deref = opts[:copy_on_deref] || opts[:copy] + @do_nothing_on_deref = !(@dup_on_deref || @freeze_on_deref || @copy_on_deref) + nil + end + + # @!visibility private + def apply_deref_options(value) + return nil if value.nil? + return value if @do_nothing_on_deref + value = @copy_on_deref.call(value) if @copy_on_deref + value = value.dup if @dup_on_deref + value = value.freeze if @freeze_on_deref + value + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/logging.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/logging.rb new file mode 100644 index 0000000..a11a2a8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/logging.rb @@ -0,0 +1,27 @@ +require 'logger' + +module Concurrent + module Concern + + # Include where logging is needed + # + # @!visibility private + module Logging + include Logger::Severity + + # Logs through {Concurrent.global_logger}, it can be overridden by setting @logger + # @param [Integer] level one of Logger::Severity constants + # @param [String] progname e.g. a path of an Actor + # @param [String, nil] message when nil block is used to generate the message + # @yieldreturn [String] a message + def log(level, progname, message = nil, &block) + #NOTE: Cannot require 'concurrent/configuration' above due to circular references. + # Assume that the gem has been initialized if we've gotten this far. + (@logger || Concurrent.global_logger).call level, progname, message, &block + rescue => error + $stderr.puts "`Concurrent.configuration.logger` failed to log #{[level, progname, message, block]}\n" + + "#{error.message} (#{error.class})\n#{error.backtrace.join "\n"}" + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/obligation.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/obligation.rb new file mode 100644 index 0000000..2c9ac12 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/obligation.rb @@ -0,0 +1,220 @@ +require 'thread' +require 'timeout' + +require 'concurrent/atomic/event' +require 'concurrent/concern/dereferenceable' + +module Concurrent + module Concern + + module Obligation + include Concern::Dereferenceable + # NOTE: The Dereferenceable module is going away in 2.0. In the mean time + # we need it to place nicely with the synchronization layer. This means + # that the including class SHOULD be synchronized and it MUST implement a + # `#synchronize` method. Not doing so will lead to runtime errors. + + # Has the obligation been fulfilled? + # + # @return [Boolean] + def fulfilled? + state == :fulfilled + end + alias_method :realized?, :fulfilled? + + # Has the obligation been rejected? + # + # @return [Boolean] + def rejected? + state == :rejected + end + + # Is obligation completion still pending? + # + # @return [Boolean] + def pending? + state == :pending + end + + # Is the obligation still unscheduled? + # + # @return [Boolean] + def unscheduled? + state == :unscheduled + end + + # Has the obligation completed processing? + # + # @return [Boolean] + def complete? + [:fulfilled, :rejected].include? state + end + + # Is the obligation still awaiting completion of processing? + # + # @return [Boolean] + def incomplete? + ! complete? + end + + # The current value of the obligation. Will be `nil` while the state is + # pending or the operation has been rejected. + # + # @param [Numeric] timeout the maximum time in seconds to wait. + # @return [Object] see Dereferenceable#deref + def value(timeout = nil) + wait timeout + deref + end + + # Wait until obligation is complete or the timeout has been reached. + # + # @param [Numeric] timeout the maximum time in seconds to wait. + # @return [Obligation] self + def wait(timeout = nil) + event.wait(timeout) if timeout != 0 && incomplete? + self + end + + # Wait until obligation is complete or the timeout is reached. Will re-raise + # any exceptions raised during processing (but will not raise an exception + # on timeout). + # + # @param [Numeric] timeout the maximum time in seconds to wait. + # @return [Obligation] self + # @raise [Exception] raises the reason when rejected + def wait!(timeout = nil) + wait(timeout).tap { raise self if rejected? } + end + alias_method :no_error!, :wait! + + # The current value of the obligation. Will be `nil` while the state is + # pending or the operation has been rejected. Will re-raise any exceptions + # raised during processing (but will not raise an exception on timeout). + # + # @param [Numeric] timeout the maximum time in seconds to wait. + # @return [Object] see Dereferenceable#deref + # @raise [Exception] raises the reason when rejected + def value!(timeout = nil) + wait(timeout) + if rejected? + raise self + else + deref + end + end + + # The current state of the obligation. + # + # @return [Symbol] the current state + def state + synchronize { @state } + end + + # If an exception was raised during processing this will return the + # exception object. Will return `nil` when the state is pending or if + # the obligation has been successfully fulfilled. + # + # @return [Exception] the exception raised during processing or `nil` + def reason + synchronize { @reason } + end + + # @example allows Obligation to be risen + # rejected_ivar = Ivar.new.fail + # raise rejected_ivar + def exception(*args) + raise 'obligation is not rejected' unless rejected? + reason.exception(*args) + end + + protected + + # @!visibility private + def get_arguments_from(opts = {}) + [*opts.fetch(:args, [])] + end + + # @!visibility private + def init_obligation + @event = Event.new + @value = @reason = nil + end + + # @!visibility private + def event + @event + end + + # @!visibility private + def set_state(success, value, reason) + if success + @value = value + @state = :fulfilled + else + @reason = reason + @state = :rejected + end + end + + # @!visibility private + def state=(value) + synchronize { ns_set_state(value) } + end + + # Atomic compare and set operation + # State is set to `next_state` only if `current state == expected_current`. + # + # @param [Symbol] next_state + # @param [Symbol] expected_current + # + # @return [Boolean] true is state is changed, false otherwise + # + # @!visibility private + def compare_and_set_state(next_state, *expected_current) + synchronize do + if expected_current.include? @state + @state = next_state + true + else + false + end + end + end + + # Executes the block within mutex if current state is included in expected_states + # + # @return block value if executed, false otherwise + # + # @!visibility private + def if_state(*expected_states) + synchronize do + raise ArgumentError.new('no block given') unless block_given? + + if expected_states.include? @state + yield + else + false + end + end + end + + protected + + # Am I in the current state? + # + # @param [Symbol] expected The state to check against + # @return [Boolean] true if in the expected state else false + # + # @!visibility private + def ns_check_state?(expected) + @state == expected + end + + # @!visibility private + def ns_set_state(value) + @state = value + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/observable.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/observable.rb new file mode 100644 index 0000000..13a3090 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/concern/observable.rb @@ -0,0 +1,110 @@ +require 'concurrent/collection/copy_on_notify_observer_set' +require 'concurrent/collection/copy_on_write_observer_set' + +module Concurrent + module Concern + + # The [observer pattern](http://en.wikipedia.org/wiki/Observer_pattern) is one + # of the most useful design patterns. + # + # The workflow is very simple: + # - an `observer` can register itself to a `subject` via a callback + # - many `observers` can be registered to the same `subject` + # - the `subject` notifies all registered observers when its status changes + # - an `observer` can deregister itself when is no more interested to receive + # event notifications + # + # In a single threaded environment the whole pattern is very easy: the + # `subject` can use a simple data structure to manage all its subscribed + # `observer`s and every `observer` can react directly to every event without + # caring about synchronization. + # + # In a multi threaded environment things are more complex. The `subject` must + # synchronize the access to its data structure and to do so currently we're + # using two specialized ObserverSet: {Concurrent::Concern::CopyOnWriteObserverSet} + # and {Concurrent::Concern::CopyOnNotifyObserverSet}. + # + # When implementing and `observer` there's a very important rule to remember: + # **there are no guarantees about the thread that will execute the callback** + # + # Let's take this example + # ``` + # class Observer + # def initialize + # @count = 0 + # end + # + # def update + # @count += 1 + # end + # end + # + # obs = Observer.new + # [obj1, obj2, obj3, obj4].each { |o| o.add_observer(obs) } + # # execute [obj1, obj2, obj3, obj4] + # ``` + # + # `obs` is wrong because the variable `@count` can be accessed by different + # threads at the same time, so it should be synchronized (using either a Mutex + # or an AtomicFixum) + module Observable + + # @!macro [attach] observable_add_observer + # + # Adds an observer to this set. If a block is passed, the observer will be + # created by this method and no other params should be passed. + # + # @param [Object] observer the observer to add + # @param [Symbol] func the function to call on the observer during notification. + # Default is :update + # @return [Object] the added observer + def add_observer(observer = nil, func = :update, &block) + observers.add_observer(observer, func, &block) + end + + # As `#add_observer` but can be used for chaining. + # + # @param [Object] observer the observer to add + # @param [Symbol] func the function to call on the observer during notification. + # @return [Observable] self + def with_observer(observer = nil, func = :update, &block) + add_observer(observer, func, &block) + self + end + + # @!macro [attach] observable_delete_observer + # + # Remove `observer` as an observer on this object so that it will no + # longer receive notifications. + # + # @param [Object] observer the observer to remove + # @return [Object] the deleted observer + def delete_observer(observer) + observers.delete_observer(observer) + end + + # @!macro [attach] observable_delete_observers + # + # Remove all observers associated with this object. + # + # @return [Observable] self + def delete_observers + observers.delete_observers + self + end + + # @!macro [attach] observable_count_observers + # + # Return the number of observers associated with this object. + # + # @return [Integer] the observers count + def count_observers + observers.count_observers + end + + protected + + attr_accessor :observers + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/configuration.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/configuration.rb new file mode 100644 index 0000000..01ec343 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/configuration.rb @@ -0,0 +1,188 @@ +require 'thread' +require 'concurrent/delay' +require 'concurrent/errors' +require 'concurrent/atomic/atomic_reference' +require 'concurrent/concern/logging' +require 'concurrent/executor/immediate_executor' +require 'concurrent/utility/at_exit' +require 'concurrent/utility/processor_counter' + +module Concurrent + extend Concern::Logging + + autoload :Options, 'concurrent/options' + autoload :TimerSet, 'concurrent/executor/timer_set' + autoload :ThreadPoolExecutor, 'concurrent/executor/thread_pool_executor' + + # @return [Logger] Logger with provided level and output. + def self.create_simple_logger(level = Logger::FATAL, output = $stderr) + # TODO (pitr-ch 24-Dec-2016): figure out why it had to be replaced, stdlogger was deadlocking + lambda do |severity, progname, message = nil, &block| + return false if severity < level + + message = block ? block.call : message + formatted_message = case message + when String + message + when Exception + format "%s (%s)\n%s", + message.message, message.class, (message.backtrace || []).join("\n") + else + message.inspect + end + + output.print format "[%s] %5s -- %s: %s\n", + Time.now.strftime('%Y-%m-%d %H:%M:%S.%L'), + Logger::SEV_LABEL[severity], + progname, + formatted_message + true + end + end + + # Use logger created by #create_simple_logger to log concurrent-ruby messages. + def self.use_simple_logger(level = Logger::FATAL, output = $stderr) + Concurrent.global_logger = create_simple_logger level, output + end + + # @return [Logger] Logger with provided level and output. + # @deprecated + def self.create_stdlib_logger(level = Logger::FATAL, output = $stderr) + logger = Logger.new(output) + logger.level = level + logger.formatter = lambda do |severity, datetime, progname, msg| + formatted_message = case msg + when String + msg + when Exception + format "%s (%s)\n%s", + msg.message, msg.class, (msg.backtrace || []).join("\n") + else + msg.inspect + end + format "[%s] %5s -- %s: %s\n", + datetime.strftime('%Y-%m-%d %H:%M:%S.%L'), + severity, + progname, + formatted_message + end + + lambda do |loglevel, progname, message = nil, &block| + logger.add loglevel, message, progname, &block + end + end + + # Use logger created by #create_stdlib_logger to log concurrent-ruby messages. + # @deprecated + def self.use_stdlib_logger(level = Logger::FATAL, output = $stderr) + Concurrent.global_logger = create_stdlib_logger level, output + end + + # TODO (pitr-ch 27-Dec-2016): remove deadlocking stdlib_logger methods + + # Suppresses all output when used for logging. + NULL_LOGGER = lambda { |level, progname, message = nil, &block| } + + # @!visibility private + GLOBAL_LOGGER = AtomicReference.new(create_simple_logger(Logger::WARN)) + private_constant :GLOBAL_LOGGER + + def self.global_logger + GLOBAL_LOGGER.value + end + + def self.global_logger=(value) + GLOBAL_LOGGER.value = value + end + + # @!visibility private + GLOBAL_FAST_EXECUTOR = Delay.new { Concurrent.new_fast_executor(auto_terminate: true) } + private_constant :GLOBAL_FAST_EXECUTOR + + # @!visibility private + GLOBAL_IO_EXECUTOR = Delay.new { Concurrent.new_io_executor(auto_terminate: true) } + private_constant :GLOBAL_IO_EXECUTOR + + # @!visibility private + GLOBAL_TIMER_SET = Delay.new { TimerSet.new(auto_terminate: true) } + private_constant :GLOBAL_TIMER_SET + + # @!visibility private + GLOBAL_IMMEDIATE_EXECUTOR = ImmediateExecutor.new + private_constant :GLOBAL_IMMEDIATE_EXECUTOR + + # Disables AtExit handlers including pool auto-termination handlers. + # When disabled it will be the application programmer's responsibility + # to ensure that the handlers are shutdown properly prior to application + # exit by calling {AtExit.run} method. + # + # @note this option should be needed only because of `at_exit` ordering + # issues which may arise when running some of the testing frameworks. + # E.g. Minitest's test-suite runs itself in `at_exit` callback which + # executes after the pools are already terminated. Then auto termination + # needs to be disabled and called manually after test-suite ends. + # @note This method should *never* be called + # from within a gem. It should *only* be used from within the main + # application and even then it should be used only when necessary. + # @see AtExit + def self.disable_at_exit_handlers! + AtExit.enabled = false + end + + # Global thread pool optimized for short, fast *operations*. + # + # @return [ThreadPoolExecutor] the thread pool + def self.global_fast_executor + GLOBAL_FAST_EXECUTOR.value + end + + # Global thread pool optimized for long, blocking (IO) *tasks*. + # + # @return [ThreadPoolExecutor] the thread pool + def self.global_io_executor + GLOBAL_IO_EXECUTOR.value + end + + def self.global_immediate_executor + GLOBAL_IMMEDIATE_EXECUTOR + end + + # Global thread pool user for global *timers*. + # + # @return [Concurrent::TimerSet] the thread pool + def self.global_timer_set + GLOBAL_TIMER_SET.value + end + + # General access point to global executors. + # @param [Symbol, Executor] executor_identifier symbols: + # - :fast - {Concurrent.global_fast_executor} + # - :io - {Concurrent.global_io_executor} + # - :immediate - {Concurrent.global_immediate_executor} + # @return [Executor] + def self.executor(executor_identifier) + Options.executor(executor_identifier) + end + + def self.new_fast_executor(opts = {}) + FixedThreadPool.new( + [2, Concurrent.processor_count].max, + auto_terminate: opts.fetch(:auto_terminate, true), + idletime: 60, # 1 minute + max_queue: 0, # unlimited + fallback_policy: :abort # shouldn't matter -- 0 max queue + ) + end + + def self.new_io_executor(opts = {}) + ThreadPoolExecutor.new( + min_threads: [2, Concurrent.processor_count].max, + max_threads: ThreadPoolExecutor::DEFAULT_MAX_POOL_SIZE, + # max_threads: 1000, + auto_terminate: opts.fetch(:auto_terminate, true), + idletime: 60, # 1 minute + max_queue: 0, # unlimited + fallback_policy: :abort # shouldn't matter -- 0 max queue + ) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/constants.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/constants.rb new file mode 100644 index 0000000..4f9bedf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/constants.rb @@ -0,0 +1,8 @@ +module Concurrent + + # Various classes within allows for +nil+ values to be stored, + # so a special +NULL+ token is required to indicate the "nil-ness". + # @!visibility private + NULL = Object.new + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/dataflow.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/dataflow.rb new file mode 100644 index 0000000..5d4a4d4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/dataflow.rb @@ -0,0 +1,80 @@ +require 'concurrent/future' +require 'concurrent/atomic/atomic_fixnum' + +module Concurrent + + # @!visibility private + class DependencyCounter # :nodoc: + + def initialize(count, &block) + @counter = AtomicFixnum.new(count) + @block = block + end + + def update(time, value, reason) + if @counter.decrement == 0 + @block.call + end + end + end + + # {include:file:doc/dataflow.md} + # + # @param [Future] inputs zero or more `Future` operations that this dataflow depends upon + # + # @yield The operation to perform once all the dependencies are met + # @yieldparam [Future] inputs each of the `Future` inputs to the dataflow + # @yieldreturn [Object] the result of the block operation + # + # @return [Object] the result of all the operations + # + # @raise [ArgumentError] if no block is given + # @raise [ArgumentError] if any of the inputs are not `IVar`s + def dataflow(*inputs, &block) + dataflow_with(Concurrent.global_io_executor, *inputs, &block) + end + module_function :dataflow + + def dataflow_with(executor, *inputs, &block) + call_dataflow(:value, executor, *inputs, &block) + end + module_function :dataflow_with + + def dataflow!(*inputs, &block) + dataflow_with!(Concurrent.global_io_executor, *inputs, &block) + end + module_function :dataflow! + + def dataflow_with!(executor, *inputs, &block) + call_dataflow(:value!, executor, *inputs, &block) + end + module_function :dataflow_with! + + private + + def call_dataflow(method, executor, *inputs, &block) + raise ArgumentError.new('an executor must be provided') if executor.nil? + raise ArgumentError.new('no block given') unless block_given? + unless inputs.all? { |input| input.is_a? IVar } + raise ArgumentError.new("Not all dependencies are IVars.\nDependencies: #{ inputs.inspect }") + end + + result = Future.new(executor: executor) do + values = inputs.map { |input| input.send(method) } + block.call(*values) + end + + if inputs.empty? + result.execute + else + counter = DependencyCounter.new(inputs.size) { result.execute } + + inputs.each do |input| + input.add_observer counter + end + end + + result + end + module_function :call_dataflow +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/delay.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/delay.rb new file mode 100644 index 0000000..655ab85 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/delay.rb @@ -0,0 +1,197 @@ +require 'thread' +require 'concurrent/concern/obligation' +require 'concurrent/executor/immediate_executor' +require 'concurrent/synchronization' + +module Concurrent + + # This file has circular require issues. It must be autoloaded here. + autoload :Options, 'concurrent/options' + + # Lazy evaluation of a block yielding an immutable result. Useful for + # expensive operations that may never be needed. It may be non-blocking, + # supports the `Concern::Obligation` interface, and accepts the injection of + # custom executor upon which to execute the block. Processing of + # block will be deferred until the first time `#value` is called. + # At that time the caller can choose to return immediately and let + # the block execute asynchronously, block indefinitely, or block + # with a timeout. + # + # When a `Delay` is created its state is set to `pending`. The value and + # reason are both `nil`. The first time the `#value` method is called the + # enclosed opration will be run and the calling thread will block. Other + # threads attempting to call `#value` will block as well. Once the operation + # is complete the *value* will be set to the result of the operation or the + # *reason* will be set to the raised exception, as appropriate. All threads + # blocked on `#value` will return. Subsequent calls to `#value` will immediately + # return the cached value. The operation will only be run once. This means that + # any side effects created by the operation will only happen once as well. + # + # `Delay` includes the `Concurrent::Concern::Dereferenceable` mixin to support thread + # safety of the reference returned by `#value`. + # + # @!macro copy_options + # + # @!macro [attach] delay_note_regarding_blocking + # @note The default behavior of `Delay` is to block indefinitely when + # calling either `value` or `wait`, executing the delayed operation on + # the current thread. This makes the `timeout` value completely + # irrelevant. To enable non-blocking behavior, use the `executor` + # constructor option. This will cause the delayed operation to be + # execute on the given executor, allowing the call to timeout. + # + # @see Concurrent::Concern::Dereferenceable + class Delay < Synchronization::LockableObject + include Concern::Obligation + + # NOTE: Because the global thread pools are lazy-loaded with these objects + # there is a performance hit every time we post a new task to one of these + # thread pools. Subsequently it is critical that `Delay` perform as fast + # as possible post-completion. This class has been highly optimized using + # the benchmark script `examples/lazy_and_delay.rb`. Do NOT attempt to + # DRY-up this class or perform other refactoring with running the + # benchmarks and ensuring that performance is not negatively impacted. + + # Create a new `Delay` in the `:pending` state. + # + # @!macro executor_and_deref_options + # + # @yield the delayed operation to perform + # + # @raise [ArgumentError] if no block is given + def initialize(opts = {}, &block) + raise ArgumentError.new('no block given') unless block_given? + super(&nil) + synchronize { ns_initialize(opts, &block) } + end + + # Return the value this object represents after applying the options + # specified by the `#set_deref_options` method. If the delayed operation + # raised an exception this method will return nil. The execption object + # can be accessed via the `#reason` method. + # + # @param [Numeric] timeout the maximum number of seconds to wait + # @return [Object] the current value of the object + # + # @!macro delay_note_regarding_blocking + def value(timeout = nil) + if @executor # TODO (pitr 12-Sep-2015): broken unsafe read? + super + else + # this function has been optimized for performance and + # should not be modified without running new benchmarks + synchronize do + execute = @computing = true unless @computing + if execute + begin + set_state(true, @task.call, nil) + rescue => ex + set_state(false, nil, ex) + end + end + end + if @do_nothing_on_deref + @value + else + apply_deref_options(@value) + end + end + end + + # Return the value this object represents after applying the options + # specified by the `#set_deref_options` method. If the delayed operation + # raised an exception, this method will raise that exception (even when) + # the operation has already been executed). + # + # @param [Numeric] timeout the maximum number of seconds to wait + # @return [Object] the current value of the object + # @raise [Exception] when `#rejected?` raises `#reason` + # + # @!macro delay_note_regarding_blocking + def value!(timeout = nil) + if @executor + super + else + result = value + raise @reason if @reason + result + end + end + + # Return the value this object represents after applying the options + # specified by the `#set_deref_options` method. + # + # @param [Integer] timeout (nil) the maximum number of seconds to wait for + # the value to be computed. When `nil` the caller will block indefinitely. + # + # @return [Object] self + # + # @!macro delay_note_regarding_blocking + def wait(timeout = nil) + if @executor + execute_task_once + super(timeout) + else + value + end + self + end + + # Reconfigures the block returning the value if still `#incomplete?` + # + # @yield the delayed operation to perform + # @return [true, false] if success + def reconfigure(&block) + synchronize do + raise ArgumentError.new('no block given') unless block_given? + unless @computing + @task = block + true + else + false + end + end + end + + protected + + def ns_initialize(opts, &block) + init_obligation + set_deref_options(opts) + @executor = opts[:executor] + + @task = block + @state = :pending + @computing = false + end + + private + + # @!visibility private + def execute_task_once # :nodoc: + # this function has been optimized for performance and + # should not be modified without running new benchmarks + execute = task = nil + synchronize do + execute = @computing = true unless @computing + task = @task + end + + if execute + executor = Options.executor_from_options(executor: @executor) + executor.post do + begin + result = task.call + success = true + rescue => ex + reason = ex + end + synchronize do + set_state(success, result, reason) + event.set + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/edge.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/edge.rb new file mode 100644 index 0000000..ac2a946 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/edge.rb @@ -0,0 +1,26 @@ +module Concurrent + + # A submodule for unstable, highly experimental features that are likely to + # change often and which may never become part of the core gem. Also for + # new, experimental version of abstractions already in the core gem. + # + # Most new features should start in this module, clearly indicating the + # experimental and unstable nature of the feature. Once a feature becomes + # more stable and is a candidate for inclusion in the core gem it should + # be moved up to the `Concurrent` module, where it would reside once merged + # into the core gem. + # + # The only exception to this is for features which *replace* features from + # the core gem in ways that are breaking and not backward compatible. These + # features should remain in this module until merged into the core gem. This + # will prevent namespace collisions. + # + # @!macro [attach] edge_warning + # @api Edge + # @note **Edge Feature:** Edge features are under active development and may change frequently. They are expected not to + # keep backward compatibility (there may also lack tests and documentation). Semantic versions will + # be obeyed though. Features developed in `concurrent-ruby-edge` are expected to move + # to `concurrent-ruby` when final. + module Edge + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/errors.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/errors.rb new file mode 100644 index 0000000..b69fec0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/errors.rb @@ -0,0 +1,69 @@ +module Concurrent + + Error = Class.new(StandardError) + + # Raised when errors occur during configuration. + ConfigurationError = Class.new(Error) + + # Raised when an asynchronous operation is cancelled before execution. + CancelledOperationError = Class.new(Error) + + # Raised when a lifecycle method (such as `stop`) is called in an improper + # sequence or when the object is in an inappropriate state. + LifecycleError = Class.new(Error) + + # Raised when an attempt is made to violate an immutability guarantee. + ImmutabilityError = Class.new(Error) + + # Raised when an operation is attempted which is not legal given the + # receiver's current state + IllegalOperationError = Class.new(Error) + + # Raised when an object's methods are called when it has not been + # properly initialized. + InitializationError = Class.new(Error) + + # Raised when an object with a start/stop lifecycle has been started an + # excessive number of times. Often used in conjunction with a restart + # policy or strategy. + MaxRestartFrequencyError = Class.new(Error) + + # Raised when an attempt is made to modify an immutable object + # (such as an `IVar`) after its final state has been set. + class MultipleAssignmentError < Error + attr_reader :inspection_data + + def initialize(message = nil, inspection_data = nil) + @inspection_data = inspection_data + super message + end + + def inspect + format '%s %s>', super[0..-2], @inspection_data.inspect + end + end + + # Raised by an `Executor` when it is unable to process a given task, + # possibly because of a reject policy or other internal error. + RejectedExecutionError = Class.new(Error) + + # Raised when any finite resource, such as a lock counter, exceeds its + # maximum limit/threshold. + ResourceLimitError = Class.new(Error) + + # Raised when an operation times out. + TimeoutError = Class.new(Error) + + # Aggregates multiple exceptions. + class MultipleErrors < Error + attr_reader :errors + + def initialize(errors, message = "#{errors.size} errors") + @errors = errors + super [*message, + *errors.map { |e| [format('%s (%s)', e.message, e.class), *e.backtrace] }.flatten(1) + ].join("\n") + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/exchanger.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/exchanger.rb new file mode 100644 index 0000000..e585381 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/exchanger.rb @@ -0,0 +1,356 @@ +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/maybe' +require 'concurrent/atomic/atomic_reference' +require 'concurrent/atomic/count_down_latch' +require 'concurrent/utility/engine' +require 'concurrent/utility/monotonic_time' + +module Concurrent + + # @!macro [attach] exchanger + # + # A synchronization point at which threads can pair and swap elements within + # pairs. Each thread presents some object on entry to the exchange method, + # matches with a partner thread, and receives its partner's object on return. + # + # @!macro thread_safe_variable_comparison + # + # This implementation is very simple, using only a single slot for each + # exchanger (unlike more advanced implementations which use an "arena"). + # This approach will work perfectly fine when there are only a few threads + # accessing a single `Exchanger`. Beyond a handful of threads the performance + # will degrade rapidly due to contention on the single slot, but the algorithm + # will remain correct. + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html java.util.concurrent.Exchanger + # + # @!macro edge_warning + # + # @example + # + # exchanger = Concurrent::Exchanger.new + # + # threads = [ + # Thread.new { puts "first: " << exchanger.exchange('foo', 1) }, #=> "first: bar" + # Thread.new { puts "second: " << exchanger.exchange('bar', 1) } #=> "second: foo" + # ] + # threads.each {|t| t.join(2) } + # + # @!visibility private + class AbstractExchanger < Synchronization::Object + + # @!visibility private + CANCEL = Object.new + private_constant :CANCEL + + # @!macro [attach] exchanger_method_initialize + def initialize + super + end + + # @!macro [attach] exchanger_method_do_exchange + # + # Waits for another thread to arrive at this exchange point (unless the + # current thread is interrupted), and then transfers the given object to + # it, receiving its object in return. The timeout value indicates the + # approximate number of seconds the method should block while waiting + # for the exchange. When the timeout value is `nil` the method will + # block indefinitely. + # + # @param [Object] value the value to exchange with another thread + # @param [Numeric, nil] timeout in seconds, `nil` blocks indefinitely + # + # @!macro [attach] exchanger_method_exchange + # + # In some edge cases when a `timeout` is given a return value of `nil` may be + # ambiguous. Specifically, if `nil` is a valid value in the exchange it will + # be impossible to tell whether `nil` is the actual return value or if it + # signifies timeout. When `nil` is a valid value in the exchange consider + # using {#exchange!} or {#try_exchange} instead. + # + # @return [Object] the value exchanged by the other thread or `nil` on timeout + def exchange(value, timeout = nil) + (value = do_exchange(value, timeout)) == CANCEL ? nil : value + end + + # @!macro exchanger_method_do_exchange + # + # @!macro [attach] exchanger_method_exchange_bang + # + # On timeout a {Concurrent::TimeoutError} exception will be raised. + # + # @return [Object] the value exchanged by the other thread + # @raise [Concurrent::TimeoutError] on timeout + def exchange!(value, timeout = nil) + if (value = do_exchange(value, timeout)) == CANCEL + raise Concurrent::TimeoutError + else + value + end + end + + # @!macro exchanger_method_do_exchange + # + # @!macro [attach] exchanger_method_try_exchange + # + # The return value will be a {Concurrent::Maybe} set to `Just` on success or + # `Nothing` on timeout. + # + # @return [Concurrent::Maybe] on success a `Just` maybe will be returned with + # the item exchanged by the other thread as `#value`; on timeout a + # `Nothing` maybe will be returned with {Concurrent::TimeoutError} as `#reason` + # + # @example + # + # exchanger = Concurrent::Exchanger.new + # + # result = exchanger.exchange(:foo, 0.5) + # + # if result.just? + # puts result.value #=> :bar + # else + # puts 'timeout' + # end + def try_exchange(value, timeout = nil) + if (value = do_exchange(value, timeout)) == CANCEL + Concurrent::Maybe.nothing(Concurrent::TimeoutError) + else + Concurrent::Maybe.just(value) + end + end + + private + + # @!macro exchanger_method_do_exchange + # + # @return [Object, CANCEL] the value exchanged by the other thread; {CANCEL} on timeout + def do_exchange(value, timeout) + raise NotImplementedError + end + end + + # @!macro exchanger + # @!macro internal_implementation_note + # @!visibility private + class RubyExchanger < AbstractExchanger + # A simplified version of java.util.concurrent.Exchanger written by + # Doug Lea, Bill Scherer, and Michael Scott with assistance from members + # of JCP JSR-166 Expert Group and released to the public domain. It does + # not include the arena or the multi-processor spin loops. + # http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/Exchanger.java + + safe_initialization! + + class Node < Concurrent::Synchronization::Object + attr_atomic :value + safe_initialization! + + def initialize(item) + super() + @Item = item + @Latch = Concurrent::CountDownLatch.new + self.value = nil + end + + def latch + @Latch + end + + def item + @Item + end + end + private_constant :Node + + # @!macro exchanger_method_initialize + def initialize + super + end + + private + + attr_atomic(:slot) + + # @!macro exchanger_method_do_exchange + # + # @return [Object, CANCEL] the value exchanged by the other thread; {CANCEL} on timeout + def do_exchange(value, timeout) + + # ALGORITHM + # + # From the original Java version: + # + # > The basic idea is to maintain a "slot", which is a reference to + # > a Node containing both an Item to offer and a "hole" waiting to + # > get filled in. If an incoming "occupying" thread sees that the + # > slot is null, it CAS'es (compareAndSets) a Node there and waits + # > for another to invoke exchange. That second "fulfilling" thread + # > sees that the slot is non-null, and so CASes it back to null, + # > also exchanging items by CASing the hole, plus waking up the + # > occupying thread if it is blocked. In each case CAS'es may + # > fail because a slot at first appears non-null but is null upon + # > CAS, or vice-versa. So threads may need to retry these + # > actions. + # + # This version: + # + # An exchange occurs between an "occupier" thread and a "fulfiller" thread. + # The "slot" is used to setup this interaction. The first thread in the + # exchange puts itself into the slot (occupies) and waits for a fulfiller. + # The second thread removes the occupier from the slot and attempts to + # perform the exchange. Removing the occupier also frees the slot for + # another occupier/fulfiller pair. + # + # Because the occupier and the fulfiller are operating independently and + # because there may be contention with other threads, any failed operation + # indicates contention. Both the occupier and the fulfiller operate within + # spin loops. Any failed actions along the happy path will cause the thread + # to repeat the loop and try again. + # + # When a timeout value is given the thread must be cognizant of time spent + # in the spin loop. The remaining time is checked every loop. When the time + # runs out the thread will exit. + # + # A "node" is the data structure used to perform the exchange. Only the + # occupier's node is necessary. It's the node used for the exchange. + # Each node has an "item," a "hole" (self), and a "latch." The item is the + # node's initial value. It never changes. It's what the fulfiller returns on + # success. The occupier's hole is where the fulfiller put its item. It's the + # item that the occupier returns on success. The latch is used for synchronization. + # Becuase a thread may act as either an occupier or fulfiller (or possibly + # both in periods of high contention) every thread creates a node when + # the exchange method is first called. + # + # The following steps occur within the spin loop. If any actions fail + # the thread will loop and try again, so long as there is time remaining. + # If time runs out the thread will return CANCEL. + # + # Check the slot for an occupier: + # + # * If the slot is empty try to occupy + # * If the slot is full try to fulfill + # + # Attempt to occupy: + # + # * Attempt to CAS myself into the slot + # * Go to sleep and wait to be woken by a fulfiller + # * If the sleep is successful then the fulfiller completed its happy path + # - Return the value from my hole (the value given by the fulfiller) + # * When the sleep fails (time ran out) attempt to cancel the operation + # - Attempt to CAS myself out of the hole + # - If successful there is no contention + # - Return CANCEL + # - On failure, I am competing with a fulfiller + # - Attempt to CAS my hole to CANCEL + # - On success + # - Let the fulfiller deal with my cancel + # - Return CANCEL + # - On failure the fulfiller has completed its happy path + # - Return th value from my hole (the fulfiller's value) + # + # Attempt to fulfill: + # + # * Attempt to CAS the occupier out of the slot + # - On failure loop again + # * Attempt to CAS my item into the occupier's hole + # - On failure the occupier is trying to cancel + # - Loop again + # - On success we are on the happy path + # - Wake the sleeping occupier + # - Return the occupier's item + + value = NULL if value.nil? # The sentinel allows nil to be a valid value + me = Node.new(value) # create my node in case I need to occupy + end_at = Concurrent.monotonic_time + timeout.to_f # The time to give up + + result = loop do + other = slot + if other && compare_and_set_slot(other, nil) + # try to fulfill + if other.compare_and_set_value(nil, value) + # happy path + other.latch.count_down + break other.item + end + elsif other.nil? && compare_and_set_slot(nil, me) + # try to occupy + timeout = end_at - Concurrent.monotonic_time if timeout + if me.latch.wait(timeout) + # happy path + break me.value + else + # attempt to remove myself from the slot + if compare_and_set_slot(me, nil) + break CANCEL + elsif !me.compare_and_set_value(nil, CANCEL) + # I've failed to block the fulfiller + break me.value + end + end + end + break CANCEL if timeout && Concurrent.monotonic_time >= end_at + end + + result == NULL ? nil : result + end + end + + if Concurrent.on_jruby? + + # @!macro exchanger + # @!macro internal_implementation_note + # @!visibility private + class JavaExchanger < AbstractExchanger + + # @!macro exchanger_method_initialize + def initialize + @exchanger = java.util.concurrent.Exchanger.new + end + + private + + # @!macro exchanger_method_do_exchange + # + # @return [Object, CANCEL] the value exchanged by the other thread; {CANCEL} on timeout + def do_exchange(value, timeout) + if timeout.nil? + @exchanger.exchange(value) + else + @exchanger.exchange(value, 1000 * timeout, java.util.concurrent.TimeUnit::MILLISECONDS) + end + rescue java.util.concurrent.TimeoutException + CANCEL + end + end + end + + # @!visibility private + # @!macro internal_implementation_note + ExchangerImplementation = case + when Concurrent.on_jruby? + JavaExchanger + else + RubyExchanger + end + private_constant :ExchangerImplementation + + # @!macro exchanger + class Exchanger < ExchangerImplementation + + # @!method initialize + # @!macro exchanger_method_initialize + + # @!method exchange(value, timeout = nil) + # @!macro exchanger_method_do_exchange + # @!macro exchanger_method_exchange + + # @!method exchange!(value, timeout = nil) + # @!macro exchanger_method_do_exchange + # @!macro exchanger_method_exchange_bang + + # @!method try_exchange(value, timeout = nil) + # @!macro exchanger_method_do_exchange + # @!macro exchanger_method_try_exchange + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/abstract_executor_service.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/abstract_executor_service.rb new file mode 100644 index 0000000..35212d3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/abstract_executor_service.rb @@ -0,0 +1,134 @@ +require 'concurrent/errors' +require 'concurrent/executor/executor_service' +require 'concurrent/synchronization' +require 'concurrent/utility/at_exit' + +module Concurrent + + # @!macro abstract_executor_service_public_api + # @!visibility private + class AbstractExecutorService < Synchronization::LockableObject + include ExecutorService + + # The set of possible fallback policies that may be set at thread pool creation. + FALLBACK_POLICIES = [:abort, :discard, :caller_runs].freeze + + # @!macro executor_service_attr_reader_fallback_policy + attr_reader :fallback_policy + + # Create a new thread pool. + def initialize(*args, &block) + super(&nil) + synchronize { ns_initialize(*args, &block) } + end + + # @!macro executor_service_method_shutdown + def shutdown + raise NotImplementedError + end + + # @!macro executor_service_method_kill + def kill + raise NotImplementedError + end + + # @!macro executor_service_method_wait_for_termination + def wait_for_termination(timeout = nil) + raise NotImplementedError + end + + # @!macro executor_service_method_running_question + def running? + synchronize { ns_running? } + end + + # @!macro executor_service_method_shuttingdown_question + def shuttingdown? + synchronize { ns_shuttingdown? } + end + + # @!macro executor_service_method_shutdown_question + def shutdown? + synchronize { ns_shutdown? } + end + + # @!macro executor_service_method_auto_terminate_question + def auto_terminate? + synchronize { ns_auto_terminate? } + end + + # @!macro executor_service_method_auto_terminate_setter + def auto_terminate=(value) + synchronize { self.ns_auto_terminate = value } + end + + private + + # Handler which executes the `fallback_policy` once the queue size + # reaches `max_queue`. + # + # @param [Array] args the arguments to the task which is being handled. + # + # @!visibility private + def handle_fallback(*args) + case fallback_policy + when :abort + raise RejectedExecutionError + when :discard + false + when :caller_runs + begin + yield(*args) + rescue => ex + # let it fail + log DEBUG, ex + end + true + else + fail "Unknown fallback policy #{fallback_policy}" + end + end + + def ns_execute(*args, &task) + raise NotImplementedError + end + + # @!macro [attach] executor_service_method_ns_shutdown_execution + # + # Callback method called when an orderly shutdown has completed. + # The default behavior is to signal all waiting threads. + def ns_shutdown_execution + # do nothing + end + + # @!macro [attach] executor_service_method_ns_kill_execution + # + # Callback method called when the executor has been killed. + # The default behavior is to do nothing. + def ns_kill_execution + # do nothing + end + + def ns_auto_terminate? + !!@auto_terminate + end + + def ns_auto_terminate=(value) + case value + when true + AtExit.add(self) { terminate_at_exit } + @auto_terminate = true + when false + AtExit.delete(self) + @auto_terminate = false + else + raise ArgumentError + end + end + + def terminate_at_exit + kill # TODO be gentle first + wait_for_termination(10) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/cached_thread_pool.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/cached_thread_pool.rb new file mode 100644 index 0000000..1f10365 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/cached_thread_pool.rb @@ -0,0 +1,62 @@ +require 'concurrent/utility/engine' +require 'concurrent/executor/thread_pool_executor' + +module Concurrent + + # A thread pool that dynamically grows and shrinks to fit the current workload. + # New threads are created as needed, existing threads are reused, and threads + # that remain idle for too long are killed and removed from the pool. These + # pools are particularly suited to applications that perform a high volume of + # short-lived tasks. + # + # On creation a `CachedThreadPool` has zero running threads. New threads are + # created on the pool as new operations are `#post`. The size of the pool + # will grow until `#max_length` threads are in the pool or until the number + # of threads exceeds the number of running and pending operations. When a new + # operation is post to the pool the first available idle thread will be tasked + # with the new operation. + # + # Should a thread crash for any reason the thread will immediately be removed + # from the pool. Similarly, threads which remain idle for an extended period + # of time will be killed and reclaimed. Thus these thread pools are very + # efficient at reclaiming unused resources. + # + # The API and behavior of this class are based on Java's `CachedThreadPool` + # + # @!macro thread_pool_options + class CachedThreadPool < ThreadPoolExecutor + + # @!macro [attach] cached_thread_pool_method_initialize + # + # Create a new thread pool. + # + # @param [Hash] opts the options defining pool behavior. + # @option opts [Symbol] :fallback_policy (`:abort`) the fallback policy + # + # @raise [ArgumentError] if `fallback_policy` is not a known policy + # + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool-- + def initialize(opts = {}) + defaults = { idletime: DEFAULT_THREAD_IDLETIMEOUT } + overrides = { min_threads: 0, + max_threads: DEFAULT_MAX_POOL_SIZE, + max_queue: DEFAULT_MAX_QUEUE_SIZE } + super(defaults.merge(opts).merge(overrides)) + end + + private + + # @!macro cached_thread_pool_method_initialize + # @!visibility private + def ns_initialize(opts) + super(opts) + if Concurrent.on_jruby? + @max_queue = 0 + @executor = java.util.concurrent.Executors.newCachedThreadPool + @executor.setRejectedExecutionHandler(FALLBACK_POLICY_CLASSES[@fallback_policy].new) + @executor.setKeepAliveTime(opts.fetch(:idletime, DEFAULT_THREAD_IDLETIMEOUT), java.util.concurrent.TimeUnit::SECONDS) + self.auto_terminate = opts.fetch(:auto_terminate, true) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/executor_service.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/executor_service.rb new file mode 100644 index 0000000..02aa27f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/executor_service.rb @@ -0,0 +1,185 @@ +require 'concurrent/concern/logging' + +module Concurrent + + ################################################################### + + # @!macro [new] executor_service_method_post + # + # Submit a task to the executor for asynchronous processing. + # + # @param [Array] args zero or more arguments to be passed to the task + # + # @yield the asynchronous task to perform + # + # @return [Boolean] `true` if the task is queued, `false` if the executor + # is not running + # + # @raise [ArgumentError] if no task is given + + # @!macro [new] executor_service_method_left_shift + # + # Submit a task to the executor for asynchronous processing. + # + # @param [Proc] task the asynchronous task to perform + # + # @return [self] returns itself + + # @!macro [new] executor_service_method_can_overflow_question + # + # Does the task queue have a maximum size? + # + # @return [Boolean] True if the task queue has a maximum size else false. + + # @!macro [new] executor_service_method_serialized_question + # + # Does this executor guarantee serialization of its operations? + # + # @return [Boolean] True if the executor guarantees that all operations + # will be post in the order they are received and no two operations may + # occur simultaneously. Else false. + + ################################################################### + + # @!macro [new] executor_service_public_api + # + # @!method post(*args, &task) + # @!macro executor_service_method_post + # + # @!method <<(task) + # @!macro executor_service_method_left_shift + # + # @!method can_overflow? + # @!macro executor_service_method_can_overflow_question + # + # @!method serialized? + # @!macro executor_service_method_serialized_question + + ################################################################### + + # @!macro [new] executor_service_attr_reader_fallback_policy + # @return [Symbol] The fallback policy in effect. Either `:abort`, `:discard`, or `:caller_runs`. + + # @!macro [new] executor_service_method_shutdown + # + # Begin an orderly shutdown. Tasks already in the queue will be executed, + # but no new tasks will be accepted. Has no additional effect if the + # thread pool is not running. + + # @!macro [new] executor_service_method_kill + # + # Begin an immediate shutdown. In-progress tasks will be allowed to + # complete but enqueued tasks will be dismissed and no new tasks + # will be accepted. Has no additional effect if the thread pool is + # not running. + + # @!macro [new] executor_service_method_wait_for_termination + # + # Block until executor shutdown is complete or until `timeout` seconds have + # passed. + # + # @note Does not initiate shutdown or termination. Either `shutdown` or `kill` + # must be called before this method (or on another thread). + # + # @param [Integer] timeout the maximum number of seconds to wait for shutdown to complete + # + # @return [Boolean] `true` if shutdown complete or false on `timeout` + + # @!macro [new] executor_service_method_running_question + # + # Is the executor running? + # + # @return [Boolean] `true` when running, `false` when shutting down or shutdown + + # @!macro [new] executor_service_method_shuttingdown_question + # + # Is the executor shuttingdown? + # + # @return [Boolean] `true` when not running and not shutdown, else `false` + + # @!macro [new] executor_service_method_shutdown_question + # + # Is the executor shutdown? + # + # @return [Boolean] `true` when shutdown, `false` when shutting down or running + + # @!macro [new] executor_service_method_auto_terminate_question + # + # Is the executor auto-terminate when the application exits? + # + # @return [Boolean] `true` when auto-termination is enabled else `false`. + + # @!macro [new] executor_service_method_auto_terminate_setter + # + # Set the auto-terminate behavior for this executor. + # + # @param [Boolean] value The new auto-terminate value to set for this executor. + # + # @return [Boolean] `true` when auto-termination is enabled else `false`. + + ################################################################### + + # @!macro [new] abstract_executor_service_public_api + # + # @!macro executor_service_public_api + # + # @!attribute [r] fallback_policy + # @!macro executor_service_attr_reader_fallback_policy + # + # @!method shutdown + # @!macro executor_service_method_shutdown + # + # @!method kill + # @!macro executor_service_method_kill + # + # @!method wait_for_termination(timeout = nil) + # @!macro executor_service_method_wait_for_termination + # + # @!method running? + # @!macro executor_service_method_running_question + # + # @!method shuttingdown? + # @!macro executor_service_method_shuttingdown_question + # + # @!method shutdown? + # @!macro executor_service_method_shutdown_question + # + # @!method auto_terminate? + # @!macro executor_service_method_auto_terminate_question + # + # @!method auto_terminate=(value) + # @!macro executor_service_method_auto_terminate_setter + + ################################################################### + + # @!macro executor_service_public_api + # @!visibility private + module ExecutorService + include Concern::Logging + + # @!macro executor_service_method_post + def post(*args, &task) + raise NotImplementedError + end + + # @!macro executor_service_method_left_shift + def <<(task) + post(&task) + self + end + + # @!macro executor_service_method_can_overflow_question + # + # @note Always returns `false` + def can_overflow? + false + end + + # @!macro executor_service_method_serialized_question + # + # @note Always returns `false` + def serialized? + false + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/fixed_thread_pool.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/fixed_thread_pool.rb new file mode 100644 index 0000000..9271bd2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/fixed_thread_pool.rb @@ -0,0 +1,206 @@ +require 'concurrent/utility/engine' +require 'concurrent/executor/thread_pool_executor' + +module Concurrent + + # @!macro [new] thread_pool_executor_constant_default_max_pool_size + # Default maximum number of threads that will be created in the pool. + + # @!macro [new] thread_pool_executor_constant_default_min_pool_size + # Default minimum number of threads that will be retained in the pool. + + # @!macro [new] thread_pool_executor_constant_default_max_queue_size + # Default maximum number of tasks that may be added to the task queue. + + # @!macro [new] thread_pool_executor_constant_default_thread_timeout + # Default maximum number of seconds a thread in the pool may remain idle + # before being reclaimed. + + # @!macro [new] thread_pool_executor_attr_reader_max_length + # The maximum number of threads that may be created in the pool. + # @return [Integer] The maximum number of threads that may be created in the pool. + + # @!macro [new] thread_pool_executor_attr_reader_min_length + # The minimum number of threads that may be retained in the pool. + # @return [Integer] The minimum number of threads that may be retained in the pool. + + # @!macro [new] thread_pool_executor_attr_reader_largest_length + # The largest number of threads that have been created in the pool since construction. + # @return [Integer] The largest number of threads that have been created in the pool since construction. + + # @!macro [new] thread_pool_executor_attr_reader_scheduled_task_count + # The number of tasks that have been scheduled for execution on the pool since construction. + # @return [Integer] The number of tasks that have been scheduled for execution on the pool since construction. + + # @!macro [new] thread_pool_executor_attr_reader_completed_task_count + # The number of tasks that have been completed by the pool since construction. + # @return [Integer] The number of tasks that have been completed by the pool since construction. + + # @!macro [new] thread_pool_executor_attr_reader_idletime + # The number of seconds that a thread may be idle before being reclaimed. + # @return [Integer] The number of seconds that a thread may be idle before being reclaimed. + + # @!macro [new] thread_pool_executor_attr_reader_max_queue + # The maximum number of tasks that may be waiting in the work queue at any one time. + # When the queue size reaches `max_queue` subsequent tasks will be rejected in + # accordance with the configured `fallback_policy`. + # + # @return [Integer] The maximum number of tasks that may be waiting in the work queue at any one time. + # When the queue size reaches `max_queue` subsequent tasks will be rejected in + # accordance with the configured `fallback_policy`. + + # @!macro [new] thread_pool_executor_attr_reader_length + # The number of threads currently in the pool. + # @return [Integer] The number of threads currently in the pool. + + # @!macro [new] thread_pool_executor_attr_reader_queue_length + # The number of tasks in the queue awaiting execution. + # @return [Integer] The number of tasks in the queue awaiting execution. + + # @!macro [new] thread_pool_executor_attr_reader_remaining_capacity + # Number of tasks that may be enqueued before reaching `max_queue` and rejecting + # new tasks. A value of -1 indicates that the queue may grow without bound. + # + # @return [Integer] Number of tasks that may be enqueued before reaching `max_queue` and rejecting + # new tasks. A value of -1 indicates that the queue may grow without bound. + + + + + + # @!macro [new] thread_pool_executor_public_api + # + # @!macro abstract_executor_service_public_api + # + # @!attribute [r] max_length + # @!macro thread_pool_executor_attr_reader_max_length + # + # @!attribute [r] min_length + # @!macro thread_pool_executor_attr_reader_min_length + # + # @!attribute [r] largest_length + # @!macro thread_pool_executor_attr_reader_largest_length + # + # @!attribute [r] scheduled_task_count + # @!macro thread_pool_executor_attr_reader_scheduled_task_count + # + # @!attribute [r] completed_task_count + # @!macro thread_pool_executor_attr_reader_completed_task_count + # + # @!attribute [r] idletime + # @!macro thread_pool_executor_attr_reader_idletime + # + # @!attribute [r] max_queue + # @!macro thread_pool_executor_attr_reader_max_queue + # + # @!attribute [r] length + # @!macro thread_pool_executor_attr_reader_length + # + # @!attribute [r] queue_length + # @!macro thread_pool_executor_attr_reader_queue_length + # + # @!attribute [r] remaining_capacity + # @!macro thread_pool_executor_attr_reader_remaining_capacity + # + # @!method can_overflow? + # @!macro executor_service_method_can_overflow_question + + + + + # @!macro [new] thread_pool_options + # + # **Thread Pool Options** + # + # Thread pools support several configuration options: + # + # * `idletime`: The number of seconds that a thread may be idle before being reclaimed. + # * `max_queue`: The maximum number of tasks that may be waiting in the work queue at + # any one time. When the queue size reaches `max_queue` and no new threads can be created, + # subsequent tasks will be rejected in accordance with the configured `fallback_policy`. + # * `auto_terminate`: When true (default) an `at_exit` handler will be registered which + # will stop the thread pool when the application exits. See below for more information + # on shutting down thread pools. + # * `fallback_policy`: The policy defining how rejected tasks are handled. + # + # Three fallback policies are supported: + # + # * `:abort`: Raise a `RejectedExecutionError` exception and discard the task. + # * `:discard`: Discard the task and return false. + # * `:caller_runs`: Execute the task on the calling thread. + # + # **Shutting Down Thread Pools** + # + # Killing a thread pool while tasks are still being processed, either by calling + # the `#kill` method or at application exit, will have unpredictable results. There + # is no way for the thread pool to know what resources are being used by the + # in-progress tasks. When those tasks are killed the impact on those resources + # cannot be predicted. The *best* practice is to explicitly shutdown all thread + # pools using the provided methods: + # + # * Call `#shutdown` to initiate an orderly termination of all in-progress tasks + # * Call `#wait_for_termination` with an appropriate timeout interval an allow + # the orderly shutdown to complete + # * Call `#kill` *only when* the thread pool fails to shutdown in the allotted time + # + # On some runtime platforms (most notably the JVM) the application will not + # exit until all thread pools have been shutdown. To prevent applications from + # "hanging" on exit all thread pools include an `at_exit` handler that will + # stop the thread pool when the application exits. This handler uses a brute + # force method to stop the pool and makes no guarantees regarding resources being + # used by any tasks still running. Registration of this `at_exit` handler can be + # prevented by setting the thread pool's constructor `:auto_terminate` option to + # `false` when the thread pool is created. All thread pools support this option. + # + # ```ruby + # pool1 = Concurrent::FixedThreadPool.new(5) # an `at_exit` handler will be registered + # pool2 = Concurrent::FixedThreadPool.new(5, auto_terminate: false) # prevent `at_exit` handler registration + # ``` + # + # @note Failure to properly shutdown a thread pool can lead to unpredictable results. + # Please read *Shutting Down Thread Pools* for more information. + # + # @see http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html Java Tutorials: Thread Pools + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html Java Executors class + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html Java ExecutorService interface + # @see http://ruby-doc.org//core-2.2.0/Kernel.html#method-i-at_exit Kernel#at_exit + + + + + + # @!macro [attach] fixed_thread_pool + # + # A thread pool that reuses a fixed number of threads operating off an unbounded queue. + # At any point, at most `num_threads` will be active processing tasks. When all threads are busy new + # tasks `#post` to the thread pool are enqueued until a thread becomes available. + # Should a thread crash for any reason the thread will immediately be removed + # from the pool and replaced. + # + # The API and behavior of this class are based on Java's `FixedThreadPool` + # + # @!macro thread_pool_options + class FixedThreadPool < ThreadPoolExecutor + + # @!macro [attach] fixed_thread_pool_method_initialize + # + # Create a new thread pool. + # + # @param [Integer] num_threads the number of threads to allocate + # @param [Hash] opts the options defining pool behavior. + # @option opts [Symbol] :fallback_policy (`:abort`) the fallback policy + # + # @raise [ArgumentError] if `num_threads` is less than or equal to zero + # @raise [ArgumentError] if `fallback_policy` is not a known policy + # + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool-int- + def initialize(num_threads, opts = {}) + raise ArgumentError.new('number of threads must be greater than zero') if num_threads.to_i < 1 + defaults = { max_queue: DEFAULT_MAX_QUEUE_SIZE, + idletime: DEFAULT_THREAD_IDLETIMEOUT } + overrides = { min_threads: num_threads, + max_threads: num_threads } + super(defaults.merge(opts).merge(overrides)) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/immediate_executor.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/immediate_executor.rb new file mode 100644 index 0000000..282df7a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/immediate_executor.rb @@ -0,0 +1,66 @@ +require 'concurrent/atomic/event' +require 'concurrent/executor/abstract_executor_service' +require 'concurrent/executor/serial_executor_service' + +module Concurrent + + # An executor service which runs all operations on the current thread, + # blocking as necessary. Operations are performed in the order they are + # received and no two operations can be performed simultaneously. + # + # This executor service exists mainly for testing an debugging. When used + # it immediately runs every `#post` operation on the current thread, blocking + # that thread until the operation is complete. This can be very beneficial + # during testing because it makes all operations deterministic. + # + # @note Intended for use primarily in testing and debugging. + class ImmediateExecutor < AbstractExecutorService + include SerialExecutorService + + # Creates a new executor + def initialize + @stopped = Concurrent::Event.new + end + + # @!macro executor_service_method_post + def post(*args, &task) + raise ArgumentError.new('no block given') unless block_given? + return false unless running? + task.call(*args) + true + end + + # @!macro executor_service_method_left_shift + def <<(task) + post(&task) + self + end + + # @!macro executor_service_method_running_question + def running? + ! shutdown? + end + + # @!macro executor_service_method_shuttingdown_question + def shuttingdown? + false + end + + # @!macro executor_service_method_shutdown_question + def shutdown? + @stopped.set? + end + + # @!macro executor_service_method_shutdown + def shutdown + @stopped.set + true + end + alias_method :kill, :shutdown + + # @!macro executor_service_method_wait_for_termination + def wait_for_termination(timeout = nil) + @stopped.wait(timeout) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/indirect_immediate_executor.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/indirect_immediate_executor.rb new file mode 100644 index 0000000..4f9769f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/indirect_immediate_executor.rb @@ -0,0 +1,44 @@ +require 'concurrent/executor/immediate_executor' +require 'concurrent/executor/simple_executor_service' + +module Concurrent + # An executor service which runs all operations on a new thread, blocking + # until it completes. Operations are performed in the order they are received + # and no two operations can be performed simultaneously. + # + # This executor service exists mainly for testing an debugging. When used it + # immediately runs every `#post` operation on a new thread, blocking the + # current thread until the operation is complete. This is similar to how the + # ImmediateExecutor works, but the operation has the full stack of the new + # thread at its disposal. This can be helpful when the operations will spawn + # more operations on the same executor and so on - such a situation might + # overflow the single stack in case of an ImmediateExecutor, which is + # inconsistent with how it would behave for a threaded executor. + # + # @note Intended for use primarily in testing and debugging. + class IndirectImmediateExecutor < ImmediateExecutor + # Creates a new executor + def initialize + super + @internal_executor = SimpleExecutorService.new + end + + # @!macro executor_service_method_post + def post(*args, &task) + raise ArgumentError.new("no block given") unless block_given? + return false unless running? + + event = Concurrent::Event.new + @internal_executor.post do + begin + task.call(*args) + ensure + event.set + end + end + event.wait + + true + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_executor_service.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_executor_service.rb new file mode 100644 index 0000000..5835d1f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_executor_service.rb @@ -0,0 +1,100 @@ +if Concurrent.on_jruby? + + require 'concurrent/errors' + require 'concurrent/utility/engine' + require 'concurrent/executor/abstract_executor_service' + + module Concurrent + + # @!macro abstract_executor_service_public_api + # @!visibility private + class JavaExecutorService < AbstractExecutorService + java_import 'java.lang.Runnable' + + FALLBACK_POLICY_CLASSES = { + abort: java.util.concurrent.ThreadPoolExecutor::AbortPolicy, + discard: java.util.concurrent.ThreadPoolExecutor::DiscardPolicy, + caller_runs: java.util.concurrent.ThreadPoolExecutor::CallerRunsPolicy + }.freeze + private_constant :FALLBACK_POLICY_CLASSES + + def initialize(*args, &block) + super + ns_make_executor_runnable + end + + def post(*args, &task) + raise ArgumentError.new('no block given') unless block_given? + return handle_fallback(*args, &task) unless running? + @executor.submit_runnable Job.new(args, task) + true + rescue Java::JavaUtilConcurrent::RejectedExecutionException + raise RejectedExecutionError + end + + def wait_for_termination(timeout = nil) + if timeout.nil? + ok = @executor.awaitTermination(60, java.util.concurrent.TimeUnit::SECONDS) until ok + true + else + @executor.awaitTermination(1000 * timeout, java.util.concurrent.TimeUnit::MILLISECONDS) + end + end + + def shutdown + synchronize do + self.ns_auto_terminate = false + @executor.shutdown + nil + end + end + + def kill + synchronize do + self.ns_auto_terminate = false + @executor.shutdownNow + nil + end + end + + private + + def ns_running? + !(ns_shuttingdown? || ns_shutdown?) + end + + def ns_shuttingdown? + if @executor.respond_to? :isTerminating + @executor.isTerminating + else + false + end + end + + def ns_shutdown? + @executor.isShutdown || @executor.isTerminated + end + + def ns_make_executor_runnable + if !defined?(@executor.submit_runnable) + @executor.class.class_eval do + java_alias :submit_runnable, :submit, [java.lang.Runnable.java_class] + end + end + end + + class Job + include Runnable + def initialize(args, block) + @args = args + @block = block + end + + def run + @block.call(*@args) + end + end + private_constant :Job + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_single_thread_executor.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_single_thread_executor.rb new file mode 100644 index 0000000..1cf59b0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_single_thread_executor.rb @@ -0,0 +1,29 @@ +if Concurrent.on_jruby? + + require 'concurrent/executor/java_executor_service' + require 'concurrent/executor/serial_executor_service' + + module Concurrent + + # @!macro single_thread_executor + # @!macro abstract_executor_service_public_api + # @!visibility private + class JavaSingleThreadExecutor < JavaExecutorService + include SerialExecutorService + + # @!macro single_thread_executor_method_initialize + def initialize(opts = {}) + super(opts) + end + + private + + def ns_initialize(opts) + @executor = java.util.concurrent.Executors.newSingleThreadExecutor + @fallback_policy = opts.fetch(:fallback_policy, :discard) + raise ArgumentError.new("#{@fallback_policy} is not a valid fallback policy") unless FALLBACK_POLICY_CLASSES.keys.include?(@fallback_policy) + self.auto_terminate = opts.fetch(:auto_terminate, true) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_thread_pool_executor.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_thread_pool_executor.rb new file mode 100644 index 0000000..ef5a71f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/java_thread_pool_executor.rb @@ -0,0 +1,120 @@ +if Concurrent.on_jruby? + + require 'concurrent/executor/java_executor_service' + + module Concurrent + + # @!macro thread_pool_executor + # @!macro thread_pool_options + # @!visibility private + class JavaThreadPoolExecutor < JavaExecutorService + + # @!macro thread_pool_executor_constant_default_max_pool_size + DEFAULT_MAX_POOL_SIZE = java.lang.Integer::MAX_VALUE # 2147483647 + + # @!macro thread_pool_executor_constant_default_min_pool_size + DEFAULT_MIN_POOL_SIZE = 0 + + # @!macro thread_pool_executor_constant_default_max_queue_size + DEFAULT_MAX_QUEUE_SIZE = 0 + + # @!macro thread_pool_executor_constant_default_thread_timeout + DEFAULT_THREAD_IDLETIMEOUT = 60 + + # @!macro thread_pool_executor_attr_reader_max_length + attr_reader :max_length + + # @!macro thread_pool_executor_attr_reader_max_queue + attr_reader :max_queue + + # @!macro thread_pool_executor_method_initialize + def initialize(opts = {}) + super(opts) + end + + # @!macro executor_service_method_can_overflow_question + def can_overflow? + @max_queue != 0 + end + + # @!macro thread_pool_executor_attr_reader_min_length + def min_length + @executor.getCorePoolSize + end + + # @!macro thread_pool_executor_attr_reader_max_length + def max_length + @executor.getMaximumPoolSize + end + + # @!macro thread_pool_executor_attr_reader_length + def length + @executor.getPoolSize + end + + # @!macro thread_pool_executor_attr_reader_largest_length + def largest_length + @executor.getLargestPoolSize + end + + # @!macro thread_pool_executor_attr_reader_scheduled_task_count + def scheduled_task_count + @executor.getTaskCount + end + + # @!macro thread_pool_executor_attr_reader_completed_task_count + def completed_task_count + @executor.getCompletedTaskCount + end + + # @!macro thread_pool_executor_attr_reader_idletime + def idletime + @executor.getKeepAliveTime(java.util.concurrent.TimeUnit::SECONDS) + end + + # @!macro thread_pool_executor_attr_reader_queue_length + def queue_length + @executor.getQueue.size + end + + # @!macro thread_pool_executor_attr_reader_remaining_capacity + def remaining_capacity + @max_queue == 0 ? -1 : @executor.getQueue.remainingCapacity + end + + # @!macro executor_service_method_running_question + def running? + super && !@executor.isTerminating + end + + private + + def ns_initialize(opts) + min_length = opts.fetch(:min_threads, DEFAULT_MIN_POOL_SIZE).to_i + max_length = opts.fetch(:max_threads, DEFAULT_MAX_POOL_SIZE).to_i + idletime = opts.fetch(:idletime, DEFAULT_THREAD_IDLETIMEOUT).to_i + @max_queue = opts.fetch(:max_queue, DEFAULT_MAX_QUEUE_SIZE).to_i + @fallback_policy = opts.fetch(:fallback_policy, :abort) + + raise ArgumentError.new("`max_threads` cannot be less than #{DEFAULT_MIN_POOL_SIZE}") if max_length < DEFAULT_MIN_POOL_SIZE + raise ArgumentError.new("`max_threads` cannot be greater than #{DEFAULT_MAX_POOL_SIZE}") if max_length > DEFAULT_MAX_POOL_SIZE + raise ArgumentError.new("`min_threads` cannot be less than #{DEFAULT_MIN_POOL_SIZE}") if min_length < DEFAULT_MIN_POOL_SIZE + raise ArgumentError.new("`min_threads` cannot be more than `max_threads`") if min_length > max_length + raise ArgumentError.new("#{fallback_policy} is not a valid fallback policy") unless FALLBACK_POLICY_CLASSES.include?(@fallback_policy) + + if @max_queue == 0 + queue = java.util.concurrent.LinkedBlockingQueue.new + else + queue = java.util.concurrent.LinkedBlockingQueue.new(@max_queue) + end + + @executor = java.util.concurrent.ThreadPoolExecutor.new( + min_length, max_length, + idletime, java.util.concurrent.TimeUnit::SECONDS, + queue, FALLBACK_POLICY_CLASSES[@fallback_policy].new) + + self.auto_terminate = opts.fetch(:auto_terminate, true) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_executor_service.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_executor_service.rb new file mode 100644 index 0000000..7b2ee73 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_executor_service.rb @@ -0,0 +1,78 @@ +require 'concurrent/executor/abstract_executor_service' +require 'concurrent/atomic/event' + +module Concurrent + + # @!macro abstract_executor_service_public_api + # @!visibility private + class RubyExecutorService < AbstractExecutorService + safe_initialization! + + def initialize(*args, &block) + super + @StopEvent = Event.new + @StoppedEvent = Event.new + end + + def post(*args, &task) + raise ArgumentError.new('no block given') unless block_given? + synchronize do + # If the executor is shut down, reject this task + return handle_fallback(*args, &task) unless running? + ns_execute(*args, &task) + true + end + end + + def shutdown + synchronize do + break unless running? + self.ns_auto_terminate = false + stop_event.set + ns_shutdown_execution + end + true + end + + def kill + synchronize do + break if shutdown? + self.ns_auto_terminate = false + stop_event.set + ns_kill_execution + stopped_event.set + end + true + end + + def wait_for_termination(timeout = nil) + stopped_event.wait(timeout) + end + + private + + def stop_event + @StopEvent + end + + def stopped_event + @StoppedEvent + end + + def ns_shutdown_execution + stopped_event.set + end + + def ns_running? + !stop_event.set? + end + + def ns_shuttingdown? + !(ns_running? || ns_shutdown?) + end + + def ns_shutdown? + stopped_event.set? + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_single_thread_executor.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_single_thread_executor.rb new file mode 100644 index 0000000..305a49e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_single_thread_executor.rb @@ -0,0 +1,22 @@ +require 'concurrent/executor/ruby_thread_pool_executor' + +module Concurrent + + # @!macro single_thread_executor + # @!macro abstract_executor_service_public_api + # @!visibility private + class RubySingleThreadExecutor < RubyThreadPoolExecutor + + # @!macro single_thread_executor_method_initialize + def initialize(opts = {}) + super( + min_threads: 1, + max_threads: 1, + max_queue: 0, + idletime: DEFAULT_THREAD_IDLETIMEOUT, + fallback_policy: opts.fetch(:fallback_policy, :discard), + auto_terminate: opts.fetch(:auto_terminate, true) + ) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_thread_pool_executor.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_thread_pool_executor.rb new file mode 100644 index 0000000..92fbd31 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_thread_pool_executor.rb @@ -0,0 +1,362 @@ +require 'thread' +require 'concurrent/atomic/event' +require 'concurrent/concern/logging' +require 'concurrent/executor/ruby_executor_service' +require 'concurrent/utility/monotonic_time' + +module Concurrent + + # @!macro thread_pool_executor + # @!macro thread_pool_options + # @!visibility private + class RubyThreadPoolExecutor < RubyExecutorService + + # @!macro thread_pool_executor_constant_default_max_pool_size + DEFAULT_MAX_POOL_SIZE = 2_147_483_647 # java.lang.Integer::MAX_VALUE + + # @!macro thread_pool_executor_constant_default_min_pool_size + DEFAULT_MIN_POOL_SIZE = 0 + + # @!macro thread_pool_executor_constant_default_max_queue_size + DEFAULT_MAX_QUEUE_SIZE = 0 + + # @!macro thread_pool_executor_constant_default_thread_timeout + DEFAULT_THREAD_IDLETIMEOUT = 60 + + # @!macro thread_pool_executor_attr_reader_max_length + attr_reader :max_length + + # @!macro thread_pool_executor_attr_reader_min_length + attr_reader :min_length + + # @!macro thread_pool_executor_attr_reader_idletime + attr_reader :idletime + + # @!macro thread_pool_executor_attr_reader_max_queue + attr_reader :max_queue + + # @!macro thread_pool_executor_method_initialize + def initialize(opts = {}) + super(opts) + end + + # @!macro thread_pool_executor_attr_reader_largest_length + def largest_length + synchronize { @largest_length } + end + + # @!macro thread_pool_executor_attr_reader_scheduled_task_count + def scheduled_task_count + synchronize { @scheduled_task_count } + end + + # @!macro thread_pool_executor_attr_reader_completed_task_count + def completed_task_count + synchronize { @completed_task_count } + end + + # @!macro executor_service_method_can_overflow_question + def can_overflow? + synchronize { ns_limited_queue? } + end + + # @!macro thread_pool_executor_attr_reader_length + def length + synchronize { @pool.length } + end + + # @!macro thread_pool_executor_attr_reader_queue_length + def queue_length + synchronize { @queue.length } + end + + # @!macro thread_pool_executor_attr_reader_remaining_capacity + def remaining_capacity + synchronize do + if ns_limited_queue? + @max_queue - @queue.length + else + -1 + end + end + end + + # @!visibility private + def remove_busy_worker(worker) + synchronize { ns_remove_busy_worker worker } + end + + # @!visibility private + def ready_worker(worker) + synchronize { ns_ready_worker worker } + end + + # @!visibility private + def worker_not_old_enough(worker) + synchronize { ns_worker_not_old_enough worker } + end + + # @!visibility private + def worker_died(worker) + synchronize { ns_worker_died worker } + end + + # @!visibility private + def worker_task_completed + synchronize { @completed_task_count += 1 } + end + + private + + # @!visibility private + def ns_initialize(opts) + @min_length = opts.fetch(:min_threads, DEFAULT_MIN_POOL_SIZE).to_i + @max_length = opts.fetch(:max_threads, DEFAULT_MAX_POOL_SIZE).to_i + @idletime = opts.fetch(:idletime, DEFAULT_THREAD_IDLETIMEOUT).to_i + @max_queue = opts.fetch(:max_queue, DEFAULT_MAX_QUEUE_SIZE).to_i + @fallback_policy = opts.fetch(:fallback_policy, :abort) + raise ArgumentError.new("#{@fallback_policy} is not a valid fallback policy") unless FALLBACK_POLICIES.include?(@fallback_policy) + + raise ArgumentError.new("`max_threads` cannot be less than #{DEFAULT_MIN_POOL_SIZE}") if @max_length < DEFAULT_MIN_POOL_SIZE + raise ArgumentError.new("`max_threads` cannot be greater than #{DEFAULT_MAX_POOL_SIZE}") if @max_length > DEFAULT_MAX_POOL_SIZE + raise ArgumentError.new("`min_threads` cannot be less than #{DEFAULT_MIN_POOL_SIZE}") if @min_length < DEFAULT_MIN_POOL_SIZE + raise ArgumentError.new("`min_threads` cannot be more than `max_threads`") if min_length > max_length + + self.auto_terminate = opts.fetch(:auto_terminate, true) + + @pool = [] # all workers + @ready = [] # used as a stash (most idle worker is at the start) + @queue = [] # used as queue + # @ready or @queue is empty at all times + @scheduled_task_count = 0 + @completed_task_count = 0 + @largest_length = 0 + @ruby_pid = $$ # detects if Ruby has forked + + @gc_interval = opts.fetch(:gc_interval, @idletime / 2.0).to_i # undocumented + @next_gc_time = Concurrent.monotonic_time + @gc_interval + end + + # @!visibility private + def ns_limited_queue? + @max_queue != 0 + end + + # @!visibility private + def ns_execute(*args, &task) + ns_reset_if_forked + + if ns_assign_worker(*args, &task) || ns_enqueue(*args, &task) + @scheduled_task_count += 1 + else + handle_fallback(*args, &task) + end + + ns_prune_pool if @next_gc_time < Concurrent.monotonic_time + end + + # @!visibility private + def ns_shutdown_execution + ns_reset_if_forked + + if @pool.empty? + # nothing to do + stopped_event.set + end + + if @queue.empty? + # no more tasks will be accepted, just stop all workers + @pool.each(&:stop) + end + end + + # @!visibility private + def ns_kill_execution + # TODO log out unprocessed tasks in queue + # TODO try to shutdown first? + @pool.each(&:kill) + @pool.clear + @ready.clear + end + + # tries to assign task to a worker, tries to get one from @ready or to create new one + # @return [true, false] if task is assigned to a worker + # + # @!visibility private + def ns_assign_worker(*args, &task) + # keep growing if the pool is not at the minimum yet + worker = (@ready.pop if @pool.size >= @min_length) || ns_add_busy_worker + if worker + worker << [task, args] + true + else + false + end + rescue ThreadError + # Raised when the operating system refuses to create the new thread + return false + end + + # tries to enqueue task + # @return [true, false] if enqueued + # + # @!visibility private + def ns_enqueue(*args, &task) + if !ns_limited_queue? || @queue.size < @max_queue + @queue << [task, args] + true + else + false + end + end + + # @!visibility private + def ns_worker_died(worker) + ns_remove_busy_worker worker + replacement_worker = ns_add_busy_worker + ns_ready_worker replacement_worker, false if replacement_worker + end + + # creates new worker which has to receive work to do after it's added + # @return [nil, Worker] nil of max capacity is reached + # + # @!visibility private + def ns_add_busy_worker + return if @pool.size >= @max_length + + @pool << (worker = Worker.new(self)) + @largest_length = @pool.length if @pool.length > @largest_length + worker + end + + # handle ready worker, giving it new job or assigning back to @ready + # + # @!visibility private + def ns_ready_worker(worker, success = true) + task_and_args = @queue.shift + if task_and_args + worker << task_and_args + else + # stop workers when !running?, do not return them to @ready + if running? + @ready.push(worker) + else + worker.stop + end + end + end + + # returns back worker to @ready which was not idle for enough time + # + # @!visibility private + def ns_worker_not_old_enough(worker) + # let's put workers coming from idle_test back to the start (as the oldest worker) + @ready.unshift(worker) + true + end + + # removes a worker which is not in not tracked in @ready + # + # @!visibility private + def ns_remove_busy_worker(worker) + @pool.delete(worker) + stopped_event.set if @pool.empty? && !running? + true + end + + # try oldest worker if it is idle for enough time, it's returned back at the start + # + # @!visibility private + def ns_prune_pool + return if @pool.size <= @min_length + + last_used = @ready.shift + last_used << :idle_test if last_used + + @next_gc_time = Concurrent.monotonic_time + @gc_interval + end + + def ns_reset_if_forked + if $$ != @ruby_pid + @queue.clear + @ready.clear + @pool.clear + @scheduled_task_count = 0 + @completed_task_count = 0 + @largest_length = 0 + @ruby_pid = $$ + end + end + + # @!visibility private + class Worker + include Concern::Logging + + def initialize(pool) + # instance variables accessed only under pool's lock so no need to sync here again + @queue = Queue.new + @pool = pool + @thread = create_worker @queue, pool, pool.idletime + end + + def <<(message) + @queue << message + end + + def stop + @queue << :stop + end + + def kill + @thread.kill + end + + private + + def create_worker(queue, pool, idletime) + Thread.new(queue, pool, idletime) do |my_queue, my_pool, my_idletime| + last_message = Concurrent.monotonic_time + catch(:stop) do + loop do + + case message = my_queue.pop + when :idle_test + if (Concurrent.monotonic_time - last_message) > my_idletime + my_pool.remove_busy_worker(self) + throw :stop + else + my_pool.worker_not_old_enough(self) + end + + when :stop + my_pool.remove_busy_worker(self) + throw :stop + + else + task, args = message + run_task my_pool, task, args + last_message = Concurrent.monotonic_time + + my_pool.ready_worker(self) + end + end + end + end + end + + def run_task(pool, task, args) + task.call(*args) + pool.worker_task_completed + rescue => ex + # let it fail + log DEBUG, ex + rescue Exception => ex + log ERROR, ex + pool.worker_died(self) + throw :stop + end + end + + private_constant :Worker + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/safe_task_executor.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/safe_task_executor.rb new file mode 100644 index 0000000..414aa64 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/safe_task_executor.rb @@ -0,0 +1,35 @@ +require 'concurrent/synchronization' + +module Concurrent + + # A simple utility class that executes a callable and returns and array of three elements: + # success - indicating if the callable has been executed without errors + # value - filled by the callable result if it has been executed without errors, nil otherwise + # reason - the error risen by the callable if it has been executed with errors, nil otherwise + class SafeTaskExecutor < Synchronization::LockableObject + + def initialize(task, opts = {}) + @task = task + @exception_class = opts.fetch(:rescue_exception, false) ? Exception : StandardError + super() # ensures visibility + end + + # @return [Array] + def execute(*args) + synchronize do + success = false + value = reason = nil + + begin + value = @task.call(*args) + success = true + rescue @exception_class => ex + reason = ex + success = false + end + + [success, value, reason] + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serial_executor_service.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serial_executor_service.rb new file mode 100644 index 0000000..f1c38ec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serial_executor_service.rb @@ -0,0 +1,34 @@ +require 'concurrent/executor/executor_service' + +module Concurrent + + # Indicates that the including `ExecutorService` guarantees + # that all operations will occur in the order they are post and that no + # two operations may occur simultaneously. This module provides no + # functionality and provides no guarantees. That is the responsibility + # of the including class. This module exists solely to allow the including + # object to be interrogated for its serialization status. + # + # @example + # class Foo + # include Concurrent::SerialExecutor + # end + # + # foo = Foo.new + # + # foo.is_a? Concurrent::ExecutorService #=> true + # foo.is_a? Concurrent::SerialExecutor #=> true + # foo.serialized? #=> true + # + # @!visibility private + module SerialExecutorService + include ExecutorService + + # @!macro executor_service_method_serialized_question + # + # @note Always returns `true` + def serialized? + true + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serialized_execution.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serialized_execution.rb new file mode 100644 index 0000000..d314e90 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serialized_execution.rb @@ -0,0 +1,107 @@ +require 'concurrent/errors' +require 'concurrent/concern/logging' +require 'concurrent/synchronization' + +module Concurrent + + # Ensures passed jobs in a serialized order never running at the same time. + class SerializedExecution < Synchronization::LockableObject + include Concern::Logging + + def initialize() + super() + synchronize { ns_initialize } + end + + Job = Struct.new(:executor, :args, :block) do + def call + block.call(*args) + end + end + + # Submit a task to the executor for asynchronous processing. + # + # @param [Executor] executor to be used for this job + # + # @param [Array] args zero or more arguments to be passed to the task + # + # @yield the asynchronous task to perform + # + # @return [Boolean] `true` if the task is queued, `false` if the executor + # is not running + # + # @raise [ArgumentError] if no task is given + def post(executor, *args, &task) + posts [[executor, args, task]] + true + end + + # As {#post} but allows to submit multiple tasks at once, it's guaranteed that they will not + # be interleaved by other tasks. + # + # @param [Array, Proc)>] posts array of triplets where + # first is a {ExecutorService}, second is array of args for task, third is a task (Proc) + def posts(posts) + # if can_overflow? + # raise ArgumentError, 'SerializedExecution does not support thread-pools which can overflow' + # end + + return nil if posts.empty? + + jobs = posts.map { |executor, args, task| Job.new executor, args, task } + + job_to_post = synchronize do + if @being_executed + @stash.push(*jobs) + nil + else + @being_executed = true + @stash.push(*jobs[1..-1]) + jobs.first + end + end + + call_job job_to_post if job_to_post + true + end + + private + + def ns_initialize + @being_executed = false + @stash = [] + end + + def call_job(job) + did_it_run = begin + job.executor.post { work(job) } + true + rescue RejectedExecutionError => ex + false + end + + # TODO not the best idea to run it myself + unless did_it_run + begin + work job + rescue => ex + # let it fail + log DEBUG, ex + end + end + end + + # ensures next job is executed if any is stashed + def work(job) + job.call + ensure + synchronize do + job = @stash.shift || (@being_executed = false) + end + + # TODO maybe be able to tell caching pool to just enqueue this job, because the current one end at the end + # of this block + call_job job if job + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serialized_execution_delegator.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serialized_execution_delegator.rb new file mode 100644 index 0000000..8197781 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/serialized_execution_delegator.rb @@ -0,0 +1,28 @@ +require 'delegate' +require 'concurrent/executor/serial_executor_service' +require 'concurrent/executor/serialized_execution' + +module Concurrent + + # A wrapper/delegator for any `ExecutorService` that + # guarantees serialized execution of tasks. + # + # @see [SimpleDelegator](http://www.ruby-doc.org/stdlib-2.1.2/libdoc/delegate/rdoc/SimpleDelegator.html) + # @see Concurrent::SerializedExecution + class SerializedExecutionDelegator < SimpleDelegator + include SerialExecutorService + + def initialize(executor) + @executor = executor + @serializer = SerializedExecution.new + super(executor) + end + + # @!macro executor_service_method_post + def post(*args, &task) + raise ArgumentError.new('no block given') unless block_given? + return false unless running? + @serializer.post(@executor, *args, &task) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/simple_executor_service.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/simple_executor_service.rb new file mode 100644 index 0000000..b278dbf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/simple_executor_service.rb @@ -0,0 +1,100 @@ +require 'concurrent/atomics' +require 'concurrent/executor/executor_service' + +module Concurrent + + # An executor service in which every operation spawns a new, + # independently operating thread. + # + # This is perhaps the most inefficient executor service in this + # library. It exists mainly for testing an debugging. Thread creation + # and management is expensive in Ruby and this executor performs no + # resource pooling. This can be very beneficial during testing and + # debugging because it decouples the using code from the underlying + # executor implementation. In production this executor will likely + # lead to suboptimal performance. + # + # @note Intended for use primarily in testing and debugging. + class SimpleExecutorService < RubyExecutorService + + # @!macro executor_service_method_post + def self.post(*args) + raise ArgumentError.new('no block given') unless block_given? + Thread.new(*args) do + Thread.current.abort_on_exception = false + yield(*args) + end + true + end + + # @!macro executor_service_method_left_shift + def self.<<(task) + post(&task) + self + end + + # @!macro executor_service_method_post + def post(*args, &task) + raise ArgumentError.new('no block given') unless block_given? + return false unless running? + @count.increment + Thread.new(*args) do + Thread.current.abort_on_exception = false + begin + yield(*args) + ensure + @count.decrement + @stopped.set if @running.false? && @count.value == 0 + end + end + end + + # @!macro executor_service_method_left_shift + def <<(task) + post(&task) + self + end + + # @!macro executor_service_method_running_question + def running? + @running.true? + end + + # @!macro executor_service_method_shuttingdown_question + def shuttingdown? + @running.false? && ! @stopped.set? + end + + # @!macro executor_service_method_shutdown_question + def shutdown? + @stopped.set? + end + + # @!macro executor_service_method_shutdown + def shutdown + @running.make_false + @stopped.set if @count.value == 0 + true + end + + # @!macro executor_service_method_kill + def kill + @running.make_false + @stopped.set + true + end + + # @!macro executor_service_method_wait_for_termination + def wait_for_termination(timeout = nil) + @stopped.wait(timeout) + end + + private + + def ns_initialize + @running = Concurrent::AtomicBoolean.new(true) + @stopped = Concurrent::Event.new + @count = Concurrent::AtomicFixnum.new(0) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/single_thread_executor.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/single_thread_executor.rb new file mode 100644 index 0000000..125c63e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/single_thread_executor.rb @@ -0,0 +1,56 @@ +require 'concurrent/executor/ruby_single_thread_executor' + +module Concurrent + + if Concurrent.on_jruby? + require 'concurrent/executor/java_single_thread_executor' + end + + SingleThreadExecutorImplementation = case + when Concurrent.on_jruby? + JavaSingleThreadExecutor + else + RubySingleThreadExecutor + end + private_constant :SingleThreadExecutorImplementation + + # @!macro [attach] single_thread_executor + # + # A thread pool with a single thread an unlimited queue. Should the thread + # die for any reason it will be removed and replaced, thus ensuring that + # the executor will always remain viable and available to process jobs. + # + # A common pattern for background processing is to create a single thread + # on which an infinite loop is run. The thread's loop blocks on an input + # source (perhaps blocking I/O or a queue) and processes each input as it + # is received. This pattern has several issues. The thread itself is highly + # susceptible to errors during processing. Also, the thread itself must be + # constantly monitored and restarted should it die. `SingleThreadExecutor` + # encapsulates all these bahaviors. The task processor is highly resilient + # to errors from within tasks. Also, should the thread die it will + # automatically be restarted. + # + # The API and behavior of this class are based on Java's `SingleThreadExecutor`. + # + # @!macro abstract_executor_service_public_api + class SingleThreadExecutor < SingleThreadExecutorImplementation + + # @!macro [new] single_thread_executor_method_initialize + # + # Create a new thread pool. + # + # @option opts [Symbol] :fallback_policy (:discard) the policy for handling new + # tasks that are received when the queue size has reached + # `max_queue` or the executor has shut down + # + # @raise [ArgumentError] if `:fallback_policy` is not one of the values specified + # in `FALLBACK_POLICIES` + # + # @see http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html + + # @!method initialize(opts = {}) + # @!macro single_thread_executor_method_initialize + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/thread_pool_executor.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/thread_pool_executor.rb new file mode 100644 index 0000000..c0b88ee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/thread_pool_executor.rb @@ -0,0 +1,87 @@ +require 'concurrent/utility/engine' +require 'concurrent/executor/ruby_thread_pool_executor' + +module Concurrent + + if Concurrent.on_jruby? + require 'concurrent/executor/java_thread_pool_executor' + end + + ThreadPoolExecutorImplementation = case + when Concurrent.on_jruby? + JavaThreadPoolExecutor + else + RubyThreadPoolExecutor + end + private_constant :ThreadPoolExecutorImplementation + + # @!macro [attach] thread_pool_executor + # + # An abstraction composed of one or more threads and a task queue. Tasks + # (blocks or `proc` objects) are submitted to the pool and added to the queue. + # The threads in the pool remove the tasks and execute them in the order + # they were received. + # + # A `ThreadPoolExecutor` will automatically adjust the pool size according + # to the bounds set by `min-threads` and `max-threads`. When a new task is + # submitted and fewer than `min-threads` threads are running, a new thread + # is created to handle the request, even if other worker threads are idle. + # If there are more than `min-threads` but less than `max-threads` threads + # running, a new thread will be created only if the queue is full. + # + # Threads that are idle for too long will be garbage collected, down to the + # configured minimum options. Should a thread crash it, too, will be garbage collected. + # + # `ThreadPoolExecutor` is based on the Java class of the same name. From + # the official Java documentation; + # + # > Thread pools address two different problems: they usually provide + # > improved performance when executing large numbers of asynchronous tasks, + # > due to reduced per-task invocation overhead, and they provide a means + # > of bounding and managing the resources, including threads, consumed + # > when executing a collection of tasks. Each ThreadPoolExecutor also + # > maintains some basic statistics, such as the number of completed tasks. + # > + # > To be useful across a wide range of contexts, this class provides many + # > adjustable parameters and extensibility hooks. However, programmers are + # > urged to use the more convenient Executors factory methods + # > [CachedThreadPool] (unbounded thread pool, with automatic thread reclamation), + # > [FixedThreadPool] (fixed size thread pool) and [SingleThreadExecutor] (single + # > background thread), that preconfigure settings for the most common usage + # > scenarios. + # + # @!macro thread_pool_options + # + # @!macro thread_pool_executor_public_api + class ThreadPoolExecutor < ThreadPoolExecutorImplementation + + # @!macro [new] thread_pool_executor_method_initialize + # + # Create a new thread pool. + # + # @param [Hash] opts the options which configure the thread pool. + # + # @option opts [Integer] :max_threads (DEFAULT_MAX_POOL_SIZE) the maximum + # number of threads to be created + # @option opts [Integer] :min_threads (DEFAULT_MIN_POOL_SIZE) When a new task is submitted + # and fewer than `min_threads` are running, a new thread is created + # @option opts [Integer] :idletime (DEFAULT_THREAD_IDLETIMEOUT) the maximum + # number of seconds a thread may be idle before being reclaimed + # @option opts [Integer] :max_queue (DEFAULT_MAX_QUEUE_SIZE) the maximum + # number of tasks allowed in the work queue at any one time; a value of + # zero means the queue may grow without bound + # @option opts [Symbol] :fallback_policy (:abort) the policy for handling new + # tasks that are received when the queue size has reached + # `max_queue` or the executor has shut down + # + # @raise [ArgumentError] if `:max_threads` is less than one + # @raise [ArgumentError] if `:min_threads` is less than zero + # @raise [ArgumentError] if `:fallback_policy` is not one of the values specified + # in `FALLBACK_POLICIES` + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html + + # @!method initialize(opts = {}) + # @!macro thread_pool_executor_method_initialize + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/timer_set.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/timer_set.rb new file mode 100644 index 0000000..28754f1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/timer_set.rb @@ -0,0 +1,175 @@ +require 'concurrent/scheduled_task' +require 'concurrent/atomic/event' +require 'concurrent/collection/non_concurrent_priority_queue' +require 'concurrent/executor/executor_service' +require 'concurrent/executor/single_thread_executor' + +require 'concurrent/options' + +module Concurrent + + # Executes a collection of tasks, each after a given delay. A master task + # monitors the set and schedules each task for execution at the appropriate + # time. Tasks are run on the global thread pool or on the supplied executor. + # Each task is represented as a `ScheduledTask`. + # + # @see Concurrent::ScheduledTask + # + # @!macro monotonic_clock_warning + class TimerSet < RubyExecutorService + + # Create a new set of timed tasks. + # + # @!macro [attach] executor_options + # + # @param [Hash] opts the options used to specify the executor on which to perform actions + # @option opts [Executor] :executor when set use the given `Executor` instance. + # Three special values are also supported: `:task` returns the global task pool, + # `:operation` returns the global operation pool, and `:immediate` returns a new + # `ImmediateExecutor` object. + def initialize(opts = {}) + super(opts) + end + + # Post a task to be execute run after a given delay (in seconds). If the + # delay is less than 1/100th of a second the task will be immediately post + # to the executor. + # + # @param [Float] delay the number of seconds to wait for before executing the task. + # @param [Array] args the arguments passed to the task on execution. + # + # @yield the task to be performed. + # + # @return [Concurrent::ScheduledTask, false] IVar representing the task if the post + # is successful; false after shutdown. + # + # @raise [ArgumentError] if the intended execution time is not in the future. + # @raise [ArgumentError] if no block is given. + def post(delay, *args, &task) + raise ArgumentError.new('no block given') unless block_given? + return false unless running? + opts = { + executor: @task_executor, + args: args, + timer_set: self + } + task = ScheduledTask.execute(delay, opts, &task) # may raise exception + task.unscheduled? ? false : task + end + + # Begin an immediate shutdown. In-progress tasks will be allowed to + # complete but enqueued tasks will be dismissed and no new tasks + # will be accepted. Has no additional effect if the thread pool is + # not running. + def kill + shutdown + end + + private :<< + + private + + # Initialize the object. + # + # @param [Hash] opts the options to create the object with. + # @!visibility private + def ns_initialize(opts) + @queue = Collection::NonConcurrentPriorityQueue.new(order: :min) + @task_executor = Options.executor_from_options(opts) || Concurrent.global_io_executor + @timer_executor = SingleThreadExecutor.new + @condition = Event.new + @ruby_pid = $$ # detects if Ruby has forked + self.auto_terminate = opts.fetch(:auto_terminate, true) + end + + # Post the task to the internal queue. + # + # @note This is intended as a callback method from ScheduledTask + # only. It is not intended to be used directly. Post a task + # by using the `SchedulesTask#execute` method. + # + # @!visibility private + def post_task(task) + synchronize{ ns_post_task(task) } + end + + # @!visibility private + def ns_post_task(task) + return false unless ns_running? + ns_reset_if_forked + if (task.initial_delay) <= 0.01 + task.executor.post{ task.process_task } + else + @queue.push(task) + # only post the process method when the queue is empty + @timer_executor.post(&method(:process_tasks)) if @queue.length == 1 + @condition.set + end + true + end + + # Remove the given task from the queue. + # + # @note This is intended as a callback method from `ScheduledTask` + # only. It is not intended to be used directly. Cancel a task + # by using the `ScheduledTask#cancel` method. + # + # @!visibility private + def remove_task(task) + synchronize{ @queue.delete(task) } + end + + # `ExecutorService` callback called during shutdown. + # + # @!visibility private + def ns_shutdown_execution + ns_reset_if_forked + @queue.clear + @timer_executor.kill + stopped_event.set + end + + def ns_reset_if_forked + if $$ != @ruby_pid + @queue.clear + @condition.reset + @ruby_pid = $$ + end + end + + # Run a loop and execute tasks in the scheduled order and at the approximate + # scheduled time. If no tasks remain the thread will exit gracefully so that + # garbage collection can occur. If there are no ready tasks it will sleep + # for up to 60 seconds waiting for the next scheduled task. + # + # @!visibility private + def process_tasks + loop do + task = synchronize { @condition.reset; @queue.peek } + break unless task + + now = Concurrent.monotonic_time + diff = task.schedule_time - now + + if diff <= 0 + # We need to remove the task from the queue before passing + # it to the executor, to avoid race conditions where we pass + # the peek'ed task to the executor and then pop a different + # one that's been added in the meantime. + # + # Note that there's no race condition between the peek and + # this pop - this pop could retrieve a different task from + # the peek, but that task would be due to fire now anyway + # (because @queue is a priority queue, and this thread is + # the only reader, so whatever timer is at the head of the + # queue now must have the same pop time, or a closer one, as + # when we peeked). + task = synchronize { @queue.pop } + task.executor.post{ task.process_task } + else + @condition.wait([diff, 60].min) + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executors.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executors.rb new file mode 100644 index 0000000..eb1972c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executors.rb @@ -0,0 +1,20 @@ +require 'concurrent/executor/abstract_executor_service' +require 'concurrent/executor/cached_thread_pool' +require 'concurrent/executor/executor_service' +require 'concurrent/executor/fixed_thread_pool' +require 'concurrent/executor/immediate_executor' +require 'concurrent/executor/indirect_immediate_executor' +require 'concurrent/executor/java_executor_service' +require 'concurrent/executor/java_single_thread_executor' +require 'concurrent/executor/java_thread_pool_executor' +require 'concurrent/executor/ruby_executor_service' +require 'concurrent/executor/ruby_single_thread_executor' +require 'concurrent/executor/ruby_thread_pool_executor' +require 'concurrent/executor/cached_thread_pool' +require 'concurrent/executor/safe_task_executor' +require 'concurrent/executor/serial_executor_service' +require 'concurrent/executor/serialized_execution' +require 'concurrent/executor/serialized_execution_delegator' +require 'concurrent/executor/single_thread_executor' +require 'concurrent/executor/thread_pool_executor' +require 'concurrent/executor/timer_set' diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/future.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/future.rb new file mode 100644 index 0000000..097f1bb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/future.rb @@ -0,0 +1,138 @@ +require 'thread' +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/ivar' +require 'concurrent/executor/safe_task_executor' + +require 'concurrent/options' + +module Concurrent + + # {include:file:doc/future.md} + # + # @!macro copy_options + # + # @see http://ruby-doc.org/stdlib-2.1.1/libdoc/observer/rdoc/Observable.html Ruby Observable module + # @see http://clojuredocs.org/clojure_core/clojure.core/future Clojure's future function + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html java.util.concurrent.Future + class Future < IVar + + # Create a new `Future` in the `:unscheduled` state. + # + # @yield the asynchronous operation to perform + # + # @!macro executor_and_deref_options + # + # @option opts [object, Array] :args zero or more arguments to be passed the task + # block on execution + # + # @raise [ArgumentError] if no block is given + def initialize(opts = {}, &block) + raise ArgumentError.new('no block given') unless block_given? + super(NULL, opts.merge(__task_from_block__: block), &nil) + end + + # Execute an `:unscheduled` `Future`. Immediately sets the state to `:pending` and + # passes the block to a new thread/thread pool for eventual execution. + # Does nothing if the `Future` is in any state other than `:unscheduled`. + # + # @return [Future] a reference to `self` + # + # @example Instance and execute in separate steps + # future = Concurrent::Future.new{ sleep(1); 42 } + # future.state #=> :unscheduled + # future.execute + # future.state #=> :pending + # + # @example Instance and execute in one line + # future = Concurrent::Future.new{ sleep(1); 42 }.execute + # future.state #=> :pending + def execute + if compare_and_set_state(:pending, :unscheduled) + @executor.post{ safe_execute(@task, @args) } + self + end + end + + # Create a new `Future` object with the given block, execute it, and return the + # `:pending` object. + # + # @yield the asynchronous operation to perform + # + # @!macro executor_and_deref_options + # + # @option opts [object, Array] :args zero or more arguments to be passed the task + # block on execution + # + # @raise [ArgumentError] if no block is given + # + # @return [Future] the newly created `Future` in the `:pending` state + # + # @example + # future = Concurrent::Future.execute{ sleep(1); 42 } + # future.state #=> :pending + def self.execute(opts = {}, &block) + Future.new(opts, &block).execute + end + + # @!macro ivar_set_method + def set(value = NULL, &block) + check_for_block_or_value!(block_given?, value) + synchronize do + if @state != :unscheduled + raise MultipleAssignmentError + else + @task = block || Proc.new { value } + end + end + execute + end + + # Attempt to cancel the operation if it has not already processed. + # The operation can only be cancelled while still `pending`. It cannot + # be cancelled once it has begun processing or has completed. + # + # @return [Boolean] was the operation successfully cancelled. + def cancel + if compare_and_set_state(:cancelled, :pending) + complete(false, nil, CancelledOperationError.new) + true + else + false + end + end + + # Has the operation been successfully cancelled? + # + # @return [Boolean] + def cancelled? + state == :cancelled + end + + # Wait the given number of seconds for the operation to complete. + # On timeout attempt to cancel the operation. + # + # @param [Numeric] timeout the maximum time in seconds to wait. + # @return [Boolean] true if the operation completed before the timeout + # else false + def wait_or_cancel(timeout) + wait(timeout) + if complete? + true + else + cancel + false + end + end + + protected + + def ns_initialize(value, opts) + super + @state = :unscheduled + @task = opts[:__task_from_block__] + @executor = Options.executor_from_options(opts) || Concurrent.global_io_executor + @args = get_arguments_from(opts) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/hash.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/hash.rb new file mode 100644 index 0000000..235ead5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/hash.rb @@ -0,0 +1,36 @@ +require 'concurrent/utility/engine' +require 'concurrent/thread_safe/util' + +module Concurrent + if Concurrent.on_cruby? + + # @!macro [attach] concurrent_hash + # + # A thread-safe subclass of Hash. This version locks against the object + # itself for every method call, ensuring only one thread can be reading + # or writing at a time. This includes iteration methods like `#each`, + # which takes the lock repeatedly when reading an item. + # + # @see http://ruby-doc.org/core-2.2.0/Hash.html Ruby standard library `Hash` + class Hash < ::Hash; + end + + elsif Concurrent.on_jruby? + require 'jruby/synchronized' + + # @!macro concurrent_hash + class Hash < ::Hash + include JRuby::Synchronized + end + + elsif Concurrent.on_rbx? || Concurrent.on_truffle? + require 'monitor' + require 'concurrent/thread_safe/util/array_hash_rbx' + + # @!macro concurrent_hash + class Hash < ::Hash + end + + ThreadSafe::Util.make_synchronized_on_rbx Hash + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/immutable_struct.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/immutable_struct.rb new file mode 100644 index 0000000..05b8035 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/immutable_struct.rb @@ -0,0 +1,93 @@ +require 'concurrent/synchronization/abstract_struct' +require 'concurrent/synchronization' + +module Concurrent + + # A thread-safe, immutable variation of Ruby's standard `Struct`. + # + # @see http://ruby-doc.org/core-2.2.0/Struct.html Ruby standard library `Struct` + module ImmutableStruct + include Synchronization::AbstractStruct + + def self.included(base) + base.safe_initialization! + end + + # @!macro struct_values + def values + ns_values + end + + alias_method :to_a, :values + + # @!macro struct_values_at + def values_at(*indexes) + ns_values_at(indexes) + end + + # @!macro struct_inspect + def inspect + ns_inspect + end + + alias_method :to_s, :inspect + + # @!macro struct_merge + def merge(other, &block) + ns_merge(other, &block) + end + + # @!macro struct_to_h + def to_h + ns_to_h + end + + # @!macro struct_get + def [](member) + ns_get(member) + end + + # @!macro struct_equality + def ==(other) + ns_equality(other) + end + + # @!macro struct_each + def each(&block) + return enum_for(:each) unless block_given? + ns_each(&block) + end + + # @!macro struct_each_pair + def each_pair(&block) + return enum_for(:each_pair) unless block_given? + ns_each_pair(&block) + end + + # @!macro struct_select + def select(&block) + return enum_for(:select) unless block_given? + ns_select(&block) + end + + # @!macro struct_new + def self.new(*args, &block) + clazz_name = nil + if args.length == 0 + raise ArgumentError.new('wrong number of arguments (0 for 1+)') + elsif args.length > 0 && args.first.is_a?(String) + clazz_name = args.shift + end + FACTORY.define_struct(clazz_name, args, &block) + end + + FACTORY = Class.new(Synchronization::LockableObject) do + def define_struct(name, members, &block) + synchronize do + Synchronization::AbstractStruct.define_struct_class(ImmutableStruct, Synchronization::Object, name, members, &block) + end + end + end.new + private_constant :FACTORY + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/ivar.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/ivar.rb new file mode 100644 index 0000000..994a620 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/ivar.rb @@ -0,0 +1,208 @@ +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/collection/copy_on_write_observer_set' +require 'concurrent/concern/obligation' +require 'concurrent/concern/observable' +require 'concurrent/synchronization' + +module Concurrent + + # An `IVar` is like a future that you can assign. As a future is a value that + # is being computed that you can wait on, an `IVar` is a value that is waiting + # to be assigned, that you can wait on. `IVars` are single assignment and + # deterministic. + # + # Then, express futures as an asynchronous computation that assigns an `IVar`. + # The `IVar` becomes the primitive on which [futures](Future) and + # [dataflow](Dataflow) are built. + # + # An `IVar` is a single-element container that is normally created empty, and + # can only be set once. The I in `IVar` stands for immutable. Reading an + # `IVar` normally blocks until it is set. It is safe to set and read an `IVar` + # from different threads. + # + # If you want to have some parallel task set the value in an `IVar`, you want + # a `Future`. If you want to create a graph of parallel tasks all executed + # when the values they depend on are ready you want `dataflow`. `IVar` is + # generally a low-level primitive. + # + # ## Examples + # + # Create, set and get an `IVar` + # + # ```ruby + # ivar = Concurrent::IVar.new + # ivar.set 14 + # ivar.value #=> 14 + # ivar.set 2 # would now be an error + # ``` + # + # ## See Also + # + # 1. For the theory: Arvind, R. Nikhil, and K. Pingali. + # [I-Structures: Data structures for parallel computing](http://dl.acm.org/citation.cfm?id=69562). + # In Proceedings of Workshop on Graph Reduction, 1986. + # 2. For recent application: + # [DataDrivenFuture in Habanero Java from Rice](http://www.cs.rice.edu/~vs3/hjlib/doc/edu/rice/hj/api/HjDataDrivenFuture.html). + class IVar < Synchronization::LockableObject + include Concern::Obligation + include Concern::Observable + + # Create a new `IVar` in the `:pending` state with the (optional) initial value. + # + # @param [Object] value the initial value + # @param [Hash] opts the options to create a message with + # @option opts [String] :dup_on_deref (false) call `#dup` before returning + # the data + # @option opts [String] :freeze_on_deref (false) call `#freeze` before + # returning the data + # @option opts [String] :copy_on_deref (nil) call the given `Proc` passing + # the internal value and returning the value returned from the proc + def initialize(value = NULL, opts = {}, &block) + if value != NULL && block_given? + raise ArgumentError.new('provide only a value or a block') + end + super(&nil) + synchronize { ns_initialize(value, opts, &block) } + end + + # Add an observer on this object that will receive notification on update. + # + # Upon completion the `IVar` will notify all observers in a thread-safe way. + # The `func` method of the observer will be called with three arguments: the + # `Time` at which the `Future` completed the asynchronous operation, the + # final `value` (or `nil` on rejection), and the final `reason` (or `nil` on + # fulfillment). + # + # @param [Object] observer the object that will be notified of changes + # @param [Symbol] func symbol naming the method to call when this + # `Observable` has changes` + def add_observer(observer = nil, func = :update, &block) + raise ArgumentError.new('cannot provide both an observer and a block') if observer && block + direct_notification = false + + if block + observer = block + func = :call + end + + synchronize do + if event.set? + direct_notification = true + else + observers.add_observer(observer, func) + end + end + + observer.send(func, Time.now, self.value, reason) if direct_notification + observer + end + + # @!macro [attach] ivar_set_method + # Set the `IVar` to a value and wake or notify all threads waiting on it. + # + # @!macro [attach] ivar_set_parameters_and_exceptions + # @param [Object] value the value to store in the `IVar` + # @yield A block operation to use for setting the value + # @raise [ArgumentError] if both a value and a block are given + # @raise [Concurrent::MultipleAssignmentError] if the `IVar` has already + # been set or otherwise completed + # + # @return [IVar] self + def set(value = NULL) + check_for_block_or_value!(block_given?, value) + raise MultipleAssignmentError unless compare_and_set_state(:processing, :pending) + + begin + value = yield if block_given? + complete_without_notification(true, value, nil) + rescue => ex + complete_without_notification(false, nil, ex) + end + + notify_observers(self.value, reason) + self + end + + # @!macro [attach] ivar_fail_method + # Set the `IVar` to failed due to some error and wake or notify all threads waiting on it. + # + # @param [Object] reason for the failure + # @raise [Concurrent::MultipleAssignmentError] if the `IVar` has already + # been set or otherwise completed + # @return [IVar] self + def fail(reason = StandardError.new) + complete(false, nil, reason) + end + + # Attempt to set the `IVar` with the given value or block. Return a + # boolean indicating the success or failure of the set operation. + # + # @!macro ivar_set_parameters_and_exceptions + # + # @return [Boolean] true if the value was set else false + def try_set(value = NULL, &block) + set(value, &block) + true + rescue MultipleAssignmentError + false + end + + protected + + # @!visibility private + def ns_initialize(value, opts) + value = yield if block_given? + init_obligation + self.observers = Collection::CopyOnWriteObserverSet.new + set_deref_options(opts) + + if value == NULL + @state = :pending + else + ns_complete_without_notification(true, value, nil) + end + end + + # @!visibility private + def safe_execute(task, args = []) + if compare_and_set_state(:processing, :pending) + success, val, reason = SafeTaskExecutor.new(task, rescue_exception: true).execute(*@args) + complete(success, val, reason) + yield(success, val, reason) if block_given? + end + end + + # @!visibility private + def complete(success, value, reason) + complete_without_notification(success, value, reason) + notify_observers(self.value, reason) + self + end + + # @!visibility private + def complete_without_notification(success, value, reason) + synchronize { ns_complete_without_notification(success, value, reason) } + self + end + + # @!visibility private + def notify_observers(value, reason) + observers.notify_and_delete_observers{ [Time.now, value, reason] } + end + + # @!visibility private + def ns_complete_without_notification(success, value, reason) + raise MultipleAssignmentError if [:fulfilled, :rejected].include? @state + set_state(success, value, reason) + event.set + end + + # @!visibility private + def check_for_block_or_value!(block_given, value) # :nodoc: + if (block_given && value != NULL) || (! block_given && value == NULL) + raise ArgumentError.new('must set with either a value or a block') + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/lazy_register.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/lazy_register.rb new file mode 100644 index 0000000..43928f8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/lazy_register.rb @@ -0,0 +1,81 @@ +require 'concurrent/atomic/atomic_reference' +require 'concurrent/delay' + +module Concurrent + + # Hash-like collection that store lazys evaluated values. + # + # @example + # register = Concurrent::LazyRegister.new + # #=> #> + # register[:key] + # #=> nil + # register.add(:key) { Concurrent::Actor.spawn!(Actor::AdHoc, :ping) { -> message { message } } } + # #=> #> + # register[:key] + # #=> # + # + # @!macro edge_warning + class LazyRegister < Synchronization::Object + + private(*attr_atomic(:data)) + + def initialize + super + self.data = {} + end + + # Element reference. Retrieves the value object corresponding to the + # key object. Returns nil if the key is not found. Raises an exception + # if the stored item raised an exception when the block was evaluated. + # + # @param [Object] key + # @return [Object] value stored for the key or nil if the key is not found + # + # @raise Exception when the initialization block fails + def [](key) + delay = data[key] + delay ? delay.value! : nil + end + + # Returns true if the given key is present. + # + # @param [Object] key + # @return [true, false] if the key is registered + def registered?(key) + data.key?(key) + end + + alias_method :key?, :registered? + alias_method :has_key?, :registered? + + # Element assignment. Associates the value given by value with the + # key given by key. + # + # @param [Object] key + # @yield the object to store under the key + # + # @return [LazyRegister] self + def register(key, &block) + delay = Delay.new(executor: :immediate, &block) + update_data { |h| h.merge(key => delay) } + self + end + + alias_method :add, :register + alias_method :store, :register + + # Un-registers the object under key, realized or not. + # + # @param [Object] key + # + # @return [LazyRegister] self + def unregister(key) + update_data { |h| h.dup.tap { |j| j.delete(key) } } + self + end + + alias_method :remove, :unregister + alias_method :delete, :unregister + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/map.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/map.rb new file mode 100644 index 0000000..814deb0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/map.rb @@ -0,0 +1,240 @@ +require 'thread' +require 'concurrent/constants' +require 'concurrent/synchronization' + +module Concurrent + # @!visibility private + module Collection + + # @!visibility private + MapImplementation = if Concurrent.java_extensions_loaded? + # noinspection RubyResolve + JRubyMapBackend + elsif defined?(RUBY_ENGINE) + case RUBY_ENGINE + when 'ruby' + require 'concurrent/collection/map/mri_map_backend' + MriMapBackend + when 'rbx' + require 'concurrent/collection/map/atomic_reference_map_backend' + AtomicReferenceMapBackend + when 'jruby+truffle' + require 'concurrent/collection/map/atomic_reference_map_backend' + AtomicReferenceMapBackend + else + warn 'Concurrent::Map: unsupported Ruby engine, using a fully synchronized Concurrent::Map implementation' if $VERBOSE + require 'concurrent/collection/map/synchronized_map_backend' + SynchronizedMapBackend + end + else + MriMapBackend + end + end + + # `Concurrent::Map` is a hash-like object and should have much better performance + # characteristics, especially under high concurrency, than `Concurrent::Hash`. + # However, `Concurrent::Map `is not strictly semantically equivalent to a ruby `Hash` + # -- for instance, it does not necessarily retain ordering by insertion time as `Hash` + # does. For most uses it should do fine though, and we recommend you consider + # `Concurrent::Map` instead of `Concurrent::Hash` for your concurrency-safe hash needs. + # + # > require 'concurrent' + # > + # > map = Concurrent::Map.new + class Map < Collection::MapImplementation + + # @!macro [new] map_method_is_atomic + # This method is atomic. Atomic methods of `Map` which accept a block + # do not allow the `self` instance to be used within the block. Doing + # so will cause a deadlock. + + # @!method put_if_absent + # @!macro map_method_is_atomic + + # @!method compute_if_absent + # @!macro map_method_is_atomic + + # @!method compute_if_present + # @!macro map_method_is_atomic + + # @!method compute + # @!macro map_method_is_atomic + + # @!method merge_pair + # @!macro map_method_is_atomic + + # @!method replace_pair + # @!macro map_method_is_atomic + + # @!method replace_if_exists + # @!macro map_method_is_atomic + + # @!method get_and_set + # @!macro map_method_is_atomic + + # @!method delete + # @!macro map_method_is_atomic + + # @!method delete_pair + # @!macro map_method_is_atomic + + def initialize(options = nil, &block) + if options.kind_of?(::Hash) + validate_options_hash!(options) + else + options = nil + end + + super(options) + @default_proc = block + end + + def [](key) + if value = super # non-falsy value is an existing mapping, return it right away + value + # re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call + # a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value + # would be returned) + # note: nil == value check is not technically necessary + elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL)) + @default_proc.call(self, key) + else + value + end + end + + alias_method :get, :[] + alias_method :put, :[]= + + # @!macro [attach] map_method_not_atomic + # The "fetch-then-act" methods of `Map` are not atomic. `Map` is intended + # to be use as a concurrency primitive with strong happens-before + # guarantees. It is not intended to be used as a high-level abstraction + # supporting complex operations. All read and write operations are + # thread safe, but no guarantees are made regarding race conditions + # between the fetch operation and yielding to the block. Additionally, + # this method does not support recursion. This is due to internal + # constraints that are very unlikely to change in the near future. + def fetch(key, default_value = NULL) + if NULL != (value = get_or_default(key, NULL)) + value + elsif block_given? + yield key + elsif NULL != default_value + default_value + else + raise_fetch_no_key + end + end + + # @!macro map_method_not_atomic + def fetch_or_store(key, default_value = NULL) + fetch(key) do + put(key, block_given? ? yield(key) : (NULL == default_value ? raise_fetch_no_key : default_value)) + end + end + + # @!macro map_method_is_atomic + def put_if_absent(key, value) + computed = false + result = compute_if_absent(key) do + computed = true + value + end + computed ? nil : result + end unless method_defined?(:put_if_absent) + + def value?(value) + each_value do |v| + return true if value.equal?(v) + end + false + end + + def keys + arr = [] + each_pair {|k, v| arr << k} + arr + end unless method_defined?(:keys) + + def values + arr = [] + each_pair {|k, v| arr << v} + arr + end unless method_defined?(:values) + + def each_key + each_pair {|k, v| yield k} + end unless method_defined?(:each_key) + + def each_value + each_pair {|k, v| yield v} + end unless method_defined?(:each_value) + + alias_method :each, :each_pair unless method_defined?(:each) + + def key(value) + each_pair {|k, v| return k if v == value} + nil + end unless method_defined?(:key) + alias_method :index, :key if RUBY_VERSION < '1.9' + + def empty? + each_pair {|k, v| return false} + true + end unless method_defined?(:empty?) + + def size + count = 0 + each_pair {|k, v| count += 1} + count + end unless method_defined?(:size) + + def marshal_dump + raise TypeError, "can't dump hash with default proc" if @default_proc + h = {} + each_pair {|k, v| h[k] = v} + h + end + + def marshal_load(hash) + initialize + populate_from(hash) + end + + undef :freeze + + # @!visibility private + DEFAULT_OBJ_ID_STR_WIDTH = 0.size == 4 ? 7 : 14 # we want to look "native", 7 for 32-bit, 14 for 64-bit + # override default #inspect() method: firstly, we don't want to be spilling our guts (i-vars), secondly, MRI backend's + # #inspect() call on its @backend i-var will bump @backend's iter level while possibly yielding GVL + def inspect + id_str = (object_id << 1).to_s(16).rjust(DEFAULT_OBJ_ID_STR_WIDTH, '0') + "#<#{self.class.name}:0x#{id_str} entries=#{size} default_proc=#{@default_proc.inspect}>" + end + + private + def raise_fetch_no_key + raise KeyError, 'key not found' + end + + def initialize_copy(other) + super + populate_from(other) + end + + def populate_from(hash) + hash.each_pair {|k, v| self[k] = v} + self + end + + def validate_options_hash!(options) + if (initial_capacity = options[:initial_capacity]) && (!initial_capacity.kind_of?(Integer) || initial_capacity < 0) + raise ArgumentError, ":initial_capacity must be a positive Integer" + end + if (load_factor = options[:load_factor]) && (!load_factor.kind_of?(Numeric) || load_factor <= 0 || load_factor > 1) + raise ArgumentError, ":load_factor must be a number between 0 and 1" + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/maybe.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/maybe.rb new file mode 100644 index 0000000..6014594 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/maybe.rb @@ -0,0 +1,229 @@ +require 'concurrent/synchronization' + +module Concurrent + + # A `Maybe` encapsulates an optional value. A `Maybe` either contains a value + # of (represented as `Just`), or it is empty (represented as `Nothing`). Using + # `Maybe` is a good way to deal with errors or exceptional cases without + # resorting to drastic measures such as exceptions. + # + # `Maybe` is a replacement for the use of `nil` with better type checking. + # + # For compatibility with {Concurrent::Concern::Obligation} the predicate and + # accessor methods are aliased as `fulfilled?`, `rejected?`, `value`, and + # `reason`. + # + # ## Motivation + # + # A common pattern in languages with pattern matching, such as Erlang and + # Haskell, is to return *either* a value *or* an error from a function + # Consider this Erlang code: + # + # ```erlang + # case file:consult("data.dat") of + # {ok, Terms} -> do_something_useful(Terms); + # {error, Reason} -> lager:error(Reason) + # end. + # ``` + # + # In this example the standard library function `file:consult` returns a + # [tuple](http://erlang.org/doc/reference_manual/data_types.html#id69044) + # with two elements: an [atom](http://erlang.org/doc/reference_manual/data_types.html#id64134) + # (similar to a ruby symbol) and a variable containing ancillary data. On + # success it returns the atom `ok` and the data from the file. On failure it + # returns `error` and a string with an explanation of the problem. With this + # pattern there is no ambiguity regarding success or failure. If the file is + # empty the return value cannot be misinterpreted as an error. And when an + # error occurs the return value provides useful information. + # + # In Ruby we tend to return `nil` when an error occurs or else we raise an + # exception. Both of these idioms are problematic. Returning `nil` is + # ambiguous because `nil` may also be a valid value. It also lacks + # information pertaining to the nature of the error. Raising an exception + # is both expensive and usurps the normal flow of control. All of these + # problems can be solved with the use of a `Maybe`. + # + # A `Maybe` is unambiguous with regard to whether or not it contains a value. + # When `Just` it contains a value, when `Nothing` it does not. When `Just` + # the value it contains may be `nil`, which is perfectly valid. When + # `Nothing` the reason for the lack of a value is contained as well. The + # previous Erlang example can be duplicated in Ruby in a principled way by + # having functions return `Maybe` objects: + # + # ```ruby + # result = MyFileUtils.consult("data.dat") # returns a Maybe + # if result.just? + # do_something_useful(result.value) # or result.just + # else + # logger.error(result.reason) # or result.nothing + # end + # ``` + # + # @example Returning a Maybe from a Function + # module MyFileUtils + # def self.consult(path) + # file = File.open(path, 'r') + # Concurrent::Maybe.just(file.read) + # rescue => ex + # return Concurrent::Maybe.nothing(ex) + # ensure + # file.close if file + # end + # end + # + # maybe = MyFileUtils.consult('bogus.file') + # maybe.just? #=> false + # maybe.nothing? #=> true + # maybe.reason #=> # + # + # maybe = MyFileUtils.consult('README.md') + # maybe.just? #=> true + # maybe.nothing? #=> false + # maybe.value #=> "# Concurrent Ruby\n[![Gem Version..." + # + # @example Using Maybe with a Block + # result = Concurrent::Maybe.from do + # Client.find(10) # Client is an ActiveRecord model + # end + # + # # -- if the record was found + # result.just? #=> true + # result.value #=> # + # + # # -- if the record was not found + # result.just? #=> false + # result.reason #=> ActiveRecord::RecordNotFound + # + # @example Using Maybe with the Null Object Pattern + # # In a Rails controller... + # result = ClientService.new(10).find # returns a Maybe + # render json: result.or(NullClient.new) + # + # @see https://hackage.haskell.org/package/base-4.2.0.1/docs/Data-Maybe.html Haskell Data.Maybe + # @see https://github.com/purescript/purescript-maybe/blob/master/docs/Data.Maybe.md PureScript Data.Maybe + class Maybe < Synchronization::Object + include Comparable + safe_initialization! + + # Indicates that the given attribute has not been set. + # When `Just` the {#nothing} getter will return `NONE`. + # When `Nothing` the {#just} getter will return `NONE`. + NONE = Object.new.freeze + + # The value of a `Maybe` when `Just`. Will be `NONE` when `Nothing`. + attr_reader :just + + # The reason for the `Maybe` when `Nothing`. Will be `NONE` when `Just`. + attr_reader :nothing + + private_class_method :new + + # Create a new `Maybe` using the given block. + # + # Runs the given block passing all function arguments to the block as block + # arguments. If the block runs to completion without raising an exception + # a new `Just` is created with the value set to the return value of the + # block. If the block raises an exception a new `Nothing` is created with + # the reason being set to the raised exception. + # + # @param [Array] args Zero or more arguments to pass to the block. + # @yield The block from which to create a new `Maybe`. + # @yieldparam [Array] args Zero or more block arguments passed as + # arguments to the function. + # + # @return [Maybe] The newly created object. + # + # @raise [ArgumentError] when no block given. + def self.from(*args) + raise ArgumentError.new('no block given') unless block_given? + begin + value = yield(*args) + return new(value, NONE) + rescue => ex + return new(NONE, ex) + end + end + + # Create a new `Just` with the given value. + # + # @param [Object] value The value to set for the new `Maybe` object. + # + # @return [Maybe] The newly created object. + def self.just(value) + return new(value, NONE) + end + + # Create a new `Nothing` with the given (optional) reason. + # + # @param [Exception] error The reason to set for the new `Maybe` object. + # When given a string a new `StandardError` will be created with the + # argument as the message. When no argument is given a new + # `StandardError` with an empty message will be created. + # + # @return [Maybe] The newly created object. + def self.nothing(error = '') + if error.is_a?(Exception) + nothing = error + else + nothing = StandardError.new(error.to_s) + end + return new(NONE, nothing) + end + + # Is this `Maybe` a `Just` (successfully fulfilled with a value)? + # + # @return [Boolean] True if `Just` or false if `Nothing`. + def just? + ! nothing? + end + alias :fulfilled? :just? + + # Is this `Maybe` a `nothing` (rejected with an exception upon fulfillment)? + # + # @return [Boolean] True if `Nothing` or false if `Just`. + def nothing? + @nothing != NONE + end + alias :rejected? :nothing? + + alias :value :just + + alias :reason :nothing + + # Comparison operator. + # + # @return [Integer] 0 if self and other are both `Nothing`; + # -1 if self is `Nothing` and other is `Just`; + # 1 if self is `Just` and other is nothing; + # `self.just <=> other.just` if both self and other are `Just`. + def <=>(other) + if nothing? + other.nothing? ? 0 : -1 + else + other.nothing? ? 1 : just <=> other.just + end + end + + # Return either the value of self or the given default value. + # + # @return [Object] The value of self when `Just`; else the given default. + def or(other) + just? ? just : other + end + + private + + # Create a new `Maybe` with the given attributes. + # + # @param [Object] just The value when `Just` else `NONE`. + # @param [Exception, Object] nothing The exception when `Nothing` else `NONE`. + # + # @return [Maybe] The new `Maybe`. + # + # @!visibility private + def initialize(just, nothing) + @just = just + @nothing = nothing + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/mutable_struct.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/mutable_struct.rb new file mode 100644 index 0000000..a158701 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/mutable_struct.rb @@ -0,0 +1,228 @@ +require 'concurrent/synchronization/abstract_struct' +require 'concurrent/synchronization' + +module Concurrent + + # An thread-safe variation of Ruby's standard `Struct`. Values can be set at + # construction or safely changed at any time during the object's lifecycle. + # + # @see http://ruby-doc.org/core-2.2.0/Struct.html Ruby standard library `Struct` + module MutableStruct + include Synchronization::AbstractStruct + + # @!macro [new] struct_new + # + # Factory for creating new struct classes. + # + # ``` + # new([class_name] [, member_name]+>) -> StructClass click to toggle source + # new([class_name] [, member_name]+>) {|StructClass| block } -> StructClass + # new(value, ...) -> obj + # StructClass[value, ...] -> obj + # ``` + # + # The first two forms are used to create a new struct subclass `class_name` + # that can contain a value for each member_name . This subclass can be + # used to create instances of the structure like any other Class . + # + # If the `class_name` is omitted an anonymous struct class will be created. + # Otherwise, the name of this struct will appear as a constant in the struct class, + # so it must be unique for all structs under this base class and must start with a + # capital letter. Assigning a struct class to a constant also gives the class + # the name of the constant. + # + # If a block is given it will be evaluated in the context of `StructClass`, passing + # the created class as a parameter. This is the recommended way to customize a struct. + # Subclassing an anonymous struct creates an extra anonymous class that will never be used. + # + # The last two forms create a new instance of a struct subclass. The number of value + # parameters must be less than or equal to the number of attributes defined for the + # struct. Unset parameters default to nil. Passing more parameters than number of attributes + # will raise an `ArgumentError`. + # + # @see http://ruby-doc.org/core-2.2.0/Struct.html#method-c-new Ruby standard library `Struct#new` + + # @!macro [attach] struct_values + # + # Returns the values for this struct as an Array. + # + # @return [Array] the values for this struct + # + def values + synchronize { ns_values } + end + alias_method :to_a, :values + + # @!macro [attach] struct_values_at + # + # Returns the struct member values for each selector as an Array. + # + # A selector may be either an Integer offset or a Range of offsets (as in `Array#values_at`). + # + # @param [Fixnum, Range] indexes the index(es) from which to obatin the values (in order) + def values_at(*indexes) + synchronize { ns_values_at(indexes) } + end + + # @!macro [attach] struct_inspect + # + # Describe the contents of this struct in a string. + # + # @return [String] the contents of this struct in a string + def inspect + synchronize { ns_inspect } + end + alias_method :to_s, :inspect + + # @!macro [attach] struct_merge + # + # Returns a new struct containing the contents of `other` and the contents + # of `self`. If no block is specified, the value for entries with duplicate + # keys will be that of `other`. Otherwise the value for each duplicate key + # is determined by calling the block with the key, its value in `self` and + # its value in `other`. + # + # @param [Hash] other the hash from which to set the new values + # @yield an options block for resolving duplicate keys + # @yieldparam [String, Symbol] member the name of the member which is duplicated + # @yieldparam [Object] selfvalue the value of the member in `self` + # @yieldparam [Object] othervalue the value of the member in `other` + # + # @return [Synchronization::AbstractStruct] a new struct with the new values + # + # @raise [ArgumentError] of given a member that is not defined in the struct + def merge(other, &block) + synchronize { ns_merge(other, &block) } + end + + # @!macro [attach] struct_to_h + # + # Returns a hash containing the names and values for the struct’s members. + # + # @return [Hash] the names and values for the struct’s members + def to_h + synchronize { ns_to_h } + end + + # @!macro [attach] struct_get + # + # Attribute Reference + # + # @param [Symbol, String, Integer] member the string or symbol name of the memeber + # for which to obtain the value or the member's index + # + # @return [Object] the value of the given struct member or the member at the given index. + # + # @raise [NameError] if the member does not exist + # @raise [IndexError] if the index is out of range. + def [](member) + synchronize { ns_get(member) } + end + + # @!macro [attach] struct_equality + # + # Equality + # + # @return [Boolean] true if other has the same struct subclass and has + # equal member values (according to `Object#==`) + def ==(other) + synchronize { ns_equality(other) } + end + + # @!macro [attach] struct_each + # + # Yields the value of each struct member in order. If no block is given + # an enumerator is returned. + # + # @yield the operation to be performed on each struct member + # @yieldparam [Object] value each struct value (in order) + def each(&block) + return enum_for(:each) unless block_given? + synchronize { ns_each(&block) } + end + + # @!macro [attach] struct_each_pair + # + # Yields the name and value of each struct member in order. If no block is + # given an enumerator is returned. + # + # @yield the operation to be performed on each struct member/value pair + # @yieldparam [Object] member each struct member (in order) + # @yieldparam [Object] value each struct value (in order) + def each_pair(&block) + return enum_for(:each_pair) unless block_given? + synchronize { ns_each_pair(&block) } + end + + # @!macro [attach] struct_select + # + # Yields each member value from the struct to the block and returns an Array + # containing the member values from the struct for which the given block + # returns a true value (equivalent to `Enumerable#select`). + # + # @yield the operation to be performed on each struct member + # @yieldparam [Object] value each struct value (in order) + # + # @return [Array] an array containing each value for which the block returns true + def select(&block) + return enum_for(:select) unless block_given? + synchronize { ns_select(&block) } + end + + # @!macro [new] struct_set + # + # Attribute Assignment + # + # Sets the value of the given struct member or the member at the given index. + # + # @param [Symbol, String, Integer] member the string or symbol name of the memeber + # for which to obtain the value or the member's index + # + # @return [Object] the value of the given struct member or the member at the given index. + # + # @raise [NameError] if the name does not exist + # @raise [IndexError] if the index is out of range. + def []=(member, value) + if member.is_a? Integer + length = synchronize { @values.length } + if member >= length + raise IndexError.new("offset #{member} too large for struct(size:#{length})") + end + synchronize { @values[member] = value } + else + send("#{member}=", value) + end + rescue NoMethodError + raise NameError.new("no member '#{member}' in struct") + end + + # @!macro struct_new + def self.new(*args, &block) + clazz_name = nil + if args.length == 0 + raise ArgumentError.new('wrong number of arguments (0 for 1+)') + elsif args.length > 0 && args.first.is_a?(String) + clazz_name = args.shift + end + FACTORY.define_struct(clazz_name, args, &block) + end + + FACTORY = Class.new(Synchronization::LockableObject) do + def define_struct(name, members, &block) + synchronize do + clazz = Synchronization::AbstractStruct.define_struct_class(MutableStruct, Synchronization::LockableObject, name, members, &block) + members.each_with_index do |member, index| + clazz.send(:define_method, member) do + synchronize { @values[index] } + end + clazz.send(:define_method, "#{member}=") do |value| + synchronize { @values[index] = value } + end + end + clazz + end + end + end.new + private_constant :FACTORY + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/mvar.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/mvar.rb new file mode 100644 index 0000000..0d18dfa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/mvar.rb @@ -0,0 +1,242 @@ +require 'concurrent/concern/dereferenceable' +require 'concurrent/synchronization' + +module Concurrent + + # An `MVar` is a synchronized single element container. They are empty or + # contain one item. Taking a value from an empty `MVar` blocks, as does + # putting a value into a full one. You can either think of them as blocking + # queue of length one, or a special kind of mutable variable. + # + # On top of the fundamental `#put` and `#take` operations, we also provide a + # `#mutate` that is atomic with respect to operations on the same instance. + # These operations all support timeouts. + # + # We also support non-blocking operations `#try_put!` and `#try_take!`, a + # `#set!` that ignores existing values, a `#value` that returns the value + # without removing it or returns `MVar::EMPTY`, and a `#modify!` that yields + # `MVar::EMPTY` if the `MVar` is empty and can be used to set `MVar::EMPTY`. + # You shouldn't use these operations in the first instance. + # + # `MVar` is a [Dereferenceable](Dereferenceable). + # + # `MVar` is related to M-structures in Id, `MVar` in Haskell and `SyncVar` in Scala. + # + # Note that unlike the original Haskell paper, our `#take` is blocking. This is how + # Haskell and Scala do it today. + # + # @!macro copy_options + # + # ## See Also + # + # 1. P. Barth, R. Nikhil, and Arvind. [M-Structures: Extending a parallel, non- strict, functional language with state](http://dl.acm.org/citation.cfm?id=652538). In Proceedings of the 5th + # ACM Conference on Functional Programming Languages and Computer Architecture (FPCA), 1991. + # + # 2. S. Peyton Jones, A. Gordon, and S. Finne. [Concurrent Haskell](http://dl.acm.org/citation.cfm?id=237794). + # In Proceedings of the 23rd Symposium on Principles of Programming Languages + # (PoPL), 1996. + class MVar < Synchronization::Object + include Concern::Dereferenceable + safe_initialization! + + # Unique value that represents that an `MVar` was empty + EMPTY = Object.new + + # Unique value that represents that an `MVar` timed out before it was able + # to produce a value. + TIMEOUT = Object.new + + # Create a new `MVar`, either empty or with an initial value. + # + # @param [Hash] opts the options controlling how the future will be processed + # + # @!macro deref_options + def initialize(value = EMPTY, opts = {}) + @value = value + @mutex = Mutex.new + @empty_condition = ConditionVariable.new + @full_condition = ConditionVariable.new + set_deref_options(opts) + end + + # Remove the value from an `MVar`, leaving it empty, and blocking if there + # isn't a value. A timeout can be set to limit the time spent blocked, in + # which case it returns `TIMEOUT` if the time is exceeded. + # @return [Object] the value that was taken, or `TIMEOUT` + def take(timeout = nil) + @mutex.synchronize do + wait_for_full(timeout) + + # If we timed out we'll still be empty + if unlocked_full? + value = @value + @value = EMPTY + @empty_condition.signal + apply_deref_options(value) + else + TIMEOUT + end + end + end + + # acquires lock on the from an `MVAR`, yields the value to provided block, + # and release lock. A timeout can be set to limit the time spent blocked, + # in which case it returns `TIMEOUT` if the time is exceeded. + # @return [Object] the value returned by the block, or `TIMEOUT` + def borrow(timeout = nil) + @mutex.synchronize do + wait_for_full(timeout) + + # if we timeoud out we'll still be empty + if unlocked_full? + yield @value + else + TIMEOUT + end + end + end + + # Put a value into an `MVar`, blocking if there is already a value until + # it is empty. A timeout can be set to limit the time spent blocked, in + # which case it returns `TIMEOUT` if the time is exceeded. + # @return [Object] the value that was put, or `TIMEOUT` + def put(value, timeout = nil) + @mutex.synchronize do + wait_for_empty(timeout) + + # If we timed out we won't be empty + if unlocked_empty? + @value = value + @full_condition.signal + apply_deref_options(value) + else + TIMEOUT + end + end + end + + # Atomically `take`, yield the value to a block for transformation, and then + # `put` the transformed value. Returns the transformed value. A timeout can + # be set to limit the time spent blocked, in which case it returns `TIMEOUT` + # if the time is exceeded. + # @return [Object] the transformed value, or `TIMEOUT` + def modify(timeout = nil) + raise ArgumentError.new('no block given') unless block_given? + + @mutex.synchronize do + wait_for_full(timeout) + + # If we timed out we'll still be empty + if unlocked_full? + value = @value + @value = yield value + @full_condition.signal + apply_deref_options(value) + else + TIMEOUT + end + end + end + + # Non-blocking version of `take`, that returns `EMPTY` instead of blocking. + def try_take! + @mutex.synchronize do + if unlocked_full? + value = @value + @value = EMPTY + @empty_condition.signal + apply_deref_options(value) + else + EMPTY + end + end + end + + # Non-blocking version of `put`, that returns whether or not it was successful. + def try_put!(value) + @mutex.synchronize do + if unlocked_empty? + @value = value + @full_condition.signal + true + else + false + end + end + end + + # Non-blocking version of `put` that will overwrite an existing value. + def set!(value) + @mutex.synchronize do + old_value = @value + @value = value + @full_condition.signal + apply_deref_options(old_value) + end + end + + # Non-blocking version of `modify` that will yield with `EMPTY` if there is no value yet. + def modify! + raise ArgumentError.new('no block given') unless block_given? + + @mutex.synchronize do + value = @value + @value = yield value + if unlocked_empty? + @empty_condition.signal + else + @full_condition.signal + end + apply_deref_options(value) + end + end + + # Returns if the `MVar` is currently empty. + def empty? + @mutex.synchronize { @value == EMPTY } + end + + # Returns if the `MVar` currently contains a value. + def full? + !empty? + end + + protected + + def synchronize(&block) + @mutex.synchronize(&block) + end + + private + + def unlocked_empty? + @value == EMPTY + end + + def unlocked_full? + ! unlocked_empty? + end + + def wait_for_full(timeout) + wait_while(@full_condition, timeout) { unlocked_empty? } + end + + def wait_for_empty(timeout) + wait_while(@empty_condition, timeout) { unlocked_full? } + end + + def wait_while(condition, timeout) + if timeout.nil? + while yield + condition.wait(@mutex) + end + else + stop = Concurrent.monotonic_time + timeout + while yield && timeout > 0.0 + condition.wait(@mutex, timeout) + timeout = stop - Concurrent.monotonic_time + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/options.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/options.rb new file mode 100644 index 0000000..bdd22a9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/options.rb @@ -0,0 +1,42 @@ +require 'concurrent/configuration' + +module Concurrent + + # @!visibility private + module Options + + # Get the requested `Executor` based on the values set in the options hash. + # + # @param [Hash] opts the options defining the requested executor + # @option opts [Executor] :executor when set use the given `Executor` instance. + # Three special values are also supported: `:fast` returns the global fast executor, + # `:io` returns the global io executor, and `:immediate` returns a new + # `ImmediateExecutor` object. + # + # @return [Executor, nil] the requested thread pool, or nil when no option specified + # + # @!visibility private + def self.executor_from_options(opts = {}) # :nodoc: + if identifier = opts.fetch(:executor, nil) + executor(identifier) + else + nil + end + end + + def self.executor(executor_identifier) + case executor_identifier + when :fast + Concurrent.global_fast_executor + when :io + Concurrent.global_io_executor + when :immediate + Concurrent.global_immediate_executor + when Concurrent::ExecutorService + executor_identifier + else + raise ArgumentError, "executor not recognized by '#{executor_identifier}'" + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/promise.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/promise.rb new file mode 100644 index 0000000..f23700e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/promise.rb @@ -0,0 +1,547 @@ +require 'thread' +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/ivar' +require 'concurrent/executor/safe_task_executor' + +require 'concurrent/options' + +module Concurrent + + PromiseExecutionError = Class.new(StandardError) + + # Promises are inspired by the JavaScript [Promises/A](http://wiki.commonjs.org/wiki/Promises/A) + # and [Promises/A+](http://promises-aplus.github.io/promises-spec/) specifications. + # + # > A promise represents the eventual value returned from the single + # > completion of an operation. + # + # Promises are similar to futures and share many of the same behaviours. + # Promises are far more robust, however. Promises can be chained in a tree + # structure where each promise may have zero or more children. Promises are + # chained using the `then` method. The result of a call to `then` is always + # another promise. Promises are resolved asynchronously (with respect to the + # main thread) but in a strict order: parents are guaranteed to be resolved + # before their children, children before their younger siblings. The `then` + # method takes two parameters: an optional block to be executed upon parent + # resolution and an optional callable to be executed upon parent failure. The + # result of each promise is passed to each of its children upon resolution. + # When a promise is rejected all its children will be summarily rejected and + # will receive the reason. + # + # Promises have several possible states: *:unscheduled*, *:pending*, + # *:processing*, *:rejected*, or *:fulfilled*. These are also aggregated as + # `#incomplete?` and `#complete?`. When a Promise is created it is set to + # *:unscheduled*. Once the `#execute` method is called the state becomes + # *:pending*. Once a job is pulled from the thread pool's queue and is given + # to a thread for processing (often immediately upon `#post`) the state + # becomes *:processing*. The future will remain in this state until processing + # is complete. A future that is in the *:unscheduled*, *:pending*, or + # *:processing* is considered `#incomplete?`. A `#complete?` Promise is either + # *:rejected*, indicating that an exception was thrown during processing, or + # *:fulfilled*, indicating success. If a Promise is *:fulfilled* its `#value` + # will be updated to reflect the result of the operation. If *:rejected* the + # `reason` will be updated with a reference to the thrown exception. The + # predicate methods `#unscheduled?`, `#pending?`, `#rejected?`, and + # `#fulfilled?` can be called at any time to obtain the state of the Promise, + # as can the `#state` method, which returns a symbol. + # + # Retrieving the value of a promise is done through the `value` (alias: + # `deref`) method. Obtaining the value of a promise is a potentially blocking + # operation. When a promise is *rejected* a call to `value` will return `nil` + # immediately. When a promise is *fulfilled* a call to `value` will + # immediately return the current value. When a promise is *pending* a call to + # `value` will block until the promise is either *rejected* or *fulfilled*. A + # *timeout* value can be passed to `value` to limit how long the call will + # block. If `nil` the call will block indefinitely. If `0` the call will not + # block. Any other integer or float value will indicate the maximum number of + # seconds to block. + # + # Promises run on the global thread pool. + # + # @!macro copy_options + # + # ### Examples + # + # Start by requiring promises + # + # ```ruby + # require 'concurrent' + # ``` + # + # Then create one + # + # ```ruby + # p = Concurrent::Promise.execute do + # # do something + # 42 + # end + # ``` + # + # Promises can be chained using the `then` method. The `then` method accepts a + # block and an executor, to be executed on fulfillment, and a callable argument to be executed + # on rejection. The result of the each promise is passed as the block argument + # to chained promises. + # + # ```ruby + # p = Concurrent::Promise.new{10}.then{|x| x * 2}.then{|result| result - 10 }.execute + # ``` + # + # And so on, and so on, and so on... + # + # ```ruby + # p = Concurrent::Promise.fulfill(20). + # then{|result| result - 10 }. + # then{|result| result * 3 }. + # then(executor: different_executor){|result| result % 5 }.execute + # ``` + # + # The initial state of a newly created Promise depends on the state of its parent: + # - if parent is *unscheduled* the child will be *unscheduled* + # - if parent is *pending* the child will be *pending* + # - if parent is *fulfilled* the child will be *pending* + # - if parent is *rejected* the child will be *pending* (but will ultimately be *rejected*) + # + # Promises are executed asynchronously from the main thread. By the time a + # child Promise finishes intialization it may be in a different state than its + # parent (by the time a child is created its parent may have completed + # execution and changed state). Despite being asynchronous, however, the order + # of execution of Promise objects in a chain (or tree) is strictly defined. + # + # There are multiple ways to create and execute a new `Promise`. Both ways + # provide identical behavior: + # + # ```ruby + # # create, operate, then execute + # p1 = Concurrent::Promise.new{ "Hello World!" } + # p1.state #=> :unscheduled + # p1.execute + # + # # create and immediately execute + # p2 = Concurrent::Promise.new{ "Hello World!" }.execute + # + # # execute during creation + # p3 = Concurrent::Promise.execute{ "Hello World!" } + # ``` + # + # Once the `execute` method is called a `Promise` becomes `pending`: + # + # ```ruby + # p = Concurrent::Promise.execute{ "Hello, world!" } + # p.state #=> :pending + # p.pending? #=> true + # ``` + # + # Wait a little bit, and the promise will resolve and provide a value: + # + # ```ruby + # p = Concurrent::Promise.execute{ "Hello, world!" } + # sleep(0.1) + # + # p.state #=> :fulfilled + # p.fulfilled? #=> true + # p.value #=> "Hello, world!" + # ``` + # + # If an exception occurs, the promise will be rejected and will provide + # a reason for the rejection: + # + # ```ruby + # p = Concurrent::Promise.execute{ raise StandardError.new("Here comes the Boom!") } + # sleep(0.1) + # + # p.state #=> :rejected + # p.rejected? #=> true + # p.reason #=> "#" + # ``` + # + # #### Rejection + # + # When a promise is rejected all its children will be rejected and will + # receive the rejection `reason` as the rejection callable parameter: + # + # ```ruby + # p = [ Concurrent::Promise.execute{ Thread.pass; raise StandardError } ] + # + # c1 = p.then(Proc.new{ |reason| 42 }) + # c2 = p.then(Proc.new{ |reason| raise 'Boom!' }) + # + # sleep(0.1) + # + # c1.state #=> :rejected + # c2.state #=> :rejected + # ``` + # + # Once a promise is rejected it will continue to accept children that will + # receive immediately rejection (they will be executed asynchronously). + # + # #### Aliases + # + # The `then` method is the most generic alias: it accepts a block to be + # executed upon parent fulfillment and a callable to be executed upon parent + # rejection. At least one of them should be passed. The default block is `{ + # |result| result }` that fulfills the child with the parent value. The + # default callable is `{ |reason| raise reason }` that rejects the child with + # the parent reason. + # + # - `on_success { |result| ... }` is the same as `then {|result| ... }` + # - `rescue { |reason| ... }` is the same as `then(Proc.new { |reason| ... } )` + # - `rescue` is aliased by `catch` and `on_error` + class Promise < IVar + + # Initialize a new Promise with the provided options. + # + # @!macro executor_and_deref_options + # + # @!macro [attach] promise_init_options + # + # @option opts [Promise] :parent the parent `Promise` when building a chain/tree + # @option opts [Proc] :on_fulfill fulfillment handler + # @option opts [Proc] :on_reject rejection handler + # @option opts [object, Array] :args zero or more arguments to be passed + # the task block on execution + # + # @yield The block operation to be performed asynchronously. + # + # @raise [ArgumentError] if no block is given + # + # @see http://wiki.commonjs.org/wiki/Promises/A + # @see http://promises-aplus.github.io/promises-spec/ + def initialize(opts = {}, &block) + opts.delete_if { |k, v| v.nil? } + super(NULL, opts.merge(__promise_body_from_block__: block), &nil) + end + + # Create a new `Promise` and fulfill it immediately. + # + # @!macro executor_and_deref_options + # + # @!macro promise_init_options + # + # @raise [ArgumentError] if no block is given + # + # @return [Promise] the newly created `Promise` + def self.fulfill(value, opts = {}) + Promise.new(opts).tap { |p| p.send(:synchronized_set_state!, true, value, nil) } + end + + # Create a new `Promise` and reject it immediately. + # + # @!macro executor_and_deref_options + # + # @!macro promise_init_options + # + # @raise [ArgumentError] if no block is given + # + # @return [Promise] the newly created `Promise` + def self.reject(reason, opts = {}) + Promise.new(opts).tap { |p| p.send(:synchronized_set_state!, false, nil, reason) } + end + + # Execute an `:unscheduled` `Promise`. Immediately sets the state to `:pending` and + # passes the block to a new thread/thread pool for eventual execution. + # Does nothing if the `Promise` is in any state other than `:unscheduled`. + # + # @return [Promise] a reference to `self` + def execute + if root? + if compare_and_set_state(:pending, :unscheduled) + set_pending + realize(@promise_body) + end + else + @parent.execute + end + self + end + + # @!macro ivar_set_method + # + # @raise [Concurrent::PromiseExecutionError] if not the root promise + def set(value = NULL, &block) + raise PromiseExecutionError.new('supported only on root promise') unless root? + check_for_block_or_value!(block_given?, value) + synchronize do + if @state != :unscheduled + raise MultipleAssignmentError + else + @promise_body = block || Proc.new { |result| value } + end + end + execute + end + + # @!macro ivar_fail_method + # + # @raise [Concurrent::PromiseExecutionError] if not the root promise + def fail(reason = StandardError.new) + set { raise reason } + end + + # Create a new `Promise` object with the given block, execute it, and return the + # `:pending` object. + # + # @!macro executor_and_deref_options + # + # @!macro promise_init_options + # + # @return [Promise] the newly created `Promise` in the `:pending` state + # + # @raise [ArgumentError] if no block is given + # + # @example + # promise = Concurrent::Promise.execute{ sleep(1); 42 } + # promise.state #=> :pending + def self.execute(opts = {}, &block) + new(opts, &block).execute + end + + # Chain a new promise off the current promise. + # + # @param [Proc] rescuer An optional rescue block to be executed if the + # promise is rejected. + # + # @param [ThreadPool] executor An optional thread pool executor to be used + # in the new Promise + # + # @yield The block operation to be performed asynchronously. + # + # @return [Promise] the new promise + def then(rescuer = nil, executor = @executor, &block) + raise ArgumentError.new('rescuers and block are both missing') if rescuer.nil? && !block_given? + block = Proc.new { |result| result } unless block_given? + child = Promise.new( + parent: self, + executor: executor, + on_fulfill: block, + on_reject: rescuer + ) + + synchronize do + child.state = :pending if @state == :pending + child.on_fulfill(apply_deref_options(@value)) if @state == :fulfilled + child.on_reject(@reason) if @state == :rejected + @children << child + end + + child + end + + # Chain onto this promise an action to be undertaken on success + # (fulfillment). + # + # @yield The block to execute + # + # @return [Promise] self + def on_success(&block) + raise ArgumentError.new('no block given') unless block_given? + self.then(&block) + end + + # Chain onto this promise an action to be undertaken on failure + # (rejection). + # + # @yield The block to execute + # + # @return [Promise] self + def rescue(&block) + self.then(block) + end + + alias_method :catch, :rescue + alias_method :on_error, :rescue + + # Yield the successful result to the block that returns a promise. If that + # promise is also successful the result is the result of the yielded promise. + # If either part fails the whole also fails. + # + # @example + # Promise.execute { 1 }.flat_map { |v| Promise.execute { v + 2 } }.value! #=> 3 + # + # @return [Promise] + def flat_map(&block) + child = Promise.new( + parent: self, + executor: ImmediateExecutor.new, + ) + + on_error { |e| child.on_reject(e) } + on_success do |result1| + begin + inner = block.call(result1) + inner.execute + inner.on_success { |result2| child.on_fulfill(result2) } + inner.on_error { |e| child.on_reject(e) } + rescue => e + child.on_reject(e) + end + end + + child + end + + # Builds a promise that produces the result of promises in an Array + # and fails if any of them fails. + # + # @param [Array] promises + # + # @return [Promise] + def self.zip(*promises) + zero = fulfill([], executor: ImmediateExecutor.new) + + promises.reduce(zero) do |p1, p2| + p1.flat_map do |results| + p2.then do |next_result| + results << next_result + end + end + end + end + + # Builds a promise that produces the result of self and others in an Array + # and fails if any of them fails. + # + # @param [Array] others + # + # @return [Promise] + def zip(*others) + self.class.zip(self, *others) + end + + # Aggregates a collection of promises and executes the `then` condition + # if all aggregated promises succeed. Executes the `rescue` handler with + # a `Concurrent::PromiseExecutionError` if any of the aggregated promises + # fail. Upon execution will execute any of the aggregate promises that + # were not already executed. + # + # @!macro [attach] promise_self_aggregate + # + # The returned promise will not yet have been executed. Additional `#then` + # and `#rescue` handlers may still be provided. Once the returned promise + # is execute the aggregate promises will be also be executed (if they have + # not been executed already). The results of the aggregate promises will + # be checked upon completion. The necessary `#then` and `#rescue` blocks + # on the aggregating promise will then be executed as appropriate. If the + # `#rescue` handlers are executed the raises exception will be + # `Concurrent::PromiseExecutionError`. + # + # @param [Array] promises Zero or more promises to aggregate + # @return [Promise] an unscheduled (not executed) promise that aggregates + # the promises given as arguments + def self.all?(*promises) + aggregate(:all?, *promises) + end + + # Aggregates a collection of promises and executes the `then` condition + # if any aggregated promises succeed. Executes the `rescue` handler with + # a `Concurrent::PromiseExecutionError` if any of the aggregated promises + # fail. Upon execution will execute any of the aggregate promises that + # were not already executed. + # + # @!macro promise_self_aggregate + def self.any?(*promises) + aggregate(:any?, *promises) + end + + protected + + def ns_initialize(value, opts) + super + + @executor = Options.executor_from_options(opts) || Concurrent.global_io_executor + @args = get_arguments_from(opts) + + @parent = opts.fetch(:parent) { nil } + @on_fulfill = opts.fetch(:on_fulfill) { Proc.new { |result| result } } + @on_reject = opts.fetch(:on_reject) { Proc.new { |reason| raise reason } } + + @promise_body = opts[:__promise_body_from_block__] || Proc.new { |result| result } + @state = :unscheduled + @children = [] + end + + # Aggregate a collection of zero or more promises under a composite promise, + # execute the aggregated promises and collect them into a standard Ruby array, + # call the given Ruby `Ennnumerable` predicate (such as `any?`, `all?`, `none?`, + # or `one?`) on the collection checking for the success or failure of each, + # then executing the composite's `#then` handlers if the predicate returns + # `true` or executing the composite's `#rescue` handlers if the predicate + # returns false. + # + # @!macro promise_self_aggregate + def self.aggregate(method, *promises) + composite = Promise.new do + completed = promises.collect do |promise| + promise.execute if promise.unscheduled? + promise.wait + promise + end + unless completed.empty? || completed.send(method){|promise| promise.fulfilled? } + raise PromiseExecutionError + end + end + composite + end + + # @!visibility private + def set_pending + synchronize do + @state = :pending + @children.each { |c| c.set_pending } + end + end + + # @!visibility private + def root? # :nodoc: + @parent.nil? + end + + # @!visibility private + def on_fulfill(result) + realize Proc.new { @on_fulfill.call(result) } + nil + end + + # @!visibility private + def on_reject(reason) + realize Proc.new { @on_reject.call(reason) } + nil + end + + # @!visibility private + def notify_child(child) + if_state(:fulfilled) { child.on_fulfill(apply_deref_options(@value)) } + if_state(:rejected) { child.on_reject(@reason) } + end + + # @!visibility private + def complete(success, value, reason) + children_to_notify = synchronize do + set_state!(success, value, reason) + @children.dup + end + + children_to_notify.each { |child| notify_child(child) } + observers.notify_and_delete_observers{ [Time.now, self.value, reason] } + end + + # @!visibility private + def realize(task) + @executor.post do + success, value, reason = SafeTaskExecutor.new(task, rescue_exception: true).execute(*@args) + complete(success, value, reason) + end + end + + # @!visibility private + def set_state!(success, value, reason) + set_state(success, value, reason) + event.set + end + + # @!visibility private + def synchronized_set_state!(success, value, reason) + synchronize { set_state!(success, value, reason) } + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/scheduled_task.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/scheduled_task.rb new file mode 100644 index 0000000..90f78b0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/scheduled_task.rb @@ -0,0 +1,318 @@ +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/configuration' +require 'concurrent/ivar' +require 'concurrent/collection/copy_on_notify_observer_set' +require 'concurrent/utility/monotonic_time' + +require 'concurrent/options' + +module Concurrent + + # `ScheduledTask` is a close relative of `Concurrent::Future` but with one + # important difference: A `Future` is set to execute as soon as possible + # whereas a `ScheduledTask` is set to execute after a specified delay. This + # implementation is loosely based on Java's + # [ScheduledExecutorService](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html). + # It is a more feature-rich variant of {Concurrent.timer}. + # + # The *intended* schedule time of task execution is set on object construction + # with the `delay` argument. The delay is a numeric (floating point or integer) + # representing a number of seconds in the future. Any other value or a numeric + # equal to or less than zero will result in an exception. The *actual* schedule + # time of task execution is set when the `execute` method is called. + # + # The constructor can also be given zero or more processing options. Currently + # the only supported options are those recognized by the + # [Dereferenceable](Dereferenceable) module. + # + # The final constructor argument is a block representing the task to be performed. + # If no block is given an `ArgumentError` will be raised. + # + # **States** + # + # `ScheduledTask` mixes in the [Obligation](Obligation) module thus giving it + # "future" behavior. This includes the expected lifecycle states. `ScheduledTask` + # has one additional state, however. While the task (block) is being executed the + # state of the object will be `:processing`. This additional state is necessary + # because it has implications for task cancellation. + # + # **Cancellation** + # + # A `:pending` task can be cancelled using the `#cancel` method. A task in any + # other state, including `:processing`, cannot be cancelled. The `#cancel` + # method returns a boolean indicating the success of the cancellation attempt. + # A cancelled `ScheduledTask` cannot be restarted. It is immutable. + # + # **Obligation and Observation** + # + # The result of a `ScheduledTask` can be obtained either synchronously or + # asynchronously. `ScheduledTask` mixes in both the [Obligation](Obligation) + # module and the + # [Observable](http://ruby-doc.org/stdlib-2.0/libdoc/observer/rdoc/Observable.html) + # module from the Ruby standard library. With one exception `ScheduledTask` + # behaves identically to [Future](Observable) with regard to these modules. + # + # @!macro copy_options + # + # @example Basic usage + # + # require 'concurrent' + # require 'thread' # for Queue + # require 'open-uri' # for open(uri) + # + # class Ticker + # def get_year_end_closing(symbol, year) + # uri = "http://ichart.finance.yahoo.com/table.csv?s=#{symbol}&a=11&b=01&c=#{year}&d=11&e=31&f=#{year}&g=m" + # data = open(uri) {|f| f.collect{|line| line.strip } } + # data[1].split(',')[4].to_f + # end + # end + # + # # Future + # price = Concurrent::Future.execute{ Ticker.new.get_year_end_closing('TWTR', 2013) } + # price.state #=> :pending + # sleep(1) # do other stuff + # price.value #=> 63.65 + # price.state #=> :fulfilled + # + # # ScheduledTask + # task = Concurrent::ScheduledTask.execute(2){ Ticker.new.get_year_end_closing('INTC', 2013) } + # task.state #=> :pending + # sleep(3) # do other stuff + # task.value #=> 25.96 + # + # @example Successful task execution + # + # task = Concurrent::ScheduledTask.new(2){ 'What does the fox say?' } + # task.state #=> :unscheduled + # task.execute + # task.state #=> pending + # + # # wait for it... + # sleep(3) + # + # task.unscheduled? #=> false + # task.pending? #=> false + # task.fulfilled? #=> true + # task.rejected? #=> false + # task.value #=> 'What does the fox say?' + # + # @example One line creation and execution + # + # task = Concurrent::ScheduledTask.new(2){ 'What does the fox say?' }.execute + # task.state #=> pending + # + # task = Concurrent::ScheduledTask.execute(2){ 'What do you get when you multiply 6 by 9?' } + # task.state #=> pending + # + # @example Failed task execution + # + # task = Concurrent::ScheduledTask.execute(2){ raise StandardError.new('Call me maybe?') } + # task.pending? #=> true + # + # # wait for it... + # sleep(3) + # + # task.unscheduled? #=> false + # task.pending? #=> false + # task.fulfilled? #=> false + # task.rejected? #=> true + # task.value #=> nil + # task.reason #=> # + # + # @example Task execution with observation + # + # observer = Class.new{ + # def update(time, value, reason) + # puts "The task completed at #{time} with value '#{value}'" + # end + # }.new + # + # task = Concurrent::ScheduledTask.new(2){ 'What does the fox say?' } + # task.add_observer(observer) + # task.execute + # task.pending? #=> true + # + # # wait for it... + # sleep(3) + # + # #>> The task completed at 2013-11-07 12:26:09 -0500 with value 'What does the fox say?' + # + # @!macro monotonic_clock_warning + # + # @see Concurrent.timer + class ScheduledTask < IVar + include Comparable + + # The executor on which to execute the task. + # @!visibility private + attr_reader :executor + + # Schedule a task for execution at a specified future time. + # + # @param [Float] delay the number of seconds to wait for before executing the task + # + # @yield the task to be performed + # + # @!macro executor_and_deref_options + # + # @option opts [object, Array] :args zero or more arguments to be passed the task + # block on execution + # + # @raise [ArgumentError] When no block is given + # @raise [ArgumentError] When given a time that is in the past + def initialize(delay, opts = {}, &task) + raise ArgumentError.new('no block given') unless block_given? + raise ArgumentError.new('seconds must be greater than zero') if delay.to_f < 0.0 + + super(NULL, opts, &nil) + + synchronize do + ns_set_state(:unscheduled) + @parent = opts.fetch(:timer_set, Concurrent.global_timer_set) + @args = get_arguments_from(opts) + @delay = delay.to_f + @task = task + @time = nil + @executor = Options.executor_from_options(opts) || Concurrent.global_io_executor + self.observers = Collection::CopyOnNotifyObserverSet.new + end + end + + # The `delay` value given at instanciation. + # + # @return [Float] the initial delay. + def initial_delay + synchronize { @delay } + end + + # The monotonic time at which the the task is scheduled to be executed. + # + # @return [Float] the schedule time or nil if `unscheduled` + def schedule_time + synchronize { @time } + end + + # Comparator which orders by schedule time. + # + # @!visibility private + def <=>(other) + schedule_time <=> other.schedule_time + end + + # Has the task been cancelled? + # + # @return [Boolean] true if the task is in the given state else false + def cancelled? + synchronize { ns_check_state?(:cancelled) } + end + + # In the task execution in progress? + # + # @return [Boolean] true if the task is in the given state else false + def processing? + synchronize { ns_check_state?(:processing) } + end + + # Cancel this task and prevent it from executing. A task can only be + # cancelled if it is pending or unscheduled. + # + # @return [Boolean] true if successfully cancelled else false + def cancel + if compare_and_set_state(:cancelled, :pending, :unscheduled) + complete(false, nil, CancelledOperationError.new) + # To avoid deadlocks this call must occur outside of #synchronize + # Changing the state above should prevent redundant calls + @parent.send(:remove_task, self) + else + false + end + end + + # Reschedule the task using the original delay and the current time. + # A task can only be reset while it is `:pending`. + # + # @return [Boolean] true if successfully rescheduled else false + def reset + synchronize{ ns_reschedule(@delay) } + end + + # Reschedule the task using the given delay and the current time. + # A task can only be reset while it is `:pending`. + # + # @param [Float] delay the number of seconds to wait for before executing the task + # + # @return [Boolean] true if successfully rescheduled else false + # + # @raise [ArgumentError] When given a time that is in the past + def reschedule(delay) + delay = delay.to_f + raise ArgumentError.new('seconds must be greater than zero') if delay < 0.0 + synchronize{ ns_reschedule(delay) } + end + + # Execute an `:unscheduled` `ScheduledTask`. Immediately sets the state to `:pending` + # and starts counting down toward execution. Does nothing if the `ScheduledTask` is + # in any state other than `:unscheduled`. + # + # @return [ScheduledTask] a reference to `self` + def execute + if compare_and_set_state(:pending, :unscheduled) + synchronize{ ns_schedule(@delay) } + end + self + end + + # Create a new `ScheduledTask` object with the given block, execute it, and return the + # `:pending` object. + # + # @param [Float] delay the number of seconds to wait for before executing the task + # + # @!macro executor_and_deref_options + # + # @return [ScheduledTask] the newly created `ScheduledTask` in the `:pending` state + # + # @raise [ArgumentError] if no block is given + def self.execute(delay, opts = {}, &task) + new(delay, opts, &task).execute + end + + # Execute the task. + # + # @!visibility private + def process_task + safe_execute(@task, @args) + end + + protected :set, :try_set, :fail, :complete + + protected + + # Schedule the task using the given delay and the current time. + # + # @param [Float] delay the number of seconds to wait for before executing the task + # + # @return [Boolean] true if successfully rescheduled else false + # + # @!visibility private + def ns_schedule(delay) + @delay = delay + @time = Concurrent.monotonic_time + @delay + @parent.send(:post_task, self) + end + + # Reschedule the task using the given delay and the current time. + # A task can only be reset while it is `:pending`. + # + # @param [Float] delay the number of seconds to wait for before executing the task + # + # @return [Boolean] true if successfully rescheduled else false + # + # @!visibility private + def ns_reschedule(delay) + return false unless ns_check_state?(:pending) + @parent.send(:remove_task, self) && ns_schedule(delay) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/settable_struct.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/settable_struct.rb new file mode 100644 index 0000000..f6feb45 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/settable_struct.rb @@ -0,0 +1,128 @@ +require 'concurrent/synchronization/abstract_struct' +require 'concurrent/errors' +require 'concurrent/synchronization' + +module Concurrent + + # An thread-safe, write-once variation of Ruby's standard `Struct`. + # Each member can have its value set at most once, either at construction + # or any time thereafter. Attempting to assign a value to a member + # that has already been set will result in a `Concurrent::ImmutabilityError`. + # + # @see http://ruby-doc.org/core-2.2.0/Struct.html Ruby standard library `Struct` + # @see http://en.wikipedia.org/wiki/Final_(Java) Java `final` keyword + module SettableStruct + include Synchronization::AbstractStruct + + # @!macro struct_values + def values + synchronize { ns_values } + end + alias_method :to_a, :values + + # @!macro struct_values_at + def values_at(*indexes) + synchronize { ns_values_at(indexes) } + end + + # @!macro struct_inspect + def inspect + synchronize { ns_inspect } + end + alias_method :to_s, :inspect + + # @!macro struct_merge + def merge(other, &block) + synchronize { ns_merge(other, &block) } + end + + # @!macro struct_to_h + def to_h + synchronize { ns_to_h } + end + + # @!macro struct_get + def [](member) + synchronize { ns_get(member) } + end + + # @!macro struct_equality + def ==(other) + synchronize { ns_equality(other) } + end + + # @!macro struct_each + def each(&block) + return enum_for(:each) unless block_given? + synchronize { ns_each(&block) } + end + + # @!macro struct_each_pair + def each_pair(&block) + return enum_for(:each_pair) unless block_given? + synchronize { ns_each_pair(&block) } + end + + # @!macro struct_select + def select(&block) + return enum_for(:select) unless block_given? + synchronize { ns_select(&block) } + end + + # @!macro struct_set + # + # @raise [Concurrent::ImmutabilityError] if the given member has already been set + def []=(member, value) + if member.is_a? Integer + length = synchronize { @values.length } + if member >= length + raise IndexError.new("offset #{member} too large for struct(size:#{length})") + end + synchronize do + unless @values[member].nil? + raise Concurrent::ImmutabilityError.new('struct member has already been set') + end + @values[member] = value + end + else + send("#{member}=", value) + end + rescue NoMethodError + raise NameError.new("no member '#{member}' in struct") + end + + # @!macro struct_new + def self.new(*args, &block) + clazz_name = nil + if args.length == 0 + raise ArgumentError.new('wrong number of arguments (0 for 1+)') + elsif args.length > 0 && args.first.is_a?(String) + clazz_name = args.shift + end + FACTORY.define_struct(clazz_name, args, &block) + end + + FACTORY = Class.new(Synchronization::LockableObject) do + def define_struct(name, members, &block) + synchronize do + clazz = Synchronization::AbstractStruct.define_struct_class(SettableStruct, Synchronization::LockableObject, name, members, &block) + members.each_with_index do |member, index| + clazz.send(:define_method, member) do + synchronize { @values[index] } + end + clazz.send(:define_method, "#{member}=") do |value| + synchronize do + unless @values[index].nil? + raise Concurrent::ImmutabilityError.new('struct member has already been set') + end + @values[index] = value + end + end + end + clazz + end + end + end.new + private_constant :FACTORY + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization.rb new file mode 100644 index 0000000..62575ba --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization.rb @@ -0,0 +1,31 @@ +require 'concurrent/utility/engine' + +require 'concurrent/synchronization/abstract_object' +require 'concurrent/utility/native_extension_loader' # load native parts first +Concurrent.load_native_extensions + +require 'concurrent/synchronization/mri_object' +require 'concurrent/synchronization/jruby_object' +require 'concurrent/synchronization/rbx_object' +require 'concurrent/synchronization/truffle_object' +require 'concurrent/synchronization/object' +require 'concurrent/synchronization/volatile' + +require 'concurrent/synchronization/abstract_lockable_object' +require 'concurrent/synchronization/mri_lockable_object' +require 'concurrent/synchronization/jruby_lockable_object' +require 'concurrent/synchronization/rbx_lockable_object' +require 'concurrent/synchronization/truffle_lockable_object' + +require 'concurrent/synchronization/lockable_object' + +require 'concurrent/synchronization/condition' +require 'concurrent/synchronization/lock' + +module Concurrent + # {include:file:doc/synchronization.md} + # {include:file:doc/synchronization-notes.md} + module Synchronization + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_lockable_object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_lockable_object.rb new file mode 100644 index 0000000..be7befc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_lockable_object.rb @@ -0,0 +1,98 @@ +module Concurrent + module Synchronization + + # @!visibility private + class AbstractLockableObject < Synchronization::Object + + protected + + # @!macro [attach] synchronization_object_method_synchronize + # + # @yield runs the block synchronized against this object, + # equivalent of java's `synchronize(this) {}` + # @note can by made public in descendants if required by `public :synchronize` + def synchronize + raise NotImplementedError + end + + # @!macro [attach] synchronization_object_method_ns_wait_until + # + # Wait until condition is met or timeout passes, + # protects against spurious wake-ups. + # @param [Numeric, nil] timeout in seconds, `nil` means no timeout + # @yield condition to be met + # @yieldreturn [true, false] + # @return [true, false] if condition met + # @note only to be used inside synchronized block + # @note to provide direct access to this method in a descendant add method + # ``` + # def wait_until(timeout = nil, &condition) + # synchronize { ns_wait_until(timeout, &condition) } + # end + # ``` + def ns_wait_until(timeout = nil, &condition) + if timeout + wait_until = Concurrent.monotonic_time + timeout + loop do + now = Concurrent.monotonic_time + condition_result = condition.call + return condition_result if now >= wait_until || condition_result + ns_wait wait_until - now + end + else + ns_wait timeout until condition.call + true + end + end + + # @!macro [attach] synchronization_object_method_ns_wait + # + # Wait until another thread calls #signal or #broadcast, + # spurious wake-ups can happen. + # + # @param [Numeric, nil] timeout in seconds, `nil` means no timeout + # @return [self] + # @note only to be used inside synchronized block + # @note to provide direct access to this method in a descendant add method + # ``` + # def wait(timeout = nil) + # synchronize { ns_wait(timeout) } + # end + # ``` + def ns_wait(timeout = nil) + raise NotImplementedError + end + + # @!macro [attach] synchronization_object_method_ns_signal + # + # Signal one waiting thread. + # @return [self] + # @note only to be used inside synchronized block + # @note to provide direct access to this method in a descendant add method + # ``` + # def signal + # synchronize { ns_signal } + # end + # ``` + def ns_signal + raise NotImplementedError + end + + # @!macro [attach] synchronization_object_method_ns_broadcast + # + # Broadcast to all waiting threads. + # @return [self] + # @note only to be used inside synchronized block + # @note to provide direct access to this method in a descendant add method + # ``` + # def broadcast + # synchronize { ns_broadcast } + # end + # ``` + def ns_broadcast + raise NotImplementedError + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_object.rb new file mode 100644 index 0000000..532388b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_object.rb @@ -0,0 +1,24 @@ +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + class AbstractObject + + # @abstract has to be implemented based on Ruby runtime + def initialize + raise NotImplementedError + end + + # @!visibility private + # @abstract + def full_memory_barrier + raise NotImplementedError + end + + def self.attr_volatile(*names) + raise NotImplementedError + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_struct.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_struct.rb new file mode 100644 index 0000000..1fd66ef --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/abstract_struct.rb @@ -0,0 +1,157 @@ +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + module AbstractStruct + + # @!visibility private + def initialize(*values) + super() + ns_initialize(*values) + end + + # @!macro [attach] struct_length + # + # Returns the number of struct members. + # + # @return [Fixnum] the number of struct members + def length + self.class::MEMBERS.length + end + alias_method :size, :length + + # @!macro [attach] struct_members + # + # Returns the struct members as an array of symbols. + # + # @return [Array] the struct members as an array of symbols + def members + self.class::MEMBERS.dup + end + + protected + + # @!macro struct_values + # + # @!visibility private + def ns_values + @values.dup + end + + # @!macro struct_values_at + # + # @!visibility private + def ns_values_at(indexes) + @values.values_at(*indexes) + end + + # @!macro struct_to_h + # + # @!visibility private + def ns_to_h + length.times.reduce({}){|memo, i| memo[self.class::MEMBERS[i]] = @values[i]; memo} + end + + # @!macro struct_get + # + # @!visibility private + def ns_get(member) + if member.is_a? Integer + if member >= @values.length + raise IndexError.new("offset #{member} too large for struct(size:#{@values.length})") + end + @values[member] + else + send(member) + end + rescue NoMethodError + raise NameError.new("no member '#{member}' in struct") + end + + # @!macro struct_equality + # + # @!visibility private + def ns_equality(other) + self.class == other.class && self.values == other.values + end + + # @!macro struct_each + # + # @!visibility private + def ns_each + values.each{|value| yield value } + end + + # @!macro struct_each_pair + # + # @!visibility private + def ns_each_pair + @values.length.times do |index| + yield self.class::MEMBERS[index], @values[index] + end + end + + # @!macro struct_select + # + # @!visibility private + def ns_select + values.select{|value| yield value } + end + + # @!macro struct_inspect + # + # @!visibility private + def ns_inspect + struct = pr_underscore(self.class.ancestors[1]) + clazz = ((self.class.to_s =~ /^#" + end + + # @!macro struct_merge + # + # @!visibility private + def ns_merge(other, &block) + self.class.new(*self.to_h.merge(other, &block).values) + end + + # @!visibility private + def pr_underscore(clazz) + word = clazz.to_s + word.gsub!(/::/, '/') + word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2') + word.gsub!(/([a-z\d])([A-Z])/,'\1_\2') + word.tr!("-", "_") + word.downcase! + word + end + + # @!visibility private + def self.define_struct_class(parent, base, name, members, &block) + clazz = Class.new(base || Object) do + include parent + self.const_set(:MEMBERS, members.collect{|member| member.to_s.to_sym}.freeze) + def ns_initialize(*values) + raise ArgumentError.new('struct size differs') if values.length > length + @values = values.fill(nil, values.length..length-1) + end + end + unless name.nil? + begin + parent.const_set(name, clazz) + parent.const_get(name) + rescue NameError + raise NameError.new("identifier #{name} needs to be constant") + end + end + members.each_with_index do |member, index| + clazz.send(:define_method, member) do + @values[index] + end + end + clazz.class_exec(&block) unless block.nil? + clazz + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/condition.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/condition.rb new file mode 100644 index 0000000..ac528bc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/condition.rb @@ -0,0 +1,58 @@ +module Concurrent + module Synchronization + # TODO (pitr-ch 04-Dec-2016): should be in edge + class Condition < LockableObject + safe_initialization! + + # TODO (pitr 12-Sep-2015): locks two objects, improve + # TODO (pitr 26-Sep-2015): study + # http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/concurrent/locks/AbstractQueuedSynchronizer.java#AbstractQueuedSynchronizer.Node + + singleton_class.send :alias_method, :private_new, :new + private_class_method :new + + def initialize(lock) + super() + @Lock = lock + end + + def wait(timeout = nil) + @Lock.synchronize { ns_wait(timeout) } + end + + def ns_wait(timeout = nil) + synchronize { super(timeout) } + end + + def wait_until(timeout = nil, &condition) + @Lock.synchronize { ns_wait_until(timeout, &condition) } + end + + def ns_wait_until(timeout = nil, &condition) + synchronize { super(timeout, &condition) } + end + + def signal + @Lock.synchronize { ns_signal } + end + + def ns_signal + synchronize { super } + end + + def broadcast + @Lock.synchronize { ns_broadcast } + end + + def ns_broadcast + synchronize { super } + end + end + + class LockableObject < LockableObjectImplementation + def new_condition + Condition.private_new(self) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/jruby_lockable_object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/jruby_lockable_object.rb new file mode 100644 index 0000000..359a032 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/jruby_lockable_object.rb @@ -0,0 +1,13 @@ +module Concurrent + module Synchronization + + if Concurrent.on_jruby? && Concurrent.java_extensions_loaded? + + # @!visibility private + # @!macro internal_implementation_note + class JRubyLockableObject < AbstractLockableObject + + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/jruby_object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/jruby_object.rb new file mode 100644 index 0000000..b04382f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/jruby_object.rb @@ -0,0 +1,44 @@ +module Concurrent + module Synchronization + + if Concurrent.on_jruby? && Concurrent.java_extensions_loaded? + + module JRubyAttrVolatile + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + def attr_volatile(*names) + names.each do |name| + + ivar = :"@volatile_#{name}" + + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + instance_variable_get_volatile(:#{ivar}) + end + + def #{name}=(value) + instance_variable_set_volatile(:#{ivar}, value) + end + RUBY + + end + names.map { |n| [n, :"#{n}="] }.flatten + end + end + end + + # @!visibility private + # @!macro internal_implementation_note + class JRubyObject < AbstractObject + include JRubyAttrVolatile + + def initialize + # nothing to do + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/lock.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/lock.rb new file mode 100644 index 0000000..ed865b3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/lock.rb @@ -0,0 +1,34 @@ +module Concurrent + module Synchronization + # TODO (pitr-ch 04-Dec-2016): should be in edge + class Lock < LockableObject + # TODO use JavaReentrantLock on JRuby + + public :synchronize + + def wait(timeout = nil) + synchronize { ns_wait(timeout) } + end + + public :ns_wait + + def wait_until(timeout = nil, &condition) + synchronize { ns_wait_until(timeout, &condition) } + end + + public :ns_wait_until + + def signal + synchronize { ns_signal } + end + + public :ns_signal + + def broadcast + synchronize { ns_broadcast } + end + + public :ns_broadcast + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/lockable_object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/lockable_object.rb new file mode 100644 index 0000000..a28d5af --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/lockable_object.rb @@ -0,0 +1,74 @@ +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + LockableObjectImplementation = case + when Concurrent.on_cruby? && Concurrent.ruby_version(:<=, 1, 9, 3) + MriMonitorLockableObject + when Concurrent.on_cruby? && Concurrent.ruby_version(:>, 1, 9, 3) + MriMutexLockableObject + when Concurrent.on_jruby? + JRubyLockableObject + when Concurrent.on_rbx? + RbxLockableObject + when Concurrent.on_truffle? + MriMutexLockableObject + else + warn 'Possibly unsupported Ruby implementation' + MriMonitorLockableObject + end + private_constant :LockableObjectImplementation + + # Safe synchronization under any Ruby implementation. + # It provides methods like {#synchronize}, {#wait}, {#signal} and {#broadcast}. + # Provides a single layer which can improve its implementation over time without changes needed to + # the classes using it. Use {Synchronization::Object} not this abstract class. + # + # @note this object does not support usage together with + # [`Thread#wakeup`](http://ruby-doc.org/core-2.2.0/Thread.html#method-i-wakeup) + # and [`Thread#raise`](http://ruby-doc.org/core-2.2.0/Thread.html#method-i-raise). + # `Thread#sleep` and `Thread#wakeup` will work as expected but mixing `Synchronization::Object#wait` and + # `Thread#wakeup` will not work on all platforms. + # + # @see {Event} implementation as an example of this class use + # + # @example simple + # class AnClass < Synchronization::Object + # def initialize + # super + # synchronize { @value = 'asd' } + # end + # + # def value + # synchronize { @value } + # end + # end + # + # @!visibility private + class LockableObject < LockableObjectImplementation + + # TODO (pitr 12-Sep-2015): make private for c-r, prohibit subclassing + # TODO (pitr 12-Sep-2015): we inherit too much ourselves :/ + + # @!method initialize(*args, &block) + # @!macro synchronization_object_method_initialize + + # @!method synchronize + # @!macro synchronization_object_method_synchronize + + # @!method wait_until(timeout = nil, &condition) + # @!macro synchronization_object_method_ns_wait_until + + # @!method wait(timeout = nil) + # @!macro synchronization_object_method_ns_wait + + # @!method signal + # @!macro synchronization_object_method_ns_signal + + # @!method broadcast + # @!macro synchronization_object_method_ns_broadcast + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/mri_lockable_object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/mri_lockable_object.rb new file mode 100644 index 0000000..2212028 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/mri_lockable_object.rb @@ -0,0 +1,71 @@ +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + class MriLockableObject < AbstractLockableObject + protected + + def ns_signal + @__condition__.signal + self + end + + def ns_broadcast + @__condition__.broadcast + self + end + end + + + # @!visibility private + # @!macro internal_implementation_note + class MriMutexLockableObject < MriLockableObject + safe_initialization! + + def initialize(*defaults) + super(*defaults) + @__lock__ = ::Mutex.new + @__condition__ = ::ConditionVariable.new + end + + protected + + def synchronize + if @__lock__.owned? + yield + else + @__lock__.synchronize { yield } + end + end + + def ns_wait(timeout = nil) + @__condition__.wait @__lock__, timeout + self + end + end + + # @!visibility private + # @!macro internal_implementation_note + class MriMonitorLockableObject < MriLockableObject + safe_initialization! + + def initialize(*defaults) + super(*defaults) + @__lock__ = ::Monitor.new + @__condition__ = @__lock__.new_cond + end + + protected + + def synchronize # TODO may be a problem with lock.synchronize { lock.wait } + @__lock__.synchronize { yield } + end + + def ns_wait(timeout = nil) + @__condition__.wait timeout + self + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/mri_object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/mri_object.rb new file mode 100644 index 0000000..74202f5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/mri_object.rb @@ -0,0 +1,43 @@ +module Concurrent + module Synchronization + + module MriAttrVolatile + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + def attr_volatile(*names) + names.each do |name| + ivar = :"@volatile_#{name}" + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + #{ivar} + end + + def #{name}=(value) + #{ivar} = value + end + RUBY + end + names.map { |n| [n, :"#{n}="] }.flatten + end + end + + def full_memory_barrier + # relying on undocumented behavior of CRuby, GVL acquire has lock which ensures visibility of ivars + # https://github.com/ruby/ruby/blob/ruby_2_2/thread_pthread.c#L204-L211 + end + end + + # @!visibility private + # @!macro internal_implementation_note + class MriObject < AbstractObject + include MriAttrVolatile + + def initialize + # nothing to do + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/object.rb new file mode 100644 index 0000000..21b5695 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/object.rb @@ -0,0 +1,153 @@ +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + ObjectImplementation = case + when Concurrent.on_cruby? + MriObject + when Concurrent.on_jruby? + JRubyObject + when Concurrent.on_rbx? + RbxObject + when Concurrent.on_truffle? + TruffleObject + else + MriObject + end + private_constant :ObjectImplementation + + # Abstract object providing final, volatile, ans CAS extensions to build other concurrent abstractions. + # - final instance variables see {Object.safe_initialization!} + # - volatile instance variables see {Object.attr_volatile} + # - volatile instance variables see {Object.attr_atomic} + class Object < ObjectImplementation + # TODO make it a module if possible + + # @!method self.attr_volatile(*names) + # Creates methods for reading and writing (as `attr_accessor` does) to a instance variable with + # volatile (Java) semantic. The instance variable should be accessed oly through generated methods. + # + # @param [Array] names of the instance variables to be volatile + # @return [Array] names of defined method names + + # Has to be called by children. + def initialize + super + initialize_volatile_with_cas + end + + # By calling this method on a class, it and all its children are marked to be constructed safely. Meaning that + # all writes (ivar initializations) are made visible to all readers of newly constructed object. It ensures + # same behaviour as Java's final fields. + # @example + # class AClass < Concurrent::Synchronization::Object + # safe_initialization! + # + # def initialize + # @AFinalValue = 'value' # published safely, does not have to be synchronized + # end + # end + def self.safe_initialization! + # define only once, and not again in children + return if safe_initialization? + + def self.new(*args, &block) + object = super(*args, &block) + ensure + object.full_memory_barrier if object + end + + @safe_initialization = true + end + + # @return [true, false] if this class is safely initialized. + def self.safe_initialization? + @safe_initialization = false unless defined? @safe_initialization + @safe_initialization || (superclass.respond_to?(:safe_initialization?) && superclass.safe_initialization?) + end + + # For testing purposes, quite slow. Injects assert code to new method which will raise if class instance contains + # any instance variables with CamelCase names and isn't {.safe_initialization?}. + def self.ensure_safe_initialization_when_final_fields_are_present + Object.class_eval do + def self.new(*args, &block) + object = super(*args, &block) + ensure + has_final_field = object.instance_variables.any? { |v| v.to_s =~ /^@[A-Z]/ } + if has_final_field && !safe_initialization? + raise "there was an instance of #{object.class} with final field but not marked with safe_initialization!" + end + end + end + end + + # Creates methods for reading and writing to a instance variable with + # volatile (Java) semantic as {.attr_volatile} does. + # The instance variable should be accessed oly through generated methods. + # This method generates following methods: `value`, `value=(new_value) #=> new_value`, + # `swap_value(new_value) #=> old_value`, + # `compare_and_set_value(expected, value) #=> true || false`, `update_value(&block)`. + # @param [Array] names of the instance variables to be volatile with CAS. + # @return [Array] names of defined method names. + def self.attr_atomic(*names) + @volatile_cas_fields ||= [] + @volatile_cas_fields += names + safe_initialization! + define_initialize_volatile_with_cas + + names.each do |name| + ivar = :"@Atomic#{name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }}" + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + #{ivar}.get + end + + def #{name}=(value) + #{ivar}.set value + end + + def swap_#{name}(value) + #{ivar}.swap value + end + + def compare_and_set_#{name}(expected, value) + #{ivar}.compare_and_set expected, value + end + + def update_#{name}(&block) + #{ivar}.update(&block) + end + RUBY + end + names.flat_map { |n| [n, :"#{n}=", :"swap_#{n}", :"compare_and_set_#{n}", :"update_#{n}"] } + end + + # @param [true,false] inherited should inherited volatile with CAS fields be returned? + # @return [Array] Returns defined volatile with CAS fields on this class. + def self.volatile_cas_fields(inherited = true) + @volatile_cas_fields ||= [] + ((superclass.volatile_cas_fields if superclass.respond_to?(:volatile_cas_fields) && inherited) || []) + + @volatile_cas_fields + end + + private + + def self.define_initialize_volatile_with_cas + assignments = @volatile_cas_fields.map { |name| "@Atomic#{name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }} = AtomicReference.new(nil)" }.join("\n") + class_eval <<-RUBY + def initialize_volatile_with_cas + super + #{assignments} + end + RUBY + end + + private_class_method :define_initialize_volatile_with_cas + + def initialize_volatile_with_cas + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/rbx_lockable_object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/rbx_lockable_object.rb new file mode 100644 index 0000000..8dbd3c3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/rbx_lockable_object.rb @@ -0,0 +1,65 @@ +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + class RbxLockableObject < AbstractLockableObject + safe_initialization! + + def initialize(*defaults) + super(*defaults) + @__Waiters__ = [] + @__owner__ = nil + end + + protected + + def synchronize(&block) + if @__owner__ == Thread.current + yield + else + result = nil + Rubinius.synchronize(self) do + begin + @__owner__ = Thread.current + result = yield + ensure + @__owner__ = nil + end + end + result + end + end + + def ns_wait(timeout = nil) + wchan = Rubinius::Channel.new + + begin + @__Waiters__.push wchan + Rubinius.unlock(self) + signaled = wchan.receive_timeout timeout + ensure + Rubinius.lock(self) + + if !signaled && !@__Waiters__.delete(wchan) + # we timed out, but got signaled afterwards, + # so pass that signal on to the next waiter + @__Waiters__.shift << true unless @__Waiters__.empty? + end + end + + self + end + + def ns_signal + @__Waiters__.shift << true unless @__Waiters__.empty? + self + end + + def ns_broadcast + @__Waiters__.shift << true until @__Waiters__.empty? + self + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/rbx_object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/rbx_object.rb new file mode 100644 index 0000000..b9a0e3f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/rbx_object.rb @@ -0,0 +1,48 @@ +module Concurrent + module Synchronization + + module RbxAttrVolatile + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + + def attr_volatile(*names) + names.each do |name| + ivar = :"@volatile_#{name}" + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + Rubinius.memory_barrier + #{ivar} + end + + def #{name}=(value) + #{ivar} = value + Rubinius.memory_barrier + end + RUBY + end + names.map { |n| [n, :"#{n}="] }.flatten + end + + end + + def full_memory_barrier + # Rubinius instance variables are not volatile so we need to insert barrier + # TODO (pitr 26-Nov-2015): check comments like ^ + Rubinius.memory_barrier + end + end + + # @!visibility private + # @!macro internal_implementation_note + class RbxObject < AbstractObject + include RbxAttrVolatile + + def initialize + # nothing to do + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/truffle_lockable_object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/truffle_lockable_object.rb new file mode 100644 index 0000000..c9328f2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/truffle_lockable_object.rb @@ -0,0 +1,9 @@ +module Concurrent + module Synchronization + class TruffleLockableObject < AbstractLockableObject + def new(*) + raise NotImplementedError + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/truffle_object.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/truffle_object.rb new file mode 100644 index 0000000..9b1c3fc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/truffle_object.rb @@ -0,0 +1,31 @@ +module Concurrent + module Synchronization + + module TruffleAttrVolatile + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + def attr_volatile(*names) + # TODO may not always be available + attr_atomic(*names) + end + end + + def full_memory_barrier + Truffle::System.full_memory_barrier + end + end + + # @!visibility private + # @!macro internal_implementation_note + class TruffleObject < AbstractObject + include TruffleAttrVolatile + + def initialize + # nothing to do + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/volatile.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/volatile.rb new file mode 100644 index 0000000..45269df --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/synchronization/volatile.rb @@ -0,0 +1,34 @@ +module Concurrent + module Synchronization + + # Volatile adds the attr_volatile class method when included. + # + # @example + # class Foo + # include Concurrent::Synchronization::Volatile + # + # attr_volatile :bar + # + # def initialize + # self.bar = 1 + # end + # end + # + # foo = Foo.new + # foo.bar + # => 1 + # foo.bar = 2 + # => 2 + + Volatile = case + when Concurrent.on_cruby? + MriAttrVolatile + when Concurrent.on_jruby? + JRubyAttrVolatile + when Concurrent.on_rbx? || Concurrent.on_truffle? + RbxAttrVolatile + else + MriAttrVolatile + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/synchronized_delegator.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/synchronized_delegator.rb new file mode 100644 index 0000000..92e7c45 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/synchronized_delegator.rb @@ -0,0 +1,50 @@ +require 'delegate' +require 'monitor' + +module Concurrent + unless defined?(SynchronizedDelegator) + + # This class provides a trivial way to synchronize all calls to a given object + # by wrapping it with a `Delegator` that performs `Monitor#enter/exit` calls + # around the delegated `#send`. Example: + # + # array = [] # not thread-safe on many impls + # array = SynchronizedDelegator.new([]) # thread-safe + # + # A simple `Monitor` provides a very coarse-grained way to synchronize a given + # object, in that it will cause synchronization for methods that have no need + # for it, but this is a trivial way to get thread-safety where none may exist + # currently on some implementations. + # + # This class is currently being considered for inclusion into stdlib, via + # https://bugs.ruby-lang.org/issues/8556 + # + # @!visibility private + class SynchronizedDelegator < SimpleDelegator + def setup + @old_abort = Thread.abort_on_exception + Thread.abort_on_exception = true + end + + def teardown + Thread.abort_on_exception = @old_abort + end + + def initialize(obj) + __setobj__(obj) + @monitor = Monitor.new + end + + def method_missing(method, *args, &block) + monitor = @monitor + begin + monitor.enter + super + ensure + monitor.exit + end + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util.rb new file mode 100644 index 0000000..c67084a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util.rb @@ -0,0 +1,16 @@ +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # TODO (pitr-ch 15-Oct-2016): migrate to Utility::NativeInteger + FIXNUM_BIT_SIZE = (0.size * 8) - 2 + MAX_INT = (2 ** FIXNUM_BIT_SIZE) - 1 + # TODO (pitr-ch 15-Oct-2016): migrate to Utility::ProcessorCounter + CPU_COUNT = 16 # is there a way to determine this? + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/adder.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/adder.rb new file mode 100644 index 0000000..7a6e8d5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/adder.rb @@ -0,0 +1,74 @@ +require 'concurrent/thread_safe/util' +require 'concurrent/thread_safe/util/striped64' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # A Ruby port of the Doug Lea's jsr166e.LondAdder class version 1.8 + # available in public domain. + # + # Original source code available here: + # http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/LongAdder.java?revision=1.8 + # + # One or more variables that together maintain an initially zero + # sum. When updates (method +add+) are contended across threads, + # the set of variables may grow dynamically to reduce contention. + # Method +sum+ returns the current total combined across the + # variables maintaining the sum. + # + # This class is usually preferable to single +Atomic+ reference when + # multiple threads update a common sum that is used for purposes such + # as collecting statistics, not for fine-grained synchronization + # control. Under low update contention, the two classes have similar + # characteristics. But under high contention, expected throughput of + # this class is significantly higher, at the expense of higher space + # consumption. + # + # @!visibility private + class Adder < Striped64 + # Adds the given value. + def add(x) + if (current_cells = cells) || !cas_base_computed {|current_base| current_base + x} + was_uncontended = true + hash = hash_code + unless current_cells && (cell = current_cells.volatile_get_by_hash(hash)) && (was_uncontended = cell.cas_computed {|current_value| current_value + x}) + retry_update(x, hash, was_uncontended) {|current_value| current_value + x} + end + end + end + + def increment + add(1) + end + + def decrement + add(-1) + end + + # Returns the current sum. The returned value is _NOT_ an + # atomic snapshot: Invocation in the absence of concurrent + # updates returns an accurate result, but concurrent updates that + # occur while the sum is being calculated might not be + # incorporated. + def sum + x = base + if current_cells = cells + current_cells.each do |cell| + x += cell.value if cell + end + end + x + end + + def reset + internal_reset(0) + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/array_hash_rbx.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/array_hash_rbx.rb new file mode 100644 index 0000000..3fc2a38 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/array_hash_rbx.rb @@ -0,0 +1,30 @@ +require 'concurrent/thread_safe/util' + +module Concurrent + module ThreadSafe + module Util + def self.make_synchronized_on_rbx(klass) + klass.class_eval do + private + def _mon_initialize + @_monitor = Monitor.new unless @_monitor # avoid double initialisation + end + + def self.allocate + obj = super + obj.send(:_mon_initialize) + obj + end + end + + klass.superclass.instance_methods(false).each do |method| + klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{method}(*args) + @_monitor.synchronize { super } + end + RUBY + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/cheap_lockable.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/cheap_lockable.rb new file mode 100644 index 0000000..d9b4c58 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/cheap_lockable.rb @@ -0,0 +1,118 @@ +require 'concurrent/thread_safe/util' +require 'concurrent/thread_safe/util/volatile' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # Provides a cheapest possible (mainly in terms of memory usage) +Mutex+ + # with the +ConditionVariable+ bundled in. + # + # Usage: + # class A + # include CheapLockable + # + # def do_exlusively + # cheap_synchronize { yield } + # end + # + # def wait_for_something + # cheap_synchronize do + # cheap_wait until resource_available? + # do_something + # cheap_broadcast # wake up others + # end + # end + # end + # + # @!visibility private + module CheapLockable + private + engine = defined?(RUBY_ENGINE) && RUBY_ENGINE + if engine == 'rbx' + # Making use of the Rubinius' ability to lock via object headers to avoid the overhead of the extra Mutex objects. + def cheap_synchronize + Rubinius.lock(self) + begin + yield + ensure + Rubinius.unlock(self) + end + end + + def cheap_wait + wchan = Rubinius::Channel.new + + begin + waiters = @waiters ||= [] + waiters.push wchan + Rubinius.unlock(self) + signaled = wchan.receive_timeout nil + ensure + Rubinius.lock(self) + + unless signaled or waiters.delete(wchan) + # we timed out, but got signaled afterwards (e.g. while waiting to + # acquire @lock), so pass that signal on to the next waiter + waiters.shift << true unless waiters.empty? + end + end + + self + end + + def cheap_broadcast + waiters = @waiters ||= [] + waiters.shift << true until waiters.empty? + self + end + elsif engine == 'jruby' + # Use Java's native synchronized (this) { wait(); notifyAll(); } to avoid the overhead of the extra Mutex objects + require 'jruby' + + def cheap_synchronize + JRuby.reference0(self).synchronized { yield } + end + + def cheap_wait + JRuby.reference0(self).wait + end + + def cheap_broadcast + JRuby.reference0(self).notify_all + end + else + require 'thread' + + extend Volatile + attr_volatile :mutex + + # Non-reentrant Mutex#syncrhonize + def cheap_synchronize + true until (my_mutex = mutex) || cas_mutex(nil, my_mutex = Mutex.new) + my_mutex.synchronize { yield } + end + + # Releases this object's +cheap_synchronize+ lock and goes to sleep waiting for other threads to +cheap_broadcast+, reacquires the lock on wakeup. + # Must only be called in +cheap_broadcast+'s block. + def cheap_wait + conditional_variable = @conditional_variable ||= ConditionVariable.new + conditional_variable.wait(mutex) + end + + # Wakes up all threads waiting for this object's +cheap_synchronize+ lock. + # Must only be called in +cheap_broadcast+'s block. + def cheap_broadcast + if conditional_variable = @conditional_variable + conditional_variable.broadcast + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/power_of_two_tuple.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/power_of_two_tuple.rb new file mode 100644 index 0000000..b54be39 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/power_of_two_tuple.rb @@ -0,0 +1,38 @@ +require 'concurrent/thread_safe/util' +require 'concurrent/tuple' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # @!visibility private + class PowerOfTwoTuple < Concurrent::Tuple + + def initialize(size) + raise ArgumentError, "size must be a power of 2 (#{size.inspect} provided)" unless size > 0 && size & (size - 1) == 0 + super(size) + end + + def hash_to_index(hash) + (size - 1) & hash + end + + def volatile_get_by_hash(hash) + volatile_get(hash_to_index(hash)) + end + + def volatile_set_by_hash(hash, value) + volatile_set(hash_to_index(hash), value) + end + + def next_in_size_table + self.class.new(size << 1) + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/striped64.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/striped64.rb new file mode 100644 index 0000000..10f9ece --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/striped64.rb @@ -0,0 +1,241 @@ +require 'concurrent/thread_safe/util' +require 'concurrent/thread_safe/util/power_of_two_tuple' +require 'concurrent/thread_safe/util/volatile' +require 'concurrent/thread_safe/util/xor_shift_random' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # A Ruby port of the Doug Lea's jsr166e.Striped64 class version 1.6 + # available in public domain. + # + # Original source code available here: + # http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/Striped64.java?revision=1.6 + # + # Class holding common representation and mechanics for classes supporting + # dynamic striping on 64bit values. + # + # This class maintains a lazily-initialized table of atomically updated + # variables, plus an extra +base+ field. The table size is a power of two. + # Indexing uses masked per-thread hash codes. Nearly all methods on this + # class are private, accessed directly by subclasses. + # + # Table entries are of class +Cell+; a variant of AtomicLong padded to + # reduce cache contention on most processors. Padding is overkill for most + # Atomics because they are usually irregularly scattered in memory and thus + # don't interfere much with each other. But Atomic objects residing in + # arrays will tend to be placed adjacent to each other, and so will most + # often share cache lines (with a huge negative performance impact) without + # this precaution. + # + # In part because +Cell+s are relatively large, we avoid creating them until + # they are needed. When there is no contention, all updates are made to the + # +base+ field. Upon first contention (a failed CAS on +base+ update), the + # table is initialized to size 2. The table size is doubled upon further + # contention until reaching the nearest power of two greater than or equal + # to the number of CPUS. Table slots remain empty (+nil+) until they are + # needed. + # + # A single spinlock (+busy+) is used for initializing and resizing the + # table, as well as populating slots with new +Cell+s. There is no need for + # a blocking lock: When the lock is not available, threads try other slots + # (or the base). During these retries, there is increased contention and + # reduced locality, which is still better than alternatives. + # + # Per-thread hash codes are initialized to random values. Contention and/or + # table collisions are indicated by failed CASes when performing an update + # operation (see method +retry_update+). Upon a collision, if the table size + # is less than the capacity, it is doubled in size unless some other thread + # holds the lock. If a hashed slot is empty, and lock is available, a new + # +Cell+ is created. Otherwise, if the slot exists, a CAS is tried. Retries + # proceed by "double hashing", using a secondary hash (XorShift) to try to + # find a free slot. + # + # The table size is capped because, when there are more threads than CPUs, + # supposing that each thread were bound to a CPU, there would exist a + # perfect hash function mapping threads to slots that eliminates collisions. + # When we reach capacity, we search for this mapping by randomly varying the + # hash codes of colliding threads. Because search is random, and collisions + # only become known via CAS failures, convergence can be slow, and because + # threads are typically not bound to CPUS forever, may not occur at all. + # However, despite these limitations, observed contention rates are + # typically low in these cases. + # + # It is possible for a +Cell+ to become unused when threads that once hashed + # to it terminate, as well as in the case where doubling the table causes no + # thread to hash to it under expanded mask. We do not try to detect or + # remove such cells, under the assumption that for long-running instances, + # observed contention levels will recur, so the cells will eventually be + # needed again; and for short-lived ones, it does not matter. + # + # @!visibility private + class Striped64 + + # Padded variant of AtomicLong supporting only raw accesses plus CAS. + # The +value+ field is placed between pads, hoping that the JVM doesn't + # reorder them. + # + # Optimisation note: It would be possible to use a release-only + # form of CAS here, if it were provided. + # + # @!visibility private + class Cell < Concurrent::AtomicReference + + # TODO: this only adds padding after the :value slot, need to find a way to add padding before the slot + # @!visibility private + attr_reader *(12.times.collect{ |i| "padding_#{i}".to_sym }) + + alias_method :cas, :compare_and_set + + def cas_computed + cas(current_value = value, yield(current_value)) + end + end + + extend Volatile + attr_volatile :cells, # Table of cells. When non-null, size is a power of 2. + :base, # Base value, used mainly when there is no contention, but also as a fallback during table initialization races. Updated via CAS. + :busy # Spinlock (locked via CAS) used when resizing and/or creating Cells. + + alias_method :busy?, :busy + + def initialize + super() + self.busy = false + self.base = 0 + end + + # Handles cases of updates involving initialization, resizing, + # creating new Cells, and/or contention. See above for + # explanation. This method suffers the usual non-modularity + # problems of optimistic retry code, relying on rechecked sets of + # reads. + # + # Arguments: + # [+x+] + # the value + # [+hash_code+] + # hash code used + # [+x+] + # false if CAS failed before call + def retry_update(x, hash_code, was_uncontended) # :yields: current_value + hash = hash_code + collided = false # True if last slot nonempty + while true + if current_cells = cells + if !(cell = current_cells.volatile_get_by_hash(hash)) + if busy? + collided = false + else # Try to attach new Cell + if try_to_install_new_cell(Cell.new(x), hash) # Optimistically create and try to insert new cell + break + else + redo # Slot is now non-empty + end + end + elsif !was_uncontended # CAS already known to fail + was_uncontended = true # Continue after rehash + elsif cell.cas_computed {|current_value| yield current_value} + break + elsif current_cells.size >= CPU_COUNT || cells != current_cells # At max size or stale + collided = false + elsif collided && expand_table_unless_stale(current_cells) + collided = false + redo # Retry with expanded table + else + collided = true + end + hash = XorShiftRandom.xorshift(hash) + + elsif try_initialize_cells(x, hash) || cas_base_computed {|current_base| yield current_base} + break + end + end + self.hash_code = hash + end + + private + # Static per-thread hash code key. Shared across all instances to + # reduce Thread locals pollution and because adjustments due to + # collisions in one table are likely to be appropriate for + # others. + THREAD_LOCAL_KEY = "#{name}.hash_code".to_sym + + # A thread-local hash code accessor. The code is initially + # random, but may be set to a different value upon collisions. + def hash_code + Thread.current[THREAD_LOCAL_KEY] ||= XorShiftRandom.get + end + + def hash_code=(hash) + Thread.current[THREAD_LOCAL_KEY] = hash + end + + # Sets base and all +cells+ to the given value. + def internal_reset(initial_value) + current_cells = cells + self.base = initial_value + if current_cells + current_cells.each do |cell| + cell.value = initial_value if cell + end + end + end + + def cas_base_computed + cas_base(current_base = base, yield(current_base)) + end + + def free? + !busy? + end + + def try_initialize_cells(x, hash) + if free? && !cells + try_in_busy do + unless cells # Recheck under lock + new_cells = PowerOfTwoTuple.new(2) + new_cells.volatile_set_by_hash(hash, Cell.new(x)) + self.cells = new_cells + end + end + end + end + + def expand_table_unless_stale(current_cells) + try_in_busy do + if current_cells == cells # Recheck under lock + new_cells = current_cells.next_in_size_table + current_cells.each_with_index {|x, i| new_cells.volatile_set(i, x)} + self.cells = new_cells + end + end + end + + def try_to_install_new_cell(new_cell, hash) + try_in_busy do + # Recheck under lock + if (current_cells = cells) && !current_cells.volatile_get(i = current_cells.hash_to_index(hash)) + current_cells.volatile_set(i, new_cell) + end + end + end + + def try_in_busy + if cas_busy(false, true) + begin + yield + ensure + self.busy = false + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/volatile.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/volatile.rb new file mode 100644 index 0000000..cdac2a3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/volatile.rb @@ -0,0 +1,75 @@ +require 'concurrent/thread_safe/util' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # @!visibility private + module Volatile + + # Provides +volatile+ (in the JVM's sense) attribute accessors implemented + # atop of +Concurrent::AtomicReference+. + # + # Usage: + # class Foo + # extend Concurrent::ThreadSafe::Util::Volatile + # attr_volatile :foo, :bar + # + # def initialize(bar) + # super() # must super() into parent initializers before using the volatile attribute accessors + # self.bar = bar + # end + # + # def hello + # my_foo = foo # volatile read + # self.foo = 1 # volatile write + # cas_foo(1, 2) # => true | a strong CAS + # end + # end + def attr_volatile(*attr_names) + return if attr_names.empty? + include(Module.new do + atomic_ref_setup = attr_names.map {|attr_name| "@__#{attr_name} = Concurrent::AtomicReference.new"} + initialize_copy_setup = attr_names.zip(atomic_ref_setup).map do |attr_name, ref_setup| + "#{ref_setup}(other.instance_variable_get(:@__#{attr_name}).get)" + end + class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def initialize(*) + super + #{atomic_ref_setup.join('; ')} + end + + def initialize_copy(other) + super + #{initialize_copy_setup.join('; ')} + end + RUBY_EVAL + + attr_names.each do |attr_name| + class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def #{attr_name} + @__#{attr_name}.get + end + + def #{attr_name}=(value) + @__#{attr_name}.set(value) + end + + def compare_and_set_#{attr_name}(old_value, new_value) + @__#{attr_name}.compare_and_set(old_value, new_value) + end + RUBY_EVAL + + alias_method :"cas_#{attr_name}", :"compare_and_set_#{attr_name}" + alias_method :"lazy_set_#{attr_name}", :"#{attr_name}=" + end + end) + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/xor_shift_random.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/xor_shift_random.rb new file mode 100644 index 0000000..bdde2dd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/thread_safe/util/xor_shift_random.rb @@ -0,0 +1,50 @@ +require 'concurrent/thread_safe/util' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # A xorshift random number (positive +Fixnum+s) generator, provides + # reasonably cheap way to generate thread local random numbers without + # contending for the global +Kernel.rand+. + # + # Usage: + # x = XorShiftRandom.get # uses Kernel.rand to generate an initial seed + # while true + # if (x = XorShiftRandom.xorshift).odd? # thread-localy generate a next random number + # do_something_at_random + # end + # end + module XorShiftRandom + extend self + MAX_XOR_SHIFTABLE_INT = MAX_INT - 1 + + # Generates an initial non-zero positive +Fixnum+ via +Kernel.rand+. + def get + Kernel.rand(MAX_XOR_SHIFTABLE_INT) + 1 # 0 can't be xorshifted + end + + # xorshift based on: http://www.jstatsoft.org/v08/i14/paper + if 0.size == 4 + # using the "yˆ=y>>a; yˆ=y<>c;" transform with the (a,b,c) tuple with values (3,1,14) to minimise Bignum overflows + def xorshift(x) + x ^= x >> 3 + x ^= (x << 1) & MAX_INT # cut-off Bignum overflow + x ^= x >> 14 + end + else + # using the "yˆ=y>>a; yˆ=y<>c;" transform with the (a,b,c) tuple with values (1,1,54) to minimise Bignum overflows + def xorshift(x) + x ^= x >> 1 + x ^= (x << 1) & MAX_INT # cut-off Bignum overflow + x ^= x >> 54 + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/timer_task.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/timer_task.rb new file mode 100644 index 0000000..81f2821 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/timer_task.rb @@ -0,0 +1,331 @@ +require 'concurrent/collection/copy_on_notify_observer_set' +require 'concurrent/concern/dereferenceable' +require 'concurrent/concern/observable' +require 'concurrent/atomic/atomic_boolean' +require 'concurrent/executor/executor_service' +require 'concurrent/executor/ruby_executor_service' +require 'concurrent/executor/safe_task_executor' +require 'concurrent/scheduled_task' + +module Concurrent + + # A very common concurrency pattern is to run a thread that performs a task at + # regular intervals. The thread that performs the task sleeps for the given + # interval then wakes up and performs the task. Lather, rinse, repeat... This + # pattern causes two problems. First, it is difficult to test the business + # logic of the task because the task itself is tightly coupled with the + # concurrency logic. Second, an exception raised while performing the task can + # cause the entire thread to abend. In a long-running application where the + # task thread is intended to run for days/weeks/years a crashed task thread + # can pose a significant problem. `TimerTask` alleviates both problems. + # + # When a `TimerTask` is launched it starts a thread for monitoring the + # execution interval. The `TimerTask` thread does not perform the task, + # however. Instead, the TimerTask launches the task on a separate thread. + # Should the task experience an unrecoverable crash only the task thread will + # crash. This makes the `TimerTask` very fault tolerant. Additionally, the + # `TimerTask` thread can respond to the success or failure of the task, + # performing logging or ancillary operations. `TimerTask` can also be + # configured with a timeout value allowing it to kill a task that runs too + # long. + # + # One other advantage of `TimerTask` is that it forces the business logic to + # be completely decoupled from the concurrency logic. The business logic can + # be tested separately then passed to the `TimerTask` for scheduling and + # running. + # + # In some cases it may be necessary for a `TimerTask` to affect its own + # execution cycle. To facilitate this, a reference to the TimerTask instance + # is passed as an argument to the provided block every time the task is + # executed. + # + # The `TimerTask` class includes the `Dereferenceable` mixin module so the + # result of the last execution is always available via the `#value` method. + # Dereferencing options can be passed to the `TimerTask` during construction or + # at any later time using the `#set_deref_options` method. + # + # `TimerTask` supports notification through the Ruby standard library + # {http://ruby-doc.org/stdlib-2.0/libdoc/observer/rdoc/Observable.html + # Observable} module. On execution the `TimerTask` will notify the observers + # with three arguments: time of execution, the result of the block (or nil on + # failure), and any raised exceptions (or nil on success). If the timeout + # interval is exceeded the observer will receive a `Concurrent::TimeoutError` + # object as the third argument. + # + # @!macro copy_options + # + # @example Basic usage + # task = Concurrent::TimerTask.new{ puts 'Boom!' } + # task.execute + # + # task.execution_interval #=> 60 (default) + # task.timeout_interval #=> 30 (default) + # + # # wait 60 seconds... + # #=> 'Boom!' + # + # task.shutdown #=> true + # + # @example Configuring `:execution_interval` and `:timeout_interval` + # task = Concurrent::TimerTask.new(execution_interval: 5, timeout_interval: 5) do + # puts 'Boom!' + # end + # + # task.execution_interval #=> 5 + # task.timeout_interval #=> 5 + # + # @example Immediate execution with `:run_now` + # task = Concurrent::TimerTask.new(run_now: true){ puts 'Boom!' } + # task.execute + # + # #=> 'Boom!' + # + # @example Last `#value` and `Dereferenceable` mixin + # task = Concurrent::TimerTask.new( + # dup_on_deref: true, + # execution_interval: 5 + # ){ Time.now } + # + # task.execute + # Time.now #=> 2013-11-07 18:06:50 -0500 + # sleep(10) + # task.value #=> 2013-11-07 18:06:55 -0500 + # + # @example Controlling execution from within the block + # timer_task = Concurrent::TimerTask.new(execution_interval: 1) do |task| + # task.execution_interval.times{ print 'Boom! ' } + # print "\n" + # task.execution_interval += 1 + # if task.execution_interval > 5 + # puts 'Stopping...' + # task.shutdown + # end + # end + # + # timer_task.execute # blocking call - this task will stop itself + # #=> Boom! + # #=> Boom! Boom! + # #=> Boom! Boom! Boom! + # #=> Boom! Boom! Boom! Boom! + # #=> Boom! Boom! Boom! Boom! Boom! + # #=> Stopping... + # + # @example Observation + # class TaskObserver + # def update(time, result, ex) + # if result + # print "(#{time}) Execution successfully returned #{result}\n" + # elsif ex.is_a?(Concurrent::TimeoutError) + # print "(#{time}) Execution timed out\n" + # else + # print "(#{time}) Execution failed with error #{ex}\n" + # end + # end + # end + # + # task = Concurrent::TimerTask.new(execution_interval: 1, timeout_interval: 1){ 42 } + # task.add_observer(TaskObserver.new) + # task.execute + # + # #=> (2013-10-13 19:08:58 -0400) Execution successfully returned 42 + # #=> (2013-10-13 19:08:59 -0400) Execution successfully returned 42 + # #=> (2013-10-13 19:09:00 -0400) Execution successfully returned 42 + # task.shutdown + # + # task = Concurrent::TimerTask.new(execution_interval: 1, timeout_interval: 1){ sleep } + # task.add_observer(TaskObserver.new) + # task.execute + # + # #=> (2013-10-13 19:07:25 -0400) Execution timed out + # #=> (2013-10-13 19:07:27 -0400) Execution timed out + # #=> (2013-10-13 19:07:29 -0400) Execution timed out + # task.shutdown + # + # task = Concurrent::TimerTask.new(execution_interval: 1){ raise StandardError } + # task.add_observer(TaskObserver.new) + # task.execute + # + # #=> (2013-10-13 19:09:37 -0400) Execution failed with error StandardError + # #=> (2013-10-13 19:09:38 -0400) Execution failed with error StandardError + # #=> (2013-10-13 19:09:39 -0400) Execution failed with error StandardError + # task.shutdown + # + # @see http://ruby-doc.org/stdlib-2.0/libdoc/observer/rdoc/Observable.html + # @see http://docs.oracle.com/javase/7/docs/api/java/util/TimerTask.html + class TimerTask < RubyExecutorService + include Concern::Dereferenceable + include Concern::Observable + + # Default `:execution_interval` in seconds. + EXECUTION_INTERVAL = 60 + + # Default `:timeout_interval` in seconds. + TIMEOUT_INTERVAL = 30 + + # Create a new TimerTask with the given task and configuration. + # + # @!macro [attach] timer_task_initialize + # @param [Hash] opts the options defining task execution. + # @option opts [Integer] :execution_interval number of seconds between + # task executions (default: EXECUTION_INTERVAL) + # @option opts [Integer] :timeout_interval number of seconds a task can + # run before it is considered to have failed (default: TIMEOUT_INTERVAL) + # @option opts [Boolean] :run_now Whether to run the task immediately + # upon instantiation or to wait until the first # execution_interval + # has passed (default: false) + # + # @!macro deref_options + # + # @raise ArgumentError when no block is given. + # + # @yield to the block after :execution_interval seconds have passed since + # the last yield + # @yieldparam task a reference to the `TimerTask` instance so that the + # block can control its own lifecycle. Necessary since `self` will + # refer to the execution context of the block rather than the running + # `TimerTask`. + # + # @return [TimerTask] the new `TimerTask` + def initialize(opts = {}, &task) + raise ArgumentError.new('no block given') unless block_given? + super + end + + # Is the executor running? + # + # @return [Boolean] `true` when running, `false` when shutting down or shutdown + def running? + @running.true? + end + + # Execute a previously created `TimerTask`. + # + # @return [TimerTask] a reference to `self` + # + # @example Instance and execute in separate steps + # task = Concurrent::TimerTask.new(execution_interval: 10){ print "Hello World\n" } + # task.running? #=> false + # task.execute + # task.running? #=> true + # + # @example Instance and execute in one line + # task = Concurrent::TimerTask.new(execution_interval: 10){ print "Hello World\n" }.execute + # task.running? #=> true + def execute + synchronize do + if @running.false? + @running.make_true + schedule_next_task(@run_now ? 0 : @execution_interval) + end + end + self + end + + # Create and execute a new `TimerTask`. + # + # @!macro timer_task_initialize + # + # @example + # task = Concurrent::TimerTask.execute(execution_interval: 10){ print "Hello World\n" } + # task.running? #=> true + def self.execute(opts = {}, &task) + TimerTask.new(opts, &task).execute + end + + # @!attribute [rw] execution_interval + # @return [Fixnum] Number of seconds after the task completes before the + # task is performed again. + def execution_interval + synchronize { @execution_interval } + end + + # @!attribute [rw] execution_interval + # @return [Fixnum] Number of seconds after the task completes before the + # task is performed again. + def execution_interval=(value) + if (value = value.to_f) <= 0.0 + raise ArgumentError.new('must be greater than zero') + else + synchronize { @execution_interval = value } + end + end + + # @!attribute [rw] timeout_interval + # @return [Fixnum] Number of seconds the task can run before it is + # considered to have failed. + def timeout_interval + synchronize { @timeout_interval } + end + + # @!attribute [rw] timeout_interval + # @return [Fixnum] Number of seconds the task can run before it is + # considered to have failed. + def timeout_interval=(value) + if (value = value.to_f) <= 0.0 + raise ArgumentError.new('must be greater than zero') + else + synchronize { @timeout_interval = value } + end + end + + private :post, :<< + + private + + def ns_initialize(opts, &task) + set_deref_options(opts) + + self.execution_interval = opts[:execution] || opts[:execution_interval] || EXECUTION_INTERVAL + self.timeout_interval = opts[:timeout] || opts[:timeout_interval] || TIMEOUT_INTERVAL + @run_now = opts[:now] || opts[:run_now] + @executor = Concurrent::SafeTaskExecutor.new(task) + @running = Concurrent::AtomicBoolean.new(false) + + self.observers = Collection::CopyOnNotifyObserverSet.new + end + + # @!visibility private + def ns_shutdown_execution + @running.make_false + super + end + + # @!visibility private + def ns_kill_execution + @running.make_false + super + end + + # @!visibility private + def schedule_next_task(interval = execution_interval) + ScheduledTask.execute(interval, args: [Concurrent::Event.new], &method(:execute_task)) + nil + end + + # @!visibility private + def execute_task(completion) + return nil unless @running.true? + ScheduledTask.execute(execution_interval, args: [completion], &method(:timeout_task)) + _success, value, reason = @executor.execute(self) + if completion.try? + self.value = value + schedule_next_task + time = Time.now + observers.notify_observers do + [time, self.value, reason] + end + end + nil + end + + # @!visibility private + def timeout_task(completion) + return unless @running.true? + if completion.try? + self.value = value + schedule_next_task + observers.notify_observers(Time.now, nil, Concurrent::TimeoutError.new) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/tuple.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/tuple.rb new file mode 100644 index 0000000..04e6aba --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/tuple.rb @@ -0,0 +1,86 @@ +require 'concurrent/atomic/atomic_reference' + +module Concurrent + + # A fixed size array with volatile (synchronized, thread safe) getters/setters. + # Mixes in Ruby's `Enumerable` module for enhanced search, sort, and traversal. + # + # @example + # tuple = Concurrent::Tuple.new(16) + # + # tuple.set(0, :foo) #=> :foo | volatile write + # tuple.get(0) #=> :foo | volatile read + # tuple.compare_and_set(0, :foo, :bar) #=> true | strong CAS + # tuple.cas(0, :foo, :baz) #=> false | strong CAS + # tuple.get(0) #=> :bar | volatile read + # + # @see https://en.wikipedia.org/wiki/Tuple Tuple entry at Wikipedia + # @see http://www.erlang.org/doc/reference_manual/data_types.html#id70396 Erlang Tuple + # @see http://ruby-doc.org/core-2.2.2/Enumerable.html Enumerable + class Tuple + include Enumerable + + # The (fixed) size of the tuple. + attr_reader :size + + # @!visibility private + Tuple = defined?(Rubinius::Tuple) ? Rubinius::Tuple : Array + private_constant :Tuple + + # Create a new tuple of the given size. + # + # @param [Integer] size the number of elements in the tuple + def initialize(size) + @size = size + @tuple = tuple = Tuple.new(size) + i = 0 + while i < size + tuple[i] = Concurrent::AtomicReference.new + i += 1 + end + end + + # Get the value of the element at the given index. + # + # @param [Integer] i the index from which to retrieve the value + # @return [Object] the value at the given index or nil if the index is out of bounds + def get(i) + return nil if i >= @size || i < 0 + @tuple[i].get + end + alias_method :volatile_get, :get + + # Set the element at the given index to the given value + # + # @param [Integer] i the index for the element to set + # @param [Object] value the value to set at the given index + # + # @return [Object] the new value of the element at the given index or nil if the index is out of bounds + def set(i, value) + return nil if i >= @size || i < 0 + @tuple[i].set(value) + end + alias_method :volatile_set, :set + + # Set the value at the given index to the new value if and only if the current + # value matches the given old value. + # + # @param [Integer] i the index for the element to set + # @param [Object] old_value the value to compare against the current value + # @param [Object] new_value the value to set at the given index + # + # @return [Boolean] true if the value at the given element was set else false + def compare_and_set(i, old_value, new_value) + return false if i >= @size || i < 0 + @tuple[i].compare_and_set(old_value, new_value) + end + alias_method :cas, :compare_and_set + + # Calls the given block once for each element in self, passing that element as a parameter. + # + # @yieldparam [Object] ref the `Concurrent::AtomicReference` object at the current index + def each + @tuple.each {|ref| yield ref.get} + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/tvar.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/tvar.rb new file mode 100644 index 0000000..5e3b8c1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/tvar.rb @@ -0,0 +1,258 @@ +require 'set' +require 'concurrent/synchronization' + +module Concurrent + + # A `TVar` is a transactional variable - a single-element container that + # is used as part of a transaction - see `Concurrent::atomically`. + # + # @!macro thread_safe_variable_comparison + # + # {include:file:doc/tvar.md} + class TVar < Synchronization::Object + safe_initialization! + + # Create a new `TVar` with an initial value. + def initialize(value) + @value = value + @version = 0 + @lock = Mutex.new + end + + # Get the value of a `TVar`. + def value + Concurrent::atomically do + Transaction::current.read(self) + end + end + + # Set the value of a `TVar`. + def value=(value) + Concurrent::atomically do + Transaction::current.write(self, value) + end + end + + # @!visibility private + def unsafe_value # :nodoc: + @value + end + + # @!visibility private + def unsafe_value=(value) # :nodoc: + @value = value + end + + # @!visibility private + def unsafe_version # :nodoc: + @version + end + + # @!visibility private + def unsafe_increment_version # :nodoc: + @version += 1 + end + + # @!visibility private + def unsafe_lock # :nodoc: + @lock + end + + end + + # Run a block that reads and writes `TVar`s as a single atomic transaction. + # With respect to the value of `TVar` objects, the transaction is atomic, in + # that it either happens or it does not, consistent, in that the `TVar` + # objects involved will never enter an illegal state, and isolated, in that + # transactions never interfere with each other. You may recognise these + # properties from database transactions. + # + # There are some very important and unusual semantics that you must be aware of: + # + # * Most importantly, the block that you pass to atomically may be executed + # more than once. In most cases your code should be free of + # side-effects, except for via TVar. + # + # * If an exception escapes an atomically block it will abort the transaction. + # + # * It is undefined behaviour to use callcc or Fiber with atomically. + # + # * If you create a new thread within an atomically, it will not be part of + # the transaction. Creating a thread counts as a side-effect. + # + # Transactions within transactions are flattened to a single transaction. + # + # @example + # a = new TVar(100_000) + # b = new TVar(100) + # + # Concurrent::atomically do + # a.value -= 10 + # b.value += 10 + # end + def atomically + raise ArgumentError.new('no block given') unless block_given? + + # Get the current transaction + + transaction = Transaction::current + + # Are we not already in a transaction (not nested)? + + if transaction.nil? + # New transaction + + begin + # Retry loop + + loop do + + # Create a new transaction + + transaction = Transaction.new + Transaction::current = transaction + + # Run the block, aborting on exceptions + + begin + result = yield + rescue Transaction::AbortError => e + transaction.abort + result = Transaction::ABORTED + rescue Transaction::LeaveError => e + transaction.abort + break result + rescue => e + transaction.abort + raise e + end + # If we can commit, break out of the loop + + if result != Transaction::ABORTED + if transaction.commit + break result + end + end + end + ensure + # Clear the current transaction + + Transaction::current = nil + end + else + # Nested transaction - flatten it and just run the block + + yield + end + end + + # Abort a currently running transaction - see `Concurrent::atomically`. + def abort_transaction + raise Transaction::AbortError.new + end + + # Leave a transaction without committing or aborting - see `Concurrent::atomically`. + def leave_transaction + raise Transaction::LeaveError.new + end + + module_function :atomically, :abort_transaction, :leave_transaction + + private + + class Transaction + + ABORTED = Object.new + + ReadLogEntry = Struct.new(:tvar, :version) + + AbortError = Class.new(StandardError) + LeaveError = Class.new(StandardError) + + def initialize + @read_log = [] + @write_log = {} + end + + def read(tvar) + Concurrent::abort_transaction unless valid? + + if @write_log.has_key? tvar + @write_log[tvar] + else + @read_log.push(ReadLogEntry.new(tvar, tvar.unsafe_version)) + tvar.unsafe_value + end + end + + def write(tvar, value) + # Have we already written to this TVar? + + unless @write_log.has_key? tvar + # Try to lock the TVar + + unless tvar.unsafe_lock.try_lock + # Someone else is writing to this TVar - abort + Concurrent::abort_transaction + end + + # If we previously wrote to it, check the version hasn't changed + + @read_log.each do |log_entry| + if log_entry.tvar == tvar and tvar.unsafe_version > log_entry.version + Concurrent::abort_transaction + end + end + end + + # Record the value written + + @write_log[tvar] = value + end + + def abort + unlock + end + + def commit + return false unless valid? + + @write_log.each_pair do |tvar, value| + tvar.unsafe_value = value + tvar.unsafe_increment_version + end + + unlock + + true + end + + def valid? + @read_log.each do |log_entry| + unless @write_log.has_key? log_entry.tvar + if log_entry.tvar.unsafe_version > log_entry.version + return false + end + end + end + + true + end + + def unlock + @write_log.each_key do |tvar| + tvar.unsafe_lock.unlock + end + end + + def self.current + Thread.current[:current_tvar_transaction] + end + + def self.current=(transaction) + Thread.current[:current_tvar_transaction] = transaction + end + + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/at_exit.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/at_exit.rb new file mode 100644 index 0000000..a4cc508 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/at_exit.rb @@ -0,0 +1,97 @@ +require 'logger' +require 'concurrent/synchronization' + +module Concurrent + + # Provides ability to add and remove handlers to be run at `Kernel#at_exit`, order is undefined. + # Each handler is executed at most once. + # + # @!visibility private + class AtExitImplementation < Synchronization::LockableObject + include Logger::Severity + + def initialize(*args) + super() + synchronize { ns_initialize(*args) } + end + + # Add a handler to be run at `Kernel#at_exit` + # @param [Object] handler_id optionally provide an id, if allready present, handler is replaced + # @yield the handler + # @return id of the handler + def add(handler_id = nil, &handler) + id = handler_id || handler.object_id + synchronize { @handlers[id] = handler } + id + end + + # Delete a handler by handler_id + # @return [true, false] + def delete(handler_id) + !!synchronize { @handlers.delete handler_id } + end + + # Is handler with handler_id rpesent? + # @return [true, false] + def handler?(handler_id) + synchronize { @handlers.key? handler_id } + end + + # @return copy of the handlers + def handlers + synchronize { @handlers }.clone + end + + # install `Kernel#at_exit` callback to execute added handlers + def install + synchronize do + @installed ||= begin + at_exit { runner } + true + end + self + end + end + + # Will it run during `Kernel#at_exit` + def enabled? + synchronize { @enabled } + end + + # Configure if it runs during `Kernel#at_exit` + def enabled=(value) + synchronize { @enabled = value } + end + + # run the handlers manually + # @return ids of the handlers + def run + handlers, _ = synchronize { handlers, @handlers = @handlers, {} } + handlers.each do |_, handler| + begin + handler.call + rescue => error + Concurrent.global_logger.call(ERROR, error) + end + end + handlers.keys + end + + private + + def ns_initialize(enabled = true) + @handlers = {} + @enabled = enabled + end + + def runner + run if synchronize { @enabled } + end + end + + private_constant :AtExitImplementation + + # @see AtExitImplementation + # @!visibility private + AtExit = AtExitImplementation.new.install +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/engine.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/engine.rb new file mode 100644 index 0000000..a83f9fa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/engine.rb @@ -0,0 +1,56 @@ +module Concurrent + module Utility + + # @!visibility private + module EngineDetector + def on_jruby? + ruby_engine == 'jruby' + end + + def on_jruby_9000? + on_jruby? && ruby_version(:>=, 9, 0, 0, JRUBY_VERSION) + end + + def on_cruby? + ruby_engine == 'ruby' + end + + def on_rbx? + ruby_engine == 'rbx' + end + + def on_truffle? + ruby_engine == 'jruby+truffle' + end + + def on_windows? + !(RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/).nil? + end + + def on_osx? + !(RbConfig::CONFIG['host_os'] =~ /darwin|mac os/).nil? + end + + def on_linux? + !(RbConfig::CONFIG['host_os'] =~ /linux/).nil? + end + + def ruby_engine + defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby' + end + + def ruby_version(comparison, major, minor, patch, version = RUBY_VERSION) + result = (version.split('.').map(&:to_i) <=> [major, minor, patch]) + comparisons = { :== => [0], + :>= => [1, 0], + :<= => [-1, 0], + :> => [1], + :< => [-1] } + comparisons.fetch(comparison).include? result + end + end + end + + # @!visibility private + extend Utility::EngineDetector +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/monotonic_time.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/monotonic_time.rb new file mode 100644 index 0000000..8e40d69 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/monotonic_time.rb @@ -0,0 +1,58 @@ +require 'concurrent/synchronization' + +module Concurrent + + class_definition = Class.new(Synchronization::LockableObject) do + def initialize + @last_time = Time.now.to_f + super() + end + + if defined?(Process::CLOCK_MONOTONIC) + # @!visibility private + def get_time + Process.clock_gettime(Process::CLOCK_MONOTONIC) + end + elsif Concurrent.on_jruby? + # @!visibility private + def get_time + java.lang.System.nanoTime() / 1_000_000_000.0 + end + else + + # @!visibility private + def get_time + synchronize do + now = Time.now.to_f + if @last_time < now + @last_time = now + else # clock has moved back in time + @last_time += 0.000_001 + end + end + end + + end + end + + # Clock that cannot be set and represents monotonic time since + # some unspecified starting point. + # + # @!visibility private + GLOBAL_MONOTONIC_CLOCK = class_definition.new + private_constant :GLOBAL_MONOTONIC_CLOCK + + # @!macro [attach] monotonic_get_time + # + # Returns the current time a tracked by the application monotonic clock. + # + # @return [Float] The current monotonic time when `since` not given else + # the elapsed monotonic time between `since` and the current time + # + # @!macro monotonic_clock_warning + def monotonic_time + GLOBAL_MONOTONIC_CLOCK.get_time + end + + module_function :monotonic_time +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/native_extension_loader.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/native_extension_loader.rb new file mode 100644 index 0000000..f2fcd8c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/native_extension_loader.rb @@ -0,0 +1,73 @@ +require 'concurrent/utility/engine' + +module Concurrent + + module Utility + + # @!visibility private + module NativeExtensionLoader + + def allow_c_extensions? + Concurrent.on_cruby? + end + + def c_extensions_loaded? + @c_extensions_loaded ||= false + end + + def java_extensions_loaded? + @java_extensions_loaded ||= false + end + + def set_c_extensions_loaded + @c_extensions_loaded = true + end + + def set_java_extensions_loaded + @java_extensions_loaded = true + end + + def load_native_extensions + unless defined? Synchronization::AbstractObject + raise 'native_extension_loader loaded before Synchronization::AbstractObject' + end + + if Concurrent.on_cruby? && !c_extensions_loaded? + tries = [ + lambda do + require 'concurrent/extension' + set_c_extensions_loaded + end, + lambda do + # may be a Windows cross-compiled native gem + require "concurrent/#{RUBY_VERSION[0..2]}/extension" + set_c_extensions_loaded + end] + + tries.each do |try| + begin + try.call + break + rescue LoadError + next + end + end + end + + if Concurrent.on_jruby? && !java_extensions_loaded? + begin + require 'concurrent_ruby_ext' + set_java_extensions_loaded + rescue LoadError + # move on with pure-Ruby implementations + raise 'On JRuby but Java extensions failed to load.' + end + end + end + end + end + + # @!visibility private + extend Utility::NativeExtensionLoader +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/native_integer.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/native_integer.rb new file mode 100644 index 0000000..10719e7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/native_integer.rb @@ -0,0 +1,53 @@ +module Concurrent + module Utility + # @private + module NativeInteger + # http://stackoverflow.com/questions/535721/ruby-max-integer + MIN_VALUE = -(2**(0.size * 8 - 2)) + MAX_VALUE = (2**(0.size * 8 - 2) - 1) + + def ensure_upper_bound(value) + if value > MAX_VALUE + raise RangeError.new("#{value} is greater than the maximum value of #{MAX_VALUE}") + end + value + end + + def ensure_lower_bound(value) + if value < MIN_VALUE + raise RangeError.new("#{value} is less than the maximum value of #{MIN_VALUE}") + end + value + end + + def ensure_integer(value) + unless value.is_a?(Integer) + raise ArgumentError.new("#{value} is not an Integer") + end + value + end + + def ensure_integer_and_bounds(value) + ensure_integer value + ensure_upper_bound value + ensure_lower_bound value + end + + def ensure_positive(value) + if value < 0 + raise ArgumentError.new("#{value} cannot be negative") + end + value + end + + def ensure_positive_and_no_zero(value) + if value < 1 + raise ArgumentError.new("#{value} cannot be negative or zero") + end + value + end + + extend self + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/processor_counter.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/processor_counter.rb new file mode 100644 index 0000000..078bdf4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/utility/processor_counter.rb @@ -0,0 +1,160 @@ +require 'rbconfig' +require 'concurrent/delay' + +module Concurrent + module Utility + + # @!visibility private + class ProcessorCounter + def initialize + @processor_count = Delay.new { compute_processor_count } + @physical_processor_count = Delay.new { compute_physical_processor_count } + end + + # Number of processors seen by the OS and used for process scheduling. For + # performance reasons the calculated value will be memoized on the first + # call. + # + # When running under JRuby the Java runtime call + # `java.lang.Runtime.getRuntime.availableProcessors` will be used. According + # to the Java documentation this "value may change during a particular + # invocation of the virtual machine... [applications] should therefore + # occasionally poll this property." Subsequently the result will NOT be + # memoized under JRuby. + # + # On Windows the Win32 API will be queried for the + # `NumberOfLogicalProcessors from Win32_Processor`. This will return the + # total number "logical processors for the current instance of the + # processor", which taked into account hyperthreading. + # + # * AIX: /usr/sbin/pmcycles (AIX 5+), /usr/sbin/lsdev + # * Alpha: /usr/bin/nproc (/proc/cpuinfo exists but cannot be used) + # * BSD: /sbin/sysctl + # * Cygwin: /proc/cpuinfo + # * Darwin: /usr/bin/hwprefs, /usr/sbin/sysctl + # * HP-UX: /usr/sbin/ioscan + # * IRIX: /usr/sbin/sysconf + # * Linux: /proc/cpuinfo + # * Minix 3+: /proc/cpuinfo + # * Solaris: /usr/sbin/psrinfo + # * Tru64 UNIX: /usr/sbin/psrinfo + # * UnixWare: /usr/sbin/psrinfo + # + # @return [Integer] number of processors seen by the OS or Java runtime + # + # @see https://github.com/grosser/parallel/blob/4fc8b89d08c7091fe0419ca8fba1ec3ce5a8d185/lib/parallel.rb + # + # @see http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#availableProcessors() + # @see http://msdn.microsoft.com/en-us/library/aa394373(v=vs.85).aspx + def processor_count + @processor_count.value + end + + # Number of physical processor cores on the current system. For performance + # reasons the calculated value will be memoized on the first call. + # + # On Windows the Win32 API will be queried for the `NumberOfCores from + # Win32_Processor`. This will return the total number "of cores for the + # current instance of the processor." On Unix-like operating systems either + # the `hwprefs` or `sysctl` utility will be called in a subshell and the + # returned value will be used. In the rare case where none of these methods + # work or an exception is raised the function will simply return 1. + # + # @return [Integer] number physical processor cores on the current system + # + # @see https://github.com/grosser/parallel/blob/4fc8b89d08c7091fe0419ca8fba1ec3ce5a8d185/lib/parallel.rb + # + # @see http://msdn.microsoft.com/en-us/library/aa394373(v=vs.85).aspx + # @see http://www.unix.com/man-page/osx/1/HWPREFS/ + # @see http://linux.die.net/man/8/sysctl + def physical_processor_count + @physical_processor_count.value + end + + private + + def compute_processor_count + if Concurrent.on_jruby? + java.lang.Runtime.getRuntime.availableProcessors + elsif Concurrent.on_truffle? + Truffle::Primitive.logical_processors + else + os_name = RbConfig::CONFIG["target_os"] + if os_name =~ /mingw|mswin/ + require 'win32ole' + result = WIN32OLE.connect("winmgmts://").ExecQuery( + "select NumberOfLogicalProcessors from Win32_Processor") + result.to_enum.collect(&:NumberOfLogicalProcessors).reduce(:+) + elsif File.readable?("/proc/cpuinfo") && (cpuinfo_count = IO.read("/proc/cpuinfo").scan(/^processor/).size) > 0 + cpuinfo_count + elsif File.executable?("/usr/bin/nproc") + IO.popen("/usr/bin/nproc --all", &:read).to_i + elsif File.executable?("/usr/bin/hwprefs") + IO.popen("/usr/bin/hwprefs thread_count", &:read).to_i + elsif File.executable?("/usr/sbin/psrinfo") + IO.popen("/usr/sbin/psrinfo", &:read).scan(/^.*on-*line/).size + elsif File.executable?("/usr/sbin/ioscan") + IO.popen("/usr/sbin/ioscan -kC processor", &:read).scan(/^.*processor/).size + elsif File.executable?("/usr/sbin/pmcycles") + IO.popen("/usr/sbin/pmcycles -m", &:read).count("\n") + elsif File.executable?("/usr/sbin/lsdev") + IO.popen("/usr/sbin/lsdev -Cc processor -S 1", &:read).count("\n") + elsif File.executable?("/usr/sbin/sysconf") and os_name =~ /irix/i + IO.popen("/usr/sbin/sysconf NPROC_ONLN", &:read).to_i + elsif File.executable?("/usr/sbin/sysctl") + IO.popen("/usr/sbin/sysctl -n hw.ncpu", &:read).to_i + elsif File.executable?("/sbin/sysctl") + IO.popen("/sbin/sysctl -n hw.ncpu", &:read).to_i + else + # TODO (pitr-ch 05-Nov-2016): warn about failures + 1 + end + end + rescue + return 1 + end + + def compute_physical_processor_count + ppc = case RbConfig::CONFIG["target_os"] + when /darwin1/ + IO.popen("/usr/sbin/sysctl -n hw.physicalcpu", &:read).to_i + when /linux/ + cores = {} # unique physical ID / core ID combinations + phy = 0 + IO.read("/proc/cpuinfo").scan(/^physical id.*|^core id.*/) do |ln| + if ln.start_with?("physical") + phy = ln[/\d+/] + elsif ln.start_with?("core") + cid = phy + ":" + ln[/\d+/] + cores[cid] = true if not cores[cid] + end + end + cores.count + when /mswin|mingw/ + require 'win32ole' + result_set = WIN32OLE.connect("winmgmts://").ExecQuery( + "select NumberOfCores from Win32_Processor") + result_set.to_enum.collect(&:NumberOfCores).reduce(:+) + else + processor_count + end + # fall back to logical count if physical info is invalid + ppc > 0 ? ppc : processor_count + rescue + return 1 + end + end + end + + # create the default ProcessorCounter on load + @processor_counter = Utility::ProcessorCounter.new + singleton_class.send :attr_reader, :processor_counter + + def self.processor_count + processor_counter.processor_count + end + + def self.physical_processor_count + processor_counter.physical_processor_count + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/version.rb b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/version.rb new file mode 100644 index 0000000..601a7b2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/version.rb @@ -0,0 +1,4 @@ +module Concurrent + VERSION = '1.0.5' + EDGE_VERSION = '0.3.1' +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/.gitignore b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/.gitignore new file mode 100644 index 0000000..616915c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/.gitignore @@ -0,0 +1,3 @@ +*.gemspec +pkg +Gemfile.lock diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/CHANGELOG.rdoc b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/CHANGELOG.rdoc new file mode 100644 index 0000000..f7dd9fb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/CHANGELOG.rdoc @@ -0,0 +1,149 @@ += Changelog + +== 0.5.1 / 2014-04-23 + +- new features: + - Support for receiving binary messages + +- changed: + - Allow additional close codes to be sent by apps + - Raise better errors on missing Sec-WebSocket-Key2 + - Updated http_parser.rb dependency to 0.6.0 + +- bug fixes: + - Abort if HTTP request URI is invalid + - Force close connections that have been sent a close handshake after a timeout + +- improved spec compliance on: + - Missing continuation frames + - Fragmented control frames + - Close behaviour after protocol errors + +== 0.5.0 / 2013-03-05 + +- new features: + - onclose handler is now passed a hash containing was_clean (set to true in drafts 03 and above when a connection is closed with a closing handshake, either by the server or the client), the close code, and reason (drafts 06 and above). Close code 1005 indicates that no code was supplied, and 1006 that the connection was closed abnormally. + - use Connection#support_close_codes? to easily check whether close codes are supported by the WebSocket protocol (drafts 06 and above) + - closes connection with 1007 close code if text frame contains invalid UTF8 + - added Handshake#secure? for checking whether the connection is secure (either ssl or behind an ssl proxy) + +- changed: + - Defaults to sending no close code rather than 1000 (consistent with browsers) + - Allows sending a 3xxx close code + - Renamed Connection#close_websocket to Connection#close (again for consistency with browsers). Old method is available till 0.6. + - Sends reasons with internally generated closure (previously only sent code) + - Echos close code when replying to close handshake + +== 0.4.0 / 2013-01-22 + +- new features: + - on_open handler is now passed a handshake object which exposes the request headers, path, and query parameters + - Easily access the protocol version via Handshake#protocol_version + - Easily access the origin via Handshake#origin + +- changed: + - Removed Connection#request - change to using handshake passed to on_open + +- internals: + - Uses the http_parser.rb gem + +== 0.3.8 / 2012-07-12 + +- bug fixes: + - Fixed support for Ruby 1.8.7 which was broken in 0.3.7 + +== 0.3.7 / 2012-07-11 + +- new features: + - Supports sending 1009 error code when incoming frame is too large to handle, and added associated exception class WSMessageTooBigError [Martyn Loughran] + - Supports overriding the maximum frame size by setting the max_frame_size accessor on the connection object (in bytes). Default unchanged at 10MB. [Martyn Loughran] + +- bug fixes: + - Fixes some encoding issues on Ruby 1.9 [Dingding Ye] + - Raises a HandshakeError if WS header is empty [Markus Fenske] + - Connection#send would mutate passed string to BINARY encoding. The fix still mutates the string by forcing the encoding back to UTF-8 before returning, but if the passed string was encoded as UTF-8 this is equivalent [Martyn Loughran] + +== 0.3.6 / 2011-12-23 + +- new features: + - Supports sending ping & pong messages + - Supports binding to received ping & pong messages + +== 0.3.5 / 2011-10-24 + +- new features: + - Support WebSocket draft 13 + +== 0.3.2 / 2011-10-09 + +- bugfixes: + - Handling of messages with > 2 frames + - Encode string passed to onmessage handler as UTF-8 on Ruby 1.9 + - Add 10MB frame length limit to all draft versions + +== 0.3.1 / 2011-07-28 + +- new features: + - Support WebSocket drafts 07 & 08 + +== 0.3.0 / 2011-05-06 + +- new features: + - Support WebSocket drafts 05 & 06 +- changes: + - Accept request headers in a case insensitive manner + - Change handling of errors. Previously some application errors were caught + internally and were invisible unless an onerror callback was supplied. See + readme for details + +== 0.2.1 / 2011-03-01 + +- bugfixes: + - Performance improvements to draft 76 framing + - Limit frame lengths for draft 76 + - Better error handling for draft 76 handshake + - Ruby 1.9 support + +== 0.2.0 / 2010-11-23 + +- new features: + - Support for WebSocket draft 03 +- bugfixes: + - Handle case when handshake split into two receive_data calls + - Stricter regexp matching of frames + +== 0.1.4 / 2010-08-23 + +- new features: + - Allow custom ssl certificate to be used by passing :tls_options + - Protect against errors caused by non limited frame lengths + - Use custom exceptions rather than RuntimeError +- bugfixes: + - Handle invalid HTTP request with HandshakeError + +== 0.1.3 / 2010-07-18 + +- new features: + - onerror callback +- bugfixes: + - proper handling of zero spaces in key1 or key2(prevent ZeroDivisionError) + - convert received data to utf-8 to prevent ruby 1.9 errors + - fix handling of null bytes within a frame + +== 0.1.2 / 2010-06-16 + +- new features: + - none +- bugfixes: + - allow $ character inside header key + +== 0.1.1 / 2010-06-13 + +- new features: + - wss/ssl support +- bugfixes: + - can't & strings + +== 0.1.0 / 2010-06-12 + +- initial release \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/Gemfile b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/Gemfile new file mode 100644 index 0000000..bd789f6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/Gemfile @@ -0,0 +1,9 @@ +source "http://rubygems.org" + +gemspec + +gem "em-websocket-client", git: "git@github.com:movitto/em-websocket-client.git", branch: "expose-websocket-api" +gem "em-spec", "~> 0.2.6" +gem "em-http-request", "~> 1.1.1" +gem "rspec", "~> 2.12.0" +gem "rake" diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/README.md b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/README.md new file mode 100644 index 0000000..19d5db8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/README.md @@ -0,0 +1,146 @@ +# EM-WebSocket + +[![Gem Version](https://badge.fury.io/rb/em-websocket.png)](http://rubygems.org/gems/em-websocket) +[![Analytics](https://ga-beacon.appspot.com/UA-71196-10/em-websocket/readme)](https://github.com/igrigorik/ga-beacon) + +EventMachine based, async, Ruby WebSocket server. Take a look at examples directory, or check out the blog post: [Ruby & Websockets: TCP for the Web](http://www.igvita.com/2009/12/22/ruby-websockets-tcp-for-the-browser/). + +## Simple server example + +```ruby +require 'em-websocket' + +EM.run { + EM::WebSocket.run(:host => "0.0.0.0", :port => 8080) do |ws| + ws.onopen { |handshake| + puts "WebSocket connection open" + + # Access properties on the EM::WebSocket::Handshake object, e.g. + # path, query_string, origin, headers + + # Publish message to the client + ws.send "Hello Client, you connected to #{handshake.path}" + } + + ws.onclose { puts "Connection closed" } + + ws.onmessage { |msg| + puts "Recieved message: #{msg}" + ws.send "Pong: #{msg}" + } + end +} +``` + +## Protocols supported, and protocol specific functionality + +Supports all WebSocket protocols in use in the wild (and a few that are not): drafts 75, 76, 1-17, rfc. + +While some of the changes between protocols are unimportant from the point of view of application developers, a few drafts did introduce new functionality. It's possible to easily test for this functionality by using + +### Ping & pong supported + +Call `ws.pingable?` to check whether ping & pong is supported by the protocol in use. + +It's possible to send a ping frame (`ws.ping(body = '')`), which the client must respond to with a pong, or the server can send an unsolicited pong frame (`ws.pong(body = '')`) which the client should not respond to. These methods can be used regardless of protocol version; they return true if the protocol supports ping&pong or false otherwise. + +When receiving a ping, the server will automatically respond with a pong as the spec requires (so you should _not_ write an onping handler that replies with a pong), however it is possible to bind to ping & pong events if desired by using the `onping` and `onpong` methods. + +### Close codes and reasons + +A WebSocket connection can be closed cleanly, regardless of protocol, by calling `ws.close(code = nil, body = nil)`. + +Early protocols just close the TCP connection, draft 3 introduced a close handshake, and draft 6 added close codes and reasons to the close handshake. Call `ws.supports_close_codes?` to check whether close codes are supported (i.e. the protocol version is 6 or above). + +The `onclose` callback is passed a hash which may contain following keys (depending on the protocol version): + +* `was_clean`: boolean indicating whether the connection was closed via the close handshake. +* `code`: the close code. There are two special close codes which the server may set (as defined in the WebSocket spec): + * 1005: no code was supplied + * 1006: abnormal closure (the same as `was_clean: false`) +* `reason`: the close reason + +Acceptable close codes are defined in the WebSocket rfc (). The following codes can be supplies when calling `ws.close(code)`: + +* 1000: a generic normal close +* range 3xxx: reserved for libraries, frameworks, and applications (and can be registered with IANA) +* range 4xxx: for private use + +If unsure use a code in the 4xxx range. em-websocket may also close a connection with one of the following close codes: + +* 1002: WebSocket protocol error. +* 1009: Message too big to process. By default em-websocket will accept frames up to 10MB in size. If a frame is larger than this the connection will be closed without reading the frame data. The limit can be overriden globally (`EM::WebSocket.max_frame_size = bytes`) or on a specific connection (`ws.max_frame_size = bytes`). + +## Secure server + +It is possible to accept secure `wss://` connections by passing `:secure => true` when opening the connection. Pass a `:tls_options` hash containing keys as described in http://eventmachine.rubyforge.org/EventMachine/Connection.html#start_tls-instance_method + +**Warning**: Safari 5 does not currently support prompting on untrusted SSL certificates therefore using a self signed certificate may leave you scratching your head. + +```ruby +EM::WebSocket.start({ + :host => "0.0.0.0", + :port => 443, + :secure => true, + :tls_options => { + :private_key_file => "/private/key", + :cert_chain_file => "/ssl/certificate" + } +}) do |ws| + # ... +end +``` + +It's possible to check whether an incoming connection is secure by reading `handshake.secure?` in the onopen callback. + +## Running behind an SSL Proxy/Terminator, like Stunnel + +The `:secure_proxy => true` option makes it possible to use em-websocket behind a secure SSL proxy/terminator like [Stunnel](http://www.stunnel.org/) which does the actual encryption & decryption. + +Note that this option is only required to support drafts 75 & 76 correctly (e.g. Safari 5.1.x & earlier, and Safari on iOS 5.x & earlier). + +```ruby +EM::WebSocket.start({ + :host => "0.0.0.0", + :port => 8080, + :secure_proxy => true +}) do |ws| + # ... +end +``` + +## Handling errors + +There are two kinds of errors that need to be handled -- WebSocket protocol errors and errors in application code. + +WebSocket protocol errors (for example invalid data in the handshake or invalid message frames) raise errors which descend from `EM::WebSocket::WebSocketError`. Such errors are rescued internally and the WebSocket connection will be closed immediately or an error code sent to the browser in accordance to the WebSocket specification. It is possible to be notified in application code of such errors by including an `onerror` callback. + +```ruby +ws.onerror { |error| + if error.kind_of?(EM::WebSocket::WebSocketError) + # ... + end +} +``` + +Application errors are treated differently. If no `onerror` callback has been defined these errors will propagate to the EventMachine reactor, typically causing your program to terminate. If you wish to handle exceptions, simply supply an `onerror callback` and check for exceptions which are not descendant from `EM::WebSocket::WebSocketError`. + +It is also possible to log all errors when developing by including the `:debug => true` option when initialising the WebSocket server. + +## Emulating WebSockets in older browsers + +It is possible to emulate WebSockets in older browsers using flash emulation. For example take a look at the [web-socket-js](https://github.com/gimite/web-socket-js) project. + +Using flash emulation does require some minimal support from em-websocket which is enabled by default. If flash connects to the WebSocket port and requests a policy file (which it will do if it fails to receive a policy file on port 843 after a timeout), em-websocket will return one. Also see for an example policy file server which you can run on port 843. + +## Examples & Projects using em-websocket + +* [Pusher](http://pusher.com) - Realtime Messaging Service +* [Livereload](https://github.com/mockko/livereload) - LiveReload applies CSS/JS changes to Safari or Chrome w/o reloading +* [Twitter AMQP WebSocket Example](http://github.com/rubenfonseca/twitter-amqp-websocket-example) +* examples/multicast.rb - broadcast all ruby tweets to all subscribers +* examples/echo.rb - server <> client exchange via a websocket + +# License + +The MIT License - Copyright (c) 2009-2013 Ilya Grigorik, Martyn Loughran diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/Rakefile b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/Rakefile new file mode 100644 index 0000000..0bd2718 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/Rakefile @@ -0,0 +1,11 @@ +require 'bundler' +Bundler::GemHelper.install_tasks + +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new do |t| + t.rspec_opts = ["-c", "-f progress", "-r ./spec/helper.rb"] + t.pattern = 'spec/**/*_spec.rb' +end + +task :default => :spec diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/echo.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/echo.rb new file mode 100644 index 0000000..4e64886 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/echo.rb @@ -0,0 +1,24 @@ +require File.expand_path('../../lib/em-websocket', __FILE__) + +EM.run { + EM::WebSocket.run(:host => "0.0.0.0", :port => 8080, :debug => false) do |ws| + ws.onopen { |handshake| + puts "WebSocket opened #{{ + :path => handshake.path, + :query => handshake.query, + :origin => handshake.origin, + }}" + + ws.send "Hello Client!" + } + ws.onmessage { |msg| + ws.send "Pong: #{msg}" + } + ws.onclose { + puts "WebSocket closed" + } + ws.onerror { |e| + puts "Error: #{e.message}" + } + end +} diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/multicast.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/multicast.rb new file mode 100644 index 0000000..b1692d5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/multicast.rb @@ -0,0 +1,47 @@ +require 'em-websocket' +# requires the twitter-stream gem +require 'twitter/json_stream' +require 'json' + +# +# broadcast all ruby related tweets to all connected users! +# + +username = ARGV.shift +password = ARGV.shift +raise "need username and password" if !username or !password + +EventMachine.run { + @channel = EM::Channel.new + + @twitter = Twitter::JSONStream.connect( + :path => '/1/statuses/filter.json?track=ruby', + :auth => "#{username}:#{password}", + :ssl => true + ) + + @twitter.each_item do |status| + status = JSON.parse(status) + @channel.push "#{status['user']['screen_name']}: #{status['text']}" + end + + + EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080, :debug => true) do |ws| + + ws.onopen { + sid = @channel.subscribe { |msg| ws.send msg } + @channel.push "#{sid} connected!" + + ws.onmessage { |msg| + @channel.push "<#{sid}>: #{msg}" + } + + ws.onclose { + @channel.unsubscribe(sid) + } + } + + end + + puts "Server started" +} diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/ping.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/ping.rb new file mode 100644 index 0000000..fe569c3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/ping.rb @@ -0,0 +1,24 @@ +require File.expand_path('../../lib/em-websocket', __FILE__) + +EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080, :debug => false) do |ws| + timer = nil + ws.onopen { + puts "Ping supported: #{ws.pingable?}" + timer = EM.add_periodic_timer(1) { + p ["Sent ping", ws.ping('hello')] + } + } + ws.onpong { |value| + puts "Received pong: #{value}" + } + ws.onping { |value| + puts "Received ping: #{value}" + } + ws.onclose { + EM.cancel_timer(timer) + puts "WebSocket closed" + } + ws.onerror { |e| + puts "Error: #{e.message}" + } +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/test.html b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/test.html new file mode 100644 index 0000000..07d4636 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/examples/test.html @@ -0,0 +1,29 @@ + + + + + +
+ + diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket.rb new file mode 100644 index 0000000..3eaa105 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket.rb @@ -0,0 +1,24 @@ +$:.unshift(File.dirname(__FILE__) + '/../lib') + +require "eventmachine" + +%w[ + debugger websocket connection + handshake + handshake75 handshake76 handshake04 + framing76 framing03 framing04 framing05 framing07 + close75 close03 close05 close06 + masking04 + message_processor_03 message_processor_06 + handler handler75 handler76 handler03 handler05 handler06 handler07 handler08 handler13 +].each do |file| + require "em-websocket/#{file}" +end + +unless ''.respond_to?(:getbyte) + class String + def getbyte(i) + self[i] + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close03.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close03.rb new file mode 100644 index 0000000..8981776 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close03.rb @@ -0,0 +1,14 @@ +module EventMachine + module WebSocket + module Close03 + def close_websocket(code, body) + # TODO: Ideally send body data and check that it matches in ack + send_frame(:close, '') + @state = :closing + start_close_timeout + end + + def supports_close_codes?; false; end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close05.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close05.rb new file mode 100644 index 0000000..8f8c150 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close05.rb @@ -0,0 +1,14 @@ +module EventMachine + module WebSocket + module Close05 + def close_websocket(code, body) + # TODO: Ideally send body data and check that it matches in ack + send_frame(:close, "\x53") + @state = :closing + start_close_timeout + end + + def supports_close_codes?; false; end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close06.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close06.rb new file mode 100644 index 0000000..14cc80e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close06.rb @@ -0,0 +1,19 @@ +module EventMachine + module WebSocket + module Close06 + def close_websocket(code, body) + if code + close_data = [code].pack('n') + close_data << body if body + send_frame(:close, close_data) + else + send_frame(:close, '') + end + @state = :closing + start_close_timeout + end + + def supports_close_codes?; true; end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close75.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close75.rb new file mode 100644 index 0000000..9d6ba02 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/close75.rb @@ -0,0 +1,11 @@ +module EventMachine + module WebSocket + module Close75 + def close_websocket(code, body) + @connection.close_connection_after_writing + end + + def supports_close_codes?; false; end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/connection.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/connection.rb new file mode 100644 index 0000000..331b615 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/connection.rb @@ -0,0 +1,313 @@ +module EventMachine + module WebSocket + class Connection < EventMachine::Connection + include Debugger + + attr_writer :max_frame_size + + # define WebSocket callbacks + def onopen(&blk); @onopen = blk; end + def onclose(&blk); @onclose = blk; end + def onerror(&blk); @onerror = blk; end + def onmessage(&blk); @onmessage = blk; end + def onbinary(&blk); @onbinary = blk; end + def onping(&blk); @onping = blk; end + def onpong(&blk); @onpong = blk; end + + def trigger_on_message(msg) + @onmessage.call(msg) if defined? @onmessage + end + def trigger_on_binary(msg) + @onbinary.call(msg) if defined? @onbinary + end + def trigger_on_open(handshake) + @onopen.call(handshake) if defined? @onopen + end + def trigger_on_close(event = {}) + @onclose.call(event) if defined? @onclose + end + def trigger_on_ping(data) + @onping.call(data) if defined? @onping + end + def trigger_on_pong(data) + @onpong.call(data) if defined? @onpong + end + def trigger_on_error(reason) + return false unless defined? @onerror + @onerror.call(reason) + true + end + + def initialize(options) + @options = options + @debug = options[:debug] || false + @secure = options[:secure] || false + @secure_proxy = options[:secure_proxy] || false + @tls_options = options[:tls_options] || {} + @close_timeout = options[:close_timeout] + + @handler = nil + + debug [:initialize] + end + + # Use this method to close the websocket connection cleanly + # This sends a close frame and waits for acknowlegement before closing + # the connection + def close(code = nil, body = nil) + if code && !acceptable_close_code?(code) + raise "Application code may only use codes from 1000, 3000-4999" + end + + close_websocket_private(code, body) + end + + # Deprecated, to be removed in version 0.6 + alias :close_websocket :close + + def post_init + start_tls(@tls_options) if @secure + end + + def receive_data(data) + debug [:receive_data, data] + + if @handler + @handler.receive_data(data) + else + dispatch(data) + end + rescue => e + debug [:error, e] + + # There is no code defined for application errors, so use 3000 + # (which is reserved for frameworks) + close_websocket_private(3000, "Application error") + + # These are application errors - raise unless onerror defined + trigger_on_error(e) || raise(e) + end + + def unbind + debug [:unbind, :connection] + + @handler.unbind if @handler + rescue => e + debug [:error, e] + # These are application errors - raise unless onerror defined + trigger_on_error(e) || raise(e) + end + + def dispatch(data) + if data.match(/\A/) + send_flash_cross_domain_file + else + @handshake ||= begin + handshake = Handshake.new(@secure || @secure_proxy) + + handshake.callback { |upgrade_response, handler_klass| + debug [:accepting_ws_version, handshake.protocol_version] + debug [:upgrade_response, upgrade_response] + self.send_data(upgrade_response) + @handler = handler_klass.new(self, @debug) + @handshake = nil + trigger_on_open(handshake) + } + + handshake.errback { |e| + debug [:error, e] + trigger_on_error(e) + # Handshake errors require the connection to be aborted + abort + } + + handshake + end + + @handshake.receive_data(data) + end + end + + def send_flash_cross_domain_file + file = '' + debug [:cross_domain, file] + send_data file + + # handle the cross-domain request transparently + # no need to notify the user about this connection + @onclose = nil + close_connection_after_writing + end + + # Cache encodings since it's moderately expensive to look them up each time + ENCODING_SUPPORTED = "string".respond_to?(:force_encoding) + UTF8 = Encoding.find("UTF-8") if ENCODING_SUPPORTED + BINARY = Encoding.find("BINARY") if ENCODING_SUPPORTED + + # Send a WebSocket text frame. + # + # A WebSocketError may be raised if the connection is in an opening or a + # closing state, or if the passed in data is not valid UTF-8 + # + def send_text(data) + # If we're using Ruby 1.9, be pedantic about encodings + if ENCODING_SUPPORTED + # Also accept ascii only data in other encodings for convenience + unless (data.encoding == UTF8 && data.valid_encoding?) || data.ascii_only? + raise WebSocketError, "Data sent to WebSocket must be valid UTF-8 but was #{data.encoding} (valid: #{data.valid_encoding?})" + end + # This labels the encoding as binary so that it can be combined with + # the BINARY framing + data.force_encoding(BINARY) + else + # TODO: Check that data is valid UTF-8 + end + + if @handler + @handler.send_text_frame(data) + else + raise WebSocketError, "Cannot send data before onopen callback" + end + + # Revert data back to the original encoding (which we assume is UTF-8) + # Doing this to avoid duping the string - there may be a better way + data.force_encoding(UTF8) if ENCODING_SUPPORTED + return nil + end + + alias :send :send_text + + # Send a WebSocket binary frame. + # + def send_binary(data) + if @handler + @handler.send_frame(:binary, data) + else + raise WebSocketError, "Cannot send binary before onopen callback" + end + end + + # Send a ping to the client. The client must respond with a pong. + # + # In the case that the client is running a WebSocket draft < 01, false + # is returned since ping & pong are not supported + # + def ping(body = '') + if @handler + @handler.pingable? ? @handler.send_frame(:ping, body) && true : false + else + raise WebSocketError, "Cannot ping before onopen callback" + end + end + + # Send an unsolicited pong message, as allowed by the protocol. The + # client is not expected to respond to this message. + # + # em-websocket automatically takes care of sending pong replies to + # incoming ping messages, as the protocol demands. + # + def pong(body = '') + if @handler + @handler.pingable? ? @handler.send_frame(:pong, body) && true : false + else + raise WebSocketError, "Cannot ping before onopen callback" + end + end + + # Test whether the connection is pingable (i.e. the WebSocket draft in + # use is >= 01) + def pingable? + if @handler + @handler.pingable? + else + raise WebSocketError, "Cannot test whether pingable before onopen callback" + end + end + + def supports_close_codes? + if @handler + @handler.supports_close_codes? + else + raise WebSocketError, "Cannot test before onopen callback" + end + end + + def state + @handler ? @handler.state : :handshake + end + + # Returns the maximum frame size which this connection is configured to + # accept. This can be set globally or on a per connection basis, and + # defaults to a value of 10MB if not set. + # + # The behaviour when a too large frame is received varies by protocol, + # but in the newest protocols the connection will be closed with the + # correct close code (1009) immediately after receiving the frame header + # + def max_frame_size + defined?(@max_frame_size) ? @max_frame_size : WebSocket.max_frame_size + end + + def close_timeout + @close_timeout || WebSocket.close_timeout + end + + private + + # As definited in draft 06 7.2.2, some failures require that the server + # abort the websocket connection rather than close cleanly + def abort + close_connection + end + + def close_websocket_private(code, body) + if @handler + debug [:closing, code] + @handler.close_websocket(code, body) + else + # The handshake hasn't completed - should be safe to terminate + abort + end + end + + # Allow applications to close with 1000, 1003, 1008, 1011, 3xxx or 4xxx. + # + # em-websocket uses a few other codes internally which should not be + # used by applications + # + # Browsers generally allow connections to be closed with code 1000, + # 3xxx, and 4xxx. em-websocket allows closing with a few other codes + # which seem reasonable (for discussion see + # https://github.com/igrigorik/em-websocket/issues/98) + # + # Usage from the rfc: + # + # 1000 indicates a normal closure + # + # 1003 indicates that an endpoint is terminating the connection + # because it has received a type of data it cannot accept + # + # 1008 indicates that an endpoint is terminating the connection because + # it has received a message that violates its policy + # + # 1011 indicates that a server is terminating the connection because it + # encountered an unexpected condition that prevented it from fulfilling + # the request + # + # Status codes in the range 3000-3999 are reserved for use by libraries, + # frameworks, and applications + # + # Status codes in the range 4000-4999 are reserved for private use and + # thus can't be registered + # + def acceptable_close_code?(code) + case code + when 1000, 1003, 1008, 1011, (3000..4999) + true + else + false + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/debugger.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/debugger.rb new file mode 100644 index 0000000..a5b3266 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/debugger.rb @@ -0,0 +1,17 @@ +module EventMachine + module WebSocket + module Debugger + + private + + def debug(*data) + if @debug + require 'pp' + pp data + puts + end + end + + end + end +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing03.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing03.rb new file mode 100644 index 0000000..61e6ab8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing03.rb @@ -0,0 +1,162 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + module Framing03 + def initialize_framing + @data = '' + @application_data_buffer = '' # Used for MORE frames + @frame_type = nil + end + + def process_data + error = false + + while !error && @data.size > 1 + pointer = 0 + + more = ((@data.getbyte(pointer) & 0b10000000) == 0b10000000) ^ fin + # Ignoring rsv1-3 for now + opcode = @data.getbyte(0) & 0b00001111 + pointer += 1 + + # Ignoring rsv4 + length = @data.getbyte(pointer) & 0b01111111 + pointer += 1 + + payload_length = case length + when 127 # Length defined by 8 bytes + # Check buffer size + if @data.getbyte(pointer+8-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Only using the last 4 bytes for now, till I work out how to + # unpack 8 bytes. I'm sure 4GB frames will do for now :) + l = @data[(pointer+4)..(pointer+7)].unpack('N').first + pointer += 8 + l + when 126 # Length defined by 2 bytes + # Check buffer size + if @data.getbyte(pointer+2-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + l = @data[pointer..(pointer+1)].unpack('n').first + pointer += 2 + l + else + length + end + + if payload_length > @connection.max_frame_size + raise WSMessageTooBigError, "Frame length too long (#{payload_length} bytes)" + end + + # Check buffer size + if @data.getbyte(pointer+payload_length-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Throw away data up to pointer + @data.slice!(0...pointer) + + # Read application data + application_data = @data.slice!(0...payload_length) + + frame_type = opcode_to_type(opcode) + + if frame_type == :continuation && !@frame_type + raise WSProtocolError, 'Continuation frame not expected' + end + + if more + debug [:moreframe, frame_type, application_data] + @application_data_buffer << application_data + # The message type is passed in the first frame + @frame_type ||= frame_type + else + # Message is complete + if frame_type == :continuation + @application_data_buffer << application_data + message(@frame_type, '', @application_data_buffer) + @application_data_buffer = '' + @frame_type = nil + else + message(frame_type, '', application_data) + end + end + end # end while + end + + def send_frame(frame_type, application_data) + debug [:sending_frame, frame_type, application_data] + + if @state == :closing && data_frame?(frame_type) + raise WebSocketError, "Cannot send data frame since connection is closing" + end + + frame = '' + + opcode = type_to_opcode(frame_type) + byte1 = opcode # since more, rsv1-3 are 0 + frame << byte1 + + length = application_data.size + if length <= 125 + byte2 = length # since rsv4 is 0 + frame << byte2 + elsif length < 65536 # write 2 byte length + frame << 126 + frame << [length].pack('n') + else # write 8 byte length + frame << 127 + frame << [length >> 32, length & 0xFFFFFFFF].pack("NN") + end + + frame << application_data + + @connection.send_data(frame) + end + + def send_text_frame(data) + send_frame(:text, data) + end + + private + + # This allows flipping the more bit to fin for draft 04 + def fin; false; end + + FRAME_TYPES = { + :continuation => 0, + :close => 1, + :ping => 2, + :pong => 3, + :text => 4, + :binary => 5 + } + FRAME_TYPES_INVERSE = FRAME_TYPES.invert + # Frames are either data frames or control frames + DATA_FRAMES = [:text, :binary, :continuation] + + def type_to_opcode(frame_type) + FRAME_TYPES[frame_type] || raise("Unknown frame type") + end + + def opcode_to_type(opcode) + FRAME_TYPES_INVERSE[opcode] || raise(WSProtocolError, "Unknown opcode #{opcode}") + end + + def data_frame?(type) + DATA_FRAMES.include?(type) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing04.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing04.rb new file mode 100644 index 0000000..41352e6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing04.rb @@ -0,0 +1,15 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + # The only difference between draft 03 framing and draft 04 framing is + # that the MORE bit has been changed to a FIN bit + module Framing04 + include Framing03 + + private + + def fin; true; end + end + end +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing05.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing05.rb new file mode 100644 index 0000000..636336a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing05.rb @@ -0,0 +1,163 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + module Framing05 + def initialize_framing + @data = MaskedString.new + @application_data_buffer = '' # Used for MORE frames + @frame_type = nil + end + + def process_data + error = false + + while !error && @data.size > 5 # mask plus first byte present + pointer = 0 + + @data.read_mask + pointer += 4 + + fin = (@data.getbyte(pointer) & 0b10000000) == 0b10000000 + # Ignoring rsv1-3 for now + opcode = @data.getbyte(pointer) & 0b00001111 + pointer += 1 + + # Ignoring rsv4 + length = @data.getbyte(pointer) & 0b01111111 + pointer += 1 + + payload_length = case length + when 127 # Length defined by 8 bytes + # Check buffer size + if @data.getbyte(pointer+8-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Only using the last 4 bytes for now, till I work out how to + # unpack 8 bytes. I'm sure 4GB frames will do for now :) + l = @data.getbytes(pointer+4, 4).unpack('N').first + pointer += 8 + l + when 126 # Length defined by 2 bytes + # Check buffer size + if @data.getbyte(pointer+2-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + l = @data.getbytes(pointer, 2).unpack('n').first + pointer += 2 + l + else + length + end + + if payload_length > @connection.max_frame_size + raise WSMessageTooBigError, "Frame length too long (#{payload_length} bytes)" + end + + # Check buffer size + if @data.getbyte(pointer+payload_length-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Read application data + application_data = @data.getbytes(pointer, payload_length) + pointer += payload_length + + # Throw away data up to pointer + @data.unset_mask + @data.slice!(0...pointer) + + frame_type = opcode_to_type(opcode) + + if frame_type == :continuation && !@frame_type + raise WSProtocolError, 'Continuation frame not expected' + end + + if !fin + debug [:moreframe, frame_type, application_data] + @application_data_buffer << application_data + @frame_type = frame_type + else + # Message is complete + if frame_type == :continuation + @application_data_buffer << application_data + message(@frame_type, '', @application_data_buffer) + @application_data_buffer = '' + @frame_type = nil + else + message(frame_type, '', application_data) + end + end + end # end while + end + + def send_frame(frame_type, application_data) + debug [:sending_frame, frame_type, application_data] + + if @state == :closing && data_frame?(frame_type) + raise WebSocketError, "Cannot send data frame since connection is closing" + end + + frame = '' + + opcode = type_to_opcode(frame_type) + byte1 = opcode | 0b10000000 # fin bit set, rsv1-3 are 0 + frame << byte1 + + length = application_data.size + if length <= 125 + byte2 = length # since rsv4 is 0 + frame << byte2 + elsif length < 65536 # write 2 byte length + frame << 126 + frame << [length].pack('n') + else # write 8 byte length + frame << 127 + frame << [length >> 32, length & 0xFFFFFFFF].pack("NN") + end + + frame << application_data + + @connection.send_data(frame) + end + + def send_text_frame(data) + send_frame(:text, data) + end + + private + + FRAME_TYPES = { + :continuation => 0, + :close => 1, + :ping => 2, + :pong => 3, + :text => 4, + :binary => 5 + } + FRAME_TYPES_INVERSE = FRAME_TYPES.invert + # Frames are either data frames or control frames + DATA_FRAMES = [:text, :binary, :continuation] + + def type_to_opcode(frame_type) + FRAME_TYPES[frame_type] || raise("Unknown frame type") + end + + def opcode_to_type(opcode) + FRAME_TYPES_INVERSE[opcode] || raise(WSProtocolError, "Unknown opcode #{opcode}") + end + + def data_frame?(type) + DATA_FRAMES.include?(type) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing07.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing07.rb new file mode 100644 index 0000000..58318e4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing07.rb @@ -0,0 +1,185 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + module Framing07 + + def initialize_framing + @data = MaskedString.new + @application_data_buffer = '' # Used for MORE frames + @frame_type = nil + end + + def process_data + error = false + + while !error && @data.size >= 2 + pointer = 0 + + fin = (@data.getbyte(pointer) & 0b10000000) == 0b10000000 + # Ignoring rsv1-3 for now + opcode = @data.getbyte(pointer) & 0b00001111 + pointer += 1 + + mask = (@data.getbyte(pointer) & 0b10000000) == 0b10000000 + length = @data.getbyte(pointer) & 0b01111111 + pointer += 1 + + # raise WebSocketError, 'Data from client must be masked' unless mask + + payload_length = case length + when 127 # Length defined by 8 bytes + # Check buffer size + if @data.getbyte(pointer+8-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Only using the last 4 bytes for now, till I work out how to + # unpack 8 bytes. I'm sure 4GB frames will do for now :) + l = @data.getbytes(pointer+4, 4).unpack('N').first + pointer += 8 + l + when 126 # Length defined by 2 bytes + # Check buffer size + if @data.getbyte(pointer+2-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + l = @data.getbytes(pointer, 2).unpack('n').first + pointer += 2 + l + else + length + end + + # Compute the expected frame length + frame_length = pointer + payload_length + frame_length += 4 if mask + + if frame_length > @connection.max_frame_size + raise WSMessageTooBigError, "Frame length too long (#{frame_length} bytes)" + end + + # Check buffer size + if @data.getbyte(frame_length - 1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Remove frame header + @data.slice!(0...pointer) + pointer = 0 + + # Read application data (unmasked if required) + @data.read_mask if mask + pointer += 4 if mask + application_data = @data.getbytes(pointer, payload_length) + pointer += payload_length + @data.unset_mask if mask + + # Throw away data up to pointer + @data.slice!(0...pointer) + + frame_type = opcode_to_type(opcode) + + if frame_type == :continuation + if !@frame_type + raise WSProtocolError, 'Continuation frame not expected' + end + else # Not a continuation frame + if @frame_type && data_frame?(frame_type) + raise WSProtocolError, "Continuation frame expected" + end + end + + # Validate that control frames are not fragmented + if !fin && !data_frame?(frame_type) + raise WSProtocolError, 'Control frames must not be fragmented' + end + + if !fin + debug [:moreframe, frame_type, application_data] + @application_data_buffer << application_data + # The message type is passed in the first frame + @frame_type ||= frame_type + else + # Message is complete + if frame_type == :continuation + @application_data_buffer << application_data + message(@frame_type, '', @application_data_buffer) + @application_data_buffer = '' + @frame_type = nil + else + message(frame_type, '', application_data) + end + end + end # end while + end + + def send_frame(frame_type, application_data) + debug [:sending_frame, frame_type, application_data] + + if @state == :closing && data_frame?(frame_type) + raise WebSocketError, "Cannot send data frame since connection is closing" + end + + frame = '' + + opcode = type_to_opcode(frame_type) + byte1 = opcode | 0b10000000 # fin bit set, rsv1-3 are 0 + frame << byte1 + + length = application_data.size + if length <= 125 + byte2 = length # since rsv4 is 0 + frame << byte2 + elsif length < 65536 # write 2 byte length + frame << 126 + frame << [length].pack('n') + else # write 8 byte length + frame << 127 + frame << [length >> 32, length & 0xFFFFFFFF].pack("NN") + end + + frame << application_data + + @connection.send_data(frame) + end + + def send_text_frame(data) + send_frame(:text, data) + end + + private + + FRAME_TYPES = { + :continuation => 0, + :text => 1, + :binary => 2, + :close => 8, + :ping => 9, + :pong => 10, + } + FRAME_TYPES_INVERSE = FRAME_TYPES.invert + # Frames are either data frames or control frames + DATA_FRAMES = [:text, :binary, :continuation] + + def type_to_opcode(frame_type) + FRAME_TYPES[frame_type] || raise("Unknown frame type") + end + + def opcode_to_type(opcode) + FRAME_TYPES_INVERSE[opcode] || raise(WSProtocolError, "Unknown opcode #{opcode}") + end + + def data_frame?(type) + DATA_FRAMES.include?(type) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing76.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing76.rb new file mode 100644 index 0000000..55982ff --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/framing76.rb @@ -0,0 +1,105 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + module Framing76 + def initialize_framing + @data = '' + end + + def process_data + debug [:message, @data] + + # This algorithm comes straight from the spec + # http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76#section-5.3 + + error = false + + while !error + return if @data.size == 0 + + pointer = 0 + frame_type = @data.getbyte(pointer) + pointer += 1 + + if (frame_type & 0x80) == 0x80 + # If the high-order bit of the /frame type/ byte is set + length = 0 + + loop do + return false if !@data.getbyte(pointer) + b = @data.getbyte(pointer) + pointer += 1 + b_v = b & 0x7F + length = length * 128 + b_v + break unless (b & 0x80) == 0x80 + end + + if length > @connection.max_frame_size + raise WSMessageTooBigError, "Frame length too long (#{length} bytes)" + end + + if @data.getbyte(pointer+length-1) == nil + debug [:buffer_incomplete, @data] + # Incomplete data - leave @data to accumulate + error = true + else + # Straight from spec - I'm sure this isn't crazy... + # 6. Read /length/ bytes. + # 7. Discard the read bytes. + @data = @data[(pointer+length)..-1] + + # If the /frame type/ is 0xFF and the /length/ was 0, then close + if length == 0 + @connection.send_data("\xff\x00") + @state = :closing + @connection.close_connection_after_writing + else + error = true + end + end + else + # If the high-order bit of the /frame type/ byte is _not_ set + + if @data.getbyte(0) != 0x00 + # Close the connection since this buffer can never match + raise WSProtocolError, "Invalid frame received" + end + + # Addition to the spec to protect against malicious requests + if @data.size > @connection.max_frame_size + raise WSMessageTooBigError, "Frame length too long (#{@data.size} bytes)" + end + + msg = @data.slice!(/\A\x00[^\xff]*\xff/) + if msg + msg.gsub!(/\A\x00|\xff\z/, '') + if @state == :closing + debug [:ignored_message, msg] + else + msg.force_encoding('UTF-8') if msg.respond_to?(:force_encoding) + @connection.trigger_on_message(msg) + end + else + error = true + end + end + end + + false + end + + # frames need to start with 0x00-0x7f byte and end with + # an 0xFF byte. Per spec, we can also set the first + # byte to a value betweent 0x80 and 0xFF, followed by + # a leading length indicator + def send_text_frame(data) + debug [:sending_text_frame, data] + ary = ["\x00", data, "\xff"] + ary.collect{ |s| s.force_encoding('UTF-8') if s.respond_to?(:force_encoding) } + @connection.send_data(ary.join) + end + + end + end +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler.rb new file mode 100644 index 0000000..98cdd4e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler.rb @@ -0,0 +1,97 @@ +module EventMachine + module WebSocket + class Handler + def self.klass_factory(version) + case version + when 75 + Handler75 + when 76 + Handler76 + when 1..3 + # We'll use handler03 - I believe they're all compatible + Handler03 + when 5 + Handler05 + when 6 + Handler06 + when 7 + Handler07 + when 8 + # drafts 9, 10, 11 and 12 should never change the version + # number as they are all the same as version 08. + Handler08 + when 13 + # drafts 13 to 17 all identify as version 13 as they are + # only minor changes or text changes. + Handler13 + else + # According to spec should abort the connection + raise HandshakeError, "Protocol version #{version} not supported" + end + end + + include Debugger + + attr_reader :request, :state + + def initialize(connection, debug = false) + @connection = connection + @debug = debug + @state = :connected + @close_timer = nil + initialize_framing + end + + def receive_data(data) + @data << data + process_data + rescue WSProtocolError => e + fail_websocket(e) + end + + def close_websocket(code, body) + # Implemented in subclass + end + + # Used to avoid un-acked and unclosed remaining open indefinitely + def start_close_timeout + @close_timer = EM::Timer.new(@connection.close_timeout) { + @connection.close_connection + e = WSProtocolError.new("Close handshake un-acked after #{@connection.close_timeout}s, closing tcp connection") + @connection.trigger_on_error(e) + } + end + + # This corresponds to "Fail the WebSocket Connection" in the spec. + def fail_websocket(e) + debug [:error, e] + close_websocket(e.code, e.message) + @connection.close_connection_after_writing + @connection.trigger_on_error(e) + end + + def unbind + @state = :closed + + @close_timer.cancel if @close_timer + + @close_info = defined?(@close_info) ? @close_info : { + :code => 1006, + :was_clean => false, + } + + @connection.trigger_on_close(@close_info) + end + + def ping + # Overridden in subclass + false + end + + def pingable? + # Also Overridden + false + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler03.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler03.rb new file mode 100644 index 0000000..ac4b3ac --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler03.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler03 < Handler + include Framing03 + include MessageProcessor03 + include Close03 + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler05.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler05.rb new file mode 100644 index 0000000..4e48e15 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler05.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler05 < Handler + include Framing05 + include MessageProcessor03 + include Close05 + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler06.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler06.rb new file mode 100644 index 0000000..ad55ef7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler06.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler06 < Handler + include Framing05 + include MessageProcessor06 + include Close06 + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler07.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler07.rb new file mode 100644 index 0000000..d080cf5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler07.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler07 < Handler + include Framing07 + include MessageProcessor06 + include Close06 + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler08.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler08.rb new file mode 100644 index 0000000..632057f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler08.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler08 < Handler + include Framing07 + include MessageProcessor06 + include Close06 + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler13.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler13.rb new file mode 100644 index 0000000..1dc465d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler13.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler13 < Handler + include Framing07 + include MessageProcessor06 + include Close06 + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler75.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler75.rb new file mode 100644 index 0000000..d9a90d3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler75.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler75 < Handler + include Handshake75 + include Framing76 + include Close75 + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler76.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler76.rb new file mode 100644 index 0000000..c4aaa37 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handler76.rb @@ -0,0 +1,14 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + class Handler76 < Handler + include Handshake76 + include Framing76 + include Close75 + + # "\377\000" is octet version and "\xff\x00" is hex version + TERMINATE_STRING = "\xff\x00" + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake.rb new file mode 100644 index 0000000..12b7904 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake.rb @@ -0,0 +1,156 @@ +require "http/parser" +require "uri" + +module EventMachine + module WebSocket + + # Resposible for creating the server handshake response + class Handshake + include EM::Deferrable + + attr_reader :parser, :protocol_version + + # Unfortunately drafts 75 & 76 require knowledge of whether the + # connection is being terminated as ws/wss in order to generate the + # correct handshake response + def initialize(secure) + @parser = Http::Parser.new + @secure = secure + + @parser.on_headers_complete = proc { |headers| + @headers = Hash[headers.map { |k,v| [k.downcase, v] }] + } + end + + def receive_data(data) + @parser << data + + if defined? @headers + process(@headers, @parser.upgrade_data) + end + rescue HTTP::Parser::Error => e + fail(HandshakeError.new("Invalid HTTP header: #{e.message}")) + end + + # Returns the WebSocket upgrade headers as a hash. + # + # Keys are strings, unmodified from the request. + # + def headers + @parser.headers + end + + # The same as headers, except that the hash keys are downcased + # + def headers_downcased + @headers + end + + # Returns the request path (excluding any query params) + # + def path + @path + end + + # Returns the query params as a string foo=bar&baz=... + def query_string + @query_string + end + + def query + Hash[query_string.split('&').map { |c| c.split('=', 2) }] + end + + # Returns the WebSocket origin header if provided + # + def origin + @headers["origin"] || @headers["sec-websocket-origin"] || nil + end + + def secure? + @secure + end + + private + + def process(headers, remains) + unless @parser.http_method == "GET" + raise HandshakeError, "Must be GET request" + end + + # Validate request path + # + # According to http://tools.ietf.org/search/rfc2616#section-5.1.2, an + # invalid Request-URI should result in a 400 status code, but + # HandshakeError's currently result in a WebSocket abort. It's not + # clear which should take precedence, but an abort will do just fine. + begin + uri = URI.parse(@parser.request_url) + @path = uri.path + @query_string = uri.query || "" + rescue URI::InvalidURIError + raise HandshakeError, "Invalid request URI: #{@parser.request_url}" + end + + # Validate Upgrade + unless @parser.upgrade? + raise HandshakeError, "Not an upgrade request" + end + upgrade = @headers['upgrade'] + unless upgrade.kind_of?(String) && upgrade.downcase == 'websocket' + raise HandshakeError, "Invalid upgrade header: #{upgrade.inspect}" + end + + # Determine version heuristically + version = if @headers['sec-websocket-version'] + # Used from drafts 04 onwards + @headers['sec-websocket-version'].to_i + elsif @headers['sec-websocket-draft'] + # Used in drafts 01 - 03 + @headers['sec-websocket-draft'].to_i + elsif @headers['sec-websocket-key1'] + 76 + else + 75 + end + + # Additional handling of bytes after the header if required + case version + when 75 + if !remains.empty? + raise HandshakeError, "Extra bytes after header" + end + when 76, 1..3 + if remains.length < 8 + # The whole third-key has not been received yet. + return nil + elsif remains.length > 8 + raise HandshakeError, "Extra bytes after third key" + end + @headers['third-key'] = remains + end + + handshake_klass = case version + when 75 + Handshake75 + when 76, 1..3 + Handshake76 + when 5, 6, 7, 8, 13 + Handshake04 + else + # According to spec should abort the connection + raise HandshakeError, "Protocol version #{version} not supported" + end + + upgrade_response = handshake_klass.handshake(@headers, @parser.request_url, @secure) + + handler_klass = Handler.klass_factory(version) + + @protocol_version = version + succeed(upgrade_response, handler_klass) + rescue HandshakeError => e + fail(e) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake04.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake04.rb new file mode 100644 index 0000000..a18b9d6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake04.rb @@ -0,0 +1,28 @@ +require 'digest/sha1' +require 'base64' + +module EventMachine + module WebSocket + module Handshake04 + def self.handshake(headers, _, __) + # Required + unless key = headers['sec-websocket-key'] + raise HandshakeError, "sec-websocket-key header is required" + end + + string_to_sign = "#{key}258EAFA5-E914-47DA-95CA-C5AB0DC85B11" + signature = Base64.encode64(Digest::SHA1.digest(string_to_sign)).chomp + + upgrade = ["HTTP/1.1 101 Switching Protocols"] + upgrade << "Upgrade: websocket" + upgrade << "Connection: Upgrade" + upgrade << "Sec-WebSocket-Accept: #{signature}" + + # TODO: Support sec-websocket-protocol + # TODO: sec-websocket-extensions + + return upgrade.join("\r\n") + "\r\n\r\n" + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake75.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake75.rb new file mode 100644 index 0000000..31039c4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake75.rb @@ -0,0 +1,18 @@ +module EventMachine + module WebSocket + module Handshake75 + def self.handshake(headers, path, secure) + scheme = (secure ? "wss" : "ws") + location = "#{scheme}://#{headers['host']}#{path}" + + upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" + upgrade << "Upgrade: WebSocket\r\n" + upgrade << "Connection: Upgrade\r\n" + upgrade << "WebSocket-Origin: #{headers['origin']}\r\n" + upgrade << "WebSocket-Location: #{location}\r\n\r\n" + + return upgrade + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake76.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake76.rb new file mode 100644 index 0000000..c18260d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/handshake76.rb @@ -0,0 +1,72 @@ +require 'digest/md5' + +module EventMachine::WebSocket + module Handshake76 + class << self + def handshake(headers, path, secure) + challenge_response = solve_challenge( + headers['sec-websocket-key1'], + headers['sec-websocket-key2'], + headers['third-key'] + ) + + scheme = (secure ? "wss" : "ws") + location = "#{scheme}://#{headers['host']}#{path}" + + upgrade = "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" + upgrade << "Upgrade: WebSocket\r\n" + upgrade << "Connection: Upgrade\r\n" + upgrade << "Sec-WebSocket-Location: #{location}\r\n" + upgrade << "Sec-WebSocket-Origin: #{headers['origin']}\r\n" + if protocol = headers['sec-websocket-protocol'] + validate_protocol!(protocol) + upgrade << "Sec-WebSocket-Protocol: #{protocol}\r\n" + end + upgrade << "\r\n" + upgrade << challenge_response + + return upgrade + end + + private + + def solve_challenge(first, second, third) + # Refer to 5.2 4-9 of the draft 76 + sum = [numbers_over_spaces(first)].pack("N*") + + [numbers_over_spaces(second)].pack("N*") + + third + Digest::MD5.digest(sum) + end + + def numbers_over_spaces(string) + unless string + raise HandshakeError, "WebSocket key1 or key2 is missing" + end + + numbers = string.scan(/[0-9]/).join.to_i + + spaces = string.scan(/ /).size + # As per 5.2.5, abort the connection if spaces are zero. + raise HandshakeError, "Websocket Key1 or Key2 does not contain spaces - this is a symptom of a cross-protocol attack" if spaces == 0 + + # As per 5.2.6, abort if numbers is not an integral multiple of spaces + if numbers % spaces != 0 + raise HandshakeError, "Invalid Key #{string.inspect}" + end + + quotient = numbers / spaces + + if quotient > 2**32-1 + raise HandshakeError, "Challenge computation out of range for key #{string.inspect}" + end + + return quotient + end + + def validate_protocol!(protocol) + raise HandshakeError, "Invalid WebSocket-Protocol: empty" if protocol.empty? + # TODO: Validate characters + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/masking04.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/masking04.rb new file mode 100644 index 0000000..ad050e9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/masking04.rb @@ -0,0 +1,37 @@ +module EventMachine + module WebSocket + class MaskedString < String + # Read a 4 bit XOR mask - further requested bytes will be unmasked + def read_mask + if respond_to?(:encoding) && encoding.name != "ASCII-8BIT" + raise "MaskedString only operates on BINARY strings" + end + raise "Too short" if bytesize < 4 # TODO - change + @masking_key = String.new(self[0..3]) + end + + # Removes the mask, behaves like a normal string again + def unset_mask + @masking_key = nil + end + + def getbyte(index) + if defined?(@masking_key) && @masking_key + masked_char = super + masked_char ? masked_char ^ @masking_key.getbyte(index % 4) : nil + else + super + end + end + + def getbytes(start_index, count) + data = '' + data.force_encoding('ASCII-8BIT') if data.respond_to?(:force_encoding) + count.times do |i| + data << getbyte(start_index + i) + end + data + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/message_processor_03.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/message_processor_03.rb new file mode 100644 index 0000000..c5dec70 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/message_processor_03.rb @@ -0,0 +1,47 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + module MessageProcessor03 + def message(message_type, extension_data, application_data) + case message_type + when :close + @close_info = { + :code => 1005, + :reason => "", + :was_clean => true, + } + if @state == :closing + # TODO: Check that message body matches sent data + # We can close connection immediately since there is no more data + # is allowed to be sent or received on this connection + @connection.close_connection + else + # Acknowlege close + # The connection is considered closed + send_frame(:close, application_data) + @connection.close_connection_after_writing + end + when :ping + # Pong back the same data + send_frame(:pong, application_data) + @connection.trigger_on_ping(application_data) + when :pong + @connection.trigger_on_pong(application_data) + when :text + if application_data.respond_to?(:force_encoding) + application_data.force_encoding("UTF-8") + end + @connection.trigger_on_message(application_data) + when :binary + @connection.trigger_on_binary(application_data) + end + end + + # Ping & Pong supported + def pingable? + true + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/message_processor_06.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/message_processor_06.rb new file mode 100644 index 0000000..4e315b4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/message_processor_06.rb @@ -0,0 +1,64 @@ +module EventMachine + module WebSocket + module MessageProcessor06 + def message(message_type, extension_data, application_data) + debug [:message_received, message_type, application_data] + + case message_type + when :close + status_code = case application_data.length + when 0 + # close messages MAY contain a body + nil + when 1 + # Illegal close frame + raise WSProtocolError, "Close frames with a body must contain a 2 byte status code" + else + application_data.slice!(0, 2).unpack('n').first + end + + debug [:close_frame_received, status_code, application_data] + + @close_info = { + :code => status_code || 1005, + :reason => application_data, + :was_clean => true, + } + + if @state == :closing + # We can close connection immediately since no more data may be + # sent or received on this connection + @connection.close_connection + elsif @state == :connected + # Acknowlege close & echo status back to client + # The connection is considered closed + close_data = [status_code || 1000].pack('n') + send_frame(:close, close_data) + @connection.close_connection_after_writing + end + when :ping + # Pong back the same data + send_frame(:pong, application_data) + @connection.trigger_on_ping(application_data) + when :pong + @connection.trigger_on_pong(application_data) + when :text + if application_data.respond_to?(:force_encoding) + application_data.force_encoding("UTF-8") + unless application_data.valid_encoding? + raise InvalidDataError, "Invalid UTF8 data" + end + end + @connection.trigger_on_message(application_data) + when :binary + @connection.trigger_on_binary(application_data) + end + end + + # Ping & Pong supported + def pingable? + true + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/version.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/version.rb new file mode 100644 index 0000000..3c0d3cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/version.rb @@ -0,0 +1,5 @@ +module EventMachine + module Websocket + VERSION = "0.5.1" + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/websocket.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/websocket.rb new file mode 100644 index 0000000..02e4d86 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/lib/em-websocket/websocket.rb @@ -0,0 +1,56 @@ +module EventMachine + module WebSocket + class << self + attr_accessor :max_frame_size + attr_accessor :close_timeout + end + @max_frame_size = 10 * 1024 * 1024 # 10MB + # Connections are given 60s to close after being sent a close handshake + @close_timeout = 60 + + # All errors raised by em-websocket should descend from this class + class WebSocketError < RuntimeError; end + + # Used for errors that occur during WebSocket handshake + class HandshakeError < WebSocketError; end + + # Used for errors which should cause the connection to close. + # See RFC6455 §7.4.1 for a full description of meanings + class WSProtocolError < WebSocketError + def code; 1002; end + end + + class InvalidDataError < WSProtocolError + def code; 1007; end + end + + # 1009: Message too big to process + class WSMessageTooBigError < WSProtocolError + def code; 1009; end + end + + # Start WebSocket server, including starting eventmachine run loop + def self.start(options, &blk) + EM.epoll + EM.run { + trap("TERM") { stop } + trap("INT") { stop } + + run(options, &blk) + } + end + + # Start WebSocket server inside eventmachine run loop + def self.run(options) + host, port = options.values_at(:host, :port) + EM.start_server(host, port, Connection, options) do |c| + yield c + end + end + + def self.stop + puts "Terminating WebSocket Server" + EM.stop + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/helper.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/helper.rb new file mode 100644 index 0000000..76e45b5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/helper.rb @@ -0,0 +1,173 @@ +# encoding: BINARY + +require 'rubygems' +require 'rspec' +require 'em-spec/rspec' +require 'em-http' + +require 'em-websocket' +require 'em-websocket-client' + +require 'integration/shared_examples' +require 'integration/gte_03_examples' + +RSpec.configure do |c| + c.mock_with :rspec +end + +class FakeWebSocketClient < EM::Connection + attr_reader :handshake_response, :packets + + def onopen(&blk); @onopen = blk; end + def onclose(&blk); @onclose = blk; end + def onerror(&blk); @onerror = blk; end + def onmessage(&blk); @onmessage = blk; end + + def initialize + @state = :new + @packets = [] + end + + def receive_data(data) + # puts "RECEIVE DATA #{data}" + if @state == :new + @handshake_response = data + @onopen.call if defined? @onopen + @state = :open + else + @onmessage.call(data) if defined? @onmessage + @packets << data + end + end + + def send(application_data) + send_frame(:text, application_data) + end + + def send_frame(type, application_data) + send_data construct_frame(type, application_data) + end + + def unbind + @onclose.call if defined? @onclose + end + + private + + def construct_frame(type, data) + "\x00#{data}\xff" + end +end + +class Draft03FakeWebSocketClient < FakeWebSocketClient + private + + def construct_frame(type, data) + frame = "" + frame << EM::WebSocket::Framing03::FRAME_TYPES[type] + frame << encoded_length(data.size) + frame << data + end + + def encoded_length(length) + if length <= 125 + [length].pack('C') # since rsv4 is 0 + elsif length < 65536 # write 2 byte length + "\126#{[length].pack('n')}" + else # write 8 byte length + "\127#{[length >> 32, length & 0xFFFFFFFF].pack("NN")}" + end + end +end + +class Draft05FakeWebSocketClient < Draft03FakeWebSocketClient + private + + def construct_frame(type, data) + frame = "" + frame << "\x00\x00\x00\x00" # Mask with nothing for simplicity + frame << (EM::WebSocket::Framing05::FRAME_TYPES[type] | 0b10000000) + frame << encoded_length(data.size) + frame << data + end +end + +class Draft07FakeWebSocketClient < Draft05FakeWebSocketClient + private + + def construct_frame(type, data) + frame = "" + frame << (EM::WebSocket::Framing07::FRAME_TYPES[type] | 0b10000000) + # Should probably mask the data, but I get away without bothering since + # the server doesn't enforce that incoming frames are masked + frame << encoded_length(data.size) + frame << data + end +end + +# Wrapper around em-websocket-client +class Draft75WebSocketClient + def onopen(&blk); @onopen = blk; end + def onclose(&blk); @onclose = blk; end + def onerror(&blk); @onerror = blk; end + def onmessage(&blk); @onmessage = blk; end + + def initialize + @ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/', + :version => 75, + :origin => 'http://example.com') + @ws.errback { |err| @onerror.call if defined? @onerror } + @ws.callback { @onopen.call if defined? @onopen } + @ws.stream { |msg| @onmessage.call(msg) if defined? @onmessage } + @ws.disconnect { @onclose.call if defined? @onclose } + end + + def send(message) + @ws.send_msg(message) + end + + def close_connection + @ws.close_connection + end +end + +def start_server(opts = {}) + EM::WebSocket.run({:host => "0.0.0.0", :port => 12345}.merge(opts)) { |ws| + yield ws if block_given? + } +end + +def format_request(r) + data = "#{r[:method]} #{r[:path]} HTTP/1.1\r\n" + header_lines = r[:headers].map { |k,v| "#{k}: #{v}" } + data << [header_lines, '', r[:body]].join("\r\n") + data +end + +def format_response(r) + data = r[:protocol] || "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" + header_lines = r[:headers].map { |k,v| "#{k}: #{v}" } + data << [header_lines, '', r[:body]].join("\r\n") + data +end + +RSpec::Matchers.define :succeed_with_upgrade do |response| + match do |actual| + success = nil + actual.callback { |upgrade_response, handler_klass| + success = (upgrade_response.lines.sort == format_response(response).lines.sort) + } + success + end +end + +RSpec::Matchers.define :fail_with_error do |error_klass, error_message| + match do |actual| + success = nil + actual.errback { |e| + success = (e.class == error_klass) + success &= (e.message == error_message) if error_message + } + success + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/common_spec.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/common_spec.rb new file mode 100644 index 0000000..f8d272e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/common_spec.rb @@ -0,0 +1,111 @@ +require 'helper' + +# These tests are not specific to any particular draft of the specification +# +describe "WebSocket server" do + include EM::SpecHelper + default_timeout 1 + + it "should fail on non WebSocket requests" do + em { + EM.add_timer(0.1) do + http = EM::HttpRequest.new('http://127.0.0.1:12345/').get :timeout => 0 + http.errback { done } + http.callback { fail } + end + + start_server + } + end + + it "should expose the WebSocket request headers, path and query params" do + em { + EM.add_timer(0.1) do + ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/', + :origin => 'http://example.com') + ws.errback { fail } + ws.callback { ws.close_connection } + ws.stream { |msg| } + end + + start_server do |ws| + ws.onopen { |handshake| + headers = handshake.headers + headers["Connection"].should == "Upgrade" + headers["Upgrade"].should == "websocket" + headers["Host"].to_s.should == "127.0.0.1:12345" + handshake.path.should == "/" + handshake.query.should == {} + handshake.origin.should == 'http://example.com' + } + ws.onclose { + ws.state.should == :closed + done + } + end + } + end + + it "should expose the WebSocket path and query params when nonempty" do + em { + EM.add_timer(0.1) do + ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/hello?foo=bar&baz=qux') + ws.errback { fail } + ws.callback { + ws.close_connection + } + ws.stream { |msg| } + end + + start_server do |ws| + ws.onopen { |handshake| + handshake.path.should == '/hello' + handshake.query_string.split('&').sort. + should == ["baz=qux", "foo=bar"] + handshake.query.should == {"foo"=>"bar", "baz"=>"qux"} + } + ws.onclose { + ws.state.should == :closed + done + } + end + } + end + + it "should raise an exception if frame sent before handshake complete" do + em { + # 1. Start WebSocket server + start_server { |ws| + # 3. Try to send a message to the socket + lambda { + ws.send('early message') + }.should raise_error('Cannot send data before onopen callback') + done + } + + # 2. Connect a dumb TCP connection (will not send handshake) + EM.connect('0.0.0.0', 12345, EM::Connection) + } + end + + it "should allow the server to be started inside an existing EM" do + em { + EM.add_timer(0.1) do + http = EM::HttpRequest.new('http://127.0.0.1:12345/').get :timeout => 0 + http.errback { |e| done } + http.callback { fail } + end + + start_server do |ws| + ws.onopen { |handshake| + headers = handshake.headers + headers["Host"].to_s.should == "127.0.0.1:12345" + } + ws.onclose { + ws.state.should == :closed + done + } + end + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft03_spec.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft03_spec.rb new file mode 100644 index 0000000..f299ab6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft03_spec.rb @@ -0,0 +1,298 @@ +require 'helper' + +describe "draft03" do + include EM::SpecHelper + default_timeout 1 + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key2' => '12998 5 Y3 1 .P00', + 'Sec-WebSocket-Protocol' => 'sample', + 'Upgrade' => 'WebSocket', + 'Sec-WebSocket-Key1' => '4 @1 46546xW%0l 1 5', + 'Origin' => 'http://example.com', + 'Sec-WebSocket-Draft' => '3' + }, + :body => '^n:ds[4U' + } + + @response = { + :headers => { + "Upgrade" => "WebSocket", + "Connection" => "Upgrade", + "Sec-WebSocket-Location" => "ws://example.com/demo", + "Sec-WebSocket-Origin" => "http://example.com", + "Sec-WebSocket-Protocol" => "sample" + }, + :body => "8jKS\'y:G*Co,Wxa-" + } + end + + def start_client + client = EM.connect('0.0.0.0', 12345, Draft03FakeWebSocketClient) + client.send_data(format_request(@request)) + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 3 } + end + + it_behaves_like "a WebSocket server drafts 3 and above" do + let(:version) { 3 } + end + + # These examples are straight from the spec + # http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-03#section-4.6 + describe "examples from the spec" do + it "should accept a single-frame text message" do + em { + start_server { |ws| + ws.onmessage { |msg| + msg.should == 'Hello' + done + } + } + start_client { |client| + client.onopen { + client.send_data("\x04\x05Hello") + } + } + } + end + + it "should accept a fragmented text message" do + em { + start_server { |ws| + ws.onmessage { |msg| + msg.should == 'Hello' + done + } + } + + connection = start_client + + # Send frame + connection.onopen { + connection.send_data("\x84\x03Hel") + connection.send_data("\x00\x02lo") + } + } + end + + it "should accept a ping request and respond with the same body" do + em { + start_server + + connection = start_client + + # Send frame + connection.onopen { + connection.send_data("\x02\x05Hello") + } + + connection.onmessage { |frame| + next if frame.nil? + frame.should == "\x03\x05Hello" + done + } + } + end + + it "should accept a 256 bytes binary message in a single frame" do + em { + data = "a" * 256 + + start_server { |ws| + ws.onbinary { |msg| + msg.encoding.should == Encoding.find("BINARY") if defined?(Encoding) + msg.should == data + done + } + } + + connection = start_client + + # Send frame + connection.onopen { + connection.send_data("\x05\x7E\x01\x00" + data) + } + } + end + + it "should accept a 64KiB binary message in a single frame" do + em { + data = "a" * 65536 + + start_server { |ws| + ws.onbinary { |msg| + msg.encoding.should == Encoding.find("BINARY") if defined?(Encoding) + msg.should == data + done + } + } + + connection = start_client + + # Send frame + connection.onopen { + connection.send_data("\x05\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + data) + } + } + end + end + + describe "close handling" do + it "should respond to a new close frame with a close frame" do + em { + start_server + + connection = start_client + + # Send close frame + connection.onopen { + connection.send_data("\x01\x00") + } + + # Check that close ack received + connection.onmessage { |frame| + frame.should == "\x01\x00" + done + } + } + end + + it "should close the connection on receiving a close acknowlegement and call onclose with close code 1005 and was_clean=true (initiated by server)" do + em { + ack_received = false + + start_server { |ws| + ws.onopen { + # 2. Send a close frame + EM.next_tick { + ws.close + } + } + + # 5. Onclose event on server + ws.onclose { |event| + event.should == { + :code => 1005, + :reason => "", + :was_clean => true, + } + done + } + } + + # 1. Create a fake client which sends draft 76 handshake + connection = start_client + + # 3. Check that close frame recieved and acknowlege it + connection.onmessage { |frame| + frame.should == "\x01\x00" + ack_received = true + connection.send_data("\x01\x00") + } + + # 4. Check that connection is closed _after_ the ack + connection.onclose { + ack_received.should == true + } + } + end + + # it "should repur" + # + it "should return close code 1005 and was_clean=true after closing handshake (initiated by client)" do + em { + start_server { |ws| + ws.onclose { |event| + event.should == { + :code => 1005, + :reason => "", + :was_clean => true, + } + done + } + } + start_client { |client| + client.onopen { + client.send_data("\x01\x00") + } + } + } + end + + it "should not allow data frame to be sent after close frame sent" do + em { + start_server { |ws| + ws.onopen { + # 2. Send a close frame + EM.next_tick { + ws.close + } + + # 3. Check that exception raised if I attempt to send more data + EM.add_timer(0.1) { + lambda { + ws.send('hello world') + }.should raise_error(EM::WebSocket::WebSocketError, 'Cannot send data frame since connection is closing') + done + } + } + } + + # 1. Create a fake client which sends draft 76 handshake + start_client + } + end + + it "should still respond to control frames after close frame sent" do + em { + start_server { |ws| + ws.onopen { + # 2. Send a close frame + EM.next_tick { + ws.close + } + } + } + + # 1. Create a fake client which sends draft 76 handshake + connection = start_client + + connection.onmessage { |frame| + if frame == "\x01\x00" + # 3. After the close frame is received send a ping frame, but + # don't respond with a close ack + connection.send_data("\x02\x05Hello") + else + # 4. Check that the pong is received + frame.should == "\x03\x05Hello" + done + end + } + } + end + + it "should report that close codes are not supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == false + done + } + } + start_client + } + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft05_spec.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft05_spec.rb new file mode 100644 index 0000000..e07ea28 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft05_spec.rb @@ -0,0 +1,50 @@ +require 'helper' + +describe "draft05" do + include EM::SpecHelper + default_timeout 1 + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Upgrade' => 'websocket', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key' => 'dGhlIHNhbXBsZSBub25jZQ==', + 'Sec-WebSocket-Protocol' => 'sample', + 'Sec-WebSocket-Origin' => 'http://example.com', + 'Sec-WebSocket-Version' => '5' + } + } + end + + def start_client + client = EM.connect('0.0.0.0', 12345, Draft05FakeWebSocketClient) + client.send_data(format_request(@request)) + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 5 } + end + + it_behaves_like "a WebSocket server drafts 3 and above" do + let(:version) { 5 } + end + + it "should report that close codes are not supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == false + done + } + } + start_client + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft06_spec.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft06_spec.rb new file mode 100644 index 0000000..ab8670c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft06_spec.rb @@ -0,0 +1,144 @@ +require 'helper' + +describe "draft06" do + include EM::SpecHelper + default_timeout 1 + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Upgrade' => 'websocket', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key' => 'dGhlIHNhbXBsZSBub25jZQ==', + 'Sec-WebSocket-Protocol' => 'sample', + 'Sec-WebSocket-Origin' => 'http://example.com', + 'Sec-WebSocket-Version' => '6' + } + } + + @response = { + :protocol => "HTTP/1.1 101 Switching Protocols\r\n", + :headers => { + "Upgrade" => "websocket", + "Connection" => "Upgrade", + "Sec-WebSocket-Accept" => "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + } + } + end + + def start_client + client = EM.connect('0.0.0.0', 12345, Draft05FakeWebSocketClient) + client.send_data(format_request(@request)) + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 6 } + end + + it_behaves_like "a WebSocket server drafts 3 and above" do + let(:version) { 6 } + end + + it "should open connection" do + em { + start_server { |server| + server.onopen { + server.instance_variable_get(:@handler).class.should == EventMachine::WebSocket::Handler06 + } + } + + start_client { |client| + client.onopen { + client.handshake_response.lines.sort. + should == format_response(@response).lines.sort + done + } + } + } + end + + it "should accept a single-frame text message (masked)" do + em { + start_server { |server| + server.onmessage { |msg| + msg.should == 'Hello' + if msg.respond_to?(:encoding) + msg.encoding.should == Encoding.find("UTF-8") + end + done + } + server.onerror { + fail + } + } + + start_client { |client| + client.onopen { + client.send_data("\x00\x00\x01\x00\x84\x05Ielln") + } + } + } + end + + it "should return close code and reason if closed via handshake" do + em { + start_server { |ws| + ws.onclose { |event| + # 2. Receive close event in server + event.should == { + :code => 4004, + :reason => "close reason", + :was_clean => true, + } + done + } + } + start_client { |client| + client.onopen { + # 1: Send close handshake + close_data = [4004].pack('n') + close_data << "close reason" + client.send_frame(:close, close_data) + } + } + } + end + + it "should return close code 1005 if no code was specified" do + em { + start_server { |ws| + ws.onclose { |event| + event.should == { + :code => 1005, + :reason => "", + :was_clean => true, + } + done + } + } + start_client { |client| + client.onopen { + client.send_frame(:close, '') + } + } + } + end + + it "should report that close codes are supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == true + done + } + } + start_client + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft13_spec.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft13_spec.rb new file mode 100644 index 0000000..6170bf1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft13_spec.rb @@ -0,0 +1,104 @@ +# encoding: BINARY + +require 'helper' + +describe "draft13" do + include EM::SpecHelper + default_timeout 1 + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Upgrade' => 'websocket', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key' => 'dGhlIHNhbXBsZSBub25jZQ==', + 'Sec-WebSocket-Protocol' => 'sample', + 'Sec-WebSocket-Origin' => 'http://example.com', + 'Sec-WebSocket-Version' => '13' + } + } + + @response = { + :protocol => "HTTP/1.1 101 Switching Protocols\r\n", + :headers => { + "Upgrade" => "websocket", + "Connection" => "Upgrade", + "Sec-WebSocket-Accept" => "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + } + } + end + + def start_client + client = EM.connect('0.0.0.0', 12345, Draft07FakeWebSocketClient) + client.send_data(format_request(@request)) + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 13 } + end + + it_behaves_like "a WebSocket server drafts 3 and above" do + let(:version) { 13 } + end + + it "should send back the correct handshake response" do + em { + start_server + + connection = start_client + + connection.onopen { + connection.handshake_response.lines.sort. + should == format_response(@response).lines.sort + done + } + } + end + + # TODO: This test would be much nicer with a real websocket client... + it "should support sending pings and binding to onpong" do + em { + start_server { |ws| + ws.onopen { + ws.should be_pingable + EM.next_tick { + ws.ping('hello').should == true + } + + } + ws.onpong { |data| + data.should == 'hello' + done + } + } + + connection = start_client + + # Confusing, fake onmessage means any data after the handshake + connection.onmessage { |data| + # This is what a ping looks like + data.should == "\x89\x05hello" + # This is what a pong looks like + connection.send_data("\x8a\x05hello") + } + } + end + + it "should report that close codes are supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == true + done + } + } + start_client + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft75_spec.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft75_spec.rb new file mode 100644 index 0000000..8d9faec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft75_spec.rb @@ -0,0 +1,123 @@ +require 'helper' + +# These integration tests are older and use a different testing style to the +# integration tests for newer drafts. They use EM::HttpRequest which happens +# to currently estabish a websocket connection using the draft75 protocol. +# +describe "WebSocket server draft75" do + include EM::SpecHelper + default_timeout 1 + + def start_client + client = Draft75WebSocketClient.new + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 75 } + end + + it "should automatically complete WebSocket handshake" do + em { + MSG = "Hello World!" + EventMachine.add_timer(0.1) do + ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/') + ws.errback { fail } + ws.callback { } + + ws.stream { |msg| + msg.data.should == MSG + EventMachine.stop + } + end + + start_server { |ws| + ws.onopen { + ws.send MSG + } + } + } + end + + it "should split multiple messages into separate callbacks" do + em { + messages = %w[1 2] + received = [] + + EventMachine.add_timer(0.1) do + ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/') + ws.errback { fail } + ws.stream {|msg|} + ws.callback { + ws.send_msg messages[0] + ws.send_msg messages[1] + } + end + + start_server { |ws| + ws.onopen {} + ws.onclose {} + ws.onmessage {|msg| + msg.should == messages[received.size] + received.push msg + + EventMachine.stop if received.size == messages.size + } + } + } + end + + it "should call onclose callback when client closes connection" do + em { + EventMachine.add_timer(0.1) do + ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/') + ws.errback { fail } + ws.callback { + ws.close_connection + } + ws.stream{|msg|} + end + + start_server { |ws| + ws.onopen {} + ws.onclose { + ws.state.should == :closed + EventMachine.stop + } + } + } + end + + it "should call onerror callback with raised exception and close connection on bad handshake" do + em { + EventMachine.add_timer(0.1) do + http = EM::HttpRequest.new('http://127.0.0.1:12345/').get + http.errback { } + http.callback { fail } + end + + start_server { |ws| + ws.onopen { fail } + ws.onclose { EventMachine.stop } + ws.onerror {|e| + e.should be_an_instance_of EventMachine::WebSocket::HandshakeError + e.message.should match('Not an upgrade request') + EventMachine.stop + } + } + } + end + + it "should report that close codes are not supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == false + done + } + } + start_client + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft76_spec.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft76_spec.rb new file mode 100644 index 0000000..f1a14e6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/draft76_spec.rb @@ -0,0 +1,234 @@ +# encoding: BINARY + +require 'helper' + +describe "WebSocket server draft76" do + include EM::SpecHelper + default_timeout 1 + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key2' => '12998 5 Y3 1 .P00', + 'Sec-WebSocket-Protocol' => 'sample', + 'Upgrade' => 'WebSocket', + 'Sec-WebSocket-Key1' => '4 @1 46546xW%0l 1 5', + 'Origin' => 'http://example.com' + }, + :body => '^n:ds[4U' + } + + @response = { + :headers => { + "Upgrade" => "WebSocket", + "Connection" => "Upgrade", + "Sec-WebSocket-Location" => "ws://example.com/demo", + "Sec-WebSocket-Origin" => "http://example.com", + "Sec-WebSocket-Protocol" => "sample" + }, + :body => "8jKS\'y:G*Co,Wxa-" + } + end + + def start_client + client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) + client.send_data(format_request(@request)) + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 76 } + end + + it "should send back the correct handshake response" do + em { + start_server + + start_client { |connection| + connection.onopen { + connection.handshake_response.lines.sort. + should == format_response(@response).lines.sort + done + } + } + } + end + + it "should send closing frame back and close the connection after recieving closing frame" do + em { + start_server + + connection = start_client + + # Send closing frame after handshake complete + connection.onopen { + connection.send_data(EM::WebSocket::Handler76::TERMINATE_STRING) + } + + # Check that this causes a termination string to be returned and the + # connection close + connection.onclose { + connection.packets[0].should == + EM::WebSocket::Handler76::TERMINATE_STRING + done + } + } + end + + it "should ignore any data received after the closing frame" do + em { + start_server { |ws| + # Fail if foobar message is received + ws.onmessage { |msg| + fail + } + } + + connection = start_client + + # Send closing frame after handshake complete, followed by another msg + connection.onopen { + connection.send_data(EM::WebSocket::Handler76::TERMINATE_STRING) + connection.send('foobar') + } + + connection.onclose { + done + } + } + end + + it "should accept null bytes within the frame after a line return" do + em { + start_server { |ws| + ws.onmessage { |msg| + msg.should == "\n\000" + } + } + + connection = start_client + + # Send closing frame after handshake complete + connection.onopen { + connection.send_data("\000\n\000\377") + connection.send_data(EM::WebSocket::Handler76::TERMINATE_STRING) + } + + connection.onclose { + done + } + } + end + + it "should handle unreasonable frame lengths by calling onerror callback" do + em { + start_server { |server| + server.onerror { |error| + error.should be_an_instance_of EM::WebSocket::WSMessageTooBigError + error.message.should == "Frame length too long (1180591620717411303296 bytes)" + done + } + } + + client = start_client + + # This particular frame indicates a message length of + # 1180591620717411303296 bytes. Such a message would previously cause + # a "bignum too big to convert into `long'" error. + # However it is clearly unreasonable and should be rejected. + client.onopen { + client.send_data("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00") + } + } + end + + it "should handle impossible frames by calling onerror callback" do + em { + start_server { |server| + server.onerror { |error| + error.should be_an_instance_of EM::WebSocket::WSProtocolError + error.message.should == "Invalid frame received" + done + } + } + + client = start_client + + client.onopen { + client.send_data("foobar") # Does not start with \x00 or \xff + } + } + end + + it "should handle invalid http requests by raising HandshakeError passed to onerror callback" do + em { + start_server { |server| + server.onerror { |error| + error.should be_an_instance_of EM::WebSocket::HandshakeError + error.message.should == "Invalid HTTP header: Could not parse data entirely (1 != 29)" + done + } + } + + client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) + client.send_data("This is not a HTTP header\r\n\r\n") + } + end + + it "should handle handshake request split into two TCP packets" do + em { + start_server + + # Create a fake client which sends draft 76 handshake + connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) + data = format_request(@request) + # Sends first half of the request + connection.send_data(data[0...(data.length / 2)]) + + connection.onopen { + connection.handshake_response.lines.sort. + should == format_response(@response).lines.sort + done + } + + EM.add_timer(0.1) do + # Sends second half of the request + connection.send_data(data[(data.length / 2)..-1]) + end + } + end + + it "should report that close codes are not supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == false + done + } + } + start_client + } + end + + it "should call onclose when the server closes the connection [antiregression]" do + em { + start_server { |ws| + ws.onopen { + EM.add_timer(0.1) { + ws.close() + } + } + ws.onclose { + done + } + } + start_client + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/gte_03_examples.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/gte_03_examples.rb new file mode 100644 index 0000000..f841618 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/gte_03_examples.rb @@ -0,0 +1,42 @@ +shared_examples_for "a WebSocket server drafts 3 and above" do + it "should force close connections after a timeout if close handshake is not sent by the client" do + em { + server_onerror_fired = false + server_onclose_fired = false + client_got_close_handshake = false + + start_server(:close_timeout => 0.1) { |ws| + ws.onopen { + # 1: Send close handshake to client + EM.next_tick { ws.close(4999, "Close message") } + } + + ws.onerror { |e| + # 3: Client should receive onerror + e.class.should == EM::WebSocket::WSProtocolError + e.message.should == "Close handshake un-acked after 0.1s, closing tcp connection" + server_onerror_fired = true + } + + ws.onclose { + server_onclose_fired = true + } + } + start_client { |client| + client.onmessage { |msg| + # 2: Client does not respond to close handshake (the fake client + # doesn't understand them at all hence this is in onmessage) + msg.should =~ /Close message/ if version >= 6 + client_got_close_handshake = true + } + + client.onclose { + server_onerror_fired.should == true + server_onclose_fired.should == true + client_got_close_handshake.should == true + done + } + } + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/shared_examples.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/shared_examples.rb new file mode 100644 index 0000000..813ce7a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/integration/shared_examples.rb @@ -0,0 +1,252 @@ +# encoding: UTF-8 + +# These tests are run against all draft versions +# +shared_examples_for "a websocket server" do + it "should expose the protocol version" do + em { + start_server { |ws| + ws.onopen { |handshake| + handshake.protocol_version.should == version + done + } + } + + start_client + } + end + + it "should expose the origin header" do + em { + start_server { |ws| + ws.onopen { |handshake| + handshake.origin.should == 'http://example.com' + done + } + } + + start_client + } + end + + it "should send messages successfully" do + em { + start_server { |ws| + ws.onmessage { |message| + message.should == "hello server" + done + } + } + + start_client { |client| + client.onopen { + client.send("hello server") + } + } + } + end + + it "should allow connection to be closed with valid close code" do + em { + start_server { |ws| + ws.onopen { + ws.close(4004, "Bye bye") + done + } + } + + start_client + # TODO: Use a real client which understands how to respond to closing + # handshakes, sending the handshake currently untested + } + end + + it "should raise error if if invalid close code is used" do + em { + start_server { |ws| + ws.onopen { + lambda { + ws.close(2000) + }.should raise_error("Application code may only use codes from 1000, 3000-4999") + done + } + } + + start_client + } + end + + it "should call onclose with was_clean set to false if connection closed without closing handshake by server" do + em { + start_server { |ws| + ws.onopen { + # Close tcp connection (no close handshake) + ws.close_connection + } + ws.onclose { |event| + event.should == {:code => 1006, :was_clean => false} + done + } + } + start_client + } + end + + it "should call onclose with was_clean set to false if connection closed without closing handshake by client" do + em { + start_server { |ws| + ws.onclose { |event| + event.should == {:code => 1006, :was_clean => false} + done + } + } + start_client { |client| + client.onopen { + # Close tcp connection (no close handshake) + client.close_connection + } + } + } + end + + it "should call onerror if an application error raised in onopen" do + em { + start_server { |ws| + ws.onopen { + raise "application error" + } + + ws.onerror { |e| + e.message.should == "application error" + done + } + } + + start_client + } + end + + it "should call onerror if an application error raised in onmessage" do + em { + start_server { |server| + server.onmessage { + raise "application error" + } + + server.onerror { |e| + e.message.should == "application error" + done + } + } + + start_client { |client| + client.onopen { + client.send('a message') + } + } + } + end + + it "should call onerror in an application error raised in onclose" do + em { + start_server { |server| + server.onclose { + raise "application error" + } + + server.onerror { |e| + e.message.should == "application error" + done + } + } + + start_client { |client| + client.onopen { + EM.add_timer(0.1) { + client.close_connection + } + } + } + } + end + + it "should close the connection when a too long frame is sent" do + em { + start_server { |server| + server.max_frame_size = 20 + + server.onerror { |e| + # 3: Error should be reported to server + e.class.should == EventMachine::WebSocket::WSMessageTooBigError + e.message.should =~ /Frame length too long/ + } + } + + start_client { |client| + client.onopen { + EM.next_tick { + client.send("This message is longer than 20 characters") + } + + } + + client.onmessage { |msg| + # 4: This is actually the close message. Really need to use a real + # WebSocket client in these tests... + done + } + + client.onclose { + # 4: Drafts 75 & 76 don't send a close message, they just close the + # connection + done + } + } + } + end + + # Only run these tests on ruby 1.9 + if "a".respond_to?(:force_encoding) + it "should raise error if you try to send non utf8 text data to ws" do + em { + start_server { |server| + server.onopen { + # Create a string which claims to be UTF-8 but which is not + s = "ê" # utf-8 string + s.encode!("ISO-8859-1") + s.force_encoding("UTF-8") + s.valid_encoding?.should == false # now invalid utf8 + + # Send non utf8 encoded data + server.send(s) + } + server.onerror { |error| + error.class.should == EventMachine::WebSocket::WebSocketError + error.message.should == "Data sent to WebSocket must be valid UTF-8 but was UTF-8 (valid: false)" + done + } + } + + start_client { } + } + end + + it "should not change the encoding of strings sent to send [antiregression]" do + em { + start_server { |server| + server.onopen { + s = "example string" + s.force_encoding("UTF-8") + + server.send(s) + + s.encoding.should == Encoding.find("UTF-8") + done + } + } + + start_client { } + } + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/framing_spec.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/framing_spec.rb new file mode 100644 index 0000000..b2a8d33 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/framing_spec.rb @@ -0,0 +1,298 @@ +# encoding: BINARY + +require 'helper' + +describe EM::WebSocket::Framing03 do + class FramingContainer + include EM::WebSocket::Framing03 + + def initialize + @connection = Object.new + def @connection.max_frame_size + 1000000 + end + end + + def <<(data) + @data << data + process_data + end + + def debug(*args); end + end + + before :each do + @f = FramingContainer.new + @f.initialize_framing + end + + describe "basic examples" do + it "connection close" do + @f.should_receive(:message).with(:close, '', '') + @f << 0b00000001 + @f << 0b00000000 + end + + it "ping" do + @f.should_receive(:message).with(:ping, '', '') + @f << 0b00000010 + @f << 0b00000000 + end + + it "pong" do + @f.should_receive(:message).with(:pong, '', '') + @f << 0b00000011 + @f << 0b00000000 + end + + it "text" do + @f.should_receive(:message).with(:text, '', 'foo') + @f << 0b00000100 + @f << 0b00000011 + @f << 'foo' + end + + it "Text in two frames" do + @f.should_receive(:message).with(:text, '', 'hello world') + @f << 0b10000100 + @f << 0b00000110 + @f << "hello " + @f << 0b00000000 + @f << 0b00000101 + @f << "world" + end + + it "2 byte extended payload length text frame" do + data = 'a' * 256 + @f.should_receive(:message).with(:text, '', data) + @f << 0b00000100 # Single frame, text + @f << 0b01111110 # Length 126 (so read 2 bytes) + @f << 0b00000001 # Two bytes in network byte order (256) + @f << 0b00000000 + @f << data + end + end + + # These examples are straight from the spec + # http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-03#section-4.6 + describe "examples from the spec" do + it "a single-frame text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x04\x05Hello" + end + + it "a fragmented text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x84\x03Hel" + @f << "\x00\x02lo" + end + + it "Ping request and response" do + @f.should_receive(:message).with(:ping, '', 'Hello') + @f << "\x02\x05Hello" + end + + it "256 bytes binary message in a single frame" do + data = "a"*256 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x05\x7E\x01\x00" + data + end + + it "64KiB binary message in a single frame" do + data = "a"*65536 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x05\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + data + end + end + + describe "other tests" do + it "should accept a fragmented unmasked text message in 3 frames" do + @f.should_receive(:message).with(:text, '', 'Hello world') + @f << "\x84\x03Hel" + @f << "\x80\x02lo" + @f << "\x00\x06 world" + end + end + + describe "error cases" do + it "should raise an exception on continuation frame without preceeding more frame" do + lambda { + @f << 0b00000000 # Single frame, continuation + @f << 0b00000001 # Length 1 + @f << 'f' + }.should raise_error(EM::WebSocket::WebSocketError, 'Continuation frame not expected') + end + end +end + +# These examples are straight from the spec +# http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-03#section-4.6 +describe EM::WebSocket::Framing04 do + class FramingContainer04 + include EM::WebSocket::Framing04 + + def initialize + @connection = Object.new + def @connection.max_frame_size + 1000000 + end + end + + def <<(data) + @data << data + process_data + end + + def debug(*args); end + end + + before :each do + @f = FramingContainer04.new + @f.initialize_framing + end + + describe "examples from the spec" do + it "a single-frame text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x84\x05\x48\x65\x6c\x6c\x6f" # "\x84\x05Hello" + end + + it "a fragmented text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x04\x03Hel" + @f << "\x80\x02lo" + end + + it "Ping request" do + @f.should_receive(:message).with(:ping, '', 'Hello') + @f << "\x82\x05Hello" + end + + it "a pong response" do + @f.should_receive(:message).with(:pong, '', 'Hello') + @f << "\x83\x05Hello" + end + + it "256 bytes binary message in a single frame" do + data = "a"*256 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x85\x7E\x01\x00" + data + end + + it "64KiB binary message in a single frame" do + data = "a"*65536 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x85\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + data + end + end + + describe "other tests" do + it "should accept a fragmented unmasked text message in 3 frames" do + @f.should_receive(:message).with(:text, '', 'Hello world') + @f << "\x04\x03Hel" + @f << "\x00\x02lo" + @f << "\x80\x06 world" + end + end +end + +describe EM::WebSocket::Framing07 do + class FramingContainer07 + include EM::WebSocket::Framing07 + + def initialize + @connection = Object.new + def @connection.max_frame_size + 1000000 + end + end + + def <<(data) + @data << data + process_data + end + + def debug(*args); end + end + + before :each do + @f = FramingContainer07.new + @f.initialize_framing + end + + # These examples are straight from the spec + # http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07#section-4.6 + describe "examples from the spec" do + it "a single-frame unmakedtext message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x81\x05\x48\x65\x6c\x6c\x6f" # "\x84\x05Hello" + end + + it "a single-frame masked text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x81\x85\x37\xfa\x21\x3d\x7f\x9f\x4d\x51\x58" # "\x84\x05Hello" + end + + it "a fragmented unmasked text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x01\x03Hel" + @f << "\x80\x02lo" + end + + it "Ping request" do + @f.should_receive(:message).with(:ping, '', 'Hello') + @f << "\x89\x05Hello" + end + + it "a pong response" do + @f.should_receive(:message).with(:pong, '', 'Hello') + @f << "\x8a\x05Hello" + end + + it "256 bytes binary message in a single unmasked frame" do + data = "a"*256 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x82\x7E\x01\x00" + data + end + + it "64KiB binary message in a single unmasked frame" do + data = "a"*65536 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x82\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + data + end + end + + describe "other tests" do + it "should raise a WSProtocolError if an invalid frame type is requested" do + lambda { + # Opcode 3 is not supported by this draft + @f << "\x83\x05Hello" + }.should raise_error(EventMachine::WebSocket::WSProtocolError, "Unknown opcode 3") + end + + it "should accept a fragmented unmasked text message in 3 frames" do + @f.should_receive(:message).with(:text, '', 'Hello world') + @f << "\x01\x03Hel" + @f << "\x00\x02lo" + @f << "\x80\x06 world" + end + + it "should raise if non-fin frame is followed by a non-continuation data frame (continuation frame would be expected)" do + lambda { + @f << 0b00000001 # Not fin, text + @f << 0b00000001 # Length 1 + @f << 'f' + @f << 0b10000001 # fin, text (continutation expected) + @f << 0b00000001 # Length 1 + @f << 'b' + }.should raise_error(EM::WebSocket::WebSocketError, 'Continuation frame expected') + end + + it "should raise on non-fin control frames (control frames must not be fragmented)" do + lambda { + @f << 0b00001010 # Not fin, pong (opcode 10) + @f << 0b00000000 # Length 1 + }.should raise_error(EM::WebSocket::WebSocketError, 'Control frames must not be fragmented') + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/handshake_spec.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/handshake_spec.rb new file mode 100644 index 0000000..2754ba7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/handshake_spec.rb @@ -0,0 +1,216 @@ +require 'helper' + +describe EM::WebSocket::Handshake do + def handshake(request, secure = false) + handshake = EM::WebSocket::Handshake.new(secure) + handshake.receive_data(format_request(request)) + handshake + end + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key2' => '12998 5 Y3 1 .P00', + 'Sec-WebSocket-Protocol' => 'sample', + 'Upgrade' => 'WebSocket', + 'Sec-WebSocket-Key1' => '4 @1 46546xW%0l 1 5', + 'Origin' => 'http://example.com' + }, + :body => '^n:ds[4U' + } + @secure_request = @request.merge(:port => 443) + + @response = { + :headers => { + "Upgrade" => "WebSocket", + "Connection" => "Upgrade", + "Sec-WebSocket-Location" => "ws://example.com/demo", + "Sec-WebSocket-Origin" => "http://example.com", + "Sec-WebSocket-Protocol" => "sample" + }, + :body => "8jKS\'y:G*Co,Wxa-" + } + @secure_response = @response.merge(:headers => @response[:headers].merge('Sec-WebSocket-Location' => "wss://example.com/demo")) + end + + it "should handle good request" do + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should handle good request to secure default port if secure mode is enabled" do + handshake(@secure_request, true). + should succeed_with_upgrade(@secure_response) + end + + it "should not handle good request to secure default port if secure mode is disabled" do + handshake(@secure_request, false). + should_not succeed_with_upgrade(@secure_response) + end + + it "should handle good request on nondefault port" do + @request[:port] = 8081 + @request[:headers]['Host'] = 'example.com:8081' + @response[:headers]['Sec-WebSocket-Location'] = + 'ws://example.com:8081/demo' + + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should handle good request to secure nondefault port" do + @secure_request[:port] = 8081 + @secure_request[:headers]['Host'] = 'example.com:8081' + @secure_response[:headers]['Sec-WebSocket-Location'] = 'wss://example.com:8081/demo' + + handshake(@secure_request, true). + should succeed_with_upgrade(@secure_response) + end + + it "should handle good request with no protocol" do + @request[:headers].delete('Sec-WebSocket-Protocol') + @response[:headers].delete("Sec-WebSocket-Protocol") + + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should handle extra headers by simply ignoring them" do + @request[:headers]['EmptyValue'] = "" + @request[:headers]['AKey'] = "AValue" + + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should raise error on HTTP request" do + @request[:headers] = { + 'Host' => 'www.google.com', + 'User-Agent' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 GTB6 GTBA', + 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language' => 'en-us,en;q=0.5', + 'Accept-Encoding' => 'gzip,deflate', + 'Accept-Charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', + 'Keep-Alive' => '300', + 'Connection' => 'keep-alive', + } + + handshake(@request).should fail_with_error(EM::WebSocket::HandshakeError) + end + + it "should raise error on wrong method" do + @request[:method] = 'POST' + + handshake(@request).should fail_with_error(EM::WebSocket::HandshakeError) + end + + it "should raise error if upgrade header incorrect" do + @request[:headers]['Upgrade'] = 'NonWebSocket' + + handshake(@request).should fail_with_error(EM::WebSocket::HandshakeError) + end + + it "should raise error if Sec-WebSocket-Protocol is empty" do + @request[:headers]['Sec-WebSocket-Protocol'] = '' + + handshake(@request).should fail_with_error(EM::WebSocket::HandshakeError) + end + + %w[Sec-WebSocket-Key1 Sec-WebSocket-Key2].each do |header| + it "should raise error if #{header} has zero spaces" do + @request[:headers][header] = 'nospaces' + + handshake(@request). + should fail_with_error(EM::WebSocket::HandshakeError, 'Websocket Key1 or Key2 does not contain spaces - this is a symptom of a cross-protocol attack') + end + end + + it "should raise error if Sec-WebSocket-Key1 is missing" do + @request[:headers].delete("Sec-WebSocket-Key1") + + # The error message isn't correct since key1 is used to heuristically + # determine the protocol version in use, however this test at least checks + # that the handshake does correctly fail + handshake(@request). + should fail_with_error(EM::WebSocket::HandshakeError, 'Extra bytes after header') + end + + it "should raise error if Sec-WebSocket-Key2 is missing" do + @request[:headers].delete("Sec-WebSocket-Key2") + + handshake(@request). + should fail_with_error(EM::WebSocket::HandshakeError, 'WebSocket key1 or key2 is missing') + end + + it "should raise error if spaces do not divide numbers in Sec-WebSocket-Key* " do + @request[:headers]['Sec-WebSocket-Key2'] = '12998 5 Y3 1.P00' + + handshake(@request). + should fail_with_error(EM::WebSocket::HandshakeError, 'Invalid Key "12998 5 Y3 1.P00"') + end + + it "should raise error if the HTTP header is empty" do + handshake = EM::WebSocket::Handshake.new(false) + handshake.receive_data("\r\n\r\nfoobar") + + handshake. + should fail_with_error(EM::WebSocket::HandshakeError, 'Invalid HTTP header: Could not parse data entirely (4 != 10)') + end + + # This might seems crazy, but very occasionally we saw multiple "Upgrade: + # WebSocket" headers in the wild. RFC 4.2.1 isn't particularly clear on this + # point, so for now I have decided not to accept --@mloughran + it "should raise error on multiple upgrade headers" do + handshake = EM::WebSocket::Handshake.new(false) + + # Add a duplicate upgrade header + headers = format_request(@request) + upgrade_header = "Upgrade: WebSocket\r\n" + headers.gsub!(upgrade_header, "#{upgrade_header}#{upgrade_header}") + + handshake.receive_data(headers) + + handshake.errback { |e| + e.class.should == EM::WebSocket::HandshakeError + e.message.should == 'Invalid upgrade header: ["WebSocket", "WebSocket"]' + } + end + + it "should cope with requests where the header is split" do + request = format_request(@request) + incomplete_request = request[0...(request.length / 2)] + rest = request[(request.length / 2)..-1] + handshake = EM::WebSocket::Handshake.new(false) + handshake.receive_data(incomplete_request) + + handshake.instance_variable_get(:@deferred_status).should == nil + + # Send the remaining header + handshake.receive_data(rest) + + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should cope with requests where the third key is split" do + request = format_request(@request) + # Removes last two bytes of the third key + incomplete_request = request[0..-3] + rest = request[-2..-1] + handshake = EM::WebSocket::Handshake.new(false) + handshake.receive_data(incomplete_request) + + handshake.instance_variable_get(:@deferred_status).should == nil + + # Send the remaining third key + handshake.receive_data(rest) + + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should fail if the request URI is invalid" do + @request[:path] = "/%" + handshake(@request).should \ + fail_with_error(EM::WebSocket::HandshakeError, 'Invalid request URI: /%') + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/masking_spec.rb b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/masking_spec.rb new file mode 100644 index 0000000..065aa95 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/em-websocket-0.5.1/spec/unit/masking_spec.rb @@ -0,0 +1,29 @@ +# encoding: BINARY + +require 'helper' + +describe EM::WebSocket::MaskedString do + it "should allow reading 4 byte mask and unmasking byte / bytes" do + t = EM::WebSocket::MaskedString.new("\x00\x00\x00\x01\x00\x01\x00\x01") + t.read_mask + t.getbyte(3).should == 0x00 + t.getbytes(4, 4).should == "\x00\x01\x00\x00" + t.getbytes(5, 3).should == "\x01\x00\x00" + end + + it "should return nil from getbyte if index requested is out of range" do + t = EM::WebSocket::MaskedString.new("\x00\x00\x00\x00\x53") + t.read_mask + t.getbyte(4).should == 0x53 + t.getbyte(5).should == nil + end + + it "should allow switching masking on and off" do + t = EM::WebSocket::MaskedString.new("\x02\x00\x00\x00\x03") + t.getbyte(4).should == 0x03 + t.read_mask + t.getbyte(4).should == 0x01 + t.unset_mask + t.getbyte(4).should == 0x03 + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/CHANGELOG.md b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/CHANGELOG.md new file mode 100644 index 0000000..962574d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/CHANGELOG.md @@ -0,0 +1,166 @@ +# Changelog + +## 1.2.5 (July 27, 2017) +* Java: Use long for larger values in oneshot timer intervals [#784, #794] + +## 1.2.4 (July 27, 2017) +* Java: Add EM_PROTO_SSL/TLS definitions [#773, #791] +* Fix IPv6 UDP get_peername [#788] +* Allow for larger values in oneshot timer intervals [#784, #793] +* Update extconf.rb to allow MinGW builds with OpenSSL 1.1.0 [#785] + +## 1.2.3 (February 22, 2017) +* Pure Ruby: Add get_sockname [#308, #772] +* Fix segfault when an Exception is raised from unbind callback [#765, #766] +* Allow destructors to throw when compiling in >= C++11 [#767] + +## 1.2.2 (January 23, 2017) +* Java: Fix Fixnum deprecated warning in Ruby 2.4+ [#759] +* Fix uncaught C++ exception in file watcher and raise InvalidSignature [#512, #757] +* Fix connection count off-by-one for epoll and kqueue [#750] +* Fix uninitialized variable warning in EM::P::HttpClient [#749] +* Fix missing initial value for EventableDescriptor NextHeartbeat [#748] +* Fix hostname resolution on Solaris, Ilumos, SmartOS, et al [#745, #746] +* Improve reliability of tests, reduce public Internet accesses in tests [#656, #666, #749] + +## 1.2.1 (November 15, 2016) +* Throw strerror(errno) when getsockname or getpeername fail [#683] +* Use a single concrete implementation of getpeername/getsockname, the rest pure virtuals [#683] +* Use gai_strerror to get the failure string from getaddrinfo [#744] +* Fix deregistering descriptor when using KQUEUE [#728] +* Fix to enable to work an example code in EM::Pool [#731] +* LineText2: Add regular expression delimiter support [#706] +* Pure Ruby: EM rescue ECONNREFUSED on initial TCP connect [#741] +* Pure Ruby: EM SSL (working start_tls) [#712] +* Pure Ruby: EM fixes [#707] +* Java: Use Acceptors to get peer and sock names if not present in Connections [#743] + +## 1.2.0.1 (March 15, 2016) +* Fix crash when accepting IPv6 connections due to struct sockaddr_in [#698, #699] + +## 1.2.0 (March 15, 2016) +* Integrate work from the EventMachine-LE 1.1.x versions [#570] +* Add start_tls options :ecdh_curve, :dhparam, :fail_if_no_peer_cert [#195, #275, #399, #665] +* Add start_tls option :ssl_version for choosing SSL/TLS versions and ciphers [#359, #348, #603, #654] +* Add start_tls option :sni_hostname to be passed to TLS params [#593] +* Add method EM::Channel#num_subscribers to get the number of subscribers to a channel [#640] +* Add support for proc-sources in EM::Iterator [#639] +* Factor out method cleanup_machine to cleanup code from EM.run [#650] +* Replace Exception class with StandardError [#637] +* Close socket on close_connection even after close_connection_after_writing [#694] +* Allow reusing of datagram socket/setting bind device [#662] +* Handle deferred exceptions in reactor thread [#486] +* Reimplement Queue to avoid shift/push performance problem [#311] +* Windows: Switch from gethostbyname to getaddrinfo, support IPv6 addresses [#303, #630] +* Windows: Use rake-compiler-dock to cross-compile gems [#627] +* Windows: Add AppVeyor configuration for Windows CI testing [#578] +* Windows: Bump rake-compiler to version 0.9.x [#542] +* Fix compilation on AIX (w/ XLC) [#693] +* Fix build on OpenBSD [#690] +* Fix OpenSSL compile issue on AIX 7.1 [#678] +* Fix EventMachine.fork_reactor keeps the threadpool of the original process [#425] +* Fix to prevent event machine from stopping when a raise is done in an unbind [#327] + +## 1.0.9.1 (January 14, 2016) +* Fix EPROTO not defined on Windows [#676] +* Fix missing cast to struct sockaddr * [#671] +* Fix bug in OpenSSL path detection [#675] + +## 1.0.9 (January 13, 2016) +* Try more ways to detect OpenSSL [#602, #643, #661, #663, #668, #669] +* Use WSAGetLastError in pipe.cpp same as ed.cpp [#659] +* Test compiler flags with the C++ compiler and add them to CXXFLAGS [#634, #651] +* Restore silent-fail on unsupported EM.epoll and EM.kqueue [#638, #649] +* getDescriptorByFileno deprecated in JRuby 1.7.x, removed in JRuby 9000 [#642, #648] +* Add -Wno-address always-true because on Windows rb_fd_select [#578] +* Remove the WITHOUT_SSL constant [#578] +* Fix SSL error when the server replies a TLS Alert to our ClientHello [#544, #653] +* Use WSAStringToAddress in lieu of inet_pton for IPv6 address detection on Windows [#595, #632] +* Fix nasty TCP/IPv6 bug [#595, #632] +* Use select_large_fdset on Solaris [#611, #625] +* Detect the Solaris Studio compiler [#611, #625] +* Throw a message with strerror included [#136, #621] + +## 1.0.8 (August 6, 2015) +* fix kqueue assertion failed, postpone ArmKqueueWriter until all events are processed [#51, #176, #372, #401, #619] +* fix Rubinius GC, crank the machine from Ruby space when running Rubinius [#201, #202, #617] +* test to show that LineText2 preserves whitespace and newlines [#32, #622] +* bump up compiler warnings and resolve them [#616] +* fix Windows x64 use uintptr_t instead of unsigned long for binding pointers [#612, #615] +* fix linetext2 unroll tail recursion to avoid stack level too deep [#609] +* fix for compilation with SSL on windows [#601] +* open file descriptors and sockets with O_CLOEXEC where possible [#298, #488, #591] +* fix SmtpClient: send second EHLO after STARTTLS. [#589] +* fix nul-terminated strings in C, use StringValueCStr instead of StringValuePtr + +## 1.0.7 (February 10, 2015) +* fix delay in kqueue/epoll reactor shutdown when timers exist [#587] +* fix memory leak introduced in v1.0.5 [#586] +* expose EM.set_simultaneous_accept_count [#420] +* fix busy loop when EM.run and EM.next_tick are invoked from exception handler [#452] + +## 1.0.6 (February 3, 2015) +* add support for Rubinius Process::Status [#568] +* small bugfixes for SmtpServer [#449] +* update buftok.rb [#547] +* fix assertion on Write() [#525] +* work around mkmf.rb bug preventing gem installation [#574] +* add pause/resume support to jruby reactor [#556] +* fix pure ruby reactor to use 127.0.0.1 instead of localhost [#439] +* fix compilation under macruby [#243] +* add chunked encoding to http client [#111] +* fix errors on win32 when dealing with pipes [1ea45498] [#105] + +## 1.0.5 (February 2, 2015) +* use monotonic clocks on Linux, OS X, Solaris, and Windows [#563] +* use the rb_fd_* API to get autosized fd_sets [#502] +* add basic tests that the DNS resolver isn't leaking timers [#571] +* update to test-unit 2.x and improve various unit tests [#551] +* remove EventMachine_t::Popen code marked by ifdef OBSOLETE [#551] +* ruby 2.0 may fail at Queue.pop, so rescue and complain to $stderr [#551] +* set file handle to INVALID_HANDLE_VALUE after closing the file [#565] +* use `defined?` instead of rescuing NameError for flow control [#535] +* fix closing files and sockets on Windows [#564] +* fix file uploads in Windows [#562] +* catch failure to fork [#539] +* use chunks for SSL write [#545] + +## 1.0.4 (December 19, 2014) +* add starttls_options to smtp server [#552] +* fix closesocket on windows [#497] +* fix build on ruby 2.2 [#503] +* fix build error on ruby 1.9 [#508] +* fix timer leak during dns resolution [#489] +* add concurrency validation to EM::Iterator [#468] +* add get_file_descriptor to get fd for a signature [#467] +* add EM.attach_server and EM.attach_socket_server [#465, #466] +* calling pause from receive_data takes effect immediately [#464] +* reactor_running? returns false after fork [#455] +* fix infinite loop on double close [edc4d0e6, #441, #445] +* fix compilation issue on llvm [#433] +* fix socket error codes on win32 [ff811a81] +* fix EM.stop latency when timers exist [8b613d05, #426] +* fix infinite loop when system time changes [1427a2c80, #428] +* fix crash when callin attach/detach in the same tick [#427] +* fix compilation issue on solaris [#416] + +## 1.0.3 (March 8, 2013) +* EM.system was broken in 1.0.2 release [#413] + +## 1.0.2 (March 8, 2013) +* binary win32 gems now include fastfilereader shim [#222] +* fix long-standing connection timeout issues [27fdd5b, igrigorik/em-http-request#222] +* http and line protocol cleanups [#193, #151] +* reactor return value cleanup [#225] +* fix double require from gemspec [#284] +* fix smtp server reset behavior [#351] +* fix EM.system argument handling [#322] +* ruby 1.9 compat in smtp server and stomp protocols [#349, #315] +* fix pause from post_init [#380] + +## 1.0.1 (February 27, 2013) +* use rb_wait_for_single_fd() on ruby 2.0 to fix rb_thread_select() deprecation [#363] +* fix epoll/kqueue mode in ruby 2.0 by removing calls to rb_enable_interrupt() [#248, #389] +* fix memory leak when verifying ssl cerificates [#403] +* fix initial connection delay [#393, #374] +* fix build on windows [#371] diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/GNU b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/GNU new file mode 100644 index 0000000..3b70c5b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/GNU @@ -0,0 +1,281 @@ +. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your + freedom to share and change it. By contrast, the GNU General Public + License is intended to guarantee your freedom to share and change free + software--to make sure the software is free for all its users. This + General Public License applies to most of the Free Software + Foundation's software and to any other program whose authors commit to + using it. (Some other Free Software Foundation software is covered by + the GNU Lesser General Public License instead.) You can apply it to + your programs, too. + + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + this service if you wish), that you receive source code or can get it + if you want it, that you can change the software or use pieces of it + in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid + anyone to deny you these rights or to ask you to surrender the rights. + These restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether + gratis or for a fee, you must give the recipients all the rights that + you have. You must make sure that they, too, receive or can get the + source code. And you must show them these terms so they know their + rights. + + We protect your rights with two steps: (1) copyright the software, and + (2) offer you this license which gives you legal permission to copy, + distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain + that everyone understands that there is no warranty for this free + software. If the software is modified by someone else and passed on, we + want its recipients to know that what they have is not the original, so + that any problems introduced by others will not reflect on the original + authors' reputations. + + Finally, any free program is threatened constantly by software + patents. We wish to avoid the danger that redistributors of a free + program will individually obtain patent licenses, in effect making the + program proprietary. To prevent this, we have made it clear that any + patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and + modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains + a notice placed by the copyright holder saying it may be distributed + under the terms of this General Public License. The "Program", below, + refers to any such program or work, and a "work based on the Program" + means either the Program or any derivative work under copyright law: + that is to say, a work containing the Program or a portion of it, + either verbatim or with modifications and/or translated into another + language. (Hereinafter, translation is included without limitation in + the term "modification".) Each licensee is addressed as "you". + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of + running the Program is not restricted, and the output from the Program + is covered only if its contents constitute a work based on the + Program (independent of having been made by running the Program). + Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the + notices that refer to this License and to the absence of any warranty; + and give any other recipients of the Program a copy of this License + along with the Program. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion + of it, thus forming a work based on the Program, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Program, + and can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based + on the Program, the distribution of the whole must be on the terms of + this License, whose permissions for other licensees extend to the + entire whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Program. + + In addition, mere aggregation of another work not based on the Program + with the Program (or with a work based on the Program) on a volume of + a storage or distribution medium does not bring the other work under + the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms of + Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete source + code means all the source code for all modules it contains, plus any + associated interface definition files, plus the scripts used to + control compilation and installation of the executable. However, as a + special exception, the source code distributed need not include + anything that is normally distributed (in either source or binary + form) with the major components (compiler, kernel, and so on) of the + operating system on which the executable runs, unless that component + itself accompanies the executable. + + If distribution of executable or object code is made by offering + access to copy from a designated place, then offering equivalent + access to copy the source code from the same place counts as + distribution of the source code, even though third parties are not + compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense or distribute the Program is + void, and will automatically terminate your rights under this License. + However, parties who have received copies, or rights, from you under + this License will not have their licenses terminated so long as such + parties remain in full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Program or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Program (or any work based on the + Program), you indicate your acceptance of this License to do so, and + all its terms and conditions for copying, distributing or modifying + the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program subject to + these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted herein. + You are not responsible for enforcing compliance by third parties to + this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot + distribute so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you + may not distribute the Program at all. For example, if a patent + license would not permit royalty-free redistribution of the Program by + all those who receive copies directly or indirectly through you, then + the only way you could satisfy both it and this License would be to + refrain entirely from distribution of the Program. + + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply and the section as a whole is intended to apply in other + circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system, which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is willing + to distribute software through any other system and a licensee cannot + impose that choice. + + This section is intended to make thoroughly clear what is believed to + be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Program under this License + may add an explicit geographical distribution limitation excluding + those countries, so that distribution is permitted only in or among + countries not thus excluded. In such case, this License incorporates + the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions + of the General Public License from time to time. Such new versions will + be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + + Each version is given a distinguishing version number. If the Program + specifies a version number of this License which applies to it and "any + later version", you have the option of following the terms and conditions + either of that version or of any later version published by the Free + Software Foundation. If the Program does not specify a version number of + this License, you may choose any version ever published by the Free Software + Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the author + to ask for permission. For software which is copyrighted by the Free + Software Foundation, write to the Free Software Foundation; we sometimes + make exceptions for this. Our decision will be guided by the two goals + of preserving the free status of all derivatives of our free software and + of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY + FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS + TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, + REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR + REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, + INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING + OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED + TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY + YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/LICENSE b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/LICENSE new file mode 100644 index 0000000..fbe8c83 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/LICENSE @@ -0,0 +1,60 @@ +EventMachine is copyrighted free software owned by Francis Cianfrocca +(blackhedd ... gmail.com). The Owner of this software permits you to +redistribute and/or modify the software under either the terms of the GPL +version 2 (see the file GPL), or the conditions below ("Ruby License"): + + 1. You may make and give away verbatim copies of the source form of this + software without restriction, provided that you retain ALL of the + original copyright notices and associated disclaimers. + + 2. You may modify your copy of the software in any way, provided that + you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise + make them Freely Available, such as by posting said + modifications to Usenet or an equivalent medium, or by allowing + the author to include your modifications in the software. + + b) use the modified software only within your corporation or + organization. + + c) give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d) make other distribution arrangements with the Owner. + + 3. You may distribute the software in object code or binary form, + provided that you do at least ONE of the following: + + a) distribute the binaries and library files of the software, + together with instructions (in a manual page or equivalent) + on where to get the original distribution. + + b) accompany the distribution with the machine-readable source of + the software. + + c) give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d) make other distribution arrangements with the Owner. + + 4. You may modify and include parts of the software into any other + software (possibly commercial), provided you comply with the terms in + Sections 1, 2, and 3 above. But some files in the distribution + are not written by the Owner, so they may be made available to you + under different terms. + + For the list of those files and their copying conditions, see the + file LEGAL. + + 5. The scripts and library files supplied as input to or produced as + output from the software do not automatically fall under the + copyright of the software, but belong to whoever generated them, + and may be sold commercially, and may be aggregated with this + software. + + 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/README.md b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/README.md new file mode 100644 index 0000000..0b8bad3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/README.md @@ -0,0 +1,110 @@ +# About EventMachine [![Code Climate](https://codeclimate.com/github/eventmachine/eventmachine.svg)](https://codeclimate.com/github/eventmachine/eventmachine) + + +## What is EventMachine ## + +EventMachine is an event-driven I/O and lightweight concurrency library for Ruby. +It provides event-driven I/O using the [Reactor pattern](http://en.wikipedia.org/wiki/Reactor_pattern), +much like [JBoss Netty](http://www.jboss.org/netty), [Apache MINA](http://mina.apache.org/), +Python's [Twisted](http://twistedmatrix.com), [Node.js](http://nodejs.org), libevent and libev. + +EventMachine is designed to simultaneously meet two key needs: + + * Extremely high scalability, performance and stability for the most demanding production environments. + * An API that eliminates the complexities of high-performance threaded network programming, + allowing engineers to concentrate on their application logic. + +This unique combination makes EventMachine a premier choice for designers of critical networked +applications, including Web servers and proxies, email and IM production systems, authentication/authorization +processors, and many more. + +EventMachine has been around since the early 2000s and is a mature and battle-tested library. + + +## What EventMachine is good for? ## + + * Scalable event-driven servers. Examples: [Thin](http://code.macournoyer.com/thin/) or [Goliath](https://github.com/postrank-labs/goliath/). + * Scalable asynchronous clients for various protocols, RESTful APIs and so on. Examples: [em-http-request](https://github.com/igrigorik/em-http-request) or [amqp gem](https://github.com/ruby-amqp/amqp). + * Efficient network proxies with custom logic. Examples: [Proxymachine](https://github.com/mojombo/proxymachine/). + * File and network monitoring tools. Examples: [eventmachine-tail](https://github.com/jordansissel/eventmachine-tail) and [logstash](https://github.com/logstash/logstash). + + + +## What platforms are supported by EventMachine? ## + +EventMachine supports Ruby 1.8.7 through 2.3, REE, JRuby and **works well on Windows** as well +as many operating systems from the Unix family (Linux, Mac OS X, BSD flavors). + + + +## Install the gem ## + +Install it with [RubyGems](https://rubygems.org/) + + gem install eventmachine + +or add this to your Gemfile if you use [Bundler](http://gembundler.com/): + + gem "eventmachine" + + + +## Getting started ## + +For an introduction to EventMachine, check out: + + * [blog post about EventMachine by Ilya Grigorik](http://www.igvita.com/2008/05/27/ruby-eventmachine-the-speed-demon/). + * [EventMachine Introductions by Dan Sinclair](http://everburning.com/news/eventmachine-introductions.html). + + +### Server example: Echo server ### + +Here's a fully-functional echo server written with EventMachine: + +```ruby + require 'eventmachine' + + module EchoServer + def post_init + puts "-- someone connected to the echo server!" + end + + def receive_data data + send_data ">>>you sent: #{data}" + close_connection if data =~ /quit/i + end + + def unbind + puts "-- someone disconnected from the echo server!" + end +end + +# Note that this will block current thread. +EventMachine.run { + EventMachine.start_server "127.0.0.1", 8081, EchoServer +} +``` + + +## EventMachine documentation ## + +Currently we only have [reference documentation](http://rdoc.info/github/eventmachine/eventmachine/frames) and a [wiki](https://github.com/eventmachine/eventmachine/wiki). + + +## Community and where to get help ## + + * Join the [mailing list](http://groups.google.com/group/eventmachine) (Google Group) + * Join IRC channel #eventmachine on irc.freenode.net + + +## License and copyright ## + +EventMachine is copyrighted free software made available under the terms +of either the GPL or Ruby's License. + +Copyright: (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + + +## Alternatives ## + +If you are unhappy with EventMachine and want to use Ruby, check out [Celluloid](https://celluloid.io/). diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/DocumentationGuidesIndex.md b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/DocumentationGuidesIndex.md new file mode 100644 index 0000000..b8ce5a2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/DocumentationGuidesIndex.md @@ -0,0 +1,27 @@ +# EventMachine documentation guides # + +Welcome to the documentation guides for [EventMachine](http://github.com/eventmachine/eventmachine), +a fast and simple event-processing library for Ruby programs (à la JBoss Netty, Twisted, Node.js +and so on). + +## Guide list ## + + * {file:docs/GettingStarted.md Getting started with EventMachine} + * {file:docs/EventDrivenServers.md Writing event-driven servers} + * {file:docs/EventDrivenClients.md Writing event-driven clients} + * {file:docs/ConnectionFailureAndRecovery.md Connection Failure and Recovery} + * {file:docs/TLS.md TLS (aka SSL)} + * {file:docs/Ecosystem.md EventMachine ecosystem}: Thin, Goliath, em-http-request, em-websockets, Proxymachine and beyond + * {file:docs/BlockingEventLoop.md On blocking the event loop: why it is harmful for performance and how to avoid it} + * {file:docs/LightweightConcurrency.md Lightweight concurrency with EventMachine} + * {file:docs/Deferrables.md Deferrables} + * {file:docs/ModernKernelInputOutputAPIs.md Brief introduction to epoll, kqueue, select} + * {file:docs/WorkingWithOtherIOSources.md Working with other IO sources such as the keyboard} + + +## Tell us what you think! ## + +Please take a moment and tell us what you think about this guide on the [EventMachine mailing list](http://bit.ly/jW3cR3) +or in the #eventmachine channel on irc.freenode.net: what was unclear? What wasn't covered? +Maybe you don't like the guide style or the grammar and spelling are incorrect? Reader feedback is +key to making documentation better. diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/GettingStarted.md b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/GettingStarted.md new file mode 100644 index 0000000..63acbb7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/GettingStarted.md @@ -0,0 +1,521 @@ +# @title Getting Started with Ruby EventMachine +# @markup markdown +# @author Michael S. Klishin, Dan Sinclair + +# Getting started with Ruby EventMachine # + + +## About this guide ## + +This guide is a quick tutorial that helps you to get started with EventMachine for writing event-driven +servers, clients and using it as a lightweight concurrency library. +It should take about 20 minutes to read and study the provided code examples. This guide covers + + * Installing EventMachine via [Rubygems](http://rubygems.org) and [Bundler](http://gembundler.com). + * Building an Echo server, the "Hello, world"-like code example of network servers. + * Building a simple chat, both server and client. + * Building a very small asynchronous Websockets client. + + +## Covered versions ## + +This guide covers EventMachine v0.12.10 and 1.0 (including betas). + + +## Level ## + +This guide assumes you are comfortable (but not necessary a guru) with the command line. On Microsoft Windows™, +we recommend you to use [JRuby](http://jruby.org) when running these examples. + + +## Installing EventMachine ## + +### Make sure you have Ruby installed ### + +This guide assumes you have one of the supported Ruby implementations installed: + + * Ruby 1.8.7 + * Ruby 1.9.2 + * [JRuby](http://jruby.org) (we recommend 1.6) + * [Rubinius](http://rubini.us) 1.2 or higher + * [Ruby Enterprise Edition](http://www.rubyenterpriseedition.com) + +EventMachine works on Microsoft Windows™. + + +### With Rubygems ### + +To install the EventMachine gem do + + gem install eventmachine + + +### With Bundler ### + + gem "eventmachine" + + +### Verifying your installation ### + +Lets verify your installation with this quick IRB session: + + irb -rubygems + + ruby-1.9.2-p180 :001 > require "eventmachine" + => true + ruby-1.9.2-p180 :002 > EventMachine::VERSION + => "1.0.0.beta.3" + + +## An Echo Server Example ## + +Lets begin with the classic "Hello, world"-like example, an echo server. The echo server responds clients with the +same data that was provided. First, here's the code: + +{include:file:examples/guides/getting\_started/01\_eventmachine\_echo_server.rb} + + +When run, the server binds to port 10000. We can connect using Telnet and verify it's working: + + telnet localhost 10000 + +On my machine the output looks like: + + ~ telnet localhost 10000 + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + +Let's send something to our server. Type in "Hello, EventMachine" and hit Enter. The server will respond with +the same string: + + ~ telnet localhost 10000 + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + Hello, EventMachine + # (here we hit Enter) + Hello, EventMachine + # (this ^^^ is our echo server reply) + +It works! Congratulations, you now can tell your Node.js-loving friends that you "have done some event-driven programming, too". +Oh, and to stop Telnet, hit Control + Shift + ] and then Control + C. + +Lets walk this example line by line and see what's going on. These lines + + require 'rubygems' # or use Bundler.setup + require 'eventmachine' + +probably look familiar: you use [RubyGems](http://rubygems.org) (or [Bundler](http://gembundler.com/)) for dependencies and then require EventMachine gem. Boring. + +Next: + + class EchoServer < EventMachine::Connection + def receive_data(data) + send_data(data) + end + end + +Is the implementation of our echo server. We define a class that inherits from {EventMachine::Connection} +and a handler (aka callback) for one event: when we receive data from a client. + +EventMachine handles the connection setup, receiving data and passing it to our handler, {EventMachine::Connection#receive_data}. + +Then we implement our protocol logic, which in the case of Echo is pretty trivial: we send back whatever we receive. +To do so, we're using {EventMachine::Connection#send_data}. + +Lets modify the example to recognize `exit` command: + +{include:file:examples/guides/getting\_started/02\_eventmachine\_echo_server\_that\_recognizes\_exit\_command.rb} + +Our `receive\_data` changed slightly and now looks like this: + + def receive_data(data) + if data.strip =~ /exit$/i + EventMachine.stop_event_loop + else + send_data(data) + end + end + +Because incoming data has trailing newline character, we strip it off before matching it against a simple regular +expression. If the data ends in `exit`, we stop EventMachine event loop with {EventMachine.stop_event_loop}. This unblocks +main thread and it finishes execution, and our little program exits as the result. + +To summarize this first example: + + * Subclass {EventMachine::Connection} and override {EventMachine::Connection#send_data} to handle incoming data. + * Use {EventMachine.run} to start EventMachine event loop and then bind echo server with {EventMachine.start_server}. + * To stop the event loop, use {EventMachine.stop_event_loop} (aliased as {EventMachine.stop}) + +Lets move on to a slightly more sophisticated example that will introduce several more features and methods +EventMachine has to offer. + + +## A Simple Chat Server Example ## + +Next we will write a simple chat. Initially clients will still use telnet to connect, but then we will add little +client application that will serve as a proxy between telnet and the chat server. This example is certainly longer +(~ 150 lines with whitespace and comments) so instead of looking at the final version and going through it line by line, +we will instead begin with a very simple version that only keeps track of connected clients and then add features +as we go. + +To set some expectations about our example: + + * It will keep track of connected clients + * It will support a couple of commands, à la IRC + * It will support direct messages using Twitter-like @usernames + * It won't use MongoDB, fibers or distributed map/reduce for anything but will be totally [Web Scale™](http://bit.ly/webscaletm) nonetheless. Maybe even [ROFLscale](http://bit.ly/roflscalevideo). + +### Step one: detecting connections and disconnectons ### + +First step looks like this: + +{include:file:examples/guides/getting\_started/04\_simple\_chat\_server\_step\_one.rb} + +We see familiar {EventMachine.run} and {EventMachine.start_server}, but also {EventMachine::Connection#post_init} and {EventMachine::Connection#unbind} we haven't +met yet. We don't use them in this code, so when are they run? Like {EventMachine::Connection#receive_data}, these methods are callbacks. EventMachine calls them +when certain events happen: + + * {EventMachine#post_init} is called by the event loop immediately after the network connection has been established. + In the chat server example case, this is when a new client connects. + * {EventMachine#unbind} is called when client disconnects, connection is closed or is lost (because of a network issue, for example). + +All our chat server does so far is logging connections or disconnections. What we want it to do next is to keep track of connected clients. + + +### Step two: keep track of connected clients ### + +Next iteration of the code looks like this: + +{include:file:examples/guides/getting\_started/05\_simple\_chat\_server\_step\_two.rb} + +While the code we added is very straightforward, we have to clarify one this first: subclasses of {EventMachine::Connection} are instantiated by +EventMachine for every new connected peer. So for 10 connected chat clients, there will be 10 separate `SimpleChatServer` instances in our +server process. Like any other objects, they can be stored in a collection, can provide public API other objects use, can instantiate or inject +dependencies and in general live a happy life all Ruby objects live until garbage collection happens. + +In the example above we use a @@class_variable to keep track of connected clients. In Ruby, @@class variables are accessible from instance +methods so we can add new connections to the list from `SimpleChatServer#post_init` and remove them in `SimpleChatServer#unbind`. We can also +filter connections by some criteria, as `SimpleChatServer#other_peers demonstrates`. + +So, we keep track of connections but how do we identify them? For a chat app, it's pretty common to use usernames for that. Lets ask our clients +to enter usernames when they connect. + + +### Step three: adding usernames ## + +To add usernames, we need to add a few things: + + * We need to invite newly connected clients to enter their username. + * A reader (getter) method on our {EventMachine::Connection} subclass. + * An idea of connection state (keeping track of whether a particular participant had entered username before). + +Here is one way to do it: + +{include:file:examples/guides/getting\_started/06\_simple\_chat\_server\_step\_three.rb} + +This is quite an update so lets take a look at each method individually. First, `SimpleChatServer#post_init`: + + def post_init + @username = nil + puts "A client has connected..." + ask_username + end + +To keep track of username we ask chat participants for, we add @username instance variable to our connection class. Connection +instances are just Ruby objects associated with a particular connected peer, so using @ivars is very natural. To make username +value accessible to other objects, we added a reader method that was not shown on the snippet above. + +Lets dig into `SimpleChatServer#ask_username`: + + def ask_username + self.send_line("[info] Enter your username:") + end # ask_username + + # ... + + def send_line(line) + self.send_data("#{line}\n") + end # send_line(line) + +Nothing new here, we are using {EventMachine::Connection#send_data} which we have seen before. + + +In `SimpleChatServer#receive_data` we now have to check if the username was entered or we need +to ask for it: + + def receive_data(data) + if entered_username? + handle_chat_message(data.strip) + else + handle_username(data.strip) + end + end + + # ... + + def entered_username? + !@username.nil? && !@username.empty? + end # entered_username? + +Finally, handler of chat messages is not yet implemented: + + def handle_chat_message(msg) + raise NotImplementedError + end + +Lets try this example out using Telnet: + + ~ telnet localhost 10000 + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + [info] Enter your username: + antares_ + [info] Ohai, antares_ + +and the server output: + + A client has connected... + antares_ has joined + +This version requires you to remember how to terminate your Telnet session (Ctrl + Shift + ], then Ctrl + C). +It is annoying, so why don't we add the same `exit` command to our chat server? + + +### Step four: adding exit command and delivering chat messages #### + +{include:file:examples/guides/getting\_started/07\_simple\_chat\_server\_step\_four.rb} + +TBD + +Lets test-drive this version. Client A: + + ~ telnet localhost 10000 + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + [info] Enter your username: + michael + [info] Ohai, michael + Hi everyone + michael: Hi everyone + joe has joined the room + # here ^^^ client B connects, lets greet him + hi joe + michael: hi joe + joe: hey michael + # ^^^ client B replies + exit + # ^^^ out command in action + Connection closed by foreign host. + +Client B: + + ~ telnet localhost 10000 + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + [info] Enter your username: + joe + [info] Ohai, joe + michael: hi joe + # ^^^ client A greets us, lets reply + hey michael + joe: hey michael + exit + # ^^^ out command in action + Connection closed by foreign host. + +And finally, the server output: + + A client has connected... + michael has joined + A client has connected... + _antares has joined + [info] _antares has left + [info] michael has left + +Our little char server now supports usernames, sending messages and the `exit` command. Next up, private (aka direct) messages. + + +### Step five: adding direct messages and one more command ### + +To add direct messages, we come up with a simple convention: private messages begin with @username and may have optional colon before +message text, like this: + + @joe: hey, how do you like eventmachine? + +This convention makes parsing of messages simple so that we can concentrate on delivering them to a particular client connection. +Remember when we added `username` reader on our connection class? That tiny change makes this step possible: when a new direct +message comes in, we extract username and message text and then find then connection for @username in question: + + # + # Message handling + # + + def handle_chat_message(msg) + if command?(msg) + self.handle_command(msg) + else + if direct_message?(msg) + self.handle_direct_message(msg) + else + self.announce(msg, "#{@username}:") + end + end + end # handle_chat_message(msg) + + def direct_message?(input) + input =~ DM_REGEXP + end # direct_message?(input) + + def handle_direct_message(input) + username, message = parse_direct_message(input) + + if connection = @@connected_clients.find { |c| c.username == username } + puts "[dm] @#{@username} => @#{username}" + connection.send_line("[dm] @#{@username}: #{message}") + else + send_line "@#{username} is not in the room. Here's who is: #{usernames.join(', ')}" + end + end # handle_direct_message(input) + + def parse_direct_message(input) + return [$1, $2] if input =~ DM_REGEXP + end # parse_direct_message(input) + +This snippet demonstrates how one connection instance can obtain another connection instance and send data to it. +This is a very powerful feature, consider just a few use cases: + + * Peer-to-peer protocols + * Content-aware routing + * Efficient streaming with optional filtering + +Less common use cases include extending C++ core of EventMachine to provide access to hardware that streams events that +can be re-broadcasted to any interested parties connected via TCP, UDP or something like AMQP or WebSockets. With this, +sky is the limit. Actually, EventMachine has several features for efficient proxying data between connections. +We will not cover them in this guide. + +One last feature that we are going to add to our chat server is the `status` command that tells you current server time and how many people +are there in the chat room: + + # + # Commands handling + # + + def command?(input) + input =~ /(exit|status)$/i + end # command?(input) + + def handle_command(cmd) + case cmd + when /exit$/i then self.close_connection + when /status$/i then self.send_line("[chat server] It's #{Time.now.strftime('%H:%M')} and there are #{self.number_of_connected_clients} people in the room") + end + end # handle_command(cmd) + +Hopefully this piece of code is easy to follow. Try adding a few more commands, for example, the `whoishere` command that lists people +currently in the chat room. + +In the end, our chat server looks like this: + +{include:file:examples/guides/getting\_started/08\_simple\_chat\_server\_step\_five.rb} + +We are almost done with the server but there are some closing thoughts. + + +### Step six: final version ### + +Just in case, here is the final version of the chat server code we have built: + +{include:file:examples/guides/getting\_started/03\_simple\_chat\_server.rb} + + +### Step seven: future directions and some closing thoughts ### + +The chat server is just about 150 lines of Ruby including empty lines and comments, yet it has a few features most of chat server +examples never add. We did not, however, implement many other features that popular IRC clients like [Colloquy](http://colloquy.info) have: + + * Chat moderation + * Multiple rooms + * Connection timeout detection + +How would one go about implementing them? We thought it is worth discussing what else EventMachine has to offer and what ecosystem projects +one can use to build a really feature-rich Web-based IRC chat client. + +With multiple rooms it's more or less straightforward, just add one more hash and a bunch of commands and use the information about which rooms participant +is in when you are delivering messages. There is nothing in EventMachine itself that can make the job much easier for developer. + +To implement chat moderation feature you may want to do a few things: + + * Work with client IP addresses. Maybe we want to consider everyone who connects from certain IPs a moderator. + * Access persistent data about usernames of moderators and their credentials. + +Does EventMachine have anything to offer here? It does. To obtain peer IP address, take a look at {EventMachine::Connection#get_peername}. The name of this method is +a little bit misleading and originates from low-level socket programming APIs. + +#### A whirlwind tour of the EventMachine ecosystem #### + +To work with data stores you can use several database drivers that ship with EventMachine itself, however, quite often there are some 3rd party projects in +the EventMachine ecosystem that have more features, are faster or just better maintained. So we figured it will be helpful to provide a few pointers +to some of those projects: + + * For MySQL, check out [em-mysql](https://github.com/eventmachine/em-mysql) project. + * For PostgreSQL, have a look at Mike Perham's [EventMachine-based PostgreSQL driver](https://github.com/mperham/em_postgresql). + * For Redis, there is a young but already popular [em-hiredis](https://github.com/mloughran/em-hiredis) library that combines EventMachine's non-blocking I/O with + extreme performance of the official Redis C client, [hiredis](https://github.com/antirez/hiredis). + * For MongoDB, see [em-mongo](https://github.com/bcg/em-mongo) + * For Cassandra, Mike Perham [added transport agnosticism feature](http://www.mikeperham.com/2010/02/09/cassandra-and-eventmachine/) to the [cassandra gem](https://rubygems.org/gems/cassandra). + +[Riak](http://www.basho.com/products_riak_overview.php) and CouchDB talk HTTP so it's possible to use [em-http-request](https://github.com/igrigorik/em-http-request). +If you are aware of EventMachine-based non-blocking drivers for these databases, as well as for HBase, let us know on the [EventMachine mailing list](http://groups.google.com/group/eventmachine). +Also, EventMachine supports TLS (aka SSL) and works well on [JRuby](http://jruby.org) and Windows. + +Learn more in our {file:docs/Ecosystem.md EventMachine ecosystem} and {file:docs/TLS.md TLS (aka SSL)} guides. + + +#### Connection loss detection #### + +Finally, connection loss detection. When our chat participant closes her laptop lid, how do we know that she is no longer active? The answer is, when EventMachine +detects TCP connectin closure, it calls {EventMachine::Connection#unbind}. Version 1.0.beta3 and later also pass an optional argument to that method. The argument +indicates what error (if any) caused the connection to be closed. + +Learn more in our {file:docs/ConnectionFailureAndRecovery.md Connection Failure and Recovery} guide. + + +#### What the Chat Server Example doesn't demonstrate #### + +This chat server also leaves out something production quality clients and servers must take care of: buffering. We intentionally did not include any buffering in +our chat server example: it would only distract you from learning what you really came here to learn: how to use EventMachine to build blazing fast asynchronous +networking programs quickly. However, {EventMachine::Connection#receive_data} does not offer any guarantees that you will be receiving "whole messages" all the time, +largely because the underlying transport (UDP or TCP) does not offer such guarantees. Many protocols, for example, AMQP, mandate that large content chunks are +split into smaller _frames_ of certain size. This means that [amq-client](https://github.com/ruby-amqp/amq-client) library, for instance, that has EventMachine-based driver, +has to deal with figuring out when exactly we received "the whole message". To do so, it uses buffering and employs various checks to detect _frame boundaries_. +So **don't be deceived by the simplicity of this chat example**: it intentionally leaves framing out, but real world protocols usually require it. + + + +## A (Proxying) Chat Client Example ## + +TBD + + +## Wrapping up ## + +This tutorial ends here. Congratulations! You have learned quite a bit about EventMachine. + + +## What to read next ## + +The documentation is organized as a {file:docs/DocumentationGuidesIndex.md number of guides}, covering all kinds of +topics. TBD + + +## Tell us what you think! ## + +Please take a moment and tell us what you think about this guide on the [EventMachine mailing list](http://bit.ly/jW3cR3) +or in the #eventmachine channel on irc.freenode.net: what was unclear? What wasn't covered? +Maybe you don't like the guide style or the grammar and spelling are incorrect? Reader feedback is +key to making documentation better. diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/ChangeLog b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/ChangeLog new file mode 100644 index 0000000..c7a6c48 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/ChangeLog @@ -0,0 +1,211 @@ +01Oct06: Replaced EventMachine#open_datagram_server with a version that can + take a Class or a Module, instead of just a Module. Thanks to Tobias + Gustafsson for pointing out the missing case. +04Oct06: Supported subsecond timer resolutions, per request by Jason Roelofs. +05Oct06: Added EventMachine#set_quantum, which sets the timer resolution. +15Nov06: Added Connection#set_comm_inactivity_timeout. +15Nov06: Checked in a Line-and-Text Protocol Handler. +18Nov06: Checked in a Header-and-Body Protocol Handler. +22Nov06: Changed EventMachine#reconnect: no longer excepts when called on an + already-connected handler. +28Nov06: Supported a binary-unix gem. +19Dec06: Added EventMachine#set_effective_user. +05Jan07: Upped max outstanding timers to 1000. +15May07: Applied Solaris patches from Brett Eisenberg +22May07: Cleaned up the license text in all the source files. +22May07: Released version 0.7.2 + +23May07: Per suggestion from Bill Kelly, fixed a bug with the initialization + of the network libraries under Windows. The goal is to enable EM to + be used without Ruby. +28May07: Applied patch from Bill Kelly, refactors the declarations of + event names to make EM easier to use from C programs without Ruby. +31May07: Added a preliminary implementation of EventMachine#popen. +01Jun07: Added EM, a "pseudo-alias" for EventMachine. +01Jun07: Added EM#next_tick. +01Jun07: Added EM::Connection#get_outbound_data_size +05Jun07: Removed the code which loads a pure-Ruby EM library in case the + compiled extension is unavailable. Suggested by Moshe Litvin. +06Jun07: Preliminary epoll implementation. +12Jun07: Added an evented popen implementation that, like Ruby's, is + full-duplex and makes the subprocess PID available to the caller. +06Jul07: Performance-tweaked the callback dispatcher in eventmachine.rb. +10Jul07: Released version 0.8.0. +12Jul07: Applied patches from Tim Pease to fix Solaris build problems. +15Jul07: Created a new provisional source branch, experiments/jruby-1. + This is a preliminary implementation of the EM reactor in Java, + suitable for use with JRuby. +17Jul07: Added EventMachine#stop_server, per request from Kirk Haines, + and associated unit tests. +22Jul07: Added EventMachine#stream_file_data. This is a very fast and scalable + way of sending data from static files over network connections. It + has separate implementations for small files and large file, and + has tunings to minimize memory consumption. +26Jul07: Added some patches by Kirk Haines to improve the behavior of + EM::Connection#send_file_data_to_connection. +26Jul07: Added a C++ module for directly integrating EM into C++ programs + with no Ruby dependencies. Needs example code. +29Jul07: Added EventMachine::Protocols::LineText2. +29Jul07: Added EventMachine::Protocols::Stomp. +30Jul07: Added sys/stat.h to project.h to fix compilation bug on Darwin. +13Aug07: Added EventMachine#reactor_running? +15Aug07: Added parameters for EventMachine::Connection:start_tls that can be + used to specify client-side private keys and certificates. +17Aug07: Added EventMachine#run_block, a sugaring for a common use case. +24Aug07: Added a preliminary keyboard handler. Needs docs and testing on + windows. +26Aug07: Created EventMachine::Spawnable, an implementation of Erlang-like + processes. +27Aug07: Silenced some -w warnings, requested by James Edward Gray II. +30Aug07: Added cookies to EM::HttpClient#request. +04Sep07: Added an initial implementation of an evented SMTP client. +04Sep07: Added an initial implementation of an evented SMTP server. +10Sep07: Changed EM#spawn to run spawned blocks in the context of the + SpawnedProcess object, not of whatever was the active object at the + time of the spawn. +14Sep07: Heartbeats weren't working with EPOLL. Noticed by Brian Candler. +15Sep07: Added some features, tests and documents to Deferrable. +16Sep07: Added [:content] parameter to EM::Protocols::SmtpClient#send. +16Sep07: Bumped version to 0.9.0 in anticipation of a release. +18Sep07: Released version 0.9.0. +19Sep07: Added #receive_reset to EM::Protocols::SmtpServer. +19Sep07: User overrides of EM::Protocols::SmtpServer#receive_recipient can now + return a Deferrable. Also fixed bug: SmtpClient now raises a protocol + error if none of its RCPT TO: commands are accepted by the server. +26Sep07: Fixed missing keyboard support for Windows. +03Oct07: Added a default handler for RuntimeErrors emitted from user-written + code. Suggested by Brian Candler. +19Oct07: Set the SO_BROADCAST option automatically on all UDP sockets. +10Nov07: Forced integer conversion of send_datagram's port parameter. +Suggested by Matthieu Riou. +12Nov07: Added saslauth.rb, a protocol module to replace the Cyrus SASL +daemons saslauthd and pwcheck. +15Nov07: Fixed bug reported by Mark Zvillius. We were failing to dispatch + zero-length datagrams under certain conditions. +19Nov07: Added EventMachine#set_max_timers. Requested by Matthieu Riou and + others. +19Nov07: Fixed bug with EM::Connection#start_tls. Was not working with server + connections. Reported by Michael S. Fischer. +26Nov07: Supported a hack for EventMachine#popen so it can return an exit + status from subprocesses. Requested by Michael S. Fischer. +30Nov07: Changed Pipe descriptors so that the child-side of the socketpair is + NOT set nonblocking. Suggested by Duane Johnson. +05Dec07: Re-enabled the pure-Ruby implementation. +06Dec07: Released Version 0.10.0. +13Dec07: Added EM::DeferrableChildProcess +24Dec07: Added a SASL client for simple password authentication. +27Dec07: Removed the hookable error handler. No one was using it and it significantly + degraded performance. +30Dec07: Implemented Kqueue support for OSX and BSD. +04Jan08: Fixed bug in epoll ("Bad file descriptor"), patch supplied by Chris + Heath. +04Jan08: Fixed bug reported by Michael S. Fischer. We were terminating + SSL connections that sent data before the handshake was complete. +08Jan08: Added an OpenBSD branch for extconf.rb, contributed by Guillaume + Sellier. +19Jan08: Added EM::Connection::get_sockname per request by Michael Fischer. +19Jan08: Supported IPv6 addresses. +30Apr08: Set the NODELAY option on sockets that we connect to other servers. + Omission noted by Roger Pack. +14May08: Generated a 0.12 release. +15May08: Supported EM#get_sockname for acceptors (TCP server sockets). + Requested by Roger Pack. +15May08; Accepted a patch from Dan Aquino that allows the interval of a + PeriodicTimer to be changed on the fly. +15Jun08: Supported nested calls to EM#run. Many people contributed ideas to + this, notably raggi and tmm1. +20Jul08: Accepted patch from tmm1 for EM#fork_reactor. +28Jul08: Added a Postgres3 implementation, written by FCianfrocca. +14Aug08: Added a patch by Mike Murphy to support basic auth in the http +client. +28Aug08: Added a patch by tmm1 to fix a longstanding problem with Java +data-sends. +13Sep08: Added LineText2#set_binary_mode, a back-compatibility alias. +13Sep08: Modified the load order of protocol libraries in eventmachine.rb + to permit a modification of HeaderAndContentProtocol. +13Sep08: Modified HeaderAndContent to use LineText2, which is less buggy + than LineAndTextProtocol. This change may be reversed if we can fix + the bugs in buftok. +13Sep08: Improved the password handling in the Postgres protocol handler. +15Sep08: Added attach/detach, contributed by Aman Gupta (tmm1) and Riham Aldakkak, + to support working with file descriptors not created in the reactor. +16Sep08: Added an optional version string to the HTTP client. This is a hack + that allows a client to specify a version 1.0 request, which + keeps the server from sending a chunked response. The right way to + solve this, of course, is to support chunked responses. +23Sep08: ChangeLog Summary for Merge of branches/raggi +Most notable work and patches by Aman Gupta, Roger Pack, and James Tucker. +Patches / Tickets also submitted by: Jeremy Evans, aanand, darix, mmmurf, +danielaquino, macournoyer. + - Moved docs into docs/ dir + - Major refactor of rakefile, added generic rakefile helpers in tasks + - Added example CPP build rakefile in tasks/cpp.rake + - Moved rake tests out to tasks/tests.rake + - Added svn ignores where appropriate + - Fixed jruby build on older java platforms + - Gem now builds from Rakefile rather than directly via extconf + - Gem unified for jruby, C++ and pure ruby. + - Correction for pure C++ build, removing ruby dependency + - Fix for CYGWIN builds on ipv6 + - Major refactor for extconf.rb + - Working mingw builds + - extconf optionally uses pkg_config over manual configuration + - extconf builds for 1.9 on any system that has 1.9 + - extconf no longer links pthread explicitly + - looks for kqueue on all *nix systems + - better error output on std::runtime_error, now says where it came from + - Fixed some tests on jruby + - Added test for general send_data flaw, required for a bugfix in jruby build + - Added timeout to epoll tests + - Added fixes for java reactor ruby api + - Small addition of some docs in httpclient.rb and httpcli2.rb + - Some refactor and fixes in smtpserver.rb + - Added parenthesis where possible to avoid excess ruby warnings + - Refactor of $eventmachine_library logic for accuracy and maintenance, jruby + - EM::start_server now supports unix sockets + - EM::connect now supports unix sockets + - EM::defer @threadqueue now handled more gracefully + - Added better messages on exceptions raised + - Fix edge case in timer fires + - Explicitly require buftok.rb + - Add protocols to autoload, rather than require them all immediately + - Fix a bug in pr_eventmachine for outbound_q + - Refactors to take some of the use of defer out of tests. + - Fixes in EM.defer under start/stop conditions. Reduced scope of threads. +23Sep08: Added patch from tmm1 to avoid popen errors on exit. +30Sep08: Added File.exists? checks in the args for start_tls, as suggested by + Brian Lopez (brianmario). +10Nov08: ruby 1.9 compatibility enhancements +28Nov08: Allow for older ruby builds where RARRAY_LEN is not defined +03Dec08: allow passing arguments to popen handlers +13Jan09: SSL support for httpclient2 (David Smalley) +22Jan09: Fixed errors on OSX with the kqueue reactor, fixed errors in the pure + ruby reactor. Added EM.current_time. Added EM.epoll? and EM.kqueue? +27Jan09: Reactor errors are now raised as ruby RuntimeErrors. +28Jan09: Documentation patch from alloy +29Jan09: (Late sign-off) Use a longer timeout for connect_server (Ilya + Grigorik) +07Feb09: Fix signal handling issues with threads+epoll +07Feb09: Use rb_thread_schedule in the epoll reactor +07Feb09: Use TRAP_BEG/END and rb_thread_schedule in kqueue reactor +08Feb09: Added fastfilereader from swiftiply +08Feb09: 1.9 fix for rb_trap_immediate +08Feb09: Enable rb_thread_blocking_region for 1.9.0 and 1.9.1 +10Feb09: Support win32 builds for fastfilereader +10Feb09: Added a new event to indicate completion of SSL handshake on TCP + connections +10Feb09: Working get_peer_cert method. Returns the certificate as a Ruby + String in PEM format. (Jake Douglas) +10Feb09: Added EM.get_max_timers +11Feb09: Fix compile options for sun compiler (Alasdairrr) +11Feb09: get_status returns a Process::Status object +12Feb09: Add EM::Protocols::Memcache with simple get/set functionality +19Feb09: Add catch-all EM.error_handler +20Feb09: Support miniunit (1.9) +20Feb09: Return success on content-length = 0 instead of start waiting forever + (Ugo Riboni) +25Feb09: Allow next_tick to be used to pre-schedule reactor operations before + EM.run +26Feb09: Added EM.get_connection_count +01Mar09: Switch back to extconf for compiling gem extensions +01Mar09: fixed a small bug with basic auth (mmmurf) diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/DEFERRABLES b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/DEFERRABLES new file mode 100644 index 0000000..6e8856c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/DEFERRABLES @@ -0,0 +1,246 @@ +EventMachine (EM) adds two different formalisms for lightweight concurrency +to the Ruby programmer's toolbox: spawned processes and deferrables. This +note will show you how to use deferrables. For more information, see the +separate document LIGHTWEIGHT_CONCURRENCY. + +=== What are Deferrables? + +EventMachine's Deferrable borrows heavily from the "deferred" object in +Python's "Twisted" event-handling framework. Here's a minimal example that +illustrates Deferrable: + + require 'eventmachine' + + class MyClass + include EM::Deferrable + + def print_value x + puts "MyClass instance received #{x}" + end + end + + EM.run { + df = MyClass.new + df.callback {|x| + df.print_value(x) + EM.stop + } + + EM::Timer.new(2) { + df.set_deferred_status :succeeded, 100 + } + } + + +This program will spin for two seconds, print out the string "MyClass +instance received 100" and then exit. The Deferrable pattern relies on +an unusual metaphor that may be unfamiliar to you, unless you've used +Python's Twisted. You may need to read the following material through +more than once before you get the idea. + +EventMachine::Deferrable is simply a Ruby Module that you can include +in your own classes. (There also is a class named +EventMachine::DefaultDeferrable for when you want to create one without +including it in code of your own.) + +An object that includes EventMachine::Deferrable is like any other Ruby +object: it can be created whenever you want, returned from your functions, +or passed as an argument to other functions. + +The Deferrable pattern allows you to specify any number of Ruby code +blocks (callbacks or errbacks) that will be executed at some future time +when the status of the Deferrable object changes. + +How might that be useful? Well, imagine that you're implementing an HTTP +server, but you need to make a call to some other server in order to fulfill +a client request. + +When you receive a request from one of your clients, you can create and +return a Deferrable object. Some other section of your program can add a +callback to the Deferrable that will cause the client's request to be +fulfilled. Simultaneously, you initiate an event-driven or threaded client +request to some different server. And then your EM program will continue to +process other events and service other client requests. + +When your client request to the other server completes some time later, you +will call the #set_deferred_status method on the Deferrable object, passing +either a success or failure status, and an arbitrary number of parameters +(which might include the data you received from the other server). + +At that point, the status of the Deferrable object becomes known, and its +callback or errback methods are immediately executed. Callbacks and errbacks +are code blocks that are attached to Deferrable objects at any time through +the methods #callback and #errback. + +The deep beauty of this pattern is that it decouples the disposition of one +operation (such as a client request to an outboard server) from the +subsequent operations that depend on that disposition (which may include +responding to a different client or any other operation). + +The code which invokes the deferred operation (that will eventually result +in a success or failure status together with associated data) is completely +separate from the code which depends on that status and data. This achieves +one of the primary goals for which threading is typically used in +sophisticated applications, with none of the nondeterminacy or debugging +difficulties of threads. + +As soon as the deferred status of a Deferrable becomes known by way of a call +to #set_deferred_status, the Deferrable will IMMEDIATELY execute all of its +callbacks or errbacks in the order in which they were added to the Deferrable. + +Callbacks and errbacks can be added to a Deferrable object at any time, not +just when the object is created. They can even be added after the status of +the object has been determined! (In this case, they will be executed +immediately when they are added.) + +A call to Deferrable#set_deferred_status takes :succeeded or :failed as its +first argument. (This determines whether the object will call its callbacks +or its errbacks.) #set_deferred_status also takes zero or more additional +parameters, that will in turn be passed as parameters to the callbacks or +errbacks. + +In general, you can only call #set_deferred_status ONCE on a Deferrable +object. A call to #set_deferred_status will not return until all of the +associated callbacks or errbacks have been called. If you add callbacks or +errbacks AFTER making a call to #set_deferred_status, those additional +callbacks or errbacks will execute IMMEDIATELY. Any given callback or +errback will be executed AT MOST once. + +It's possible to call #set_deferred_status AGAIN, during the execution a +callback or errback. This makes it possible to change the parameters which +will be sent to the callbacks or errbacks farther down the chain, enabling +some extremely elegant use-cases. You can transform the data returned from +a deferred operation in arbitrary ways as needed by subsequent users, without +changing any of the code that generated the original data. + +A call to #set_deferred_status will not return until all of the associated +callbacks or errbacks have been called. If you add callbacks or errbacks +AFTER making a call to #set_deferred_status, those additional callbacks or +errbacks will execute IMMEDIATELY. + +Let's look at some more sample code. It turns out that many of the internal +protocol implementations in the EventMachine package rely on Deferrable. One +of these is EM::Protocols::HttpClient. + +To make an evented HTTP request, use the module function +EM::Protocols::HttpClient#request, which returns a Deferrable object. +Here's how: + + require 'eventmachine' + + EM.run { + df = EM::Protocols::HttpClient.request( :host=>"www.example.com", + :request=>"/index.html" ) + + df.callback {|response| + puts "Succeeded: #{response[:content]}" + EM.stop + } + + df.errback {|response| + puts "ERROR: #{response[:status]}" + EM.stop + } + } + +(See the documentation of EventMachine::Protocols::HttpClient for information +on the object returned by #request.) + +In this code, we make a call to HttpClient#request, which immediately returns +a Deferrable object. In the background, an HTTP client request is being made +to www.example.com, although your code will continue to run concurrently. + +At some future point, the HTTP client request will complete, and the code in +EM::Protocols::HttpClient will process either a valid HTTP response (including +returned content), or an error. + +At that point, EM::Protocols::HttpClient will call +EM::Deferrable#set_deferred_status on the Deferrable object that was returned +to your program, as the return value from EM::Protocols::HttpClient.request. +You don't have to do anything to make this happen. All you have to do is tell +the Deferrable what to do in case of either success, failure, or both. + +In our code sample, we set one callback and one errback. The former will be +called if the HTTP call succeeds, and the latter if it fails. (For +simplicity, we have both of them calling EM#stop to end the program, although +real programs would be very unlikely to do this.) + +Setting callbacks and errbacks is optional. They are handlers to defined +events in the lifecycle of the Deferrable event. It's not an error if you +fail to set either a callback, an errback, or both. But of course your +program will then fail to receive those notifications. + +If through some bug it turns out that #set_deferred_status is never called +on a Deferrable object, then that object's callbacks or errbacks will NEVER +be called. It's also possible to set a timeout on a Deferrable. If the +timeout elapses before any other call to #set_deferred_status, the Deferrable +object will behave as is you had called set_deferred_status(:failed) on it. + + +Now let's modify the example to illustrate some additional points: + + require 'eventmachine' + + EM.run { + df = EM::Protocols::HttpClient.request( :host=>"www.example.com", + :request=>"/index.html" ) + + df.callback {|response| + df.set_deferred_status :succeeded, response[:content] + } + + df.callback {|string| + puts "Succeeded: #{string}" + EM.stop + } + + df.errback {|response| + puts "ERROR: #{response[:status]}" + EM.stop + } + } + + +Just for the sake of illustration, we've now set two callbacks instead of +one. If the deferrable operation (the HTTP client-request) succeeds, then +both of the callbacks will be executed in order. + +But notice that we've also made our own call to #set_deferred_status in the +first callback. This isn't required, because the HttpClient implementation +already made a call to #set_deferred_status. (Otherwise, of course, the +callback would not be executing.) + +But we used #set_deferred_status in the first callback in order to change the +parameters that will be sent to subsequent callbacks in the chain. In this +way, you can construct powerful sequences of layered functionality. If you +want, you can even change the status of the Deferrable from :succeeded to +:failed, which would abort the chain of callback calls, and invoke the chain +of errbacks instead. + +Now of course it's somewhat trivial to define two callbacks in the same +method, even with the parameter-changing effect we just described. It would +be much more interesting to pass the Deferrable to some other function (for +example, a function defined in another module or a different gem), that would +in turn add callbacks and/or errbacks of its own. That would illustrate the +true power of the Deferrable pattern: to isolate the HTTP client-request +from other functions that use the data that it returns without caring where +those data came from. + +Remember that you can add a callback or an errback to a Deferrable at any +point in time, regardless of whether the status of the deferred operation is +known (more precisely, regardless of when #set_deferred_status is called on +the object). Even hours or days later. + +When you add a callback or errback to a Deferrable object on which +#set_deferred_status has not yet been called, the callback/errback is queued +up for future execution, inside the Deferrable object. When you add a +callback or errback to a Deferrable on which #set_deferred_status has +already been called, the callback/errback will be executed immediately. +Your code doesn't have to worry about the ordering, and there are no timing +issues, as there would be with a threaded approach. + +For more information on Deferrables and their typical usage patterns, look +in the EM unit tests. There are also quite a few sugarings (including +EM::Deferrable#future) that make typical Deferrable usages syntactically +easier to work with. + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/EPOLL b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/EPOLL new file mode 100644 index 0000000..13cea8f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/EPOLL @@ -0,0 +1,141 @@ +EventMachine now supports epoll, bringing large increases in performance and scalability to Ruby programs. + +Epoll(7) is a alternative mechanism for multiplexed I/O that is available in Linux 2.6 kernels. +It features significantly greater performance than the standard select(2) mechanism, when used in +applications that require very large numbers of open I/O descriptors. + +EventMachine has always used select(2) because its behavior is well standardized and broadly supported. +But select becomes unreasonably slow when a program has a +very large number of file descriptors or sockets. Ruby's version of select hardcodes a limit +of 1024 descriptors per process, but heavily loaded processes will start to show performance +degradation even after only a few hundred descriptors are in use. + +Epoll is an extended version of the poll(2) call, and it solves the problems with select. Programs +based on epoll can easily scale past Ruby's 1024-descriptor limit, potentially to tens of thousands +of connectors, with no significant impact on performance. + +(Another alternative which is very similar to epoll in principle is kqueue, supplied on BSD and its +variants.) + + + +This note shows you how to use epoll in your programs. + +=== Compiling EventMachine to use epoll. + +You don't have to do anything to get epoll support in EventMachine. +When you compile EventMachine on a platform that supports epoll, EM will +automatically generate a Makefile that includes epoll. (At this writing, this will only work +on Linux 2.6 kernels.) If you compile EM on a platform without epoll, then epoll support will +be omitted from the Makefile, and EM will work just as it always has. + +=== Using epoll in your programs. + +First, you need to tell EventMachine to use epoll instead of select (but see below, as this requirement +will be removed in a future EventMachine version). Second, you need to prepare your program to use +more than 1024 descriptors, an operation that generally requires superuser privileges. Third, you will probably +want your process to drop the superuser privileges after you increase your process's descriptor limit. + +=== Using EventMachine#epoll + +Call the method EventMachine#epoll anytime before you call EventMachine#run, and your program will +automatically use epoll, if available. It's safe to call EventMachine#epoll on any platform because +it compiles to a no-op on platforms that don't support epoll. + + require 'rubygems' + require 'eventmachine' + + EM.epoll + EM.run { + ... + } + + +EventMachine#epoll was included in this initial release only to avoid changing the behavior of existing +programs. However, it's expected that a future release of EM will convert EventMachine#epoll to a no-op, +and run epoll by default on platforms that support it. + +=== Using EventMachine#set_descriptor_table_size + +In Linux (as in every Unix-like platform), every process has a internal table that determines the maximum +number of file and socket descriptors you may have open at any given time. The size of this table is +generally fixed at 1024, although it may be increased within certain system-defined hard and soft limits. + +If you want your EventMachine program to support more than 1024 total descriptors, you must use +EventMachine#set_descriptor_table_size, as follows: + + require 'rubygems' + require 'eventmachine' + + new_size = EM.set_descriptor_table_size( 60000 ) + $>.puts "New descriptor-table size is #{new_size}" + + EM.run { + ... + } + +If successful, this example will increase the maximum number of descriptors that epoll can use to 60,000. +Call EventMachine#set_descriptor_table_size without an argument at any time to find out the current +size of the descriptor table. + +Using EventMachine#set_descriptor_table_size ONLY affects the number of descriptors that can be used +by epoll. It has no useful effect on platforms that don't support epoll, and it does NOT increase the +number of descriptors that Ruby's own I/O functions can use. + +#set_descriptor_table_size can fail if your process is not running as superuser, or if you try to set a +table size that exceeds the hard limits imposed by your system. In the latter case, try a smaller number. + + +=== Using EventMachine#set_effective_user + +In general, you must run your program with elevated or superuser privileges if you want to increase +your descriptor-table size beyond 1024 descriptors. This is easy enough to verify. Try running the +sample program given above, that increases the descriptor limit to 60,000. You will probably find that +the table size will not be increased if you don't run your program as root or with elevated privileges. + +But of course network servers, especially long-running ones, should not run with elevated privileges. +You will want to drop superuser privileges as soon as possible after initialization. To do this, +use EventMachine#set_effective_user: + + require 'rubygems' + require 'eventmachine' + + # (Here, program is running as superuser) + + EM.set_descriptor_table_size( 60000 ) + EM.set_effective_user( "nobody" ) + # (Here, program is running as nobody) + + EM.run { + ... + } + +Of course, you will need to replace "nobody" in the example with the name of an unprivileged user +that is valid on your system. What if you want to drop privileges after opening a server socket +on a privileged (low-numbered) port? Easy, just call #set_effective_user after opening your sockets: + + require 'rubygems' + require 'eventmachine' + + # (Here, program is running as superuser) + + EM.set_descriptor_table_size( 60000 ) + + EM.run { + EM.start_server( "0.0.0.0", 80, MyHttpServer ) + EM.start_server( "0.0.0.0", 443, MyEncryptedHttpServer ) + + EM.set_effective_user( "nobody" ) + # (Here, program is running as nobody) + + ... + } + + +Because EventMachine#set_effective_user is used to enforce security +requirements, it has no nonfatal errors. If you try to set a nonexistent or invalid effective user, +#set_effective_user will abort your program, rather than continue to run with elevated privileges. + +EventMachine#set_effective_user is a silent no-op on platforms that don't support it, such as Windows. + + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/INSTALL b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/INSTALL new file mode 100644 index 0000000..dee2e42 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/INSTALL @@ -0,0 +1,13 @@ +If you have obtained an EventMachine source-tarball (.tar.gz): +unzip and untar the tarball, and enter the directory that is +created. In that directory, say: +ruby setup.rb +(You may need to be root to execute this command.) + +To create documentation for EventMachine, simply type: +rake rdoc +in the distro directory. Rdocs will be created in subdirectory rdoc. + +If you have obtained a gem version of EventMachine, install it in the +usual way (gem install eventmachine). You may need superuser privileges +to execute this command. diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/KEYBOARD b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/KEYBOARD new file mode 100644 index 0000000..6c699e4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/KEYBOARD @@ -0,0 +1,42 @@ +EventMachine (EM) can respond to keyboard events. This gives your event-driven +programs the ability to respond to input from local users. + +Programming EM to handle keyboard input in Ruby is simplicity itself. Just use +EventMachine#open_keyboard, and supply the name of a Ruby module or class that +will receive the input: + + require 'rubygems' + require 'eventmachine' + + module MyKeyboardHandler + def receive_data keystrokes + puts "I received the following data from the keyboard: #{keystrokes}" + end + end + + EM.run { + EM.open_keyboard(MyKeyboardHandler) + } + +If you want EM to send line-buffered keyboard input to your program, just +include the LineText2 protocol module in your handler class or module: + + require 'rubygems' + require 'eventmachine' + + module MyKeyboardHandler + include EM::Protocols::LineText2 + def receive_line data + puts "I received the following line from the keyboard: #{data}" + end + end + + EM.run { + EM.open_keyboard(MyKeyboardHandler) + } + +As we said, simplicity itself. You can call EventMachine#open_keyboard at any +time while the EM reactor loop is running. In other words, the method +invocation may appear anywhere in an EventMachine#run block, or in any code +invoked in the #run block. + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/LEGAL b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/LEGAL new file mode 100644 index 0000000..ee01825 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/LEGAL @@ -0,0 +1,25 @@ +LEGAL NOTICE INFORMATION +------------------------ + +EventMachine is Copyright (C) 2006-07 by Francis Cianfrocca. + +EventMachine is copyrighted software owned by Francis Cianfrocca +(blackhedd ... gmail.com). You may redistribute and/or modify this +software as long as you comply with either the terms of the GPL +(see the file GPL), or Ruby's license (see the file COPYING). + +Your use of all the files in this distribution is controlled by these +license terms, except for those files specifically mentioned below: + + + +setup.rb + This file is Copyright (C) 2000-2005 by Minero Aoki + You can distribute/modify this file under the terms of + the GNU LGPL, Lesser General Public License version 2.1. + + +lib/em/buftok.rb + This file is Copyright (C) 2007 by Tony Arcieri. This file is + covered by the terms of Ruby's License (see the file COPYING). + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/LIGHTWEIGHT_CONCURRENCY b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/LIGHTWEIGHT_CONCURRENCY new file mode 100644 index 0000000..3c2cfa0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/LIGHTWEIGHT_CONCURRENCY @@ -0,0 +1,130 @@ +EventMachine (EM) adds two different formalisms for lightweight concurrency to +the Ruby programmer's toolbox: spawned processes and deferrables. This note +will show you how to use them. + + +=== What is Lightweight Concurrency? + +We use the term "Lightweight Concurrency" (LC) to refer to concurrency +mechanisms that are lighter than Ruby threads. By "lighter," we mean: less +resource-intensive in one or more dimensions, usually including memory and +CPU usage. In general, you turn to LC in the hope of improving the +performance and scalability of your programs. + +In addition to the two EventMachine mechanisms we will discuss here, Ruby +has at least one other LC construct: Fibers, which are currently under +development in Ruby 1.9. + +The technical feature that makes all of these LC mechanisms different from +standard Ruby threads is that they are not scheduled automatically. + +When you create and run Ruby threads, you can assume (within certain +constraints) that your threads will all be scheduled fairly by Ruby's runtime. +Ruby itself is responsible for giving each of your threads its own share of +the total runtime. + +But with LC, your program is responsible for causing different execution +paths to run. In effect, your program has to act as a "thread scheduler." +Scheduled entities in LC run to completion and are never preempted. The +runtime system has far less work to do since it has no need to interrupt +threads or to schedule them fairly. This is what makes LC lighter and faster. + +You'll learn exactly how LC scheduling works in practice as we work through +specific examples. + + +=== EventMachine Lightweight Concurrency + +Recall that EM provides a reactor loop that must be running in order for +your programs to perform event-driven logic. An EM program typically has a +structure like this: + + require 'eventmachine' + + # your initializations + + EM.run { + # perform event-driven I/O here, including network clients, + # servers, timers, and thread-pool operations. + } + + # your cleanup + # end of the program + + +EventMachine#run executes the reactor loop, which causes your code to be +called as events of interest to your program occur. The block you pass to +EventMachine#run is executed right after the reactor loop starts, and is +the right place to start socket acceptors, etc. + +Because the reactor loop runs constantly in an EM program (until it is +stopped by a call to EventMachine#stop), it has the ability to schedule +blocks of code for asynchronous execution. Unlike a pre-emptive thread +scheduler, it's NOT able to interrupt code blocks while they execute. But +the scheduling capability it does have is enough to enable lightweight +concurrency. + + +For information on Spawned Processes, see the separate document +SPAWNED_PROCESSES. + +For information on Deferrables, see the separate document DEFERRABLES. + + +=== [SIDEBAR]: I Heard That EventMachine Doesn't Work With Ruby Threads. + +This is incorrect. EM is fully interoperable with all versions of Ruby +threads, and has been since its earliest releases. + +It's very true that EM encourages an "evented" (non-threaded) programming +style. The specific benefits of event-driven programming are far better +performance and scalability for well-written programs, and far easier +debugging. + +The benefit of using threads for similar applications is a possibly more +intuitive programming model, as well as the fact that threads are already +familiar to most programmers. Also, bugs in threaded programs often fail +to show up until programs go into production. These factors create the +illusion that threaded programs are easier to write. + +However, some operations that occur frequently in professional-caliber +applications simply can't be done without threads. (The classic example +is making calls to database client-libraries that block on network I/O +until they complete.) + +EventMachine not only allows the use of Ruby threads in these cases, but +it even provides a built-in thread-pool object to make them easier to +work with. + +You may have heard a persistent criticism that evented I/O is fundamentally +incompatible with Ruby threads. It is true that some well-publicized attempts +to incorporate event-handling libraries into Ruby were not successful. But +EventMachine was designed from the ground up with Ruby compatibility in mind, +so EM never suffered from the problems that defeated the earlier attempts. + + +=== [SIDEBAR]: I Heard That EventMachine Doesn't Work Very Well On Windows. + +This too is incorrect. EventMachine is an extension written in C++ and Java, +and therefore it requires compilation. Many Windows computers (and some Unix +computers, especially in production environments) don't have a build stack. +Attempting to install EventMachine on a machine without a compiler usually +produces a confusing error. + +In addition, Ruby has a much-debated issue with Windows compiler versions. +Ruby on Windows works best with Visual Studio 6, a compiler version that is +long out-of-print, no longer supported by Microsoft, and difficult to obtain. +(This problem is not specific to EventMachine.) + +Shortly after EventMachine was first released, the compiler issues led to +criticism that EM was incompatible with Windows. Since that time, every +EventMachine release has been supplied in a precompiled binary form for +Windows users, that does not require you to compile the code yourself. EM +binary Gems for Windows are compiled using Visual Studio 6. + +EventMachine does supply some advanced features (such as Linux EPOLL support, +reduced-privilege operation, UNIX-domain sockets, etc.) that have no +meaningful implementation on Windows. Apart from these special cases, all EM +functionality (including lightweight concurrency) works perfectly well on +Windows. + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/PURE_RUBY b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/PURE_RUBY new file mode 100644 index 0000000..157d59e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/PURE_RUBY @@ -0,0 +1,75 @@ +EventMachine is supplied in three alternative versions. + +1) A version that includes a Ruby extension written in C++. This version requires compilation; +2) A version for JRuby that contains a precompiled JAR file written in Java; +3) A pure Ruby version that has no external dependencies and can run in any Ruby environment. + +The Java version of EventMachine is packaged in a distinct manner and must be installed using a +special procedure. This version is described fully in a different document, and not considered +further here. + +The C++ and pure-Ruby versions, however, are shipped in the same distribution. You use the same +files (either tarball or Ruby gem) to install both of these versions. + +If you intend to use the C++ version, you must successfully compile EventMachine after you install it. +(The gem installation attempts to perform this step automatically.) + +If you choose not to compile the EventMachine C++ extension, or if your compilation fails for any +reason, you still have a fully-functional installation of the pure-Ruby version of EM. + +However, for technical reasons, a default EM installation (whether or not the compilation succeeds) +will always assume that the compiled ("extension") implementation should be used. + +If you want your EM program to use the pure Ruby version, you must specifically request it. There +are two ways to do this: by setting either a Ruby global variable, or an environment string. + +The following code will invoke the pure-Ruby implementation of EM: + + $eventmachine_library = :pure_ruby + require 'eventmachine' + + EM.library_type #=> "pure_ruby" + +Notice that this requires a code change and is not the preferred way to select pure Ruby, unless +for some reason you are absolutely sure you will never want the compiled implementation. + +Setting the following environment string has the same effect: + + export EVENTMACHINE_LIBRARY="pure_ruby" + +This technique gives you the flexibility to select either version at runtime with no code changes. + +Support + +The EventMachine development team has committed to support precisely the same APIs for all the +various implementations of EM. + +This means that you can expect any EM program to behave identically, whether you use pure Ruby, +the compiled C++ extension, or JRuby. Deviations from this behavior are to be considered bugs +and should be reported as such. + +There is a small number of exceptions to this rule, which arise from underlying platform +distinctions. Notably, EM#epoll is a silent no-op in the pure Ruby implementation. + + +When Should You Use the Pure-Ruby Implementation of EM? + + +Use the pure Ruby implementation of EM when you must support a platform for which no C++ compiler +is available, or on which the standard EM C++ code can't be compiled. + +Keep in mind that you don't need a C++ compiler in order to deploy EM applications that rely on +the compiled version, so long as appropriate C++ runtime libraries are available on the target platform. + +In extreme cases, you may find that you can develop software with the compiled EM version, but are +not allowed to install required runtime libraries on the deployment system(s). This would be another +case in which the pure Ruby implementation can be useful. + +In general you should avoid the pure Ruby version of EM when performance and scalability are important. +EM in pure Ruby will necessarily run slower than the compiled version. Depending on your application +this may or may not be a key issue. + +Also, since EPOLL is not supported in pure Ruby, your applications will be affected by Ruby's built-in +limit of 1024 file and socket descriptors that may be open in a single process. For maximum scalability +and performance, always use EPOLL if possible. + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/RELEASE_NOTES b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/RELEASE_NOTES new file mode 100644 index 0000000..6110820 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/RELEASE_NOTES @@ -0,0 +1,94 @@ +RUBY/EventMachine RELEASE NOTES + +-------------------------------------------------- +Version: 0.9.0, released xxXXX07 +Added Erlang-like distributed-computing features + +-------------------------------------------------- +Version: 0.8.0, released 23Jun07 +Added an epoll implementation for Linux 2.6 kernels. +Added evented #popen. + +-------------------------------------------------- +Version: 0.7.3, released 22May07 +Added a large variety of small features. See the ChangeLog. + +-------------------------------------------------- +Version: 0.7.1, released xxNov06 +Added protocol handlers for line-oriented protocols. +Various bug fixes. + +-------------------------------------------------- +Version: 0.7.0, released 20Nov06 +Added a fix in em.cpp/ConnectToServer to fix a fatal exception that +occurred in FreeBSD when connecting successfully to a remote server. + +-------------------------------------------------- +Version: 0.6.0, released xxJul06 +Added deferred operations, suggested by Don Stocks, amillionhitpoints@yahoo.com. + +-------------------------------------------------- +Version: 0.5.4, released xxJun06 +Added get_peername support for streams and datagrams. + +-------------------------------------------------- +Version: 0.5.3, released 17May06 +Fixed bugs in extconf.rb, thanks to Daniel Harple, dharple@generalconsumption.org. +Added proper setup.rb and rake tasks, thanks to Austin Ziegler. +Fixed a handful of reported problems with builds on various platforms. + +-------------------------------------------------- +Version: 0.5.2, released 05May06 +Made several nonvisible improvements to the Windows +implementation. +Added an exception-handling patch contributed by Jeff Rose, jeff@rosejn.net. +Added a dir-config patch contributed anonymously. +Supported builds on Solaris. + +-------------------------------------------------- +Version: 0.5.1, released 05May06 +Made it possible to pass a Class rather than a Module +to a protocol handler. +Added Windows port. + +-------------------------------------------------- +Version: 0.5.0, released 30Apr06 +Added a preliminary SSL/TLS extension. This will probably +change over the next few releases. + +-------------------------------------------------- +Version: 0.4.5, released 29Apr06 +Changed ext files so the ruby.h is installed after unistd.h +otherwise it doesn't compile on gcc 4.1 + +-------------------------------------------------- +Version: 0.4.2, released 19Apr06 +Changed the Ruby-glue so the extension will play nicer +in the sandbox with Ruby threads. +Added an EventMachine::run_without_threads API to +switch off the thread-awareness for better performance +in programs that do not spin any Ruby threads. + +-------------------------------------------------- +Version: 0.4.1, released 15Apr06 +Reworked the shared-object interface to make it easier to +use EventMachine from languages other than Ruby. + +-------------------------------------------------- +Version: 0.3.2, released 12Apr06 +Added support for a user-supplied block in EventMachine#connect. + +-------------------------------------------------- +Version: 0.3.1, released 11Apr06 +Fixed bug that prevented EventMachine from being run multiple +times in a single process. + +-------------------------------------------------- +Version: 0.3.0, released 10Apr06 +Added method EventHandler::Connection::post_init + +-------------------------------------------------- +Version: 0.2.0, released 10Apr06 +Added method EventHandler::stop + + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/SMTP b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/SMTP new file mode 100644 index 0000000..92bf311 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/SMTP @@ -0,0 +1,4 @@ +This note details the usage of EventMachine's built-in support for SMTP. EM +supports both client and server connections, which will be described in +separate sections. + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/SPAWNED_PROCESSES b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/SPAWNED_PROCESSES new file mode 100644 index 0000000..ee68e3e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/SPAWNED_PROCESSES @@ -0,0 +1,148 @@ +EventMachine (EM) adds two different formalisms for lightweight concurrency +to the Ruby programmer's toolbox: spawned processes and deferrables. This +note will show you how to use spawned processes. For more information, see +the separate document LIGHTWEIGHT_CONCURRENCY. + + +=== What are Spawned Processes? + +Spawned Processes in EventMachine are inspired directly by the "processes" +found in the Erlang programming language. EM deliberately borrows much (but +not all) of Erlang's terminology. However, EM's spawned processes differ from +Erlang's in ways that reflect not only Ruby style, but also the fact that +Ruby is not a functional language like Erlang. + +Let's proceed with a complete, working code sample that we will analyze line +by line. Here's an EM implementation of the "ping-pong" program that also +appears in the Erlang tutorial: + + + require 'eventmachine' + + EM.run { + pong = EM.spawn {|x, ping| + puts "Pong received #{x}" + ping.notify( x-1 ) + } + + ping = EM.spawn {|x| + if x > 0 + puts "Pinging #{x}" + pong.notify x, self + else + EM.stop + end + } + + ping.notify 3 + } + +If you run this program, you'll see the following output: + + Pinging 3 + Pong received 3 + Pinging 2 + Pong received 2 + Pinging 1 + Pong received 1 + +Let's take it step by step. + +EventMachine#spawn works very much like the built-in function spawn in +Erlang. It returns a reference to a Ruby object of class +EventMachine::SpawnedProcess, which is actually a schedulable entity. In +Erlang, the value returned from spawn is called a "process identifier" or +"pid." But we'll refer to the Ruby object returned from EM#spawn simply as a +"spawned process." + +You pass a Ruby block with zero or more parameters to EventMachine#spawn. +Like all Ruby blocks, this one is a closure, so it can refer to variables +defined in the local context when you call EM#spawn. + +However, the code block passed to EM#spawn does NOT execute immediately by +default. Rather, it will execute only when the Spawned Object is "notified." +In Erlang, this process is called "message passing," and is done with the +operator !, but in Ruby it's done simply by calling the #notify method of a +spawned-process object. The parameters you pass to #notify must match those +defined in the block that was originally passed to EM#spawn. + +When you call the #notify method of a spawned-process object, EM's reactor +core will execute the code block originally passed to EM#spawn, at some point +in the future. (#notify itself merely adds a notification to the object's +message queue and ALWAYS returns immediately.) + +When a SpawnedProcess object executes a notification, it does so in the +context of the SpawnedProcess object itself. The notified code block can see +local context from the point at which EM#spawn was called. However, the value +of "self" inside the notified code block is a reference to the SpawnedProcesss +object itself. + +An EM spawned process is nothing more than a Ruby object with a message +queue attached to it. You can have any number of spawned processes in your +program without compromising scalability. You can notify a spawned process +any number of times, and each notification will cause a "message" to be +placed in the queue of the spawned process. Spawned processes with non-empty +message queues are scheduled for execution automatically by the EM reactor. +Spawned processes with no visible references are garbage-collected like any +other Ruby object. + +Back to our code sample: + + pong = EM.spawn {|x, ping| + puts "Pong received #{x}" + ping.notify( x-1 ) + } + +This simply creates a spawned process and assigns it to the local variable +pong. You can see that the spawned code block takes a numeric parameter and a +reference to another spawned process. When pong is notified, it expects to +receive arguments corresponding to these two parameters. It simply prints out +the number it receives as the first argument. Then it notifies the spawned +process referenced by the second argument, passing it the first argument +minus 1. + +And then the block ends, which is crucial because otherwise nothing else +can run. (Remember that in LC, scheduled entities run to completion and are +never preempted.) + +On to the next bit of the code sample: + + ping = EM.spawn {|x| + if x > 0 + puts "Pinging #{x}" + pong.notify x, self + else + EM.stop + end + } + +Here, we're spawning a process that takes a single (numeric) parameter. If +the parameter is greater than zero, the block writes it to the console. It +then notifies the spawned process referenced by the pong local variable, +passing as arguments its number argument, and a reference to itself. The +latter reference, as you saw above, is used by pong to send a return +notification. + +If the ping process receives a zero value, it will stop the reactor loop and +end the program. + +Now we've created a pair of spawned processes, but nothing else has happened. +If we stop now, the program will spin in the EM reactor loop, doing nothing +at all. Our spawned processes will never be scheduled for execution. + +But look at the next line in the code sample: + + ping.notify 3 + +This line gets the ping-pong ball rolling. We call ping's #notify method, +passing the argument 3. This causes a message to be sent to the ping spawned +process. The message contains the single argument, and it causes the EM +reactor to schedule the ping process. And this in turn results in the +execution of the Ruby code block passed to EM#spawn when ping was created. +Everything else proceeds as a result of the messages that are subsequently +passed to each other by the spawned processes. + +[TODO, present the outbound network i/o use case, and clarify that spawned +processes are interleaved with normal i/o operations and don't interfere +with them at all. Also, blame Erlang for the confusing term "process"] + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/TODO b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/TODO new file mode 100644 index 0000000..686a0d5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/docs/old/TODO @@ -0,0 +1,8 @@ +TODO List: + +12Aug06: Noticed by Don Stocks. A TCP connect-request that results +in a failed DNS resolution fires a fatal error back to user code. +Uuuuuugly. We should probably cause an unbind event to get fired +instead, and add some parameterization so the caller can detect +the nature of the failure. + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/01_eventmachine_echo_server.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/01_eventmachine_echo_server.rb new file mode 100644 index 0000000..51c5c7d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/01_eventmachine_echo_server.rb @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class EchoServer < EM::Connection + def receive_data(data) + send_data(data) + end +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, EchoServer) +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb new file mode 100644 index 0000000..4cfff19 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class EchoServer < EM::Connection + def receive_data(data) + if data.strip =~ /exit$/i + EventMachine.stop + else + send_data(data) + end + end +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, EchoServer) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/03_simple_chat_server.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/03_simple_chat_server.rb new file mode 100644 index 0000000..3352551 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/03_simple_chat_server.rb @@ -0,0 +1,149 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + @@connected_clients = Array.new + DM_REGEXP = /^@([a-zA-Z0-9]+)\s*:?\s*(.+)/.freeze + + attr_reader :username + + + # + # EventMachine handlers + # + + def post_init + @username = nil + + puts "A client has connected..." + ask_username + end + + def unbind + @@connected_clients.delete(self) + puts "[info] #{@username} has left" if entered_username? + end + + def receive_data(data) + if entered_username? + handle_chat_message(data.strip) + else + handle_username(data.strip) + end + end + + + # + # Username handling + # + + def entered_username? + !@username.nil? && !@username.empty? + end # entered_username? + + def handle_username(input) + if input.empty? + send_line("Blank usernames are not allowed. Try again.") + ask_username + else + @username = input + @@connected_clients.push(self) + self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") } + puts "#{@username} has joined" + + self.send_line("[info] Ohai, #{@username}") + end + end # handle_username(input) + + def ask_username + self.send_line("[info] Enter your username:") + end # ask_username + + + # + # Message handling + # + + def handle_chat_message(msg) + if command?(msg) + self.handle_command(msg) + else + if direct_message?(msg) + self.handle_direct_message(msg) + else + self.announce(msg, "#{@username}:") + end + end + end # handle_chat_message(msg) + + def direct_message?(input) + input =~ DM_REGEXP + end # direct_message?(input) + + def handle_direct_message(input) + username, message = parse_direct_message(input) + + if connection = @@connected_clients.find { |c| c.username == username } + puts "[dm] @#{@username} => @#{username}" + connection.send_line("[dm] @#{@username}: #{message}") + else + send_line "@#{username} is not in the room. Here's who is: #{usernames.join(', ')}" + end + end # handle_direct_message(input) + + def parse_direct_message(input) + return [$1, $2] if input =~ DM_REGEXP + end # parse_direct_message(input) + + + # + # Commands handling + # + + def command?(input) + input =~ /(exit|status)$/i + end # command?(input) + + def handle_command(cmd) + case cmd + when /exit$/i then self.close_connection + when /status$/i then self.send_line("[chat server] It's #{Time.now.strftime('%H:%M')} and there are #{self.number_of_connected_clients} people in the room") + end + end # handle_command(cmd) + + + # + # Helpers + # + + def announce(msg = nil, prefix = "[chat server]") + @@connected_clients.each { |c| c.send_line("#{prefix} #{msg}") } unless msg.empty? + end # announce(msg) + + def number_of_connected_clients + @@connected_clients.size + end # number_of_connected_clients + + def other_peers + @@connected_clients.reject { |c| self == c } + end # other_peers + + def send_line(line) + self.send_data("#{line}\n") + end # send_line(line) + + def usernames + @@connected_clients.map { |c| c.username } + end # usernames +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/04_simple_chat_server_step_one.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/04_simple_chat_server_step_one.rb new file mode 100644 index 0000000..bb283a7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/04_simple_chat_server_step_one.rb @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + # + # EventMachine handlers + # + + def post_init + puts "A client has connected..." + end + + def unbind + puts "A client has left..." + end +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/05_simple_chat_server_step_two.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/05_simple_chat_server_step_two.rb new file mode 100644 index 0000000..1361c5d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/05_simple_chat_server_step_two.rb @@ -0,0 +1,43 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + @@connected_clients = Array.new + + + # + # EventMachine handlers + # + + def post_init + @@connected_clients.push(self) + puts "A client has connected..." + end + + def unbind + @@connected_clients.delete(self) + puts "A client has left..." + end + + + + + # + # Helpers + # + + def other_peers + @@connected_clients.reject { |c| self == c } + end # other_peers +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/06_simple_chat_server_step_three.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/06_simple_chat_server_step_three.rb new file mode 100644 index 0000000..d9b85e2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/06_simple_chat_server_step_three.rb @@ -0,0 +1,98 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + @@connected_clients = Array.new + + + attr_reader :username + + + # + # EventMachine handlers + # + + def post_init + @username = nil + + puts "A client has connected..." + ask_username + end + + def unbind + @@connected_clients.delete(self) + puts "A client has left..." + end + + def receive_data(data) + if entered_username? + handle_chat_message(data.strip) + else + handle_username(data.strip) + end + end + + + + + # + # Username handling + # + + def entered_username? + !@username.nil? && !@username.empty? + end # entered_username? + + def handle_username(input) + if input.empty? + send_line("Blank usernames are not allowed. Try again.") + ask_username + else + @username = input + @@connected_clients.push(self) + self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") } + puts "#{@username} has joined" + + self.send_line("[info] Ohai, #{@username}") + end + end # handle_username(input) + + def ask_username + self.send_line("[info] Enter your username:") + end # ask_username + + + + # + # Message handling + # + + def handle_chat_message(msg) + raise NotImplementedError + end + + + + # + # Helpers + # + + def other_peers + @@connected_clients.reject { |c| self == c } + end # other_peers + + def send_line(line) + self.send_data("#{line}\n") + end # send_line(line) +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/07_simple_chat_server_step_four.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/07_simple_chat_server_step_four.rb new file mode 100644 index 0000000..d4948af --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/07_simple_chat_server_step_four.rb @@ -0,0 +1,121 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + @@connected_clients = Array.new + + + attr_reader :username + + + # + # EventMachine handlers + # + + def post_init + @username = nil + + puts "A client has connected..." + ask_username + end + + def unbind + @@connected_clients.delete(self) + puts "[info] #{@username} has left" if entered_username? + end + + def receive_data(data) + if entered_username? + handle_chat_message(data.strip) + else + handle_username(data.strip) + end + end + + + + + # + # Username handling + # + + def entered_username? + !@username.nil? && !@username.empty? + end # entered_username? + + def handle_username(input) + if input.empty? + send_line("Blank usernames are not allowed. Try again.") + ask_username + else + @username = input + @@connected_clients.push(self) + self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") } + puts "#{@username} has joined" + + self.send_line("[info] Ohai, #{@username}") + end + end # handle_username(input) + + def ask_username + self.send_line("[info] Enter your username:") + end # ask_username + + + + # + # Message handling + # + + def handle_chat_message(msg) + if command?(msg) + self.handle_command(msg) + else + self.announce(msg, "#{@username}:") + end + end + + + # + # Commands handling + # + + def command?(input) + input =~ /exit$/i + end # command?(input) + + def handle_command(cmd) + case cmd + when /exit$/i then self.close_connection + end + end # handle_command(cmd) + + + + # + # Helpers + # + + def announce(msg = nil, prefix = "[chat server]") + @@connected_clients.each { |c| c.send_line("#{prefix} #{msg}") } unless msg.empty? + end # announce(msg) + + def other_peers + @@connected_clients.reject { |c| self == c } + end # other_peers + + def send_line(line) + self.send_data("#{line}\n") + end # send_line(line) +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/08_simple_chat_server_step_five.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/08_simple_chat_server_step_five.rb new file mode 100644 index 0000000..03da66b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/guides/getting_started/08_simple_chat_server_step_five.rb @@ -0,0 +1,141 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + @@connected_clients = Array.new + DM_REGEXP = /^@([a-zA-Z0-9]+)\s*:?\s+(.+)/.freeze + + attr_reader :username + + + # + # EventMachine handlers + # + + def post_init + @username = nil + + puts "A client has connected..." + ask_username + end + + def unbind + @@connected_clients.delete(self) + puts "[info] #{@username} has left" if entered_username? + end + + def receive_data(data) + if entered_username? + handle_chat_message(data.strip) + else + handle_username(data.strip) + end + end + + + # + # Username handling + # + + def entered_username? + !@username.nil? && !@username.empty? + end # entered_username? + + def handle_username(input) + if input.empty? + send_line("Blank usernames are not allowed. Try again.") + ask_username + else + @username = input + @@connected_clients.push(self) + self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") } + puts "#{@username} has joined" + + self.send_line("[info] Ohai, #{@username}") + end + end # handle_username(input) + + def ask_username + self.send_line("[info] Enter your username:") + end # ask_username + + + # + # Message handling + # + + def handle_chat_message(msg) + if command?(msg) + self.handle_command(msg) + else + if direct_message?(msg) + self.handle_direct_message(msg) + else + self.announce(msg, "#{@username}:") + end + end + end # handle_chat_message(msg) + + def direct_message?(input) + input =~ DM_REGEXP + end # direct_message?(input) + + def handle_direct_message(input) + username, message = parse_direct_message(input) + + if connection = @@connected_clients.find { |c| c.username == username } + puts "[dm] @#{@username} => @#{username}" + connection.send_line("[dm] @#{@username}: #{message}") + else + send_line "@#{username} is not in the room. Here's who is: #{usernames.join(', ')}" + end + end # handle_direct_message(input) + + def parse_direct_message(input) + return [$1, $2] if input =~ DM_REGEXP + end # parse_direct_message(input) + + + # + # Commands handling + # + + def command?(input) + input =~ /(exit|status)$/i + end # command?(input) + + def handle_command(cmd) + case cmd + when /exit$/i then self.close_connection + when /status$/i then self.send_line("[chat server] It's #{Time.now.strftime('%H:%M')} and there are #{self.number_of_connected_clients} people in the room") + end + end # handle_command(cmd) + + + # + # Helpers + # + + def announce(msg = nil, prefix = "[chat server]") + @@connected_clients.each { |c| c.send_line("#{prefix} #{msg}") } unless msg.empty? + end # announce(msg) + + def other_peers + @@connected_clients.reject { |c| self == c } + end # other_peers + + def send_line(line) + self.send_data("#{line}\n") + end # send_line(line) +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_channel.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_channel.rb new file mode 100644 index 0000000..16e8d08 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_channel.rb @@ -0,0 +1,43 @@ +require File.dirname(__FILE__) + '/helper' + +EM.run do + + # Create a channel to push data to, this could be stocks... + RandChannel = EM::Channel.new + + # The server simply subscribes client connections to the channel on connect, + # and unsubscribes them on disconnect. + class Server < EM::Connection + def self.start(host = '127.0.0.1', port = 8000) + EM.start_server(host, port, self) + end + + def post_init + @sid = RandChannel.subscribe { |m| send_data "#{m.inspect}\n" } + end + + def unbind + RandChannel.unsubscribe @sid + end + end + Server.start + + # Two client connections, that just print what they receive. + 2.times do + EM.connect('127.0.0.1', 8000) do |c| + c.extend EM::P::LineText2 + def c.receive_line(line) + puts "Subscriber: #{signature} got #{line}" + end + EM.add_timer(2) { c.close_connection } + end + end + + # This part of the example is more fake, but imagine sleep was in fact a + # long running calculation to achieve the value. + 40.times do + EM.defer lambda { v = sleep(rand * 2); RandChannel << [Time.now, v] } + end + + EM.add_timer(5) { EM.stop } +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_queue.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_queue.rb new file mode 100644 index 0000000..761ea76 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_queue.rb @@ -0,0 +1,2 @@ +require File.dirname(__FILE__) + '/helper' + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_tick_loop_array.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_tick_loop_array.rb new file mode 100644 index 0000000..81b0ae3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_tick_loop_array.rb @@ -0,0 +1,15 @@ +require File.dirname(__FILE__) + '/helper' + +EM.run do + array = (1..100).to_a + + tickloop = EM.tick_loop do + if array.empty? + :stop + else + puts array.shift + end + end + + tickloop.on_stop { EM.stop } +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_tick_loop_counter.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_tick_loop_counter.rb new file mode 100644 index 0000000..58e51ff --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/ex_tick_loop_counter.rb @@ -0,0 +1,32 @@ +require File.dirname(__FILE__) + '/helper' + +class TickCounter + attr_reader :start_time, :count + + def initialize + reset + @tick_loop = EM.tick_loop(method(:tick)) + end + + def reset + @count = 0 + @start_time = EM.current_time + end + + def tick + @count += 1 + end + + def rate + @count / (EM.current_time - @start_time) + end +end + +period = 5 +EM.run do + counter = TickCounter.new + EM.add_periodic_timer(period) do + puts "Ticks per second: #{counter.rate} (mean of last #{period}s)" + counter.reset + end +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/helper.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/helper.rb new file mode 100644 index 0000000..835ded2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/examples/old/helper.rb @@ -0,0 +1,2 @@ +$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib') +require 'eventmachine' \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/.RUBYARCHDIR.time b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/.RUBYARCHDIR.time new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/Makefile b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/Makefile new file mode 100644 index 0000000..ab491cb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/Makefile @@ -0,0 +1,261 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@:) +ECHO = $(ECHO1:0=@echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 +hdrdir = $(topdir) +arch_hdrdir = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr +rubysitearchprefix = $(rubylibprefix)/$(sitearch) +rubyarchprefix = $(rubylibprefix)/$(arch) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) +sitearchhdrdir = $(sitehdrdir)/$(sitearch) +rubyarchhdrdir = $(rubyhdrdir)/$(arch) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(vendorlibdir)/$(sitearch) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)./.gem.20180108-62297-1bhaize +sitelibdir = $(DESTDIR)./.gem.20180108-62297-1bhaize +sitedir = $(DESTDIR)/Library/Ruby/Site +rubyarchdir = $(rubylibdir)/$(arch) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(DESTDIR)/usr/share/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(DESTDIR)/usr/share/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(DESTDIR)/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk$(prefix)/include +localstatedir = $(prefix)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(DESTDIR)/Library/Ruby/Site +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC = xcrun clang +CXX = xcrun clang++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework CoreFoundation +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = $(optflags) $(debugflags) $(warnflags) +optflags = +debugflags = -g +warnflags = +CCDLFLAGS = +CFLAGS = $(CCDLFLAGS) -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -DHAVE_OPENSSL_SSL_H -DHAVE_OPENSSL_ERR_H -DWITH_SSL -DBUILD_FOR_RUBY -DHAVE_RB_THREAD_CALL_WITHOUT_GVL -DHAVE_RB_THREAD_FD_SELECT -DHAVE_TYPE_RB_FDSET_T -DHAVE_RB_WAIT_FOR_SINGLE_FD -DHAVE_RB_TIME_NEW -DHAVE_WRITEV -DOS_UNIX -DHAVE_SYS_EVENT_H -DHAVE_SYS_QUEUE_H -DHAVE_KQUEUE -DOS_DARWIN -DHAVE_CLOCK_GETTIME -DHAVE_CONST_CLOCK_MONOTONIC_RAW -DHAVE_CONST_CLOCK_MONOTONIC -DHAVE_MAKE_PAIR -I/usr/local/opt/openssl/include -I/opt/local/include -I/usr/local/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) -g -Os -pipe $(ARCH_FLAG) +ldflags = -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib +dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress +ARCH_FLAG = -arch x86_64 -arch i386 +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CXX) -dynamic -bundle +LDSHAREDXX = $(CXX) -dynamic -bundle +AR = ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) +RUBY_SO_NAME = ruby.2.3.0 +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = universal-darwin17 +sitearch = $(arch) +ruby_version = 2.3.0 +ruby = $(bindir)/$(RUBY_BASE_NAME) +RUBY = $(ruby) +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = $(RUBY) -run -e rm -- -rf +RMDIRS = rmdir -p +MAKEDIRS = mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = + +libpath = . $(libdir) /usr/local/opt/openssl/lib /opt/local/lib /usr/local/lib +LIBPATH = -L. -L$(libdir) -L/usr/local/opt/openssl/lib -L/opt/local/lib -L/usr/local/lib +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lcrypto -lssl -lpthread -ldl -lobjc +ORIG_SRCS = page.cpp pipe.cpp binder.cpp rubymain.cpp ssl.cpp ed.cpp cmain.cpp em.cpp kb.cpp +SRCS = $(ORIG_SRCS) +OBJS = page.o pipe.o binder.o rubymain.o ssl.o ed.o cmain.o em.o kb.o +HDRS = $(srcdir)/page.h $(srcdir)/binder.h $(srcdir)/ssl.h $(srcdir)/em.h $(srcdir)/project.h $(srcdir)/eventmachine.h $(srcdir)/ed.h +TARGET = rubyeventmachine +TARGET_NAME = rubyeventmachine +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).bundle +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) +ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) + +TARGET_SO = $(DLLIB) +CLEANLIBS = $(TARGET).bundle +CLEANOBJS = *.o *.bak + +all: $(DLLIB) +static: $(STATIC_LIB) install-rb +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TIMESTAMP_DIR)/.RUBYARCHDIR.time + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb install-rb-default +install-rb-default: pre-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +pre-install-rb-default: + @$(NULLCMD) +$(TIMESTAMP_DIR)/.RUBYARCHDIR.time: + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $< + +$(DLLIB): $(OBJS) Makefile + $(ECHO) linking shared-object $(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHAREDXX) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + $(Q) $(POSTLINK) + + + +$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/binder.cpp b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/binder.cpp new file mode 100644 index 0000000..bdce055 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/binder.cpp @@ -0,0 +1,124 @@ +/***************************************************************************** + +$Id$ + +File: binder.cpp +Date: 07Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#include "project.h" + +#define DEV_URANDOM "/dev/urandom" + + +map Bindable_t::BindingBag; + + +/******************************** +STATIC Bindable_t::CreateBinding +********************************/ + +uintptr_t Bindable_t::CreateBinding() +{ + static uintptr_t num = 0; + while(BindingBag[++num]) {} + return num; +} + +#if 0 +string Bindable_t::CreateBinding() +{ + static int index = 0; + static string seed; + + if ((index >= 1000000) || (seed.length() == 0)) { + #ifdef OS_UNIX + int fd = open (DEV_URANDOM, O_RDONLY); + if (fd < 0) + throw std::runtime_error ("No entropy device"); + + unsigned char u[16]; + size_t r = read (fd, u, sizeof(u)); + if (r < sizeof(u)) + throw std::runtime_error ("Unable to read entropy device"); + + unsigned char *u1 = (unsigned char*)u; + char u2 [sizeof(u) * 2 + 1]; + + for (size_t i=0; i < sizeof(u); i++) + sprintf (u2 + (i * 2), "%02x", u1[i]); + + seed = string (u2); + #endif + + + #ifdef OS_WIN32 + UUID uuid; + UuidCreate (&uuid); + unsigned char *uuidstring = NULL; + UuidToString (&uuid, &uuidstring); + if (!uuidstring) + throw std::runtime_error ("Unable to read uuid"); + seed = string ((const char*)uuidstring); + + RpcStringFree (&uuidstring); + #endif + + index = 0; + + + } + + stringstream ss; + ss << seed << (++index); + return ss.str(); +} +#endif + +/***************************** +STATIC: Bindable_t::GetObject +*****************************/ + +Bindable_t *Bindable_t::GetObject (const uintptr_t binding) +{ + map::const_iterator i = BindingBag.find (binding); + if (i != BindingBag.end()) + return i->second; + else + return NULL; +} + + +/********************** +Bindable_t::Bindable_t +**********************/ + +Bindable_t::Bindable_t() +{ + Binding = Bindable_t::CreateBinding(); + BindingBag [Binding] = this; +} + + + +/*********************** +Bindable_t::~Bindable_t +***********************/ + +Bindable_t::~Bindable_t() NO_EXCEPT_FALSE +{ + BindingBag.erase (Binding); +} + + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/binder.h b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/binder.h new file mode 100644 index 0000000..203bc90 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/binder.h @@ -0,0 +1,52 @@ +/***************************************************************************** + +$Id$ + +File: binder.h +Date: 07Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#ifndef __ObjectBindings__H_ +#define __ObjectBindings__H_ + + +#if __cplusplus >= 201103L +#define NO_EXCEPT_FALSE noexcept(false) +#else +#define NO_EXCEPT_FALSE +#endif + +class Bindable_t +{ + public: + static uintptr_t CreateBinding(); + static Bindable_t *GetObject (const uintptr_t); + static map BindingBag; + + public: + Bindable_t(); + virtual ~Bindable_t() NO_EXCEPT_FALSE; + + const uintptr_t GetBinding() {return Binding;} + + private: + uintptr_t Binding; +}; + + + + + +#endif // __ObjectBindings__H_ + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/binder.o b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/binder.o new file mode 100644 index 0000000000000000000000000000000000000000..10f7426c7c13d23019047c3c76c9be806869b569 GIT binary patch literal 294856 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 z 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 i`MglI_y{vGz|K)Mn5|%)@M>oQ?@c#f!;PVXt literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/cmain.cpp b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/cmain.cpp new file mode 100644 index 0000000..f58c2cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/cmain.cpp @@ -0,0 +1,988 @@ +/***************************************************************************** + +$Id$ + +File: cmain.cpp +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#include "project.h" + +/* 21Sep09: ruby 1.9 defines macros for common i/o functions that point to rb_w32_* implementations. + We need to undef the stat to fix a build failure in evma_send_file_data_to_connection. + See http://groups.google.com/group/eventmachine/browse_thread/thread/fc60d9bb738ffc71 +*/ +#if defined(BUILD_FOR_RUBY) && defined(OS_WIN32) +#undef stat +#undef fstat +#endif + +static EventMachine_t *EventMachine; +static Poller_t Poller = Poller_Default; + +extern "C" void ensure_eventmachine (const char *caller = "unknown caller") +{ + if (!EventMachine) { + const int err_size = 128; + char err_string[err_size]; + snprintf (err_string, err_size, "eventmachine not initialized: %s", caller); + #ifdef BUILD_FOR_RUBY + rb_raise(rb_eRuntimeError, "%s", err_string); + #else + throw std::runtime_error (err_string); + #endif + } +} + +/*********************** +evma_initialize_library +***********************/ + +extern "C" void evma_initialize_library (EMCallback cb) +{ + if (EventMachine) + #ifdef BUILD_FOR_RUBY + rb_raise(rb_eRuntimeError, "eventmachine already initialized: evma_initialize_library"); + #else + throw std::runtime_error ("eventmachine already initialized: evma_initialize_library"); + #endif + + EventMachine = new EventMachine_t (cb, Poller); +} + + +/******************** +evma_release_library +********************/ + +extern "C" void evma_release_library() +{ + ensure_eventmachine("evma_release_library"); + delete EventMachine; + EventMachine = NULL; +} + + +/********************* +evma_run_machine_once +*********************/ + +extern "C" bool evma_run_machine_once() +{ + ensure_eventmachine("evma_run_machine_once"); + return EventMachine->RunOnce(); +} + + +/**************** +evma_run_machine +****************/ + +extern "C" void evma_run_machine() +{ + ensure_eventmachine("evma_run_machine"); + EventMachine->Run(); +} + + +/************************** +evma_install_oneshot_timer +**************************/ + +extern "C" const uintptr_t evma_install_oneshot_timer (uint64_t milliseconds) +{ + ensure_eventmachine("evma_install_oneshot_timer"); + return EventMachine->InstallOneshotTimer (milliseconds); +} + + +/********************** +evma_connect_to_server +**********************/ + +extern "C" const uintptr_t evma_connect_to_server (const char *bind_addr, int bind_port, const char *server, int port) +{ + ensure_eventmachine("evma_connect_to_server"); + return EventMachine->ConnectToServer (bind_addr, bind_port, server, port); +} + +/*************************** +evma_connect_to_unix_server +***************************/ + +extern "C" const uintptr_t evma_connect_to_unix_server (const char *server) +{ + ensure_eventmachine("evma_connect_to_unix_server"); + return EventMachine->ConnectToUnixServer (server); +} + +/************** +evma_attach_fd +**************/ + +extern "C" const uintptr_t evma_attach_fd (int file_descriptor, int watch_mode) +{ + ensure_eventmachine("evma_attach_fd"); + return EventMachine->AttachFD (file_descriptor, watch_mode ? true : false); +} + +/************** +evma_detach_fd +**************/ + +extern "C" int evma_detach_fd (const uintptr_t binding) +{ + ensure_eventmachine("evma_detach_fd"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + return EventMachine->DetachFD (ed); + else + #ifdef BUILD_FOR_RUBY + rb_raise(rb_eRuntimeError, "invalid binding to detach"); + #else + throw std::runtime_error ("invalid binding to detach"); + #endif + return -1; +} + +/************************ +evma_get_file_descriptor +************************/ + +extern "C" int evma_get_file_descriptor (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_file_descriptor"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetSocket(); + else + #ifdef BUILD_FOR_RUBY + rb_raise(rb_eRuntimeError, "invalid binding to get_fd"); + #else + throw std::runtime_error ("invalid binding to get_fd"); + #endif + return -1; +} + +/*********************** +evma_is_notify_readable +***********************/ + +extern "C" int evma_is_notify_readable (const uintptr_t binding) +{ + ConnectionDescriptor *cd = dynamic_cast (Bindable_t::GetObject (binding)); + if (cd) + return cd->IsNotifyReadable() ? 1 : 0; + return -1; +} + +/************************ +evma_set_notify_readable +************************/ + +extern "C" void evma_set_notify_readable (const uintptr_t binding, int mode) +{ + ConnectionDescriptor *cd = dynamic_cast (Bindable_t::GetObject (binding)); + if (cd) + cd->SetNotifyReadable (mode ? true : false); +} + +/*********************** +evma_is_notify_writable +***********************/ + +extern "C" int evma_is_notify_writable (const uintptr_t binding) +{ + ConnectionDescriptor *cd = dynamic_cast (Bindable_t::GetObject (binding)); + if (cd) + return cd->IsNotifyWritable() ? 1 : 0; + return -1; +} + +/************************ +evma_set_notify_writable +************************/ + +extern "C" void evma_set_notify_writable (const uintptr_t binding, int mode) +{ + ConnectionDescriptor *cd = dynamic_cast (Bindable_t::GetObject (binding)); + if (cd) + cd->SetNotifyWritable (mode ? true : false); +} + +/********** +evma_pause +**********/ + +extern "C" int evma_pause (const uintptr_t binding) +{ + EventableDescriptor *cd = dynamic_cast (Bindable_t::GetObject (binding)); + if (cd) + return cd->Pause() ? 1 : 0; + + return 0; +} + +/*********** +evma_resume +***********/ + +extern "C" int evma_resume (const uintptr_t binding) +{ + EventableDescriptor *cd = dynamic_cast (Bindable_t::GetObject (binding)); + if (cd) + return cd->Resume() ? 1 : 0; + + return 0; +} + +/************** +evma_is_paused +**************/ + +extern "C" int evma_is_paused (const uintptr_t binding) +{ + EventableDescriptor *cd = dynamic_cast (Bindable_t::GetObject (binding)); + if (cd) + return cd->IsPaused() ? 1 : 0; + + return 0; +} + +/************************ +evma_num_close_scheduled +************************/ + +extern "C" int evma_num_close_scheduled () +{ + ensure_eventmachine("evma_num_close_scheduled"); + return EventMachine->NumCloseScheduled; +} + +/********************** +evma_create_tcp_server +**********************/ + +extern "C" const uintptr_t evma_create_tcp_server (const char *address, int port) +{ + ensure_eventmachine("evma_create_tcp_server"); + return EventMachine->CreateTcpServer (address, port); +} + +/****************************** +evma_create_unix_domain_server +******************************/ + +extern "C" const uintptr_t evma_create_unix_domain_server (const char *filename) +{ + ensure_eventmachine("evma_create_unix_domain_server"); + return EventMachine->CreateUnixDomainServer (filename); +} + +/*********************** +evma_attach_sd +************************/ + +extern "C" const uintptr_t evma_attach_sd (int sd) +{ + ensure_eventmachine("evma_attach_sd"); + return EventMachine->AttachSD (sd); +} + +/************************* +evma_open_datagram_socket +*************************/ + +extern "C" const uintptr_t evma_open_datagram_socket (const char *address, int port) +{ + ensure_eventmachine("evma_open_datagram_socket"); + return EventMachine->OpenDatagramSocket (address, port); +} + +/****************** +evma_open_keyboard +******************/ + +extern "C" const uintptr_t evma_open_keyboard() +{ + ensure_eventmachine("evma_open_keyboard"); + return EventMachine->OpenKeyboard(); +} + +/******************* +evma_watch_filename +*******************/ + +extern "C" const uintptr_t evma_watch_filename (const char *fname) +{ + ensure_eventmachine("evma_watch_filename"); + return EventMachine->WatchFile(fname); +} + +/********************* +evma_unwatch_filename +*********************/ + +extern "C" void evma_unwatch_filename (const uintptr_t sig) +{ + ensure_eventmachine("evma_unwatch_file"); + EventMachine->UnwatchFile(sig); +} + +/************** +evma_watch_pid +**************/ + +extern "C" const uintptr_t evma_watch_pid (int pid) +{ + ensure_eventmachine("evma_watch_pid"); + return EventMachine->WatchPid(pid); +} + +/**************** +evma_unwatch_pid +****************/ + +extern "C" void evma_unwatch_pid (const uintptr_t sig) +{ + ensure_eventmachine("evma_unwatch_pid"); + EventMachine->UnwatchPid(sig); +} + +/**************************** +evma_send_data_to_connection +****************************/ + +extern "C" int evma_send_data_to_connection (const uintptr_t binding, const char *data, int data_length) +{ + ensure_eventmachine("evma_send_data_to_connection"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + return ed->SendOutboundData(data, data_length); + return -1; +} + +/****************** +evma_send_datagram +******************/ + +extern "C" int evma_send_datagram (const uintptr_t binding, const char *data, int data_length, const char *address, int port) +{ + ensure_eventmachine("evma_send_datagram"); + DatagramDescriptor *dd = dynamic_cast (Bindable_t::GetObject (binding)); + if (dd) + return dd->SendOutboundDatagram(data, data_length, address, port); + return -1; +} + + +/********************* +evma_close_connection +*********************/ + +extern "C" void evma_close_connection (const uintptr_t binding, int after_writing) +{ + ensure_eventmachine("evma_close_connection"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + ed->ScheduleClose (after_writing ? true : false); +} + +/*********************************** +evma_report_connection_error_status +***********************************/ + +extern "C" int evma_report_connection_error_status (const uintptr_t binding) +{ + ensure_eventmachine("evma_report_connection_error_status"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + return ed->ReportErrorStatus(); + return -1; +} + +/******************** +evma_stop_tcp_server +********************/ + +extern "C" void evma_stop_tcp_server (const uintptr_t binding) +{ + ensure_eventmachine("evma_stop_tcp_server"); + AcceptorDescriptor::StopAcceptor (binding); +} + + +/***************** +evma_stop_machine +*****************/ + +extern "C" void evma_stop_machine() +{ + ensure_eventmachine("evma_stop_machine"); + EventMachine->ScheduleHalt(); +} + +/***************** +evma_stopping +*****************/ + +extern "C" bool evma_stopping() +{ + ensure_eventmachine("evma_stopping"); + return EventMachine->Stopping(); +} + +/************** +evma_start_tls +**************/ + +extern "C" void evma_start_tls (const uintptr_t binding) +{ + ensure_eventmachine("evma_start_tls"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + ed->StartTls(); +} + +/****************** +evma_set_tls_parms +******************/ + +extern "C" void evma_set_tls_parms (const uintptr_t binding, const char *privatekey_filename, const char *certchain_filename, int verify_peer, int fail_if_no_peer_cert, const char *sni_hostname, const char *cipherlist, const char *ecdh_curve, const char *dhparam, int ssl_version) +{ + ensure_eventmachine("evma_set_tls_parms"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + ed->SetTlsParms (privatekey_filename, certchain_filename, (verify_peer == 1 ? true : false), (fail_if_no_peer_cert == 1 ? true : false), sni_hostname, cipherlist, ecdh_curve, dhparam, ssl_version); +} + +/****************** +evma_get_peer_cert +******************/ + +#ifdef WITH_SSL +extern "C" X509 *evma_get_peer_cert (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_peer_cert"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetPeerCert(); + return NULL; +} +#endif + +/****************** +evma_get_cipher_bits +******************/ + +#ifdef WITH_SSL +extern "C" int evma_get_cipher_bits (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_cipher_bits"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetCipherBits(); + return -1; +} +#endif + +/****************** +evma_get_cipher_name +******************/ + +#ifdef WITH_SSL +extern "C" const char *evma_get_cipher_name (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_cipher_name"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetCipherName(); + return NULL; +} +#endif + +/****************** +evma_get_cipher_protocol +******************/ + +#ifdef WITH_SSL +extern "C" const char *evma_get_cipher_protocol (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_cipher_protocol"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetCipherProtocol(); + return NULL; +} +#endif + +/****************** +evma_get_sni_hostname +******************/ + +#ifdef WITH_SSL +extern "C" const char *evma_get_sni_hostname (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_sni_hostname"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetSNIHostname(); + return NULL; +} +#endif + +/******************** +evma_accept_ssl_peer +********************/ + +#ifdef WITH_SSL +extern "C" void evma_accept_ssl_peer (const uintptr_t binding) +{ + ensure_eventmachine("evma_accept_ssl_peer"); + ConnectionDescriptor *cd = dynamic_cast (Bindable_t::GetObject (binding)); + if (cd) + cd->AcceptSslPeer(); +} +#endif + +/***************** +evma_get_peername +*****************/ + +extern "C" int evma_get_peername (const uintptr_t binding, struct sockaddr *sa, socklen_t *len) +{ + ensure_eventmachine("evma_get_peername"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) { + return ed->GetPeername (sa, len) ? 1 : 0; + } + else + return 0; +} + +/***************** +evma_get_sockname +*****************/ + +extern "C" int evma_get_sockname (const uintptr_t binding, struct sockaddr *sa, socklen_t *len) +{ + ensure_eventmachine("evma_get_sockname"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) { + return ed->GetSockname (sa, len) ? 1 : 0; + } + else + return 0; +} + +/*********************** +evma_get_subprocess_pid +***********************/ + +#ifdef OS_UNIX +extern "C" int evma_get_subprocess_pid (const uintptr_t binding, pid_t *pid) +{ + ensure_eventmachine("evma_get_subprocess_pid"); + PipeDescriptor *pd = dynamic_cast (Bindable_t::GetObject (binding)); + if (pd) { + return pd->GetSubprocessPid (pid) ? 1 : 0; + } + else if (pid && EventMachine->SubprocessPid) { + *pid = EventMachine->SubprocessPid; + return 1; + } + else + return 0; +} +#else +extern "C" int evma_get_subprocess_pid (const uintptr_t binding UNUSED, pid_t *pid UNUSED) +{ + return 0; +} +#endif + +/************************** +evma_get_subprocess_status +**************************/ + +extern "C" int evma_get_subprocess_status (const uintptr_t binding UNUSED, int *status) +{ + ensure_eventmachine("evma_get_subprocess_status"); + if (status) { + *status = EventMachine->SubprocessExitStatus; + return 1; + } + else + return 0; +} + +/************************* +evma_get_connection_count +*************************/ + +extern "C" int evma_get_connection_count() +{ + ensure_eventmachine("evma_get_connection_count"); + return EventMachine->GetConnectionCount(); +} + +/********************* +evma_signal_loopbreak +*********************/ + +extern "C" void evma_signal_loopbreak() +{ + ensure_eventmachine("evma_signal_loopbreak"); + EventMachine->SignalLoopBreaker(); +} + + + +/******************************** +evma_get_comm_inactivity_timeout +********************************/ + +extern "C" float evma_get_comm_inactivity_timeout (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_comm_inactivity_timeout"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) { + return ((float)ed->GetCommInactivityTimeout() / 1000); + } + else + return 0.0; //Perhaps this should be an exception. Access to an unknown binding. +} + +/******************************** +evma_set_comm_inactivity_timeout +********************************/ + +extern "C" int evma_set_comm_inactivity_timeout (const uintptr_t binding, float value) +{ + ensure_eventmachine("evma_set_comm_inactivity_timeout"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) { + return ed->SetCommInactivityTimeout ((uint64_t)(value * 1000)); + } + else + return 0; //Perhaps this should be an exception. Access to an unknown binding. +} + + +/******************************** +evma_get_pending_connect_timeout +********************************/ + +extern "C" float evma_get_pending_connect_timeout (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_pending_connect_timeout"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) { + return ((float)ed->GetPendingConnectTimeout() / 1000); + } + else + return 0.0; +} + + +/******************************** +evma_set_pending_connect_timeout +********************************/ + +extern "C" int evma_set_pending_connect_timeout (const uintptr_t binding, float value) +{ + ensure_eventmachine("evma_set_pending_connect_timeout"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + if (ed) { + return ed->SetPendingConnectTimeout ((uint64_t)(value * 1000)); + } + else + return 0; +} + + +/********************** +evma_set_timer_quantum +**********************/ + +extern "C" void evma_set_timer_quantum (int interval) +{ + ensure_eventmachine("evma_set_timer_quantum"); + EventMachine->SetTimerQuantum (interval); +} + + +/************************ +evma_get_max_timer_count +************************/ + +extern "C" int evma_get_max_timer_count() +{ + return EventMachine_t::GetMaxTimerCount(); +} + +/************************ +evma_set_max_timer_count +************************/ + +extern "C" void evma_set_max_timer_count (int ct) +{ + // This may only be called if the reactor is not running. + + if (EventMachine) + #ifdef BUILD_FOR_RUBY + rb_raise(rb_eRuntimeError, "eventmachine already initialized: evma_set_max_timer_count"); + #else + throw std::runtime_error ("eventmachine already initialized: evma_set_max_timer_count"); + #endif + EventMachine_t::SetMaxTimerCount (ct); +} + +/****************** +evma_get/set_simultaneous_accept_count +******************/ + +extern "C" void evma_set_simultaneous_accept_count (int count) +{ + EventMachine_t::SetSimultaneousAcceptCount(count); +} + +extern "C" int evma_get_simultaneous_accept_count() +{ + return EventMachine_t::GetSimultaneousAcceptCount(); +} + + +/****************** +evma_setuid_string +******************/ + +extern "C" void evma_setuid_string (const char *username) +{ + // We do NOT need to be running an EM instance because this method is static. + EventMachine_t::SetuidString (username); +} + + +/********** +evma_popen +**********/ + +extern "C" const uintptr_t evma_popen (char * const*cmd_strings) +{ + ensure_eventmachine("evma_popen"); + return EventMachine->Socketpair (cmd_strings); +} + + +/*************************** +evma_get_outbound_data_size +***************************/ + +extern "C" int evma_get_outbound_data_size (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_outbound_data_size"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (binding)); + return ed ? ed->GetOutboundDataSize() : 0; +} + + +/************** +evma_set_epoll +**************/ + +extern "C" void evma_set_epoll (int use) +{ + if (use) + Poller = Poller_Epoll; + else + Poller = Poller_Default; +} + +/*************** +evma_set_kqueue +***************/ + +extern "C" void evma_set_kqueue (int use) +{ + if (use) + Poller = Poller_Kqueue; + else + Poller = Poller_Default; +} + + +/********************** +evma_set_rlimit_nofile +**********************/ + +extern "C" int evma_set_rlimit_nofile (int nofiles) +{ + return EventMachine_t::SetRlimitNofile (nofiles); +} + + +/********************************* +evma_send_file_data_to_connection +*********************************/ + +extern "C" int evma_send_file_data_to_connection (const uintptr_t binding, const char *filename) +{ + /* This is a sugaring over send_data_to_connection that reads a file into a + * locally-allocated buffer, and sends the file data to the remote peer. + * Return the number of bytes written to the caller. + * TODO, needs to impose a limit on the file size. This is intended only for + * small files. (I don't know, maybe 8K or less.) For larger files, use interleaved + * I/O to avoid slowing the rest of the system down. + * TODO: we should return a code rather than barf, in case of file-not-found. + * TODO, does this compile on Windows? + * TODO, given that we want this to work only with small files, how about allocating + * the buffer on the stack rather than the heap? + * + * Modified 25Jul07. This now returns -1 on file-too-large; 0 for success, and a positive + * errno in case of other errors. + * + * Contributed by Kirk Haines. + */ + + char data[32*1024]; + int r; + + ensure_eventmachine("evma_send_file_data_to_connection"); + +#if defined(OS_WIN32) + int Fd = open (filename, O_RDONLY|O_BINARY); +#else + int Fd = open (filename, O_RDONLY); +#endif + if (Fd < 0) + return errno; + // From here on, all early returns MUST close Fd. + + struct stat st; + if (fstat (Fd, &st)) { + int e = errno; + close (Fd); + return e; + } + + off_t filesize = st.st_size; + if (filesize <= 0) { + close (Fd); + return 0; + } + else if (filesize > (off_t) sizeof(data)) { + close (Fd); + return -1; + } + + r = read (Fd, data, filesize); + if (r != filesize) { + int e = errno; + close (Fd); + return e; + } + evma_send_data_to_connection (binding, data, r); + close (Fd); + + return 0; +} + + +/**************** +evma_start_proxy +*****************/ + +extern "C" void evma_start_proxy (const uintptr_t from, const uintptr_t to, const unsigned long bufsize, const unsigned long length) +{ + ensure_eventmachine("evma_start_proxy"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (from)); + if (ed) + ed->StartProxy(to, bufsize, length); +} + + +/*************** +evma_stop_proxy +****************/ + +extern "C" void evma_stop_proxy (const uintptr_t from) +{ + ensure_eventmachine("evma_stop_proxy"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (from)); + if (ed) + ed->StopProxy(); +} + +/****************** +evma_proxied_bytes +*******************/ + +extern "C" unsigned long evma_proxied_bytes (const uintptr_t from) +{ + ensure_eventmachine("evma_proxied_bytes"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (from)); + if (ed) + return ed->GetProxiedBytes(); + else + return 0; +} + + +/*************************** +evma_get_last_activity_time +****************************/ + +extern "C" uint64_t evma_get_last_activity_time(const uintptr_t from) +{ + ensure_eventmachine("evma_get_last_activity_time"); + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (from)); + if (ed) + return ed->GetLastActivity(); + else + return 0; +} + + +/*************************** +evma_get_heartbeat_interval +****************************/ + +extern "C" float evma_get_heartbeat_interval() +{ + ensure_eventmachine("evma_get_heartbeat_interval"); + return EventMachine->GetHeartbeatInterval(); +} + + +/*************************** +evma_set_heartbeat_interval +****************************/ + +extern "C" int evma_set_heartbeat_interval(float interval) +{ + ensure_eventmachine("evma_set_heartbeat_interval"); + return EventMachine->SetHeartbeatInterval(interval); +} + + +/************************** +evma_get_current_loop_time +***************************/ + +extern "C" uint64_t evma_get_current_loop_time() +{ + ensure_eventmachine("evma_get_current_loop_time"); + return EventMachine->GetCurrentLoopTime(); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/cmain.o b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/cmain.o new file mode 100644 index 0000000000000000000000000000000000000000..5fbde21b54ca668a1063cb191976536e57c66337 GIT binary patch literal 831492 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�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 z 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 YaMwM2^k@vKbRX>zq|5ls2)gI|e=meQzW@LL literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ed.cpp b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ed.cpp new file mode 100644 index 0000000..6542bec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ed.cpp @@ -0,0 +1,2096 @@ +/***************************************************************************** + +$Id$ + +File: ed.cpp +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#include "project.h" + + + +/******************** +SetSocketNonblocking +********************/ + +bool SetSocketNonblocking (SOCKET sd) +{ + #ifdef OS_UNIX + int val = fcntl (sd, F_GETFL, 0); + return (fcntl (sd, F_SETFL, val | O_NONBLOCK) != SOCKET_ERROR) ? true : false; + #endif + + #ifdef OS_WIN32 + #ifdef BUILD_FOR_RUBY + // 14Jun09 Ruby provides its own wrappers for ioctlsocket. On 1.8 this is a simple wrapper, + // however, 1.9 keeps its own state about the socket. + // NOTE: F_GETFL is not supported + return (fcntl (sd, F_SETFL, O_NONBLOCK) == 0) ? true : false; + #else + unsigned long one = 1; + return (ioctlsocket (sd, FIONBIO, &one) == 0) ? true : false; + #endif + #endif +} + +/************ +SetFdCloexec +************/ + +#ifdef OS_UNIX +bool SetFdCloexec (int fd) +{ + int flags = fcntl(fd, F_GETFD, 0); + assert (flags >= 0); + flags |= FD_CLOEXEC; + return (fcntl(fd, F_SETFD, FD_CLOEXEC) == 0) ? true : false; +} +#else +bool SetFdCloexec (int fd UNUSED) +{ + return true; +} +#endif + +/**************************************** +EventableDescriptor::EventableDescriptor +****************************************/ + +EventableDescriptor::EventableDescriptor (SOCKET sd, EventMachine_t *em): + bCloseNow (false), + bCloseAfterWriting (false), + MySocket (sd), + bAttached (false), + bWatchOnly (false), + EventCallback (NULL), + bCallbackUnbind (true), + UnbindReasonCode (0), + ProxyTarget(NULL), + ProxiedFrom(NULL), + ProxiedBytes(0), + MaxOutboundBufSize(0), + MyEventMachine (em), + PendingConnectTimeout(20000000), + InactivityTimeout (0), + NextHeartbeat (0), + bPaused (false) +{ + /* There are three ways to close a socket, all of which should + * automatically signal to the event machine that this object + * should be removed from the polling scheduler. + * First is a hard close, intended for bad errors or possible + * security violations. It immediately closes the connection + * and puts this object into an error state. + * Second is to set bCloseNow, which will cause the event machine + * to delete this object (and thus close the connection in our + * destructor) the next chance it gets. bCloseNow also inhibits + * the writing of new data on the socket (but not necessarily + * the reading of new data). + * The third way is to set bCloseAfterWriting, which inhibits + * the writing of new data and converts to bCloseNow as soon + * as everything in the outbound queue has been written. + * bCloseAfterWriting is really for use only by protocol handlers + * (for example, HTTP writes an HTML page and then closes the + * connection). All of the error states we generate internally + * cause an immediate close to be scheduled, which may have the + * effect of discarding outbound data. + */ + + if (sd == INVALID_SOCKET) + throw std::runtime_error ("bad eventable descriptor"); + if (MyEventMachine == NULL) + throw std::runtime_error ("bad em in eventable descriptor"); + CreatedAt = MyEventMachine->GetCurrentLoopTime(); + LastActivity = MyEventMachine->GetCurrentLoopTime(); + + #ifdef HAVE_EPOLL + EpollEvent.events = 0; + EpollEvent.data.ptr = this; + #endif +} + + +/***************************************** +EventableDescriptor::~EventableDescriptor +*****************************************/ + +EventableDescriptor::~EventableDescriptor() NO_EXCEPT_FALSE +{ + if (NextHeartbeat) + MyEventMachine->ClearHeartbeat(NextHeartbeat, this); + if (EventCallback && bCallbackUnbind) + (*EventCallback)(GetBinding(), EM_CONNECTION_UNBOUND, NULL, UnbindReasonCode); + if (ProxiedFrom) { + (*EventCallback)(ProxiedFrom->GetBinding(), EM_PROXY_TARGET_UNBOUND, NULL, 0); + ProxiedFrom->StopProxy(); + } + MyEventMachine->NumCloseScheduled--; + StopProxy(); + Close(); +} + + +/************************************* +EventableDescriptor::SetEventCallback +*************************************/ + +void EventableDescriptor::SetEventCallback (EMCallback cb) +{ + EventCallback = cb; +} + + +/************************** +EventableDescriptor::Close +**************************/ + +void EventableDescriptor::Close() +{ + /* EventMachine relies on the fact that when close(fd) + * is called that the fd is removed from any + * epoll event queues. + * + * However, this is not *always* the behavior of close(fd) + * + * See man 4 epoll Q6/A6 and then consider what happens + * when using pipes with eventmachine. + * (As is often done when communicating with a subprocess) + * + * The pipes end up looking like: + * + * ls -l /proc//fd + * ... + * lr-x------ 1 root root 64 2011-08-19 21:31 3 -> pipe:[940970] + * l-wx------ 1 root root 64 2011-08-19 21:31 4 -> pipe:[940970] + * + * This meets the critera from man 4 epoll Q6/A4 for not + * removing fds from epoll event queues until all fds + * that reference the underlying file have been removed. + * + * If the EventableDescriptor associated with fd 3 is deleted, + * its dtor will call EventableDescriptor::Close(), + * which will call ::close(int fd). + * + * However, unless the EventableDescriptor associated with fd 4 is + * also deleted before the next call to epoll_wait, events may fire + * for fd 3 that were registered with an already deleted + * EventableDescriptor. + * + * Therefore, it is necessary to notify EventMachine that + * the fd associated with this EventableDescriptor is + * closing. + * + * EventMachine also never closes fds for STDIN, STDOUT and + * STDERR (0, 1 & 2) + */ + + // Close the socket right now. Intended for emergencies. + if (MySocket != INVALID_SOCKET) { + MyEventMachine->Deregister (this); + + // Do not close STDIN, STDOUT, STDERR + if (MySocket > 2 && !bAttached) { + shutdown (MySocket, 1); + close (MySocket); + } + + MySocket = INVALID_SOCKET; + } +} + + +/********************************* +EventableDescriptor::ShouldDelete +*********************************/ + +bool EventableDescriptor::ShouldDelete() +{ + /* For use by a socket manager, which needs to know if this object + * should be removed from scheduling events and deleted. + * Has an immediate close been scheduled, or are we already closed? + * If either of these are the case, return true. In theory, the manager will + * then delete us, which in turn will make sure the socket is closed. + * Note, if bCloseAfterWriting is true, we check a virtual method to see + * if there is outbound data to write, and only request a close if there is none. + */ + + return ((MySocket == INVALID_SOCKET) || bCloseNow || (bCloseAfterWriting && (GetOutboundDataSize() <= 0))); +} + + +/********************************** +EventableDescriptor::ScheduleClose +**********************************/ + +void EventableDescriptor::ScheduleClose (bool after_writing) +{ + if (IsCloseScheduled()) { + if (!after_writing) { + // If closing has become more urgent, then upgrade the scheduled + // after_writing close to one NOW. + bCloseNow = true; + } + return; + } + MyEventMachine->NumCloseScheduled++; + // KEEP THIS SYNCHRONIZED WITH ::IsCloseScheduled. + if (after_writing) + bCloseAfterWriting = true; + else + bCloseNow = true; +} + + +/************************************* +EventableDescriptor::IsCloseScheduled +*************************************/ + +bool EventableDescriptor::IsCloseScheduled() +{ + // KEEP THIS SYNCHRONIZED WITH ::ScheduleClose. + return (bCloseNow || bCloseAfterWriting); +} + + +/******************************* +EventableDescriptor::StartProxy +*******************************/ + +void EventableDescriptor::StartProxy(const uintptr_t to, const unsigned long bufsize, const unsigned long length) +{ + EventableDescriptor *ed = dynamic_cast (Bindable_t::GetObject (to)); + if (ed) { + StopProxy(); + ProxyTarget = ed; + BytesToProxy = length; + ProxiedBytes = 0; + ed->SetProxiedFrom(this, bufsize); + return; + } + throw std::runtime_error ("Tried to proxy to an invalid descriptor"); +} + + +/****************************** +EventableDescriptor::StopProxy +******************************/ + +void EventableDescriptor::StopProxy() +{ + if (ProxyTarget) { + ProxyTarget->SetProxiedFrom(NULL, 0); + ProxyTarget = NULL; + } +} + + +/*********************************** +EventableDescriptor::SetProxiedFrom +***********************************/ + +void EventableDescriptor::SetProxiedFrom(EventableDescriptor *from, const unsigned long bufsize) +{ + if (from != NULL && ProxiedFrom != NULL) + throw std::runtime_error ("Tried to proxy to a busy target"); + + ProxiedFrom = from; + MaxOutboundBufSize = bufsize; +} + + +/******************************************** +EventableDescriptor::_GenericInboundDispatch +********************************************/ + +void EventableDescriptor::_GenericInboundDispatch(const char *buf, unsigned long size) +{ + assert(EventCallback); + + if (ProxyTarget) { + if (BytesToProxy > 0) { + unsigned long proxied = min(BytesToProxy, size); + ProxyTarget->SendOutboundData(buf, proxied); + ProxiedBytes += (unsigned long) proxied; + BytesToProxy -= proxied; + if (BytesToProxy == 0) { + StopProxy(); + (*EventCallback)(GetBinding(), EM_PROXY_COMPLETED, NULL, 0); + if (proxied < size) { + (*EventCallback)(GetBinding(), EM_CONNECTION_READ, buf + proxied, size - proxied); + } + } + } else { + ProxyTarget->SendOutboundData(buf, size); + ProxiedBytes += size; + } + } else { + (*EventCallback)(GetBinding(), EM_CONNECTION_READ, buf, size); + } +} + + +/********************************* +EventableDescriptor::_GenericGetPeername +*********************************/ + +bool EventableDescriptor::_GenericGetPeername (struct sockaddr *s, socklen_t *len) +{ + if (!s) + return false; + + int gp = getpeername (GetSocket(), s, len); + if (gp == -1) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "unable to get peer name: %s", strerror(errno)); + throw std::runtime_error (buf); + } + + return true; +} + +/********************************* +EventableDescriptor::_GenericGetSockname +*********************************/ + +bool EventableDescriptor::_GenericGetSockname (struct sockaddr *s, socklen_t *len) +{ + if (!s) + return false; + + int gp = getsockname (GetSocket(), s, len); + if (gp == -1) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "unable to get sock name: %s", strerror(errno)); + throw std::runtime_error (buf); + } + + return true; +} + + +/********************************************* +EventableDescriptor::GetPendingConnectTimeout +*********************************************/ + +uint64_t EventableDescriptor::GetPendingConnectTimeout() +{ + return PendingConnectTimeout / 1000; +} + + +/********************************************* +EventableDescriptor::SetPendingConnectTimeout +*********************************************/ + +int EventableDescriptor::SetPendingConnectTimeout (uint64_t value) +{ + if (value > 0) { + PendingConnectTimeout = value * 1000; + MyEventMachine->QueueHeartbeat(this); + return 1; + } + return 0; +} + + +/************************************* +EventableDescriptor::GetNextHeartbeat +*************************************/ + +uint64_t EventableDescriptor::GetNextHeartbeat() +{ + if (NextHeartbeat) + MyEventMachine->ClearHeartbeat(NextHeartbeat, this); + + NextHeartbeat = 0; + + if (!ShouldDelete()) { + uint64_t time_til_next = InactivityTimeout; + if (IsConnectPending()) { + if (time_til_next == 0 || PendingConnectTimeout < time_til_next) + time_til_next = PendingConnectTimeout; + } + if (time_til_next == 0) + return 0; + NextHeartbeat = time_til_next + MyEventMachine->GetRealTime(); + } + + return NextHeartbeat; +} + + +/****************************************** +ConnectionDescriptor::ConnectionDescriptor +******************************************/ + +ConnectionDescriptor::ConnectionDescriptor (SOCKET sd, EventMachine_t *em): + EventableDescriptor (sd, em), + bConnectPending (false), + bNotifyReadable (false), + bNotifyWritable (false), + bReadAttemptedAfterClose (false), + bWriteAttemptedAfterClose (false), + OutboundDataSize (0), + #ifdef WITH_SSL + SslBox (NULL), + bHandshakeSignaled (false), + bSslVerifyPeer (false), + bSslPeerAccepted(false), + #endif + #ifdef HAVE_KQUEUE + bGotExtraKqueueEvent(false), + #endif + bIsServer (false) +{ + // 22Jan09: Moved ArmKqueueWriter into SetConnectPending() to fix assertion failure in _WriteOutboundData() + // 5May09: Moved EPOLLOUT into SetConnectPending() so it doesn't happen for attached read pipes +} + + +/******************************************* +ConnectionDescriptor::~ConnectionDescriptor +*******************************************/ + +ConnectionDescriptor::~ConnectionDescriptor() +{ + // Run down any stranded outbound data. + for (size_t i=0; i < OutboundPages.size(); i++) + OutboundPages[i].Free(); + + #ifdef WITH_SSL + if (SslBox) + delete SslBox; + #endif +} + + +/*********************************** +ConnectionDescriptor::_UpdateEvents +************************************/ + +void ConnectionDescriptor::_UpdateEvents() +{ + _UpdateEvents(true, true); +} + +void ConnectionDescriptor::_UpdateEvents(bool read, bool write) +{ + if (MySocket == INVALID_SOCKET) + return; + + if (!read && !write) + return; + + #ifdef HAVE_EPOLL + unsigned int old = EpollEvent.events; + + if (read) { + if (SelectForRead()) + EpollEvent.events |= EPOLLIN; + else + EpollEvent.events &= ~EPOLLIN; + } + + if (write) { + if (SelectForWrite()) + EpollEvent.events |= EPOLLOUT; + else + EpollEvent.events &= ~EPOLLOUT; + } + + if (old != EpollEvent.events) + MyEventMachine->Modify (this); + #endif + + #ifdef HAVE_KQUEUE + if (read && SelectForRead()) + MyEventMachine->ArmKqueueReader (this); + bKqueueArmWrite = SelectForWrite(); + if (write && bKqueueArmWrite) + MyEventMachine->Modify (this); + #endif +} + +/*************************************** +ConnectionDescriptor::SetConnectPending +****************************************/ + +void ConnectionDescriptor::SetConnectPending(bool f) +{ + bConnectPending = f; + MyEventMachine->QueueHeartbeat(this); + _UpdateEvents(); +} + + +/********************************** +ConnectionDescriptor::SetAttached +***********************************/ + +void ConnectionDescriptor::SetAttached(bool state) +{ + bAttached = state; +} + + +/********************************** +ConnectionDescriptor::SetWatchOnly +***********************************/ + +void ConnectionDescriptor::SetWatchOnly(bool watching) +{ + bWatchOnly = watching; + _UpdateEvents(); +} + + +/********************************* +ConnectionDescriptor::HandleError +*********************************/ + +void ConnectionDescriptor::HandleError() +{ + if (bWatchOnly) { + // An EPOLLHUP | EPOLLIN condition will call Read() before HandleError(), in which case the + // socket is already detached and invalid, so we don't need to do anything. + if (MySocket == INVALID_SOCKET) return; + + // HandleError() is called on WatchOnly descriptors by the epoll reactor + // when it gets a EPOLLERR | EPOLLHUP. Usually this would show up as a readable and + // writable event on other reactors, so we have to fire those events ourselves. + if (bNotifyReadable) Read(); + if (bNotifyWritable) Write(); + } else { + ScheduleClose (false); + } +} + + +/*********************************** +ConnectionDescriptor::ScheduleClose +***********************************/ + +void ConnectionDescriptor::ScheduleClose (bool after_writing) +{ + if (bWatchOnly) + throw std::runtime_error ("cannot close 'watch only' connections"); + + EventableDescriptor::ScheduleClose(after_writing); +} + + +/*************************************** +ConnectionDescriptor::SetNotifyReadable +****************************************/ + +void ConnectionDescriptor::SetNotifyReadable(bool readable) +{ + if (!bWatchOnly) + throw std::runtime_error ("notify_readable must be on 'watch only' connections"); + + bNotifyReadable = readable; + _UpdateEvents(true, false); +} + + +/*************************************** +ConnectionDescriptor::SetNotifyWritable +****************************************/ + +void ConnectionDescriptor::SetNotifyWritable(bool writable) +{ + if (!bWatchOnly) + throw std::runtime_error ("notify_writable must be on 'watch only' connections"); + + bNotifyWritable = writable; + _UpdateEvents(false, true); +} + + +/************************************** +ConnectionDescriptor::SendOutboundData +**************************************/ + +int ConnectionDescriptor::SendOutboundData (const char *data, unsigned long length) +{ + if (bWatchOnly) + throw std::runtime_error ("cannot send data on a 'watch only' connection"); + + if (ProxiedFrom && MaxOutboundBufSize && (unsigned int)(GetOutboundDataSize() + length) > MaxOutboundBufSize) + ProxiedFrom->Pause(); + + #ifdef WITH_SSL + if (SslBox) { + if (length > 0) { + unsigned long writed = 0; + char *p = (char*)data; + + while (writed < length) { + int to_write = SSLBOX_INPUT_CHUNKSIZE; + int remaining = length - writed; + + if (remaining < SSLBOX_INPUT_CHUNKSIZE) + to_write = remaining; + + int w = SslBox->PutPlaintext (p, to_write); + if (w < 0) { + ScheduleClose (false); + }else + _DispatchCiphertext(); + + p += to_write; + writed += to_write; + } + } + // TODO: What's the correct return value? + return 1; // That's a wild guess, almost certainly wrong. + } + else + #endif + return _SendRawOutboundData (data, length); +} + + + +/****************************************** +ConnectionDescriptor::_SendRawOutboundData +******************************************/ + +int ConnectionDescriptor::_SendRawOutboundData (const char *data, unsigned long length) +{ + /* This internal method is called to schedule bytes that + * will be sent out to the remote peer. + * It's not directly accessed by the caller, who hits ::SendOutboundData, + * which may or may not filter or encrypt the caller's data before + * sending it here. + */ + + // Highly naive and incomplete implementation. + // There's no throttle for runaways (which should abort only this connection + // and not the whole process), and no coalescing of small pages. + // (Well, not so bad, small pages are coalesced in ::Write) + + if (IsCloseScheduled()) + return 0; + // 25Mar10: Ignore 0 length packets as they are not meaningful in TCP (as opposed to UDP) + // and can cause the assert(nbytes>0) to fail when OutboundPages has a bunch of 0 length pages. + if (length == 0) + return 0; + + if (!data && (length > 0)) + throw std::runtime_error ("bad outbound data"); + char *buffer = (char *) malloc (length + 1); + if (!buffer) + throw std::runtime_error ("no allocation for outbound data"); + + memcpy (buffer, data, length); + buffer [length] = 0; + OutboundPages.push_back (OutboundPage (buffer, length)); + OutboundDataSize += length; + + _UpdateEvents(false, true); + + return length; +} + + + +/*********************************** +ConnectionDescriptor::SelectForRead +***********************************/ + +bool ConnectionDescriptor::SelectForRead() +{ + /* A connection descriptor is always scheduled for read, + * UNLESS it's in a pending-connect state. + * On Linux, unlike Unix, a nonblocking socket on which + * connect has been called, does NOT necessarily select + * both readable and writable in case of error. + * The socket will select writable when the disposition + * of the connect is known. On the other hand, a socket + * which successfully connects and selects writable may + * indeed have some data available on it, so it will + * select readable in that case, violating expectations! + * So we will not poll for readability until the socket + * is known to be in a connected state. + */ + + if (bPaused) + return false; + else if (bConnectPending) + return false; + else if (bWatchOnly) + return bNotifyReadable ? true : false; + else + return true; +} + + +/************************************ +ConnectionDescriptor::SelectForWrite +************************************/ + +bool ConnectionDescriptor::SelectForWrite() +{ + /* Cf the notes under SelectForRead. + * In a pending-connect state, we ALWAYS select for writable. + * In a normal state, we only select for writable when we + * have outgoing data to send. + */ + + if (bPaused) + return false; + else if (bConnectPending) + return true; + else if (bWatchOnly) + return bNotifyWritable ? true : false; + else + return (GetOutboundDataSize() > 0); +} + +/*************************** +ConnectionDescriptor::Pause +***************************/ + +bool ConnectionDescriptor::Pause() +{ + if (bWatchOnly) + throw std::runtime_error ("cannot pause/resume 'watch only' connections, set notify readable/writable instead"); + + bool old = bPaused; + bPaused = true; + _UpdateEvents(); + return old == false; +} + +/**************************** +ConnectionDescriptor::Resume +****************************/ + +bool ConnectionDescriptor::Resume() +{ + if (bWatchOnly) + throw std::runtime_error ("cannot pause/resume 'watch only' connections, set notify readable/writable instead"); + + bool old = bPaused; + bPaused = false; + _UpdateEvents(); + return old == true; +} + +/************************** +ConnectionDescriptor::Read +**************************/ + +void ConnectionDescriptor::Read() +{ + /* Read and dispatch data on a socket that has selected readable. + * It's theoretically possible to get and dispatch incoming data on + * a socket that has already been scheduled for closing or close-after-writing. + * In those cases, we'll leave it up the to protocol handler to "do the + * right thing" (which probably means to ignore the incoming data). + * + * 22Aug06: Chris Ochs reports that on FreeBSD, it's possible to come + * here with the socket already closed, after the process receives + * a ctrl-C signal (not sure if that's TERM or INT on BSD). The application + * was one in which network connections were doing a lot of interleaved reads + * and writes. + * Since we always write before reading (in order to keep the outbound queues + * as light as possible), I think what happened is that an interrupt caused + * the socket to be closed in ConnectionDescriptor::Write. We'll then + * come here in the same pass through the main event loop, and won't get + * cleaned up until immediately after. + * We originally asserted that the socket was valid when we got here. + * To deal properly with the possibility that we are closed when we get here, + * I removed the assert. HOWEVER, the potential for an infinite loop scares me, + * so even though this is really clunky, I added a flag to assert that we never + * come here more than once after being closed. (FCianfrocca) + */ + + SOCKET sd = GetSocket(); + //assert (sd != INVALID_SOCKET); (original, removed 22Aug06) + if (sd == INVALID_SOCKET) { + assert (!bReadAttemptedAfterClose); + bReadAttemptedAfterClose = true; + return; + } + + if (bWatchOnly) { + if (bNotifyReadable && EventCallback) + (*EventCallback)(GetBinding(), EM_CONNECTION_NOTIFY_READABLE, NULL, 0); + return; + } + + LastActivity = MyEventMachine->GetCurrentLoopTime(); + + int total_bytes_read = 0; + char readbuffer [16 * 1024 + 1]; + + for (int i=0; i < 10; i++) { + // Don't read just one buffer and then move on. This is faster + // if there is a lot of incoming. + // But don't read indefinitely. Give other sockets a chance to run. + // NOTICE, we're reading one less than the buffer size. + // That's so we can put a guard byte at the end of what we send + // to user code. + + + int r = read (sd, readbuffer, sizeof(readbuffer) - 1); +#ifdef OS_WIN32 + int e = WSAGetLastError(); +#else + int e = errno; +#endif + //cerr << ""; + + if (r > 0) { + total_bytes_read += r; + + // Add a null-terminator at the the end of the buffer + // that we will send to the callback. + // DO NOT EVER CHANGE THIS. We want to explicitly allow users + // to be able to depend on this behavior, so they will have + // the option to do some things faster. Additionally it's + // a security guard against buffer overflows. + readbuffer [r] = 0; + _DispatchInboundData (readbuffer, r); + if (bPaused) + break; + } + else if (r == 0) { + break; + } + else { + #ifdef OS_UNIX + if ((e != EINPROGRESS) && (e != EWOULDBLOCK) && (e != EAGAIN) && (e != EINTR)) { + #endif + #ifdef OS_WIN32 + if ((e != WSAEINPROGRESS) && (e != WSAEWOULDBLOCK)) { + #endif + // 26Mar11: Previously, all read errors were assumed to be EWOULDBLOCK and ignored. + // Now, instead, we call Close() on errors like ECONNRESET and ENOTCONN. + UnbindReasonCode = e; + Close(); + break; + } else { + // Basically a would-block, meaning we've read everything there is to read. + break; + } + } + + } + + + if (total_bytes_read == 0) { + // If we read no data on a socket that selected readable, + // it generally means the other end closed the connection gracefully. + ScheduleClose (false); + //bCloseNow = true; + } + +} + + + +/****************************************** +ConnectionDescriptor::_DispatchInboundData +******************************************/ + +#ifdef WITH_SSL +void ConnectionDescriptor::_DispatchInboundData (const char *buffer, unsigned long size) +{ + if (SslBox) { + SslBox->PutCiphertext (buffer, size); + + int s; + char B [2048]; + while ((s = SslBox->GetPlaintext (B, sizeof(B) - 1)) > 0) { + _CheckHandshakeStatus(); + B [s] = 0; + _GenericInboundDispatch(B, s); + } + + // If our SSL handshake had a problem, shut down the connection. + if (s == -2) { + #ifndef EPROTO // OpenBSD does not have EPROTO + #define EPROTO EINTR + #endif + #ifdef OS_UNIX + UnbindReasonCode = EPROTO; + #endif + #ifdef OS_WIN32 + UnbindReasonCode = WSAECONNABORTED; + #endif + ScheduleClose(false); + return; + } + + _CheckHandshakeStatus(); + _DispatchCiphertext(); + } + else { + _GenericInboundDispatch(buffer, size); + } +} +#else +void ConnectionDescriptor::_DispatchInboundData (const char *buffer, unsigned long size) +{ + _GenericInboundDispatch(buffer, size); +} +#endif + + + +/******************************************* +ConnectionDescriptor::_CheckHandshakeStatus +*******************************************/ + +void ConnectionDescriptor::_CheckHandshakeStatus() +{ + #ifdef WITH_SSL + if (SslBox && (!bHandshakeSignaled) && SslBox->IsHandshakeCompleted()) { + bHandshakeSignaled = true; + if (EventCallback) + (*EventCallback)(GetBinding(), EM_SSL_HANDSHAKE_COMPLETED, NULL, 0); + } + #endif +} + + + +/*************************** +ConnectionDescriptor::Write +***************************/ + +void ConnectionDescriptor::Write() +{ + /* A socket which is in a pending-connect state will select + * writable when the disposition of the connect is known. + * At that point, check to be sure there are no errors, + * and if none, then promote the socket out of the pending + * state. + * TODO: I haven't figured out how Windows signals errors on + * unconnected sockets. Maybe it does the untraditional but + * logical thing and makes the socket selectable for error. + * If so, it's unsupported here for the time being, and connect + * errors will have to be caught by the timeout mechanism. + */ + + if (bConnectPending) { + int error; + socklen_t len; + len = sizeof(error); + #ifdef OS_UNIX + int o = getsockopt (GetSocket(), SOL_SOCKET, SO_ERROR, &error, &len); + #endif + #ifdef OS_WIN32 + int o = getsockopt (GetSocket(), SOL_SOCKET, SO_ERROR, (char*)&error, &len); + #endif + if ((o == 0) && (error == 0)) { + if (EventCallback) + (*EventCallback)(GetBinding(), EM_CONNECTION_COMPLETED, "", 0); + + // 5May09: Moved epoll/kqueue read/write arming into SetConnectPending, so it can be called + // from EventMachine_t::AttachFD as well. + SetConnectPending (false); + } + else { + if (o == 0) + UnbindReasonCode = error; + ScheduleClose (false); + //bCloseNow = true; + } + } + else { + + if (bNotifyWritable) { + if (EventCallback) + (*EventCallback)(GetBinding(), EM_CONNECTION_NOTIFY_WRITABLE, NULL, 0); + + _UpdateEvents(false, true); + return; + } + + assert(!bWatchOnly); + + /* 5May09: Kqueue bugs on OSX cause one extra writable event to fire even though we're using + EV_ONESHOT. We ignore this extra event once, but only the first time. If it happens again, + we should fall through to the assert(nbytes>0) failure to catch any EM bugs which might cause + ::Write to be called in a busy-loop. + */ + #ifdef HAVE_KQUEUE + if (MyEventMachine->GetPoller() == Poller_Kqueue) { + if (OutboundDataSize == 0 && !bGotExtraKqueueEvent) { + bGotExtraKqueueEvent = true; + return; + } else if (OutboundDataSize > 0) { + bGotExtraKqueueEvent = false; + } + } + #endif + + _WriteOutboundData(); + } +} + + +/**************************************** +ConnectionDescriptor::_WriteOutboundData +****************************************/ + +void ConnectionDescriptor::_WriteOutboundData() +{ + /* This is a helper function called by ::Write. + * It's possible for a socket to select writable and then no longer + * be writable by the time we get around to writing. The kernel might + * have used up its available output buffers between the select call + * and when we get here. So this condition is not an error. + * + * 20Jul07, added the same kind of protection against an invalid socket + * that is at the top of ::Read. Not entirely how this could happen in + * real life (connection-reset from the remote peer, perhaps?), but I'm + * doing it to address some reports of crashing under heavy loads. + */ + + SOCKET sd = GetSocket(); + //assert (sd != INVALID_SOCKET); + if (sd == INVALID_SOCKET) { + assert (!bWriteAttemptedAfterClose); + bWriteAttemptedAfterClose = true; + return; + } + + LastActivity = MyEventMachine->GetCurrentLoopTime(); + size_t nbytes = 0; + + #ifdef HAVE_WRITEV + int iovcnt = OutboundPages.size(); + // Max of 16 outbound pages at a time + if (iovcnt > 16) iovcnt = 16; + + iovec iov[16]; + + for(int i = 0; i < iovcnt; i++){ + OutboundPage *op = &(OutboundPages[i]); + #ifdef CC_SUNWspro + // TODO: The void * cast works fine on Solaris 11, but + // I don't know at what point that changed from older Solaris. + iov[i].iov_base = (char *)(op->Buffer + op->Offset); + #else + iov[i].iov_base = (void *)(op->Buffer + op->Offset); + #endif + iov[i].iov_len = op->Length - op->Offset; + + nbytes += iov[i].iov_len; + } + #else + char output_buffer [16 * 1024]; + + while ((OutboundPages.size() > 0) && (nbytes < sizeof(output_buffer))) { + OutboundPage *op = &(OutboundPages[0]); + if ((nbytes + op->Length - op->Offset) < sizeof (output_buffer)) { + memcpy (output_buffer + nbytes, op->Buffer + op->Offset, op->Length - op->Offset); + nbytes += (op->Length - op->Offset); + op->Free(); + OutboundPages.pop_front(); + } + else { + int len = sizeof(output_buffer) - nbytes; + memcpy (output_buffer + nbytes, op->Buffer + op->Offset, len); + op->Offset += len; + nbytes += len; + } + } + #endif + + // We should never have gotten here if there were no data to write, + // so assert that as a sanity check. + // Don't bother to make sure nbytes is less than output_buffer because + // if it were we probably would have crashed already. + assert (nbytes > 0); + + assert (GetSocket() != INVALID_SOCKET); + #ifdef HAVE_WRITEV + int bytes_written = writev (GetSocket(), iov, iovcnt); + #else + int bytes_written = write (GetSocket(), output_buffer, nbytes); + #endif + + bool err = false; +#ifdef OS_WIN32 + int e = WSAGetLastError(); +#else + int e = errno; +#endif + if (bytes_written < 0) { + err = true; + bytes_written = 0; + } + + assert (bytes_written >= 0); + OutboundDataSize -= bytes_written; + + if (ProxiedFrom && MaxOutboundBufSize && (unsigned int)GetOutboundDataSize() < MaxOutboundBufSize && ProxiedFrom->IsPaused()) + ProxiedFrom->Resume(); + + #ifdef HAVE_WRITEV + if (!err) { + unsigned int sent = bytes_written; + deque::iterator op = OutboundPages.begin(); + + for (int i = 0; i < iovcnt; i++) { + if (iov[i].iov_len <= sent) { + // Sent this page in full, free it. + op->Free(); + OutboundPages.pop_front(); + + sent -= iov[i].iov_len; + } else { + // Sent part (or none) of this page, increment offset to send the remainder + op->Offset += sent; + break; + } + + // Shouldn't be possible run out of pages before the loop ends + assert(op != OutboundPages.end()); + *op++; + } + } + #else + if ((size_t)bytes_written < nbytes) { + int len = nbytes - bytes_written; + char *buffer = (char*) malloc (len + 1); + if (!buffer) + throw std::runtime_error ("bad alloc throwing back data"); + memcpy (buffer, output_buffer + bytes_written, len); + buffer [len] = 0; + OutboundPages.push_front (OutboundPage (buffer, len)); + } + #endif + + _UpdateEvents(false, true); + + if (err) { + #ifdef OS_UNIX + if ((e != EINPROGRESS) && (e != EWOULDBLOCK) && (e != EINTR)) { + #endif + #ifdef OS_WIN32 + if ((e != WSAEINPROGRESS) && (e != WSAEWOULDBLOCK)) { + #endif + UnbindReasonCode = e; + Close(); + } + } +} + + +/*************************************** +ConnectionDescriptor::ReportErrorStatus +***************************************/ + +int ConnectionDescriptor::ReportErrorStatus() +{ + if (MySocket == INVALID_SOCKET) { + return -1; + } + + int error; + socklen_t len; + len = sizeof(error); + #ifdef OS_UNIX + int o = getsockopt (GetSocket(), SOL_SOCKET, SO_ERROR, &error, &len); + #endif + #ifdef OS_WIN32 + int o = getsockopt (GetSocket(), SOL_SOCKET, SO_ERROR, (char*)&error, &len); + #endif + if ((o == 0) && (error == 0)) + return 0; + else if (o == 0) + return error; + else + return -1; +} + + +/****************************** +ConnectionDescriptor::StartTls +******************************/ + +#ifdef WITH_SSL +void ConnectionDescriptor::StartTls() +{ + if (SslBox) + throw std::runtime_error ("SSL/TLS already running on connection"); + + SslBox = new SslBox_t (bIsServer, PrivateKeyFilename, CertChainFilename, bSslVerifyPeer, bSslFailIfNoPeerCert, SniHostName, CipherList, EcdhCurve, DhParam, Protocols, GetBinding()); + _DispatchCiphertext(); + +} +#else +void ConnectionDescriptor::StartTls() +{ + throw std::runtime_error ("Encryption not available on this event-machine"); +} +#endif + + +/********************************* +ConnectionDescriptor::SetTlsParms +*********************************/ + +#ifdef WITH_SSL +void ConnectionDescriptor::SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer, bool fail_if_no_peer_cert, const char *sni_hostname, const char *cipherlist, const char *ecdh_curve, const char *dhparam, int protocols) +{ + if (SslBox) + throw std::runtime_error ("call SetTlsParms before calling StartTls"); + if (privkey_filename && *privkey_filename) + PrivateKeyFilename = privkey_filename; + if (certchain_filename && *certchain_filename) + CertChainFilename = certchain_filename; + bSslVerifyPeer = verify_peer; + bSslFailIfNoPeerCert = fail_if_no_peer_cert; + + if (sni_hostname && *sni_hostname) + SniHostName = sni_hostname; + if (cipherlist && *cipherlist) + CipherList = cipherlist; + if (ecdh_curve && *ecdh_curve) + EcdhCurve = ecdh_curve; + if (dhparam && *dhparam) + DhParam = dhparam; + + Protocols = protocols; +} +#else +void ConnectionDescriptor::SetTlsParms (const char *privkey_filename UNUSED, const char *certchain_filename UNUSED, bool verify_peer UNUSED, bool fail_if_no_peer_cert UNUSED, const char *sni_hostname UNUSED, const char *cipherlist UNUSED, const char *ecdh_curve UNUSED, const char *dhparam UNUSED, int protocols UNUSED) +{ + throw std::runtime_error ("Encryption not available on this event-machine"); +} +#endif + + +/********************************* +ConnectionDescriptor::GetPeerCert +*********************************/ + +#ifdef WITH_SSL +X509 *ConnectionDescriptor::GetPeerCert() +{ + if (!SslBox) + throw std::runtime_error ("SSL/TLS not running on this connection"); + return SslBox->GetPeerCert(); +} +#endif + + +/********************************* +ConnectionDescriptor::GetCipherBits +*********************************/ + +#ifdef WITH_SSL +int ConnectionDescriptor::GetCipherBits() +{ + if (!SslBox) + throw std::runtime_error ("SSL/TLS not running on this connection"); + return SslBox->GetCipherBits(); +} +#endif + + +/********************************* +ConnectionDescriptor::GetCipherName +*********************************/ + +#ifdef WITH_SSL +const char *ConnectionDescriptor::GetCipherName() +{ + if (!SslBox) + throw std::runtime_error ("SSL/TLS not running on this connection"); + return SslBox->GetCipherName(); +} +#endif + + +/********************************* +ConnectionDescriptor::GetCipherProtocol +*********************************/ + +#ifdef WITH_SSL +const char *ConnectionDescriptor::GetCipherProtocol() +{ + if (!SslBox) + throw std::runtime_error ("SSL/TLS not running on this connection"); + return SslBox->GetCipherProtocol(); +} +#endif + + +/********************************* +ConnectionDescriptor::GetSNIHostname +*********************************/ + +#ifdef WITH_SSL +const char *ConnectionDescriptor::GetSNIHostname() +{ + if (!SslBox) + throw std::runtime_error ("SSL/TLS not running on this connection"); + return SslBox->GetSNIHostname(); +} +#endif + + +/*********************************** +ConnectionDescriptor::VerifySslPeer +***********************************/ + +#ifdef WITH_SSL +bool ConnectionDescriptor::VerifySslPeer(const char *cert) +{ + bSslPeerAccepted = false; + + if (EventCallback) + (*EventCallback)(GetBinding(), EM_SSL_VERIFY, cert, strlen(cert)); + + return bSslPeerAccepted; +} +#endif + + +/*********************************** +ConnectionDescriptor::AcceptSslPeer +***********************************/ + +#ifdef WITH_SSL +void ConnectionDescriptor::AcceptSslPeer() +{ + bSslPeerAccepted = true; +} +#endif + + +/***************************************** +ConnectionDescriptor::_DispatchCiphertext +*****************************************/ + +#ifdef WITH_SSL +void ConnectionDescriptor::_DispatchCiphertext() +{ + assert (SslBox); + + + char BigBuf [SSLBOX_OUTPUT_CHUNKSIZE]; + bool did_work; + + do { + did_work = false; + + // try to drain ciphertext + while (SslBox->CanGetCiphertext()) { + int r = SslBox->GetCiphertext (BigBuf, sizeof(BigBuf)); + assert (r > 0); + _SendRawOutboundData (BigBuf, r); + did_work = true; + } + + // Pump the SslBox, in case it has queued outgoing plaintext + // This will return >0 if data was written, + // 0 if no data was written, and <0 if there was a fatal error. + bool pump; + do { + pump = false; + int w = SslBox->PutPlaintext (NULL, 0); + if (w > 0) { + did_work = true; + pump = true; + } + else if (w < 0) + ScheduleClose (false); + } while (pump); + + // try to put plaintext. INCOMPLETE, doesn't belong here? + // In SendOutboundData, we're spooling plaintext directly + // into SslBox. That may be wrong, we may need to buffer it + // up here! + /* + const char *ptr; + int ptr_length; + while (OutboundPlaintext.GetPage (&ptr, &ptr_length)) { + assert (ptr && (ptr_length > 0)); + int w = SslMachine.PutPlaintext (ptr, ptr_length); + if (w > 0) { + OutboundPlaintext.DiscardBytes (w); + did_work = true; + } + else + break; + } + */ + + } while (did_work); + +} +#endif + + + +/******************************* +ConnectionDescriptor::Heartbeat +*******************************/ + +void ConnectionDescriptor::Heartbeat() +{ + /* Only allow a certain amount of time to go by while waiting + * for a pending connect. If it expires, then kill the socket. + * For a connected socket, close it if its inactivity timer + * has expired. + */ + + if (bConnectPending) { + if ((MyEventMachine->GetCurrentLoopTime() - CreatedAt) >= PendingConnectTimeout) { + UnbindReasonCode = ETIMEDOUT; + ScheduleClose (false); + //bCloseNow = true; + } + } + else { + if (InactivityTimeout && ((MyEventMachine->GetCurrentLoopTime() - LastActivity) >= InactivityTimeout)) { + UnbindReasonCode = ETIMEDOUT; + ScheduleClose (false); + //bCloseNow = true; + } + } +} + + +/**************************************** +LoopbreakDescriptor::LoopbreakDescriptor +****************************************/ + +LoopbreakDescriptor::LoopbreakDescriptor (SOCKET sd, EventMachine_t *parent_em): + EventableDescriptor (sd, parent_em) +{ + /* This is really bad and ugly. Change someday if possible. + * We have to know about an event-machine (probably the one that owns us), + * so we can pass newly-created connections to it. + */ + + bCallbackUnbind = false; + + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + #endif + #ifdef HAVE_KQUEUE + MyEventMachine->ArmKqueueReader (this); + #endif +} + + + + +/************************* +LoopbreakDescriptor::Read +*************************/ + +void LoopbreakDescriptor::Read() +{ + // TODO, refactor, this code is probably in the wrong place. + assert (MyEventMachine); + MyEventMachine->_ReadLoopBreaker(); +} + + +/************************** +LoopbreakDescriptor::Write +**************************/ + +void LoopbreakDescriptor::Write() +{ + // Why are we here? + throw std::runtime_error ("bad code path in loopbreak"); +} + +/************************************** +AcceptorDescriptor::AcceptorDescriptor +**************************************/ + +AcceptorDescriptor::AcceptorDescriptor (SOCKET sd, EventMachine_t *parent_em): + EventableDescriptor (sd, parent_em) +{ + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + #endif + #ifdef HAVE_KQUEUE + MyEventMachine->ArmKqueueReader (this); + #endif +} + + +/*************************************** +AcceptorDescriptor::~AcceptorDescriptor +***************************************/ + +AcceptorDescriptor::~AcceptorDescriptor() +{ +} + +/**************************************** +STATIC: AcceptorDescriptor::StopAcceptor +****************************************/ + +void AcceptorDescriptor::StopAcceptor (const uintptr_t binding) +{ + // TODO: This is something of a hack, or at least it's a static method of the wrong class. + AcceptorDescriptor *ad = dynamic_cast (Bindable_t::GetObject (binding)); + if (ad) + ad->ScheduleClose (false); + else + throw std::runtime_error ("failed to close nonexistent acceptor"); +} + + +/************************ +AcceptorDescriptor::Read +************************/ + +void AcceptorDescriptor::Read() +{ + /* Accept up to a certain number of sockets on the listening connection. + * Don't try to accept all that are present, because this would allow a DoS attack + * in which no data were ever read or written. We should accept more than one, + * if available, to keep the partially accepted sockets from backing up in the kernel. + */ + + /* Make sure we use non-blocking i/o on the acceptor socket, since we're selecting it + * for readability. According to Stevens UNP, it's possible for an acceptor to select readable + * and then block when we call accept. For example, the other end resets the connection after + * the socket selects readable and before we call accept. The kernel will remove the dead + * socket from the accept queue. If the accept queue is now empty, accept will block. + */ + + + struct sockaddr_in6 pin; + socklen_t addrlen = sizeof (pin); + int accept_count = EventMachine_t::GetSimultaneousAcceptCount(); + + for (int i=0; i < accept_count; i++) { +#if defined(HAVE_CONST_SOCK_CLOEXEC) && defined(HAVE_ACCEPT4) + SOCKET sd = accept4 (GetSocket(), (struct sockaddr*)&pin, &addrlen, SOCK_CLOEXEC); + if (sd == INVALID_SOCKET) { + // We may be running in a kernel where + // SOCK_CLOEXEC is not supported - fall back: + sd = accept (GetSocket(), (struct sockaddr*)&pin, &addrlen); + } +#else + SOCKET sd = accept (GetSocket(), (struct sockaddr*)&pin, &addrlen); +#endif + if (sd == INVALID_SOCKET) { + // This breaks the loop when we've accepted everything on the kernel queue, + // up to 10 new connections. But what if the *first* accept fails? + // Does that mean anything serious is happening, beyond the situation + // described in the note above? + break; + } + + // Set the newly-accepted socket non-blocking and to close on exec. + // On Windows, this may fail because, weirdly, Windows inherits the non-blocking + // attribute that we applied to the acceptor socket into the accepted one. + if (!SetFdCloexec(sd) || !SetSocketNonblocking (sd)) { + //int val = fcntl (sd, F_GETFL, 0); + //if (fcntl (sd, F_SETFL, val | O_NONBLOCK) == -1) { + shutdown (sd, 1); + close (sd); + continue; + } + + // Disable slow-start (Nagle algorithm). Eventually make this configurable. + int one = 1; + setsockopt (sd, IPPROTO_TCP, TCP_NODELAY, (char*) &one, sizeof(one)); + + + ConnectionDescriptor *cd = new ConnectionDescriptor (sd, MyEventMachine); + if (!cd) + throw std::runtime_error ("no newly accepted connection"); + cd->SetServerMode(); + if (EventCallback) { + (*EventCallback) (GetBinding(), EM_CONNECTION_ACCEPTED, NULL, cd->GetBinding()); + } + #ifdef HAVE_EPOLL + cd->GetEpollEvent()->events = 0; + if (cd->SelectForRead()) + cd->GetEpollEvent()->events |= EPOLLIN; + if (cd->SelectForWrite()) + cd->GetEpollEvent()->events |= EPOLLOUT; + #endif + assert (MyEventMachine); + MyEventMachine->Add (cd); + #ifdef HAVE_KQUEUE + bKqueueArmWrite = cd->SelectForWrite(); + if (bKqueueArmWrite) + MyEventMachine->Modify (cd); + if (cd->SelectForRead()) + MyEventMachine->ArmKqueueReader (cd); + #endif + } + +} + + +/************************* +AcceptorDescriptor::Write +*************************/ + +void AcceptorDescriptor::Write() +{ + // Why are we here? + throw std::runtime_error ("bad code path in acceptor"); +} + + +/***************************** +AcceptorDescriptor::Heartbeat +*****************************/ + +void AcceptorDescriptor::Heartbeat() +{ + // No-op +} + + +/************************************** +DatagramDescriptor::DatagramDescriptor +**************************************/ + +DatagramDescriptor::DatagramDescriptor (SOCKET sd, EventMachine_t *parent_em): + EventableDescriptor (sd, parent_em), + OutboundDataSize (0) +{ + memset (&ReturnAddress, 0, sizeof(ReturnAddress)); + + /* Provisionally added 19Oct07. All datagram sockets support broadcasting. + * Until now, sending to a broadcast address would give EACCES (permission denied) + * on systems like Linux and BSD that require the SO_BROADCAST socket-option in order + * to accept a packet to a broadcast address. Solaris doesn't require it. I think + * Windows DOES require it but I'm not sure. + * + * Ruby does NOT do what we're doing here. In Ruby, you have to explicitly set SO_BROADCAST + * on a UDP socket in order to enable broadcasting. The reason for requiring the option + * in the first place is so that applications don't send broadcast datagrams by mistake. + * I imagine that could happen if a user of an application typed in an address that happened + * to be a broadcast address on that particular subnet. + * + * This is provisional because someone may eventually come up with a good reason not to + * do it for all UDP sockets. If that happens, then we'll need to add a usercode-level API + * to set the socket option, just like Ruby does. AND WE'LL ALSO BREAK CODE THAT DOESN'T + * EXPLICITLY SET THE OPTION. + */ + + int oval = 1; + setsockopt (GetSocket(), SOL_SOCKET, SO_BROADCAST, (char*)&oval, sizeof(oval)); + + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + #endif + #ifdef HAVE_KQUEUE + MyEventMachine->ArmKqueueReader (this); + #endif +} + + +/*************************************** +DatagramDescriptor::~DatagramDescriptor +***************************************/ + +DatagramDescriptor::~DatagramDescriptor() +{ + // Run down any stranded outbound data. + for (size_t i=0; i < OutboundPages.size(); i++) + OutboundPages[i].Free(); +} + + +/***************************** +DatagramDescriptor::Heartbeat +*****************************/ + +void DatagramDescriptor::Heartbeat() +{ + // Close it if its inactivity timer has expired. + + if (InactivityTimeout && ((MyEventMachine->GetCurrentLoopTime() - LastActivity) >= InactivityTimeout)) + ScheduleClose (false); + //bCloseNow = true; +} + + +/************************ +DatagramDescriptor::Read +************************/ + +void DatagramDescriptor::Read() +{ + SOCKET sd = GetSocket(); + assert (sd != INVALID_SOCKET); + LastActivity = MyEventMachine->GetCurrentLoopTime(); + + // This is an extremely large read buffer. + // In many cases you wouldn't expect to get any more than 4K. + char readbuffer [16 * 1024]; + + for (int i=0; i < 10; i++) { + // Don't read just one buffer and then move on. This is faster + // if there is a lot of incoming. + // But don't read indefinitely. Give other sockets a chance to run. + // NOTICE, we're reading one less than the buffer size. + // That's so we can put a guard byte at the end of what we send + // to user code. + + struct sockaddr_in6 sin; + socklen_t slen = sizeof (sin); + memset (&sin, 0, slen); + + int r = recvfrom (sd, readbuffer, sizeof(readbuffer) - 1, 0, (struct sockaddr*)&sin, &slen); + //cerr << ""; + + // In UDP, a zero-length packet is perfectly legal. + if (r >= 0) { + + // Add a null-terminator at the the end of the buffer + // that we will send to the callback. + // DO NOT EVER CHANGE THIS. We want to explicitly allow users + // to be able to depend on this behavior, so they will have + // the option to do some things faster. Additionally it's + // a security guard against buffer overflows. + readbuffer [r] = 0; + + + // Set up a "temporary" return address so that callers can "reply" to us + // from within the callback we are about to invoke. That means that ordinary + // calls to "send_data_to_connection" (which is of course misnamed in this + // case) will result in packets being sent back to the same place that sent + // us this one. + // There is a different call (evma_send_datagram) for cases where the caller + // actually wants to send a packet somewhere else. + + memset (&ReturnAddress, 0, sizeof(ReturnAddress)); + memcpy (&ReturnAddress, &sin, slen); + + _GenericInboundDispatch(readbuffer, r); + + } + else { + // Basically a would-block, meaning we've read everything there is to read. + break; + } + + } + + +} + + +/************************* +DatagramDescriptor::Write +*************************/ + +void DatagramDescriptor::Write() +{ + /* It's possible for a socket to select writable and then no longer + * be writable by the time we get around to writing. The kernel might + * have used up its available output buffers between the select call + * and when we get here. So this condition is not an error. + * This code is very reminiscent of ConnectionDescriptor::_WriteOutboundData, + * but differs in the that the outbound data pages (received from the + * user) are _message-structured._ That is, we send each of them out + * one message at a time. + * TODO, we are currently suppressing the EMSGSIZE error!!! + */ + + SOCKET sd = GetSocket(); + assert (sd != INVALID_SOCKET); + LastActivity = MyEventMachine->GetCurrentLoopTime(); + + assert (OutboundPages.size() > 0); + + // Send out up to 10 packets, then cycle the machine. + for (int i = 0; i < 10; i++) { + if (OutboundPages.size() <= 0) + break; + OutboundPage *op = &(OutboundPages[0]); + + // The nasty cast to (char*) is needed because Windows is brain-dead. + int s = sendto (sd, (char*)op->Buffer, op->Length, 0, (struct sockaddr*)&(op->From), + (op->From.sin6_family == AF_INET6 ? sizeof (struct sockaddr_in6) : sizeof (struct sockaddr_in))); +#ifdef OS_WIN32 + int e = WSAGetLastError(); +#else + int e = errno; +#endif + + OutboundDataSize -= op->Length; + op->Free(); + OutboundPages.pop_front(); + + if (s == SOCKET_ERROR) { + #ifdef OS_UNIX + if ((e != EINPROGRESS) && (e != EWOULDBLOCK) && (e != EINTR)) { + #endif + #ifdef OS_WIN32 + if ((e != WSAEINPROGRESS) && (e != WSAEWOULDBLOCK)) { + #endif + UnbindReasonCode = e; + Close(); + break; + } + } + } + + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + if (SelectForWrite()) + EpollEvent.events |= EPOLLOUT; + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + #ifdef HAVE_KQUEUE + bKqueueArmWrite = SelectForWrite(); + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif +} + + +/********************************** +DatagramDescriptor::SelectForWrite +**********************************/ + +bool DatagramDescriptor::SelectForWrite() +{ + /* Changed 15Nov07, per bug report by Mark Zvillius. + * The outbound data size will be zero if there are zero-length outbound packets, + * so we now select writable in case the outbound page buffer is not empty. + * Note that the superclass ShouldDelete method still checks for outbound data size, + * which may be wrong. + */ + //return (GetOutboundDataSize() > 0); (Original) + return (OutboundPages.size() > 0); +} + + +/************************************ +DatagramDescriptor::SendOutboundData +************************************/ + +int DatagramDescriptor::SendOutboundData (const char *data, unsigned long length) +{ + // This is almost an exact clone of ConnectionDescriptor::_SendRawOutboundData. + // That means most of it could be factored to a common ancestor. Note that + // empty datagrams are meaningful, which isn't the case for TCP streams. + + if (IsCloseScheduled()) + return 0; + + if (!data && (length > 0)) + throw std::runtime_error ("bad outbound data"); + char *buffer = (char *) malloc (length + 1); + if (!buffer) + throw std::runtime_error ("no allocation for outbound data"); + memcpy (buffer, data, length); + buffer [length] = 0; + OutboundPages.push_back (OutboundPage (buffer, length, ReturnAddress)); + OutboundDataSize += length; + + #ifdef HAVE_EPOLL + EpollEvent.events = (EPOLLIN | EPOLLOUT); + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + #ifdef HAVE_KQUEUE + bKqueueArmWrite = true; + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + + return length; +} + + +/**************************************** +DatagramDescriptor::SendOutboundDatagram +****************************************/ + +int DatagramDescriptor::SendOutboundDatagram (const char *data, unsigned long length, const char *address, int port) +{ + // This is an exact clone of ConnectionDescriptor::SendOutboundData. + // That means it needs to move to a common ancestor. + // TODO: Refactor this so there's no overlap with SendOutboundData. + + if (IsCloseScheduled()) + //if (bCloseNow || bCloseAfterWriting) + return 0; + + if (!address || !*address || !port) + return 0; + + struct sockaddr_in6 addr_here; + size_t addr_here_len = sizeof addr_here; + if (0 != EventMachine_t::name2address (address, port, SOCK_DGRAM, (struct sockaddr *)&addr_here, &addr_here_len)) + return -1; + + if (!data && (length > 0)) + throw std::runtime_error ("bad outbound data"); + char *buffer = (char *) malloc (length + 1); + if (!buffer) + throw std::runtime_error ("no allocation for outbound data"); + memcpy (buffer, data, length); + buffer [length] = 0; + OutboundPages.push_back (OutboundPage (buffer, length, addr_here)); + OutboundDataSize += length; + + #ifdef HAVE_EPOLL + EpollEvent.events = (EPOLLIN | EPOLLOUT); + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + #ifdef HAVE_KQUEUE + bKqueueArmWrite = true; + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + + return length; +} + + +/********************************************** +ConnectionDescriptor::GetCommInactivityTimeout +**********************************************/ + +uint64_t ConnectionDescriptor::GetCommInactivityTimeout() +{ + return InactivityTimeout / 1000; +} + + +/********************************************** +ConnectionDescriptor::SetCommInactivityTimeout +**********************************************/ + +int ConnectionDescriptor::SetCommInactivityTimeout (uint64_t value) +{ + InactivityTimeout = value * 1000; + MyEventMachine->QueueHeartbeat(this); + return 1; +} + +/******************************* +DatagramDescriptor::GetPeername +*******************************/ + +bool DatagramDescriptor::GetPeername (struct sockaddr *s, socklen_t *len) +{ + bool ok = false; + if (s) { + *len = sizeof(ReturnAddress); + memset (s, 0, sizeof(ReturnAddress)); + memcpy (s, &ReturnAddress, sizeof(ReturnAddress)); + ok = true; + } + return ok; +} + + +/******************************************** +DatagramDescriptor::GetCommInactivityTimeout +********************************************/ + +uint64_t DatagramDescriptor::GetCommInactivityTimeout() +{ + return InactivityTimeout / 1000; +} + +/******************************************** +DatagramDescriptor::SetCommInactivityTimeout +********************************************/ + +int DatagramDescriptor::SetCommInactivityTimeout (uint64_t value) +{ + if (value > 0) { + InactivityTimeout = value * 1000; + MyEventMachine->QueueHeartbeat(this); + return 1; + } + return 0; +} + + +/************************************ +InotifyDescriptor::InotifyDescriptor +*************************************/ + +InotifyDescriptor::InotifyDescriptor (EventMachine_t *em): + EventableDescriptor(0, em) +{ + bCallbackUnbind = false; + + #ifndef HAVE_INOTIFY + throw std::runtime_error("no inotify support on this system"); + #else + + int fd = inotify_init(); + if (fd == -1) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "unable to create inotify descriptor: %s", strerror(errno)); + throw std::runtime_error (buf); + } + + MySocket = fd; + SetSocketNonblocking(MySocket); + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + #endif + + #endif +} + + +/************************************* +InotifyDescriptor::~InotifyDescriptor +**************************************/ + +InotifyDescriptor::~InotifyDescriptor() +{ + close(MySocket); + MySocket = INVALID_SOCKET; +} + +/*********************** +InotifyDescriptor::Read +************************/ + +void InotifyDescriptor::Read() +{ + assert (MyEventMachine); + MyEventMachine->_ReadInotifyEvents(); +} + + +/************************ +InotifyDescriptor::Write +*************************/ + +void InotifyDescriptor::Write() +{ + throw std::runtime_error("bad code path in inotify"); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ed.h b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ed.h new file mode 100644 index 0000000..e660626 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ed.h @@ -0,0 +1,457 @@ +/***************************************************************************** + +$Id$ + +File: ed.h +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#ifndef __EventableDescriptor__H_ +#define __EventableDescriptor__H_ + + +class EventMachine_t; // forward reference +#ifdef WITH_SSL +class SslBox_t; // forward reference +#endif + +bool SetSocketNonblocking (SOCKET); +bool SetFdCloexec (int); + +/************************* +class EventableDescriptor +*************************/ + +class EventableDescriptor: public Bindable_t +{ + public: + EventableDescriptor (SOCKET, EventMachine_t*); + virtual ~EventableDescriptor() NO_EXCEPT_FALSE; + + SOCKET GetSocket() {return MySocket;} + void SetSocketInvalid() { MySocket = INVALID_SOCKET; } + void Close(); + + virtual void Read() = 0; + virtual void Write() = 0; + virtual void Heartbeat() = 0; + + // These methods tell us whether the descriptor + // should be selected or polled for read/write. + virtual bool SelectForRead() = 0; + virtual bool SelectForWrite() = 0; + + // are we scheduled for a close, or in an error state, or already closed? + bool ShouldDelete(); + // Do we have any data to write? This is used by ShouldDelete. + virtual int GetOutboundDataSize() {return 0;} + virtual bool IsWatchOnly(){ return bWatchOnly; } + + virtual void ScheduleClose (bool after_writing); + bool IsCloseScheduled(); + virtual void HandleError(){ ScheduleClose (false); } + + void SetEventCallback (EMCallback); + + virtual bool GetPeername (struct sockaddr*, socklen_t*) = 0; + virtual bool GetSockname (struct sockaddr*, socklen_t*) = 0; + virtual bool GetSubprocessPid (pid_t*) {return false;} + + virtual void StartTls() {} + virtual void SetTlsParms (const char *, const char *, bool, bool, const char *, const char *, const char *, const char *, int) {} + + #ifdef WITH_SSL + virtual X509 *GetPeerCert() {return NULL;} + virtual int GetCipherBits() {return -1;} + virtual const char *GetCipherName() {return NULL;} + virtual const char *GetCipherProtocol() {return NULL;} + virtual const char *GetSNIHostname() {return NULL;} + #endif + + virtual uint64_t GetCommInactivityTimeout() {return 0;} + virtual int SetCommInactivityTimeout (uint64_t) {return 0;} + uint64_t GetPendingConnectTimeout(); + int SetPendingConnectTimeout (uint64_t value); + uint64_t GetLastActivity() { return LastActivity; } + + #ifdef HAVE_EPOLL + struct epoll_event *GetEpollEvent() { return &EpollEvent; } + #endif + + #ifdef HAVE_KQUEUE + bool GetKqueueArmWrite() { return bKqueueArmWrite; } + #endif + + virtual void StartProxy(const uintptr_t, const unsigned long, const unsigned long); + virtual void StopProxy(); + virtual unsigned long GetProxiedBytes(){ return ProxiedBytes; }; + virtual void SetProxiedFrom(EventableDescriptor*, const unsigned long); + virtual int SendOutboundData(const char*,unsigned long){ return -1; } + virtual bool IsPaused(){ return bPaused; } + virtual bool Pause(){ bPaused = true; return bPaused; } + virtual bool Resume(){ bPaused = false; return bPaused; } + + void SetUnbindReasonCode(int code){ UnbindReasonCode = code; } + virtual int ReportErrorStatus(){ return 0; } + virtual bool IsConnectPending(){ return false; } + virtual uint64_t GetNextHeartbeat(); + + private: + bool bCloseNow; + bool bCloseAfterWriting; + + protected: + SOCKET MySocket; + bool bAttached; + bool bWatchOnly; + + EMCallback EventCallback; + void _GenericInboundDispatch (const char *buffer, unsigned long size); + bool _GenericGetPeername (struct sockaddr*, socklen_t*); + bool _GenericGetSockname (struct sockaddr*, socklen_t*); + + uint64_t CreatedAt; + bool bCallbackUnbind; + int UnbindReasonCode; + + unsigned long BytesToProxy; + EventableDescriptor *ProxyTarget; + EventableDescriptor *ProxiedFrom; + unsigned long ProxiedBytes; + + unsigned long MaxOutboundBufSize; + + #ifdef HAVE_EPOLL + struct epoll_event EpollEvent; + #endif + + #ifdef HAVE_KQUEUE + bool bKqueueArmWrite; + #endif + + EventMachine_t *MyEventMachine; + uint64_t PendingConnectTimeout; + uint64_t InactivityTimeout; + uint64_t LastActivity; + uint64_t NextHeartbeat; + bool bPaused; +}; + + + +/************************* +class LoopbreakDescriptor +*************************/ + +class LoopbreakDescriptor: public EventableDescriptor +{ + public: + LoopbreakDescriptor (SOCKET, EventMachine_t*); + virtual ~LoopbreakDescriptor() {} + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat() {} + + virtual bool SelectForRead() {return true;} + virtual bool SelectForWrite() {return false;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return _GenericGetPeername (s, len); } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); } +}; + + +/************************** +class ConnectionDescriptor +**************************/ + +class ConnectionDescriptor: public EventableDescriptor +{ + public: + ConnectionDescriptor (SOCKET, EventMachine_t*); + virtual ~ConnectionDescriptor(); + + int SendOutboundData (const char*, unsigned long); + + void SetConnectPending (bool f); + virtual void ScheduleClose (bool after_writing); + virtual void HandleError(); + + void SetNotifyReadable (bool); + void SetNotifyWritable (bool); + void SetAttached (bool); + void SetWatchOnly (bool); + + bool Pause(); + bool Resume(); + + bool IsNotifyReadable(){ return bNotifyReadable; } + bool IsNotifyWritable(){ return bNotifyWritable; } + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat(); + + virtual bool SelectForRead(); + virtual bool SelectForWrite(); + + // Do we have any data to write? This is used by ShouldDelete. + virtual int GetOutboundDataSize() {return OutboundDataSize;} + + virtual void StartTls(); + virtual void SetTlsParms (const char *, const char *, bool, bool, const char *, const char *, const char *, const char *, int); + + #ifdef WITH_SSL + virtual X509 *GetPeerCert(); + virtual int GetCipherBits(); + virtual const char *GetCipherName(); + virtual const char *GetCipherProtocol(); + virtual const char *GetSNIHostname(); + virtual bool VerifySslPeer(const char*); + virtual void AcceptSslPeer(); + #endif + + void SetServerMode() {bIsServer = true;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return _GenericGetPeername (s, len); } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); } + + virtual uint64_t GetCommInactivityTimeout(); + virtual int SetCommInactivityTimeout (uint64_t value); + + virtual int ReportErrorStatus(); + virtual bool IsConnectPending(){ return bConnectPending; } + + protected: + struct OutboundPage { + OutboundPage (const char *b, int l, int o=0): Buffer(b), Length(l), Offset(o) {} + void Free() {if (Buffer) free (const_cast(Buffer)); } + const char *Buffer; + int Length; + int Offset; + }; + + protected: + bool bConnectPending; + + bool bNotifyReadable; + bool bNotifyWritable; + + bool bReadAttemptedAfterClose; + bool bWriteAttemptedAfterClose; + + deque OutboundPages; + int OutboundDataSize; + + #ifdef WITH_SSL + SslBox_t *SslBox; + std::string CertChainFilename; + std::string PrivateKeyFilename; + std::string CipherList; + std::string EcdhCurve; + std::string DhParam; + int Protocols; + bool bHandshakeSignaled; + bool bSslVerifyPeer; + bool bSslFailIfNoPeerCert; + std::string SniHostName; + bool bSslPeerAccepted; + #endif + + #ifdef HAVE_KQUEUE + bool bGotExtraKqueueEvent; + #endif + + bool bIsServer; + + private: + void _UpdateEvents(); + void _UpdateEvents(bool, bool); + void _WriteOutboundData(); + void _DispatchInboundData (const char *buffer, unsigned long size); + void _DispatchCiphertext(); + int _SendRawOutboundData (const char *buffer, unsigned long size); + void _CheckHandshakeStatus(); + +}; + + +/************************ +class DatagramDescriptor +************************/ + +class DatagramDescriptor: public EventableDescriptor +{ + public: + DatagramDescriptor (SOCKET, EventMachine_t*); + virtual ~DatagramDescriptor(); + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat(); + + virtual bool SelectForRead() {return true;} + virtual bool SelectForWrite(); + + int SendOutboundData (const char*, unsigned long); + int SendOutboundDatagram (const char*, unsigned long, const char*, int); + + // Do we have any data to write? This is used by ShouldDelete. + virtual int GetOutboundDataSize() {return OutboundDataSize;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len); + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); }; + + virtual uint64_t GetCommInactivityTimeout(); + virtual int SetCommInactivityTimeout (uint64_t value); + + protected: + struct OutboundPage { + OutboundPage (const char *b, int l, struct sockaddr_in6 f, int o=0): Buffer(b), Length(l), Offset(o), From(f) {} + void Free() {if (Buffer) free (const_cast(Buffer)); } + const char *Buffer; + int Length; + int Offset; + struct sockaddr_in6 From; + }; + + deque OutboundPages; + int OutboundDataSize; + + struct sockaddr_in6 ReturnAddress; +}; + + +/************************ +class AcceptorDescriptor +************************/ + +class AcceptorDescriptor: public EventableDescriptor +{ + public: + AcceptorDescriptor (SOCKET, EventMachine_t*); + virtual ~AcceptorDescriptor(); + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat(); + + virtual bool SelectForRead() {return true;} + virtual bool SelectForWrite() {return false;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return _GenericGetPeername (s, len); } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); }; + + static void StopAcceptor (const uintptr_t binding); +}; + +/******************** +class PipeDescriptor +********************/ + +#ifdef OS_UNIX +class PipeDescriptor: public EventableDescriptor +{ + public: + PipeDescriptor (SOCKET, pid_t, EventMachine_t*); + virtual ~PipeDescriptor() NO_EXCEPT_FALSE; + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat(); + + virtual bool SelectForRead(); + virtual bool SelectForWrite(); + + int SendOutboundData (const char*, unsigned long); + virtual int GetOutboundDataSize() {return OutboundDataSize;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return _GenericGetPeername (s, len); } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); } + + virtual bool GetSubprocessPid (pid_t*); + + protected: + struct OutboundPage { + OutboundPage (const char *b, int l, int o=0): Buffer(b), Length(l), Offset(o) {} + void Free() {if (Buffer) free (const_cast(Buffer)); } + const char *Buffer; + int Length; + int Offset; + }; + + protected: + bool bReadAttemptedAfterClose; + + deque OutboundPages; + int OutboundDataSize; + + pid_t SubprocessPid; + + private: + void _DispatchInboundData (const char *buffer, int size); +}; +#endif // OS_UNIX + + +/************************ +class KeyboardDescriptor +************************/ + +class KeyboardDescriptor: public EventableDescriptor +{ + public: + KeyboardDescriptor (EventMachine_t*); + virtual ~KeyboardDescriptor(); + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat(); + + virtual bool SelectForRead() {return true;} + virtual bool SelectForWrite() {return false;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return _GenericGetPeername (s, len); } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); } + + protected: + bool bReadAttemptedAfterClose; + + private: + void _DispatchInboundData (const char *buffer, int size); +}; + + +/*********************** +class InotifyDescriptor +************************/ + +class InotifyDescriptor: public EventableDescriptor +{ + public: + InotifyDescriptor (EventMachine_t*); + virtual ~InotifyDescriptor(); + + void Read(); + void Write(); + + virtual void Heartbeat() {} + virtual bool SelectForRead() {return true;} + virtual bool SelectForWrite() {return false;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return false; } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return false; } +}; + +#endif // __EventableDescriptor__H_ diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ed.o b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ed.o new file mode 100644 index 0000000000000000000000000000000000000000..566f1b7a50286848d80d8983868634320df5db22 GIT binary patch literal 1155932 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

F!{uhIV^yP-2vXg0({nF1XYI|u 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≻IE1z5{Q;z8HnS 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::iterator f = Files.begin(); + UnwatchFile (f->first); + } + + if (epfd != -1) + close (epfd); + if (kqfd != -1) + close (kqfd); + + delete SelectData; +} + + +/**************************** +EventMachine_t::ScheduleHalt +****************************/ + +void EventMachine_t::ScheduleHalt() +{ + /* This is how we stop the machine. + * This can be called by clients. Signal handlers will probably + * set the global flag. + * For now this means there can only be one EventMachine ever running at a time. + * + * IMPORTANT: keep this light, fast, and async-safe. Don't do anything frisky in here, + * because it may be called from signal handlers invoked from code that we don't + * control. At this writing (20Sep06), EM does NOT install any signal handlers of + * its own. + * + * We need a FAQ. And one of the questions is: how do I stop EM when Ctrl-C happens? + * The answer is to call evma_stop_machine, which calls here, from a SIGINT handler. + */ + bTerminateSignalReceived = true; + + /* Signal the loopbreaker so we break out of long-running select/epoll/kqueue and + * notice the halt boolean is set. Signalling the loopbreaker also uses a single + * signal-safe syscall. + */ + SignalLoopBreaker(); +} + +bool EventMachine_t::Stopping() +{ + return bTerminateSignalReceived; +} + +/******************************* +EventMachine_t::SetTimerQuantum +*******************************/ + +void EventMachine_t::SetTimerQuantum (int interval) +{ + /* We get a timer-quantum expressed in milliseconds. + */ + + if ((interval < 5) || (interval > 5*60*1000)) + throw std::runtime_error ("invalid timer-quantum"); + + Quantum.tv_sec = interval / 1000; + Quantum.tv_usec = (interval % 1000) * 1000; +} + + +/************************************* +(STATIC) EventMachine_t::SetuidString +*************************************/ + +#ifdef OS_UNIX +void EventMachine_t::SetuidString (const char *username) +{ + /* This method takes a caller-supplied username and tries to setuid + * to that user. There is no meaningful implementation (and no error) + * on Windows. On Unix, a failure to setuid the caller-supplied string + * causes a fatal abort, because presumably the program is calling here + * in order to fulfill a security requirement. If we fail silently, + * the user may continue to run with too much privilege. + * + * TODO, we need to decide on and document a way of generating C++ level errors + * that can be wrapped in documented Ruby exceptions, so users can catch + * and handle them. And distinguish it from errors that we WON'T let the Ruby + * user catch (like security-violations and resource-overallocation). + * A setuid failure here would be in the latter category. + */ + + if (!username || !*username) + throw std::runtime_error ("setuid_string failed: no username specified"); + + errno = 0; + struct passwd *p = getpwnam (username); + if (!p) { + if (errno) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "setuid_string failed: %s", strerror(errno)); + throw std::runtime_error (buf); + } else { + throw std::runtime_error ("setuid_string failed: unknown username"); + } + } + + if (setuid (p->pw_uid) != 0) + throw std::runtime_error ("setuid_string failed: no setuid"); + + // Success. +} +#else +void EventMachine_t::SetuidString (const char *username UNUSED) { } +#endif + +/**************************************** +(STATIC) EventMachine_t::SetRlimitNofile +****************************************/ + +#ifdef OS_UNIX +int EventMachine_t::SetRlimitNofile (int nofiles) +{ + struct rlimit rlim; + getrlimit (RLIMIT_NOFILE, &rlim); + if (nofiles >= 0) { + rlim.rlim_cur = nofiles; + if ((unsigned int)nofiles > rlim.rlim_max) + rlim.rlim_max = nofiles; + setrlimit (RLIMIT_NOFILE, &rlim); + // ignore the error return, for now at least. + // TODO, emit an error message someday when we have proper debug levels. + } + getrlimit (RLIMIT_NOFILE, &rlim); + return rlim.rlim_cur; +} +#else +int EventMachine_t::SetRlimitNofile (int nofiles UNUSED) { return 0; } +#endif + +/********************************* +EventMachine_t::SignalLoopBreaker +*********************************/ + +void EventMachine_t::SignalLoopBreaker() +{ + #ifdef OS_UNIX + (void)write (LoopBreakerWriter, "", 1); + #endif + #ifdef OS_WIN32 + sendto (LoopBreakerReader, "", 0, 0, (struct sockaddr*)&(LoopBreakerTarget), sizeof(LoopBreakerTarget)); + #endif +} + + +/************************************** +EventMachine_t::_InitializeLoopBreaker +**************************************/ + +void EventMachine_t::_InitializeLoopBreaker() +{ + /* A "loop-breaker" is a socket-descriptor that we can write to in order + * to break the main select loop. Primarily useful for things running on + * threads other than the main EM thread, so they can trigger processing + * of events that arise exogenously to the EM. + * Keep the loop-breaker pipe out of the main descriptor set, otherwise + * its events will get passed on to user code. + */ + + #ifdef OS_UNIX + int fd[2]; +#if defined (HAVE_CLOEXEC) && defined (HAVE_PIPE2) + int pipestatus = pipe2(fd, O_CLOEXEC); + if (pipestatus < 0) { + if (pipe(fd)) + throw std::runtime_error (strerror(errno)); + } +#else + if (pipe (fd)) + throw std::runtime_error (strerror(errno)); +#endif + if (!SetFdCloexec(fd[0]) || !SetFdCloexec(fd[1])) + throw std::runtime_error (strerror(errno)); + + LoopBreakerWriter = fd[1]; + LoopBreakerReader = fd[0]; + + /* 16Jan11: Make sure the pipe is non-blocking, so more than 65k loopbreaks + * in one tick do not fill up the pipe and block the process on write() */ + SetSocketNonblocking (LoopBreakerWriter); + #endif + + #ifdef OS_WIN32 + SOCKET sd = EmSocket (AF_INET, SOCK_DGRAM, 0); + if (sd == INVALID_SOCKET) + throw std::runtime_error ("no loop breaker socket"); + SetSocketNonblocking (sd); + + memset (&LoopBreakerTarget, 0, sizeof(LoopBreakerTarget)); + LoopBreakerTarget.sin_family = AF_INET; + LoopBreakerTarget.sin_addr.s_addr = inet_addr ("127.0.0.1"); + + srand ((int)time(NULL)); + int i; + for (i=0; i < 100; i++) { + int r = (rand() % 10000) + 20000; + LoopBreakerTarget.sin_port = htons (r); + if (bind (sd, (struct sockaddr*)&LoopBreakerTarget, sizeof(LoopBreakerTarget)) == 0) + break; + } + + if (i == 100) + throw std::runtime_error ("no loop breaker"); + LoopBreakerReader = sd; + #endif + + #ifdef HAVE_EPOLL + if (Poller == Poller_Epoll) { + epfd = epoll_create (MaxEpollDescriptors); + if (epfd == -1) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "unable to create epoll descriptor: %s", strerror(errno)); + throw std::runtime_error (buf); + } + int cloexec = fcntl (epfd, F_GETFD, 0); + assert (cloexec >= 0); + cloexec |= FD_CLOEXEC; + fcntl (epfd, F_SETFD, cloexec); + + assert (LoopBreakerReader >= 0); + LoopbreakDescriptor *ld = new LoopbreakDescriptor (LoopBreakerReader, this); + assert (ld); + Add (ld); + } + #endif + + #ifdef HAVE_KQUEUE + if (Poller == Poller_Kqueue) { + kqfd = kqueue(); + if (kqfd == -1) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "unable to create kqueue descriptor: %s", strerror(errno)); + throw std::runtime_error (buf); + } + // cloexec not needed. By definition, kqueues are not carried across forks. + + assert (LoopBreakerReader >= 0); + LoopbreakDescriptor *ld = new LoopbreakDescriptor (LoopBreakerReader, this); + assert (ld); + Add (ld); + } + #endif +} + +/*************************** +EventMachine_t::_UpdateTime +***************************/ + +void EventMachine_t::_UpdateTime() +{ + MyCurrentLoopTime = GetRealTime(); +} + +/*************************** +EventMachine_t::GetRealTime +***************************/ + +// Two great writeups of cross-platform monotonic time are at: +// http://www.python.org/dev/peps/pep-0418 +// http://nadeausoftware.com/articles/2012/04/c_c_tip_how_measure_elapsed_real_time_benchmarking +// Uncomment the #pragma messages to confirm which compile-time option was used +uint64_t EventMachine_t::GetRealTime() +{ + uint64_t current_time; + + #if defined(HAVE_CONST_CLOCK_MONOTONIC_RAW) + // #pragma message "GetRealTime: clock_gettime CLOCK_MONOTONIC_RAW" + // Linux 2.6.28 and above + struct timespec tv; + clock_gettime (CLOCK_MONOTONIC_RAW, &tv); + current_time = (((uint64_t)(tv.tv_sec)) * 1000000LL) + ((uint64_t)((tv.tv_nsec)/1000)); + + #elif defined(HAVE_CONST_CLOCK_MONOTONIC) + // #pragma message "GetRealTime: clock_gettime CLOCK_MONOTONIC" + // Linux, FreeBSD 5.0 and above, Solaris 8 and above, OpenBSD, NetBSD, DragonflyBSD + struct timespec tv; + clock_gettime (CLOCK_MONOTONIC, &tv); + current_time = (((uint64_t)(tv.tv_sec)) * 1000000LL) + ((uint64_t)((tv.tv_nsec)/1000)); + + #elif defined(HAVE_GETHRTIME) + // #pragma message "GetRealTime: gethrtime" + // Solaris and HP-UX + current_time = (uint64_t)gethrtime() / 1000; + + #elif defined(OS_DARWIN) + // #pragma message "GetRealTime: mach_absolute_time" + // Mac OS X + // https://developer.apple.com/library/mac/qa/qa1398/_index.html + current_time = mach_absolute_time() * mach_timebase.numer / mach_timebase.denom / 1000; + + #elif defined(OS_UNIX) + // #pragma message "GetRealTime: gettimeofday" + // Unix fallback + struct timeval tv; + gettimeofday (&tv, NULL); + current_time = (((uint64_t)(tv.tv_sec)) * 1000000LL) + ((uint64_t)(tv.tv_usec)); + + #elif defined(OS_WIN32) + // #pragma message "GetRealTime: GetTickCount" + // Future improvement: use GetTickCount64 in Windows Vista / Server 2008 + unsigned tick = GetTickCount(); + if (tick < LastTickCount) + TickCountTickover += 1; + LastTickCount = tick; + current_time = ((uint64_t)TickCountTickover << 32) + (uint64_t)tick; + current_time *= 1000; // convert to microseconds + + #else + // #pragma message "GetRealTime: time" + // Universal fallback + current_time = (uint64_t)time(NULL) * 1000000LL; + #endif + + return current_time; +} + +/*********************************** +EventMachine_t::_DispatchHeartbeats +***********************************/ + +void EventMachine_t::_DispatchHeartbeats() +{ + // Store the first processed heartbeat descriptor and bail out if + // we see it again. This fixes an infinite loop in case the system time + // is changed out from underneath MyCurrentLoopTime. + const EventableDescriptor *head = NULL; + + while (true) { + multimap::iterator i = Heartbeats.begin(); + if (i == Heartbeats.end()) + break; + if (i->first > MyCurrentLoopTime) + break; + + EventableDescriptor *ed = i->second; + if (ed == head) + break; + + ed->Heartbeat(); + QueueHeartbeat(ed); + + if (head == NULL) + head = ed; + } +} + +/****************************** +EventMachine_t::QueueHeartbeat +******************************/ + +void EventMachine_t::QueueHeartbeat(EventableDescriptor *ed) +{ + uint64_t heartbeat = ed->GetNextHeartbeat(); + + if (heartbeat) { + #ifndef HAVE_MAKE_PAIR + Heartbeats.insert (multimap::value_type (heartbeat, ed)); + #else + Heartbeats.insert (make_pair (heartbeat, ed)); + #endif + } +} + +/****************************** +EventMachine_t::ClearHeartbeat +******************************/ + +void EventMachine_t::ClearHeartbeat(uint64_t key, EventableDescriptor* ed) +{ + multimap::iterator it; + pair::iterator,multimap::iterator> ret; + ret = Heartbeats.equal_range (key); + for (it = ret.first; it != ret.second; ++it) { + if (it->second == ed) { + Heartbeats.erase (it); + break; + } + } +} + +/******************* +EventMachine_t::Run +*******************/ + +void EventMachine_t::Run() +{ + while (RunOnce()) ; +} + +/*********************** +EventMachine_t::RunOnce +***********************/ + +bool EventMachine_t::RunOnce() +{ + _UpdateTime(); + _RunTimers(); + + /* _Add must precede _Modify because the same descriptor might + * be on both lists during the same pass through the machine, + * and to modify a descriptor before adding it would fail. + */ + _AddNewDescriptors(); + _ModifyDescriptors(); + + switch (Poller) { + case Poller_Epoll: + _RunEpollOnce(); + break; + case Poller_Kqueue: + _RunKqueueOnce(); + break; + case Poller_Default: + _RunSelectOnce(); + break; + } + + _DispatchHeartbeats(); + _CleanupSockets(); + + if (bTerminateSignalReceived) + return false; + + return true; +} + + +/***************************** +EventMachine_t::_RunEpollOnce +*****************************/ + +void EventMachine_t::_RunEpollOnce() +{ + #ifdef HAVE_EPOLL + assert (epfd != -1); + int s; + + timeval tv = _TimeTilNextEvent(); + + #ifdef BUILD_FOR_RUBY + int ret = 0; + + #ifdef HAVE_RB_WAIT_FOR_SINGLE_FD + if ((ret = rb_wait_for_single_fd(epfd, RB_WAITFD_IN|RB_WAITFD_PRI, &tv)) < 1) { + #else + fd_set fdreads; + + FD_ZERO(&fdreads); + FD_SET(epfd, &fdreads); + + if ((ret = rb_thread_select(epfd + 1, &fdreads, NULL, NULL, &tv)) < 1) { + #endif + if (ret == -1) { + assert(errno != EINVAL); + assert(errno != EBADF); + } + return; + } + + TRAP_BEG; + s = epoll_wait (epfd, epoll_events, MaxEvents, 0); + TRAP_END; + #else + int duration = 0; + duration = duration + (tv.tv_sec * 1000); + duration = duration + (tv.tv_usec / 1000); + s = epoll_wait (epfd, epoll_events, MaxEvents, duration); + #endif + + if (s > 0) { + for (int i=0; i < s; i++) { + EventableDescriptor *ed = (EventableDescriptor*) epoll_events[i].data.ptr; + + if (ed->IsWatchOnly() && ed->GetSocket() == INVALID_SOCKET) + continue; + + assert(ed->GetSocket() != INVALID_SOCKET); + + if (epoll_events[i].events & EPOLLIN) + ed->Read(); + if (epoll_events[i].events & EPOLLOUT) + ed->Write(); + if (epoll_events[i].events & (EPOLLERR | EPOLLHUP)) + ed->HandleError(); + } + } + else if (s < 0) { + // epoll_wait can fail on error in a handful of ways. + // If this happens, then wait for a little while to avoid busy-looping. + // If the error was EINTR, we probably caught SIGCHLD or something, + // so keep the wait short. + timeval tv = {0, ((errno == EINTR) ? 5 : 50) * 1000}; + EmSelect (0, NULL, NULL, NULL, &tv); + } + #else + throw std::runtime_error ("epoll is not implemented on this platform"); + #endif +} + + +/****************************** +EventMachine_t::_RunKqueueOnce +******************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::_RunKqueueOnce() +{ + assert (kqfd != -1); + int k; + + timeval tv = _TimeTilNextEvent(); + + struct timespec ts; + ts.tv_sec = tv.tv_sec; + ts.tv_nsec = tv.tv_usec * 1000; + + #ifdef BUILD_FOR_RUBY + int ret = 0; + + #ifdef HAVE_RB_WAIT_FOR_SINGLE_FD + if ((ret = rb_wait_for_single_fd(kqfd, RB_WAITFD_IN|RB_WAITFD_PRI, &tv)) < 1) { + #else + fd_set fdreads; + + FD_ZERO(&fdreads); + FD_SET(kqfd, &fdreads); + + if ((ret = rb_thread_select(kqfd + 1, &fdreads, NULL, NULL, &tv)) < 1) { + #endif + if (ret == -1) { + assert(errno != EINVAL); + assert(errno != EBADF); + } + return; + } + + TRAP_BEG; + ts.tv_sec = ts.tv_nsec = 0; + k = kevent (kqfd, NULL, 0, Karray, MaxEvents, &ts); + TRAP_END; + #else + k = kevent (kqfd, NULL, 0, Karray, MaxEvents, &ts); + #endif + + struct kevent *ke = Karray; + while (k > 0) { + switch (ke->filter) + { + case EVFILT_VNODE: + _HandleKqueueFileEvent (ke); + break; + + case EVFILT_PROC: + _HandleKqueuePidEvent (ke); + break; + + case EVFILT_READ: + case EVFILT_WRITE: + EventableDescriptor *ed = (EventableDescriptor*) (ke->udata); + assert (ed); + + if (ed->IsWatchOnly() && ed->GetSocket() == INVALID_SOCKET) + break; + + if (ke->filter == EVFILT_READ) + ed->Read(); + else if (ke->filter == EVFILT_WRITE) + ed->Write(); + else + cerr << "Discarding unknown kqueue event " << ke->filter << endl; + + break; + } + + --k; + ++ke; + } + + // TODO, replace this with rb_thread_blocking_region for 1.9 builds. + #ifdef BUILD_FOR_RUBY + if (!rb_thread_alone()) { + rb_thread_schedule(); + } + #endif +} +#else +void EventMachine_t::_RunKqueueOnce() +{ + throw std::runtime_error ("kqueue is not implemented on this platform"); +} +#endif + + +/********************************* +EventMachine_t::_TimeTilNextEvent +*********************************/ + +timeval EventMachine_t::_TimeTilNextEvent() +{ + // 29jul11: Changed calculation base from MyCurrentLoopTime to the + // real time. As MyCurrentLoopTime is set at the beginning of an + // iteration and this calculation is done at the end, evenmachine + // will potentially oversleep by the amount of time the iteration + // took to execute. + uint64_t next_event = 0; + uint64_t current_time = GetRealTime(); + + if (!Heartbeats.empty()) { + multimap::iterator heartbeats = Heartbeats.begin(); + next_event = heartbeats->first; + } + + if (!Timers.empty()) { + multimap::iterator timers = Timers.begin(); + if (next_event == 0 || timers->first < next_event) + next_event = timers->first; + } + + if (!NewDescriptors.empty() || !ModifiedDescriptors.empty()) { + next_event = current_time; + } + + timeval tv; + + if (NumCloseScheduled > 0 || bTerminateSignalReceived) { + tv.tv_sec = tv.tv_usec = 0; + } else if (next_event == 0) { + tv = Quantum; + } else { + if (next_event > current_time) { + uint64_t duration = next_event - current_time; + tv.tv_sec = duration / 1000000; + tv.tv_usec = duration % 1000000; + } else { + tv.tv_sec = tv.tv_usec = 0; + } + } + + return tv; +} + +/******************************* +EventMachine_t::_CleanupSockets +*******************************/ + +void EventMachine_t::_CleanupSockets() +{ + // TODO, rip this out and only delete the descriptors we know have died, + // rather than traversing the whole list. + // Modified 05Jan08 per suggestions by Chris Heath. It's possible that + // an EventableDescriptor will have a descriptor value of -1. That will + // happen if EventableDescriptor::Close was called on it. In that case, + // don't call epoll_ctl to remove the socket's filters from the epoll set. + // According to the epoll docs, this happens automatically when the + // descriptor is closed anyway. This is different from the case where + // the socket has already been closed but the descriptor in the ED object + // hasn't yet been set to INVALID_SOCKET. + // In kqueue, closing a descriptor automatically removes its event filters. + int i, j; + int nSockets = Descriptors.size(); + for (i=0, j=0; i < nSockets; i++) { + EventableDescriptor *ed = Descriptors[i]; + assert (ed); + if (ed->ShouldDelete()) { + DescriptorsToDelete.push_back(ed); + } + else + Descriptors [j++] = ed; + } + while ((size_t)j < Descriptors.size()) + Descriptors.pop_back(); + + nSockets = DescriptorsToDelete.size(); + for (i=0; i < nSockets; i++) { + EventableDescriptor *ed = DescriptorsToDelete[i]; + #ifdef HAVE_EPOLL + if (Poller == Poller_Epoll) { + assert (epfd != -1); + if (ed->GetSocket() != INVALID_SOCKET) { + int e = epoll_ctl (epfd, EPOLL_CTL_DEL, ed->GetSocket(), ed->GetEpollEvent()); + // ENOENT or EBADF are not errors because the socket may be already closed when we get here. + if (e && (errno != ENOENT) && (errno != EBADF) && (errno != EPERM)) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to delete epoll event: %s", strerror(errno)); + throw std::runtime_error (buf); + } + } + ModifiedDescriptors.erase(ed); + } + #endif + delete ed; + } + DescriptorsToDelete.clear(); +} + +/********************************* +EventMachine_t::_ModifyEpollEvent +*********************************/ + +#ifdef HAVE_EPOLL +void EventMachine_t::_ModifyEpollEvent (EventableDescriptor *ed) +{ + if (Poller == Poller_Epoll) { + assert (epfd != -1); + assert (ed); + assert (ed->GetSocket() != INVALID_SOCKET); + int e = epoll_ctl (epfd, EPOLL_CTL_MOD, ed->GetSocket(), ed->GetEpollEvent()); + if (e) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to modify epoll event: %s", strerror(errno)); + throw std::runtime_error (buf); + } + } +} +#else +void EventMachine_t::_ModifyEpollEvent (EventableDescriptor *ed UNUSED) { } +#endif + + +/************************** +SelectData_t::SelectData_t +**************************/ + +SelectData_t::SelectData_t() +{ + maxsocket = 0; + rb_fd_init (&fdreads); + rb_fd_init (&fdwrites); + rb_fd_init (&fderrors); +} + +SelectData_t::~SelectData_t() +{ + rb_fd_term (&fdreads); + rb_fd_term (&fdwrites); + rb_fd_term (&fderrors); +} + +#ifdef BUILD_FOR_RUBY +/***************** +_SelectDataSelect +*****************/ + +#if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) +static VALUE _SelectDataSelect (void *v) +{ + SelectData_t *sd = (SelectData_t*)v; + sd->nSockets = select (sd->maxsocket+1, rb_fd_ptr(&(sd->fdreads)), rb_fd_ptr(&(sd->fdwrites)), rb_fd_ptr(&(sd->fderrors)), &(sd->tv)); + return Qnil; +} +#endif + +/********************* +SelectData_t::_Select +*********************/ + +int SelectData_t::_Select() +{ + #if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) + // added in ruby 1.9.3 + rb_thread_call_without_gvl ((void *(*)(void *))_SelectDataSelect, (void*)this, RUBY_UBF_IO, 0); + return nSockets; + #elif defined(HAVE_TBR) + // added in ruby 1.9.1, deprecated in ruby 2.0.0 + rb_thread_blocking_region (_SelectDataSelect, (void*)this, RUBY_UBF_IO, 0); + return nSockets; + #else + return EmSelect (maxsocket+1, &fdreads, &fdwrites, &fderrors, &tv); + #endif +} +#endif + +void SelectData_t::_Clear() +{ + maxsocket = 0; + rb_fd_zero (&fdreads); + rb_fd_zero (&fdwrites); + rb_fd_zero (&fderrors); +} + +/****************************** +EventMachine_t::_RunSelectOnce +******************************/ + +void EventMachine_t::_RunSelectOnce() +{ + // Crank the event machine once. + // If there are no descriptors to process, then sleep + // for a few hundred mills to avoid busy-looping. + // This is based on a select loop. Alternately provide epoll + // if we know we're running on a 2.6 kernel. + // epoll will be effective if we provide it as an alternative, + // however it has the same problem interoperating with Ruby + // threads that select does. + + // Get ready for select() + SelectData->_Clear(); + + // Always read the loop-breaker reader. + // Changed 23Aug06, provisionally implemented for Windows with a UDP socket + // running on localhost with a randomly-chosen port. (*Puke*) + // Windows has a version of the Unix pipe() library function, but it doesn't + // give you back descriptors that are selectable. + rb_fd_set (LoopBreakerReader, &(SelectData->fdreads)); + if (SelectData->maxsocket < LoopBreakerReader) + SelectData->maxsocket = LoopBreakerReader; + + // prepare the sockets for reading and writing + size_t i; + for (i = 0; i < Descriptors.size(); i++) { + EventableDescriptor *ed = Descriptors[i]; + assert (ed); + SOCKET sd = ed->GetSocket(); + if (ed->IsWatchOnly() && sd == INVALID_SOCKET) + continue; + assert (sd != INVALID_SOCKET); + + if (ed->SelectForRead()) + rb_fd_set (sd, &(SelectData->fdreads)); + if (ed->SelectForWrite()) + rb_fd_set (sd, &(SelectData->fdwrites)); + + #ifdef OS_WIN32 + /* 21Sep09: on windows, a non-blocking connect() that fails does not come up as writable. + Instead, it is added to the error set. See http://www.mail-archive.com/openssl-users@openssl.org/msg58500.html + */ + if (ed->IsConnectPending()) + rb_fd_set (sd, &(SelectData->fderrors)); + #endif + + if (SelectData->maxsocket < sd) + SelectData->maxsocket = sd; + } + + + { // read and write the sockets + //timeval tv = {1, 0}; // Solaris fails if the microseconds member is >= 1000000. + //timeval tv = Quantum; + SelectData->tv = _TimeTilNextEvent(); + int s = SelectData->_Select(); + //rb_thread_blocking_region(xxx,(void*)&SelectData,RUBY_UBF_IO,0); + //int s = EmSelect (SelectData.maxsocket+1, &(SelectData.fdreads), &(SelectData.fdwrites), NULL, &(SelectData.tv)); + //int s = SelectData.nSockets; + if (s > 0) { + /* Changed 01Jun07. We used to handle the Loop-breaker right here. + * Now we do it AFTER all the regular descriptors. There's an + * incredibly important and subtle reason for this. Code on + * loop breakers is sometimes used to cause the reactor core to + * cycle (for example, to allow outbound network buffers to drain). + * If a loop-breaker handler reschedules itself (say, after determining + * that the write buffers are still too full), then it will execute + * IMMEDIATELY if _ReadLoopBreaker is done here instead of after + * the other descriptors are processed. That defeats the whole purpose. + */ + for (i=0; i < Descriptors.size(); i++) { + EventableDescriptor *ed = Descriptors[i]; + assert (ed); + SOCKET sd = ed->GetSocket(); + if (ed->IsWatchOnly() && sd == INVALID_SOCKET) + continue; + assert (sd != INVALID_SOCKET); + + if (rb_fd_isset (sd, &(SelectData->fdwrites))) { + // Double-check SelectForWrite() still returns true. If not, one of the callbacks must have + // modified some value since we checked SelectForWrite() earlier in this method. + if (ed->SelectForWrite()) + ed->Write(); + } + if (rb_fd_isset (sd, &(SelectData->fdreads))) + ed->Read(); + if (rb_fd_isset (sd, &(SelectData->fderrors))) + ed->HandleError(); + } + + if (rb_fd_isset (LoopBreakerReader, &(SelectData->fdreads))) + _ReadLoopBreaker(); + } + else if (s < 0) { + switch (errno) { + case EBADF: + _CleanBadDescriptors(); + break; + case EINVAL: + throw std::runtime_error ("Somehow EM passed an invalid nfds or invalid timeout to select(2), please report this!"); + break; + default: + // select can fail on error in a handful of ways. + // If this happens, then wait for a little while to avoid busy-looping. + // If the error was EINTR, we probably caught SIGCHLD or something, + // so keep the wait short. + timeval tv = {0, ((errno == EINTR) ? 5 : 50) * 1000}; + EmSelect (0, NULL, NULL, NULL, &tv); + } + } + } +} + +void EventMachine_t::_CleanBadDescriptors() +{ + size_t i; + + for (i = 0; i < Descriptors.size(); i++) { + EventableDescriptor *ed = Descriptors[i]; + if (ed->ShouldDelete()) + continue; + + SOCKET sd = ed->GetSocket(); + + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 0; + + rb_fdset_t fds; + rb_fd_init(&fds); + rb_fd_set(sd, &fds); + + int ret = rb_fd_select(sd + 1, &fds, NULL, NULL, &tv); + rb_fd_term(&fds); + + if (ret == -1) { + if (errno == EBADF) + ed->ScheduleClose(false); + } + } +} + +/******************************** +EventMachine_t::_ReadLoopBreaker +********************************/ + +void EventMachine_t::_ReadLoopBreaker() +{ + /* The loop breaker has selected readable. + * Read it ONCE (it may block if we try to read it twice) + * and send a loop-break event back to user code. + */ + char buffer [1024]; + (void)read (LoopBreakerReader, buffer, sizeof(buffer)); + if (EventCallback) + (*EventCallback)(0, EM_LOOPBREAK_SIGNAL, "", 0); +} + + +/************************** +EventMachine_t::_RunTimers +**************************/ + +void EventMachine_t::_RunTimers() +{ + // These are caller-defined timer handlers. + // We rely on the fact that multimaps sort by their keys to avoid + // inspecting the whole list every time we come here. + // Just keep inspecting and processing the list head until we hit + // one that hasn't expired yet. + + while (true) { + multimap::iterator i = Timers.begin(); + if (i == Timers.end()) + break; + if (i->first > MyCurrentLoopTime) + break; + if (EventCallback) + (*EventCallback) (0, EM_TIMER_FIRED, NULL, i->second.GetBinding()); + Timers.erase (i); + } +} + + + +/*********************************** +EventMachine_t::InstallOneshotTimer +***********************************/ + +const uintptr_t EventMachine_t::InstallOneshotTimer (uint64_t milliseconds) +{ + if (Timers.size() > MaxOutstandingTimers) + return false; + + uint64_t fire_at = GetRealTime(); + fire_at += ((uint64_t)milliseconds) * 1000LL; + + Timer_t t; + #ifndef HAVE_MAKE_PAIR + multimap::iterator i = Timers.insert (multimap::value_type (fire_at, t)); + #else + multimap::iterator i = Timers.insert (make_pair (fire_at, t)); + #endif + return i->second.GetBinding(); +} + + +/******************************* +EventMachine_t::ConnectToServer +*******************************/ + +const uintptr_t EventMachine_t::ConnectToServer (const char *bind_addr, int bind_port, const char *server, int port) +{ + /* We want to spend no more than a few seconds waiting for a connection + * to a remote host. So we use a nonblocking connect. + * Linux disobeys the usual rules for nonblocking connects. + * Per Stevens (UNP p.410), you expect a nonblocking connect to select + * both readable and writable on error, and not to return EINPROGRESS + * if the connect can be fulfilled immediately. Linux violates both + * of these expectations. + * Any kind of nonblocking connect on Linux returns EINPROGRESS. + * The socket will then return writable when the disposition of the + * connect is known, but it will not also be readable in case of + * error! Weirdly, it will be readable in case there is data to read!!! + * (Which can happen with protocols like SSH and SMTP.) + * I suppose if you were so inclined you could consider this logical, + * but it's not the way Unix has historically done it. + * So we ignore the readable flag and read getsockopt to see if there + * was an error connecting. A select timeout works as expected. + * In regard to getsockopt: Linux does the Berkeley-style thing, + * not the Solaris-style, and returns zero with the error code in + * the error parameter. + * Return the binding-text of the newly-created pending connection, + * or NULL if there was a problem. + */ + + if (!server || !*server || !port) + throw std::runtime_error ("invalid server or port"); + + struct sockaddr_storage bind_as; + size_t bind_as_len = sizeof bind_as; + int gai = name2address (server, port, SOCK_STREAM, (struct sockaddr *)&bind_as, &bind_as_len); + if (gai != 0) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to resolve address: %s", gai_strerror(gai)); + throw std::runtime_error (buf); + } + + SOCKET sd = EmSocket (bind_as.ss_family, SOCK_STREAM, 0); + if (sd == INVALID_SOCKET) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to create new socket: %s", strerror(errno)); + throw std::runtime_error (buf); + } + + // From here on, ALL error returns must close the socket. + // Set the new socket nonblocking. + if (!SetSocketNonblocking (sd)) { + close (sd); + throw std::runtime_error ("unable to set socket as non-blocking"); + } + // Disable slow-start (Nagle algorithm). + int one = 1; + setsockopt (sd, IPPROTO_TCP, TCP_NODELAY, (char*) &one, sizeof(one)); + // Set reuseaddr to improve performance on restarts + setsockopt (sd, SOL_SOCKET, SO_REUSEADDR, (char*) &one, sizeof(one)); + + if (bind_addr) { + struct sockaddr_storage bind_to; + size_t bind_to_len = sizeof bind_to; + gai = name2address (bind_addr, bind_port, SOCK_STREAM, (struct sockaddr *)&bind_to, &bind_to_len); + if (gai != 0) { + close (sd); + char buf [200]; + snprintf (buf, sizeof(buf)-1, "invalid bind address: %s", gai_strerror(gai)); + throw std::runtime_error (buf); + } + if (bind (sd, (struct sockaddr *)&bind_to, bind_to_len) < 0) { + close (sd); + throw std::runtime_error ("couldn't bind to address"); + } + } + + uintptr_t out = 0; + + #ifdef OS_UNIX + int e_reason = 0; + if (connect (sd, (struct sockaddr *)&bind_as, bind_as_len) == 0) { + // This is a connect success, which Linux appears + // never to give when the socket is nonblocking, + // even if the connection is intramachine or to + // localhost. + + /* Changed this branch 08Aug06. Evidently some kernels + * (FreeBSD for example) will actually return success from + * a nonblocking connect. This is a pretty simple case, + * just set up the new connection and clear the pending flag. + * Thanks to Chris Ochs for helping track this down. + * This branch never gets taken on Linux or (oddly) OSX. + * The original behavior was to throw an unimplemented, + * which the user saw as a fatal exception. Very unfriendly. + * + * Tweaked 10Aug06. Even though the connect disposition is + * known, we still set the connect-pending flag. That way + * some needed initialization will happen in the ConnectionDescriptor. + * (To wit, the ConnectionCompleted event gets sent to the client.) + */ + ConnectionDescriptor *cd = new ConnectionDescriptor (sd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + cd->SetConnectPending (true); + Add (cd); + out = cd->GetBinding(); + } + else if (errno == EINPROGRESS) { + // Errno will generally always be EINPROGRESS, but on Linux + // we have to look at getsockopt to be sure what really happened. + int error = 0; + socklen_t len; + len = sizeof(error); + int o = getsockopt (sd, SOL_SOCKET, SO_ERROR, &error, &len); + if ((o == 0) && (error == 0)) { + // Here, there's no disposition. + // Put the connection on the stack and wait for it to complete + // or time out. + ConnectionDescriptor *cd = new ConnectionDescriptor (sd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + cd->SetConnectPending (true); + Add (cd); + out = cd->GetBinding(); + } else { + // Fall through to the !out case below. + e_reason = error; + } + } + else { + // The error from connect was something other then EINPROGRESS (EHOSTDOWN, etc). + // Fall through to the !out case below + e_reason = errno; + } + + if (!out) { + /* This could be connection refused or some such thing. + * We will come here on Linux if a localhost connection fails. + * Changed 16Jul06: Originally this branch was a no-op, and + * we'd drop down to the end of the method, close the socket, + * and return NULL, which would cause the caller to GET A + * FATAL EXCEPTION. Now we keep the socket around but schedule an + * immediate close on it, so the caller will get a close-event + * scheduled on it. This was only an issue for localhost connections + * to non-listening ports. We may eventually need to revise this + * revised behavior, in case it causes problems like making it hard + * for people to know that a failure occurred. + */ + ConnectionDescriptor *cd = new ConnectionDescriptor (sd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + cd->SetUnbindReasonCode (e_reason); + cd->ScheduleClose (false); + Add (cd); + out = cd->GetBinding(); + } + #endif + + #ifdef OS_WIN32 + if (connect (sd, (struct sockaddr *)&bind_as, bind_as_len) == 0) { + // This is a connect success, which Windows appears + // never to give when the socket is nonblocking, + // even if the connection is intramachine or to + // localhost. + throw std::runtime_error ("unimplemented"); + } + else if (WSAGetLastError() == WSAEWOULDBLOCK) { + // Here, there's no disposition. + // Windows appears not to surface refused connections or + // such stuff at this point. + // Put the connection on the stack and wait for it to complete + // or time out. + ConnectionDescriptor *cd = new ConnectionDescriptor (sd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + cd->SetConnectPending (true); + Add (cd); + out = cd->GetBinding(); + } + else { + // The error from connect was something other then WSAEWOULDBLOCK. + } + + #endif + + if (!out) + close (sd); + return out; +} + +/*********************************** +EventMachine_t::ConnectToUnixServer +***********************************/ + +#ifdef OS_UNIX +const uintptr_t EventMachine_t::ConnectToUnixServer (const char *server) +{ + /* Connect to a Unix-domain server, which by definition is running + * on the same host. + * There is no meaningful implementation on Windows. + * There's no need to do a nonblocking connect, since the connection + * is always local and can always be fulfilled immediately. + */ + + uintptr_t out = 0; + + if (!server || !*server) + return 0; + + sockaddr_un pun; + memset (&pun, 0, sizeof(pun)); + pun.sun_family = AF_LOCAL; + + // You ordinarily expect the server name field to be at least 1024 bytes long, + // but on Linux it can be MUCH shorter. + if (strlen(server) >= sizeof(pun.sun_path)) + throw std::runtime_error ("unix-domain server name is too long"); + + + strcpy (pun.sun_path, server); + + SOCKET fd = EmSocket (AF_LOCAL, SOCK_STREAM, 0); + if (fd == INVALID_SOCKET) + return 0; + + // From here on, ALL error returns must close the socket. + // NOTE: At this point, the socket is still a blocking socket. + if (connect (fd, (struct sockaddr*)&pun, sizeof(pun)) != 0) { + close (fd); + return 0; + } + + // Set the newly-connected socket nonblocking. + if (!SetSocketNonblocking (fd)) { + close (fd); + return 0; + } + + // Set up a connection descriptor and add it to the event-machine. + // Observe, even though we know the connection status is connect-success, + // we still set the "pending" flag, so some needed initializations take + // place. + ConnectionDescriptor *cd = new ConnectionDescriptor (fd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + cd->SetConnectPending (true); + Add (cd); + out = cd->GetBinding(); + + if (!out) + close (fd); + + return out; +} +#else +const uintptr_t EventMachine_t::ConnectToUnixServer (const char *server UNUSED) +{ + throw std::runtime_error ("unix-domain connection unavailable on this platform"); +} +#endif + +/************************ +EventMachine_t::AttachFD +************************/ + +const uintptr_t EventMachine_t::AttachFD (SOCKET fd, bool watch_mode) +{ + #ifdef OS_UNIX + if (fcntl(fd, F_GETFL, 0) < 0) { + if (errno) { + throw std::runtime_error (strerror(errno)); + } else { + throw std::runtime_error ("invalid file descriptor"); + } + } + #endif + + #ifdef OS_WIN32 + // TODO: add better check for invalid file descriptors (see ioctlsocket or getsockopt) + if (fd == INVALID_SOCKET) + throw std::runtime_error ("invalid file descriptor"); + #endif + + {// Check for duplicate descriptors + size_t i; + for (i = 0; i < Descriptors.size(); i++) { + EventableDescriptor *ed = Descriptors[i]; + assert (ed); + if (ed->GetSocket() == fd) + throw std::runtime_error ("adding existing descriptor"); + } + + for (i = 0; i < NewDescriptors.size(); i++) { + EventableDescriptor *ed = NewDescriptors[i]; + assert (ed); + if (ed->GetSocket() == fd) + throw std::runtime_error ("adding existing new descriptor"); + } + } + + if (!watch_mode) + SetSocketNonblocking(fd); + + ConnectionDescriptor *cd = new ConnectionDescriptor (fd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + + cd->SetAttached(true); + cd->SetWatchOnly(watch_mode); + cd->SetConnectPending (false); + + Add (cd); + + const uintptr_t out = cd->GetBinding(); + return out; +} + +/************************ +EventMachine_t::DetachFD +************************/ + +int EventMachine_t::DetachFD (EventableDescriptor *ed) +{ + if (!ed) + throw std::runtime_error ("detaching bad descriptor"); + + SOCKET fd = ed->GetSocket(); + + #ifdef HAVE_EPOLL + if (Poller == Poller_Epoll) { + if (ed->GetSocket() != INVALID_SOCKET) { + assert (epfd != -1); + int e = epoll_ctl (epfd, EPOLL_CTL_DEL, ed->GetSocket(), ed->GetEpollEvent()); + // ENOENT or EBADF are not errors because the socket may be already closed when we get here. + if (e && (errno != ENOENT) && (errno != EBADF)) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to delete epoll event: %s", strerror(errno)); + throw std::runtime_error (buf); + } + } + } + #endif + + #ifdef HAVE_KQUEUE + if (Poller == Poller_Kqueue) { + // remove any read/write events for this fd + struct kevent k; +#ifdef __NetBSD__ + EV_SET (&k, ed->GetSocket(), EVFILT_READ | EVFILT_WRITE, EV_DELETE, 0, 0, (intptr_t)ed); +#else + EV_SET (&k, ed->GetSocket(), EVFILT_READ | EVFILT_WRITE, EV_DELETE, 0, 0, ed); +#endif + int t = kevent (kqfd, &k, 1, NULL, 0, NULL); + if (t < 0 && (errno != ENOENT) && (errno != EBADF)) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to delete kqueue event: %s", strerror(errno)); + throw std::runtime_error (buf); + } + } + #endif + + // Prevent the descriptor from being modified, in case DetachFD was called from a timer or next_tick + ModifiedDescriptors.erase (ed); + + // Prevent the descriptor from being added, in case DetachFD was called in the same tick as AttachFD + for (size_t i = 0; i < NewDescriptors.size(); i++) { + if (ed == NewDescriptors[i]) { + NewDescriptors.erase(NewDescriptors.begin() + i); + break; + } + } + + // Set MySocket = INVALID_SOCKET so ShouldDelete() is true (and the descriptor gets deleted and removed), + // and also to prevent anyone from calling close() on the detached fd + ed->SetSocketInvalid(); + + return fd; +} + +/************ +name2address +************/ + +int EventMachine_t::name2address (const char *server, int port, int socktype, struct sockaddr *addr, size_t *addr_len) +{ + if (!server || !*server) + server = "0.0.0.0"; + + struct addrinfo *ai; + struct addrinfo hints; + memset (&hints, 0, sizeof(hints)); + hints.ai_socktype = socktype; + hints.ai_family = AF_UNSPEC; + hints.ai_flags = AI_NUMERICSERV | AI_ADDRCONFIG; + + char portstr[12]; + snprintf(portstr, sizeof(portstr), "%u", port); + + int gai = getaddrinfo (server, portstr, &hints, &ai); + if (gai == 0) { + assert (ai->ai_addrlen <= *addr_len); + memcpy (addr, ai->ai_addr, ai->ai_addrlen); + *addr_len = ai->ai_addrlen; + freeaddrinfo(ai); + } + + return gai; +} + + +/******************************* +EventMachine_t::CreateTcpServer +*******************************/ + +const uintptr_t EventMachine_t::CreateTcpServer (const char *server, int port) +{ + /* Create a TCP-acceptor (server) socket and add it to the event machine. + * Return the binding of the new acceptor to the caller. + * This binding will be referenced when the new acceptor sends events + * to indicate accepted connections. + */ + + + struct sockaddr_storage bind_here; + size_t bind_here_len = sizeof bind_here; + if (0 != name2address (server, port, SOCK_STREAM, (struct sockaddr *)&bind_here, &bind_here_len)) + return 0; + + SOCKET sd_accept = EmSocket (bind_here.ss_family, SOCK_STREAM, 0); + if (sd_accept == INVALID_SOCKET) { + goto fail; + } + + { // set reuseaddr to improve performance on restarts. + int oval = 1; + if (setsockopt (sd_accept, SOL_SOCKET, SO_REUSEADDR, (char*)&oval, sizeof(oval)) < 0) { + //__warning ("setsockopt failed while creating listener",""); + goto fail; + } + } + + { // set CLOEXEC. Only makes sense on Unix + #ifdef OS_UNIX + int cloexec = fcntl (sd_accept, F_GETFD, 0); + assert (cloexec >= 0); + cloexec |= FD_CLOEXEC; + fcntl (sd_accept, F_SETFD, cloexec); + #endif + } + + + if (bind (sd_accept, (struct sockaddr *)&bind_here, bind_here_len)) { + //__warning ("binding failed"); + goto fail; + } + + if (listen (sd_accept, 100)) { + //__warning ("listen failed"); + goto fail; + } + + return AttachSD(sd_accept); + + fail: + if (sd_accept != INVALID_SOCKET) + close (sd_accept); + return 0; +} + + +/********************************** +EventMachine_t::OpenDatagramSocket +**********************************/ + +const uintptr_t EventMachine_t::OpenDatagramSocket (const char *address, int port) +{ + uintptr_t output_binding = 0; + + struct sockaddr_storage bind_here; + size_t bind_here_len = sizeof bind_here; + if (0 != name2address (address, port, SOCK_DGRAM, (struct sockaddr *)&bind_here, &bind_here_len)) + return 0; + + // from here on, early returns must close the socket! + SOCKET sd = EmSocket (bind_here.ss_family, SOCK_DGRAM, 0); + if (sd == INVALID_SOCKET) + goto fail; + + { // set the SO_REUSEADDR on the socket before we bind, otherwise it won't work for a second one + int oval = 1; + if (setsockopt (sd, SOL_SOCKET, SO_REUSEADDR, (char*)&oval, sizeof(oval)) < 0) + goto fail; + } + + // Set the new socket nonblocking. + if (!SetSocketNonblocking (sd)) + goto fail; + + if (bind (sd, (struct sockaddr *)&bind_here, bind_here_len) != 0) + goto fail; + + { // Looking good. + DatagramDescriptor *ds = new DatagramDescriptor (sd, this); + if (!ds) + throw std::runtime_error ("unable to allocate datagram-socket"); + Add (ds); + output_binding = ds->GetBinding(); + } + + return output_binding; + + fail: + if (sd != INVALID_SOCKET) + close (sd); + return 0; +} + + + +/******************* +EventMachine_t::Add +*******************/ + +void EventMachine_t::Add (EventableDescriptor *ed) +{ + if (!ed) + throw std::runtime_error ("added bad descriptor"); + ed->SetEventCallback (EventCallback); + NewDescriptors.push_back (ed); +} + + +/******************************* +EventMachine_t::ArmKqueueWriter +*******************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::ArmKqueueWriter (EventableDescriptor *ed) +{ + if (Poller == Poller_Kqueue) { + if (!ed) + throw std::runtime_error ("added bad descriptor"); + struct kevent k; +#ifdef __NetBSD__ + EV_SET (&k, ed->GetSocket(), EVFILT_WRITE, EV_ADD | EV_ONESHOT, 0, 0, (intptr_t)ed); +#else + EV_SET (&k, ed->GetSocket(), EVFILT_WRITE, EV_ADD | EV_ONESHOT, 0, 0, ed); +#endif + int t = kevent (kqfd, &k, 1, NULL, 0, NULL); + if (t < 0) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "arm kqueue writer failed on %d: %s", ed->GetSocket(), strerror(errno)); + throw std::runtime_error (buf); + } + } +} +#else +void EventMachine_t::ArmKqueueWriter (EventableDescriptor *ed UNUSED) { } +#endif + +/******************************* +EventMachine_t::ArmKqueueReader +*******************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::ArmKqueueReader (EventableDescriptor *ed) +{ + if (Poller == Poller_Kqueue) { + if (!ed) + throw std::runtime_error ("added bad descriptor"); + struct kevent k; +#ifdef __NetBSD__ + EV_SET (&k, ed->GetSocket(), EVFILT_READ, EV_ADD, 0, 0, (intptr_t)ed); +#else + EV_SET (&k, ed->GetSocket(), EVFILT_READ, EV_ADD, 0, 0, ed); +#endif + int t = kevent (kqfd, &k, 1, NULL, 0, NULL); + if (t < 0) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "arm kqueue reader failed on %d: %s", ed->GetSocket(), strerror(errno)); + throw std::runtime_error (buf); + } + } +} +#else +void EventMachine_t::ArmKqueueReader (EventableDescriptor *ed UNUSED) { } +#endif + +/********************************** +EventMachine_t::_AddNewDescriptors +**********************************/ + +void EventMachine_t::_AddNewDescriptors() +{ + /* Avoid adding descriptors to the main descriptor list + * while we're actually traversing the list. + * Any descriptors that are added as a result of processing timers + * or acceptors should go on a temporary queue and then added + * while we're not traversing the main list. + * Also, it (rarely) happens that a newly-created descriptor + * is immediately scheduled to close. It might be a good + * idea not to bother scheduling these for I/O but if + * we do that, we might bypass some important processing. + */ + + for (size_t i = 0; i < NewDescriptors.size(); i++) { + EventableDescriptor *ed = NewDescriptors[i]; + if (ed == NULL) + throw std::runtime_error ("adding bad descriptor"); + + #if HAVE_EPOLL + if (Poller == Poller_Epoll) { + assert (epfd != -1); + int e = epoll_ctl (epfd, EPOLL_CTL_ADD, ed->GetSocket(), ed->GetEpollEvent()); + if (e) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to add new descriptor: %s", strerror(errno)); + throw std::runtime_error (buf); + } + } + #endif + + #if HAVE_KQUEUE + /* + if (Poller == Poller_Kqueue) { + // INCOMPLETE. Some descriptors don't want to be readable. + assert (kqfd != -1); + struct kevent k; +#ifdef __NetBSD__ + EV_SET (&k, ed->GetSocket(), EVFILT_READ, EV_ADD, 0, 0, (intptr_t)ed); +#else + EV_SET (&k, ed->GetSocket(), EVFILT_READ, EV_ADD, 0, 0, ed); +#endif + int t = kevent (kqfd, &k, 1, NULL, 0, NULL); + assert (t == 0); + } + */ + #endif + + QueueHeartbeat(ed); + Descriptors.push_back (ed); + } + NewDescriptors.clear(); +} + + +/********************************** +EventMachine_t::_ModifyDescriptors +**********************************/ + +void EventMachine_t::_ModifyDescriptors() +{ + /* For implementations which don't level check every descriptor on + * every pass through the machine, as select does. + * If we're not selecting, then descriptors need a way to signal to the + * machine that their readable or writable status has changed. + * That's what the ::Modify call is for. We do it this way to avoid + * modifying descriptors during the loop traversal, where it can easily + * happen that an object (like a UDP socket) gets data written on it by + * the application during #post_init. That would take place BEFORE the + * descriptor even gets added to the epoll descriptor, so the modify + * operation will crash messily. + * Another really messy possibility is for a descriptor to put itself + * on the Modified list, and then get deleted before we get here. + * Remember, deletes happen after the I/O traversal and before the + * next pass through here. So we have to make sure when we delete a + * descriptor to remove it from the Modified list. + */ + + #ifdef HAVE_EPOLL + if (Poller == Poller_Epoll) { + set::iterator i = ModifiedDescriptors.begin(); + while (i != ModifiedDescriptors.end()) { + assert (*i); + _ModifyEpollEvent (*i); + ++i; + } + } + #endif + + #ifdef HAVE_KQUEUE + if (Poller == Poller_Kqueue) { + set::iterator i = ModifiedDescriptors.begin(); + while (i != ModifiedDescriptors.end()) { + assert (*i); + if ((*i)->GetKqueueArmWrite()) + ArmKqueueWriter (*i); + ++i; + } + } + #endif + + ModifiedDescriptors.clear(); +} + + +/********************** +EventMachine_t::Modify +**********************/ + +void EventMachine_t::Modify (EventableDescriptor *ed) +{ + if (!ed) + throw std::runtime_error ("modified bad descriptor"); + ModifiedDescriptors.insert (ed); +} + + +/*********************** +EventMachine_t::Deregister +***********************/ + +void EventMachine_t::Deregister (EventableDescriptor *ed) +{ + if (!ed) + throw std::runtime_error ("modified bad descriptor"); + #ifdef HAVE_EPOLL + // cut/paste from _CleanupSockets(). The error handling could be + // refactored out of there, but it is cut/paste all over the + // file already. + if (Poller == Poller_Epoll) { + assert (epfd != -1); + assert (ed->GetSocket() != INVALID_SOCKET); + int e = epoll_ctl (epfd, EPOLL_CTL_DEL, ed->GetSocket(), ed->GetEpollEvent()); + // ENOENT or EBADF are not errors because the socket may be already closed when we get here. + if (e && (errno != ENOENT) && (errno != EBADF) && (errno != EPERM)) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to delete epoll event: %s", strerror(errno)); + throw std::runtime_error (buf); + } + ModifiedDescriptors.erase(ed); + } + #endif + + #ifdef HAVE_KQUEUE + if (Poller == Poller_Kqueue) { + assert (ed->GetSocket() != INVALID_SOCKET); + + ModifiedDescriptors.erase(ed); + } + #endif +} + + +/************************************** +EventMachine_t::CreateUnixDomainServer +**************************************/ + +#ifdef OS_UNIX +const uintptr_t EventMachine_t::CreateUnixDomainServer (const char *filename) +{ + /* Create a UNIX-domain acceptor (server) socket and add it to the event machine. + * Return the binding of the new acceptor to the caller. + * This binding will be referenced when the new acceptor sends events + * to indicate accepted connections. + * THERE IS NO MEANINGFUL IMPLEMENTATION ON WINDOWS. + */ + + struct sockaddr_un s_sun; + + SOCKET sd_accept = EmSocket (AF_LOCAL, SOCK_STREAM, 0); + if (sd_accept == INVALID_SOCKET) { + goto fail; + } + + if (!filename || !*filename) + goto fail; + unlink (filename); + + bzero (&s_sun, sizeof(s_sun)); + s_sun.sun_family = AF_LOCAL; + strncpy (s_sun.sun_path, filename, sizeof(s_sun.sun_path)-1); + + // don't bother with reuseaddr for a local socket. + + { // set CLOEXEC. Only makes sense on Unix + #ifdef OS_UNIX + int cloexec = fcntl (sd_accept, F_GETFD, 0); + assert (cloexec >= 0); + cloexec |= FD_CLOEXEC; + fcntl (sd_accept, F_SETFD, cloexec); + #endif + } + + if (bind (sd_accept, (struct sockaddr*)&s_sun, sizeof(s_sun))) { + //__warning ("binding failed"); + goto fail; + } + + if (listen (sd_accept, 100)) { + //__warning ("listen failed"); + goto fail; + } + + return AttachSD(sd_accept); + + fail: + if (sd_accept != INVALID_SOCKET) + close (sd_accept); + return 0; +} +#else +const uintptr_t EventMachine_t::CreateUnixDomainServer (const char *filename UNUSED) +{ + throw std::runtime_error ("unix-domain server unavailable on this platform"); +} +#endif + + +/************************************** +EventMachine_t::AttachSD +**************************************/ + +const uintptr_t EventMachine_t::AttachSD (SOCKET sd_accept) +{ + uintptr_t output_binding = 0; + + { + // Set the acceptor non-blocking. + // THIS IS CRUCIALLY IMPORTANT because we read it in a select loop. + if (!SetSocketNonblocking (sd_accept)) { + //int val = fcntl (sd_accept, F_GETFL, 0); + //if (fcntl (sd_accept, F_SETFL, val | O_NONBLOCK) == -1) { + goto fail; + } + } + + { // Looking good. + AcceptorDescriptor *ad = new AcceptorDescriptor (sd_accept, this); + if (!ad) + throw std::runtime_error ("unable to allocate acceptor"); + Add (ad); + output_binding = ad->GetBinding(); + } + + return output_binding; + + fail: + if (sd_accept != INVALID_SOCKET) + close (sd_accept); + return 0; +} + + +/************************** +EventMachine_t::Socketpair +**************************/ + +#ifdef OS_UNIX +const uintptr_t EventMachine_t::Socketpair (char * const * cmd_strings) +{ + // Make sure the incoming array of command strings is sane. + if (!cmd_strings) + return 0; + int j; + for (j=0; j < 2048 && cmd_strings[j]; j++) + ; + if ((j==0) || (j==2048)) + return 0; + + uintptr_t output_binding = 0; + + int sv[2]; + if (socketpair (AF_LOCAL, SOCK_STREAM, 0, sv) < 0) + return 0; + // from here, all early returns must close the pair of sockets. + + // Set the parent side of the socketpair nonblocking. + // We don't care about the child side, and most child processes will expect their + // stdout to be blocking. Thanks to Duane Johnson and Bill Kelly for pointing this out. + // Obviously DON'T set CLOEXEC. + if (!SetSocketNonblocking (sv[0])) { + close (sv[0]); + close (sv[1]); + return 0; + } + + pid_t f = fork(); + if (f > 0) { + close (sv[1]); + PipeDescriptor *pd = new PipeDescriptor (sv[0], f, this); + if (!pd) + throw std::runtime_error ("unable to allocate pipe"); + Add (pd); + output_binding = pd->GetBinding(); + } + else if (f == 0) { + close (sv[0]); + dup2 (sv[1], STDIN_FILENO); + close (sv[1]); + dup2 (STDIN_FILENO, STDOUT_FILENO); + execvp (cmd_strings[0], cmd_strings+1); + exit (-1); // end the child process if the exec doesn't work. + } + else + throw std::runtime_error ("no fork"); + + return output_binding; +} +#else +const uintptr_t EventMachine_t::Socketpair (char * const * cmd_strings UNUSED) +{ + throw std::runtime_error ("socketpair is currently unavailable on this platform"); +} +#endif + + + +/**************************** +EventMachine_t::OpenKeyboard +****************************/ + +const uintptr_t EventMachine_t::OpenKeyboard() +{ + KeyboardDescriptor *kd = new KeyboardDescriptor (this); + if (!kd) + throw std::runtime_error ("no keyboard-object allocated"); + Add (kd); + return kd->GetBinding(); +} + + +/********************************** +EventMachine_t::GetConnectionCount +**********************************/ + +int EventMachine_t::GetConnectionCount () +{ + int i = 0; + // Subtract one for epoll or kqueue because of the LoopbreakDescriptor + if (Poller == Poller_Epoll || Poller == Poller_Kqueue) + i = 1; + + return Descriptors.size() + NewDescriptors.size() - i; +} + + +/************************ +EventMachine_t::WatchPid +************************/ + +#ifdef HAVE_KQUEUE +const uintptr_t EventMachine_t::WatchPid (int pid) +{ + if (Poller != Poller_Kqueue) + throw std::runtime_error("must enable kqueue (EM.kqueue=true) for pid watching support"); + + struct kevent event; + int kqres; + + EV_SET(&event, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT | NOTE_FORK, 0, 0); + + // Attempt to register the event + kqres = kevent(kqfd, &event, 1, NULL, 0, NULL); + if (kqres == -1) { + char errbuf[200]; + sprintf(errbuf, "failed to register file watch descriptor with kqueue: %s", strerror(errno)); + throw std::runtime_error(errbuf); + } + Bindable_t* b = new Bindable_t(); + Pids.insert(make_pair (pid, b)); + + return b->GetBinding(); +} +#else +const uintptr_t EventMachine_t::WatchPid (int pid UNUSED) +{ + throw std::runtime_error("no pid watching support on this system"); +} +#endif + +/************************** +EventMachine_t::UnwatchPid +**************************/ + +void EventMachine_t::UnwatchPid (int pid) +{ + Bindable_t *b = Pids[pid]; + assert(b); + Pids.erase(pid); + + #ifdef HAVE_KQUEUE + struct kevent k; + + EV_SET(&k, pid, EVFILT_PROC, EV_DELETE, 0, 0, 0); + /*int t =*/ kevent (kqfd, &k, 1, NULL, 0, NULL); + // t==-1 if the process already exited; ignore this for now + #endif + + if (EventCallback) + (*EventCallback)(b->GetBinding(), EM_CONNECTION_UNBOUND, NULL, 0); + + delete b; +} + +void EventMachine_t::UnwatchPid (const uintptr_t sig) +{ + for(map::iterator i=Pids.begin(); i != Pids.end(); i++) + { + if (i->second->GetBinding() == sig) { + UnwatchPid (i->first); + return; + } + } + + throw std::runtime_error("attempted to remove invalid pid signature"); +} + + +/************************* +EventMachine_t::WatchFile +*************************/ + +const uintptr_t EventMachine_t::WatchFile (const char *fpath) +{ + struct stat sb; + int sres; + int wd = -1; + + sres = stat(fpath, &sb); + + if (sres == -1) { + char errbuf[300]; + sprintf(errbuf, "error registering file %s for watching: %s", fpath, strerror(errno)); + throw std::runtime_error(errbuf); + } + + #ifdef HAVE_INOTIFY + if (!inotify) { + inotify = new InotifyDescriptor(this); + assert (inotify); + Add(inotify); + } + + wd = inotify_add_watch(inotify->GetSocket(), fpath, + IN_MODIFY | IN_DELETE_SELF | IN_MOVE_SELF | IN_CREATE | IN_DELETE | IN_MOVE) ; + if (wd == -1) { + char errbuf[300]; + sprintf(errbuf, "failed to open file %s for registering with inotify: %s", fpath, strerror(errno)); + throw std::runtime_error(errbuf); + } + #endif + + #ifdef HAVE_KQUEUE + if (Poller != Poller_Kqueue) + throw std::runtime_error("must enable kqueue (EM.kqueue=true) for file watching support"); + + // With kqueue we have to open the file first and use the resulting fd to register for events + wd = open(fpath, O_RDONLY); + if (wd == -1) { + char errbuf[300]; + sprintf(errbuf, "failed to open file %s for registering with kqueue: %s", fpath, strerror(errno)); + throw std::runtime_error(errbuf); + } + _RegisterKqueueFileEvent(wd); + #endif + + if (wd != -1) { + Bindable_t* b = new Bindable_t(); + Files.insert(make_pair (wd, b)); + + return b->GetBinding(); + } + + throw std::runtime_error("no file watching support on this system"); // is this the right thing to do? +} + + +/*************************** +EventMachine_t::UnwatchFile +***************************/ + +void EventMachine_t::UnwatchFile (int wd) +{ + Bindable_t *b = Files[wd]; + assert(b); + Files.erase(wd); + + #ifdef HAVE_INOTIFY + inotify_rm_watch(inotify->GetSocket(), wd); + #elif HAVE_KQUEUE + // With kqueue, closing the monitored fd automatically clears all registered events for it + close(wd); + #endif + + if (EventCallback) + (*EventCallback)(b->GetBinding(), EM_CONNECTION_UNBOUND, NULL, 0); + + delete b; +} + +void EventMachine_t::UnwatchFile (const uintptr_t sig) +{ + for(map::iterator i=Files.begin(); i != Files.end(); i++) + { + if (i->second->GetBinding() == sig) { + UnwatchFile (i->first); + return; + } + } + throw std::runtime_error("attempted to remove invalid watch signature"); +} + + +/*********************************** +EventMachine_t::_ReadInotify_Events +************************************/ + +void EventMachine_t::_ReadInotifyEvents() +{ + #ifdef HAVE_INOTIFY + char buffer[1024]; + + assert(EventCallback); + + for (;;) { + int returned = read(inotify->GetSocket(), buffer, sizeof(buffer)); + assert(!(returned == 0 || (returned == -1 && errno == EINVAL))); + if (returned <= 0) { + break; + } + int current = 0; + while (current < returned) { + struct inotify_event* event = (struct inotify_event*)(buffer+current); + map::const_iterator bindable = Files.find(event->wd); + if (bindable != Files.end()) { + if (event->mask & (IN_MODIFY | IN_CREATE | IN_DELETE | IN_MOVE)){ + (*EventCallback)(bindable->second->GetBinding(), EM_CONNECTION_READ, "modified", 8); + } + if (event->mask & IN_MOVE_SELF){ + (*EventCallback)(bindable->second->GetBinding(), EM_CONNECTION_READ, "moved", 5); + } + if (event->mask & IN_DELETE_SELF) { + (*EventCallback)(bindable->second->GetBinding(), EM_CONNECTION_READ, "deleted", 7); + UnwatchFile ((int)event->wd); + } + } + current += sizeof(struct inotify_event) + event->len; + } + } + #endif +} + + +/************************************* +EventMachine_t::_HandleKqueuePidEvent +*************************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::_HandleKqueuePidEvent(struct kevent *event) +{ + assert(EventCallback); + + if (event->fflags & NOTE_FORK) + (*EventCallback)(Pids [(int) event->ident]->GetBinding(), EM_CONNECTION_READ, "fork", 4); + if (event->fflags & NOTE_EXIT) { + (*EventCallback)(Pids [(int) event->ident]->GetBinding(), EM_CONNECTION_READ, "exit", 4); + // stop watching the pid if it died + UnwatchPid ((int)event->ident); + } +} +#endif + + +/************************************** +EventMachine_t::_HandleKqueueFileEvent +***************************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::_HandleKqueueFileEvent(struct kevent *event) +{ + assert(EventCallback); + + if (event->fflags & NOTE_WRITE) + (*EventCallback)(Files [(int) event->ident]->GetBinding(), EM_CONNECTION_READ, "modified", 8); + if (event->fflags & NOTE_RENAME) + (*EventCallback)(Files [(int) event->ident]->GetBinding(), EM_CONNECTION_READ, "moved", 5); + if (event->fflags & NOTE_DELETE) { + (*EventCallback)(Files [(int) event->ident]->GetBinding(), EM_CONNECTION_READ, "deleted", 7); + UnwatchFile ((int)event->ident); + } +} +#endif + + +/**************************************** +EventMachine_t::_RegisterKqueueFileEvent +*****************************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::_RegisterKqueueFileEvent(int fd) +{ + struct kevent newevent; + int kqres; + + // Setup the event with our fd and proper flags + EV_SET(&newevent, fd, EVFILT_VNODE, EV_ADD | EV_CLEAR, NOTE_DELETE | NOTE_RENAME | NOTE_WRITE, 0, 0); + + // Attempt to register the event + kqres = kevent(kqfd, &newevent, 1, NULL, 0, NULL); + if (kqres == -1) { + char errbuf[200]; + sprintf(errbuf, "failed to register file watch descriptor with kqueue: %s", strerror(errno)); + close(fd); + throw std::runtime_error(errbuf); + } +} +#endif + + +/************************************ +EventMachine_t::GetHeartbeatInterval +*************************************/ + +float EventMachine_t::GetHeartbeatInterval() +{ + return ((float)HeartbeatInterval / 1000000); +} + + +/************************************ +EventMachine_t::SetHeartbeatInterval +*************************************/ + +int EventMachine_t::SetHeartbeatInterval(float interval) +{ + int iv = (int)(interval * 1000000); + if (iv > 0) { + HeartbeatInterval = iv; + return 1; + } + return 0; +} +//#endif // OS_UNIX diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/em.h b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/em.h new file mode 100644 index 0000000..e84b595 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/em.h @@ -0,0 +1,309 @@ +/***************************************************************************** + +$Id$ + +File: em.h +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#ifndef __EventMachine__H_ +#define __EventMachine__H_ + +#ifdef BUILD_FOR_RUBY + #include + #ifdef HAVE_RB_THREAD_FD_SELECT + #define EmSelect rb_thread_fd_select + #else + // ruby 1.9.1 and below + #define EmSelect rb_thread_select + #endif + + #ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL + #include + #endif + + #ifdef HAVE_RB_WAIT_FOR_SINGLE_FD + #include + #endif + + #if defined(HAVE_RB_TRAP_IMMEDIATE) + #include + #elif defined(HAVE_RB_ENABLE_INTERRUPT) + extern "C" { + void rb_enable_interrupt(void); + void rb_disable_interrupt(void); + } + + #define TRAP_BEG rb_enable_interrupt() + #define TRAP_END do { rb_disable_interrupt(); rb_thread_check_ints(); } while(0) + #else + #define TRAP_BEG + #define TRAP_END + #endif + + // 1.9.0 compat + #ifndef RUBY_UBF_IO + #define RUBY_UBF_IO RB_UBF_DFL + #endif + #ifndef RSTRING_PTR + #define RSTRING_PTR(str) RSTRING(str)->ptr + #endif + #ifndef RSTRING_LEN + #define RSTRING_LEN(str) RSTRING(str)->len + #endif + #ifndef RSTRING_LENINT + #define RSTRING_LENINT(str) RSTRING_LEN(str) + #endif +#else + #define EmSelect select +#endif + +#if !defined(HAVE_TYPE_RB_FDSET_T) +#define fd_check(n) (((n) < FD_SETSIZE) ? 1 : 0*fprintf(stderr, "fd %d too large for select\n", (n))) +// These definitions are cribbed from include/ruby/intern.h in Ruby 1.9.3, +// with this change: any macros that read or write the nth element of an +// fdset first call fd_check to make sure n is in bounds. +typedef fd_set rb_fdset_t; +#define rb_fd_zero(f) FD_ZERO(f) +#define rb_fd_set(n, f) do { if (fd_check(n)) FD_SET((n), (f)); } while(0) +#define rb_fd_clr(n, f) do { if (fd_check(n)) FD_CLR((n), (f)); } while(0) +#define rb_fd_isset(n, f) (fd_check(n) ? FD_ISSET((n), (f)) : 0) +#define rb_fd_copy(d, s, n) (*(d) = *(s)) +#define rb_fd_dup(d, s) (*(d) = *(s)) +#define rb_fd_resize(n, f) ((void)(f)) +#define rb_fd_ptr(f) (f) +#define rb_fd_init(f) FD_ZERO(f) +#define rb_fd_init_copy(d, s) (*(d) = *(s)) +#define rb_fd_term(f) ((void)(f)) +#define rb_fd_max(f) FD_SETSIZE +#define rb_fd_select(n, rfds, wfds, efds, timeout) \ + select(fd_check((n)-1) ? (n) : FD_SETSIZE, (rfds), (wfds), (efds), (timeout)) +#define rb_thread_fd_select(n, rfds, wfds, efds, timeout) \ + rb_thread_select(fd_check((n)-1) ? (n) : FD_SETSIZE, (rfds), (wfds), (efds), (timeout)) +#endif + + +// This Solaris fix is adapted from eval_intern.h in Ruby 1.9.3: +// Solaris sys/select.h switches select to select_large_fdset to support larger +// file descriptors if FD_SETSIZE is larger than 1024 on 32bit environment. +// But Ruby doesn't change FD_SETSIZE because fd_set is allocated dynamically. +// So following definition is required to use select_large_fdset. +#ifdef HAVE_SELECT_LARGE_FDSET +#define select(n, r, w, e, t) select_large_fdset((n), (r), (w), (e), (t)) +extern "C" { + int select_large_fdset(int, fd_set *, fd_set *, fd_set *, struct timeval *); +} +#endif + +class EventableDescriptor; +class InotifyDescriptor; +struct SelectData_t; + +/************* +enum Poller_t +*************/ +enum Poller_t { + Poller_Default, // typically Select + Poller_Epoll, + Poller_Kqueue +}; + + +/******************** +class EventMachine_t +********************/ + +class EventMachine_t +{ + public: + static int GetMaxTimerCount(); + static void SetMaxTimerCount (int); + + static int GetSimultaneousAcceptCount(); + static void SetSimultaneousAcceptCount (int); + + public: + EventMachine_t (EMCallback, Poller_t); + virtual ~EventMachine_t(); + + bool RunOnce(); + void Run(); + void ScheduleHalt(); + bool Stopping(); + void SignalLoopBreaker(); + const uintptr_t InstallOneshotTimer (uint64_t); + const uintptr_t ConnectToServer (const char *, int, const char *, int); + const uintptr_t ConnectToUnixServer (const char *); + + const uintptr_t CreateTcpServer (const char *, int); + const uintptr_t OpenDatagramSocket (const char *, int); + const uintptr_t CreateUnixDomainServer (const char*); + const uintptr_t AttachSD (SOCKET); + const uintptr_t OpenKeyboard(); + //const char *Popen (const char*, const char*); + const uintptr_t Socketpair (char* const*); + + void Add (EventableDescriptor*); + void Modify (EventableDescriptor*); + void Deregister (EventableDescriptor*); + + const uintptr_t AttachFD (SOCKET, bool); + int DetachFD (EventableDescriptor*); + + void ArmKqueueWriter (EventableDescriptor*); + void ArmKqueueReader (EventableDescriptor*); + + void SetTimerQuantum (int); + static void SetuidString (const char*); + static int SetRlimitNofile (int); + + pid_t SubprocessPid; + int SubprocessExitStatus; + + int GetConnectionCount(); + float GetHeartbeatInterval(); + int SetHeartbeatInterval(float); + + const uintptr_t WatchFile (const char*); + void UnwatchFile (int); + void UnwatchFile (const uintptr_t); + + #ifdef HAVE_KQUEUE + void _HandleKqueueFileEvent (struct kevent*); + void _RegisterKqueueFileEvent(int); + #endif + + const uintptr_t WatchPid (int); + void UnwatchPid (int); + void UnwatchPid (const uintptr_t); + + #ifdef HAVE_KQUEUE + void _HandleKqueuePidEvent (struct kevent*); + #endif + + uint64_t GetCurrentLoopTime() { return MyCurrentLoopTime; } + + void QueueHeartbeat(EventableDescriptor*); + void ClearHeartbeat(uint64_t, EventableDescriptor*); + + uint64_t GetRealTime(); + + Poller_t GetPoller() { return Poller; } + + static int name2address (const char *server, int port, int socktype, struct sockaddr *addr, size_t *addr_len); + + private: + void _RunTimers(); + void _UpdateTime(); + void _AddNewDescriptors(); + void _ModifyDescriptors(); + void _InitializeLoopBreaker(); + void _CleanupSockets(); + + void _RunSelectOnce(); + void _RunEpollOnce(); + void _RunKqueueOnce(); + + void _ModifyEpollEvent (EventableDescriptor*); + void _DispatchHeartbeats(); + timeval _TimeTilNextEvent(); + void _CleanBadDescriptors(); + + public: + void _ReadLoopBreaker(); + void _ReadInotifyEvents(); + int NumCloseScheduled; + + private: + enum { + MaxEpollDescriptors = 64*1024, + MaxEvents = 4096 + }; + int HeartbeatInterval; + EMCallback EventCallback; + + class Timer_t: public Bindable_t { + }; + + multimap Timers; + multimap Heartbeats; + map Files; + map Pids; + vector Descriptors; + vector NewDescriptors; + vector DescriptorsToDelete; + set ModifiedDescriptors; + + SOCKET LoopBreakerReader; + SOCKET LoopBreakerWriter; + #ifdef OS_WIN32 + struct sockaddr_in LoopBreakerTarget; + #endif + + timeval Quantum; + + uint64_t MyCurrentLoopTime; + + #ifdef OS_WIN32 + unsigned TickCountTickover; + unsigned LastTickCount; + #endif + + #ifdef OS_DARWIN + mach_timebase_info_data_t mach_timebase; + #endif + + private: + bool bTerminateSignalReceived; + SelectData_t *SelectData; + + Poller_t Poller; + + int epfd; // Epoll file-descriptor + #ifdef HAVE_EPOLL + struct epoll_event epoll_events [MaxEvents]; + #endif + + int kqfd; // Kqueue file-descriptor + #ifdef HAVE_KQUEUE + struct kevent Karray [MaxEvents]; + #endif + + #ifdef HAVE_INOTIFY + InotifyDescriptor *inotify; // pollable descriptor for our inotify instance + #endif +}; + + +/******************* +struct SelectData_t +*******************/ + +struct SelectData_t +{ + SelectData_t(); + ~SelectData_t(); + + int _Select(); + void _Clear(); + + SOCKET maxsocket; + rb_fdset_t fdreads; + rb_fdset_t fdwrites; + rb_fdset_t fderrors; + timeval tv; + int nSockets; +}; + +#endif // __EventMachine__H_ diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/em.o b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/em.o new file mode 100644 index 0000000000000000000000000000000000000000..0d8883c1977aaf4838082932d3e463ebe5877bfe GIT binary patch literal 1437980 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

U?deYbUT< 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� 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/eventmachine.h b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/eventmachine.h new file mode 100644 index 0000000..5100e20 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/eventmachine.h @@ -0,0 +1,143 @@ +/***************************************************************************** + +$Id$ + +File: eventmachine.h +Date: 15Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#ifndef __EVMA_EventMachine__H_ +#define __EVMA_EventMachine__H_ + +#if __cplusplus +extern "C" { +#endif + + enum { // Event names + EM_TIMER_FIRED = 100, + EM_CONNECTION_READ = 101, + EM_CONNECTION_UNBOUND = 102, + EM_CONNECTION_ACCEPTED = 103, + EM_CONNECTION_COMPLETED = 104, + EM_LOOPBREAK_SIGNAL = 105, + EM_CONNECTION_NOTIFY_READABLE = 106, + EM_CONNECTION_NOTIFY_WRITABLE = 107, + EM_SSL_HANDSHAKE_COMPLETED = 108, + EM_SSL_VERIFY = 109, + EM_PROXY_TARGET_UNBOUND = 110, + EM_PROXY_COMPLETED = 111 + }; + + enum { // SSL/TLS Protocols + EM_PROTO_SSLv2 = 2, + EM_PROTO_SSLv3 = 4, + EM_PROTO_TLSv1 = 8, + EM_PROTO_TLSv1_1 = 16, + EM_PROTO_TLSv1_2 = 32 + }; + + void evma_initialize_library (EMCallback); + bool evma_run_machine_once(); + void evma_run_machine(); + void evma_release_library(); + const uintptr_t evma_install_oneshot_timer (uint64_t milliseconds); + const uintptr_t evma_connect_to_server (const char *bind_addr, int bind_port, const char *server, int port); + const uintptr_t evma_connect_to_unix_server (const char *server); + + const uintptr_t evma_attach_fd (int file_descriptor, int watch_mode); + int evma_detach_fd (const uintptr_t binding); + int evma_get_file_descriptor (const uintptr_t binding); + int evma_is_notify_readable (const uintptr_t binding); + void evma_set_notify_readable (const uintptr_t binding, int mode); + int evma_is_notify_writable (const uintptr_t binding); + void evma_set_notify_writable (const uintptr_t binding, int mode); + + int evma_pause(const uintptr_t binding); + int evma_is_paused(const uintptr_t binding); + int evma_resume(const uintptr_t binding); + + int evma_num_close_scheduled(); + + void evma_stop_tcp_server (const uintptr_t binding); + const uintptr_t evma_create_tcp_server (const char *address, int port); + const uintptr_t evma_create_unix_domain_server (const char *filename); + const uintptr_t evma_attach_sd (int sd); + const uintptr_t evma_open_datagram_socket (const char *server, int port); + const uintptr_t evma_open_keyboard(); + void evma_set_tls_parms (const uintptr_t binding, const char *privatekey_filename, const char *certchain_filenane, int verify_peer, int fail_if_no_peer_cert, const char *sni_hostname, const char *cipherlist, const char *ecdh_curve, const char *dhparam, int protocols); + void evma_start_tls (const uintptr_t binding); + + #ifdef WITH_SSL + X509 *evma_get_peer_cert (const uintptr_t binding); + int evma_get_cipher_bits (const uintptr_t binding); + const char *evma_get_cipher_name (const uintptr_t binding); + const char *evma_get_cipher_protocol (const uintptr_t binding); + const char *evma_get_sni_hostname (const uintptr_t binding); + void evma_accept_ssl_peer (const uintptr_t binding); + #endif + + int evma_get_peername (const uintptr_t binding, struct sockaddr*, socklen_t*); + int evma_get_sockname (const uintptr_t binding, struct sockaddr*, socklen_t*); + int evma_get_subprocess_pid (const uintptr_t binding, pid_t*); + int evma_get_subprocess_status (const uintptr_t binding, int*); + int evma_get_connection_count(); + int evma_send_data_to_connection (const uintptr_t binding, const char *data, int data_length); + int evma_send_datagram (const uintptr_t binding, const char *data, int data_length, const char *address, int port); + float evma_get_comm_inactivity_timeout (const uintptr_t binding); + int evma_set_comm_inactivity_timeout (const uintptr_t binding, float value); + float evma_get_pending_connect_timeout (const uintptr_t binding); + int evma_set_pending_connect_timeout (const uintptr_t binding, float value); + int evma_get_outbound_data_size (const uintptr_t binding); + uint64_t evma_get_last_activity_time (const uintptr_t binding); + int evma_send_file_data_to_connection (const uintptr_t binding, const char *filename); + + void evma_close_connection (const uintptr_t binding, int after_writing); + int evma_report_connection_error_status (const uintptr_t binding); + void evma_signal_loopbreak(); + void evma_set_timer_quantum (int); + int evma_get_max_timer_count(); + void evma_set_max_timer_count (int); + int evma_get_simultaneous_accept_count(); + void evma_set_simultaneous_accept_count (int); + void evma_setuid_string (const char *username); + void evma_stop_machine(); + bool evma_stopping(); + float evma_get_heartbeat_interval(); + int evma_set_heartbeat_interval(float); + + const uintptr_t evma_popen (char * const*cmd_strings); + + const uintptr_t evma_watch_filename (const char *fname); + void evma_unwatch_filename (const uintptr_t binding); + + const uintptr_t evma_watch_pid (int); + void evma_unwatch_pid (const uintptr_t binding); + + void evma_start_proxy(const uintptr_t from, const uintptr_t to, const unsigned long bufsize, const unsigned long length); + void evma_stop_proxy(const uintptr_t from); + unsigned long evma_proxied_bytes(const uintptr_t from); + + int evma_set_rlimit_nofile (int n_files); + + void evma_set_epoll (int use); + void evma_set_kqueue (int use); + + uint64_t evma_get_current_loop_time(); +#if __cplusplus +} +#endif + + +#endif // __EventMachine__H_ + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/extconf.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/extconf.rb new file mode 100644 index 0000000..676b4c4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/extconf.rb @@ -0,0 +1,270 @@ +require 'fileutils' +require 'mkmf' + +# Eager check devs tools +have_devel? if respond_to?(:have_devel?) + +def check_libs libs = [], fatal = false + libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) } +end + +def check_heads heads = [], fatal = false + heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)} +end + +def add_define(name) + $defs.push("-D#{name}") +end + +## +# OpenSSL: + +# override append_library, so it actually appends (instead of prepending) +# this fixes issues with linking ssl, since libcrypto depends on symbols in libssl +def append_library(libs, lib) + libs + " " + format(LIBARG, lib) +end + +SSL_HEADS = %w(openssl/ssl.h openssl/err.h) +SSL_LIBS = %w(crypto ssl) +# OpenSSL 1.1.0 and above for Windows use the Unix library names +# OpenSSL 0.9.8 and 1.0.x for Windows use the *eay32 library names +SSL_LIBS_WIN = RUBY_PLATFORM =~ /mswin|mingw|bccwin/ ? %w(ssleay32 libeay32) : [] + +def dir_config_wrapper(pretty_name, name, idefault=nil, ldefault=nil) + inc, lib = dir_config(name, idefault, ldefault) + if inc && lib + # TODO: Remove when 2.0.0 is the minimum supported version + # Ruby versions not incorporating the mkmf fix at + # https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/39717 + # do not properly search for lib directories, and must be corrected + unless lib && lib[-3, 3] == 'lib' + @libdir_basename = 'lib' + inc, lib = dir_config(name, idefault, ldefault) + end + unless idefault && ldefault + abort "-----\nCannot find #{pretty_name} include path #{inc}\n-----" unless inc && inc.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) } + abort "-----\nCannot find #{pretty_name} library path #{lib}\n-----" unless lib && lib.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) } + warn "-----\nUsing #{pretty_name} in path #{File.dirname inc}\n-----" + end + true + end +end + +def dir_config_search(pretty_name, name, paths, &b) + paths.each do |p| + if dir_config_wrapper('OpenSSL', 'ssl', p + '/include', p + '/lib') && yield + warn "-----\nFound #{pretty_name} in path #{p}\n-----" + return true + end + end + false +end + +def pkg_config_wrapper(pretty_name, name) + cflags, ldflags, libs = pkg_config(name) + unless [cflags, ldflags, libs].any?(&:nil?) || [cflags, ldflags, libs].any?(&:empty?) + warn "-----\nUsing #{pretty_name} from pkg-config #{cflags} && #{ldflags} && #{libs}\n-----" + true + end +end + +if ENV['CROSS_COMPILING'] + openssl_version = ENV.fetch("OPENSSL_VERSION", "1.0.2e") + openssl_dir = File.expand_path("~/.rake-compiler/builds/openssl-#{openssl_version}/") + if File.exist?(openssl_dir) + FileUtils.mkdir_p Dir.pwd+"/openssl/" + FileUtils.cp Dir[openssl_dir+"/include/openssl/*.h"], Dir.pwd+"/openssl/", :verbose => true + FileUtils.cp Dir[openssl_dir+"/lib*.a"], Dir.pwd, :verbose => true + $INCFLAGS << " -I#{Dir.pwd}" # for the openssl headers + add_define "WITH_SSL" + else + STDERR.puts + STDERR.puts "**************************************************************************************" + STDERR.puts "**** Cross-compiled OpenSSL not found" + STDERR.puts "**** Run: hg clone http://bitbucket.org/ged/ruby-pg && cd ruby-pg && rake openssl_libs" + STDERR.puts "**************************************************************************************" + STDERR.puts + end +elsif dir_config_wrapper('OpenSSL', 'ssl') + # If the user has provided a --with-ssl-dir argument, we must respect it or fail. + add_define 'WITH_SSL' if (check_libs(SSL_LIBS) || check_libs(SSL_LIBS_WIN)) && check_heads(SSL_HEADS) +elsif pkg_config_wrapper('OpenSSL', 'openssl') + # If we can detect OpenSSL by pkg-config, use it as the next-best option + add_define 'WITH_SSL' if (check_libs(SSL_LIBS) || check_libs(SSL_LIBS_WIN)) && check_heads(SSL_HEADS) +elsif (check_libs(SSL_LIBS) || check_libs(SSL_LIBS_WIN)) && check_heads(SSL_HEADS) + # If we don't even need any options to find a usable OpenSSL, go with it + add_define 'WITH_SSL' +elsif dir_config_search('OpenSSL', 'ssl', ['/usr/local', '/opt/local', '/usr/local/opt/openssl']) do + (check_libs(SSL_LIBS) || check_libs(SSL_LIBS_WIN)) && check_heads(SSL_HEADS) + end + # Finally, look for OpenSSL in alternate locations including MacPorts and HomeBrew + add_define 'WITH_SSL' +end + +add_define 'BUILD_FOR_RUBY' + +# Ruby features: + +have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h']) +have_func('rb_thread_blocking_region') +have_func('rb_thread_call_without_gvl', 'ruby/thread.h') +have_func('rb_thread_fd_select') +have_type('rb_fdset_t', 'ruby/intern.h') +have_func('rb_wait_for_single_fd') +have_func('rb_enable_interrupt') +have_func('rb_time_new') + +# System features: + +add_define('HAVE_INOTIFY') if inotify = have_func('inotify_init', 'sys/inotify.h') +add_define('HAVE_OLD_INOTIFY') if !inotify && have_macro('__NR_inotify_init', 'sys/syscall.h') +have_func('writev', 'sys/uio.h') +have_func('pipe2', 'unistd.h') +have_func('accept4', 'sys/socket.h') +have_const('SOCK_CLOEXEC', 'sys/socket.h') + +# Minor platform details between *nix and Windows: + +if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/ + GNU_CHAIN = ENV['CROSS_COMPILING'] || $1 == 'mingw' + OS_WIN32 = true + add_define "OS_WIN32" +else + GNU_CHAIN = true + OS_UNIX = true + add_define 'OS_UNIX' + + add_define "HAVE_KQUEUE" if have_header("sys/event.h") && have_header("sys/queue.h") +end + +# Adjust number of file descriptors (FD) on Windows + +if RbConfig::CONFIG["host_os"] =~ /mingw/ + found = RbConfig::CONFIG.values_at("CFLAGS", "CPPFLAGS"). + any? { |v| v.include?("FD_SETSIZE") } + + add_define "FD_SETSIZE=32767" unless found +end + +# Main platform invariances: + +case RUBY_PLATFORM +when /mswin32/, /mingw32/, /bccwin32/ + check_heads(%w[windows.h winsock.h], true) + check_libs(%w[kernel32 rpcrt4 gdi32], true) + + if GNU_CHAIN + CONFIG['LDSHAREDXX'] = "$(CXX) -shared -static-libgcc -static-libstdc++" + else + $defs.push "-EHs" + $defs.push "-GR" + end + + # Newer versions of Ruby already define _WIN32_WINNT, which is needed + # to get access to newer POSIX networking functions (e.g. getaddrinfo) + add_define '_WIN32_WINNT=0x0501' unless have_func('getaddrinfo') + +when /solaris/ + add_define 'OS_SOLARIS8' + check_libs(%w[nsl socket], true) + + # If Ruby was compiled for 32-bits, then select() can only handle 1024 fds + # There is an alternate function, select_large_fdset, that supports more. + have_func('select_large_fdset', 'sys/select.h') + + if CONFIG['CC'] == 'cc' && ( + `cc -flags 2>&1` =~ /Sun/ || # detect SUNWspro compiler + `cc -V 2>&1` =~ /Sun/ # detect Solaris Studio compiler + ) + # SUN CHAIN + add_define 'CC_SUNWspro' + $preload = ["\nCXX = CC"] # hack a CXX= line into the makefile + $CFLAGS = CONFIG['CFLAGS'] = "-KPIC" + CONFIG['CCDLFLAGS'] = "-KPIC" + CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd" + CONFIG['LDSHAREDXX'] = "$(CXX) -G -KPIC -lCstd" + else + # GNU CHAIN + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + end + +when /openbsd/ + # OpenBSD branch contributed by Guillaume Sellier. + + # on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs + CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++ -fPIC" + CONFIG['LDSHAREDXX'] = "$(CXX) -shared -lstdc++ -fPIC" + +when /darwin/ + add_define 'OS_DARWIN' + + # on Unix we need a g++ link, not gcc. + # Ff line contributed by Daniel Harple. + CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ') + +when /linux/ + add_define 'HAVE_EPOLL' if have_func('epoll_create', 'sys/epoll.h') + + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + +when /aix/ + CONFIG['LDSHARED'] = "$(CXX) -Wl,-bstatic -Wl,-bdynamic -Wl,-G -Wl,-brtl" + +when /cygwin/ + # For rubies built with Cygwin, CXX may be set to CC, which is just + # a wrapper for gcc. + # This will compile, but it will not link to the C++ std library. + # Explicitly set CXX to use g++. + CONFIG['CXX'] = "g++" + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + +else + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" +end + +# Platform-specific time functions +if have_func('clock_gettime') + # clock_gettime is POSIX, but the monotonic clocks are not + have_const('CLOCK_MONOTONIC_RAW', 'time.h') # Linux + have_const('CLOCK_MONOTONIC', 'time.h') # Linux, Solaris, BSDs +else + have_func('gethrtime') # Older Solaris and HP-UX +end + +# Hack so that try_link will test with a C++ compiler instead of a C compiler +TRY_LINK.sub!('$(CC)', '$(CXX)') + +# This is our wishlist. We use whichever flags work on the host. +# In the future, add -Werror to make sure all warnings are resolved. +# deprecated-declarations are used in OS X OpenSSL +# ignored-qualifiers are used by the Bindings (would-be void *) +# unused-result because GCC 4.6 no longer silences (void) ignore_this(function) +# address because on Windows, rb_fd_select checks if &fds is non-NULL, which it cannot be +%w( + -Wall + -Wextra + -Wno-deprecated-declarations + -Wno-ignored-qualifiers + -Wno-unused-result + -Wno-address +).select do |flag| + try_link('int main() {return 0;}', flag) +end.each do |flag| + CONFIG['CXXFLAGS'] << ' ' << flag +end +puts "CXXFLAGS=#{CONFIG['CXXFLAGS']}" + +# Solaris C++ compiler doesn't have make_pair() +add_define 'HAVE_MAKE_PAIR' if try_link(< + using namespace std; + int main(){ pair tuple = make_pair(1,2); } +SRC +TRY_LINK.sub!('$(CXX)', '$(CC)') + +create_makefile "rubyeventmachine" diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/.RUBYARCHDIR.time b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/.RUBYARCHDIR.time new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/Makefile b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/Makefile new file mode 100644 index 0000000..70dd6ca --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/Makefile @@ -0,0 +1,261 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@:) +ECHO = $(ECHO1:0=@echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 +hdrdir = $(topdir) +arch_hdrdir = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr +rubysitearchprefix = $(rubylibprefix)/$(sitearch) +rubyarchprefix = $(rubylibprefix)/$(arch) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) +sitearchhdrdir = $(sitehdrdir)/$(sitearch) +rubyarchhdrdir = $(rubyhdrdir)/$(arch) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(vendorlibdir)/$(sitearch) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)./.gem.20180108-62297-e2xkl2 +sitelibdir = $(DESTDIR)./.gem.20180108-62297-e2xkl2 +sitedir = $(DESTDIR)/Library/Ruby/Site +rubyarchdir = $(rubylibdir)/$(arch) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(DESTDIR)/usr/share/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(DESTDIR)/usr/share/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(DESTDIR)/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk$(prefix)/include +localstatedir = $(prefix)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(DESTDIR)/Library/Ruby/Site +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC = xcrun clang +CXX = xcrun clang++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework CoreFoundation +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = $(optflags) $(debugflags) $(warnflags) +optflags = +debugflags = -g +warnflags = +CCDLFLAGS = +CFLAGS = $(CCDLFLAGS) -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -DBUILD_FOR_RUBY -DOS_UNIX -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) -g -Os -pipe $(ARCH_FLAG) +ldflags = -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib +dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress +ARCH_FLAG = -arch x86_64 -arch i386 +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CXX) -dynamic -bundle +LDSHAREDXX = $(CXX) -dynamic -bundle +AR = ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) +RUBY_SO_NAME = ruby.2.3.0 +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = universal-darwin17 +sitearch = $(arch) +ruby_version = 2.3.0 +ruby = $(bindir)/$(RUBY_BASE_NAME) +RUBY = $(ruby) +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = $(RUBY) -run -e rm -- -rf +RMDIRS = rmdir -p +MAKEDIRS = mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = + +libpath = . $(libdir) +LIBPATH = -L. -L$(libdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lobjc +ORIG_SRCS = mapper.cpp rubymain.cpp +SRCS = $(ORIG_SRCS) +OBJS = mapper.o rubymain.o +HDRS = $(srcdir)/mapper.h +TARGET = fastfilereaderext +TARGET_NAME = fastfilereaderext +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).bundle +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) +ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) + +TARGET_SO = $(DLLIB) +CLEANLIBS = $(TARGET).bundle +CLEANOBJS = *.o *.bak + +all: $(DLLIB) +static: $(STATIC_LIB) install-rb +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TIMESTAMP_DIR)/.RUBYARCHDIR.time + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb install-rb-default +install-rb-default: pre-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +pre-install-rb-default: + @$(NULLCMD) +$(TIMESTAMP_DIR)/.RUBYARCHDIR.time: + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $< + +$(DLLIB): $(OBJS) Makefile + $(ECHO) linking shared-object $(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHAREDXX) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + $(Q) $(POSTLINK) + + + +$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/extconf.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/extconf.rb new file mode 100644 index 0000000..e4d64e4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/extconf.rb @@ -0,0 +1,109 @@ +require 'mkmf' + +def check_libs libs = [], fatal = false + libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) } +end + +def check_heads heads = [], fatal = false + heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)} +end + +def add_define(name) + $defs.push("-D#{name}") +end + +# Eager check devs tools +have_devel? if respond_to?(:have_devel?) + +add_define 'BUILD_FOR_RUBY' + +# Minor platform details between *nix and Windows: + +if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/ + GNU_CHAIN = ENV['CROSS_COMPILING'] || $1 == 'mingw' + OS_WIN32 = true + add_define "OS_WIN32" +else + GNU_CHAIN = true + OS_UNIX = true + add_define 'OS_UNIX' +end + +# Adjust number of file descriptors (FD) on Windows + +if RbConfig::CONFIG["host_os"] =~ /mingw/ + found = RbConfig::CONFIG.values_at("CFLAGS", "CPPFLAGS"). + any? { |v| v.include?("FD_SETSIZE") } + + add_define "FD_SETSIZE=32767" unless found +end + +# Main platform invariances: + +case RUBY_PLATFORM +when /mswin32/, /mingw32/, /bccwin32/ + check_heads(%w[windows.h winsock.h], true) + check_libs(%w[kernel32 rpcrt4 gdi32], true) + + if GNU_CHAIN + CONFIG['LDSHAREDXX'] = "$(CXX) -shared -static-libgcc -static-libstdc++" + else + $defs.push "-EHs" + $defs.push "-GR" + end + +when /solaris/ + add_define 'OS_SOLARIS8' + check_libs(%w[nsl socket], true) + + if CONFIG['CC'] == 'cc' && ( + `cc -flags 2>&1` =~ /Sun/ || # detect SUNWspro compiler + `cc -V 2>&1` =~ /Sun/ # detect Solaris Studio compiler + ) + # SUN CHAIN + add_define 'CC_SUNWspro' + $preload = ["\nCXX = CC"] # hack a CXX= line into the makefile + $CFLAGS = CONFIG['CFLAGS'] = "-KPIC" + CONFIG['CCDLFLAGS'] = "-KPIC" + CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd" + CONFIG['LDSHAREDXX'] = "$(CXX) -G -KPIC -lCstd" + else + # GNU CHAIN + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + end + +when /openbsd/ + # OpenBSD branch contributed by Guillaume Sellier. + + # on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs + CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++ -fPIC" + CONFIG['LDSHAREDXX'] = "$(CXX) -shared -lstdc++ -fPIC" + +when /darwin/ + # on Unix we need a g++ link, not gcc. + # Ff line contributed by Daniel Harple. + CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ') + +when /linux/ + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + +when /aix/ + CONFIG['LDSHARED'] = "$(CXX) -Wl,-bstatic -Wl,-bdynamic -Wl,-G -Wl,-brtl" + +when /cygwin/ + # For rubies built with Cygwin, CXX may be set to CC, which is just + # a wrapper for gcc. + # This will compile, but it will not link to the C++ std library. + # Explicitly set CXX to use g++. + CONFIG['CXX'] = "g++" + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + +else + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" +end + +create_makefile "fastfilereaderext" diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/fastfilereaderext.bundle b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/fastfilereaderext.bundle new file mode 100755 index 0000000000000000000000000000000000000000..13fdf2c3c459ba615f28670fac854d266f2202d3 GIT binary patch literal 34484 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 Jp2p$*e*m=ch&%uQ literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/mapper.cpp b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/mapper.cpp new file mode 100644 index 0000000..4c13865 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/mapper.cpp @@ -0,0 +1,216 @@ +/***************************************************************************** + +$Id: mapper.cpp 4527 2007-07-04 10:21:34Z francis $ + +File: mapper.cpp +Date: 02Jul07 + +Copyright (C) 2007 by Francis Cianfrocca. All Rights Reserved. +Gmail: garbagecat10 + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +////////////////////////////////////////////////////////////////////// +// UNIX implementation +////////////////////////////////////////////////////////////////////// + + +#ifdef OS_UNIX + +#include +#include +#include +#include +#include + +#include +#include "unistd.h" +#include +#include +#include +using namespace std; + +#include "mapper.h" + +/****************** +Mapper_t::Mapper_t +******************/ + +Mapper_t::Mapper_t (const string &filename) +{ + /* We ASSUME we can open the file. + * (More precisely, we assume someone else checked before we got here.) + */ + + Fd = open (filename.c_str(), O_RDONLY); + if (Fd < 0) + throw runtime_error (strerror (errno)); + + struct stat st; + if (fstat (Fd, &st)) + throw runtime_error (strerror (errno)); + FileSize = st.st_size; + + #ifdef OS_WIN32 + MapPoint = (char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0); + #else + MapPoint = (const char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0); + #endif + if (MapPoint == MAP_FAILED) + throw runtime_error (strerror (errno)); +} + + +/******************* +Mapper_t::~Mapper_t +*******************/ + +Mapper_t::~Mapper_t() +{ + Close(); +} + + +/*************** +Mapper_t::Close +***************/ + +void Mapper_t::Close() +{ + // Can be called multiple times. + // Calls to GetChunk are invalid after a call to Close. + if (MapPoint) { + #ifdef CC_SUNWspro + // TODO: The void * cast works fine on Solaris 11, but + // I don't know at what point that changed from older Solaris. + munmap ((char*)MapPoint, FileSize); + #else + munmap ((void*)MapPoint, FileSize); + #endif + MapPoint = NULL; + } + if (Fd >= 0) { + close (Fd); + Fd = -1; + } +} + +/****************** +Mapper_t::GetChunk +******************/ + +const char *Mapper_t::GetChunk (unsigned start) +{ + return MapPoint + start; +} + + + +#endif // OS_UNIX + + +////////////////////////////////////////////////////////////////////// +// WINDOWS implementation +////////////////////////////////////////////////////////////////////// + +#ifdef OS_WIN32 + +#include + +#include +#include +#include +using namespace std; + +#include "mapper.h" + +/****************** +Mapper_t::Mapper_t +******************/ + +Mapper_t::Mapper_t (const string &filename) +{ + /* We ASSUME we can open the file. + * (More precisely, we assume someone else checked before we got here.) + */ + + hFile = INVALID_HANDLE_VALUE; + hMapping = NULL; + MapPoint = NULL; + FileSize = 0; + + hFile = CreateFile (filename.c_str(), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + if (hFile == INVALID_HANDLE_VALUE) + throw runtime_error ("File not found"); + + BY_HANDLE_FILE_INFORMATION i; + if (GetFileInformationByHandle (hFile, &i)) + FileSize = i.nFileSizeLow; + + hMapping = CreateFileMapping (hFile, NULL, PAGE_READWRITE, 0, 0, NULL); + if (!hMapping) + throw runtime_error ("File not mapped"); + + #ifdef OS_WIN32 + MapPoint = (char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0); + #else + MapPoint = (const char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0); + #endif + if (!MapPoint) + throw runtime_error ("Mappoint not read"); +} + + +/******************* +Mapper_t::~Mapper_t +*******************/ + +Mapper_t::~Mapper_t() +{ + Close(); +} + +/*************** +Mapper_t::Close +***************/ + +void Mapper_t::Close() +{ + // Can be called multiple times. + // Calls to GetChunk are invalid after a call to Close. + if (MapPoint) { + UnmapViewOfFile (MapPoint); + MapPoint = NULL; + } + if (hMapping != NULL) { + CloseHandle (hMapping); + hMapping = NULL; + } + if (hFile != INVALID_HANDLE_VALUE) { + CloseHandle (hFile); + hFile = INVALID_HANDLE_VALUE; + } +} + + +/****************** +Mapper_t::GetChunk +******************/ + +const char *Mapper_t::GetChunk (unsigned start) +{ + return MapPoint + start; +} + + + +#endif // OS_WINDOWS diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/mapper.h b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/mapper.h new file mode 100644 index 0000000..36d16ae --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/mapper.h @@ -0,0 +1,59 @@ +/***************************************************************************** + +$Id: mapper.h 4529 2007-07-04 11:32:22Z francis $ + +File: mapper.h +Date: 02Jul07 + +Copyright (C) 2007 by Francis Cianfrocca. All Rights Reserved. +Gmail: garbagecat10 + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#ifndef __Mapper__H_ +#define __Mapper__H_ + + +/************** +class Mapper_t +**************/ + +class Mapper_t +{ + public: + Mapper_t (const string&); + virtual ~Mapper_t(); + + const char *GetChunk (unsigned); + void Close(); + size_t GetFileSize() {return FileSize;} + + private: + size_t FileSize; + + #ifdef OS_UNIX + private: + int Fd; + const char *MapPoint; + #endif // OS_UNIX + + #ifdef OS_WIN32 + private: + HANDLE hFile; + HANDLE hMapping; + char *MapPoint; + #endif // OS_WIN32 + +}; + + +#endif // __Mapper__H_ + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/mapper.o b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/mapper.o new file mode 100644 index 0000000000000000000000000000000000000000..fdc9e43f49b8eb75eefb958592ce6be506f9d028 GIT binary patch literal 125712 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 +#include +using namespace std; + +#include +#include "mapper.h" + +static VALUE EmModule; +static VALUE FastFileReader; +static VALUE Mapper; + + + +/********* +mapper_dt +*********/ + +static void mapper_dt (void *ptr) +{ + if (ptr) + delete (Mapper_t*) ptr; +} + +/********** +mapper_new +**********/ + +static VALUE mapper_new (VALUE self, VALUE filename) +{ + Mapper_t *m = new Mapper_t (StringValueCStr (filename)); + if (!m) + rb_raise (rb_eStandardError, "No Mapper Object"); + VALUE v = Data_Wrap_Struct (Mapper, 0, mapper_dt, (void*)m); + return v; +} + + +/**************** +mapper_get_chunk +****************/ + +static VALUE mapper_get_chunk (VALUE self, VALUE start, VALUE length) +{ + Mapper_t *m = NULL; + Data_Get_Struct (self, Mapper_t, m); + if (!m) + rb_raise (rb_eStandardError, "No Mapper Object"); + + // TODO, what if some moron sends us a negative start value? + unsigned _start = NUM2INT (start); + unsigned _length = NUM2INT (length); + if ((_start + _length) > m->GetFileSize()) + rb_raise (rb_eStandardError, "Mapper Range Error"); + + const char *chunk = m->GetChunk (_start); + if (!chunk) + rb_raise (rb_eStandardError, "No Mapper Chunk"); + return rb_str_new (chunk, _length); +} + +/************ +mapper_close +************/ + +static VALUE mapper_close (VALUE self) +{ + Mapper_t *m = NULL; + Data_Get_Struct (self, Mapper_t, m); + if (!m) + rb_raise (rb_eStandardError, "No Mapper Object"); + m->Close(); + return Qnil; +} + +/*********** +mapper_size +***********/ + +static VALUE mapper_size (VALUE self) +{ + Mapper_t *m = NULL; + Data_Get_Struct (self, Mapper_t, m); + if (!m) + rb_raise (rb_eStandardError, "No Mapper Object"); + return INT2NUM (m->GetFileSize()); +} + + +/********************** +Init_fastfilereaderext +**********************/ + +extern "C" void Init_fastfilereaderext() +{ + EmModule = rb_define_module ("EventMachine"); + FastFileReader = rb_define_class_under (EmModule, "FastFileReader", rb_cObject); + Mapper = rb_define_class_under (FastFileReader, "Mapper", rb_cObject); + + rb_define_module_function (Mapper, "new", (VALUE(*)(...))mapper_new, 1); + rb_define_method (Mapper, "size", (VALUE(*)(...))mapper_size, 0); + rb_define_method (Mapper, "close", (VALUE(*)(...))mapper_close, 0); + rb_define_method (Mapper, "get_chunk", (VALUE(*)(...))mapper_get_chunk, 2); +} + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/rubymain.o b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/fastfilereader/rubymain.o new file mode 100644 index 0000000000000000000000000000000000000000..4e213f5ebb12a298a8b09764d622d76dae6150d8 GIT binary patch literal 140236 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 (this); + #endif +} + + +/*************************************** +KeyboardDescriptor::~KeyboardDescriptor +***************************************/ + +KeyboardDescriptor::~KeyboardDescriptor() +{ +} + + +/************************* +KeyboardDescriptor::Write +*************************/ + +void KeyboardDescriptor::Write() +{ + // Why are we here? + throw std::runtime_error ("bad code path in keyboard handler"); +} + + +/***************************** +KeyboardDescriptor::Heartbeat +*****************************/ + +void KeyboardDescriptor::Heartbeat() +{ + // no-op +} + + +/************************ +KeyboardDescriptor::Read +************************/ + +void KeyboardDescriptor::Read() +{ + char c; + (void)read (GetSocket(), &c, 1); + _GenericInboundDispatch(&c, 1); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/kb.o b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/kb.o new file mode 100644 index 0000000000000000000000000000000000000000..00450fbe514775cad97c2ea20778bd5211c3f44e GIT binary patch literal 491072 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

FPp%u87(=u~1>5hDeC$ZnTCXjoBB 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/page.cpp b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/page.cpp new file mode 100644 index 0000000..b3d66da --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/page.cpp @@ -0,0 +1,107 @@ +/***************************************************************************** + +$Id$ + +File: page.cpp +Date: 30Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#include "project.h" + + +/****************** +PageList::PageList +******************/ + +PageList::PageList() +{ +} + + +/******************* +PageList::~PageList +*******************/ + +PageList::~PageList() +{ + while (HasPages()) + PopFront(); +} + + +/*************** +PageList::Front +***************/ + +void PageList::Front (const char **page, int *length) +{ + assert (page && length); + + if (HasPages()) { + Page p = Pages.front(); + *page = p.Buffer; + *length = p.Size; + } + else { + *page = NULL; + *length = 0; + } +} + + +/****************** +PageList::PopFront +******************/ + +void PageList::PopFront() +{ + if (HasPages()) { + Page p = Pages.front(); + Pages.pop_front(); + if (p.Buffer) + free ((void*)p.Buffer); + } +} + + +/****************** +PageList::HasPages +******************/ + +bool PageList::HasPages() +{ + return (Pages.size() > 0) ? true : false; +} + + +/************** +PageList::Push +**************/ + +void PageList::Push (const char *buf, int size) +{ + if (buf && (size > 0)) { + char *copy = (char*) malloc (size); + if (!copy) + throw runtime_error ("no memory in pagelist"); + memcpy (copy, buf, size); + Pages.push_back (Page (copy, size)); + } +} + + + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/page.h b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/page.h new file mode 100644 index 0000000..d3f701e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/page.h @@ -0,0 +1,51 @@ +/***************************************************************************** + +$Id$ + +File: page.h +Date: 30Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#ifndef __PageManager__H_ +#define __PageManager__H_ + + +/************** +class PageList +**************/ + +class PageList +{ + struct Page { + Page (const char *b, size_t s): Buffer(b), Size(s) {} + const char *Buffer; + size_t Size; + }; + + public: + PageList(); + virtual ~PageList(); + + void Push (const char*, int); + bool HasPages(); + void Front (const char**, int*); + void PopFront(); + + private: + deque Pages; +}; + + +#endif // __PageManager__H_ diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/page.o b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/page.o new file mode 100644 index 0000000000000000000000000000000000000000..603626a5fabb6ce4944cc4daeff35e1b0f6ab2af GIT binary patch literal 294028 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

)UBt)_7mXR?e3El-d`CcJWXMQ`(p}sdy`j& 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 z zqn$tg5n1N~dK+Qhh{oIrC{1y^@64h&`NWuisG$;BTY;i&3h!15Ge+4cy zHOd+Z)B-}kKbE-hkHPXJplH#@`$1gvc|dV0|6!w9HYG=7-4FEZ6#J7~vDD$CAJLOk ze~*AKWc>qBS}s(0ca)Q7qyf$o894S0ll3tI|*owz(n>2 zbh56lgFW2Yahv@gmnv9;J>q~hy$~nuv7xk|`Vx|!_JZ6_?frWI{z`!HDKf*T7^VHO z_mhCXPVfmS9{;llq`mA){}ccrL$Aq@?+XHTdj|xxiY}oscm(SK zqD`%|G*{358Z0f_^9j(=2qSHC@L`b9UR9buhAj9s;Iwg)*3-a=U;#k1Ly~r|1KbP{ ztxTrnxF|!E9yyNyMB8v_16?vJMa~Zh9)THT+TjW$)yg>zuuBL&$_c*-FdDU`jn{B0 zLn8PA;8YpYaQ16}mgqzF$P%Oy`!W(s1B$fgf&p}Qv>2OK;yTPyk;x=&uoOsYP|_B< zW+9qPgO6xM@HUMrHF1;^l7poBR8uW$o63|p1noIXtTpKuLAVH>rg2Rs&Xy>texs?* zXq!qU?;DU(+n08ZX)sb;5#*tnVuG+qK&`YQsMQ3Qm;|JVnW*1rs%zp>iQvCLK&!oJ zx0(coBBOw0f_qE?Ly^-p!Gk72v?9ONRFB4`62WgkFahaL+iVgTiWCFM1b;RO3`H){ z1h1F`(TcpUsosf8C4vLc!q8f6+J`2Ap~wnNu+1be6nRP$d|?tqE7BEh0n7O&E*172 zKtM~eX+N0+h9bYw1nv~0))|WYs0q?df@npiqsFov9BZ~KuSF$-R{%;Yt!V+1z)<9C zO)$VDFcg_EP;nSy5?CTskv?Bj<;SJ6yHINpLkwGoCVto#hvH{Cnww$A9EP7~@snLY z8?A;hk^@&1c`VQ{uA?@8>nx}6YyU{EcNY9(j|NGe-`{vS+-45WFgdexdij?)E1{UtID2KB$6D8Xb z95_-cM$&|YOpy@cFJy$HB;?Pqr;mS_x@RK{LG8G2(C}$j!Z}*<&02r}jR}0me}@eXWgXnB?k`HY3P{?FAW)dLwi0tOb!`*L$Zpml0ydHY@1cq#Tq!rjz8pG z0I65=%~x9VyIOYSzJ;W+vQ#C2)HVA~s9jid0%W{tR3 zcI3X0%_^%!1DDv5hCBrz9lP-@Wr3V6Vu<%TbW*UMuS}{j~|>&E#YLG zWG&%PQ{-Dk3Q=7YfrE$JOE@%>rxTU5gmd~)_7cv|VQUG;8Qpg?^SBwbdI={Kv6paI z498$uxeo)UmT(B*+dwwVO}Wro!dYfPgSCLFB^=`5wsmHqY6<6Wn(C@9ajDp_!5JH^ zB^;8gmSR|X@Cl83q>IE+6scKo$VJu?4r%6y_pru2-9_T;cmv3eyoA$znze)zczS`% zOV8g@`>%URh=1boWOT7}owEP3EjoApTn66?GLXn#jO^pZA4dt{#h?58s2&K5KfShq zF57>b=fLHo5v}jn4JhbO<3vI_vFXRbXH?LaL9hU=^iYob@9{|dvl_n=Rmax}Nm?RE<5A~_b^S|pE21=O> zA4ke5Xq0nw|G#xa(pTye#21D59EJbCo)ZCerRS5N;8PUmK=9k;IeCQUCj!}HWH00Y zohSH{CfV&-!z3ItFaadg(fA+s1PhyF_u~KAG}_HfFA*vrn>%qsbp|%+HV1-itW!a!8rvhLr*WN+>-Fyi5C zm<-PW`cek^>&RA8n!h@5XhKnnu?N}U3#Suyu^jae}x2#{`DGirNKn>|0BR@=YsGmP1qM9hFonD=2ii`g9xu- zvr7Far+xO%G_qshOO$L{Me{%A$vttc5TD@jU$>7~{eK441?xb0gA!}AWgqkIe+8hn=lmi>AEKIf?@zcX>%i}$|(xZ6$#yGIm`%8QEk zwZ=Va;y9jjTZ4vGc_%-sTMH5Bit<}QW_r{kdWn;%1HIDSwI`q=CI2r7A65qBo$i#t zONFun_uuLs)mS0K%~Z{P=N2h}J26H*0}%iH?onsMrC!tjusbs)a31(@|9Ojh)HXk^ z8JY;p@7+C93h+5fWTHF$_h9dP96us=1wh>4UF+TgfPo7B5h(7v{@|wmDur<(;5kzD zT@Sc}>9vaFQ8)EhDe0dP)4)F`tG??Ycko4!&}ypxF_TNMTb%+wZpIAG2AJFWC*3>2 zO34gfsliXVzh*GY3BC_7%`*K@yMMB&?E%IO?qF`cBEhx^vQBB(mo2fyt@!uj;PWcz zBSO))3NihE#$j->mdI&EkeiM-705^S5;;!+P7^x+`#|LieI+Vg*8ciWpufi*sMTc^x5o848fDYvU*pbM3=d5R{O3aFer$;A z0iqd!f2{`TDZzIXi>3s_7F$ySV(Xhv38LaE0>j4JQvy9eq$$C<6YMF$-$T}vz!}~5 zTjuc~X!VqUwo!O{8@swJhGVd-+z4=LN5)cQstuqT% zQ-X&y)m2^MQgOxvgOHkWUPPUjVMoKG62AD}5}$zBAy(qyTcLNu;w6QvlXyANrl5;(XHO zHapI5IL=(W$c!PXo!N@$Yg8d`CO*P#`Ep)sEy|jz|OY_8W`5r8_$~Q zJ~y8KL5!Un&)dP5H=e0j@WwNF^u}{`H*`)e&nu}`akNq(+lRnBoy^x#MXxZZJ#ufC?(;|>OrbSfFV_Nu7w|Pv9f<7{u2oP<|F)hZE z(d0}$=9rch-^WD3ftA)VEi#uYo#h2qLX1A9b-gBe!b|3IrJqkK1yO?g7>z` z!)13c#%3v}VsG2u+ts@qo`W&)@%O`#2U;en1;BrhtM@9nqX-dnd8|gvA8?JPVce@A z^yj()v%r(8y}ysE?>dS&2>X$5k!Haw5&SEGM!8mjjVt{<0$WX>{}5O3Q=kt&4I~9F zlB7t2V*omnz++q=BaUWxo(4~L(MU~#eWZa1z64xmHKI&+LyHBNv za>GaV5Zu)M74f)X*+!lz5cVZ`D64jnXBG@VXL`nvrwhiUXM4o361cOHVuX3qYV_z?CutolX-RnuDUxqpX5pp0qm=SR~8}N z-BkgsySu#et?uqpJI;+9rxtX&yITRj?(UW$j_U5D91?GKcQ=5*>h2gxbgH|12S`VE zM_P&;Z`kPWtT-ZP65v*MXTz-(#kRYgA>73P_OpWgDd3aQJ_Yw$v=Tc(0!m_n>cc+=|v%BjOff~;4ZY%h5cSn6D zcX#B`-CeH}FIF8`#Z-v4JFurn6T1VWps(s^((Vor#&lqe4>NuX@G<9%t@u7B3Vwa5 z)q(v9v0UjaFCdES4(y1_tPX5DlRQf*1qOgbcVHKQM0H?3NYz~EJsqn9(ySt&cPU$M2&fe}b{V3aq`4(w8jZJ#ryppT3uGd89J zV>}s61c+-)2WG|hF;P%lVs&6-E>}9s3tR;;x&vFINuKbMxm@XY0x1I5<5zcJe+7x^ zz{p&h%L5?M9oSgpk?O$6T$;^z5y(6gEAJzTsvidrQ$Zh5iQov3loQ!d4*^{1qlq+F1rT+ynZrFFO|!s( z(Z|SUH?zMdxCJEC#b%E5xTo7B8SqoPk$I4Z+mP>wc`r}UbDQjXGxI%1LWI&OI9h`X zJS$lcsj9l(O5muE%^c&1a zPBd6cy5Qlr%dR$aQVfsaV&JIz&YT<@?;_x+8_qn+u$kn^MdT@1LS$c$UsvX*E(;XU zeOcxgE^D%ri4PSF9()J37M%wbs*r{_2Nf8s4l1x;9aMN{2FQ(r3fGb~Zo-e~_W0d$ z5z8068)0|4jmmQ0qYopB4CL50m$q^!?0u<$vH zQXfNp1#m~YnTd*v#d@A#V$L#2UCqYf&p z*7%aA3D0Th`69fr2NhlbDXqr&X4|Z?GVW8rId=RZ3jtII6{Hro06fhRRRD&L zh;s505^(N=C!pt|Cihf;WK0VA=*MxOp;sfCAula2xMu-nkIvSU!uIHlg1)XZ0Sgp^ zFlKbd_(6=X0zPJRX2th0QE=2<*66GZv0UjaFK{Q~>g9#AHA!yTc}#KvsT6ntBzkoA zDoE7m>>h*54v^^4Ss%27OfoR-WrIt1G?>I8|e*x1QIsSOfOkY zb2%M^Y{B8)VC%0G$t*8fO>=1h30pAFoAVAx*n%ZmQQClsV?iFIp`Sbg5nNq|cm_~X zoujZJ9x=AZ$ST-&Y>&K`mylB=ooRmu)3H6K?_%eeUX>IoKAfFnr?GR~$?VK%WoPDP z?995Go#UTnr{pi}%>EBMbF!8Zm$}2(nRhfh^B1$Tpp~748`(MWE_P1(BReO*$Ijw^ zu~RM;toWHjm4_}Tp3CR6bLu*FPP>7f>R+={`xHC%ud#Fbzu9TXsG@j{L)mGb&Q9x6 zc2=%p=ggbgIqP0_R{epU)vvI#=6!a~-oef}u2YHGxn6eG2H9CRl%4g3?3{NjI~zjm zoPRAl;oq}!!Heu%NW;XjJuceG&c$6$qtK;&*ttBPohy!E=gK;Eu3FE|)wi&7?Vs4W zZYw+2f6mSg|6%8*J?z|^UQIl2>BG*ggV?z}pPf67VCT+b*!k65cJ4lfoqMX-xwna( z`_{1Y>kHWV&6Vsta0@#R-p9^wA7STro7s8zWp;kQm7PC)%+8}fu=BXPhE#f@J3Dm; zu~WaHmVl?roNoMtLruHbY4+6-uB9J4tw*x6VgWlVYuGvC0(Q>4jh(X|XJ^%a*;(DA zo}#ZA#?INZ*g5A^cFsMMowZl7v+jO&)<4J2d0W}p@Nag`Pd%Nugb!iof?{?e3>I8O9D`BU)f}NT(*r~mk zow_^Nseg=}(_dq!;Zt@R>B!L79!))($Y~zL&XGs3GkGpMQ>xfGY7IL_U%}4Qd)O&@ zik)e1u`_);JIDNwo#F$q5H_~Qv4hw-ZX!D~X0tQ1lAT#+vUB{E?3Db9o!L*YGv{@7 z=5AxB>3epXU*=}5Wl9UNZk2kjkmYRUs|-BjQ+CeW&CXfbtwgzM6g#Wuva{w?cFtbU z&N;WRbM8aztbLiCbsw{{{s(r>>%M}xYzVS*{%Cf>$FXxkB|DL`*tzgBb}srgJD0q` z&Sn2(=Zc@%xw7XNrFIQuM${`&#!JW|Nc5tGuSqnGawcpw{2$u>i8G+;=%c&Ny8yao-w%YV>zyts zkHtIJU+#2?@m*d(YVnMo(Uq4ZnCvseWY2f-NWl^<1uH)bmVR+W8F-wDr{KdwA=_0* z@6Z)|NEsut&jZ{w`uUXH``~#I&*&FZYJo|A7<&4i(m%#7$j89)2ygs{Aou?nQ4UWh zLKp9p@Iuf%u+uxhPB?}VEzuK7Y|;tyq@U=-_>&N5CBUdCJ~Fz5%IMNB#(xR&!WXf` zaDs=lm5T`f0FX_y9Ujhopl3$lr`%V5nyKB5yjlYyX|@HA>9y>pD0X~(Hu?y7FqcBtqT0kz+=GL1Kr zmY;-ZXQzpR=iY*6ZCd(S#QPllh}<^-qQg3#^U?@lp!zcPCAimt$b}4ErGmb|G{E{X z$qgFzDJwMg6s6GWw4m=DB&Ou`HUCxT=LkzAA(+yj^1R`&Es zuU%rx4E+Tc(BSa|l}xsC&PxD|cpu<19fA@wpCH)Su zl)S*W#rBl6&zp)QH|-#>bfwpjN`aF=qNk+ifkaJ7Co&0Z9as$#Jth50lMGA?8C-4! ziJp?4gmP_7NmZmBlH(-Q%tfsk8snt``Lgc13C1pj+NK&i?^^~*(VtL;{ zul)1owY4!&0g>{ZZ&;PPH8QV-&VL(dx*0;p9-zx};QcHtIO@D#YGh7gSqU*D*F)b>Os=%tT{6=wJSdi`73s|5CB{4!nZ9S=o;&Klh{3 zFFWvMvI8IA41Nz0&qkwfE&_l%pvCaWzFDFrPvvKxO&m>3-u^dv7B1yOSE2tyocH^1 z(Gu8RbomHBn{G#slCrkzWg!GyX%tM^;7VVNNxi!Loo4ZR8sAqgP~!4N_cdgxt10Rcgg zCMXCBA}S&%C@O*l6#*Lu5CjwzD=I4AeXsTGJrj)ThJ+)rD*>@s_= z#S*BvjZy~l#{fRY32Tr;SqC#Z!!X-Jo7fHiaGEwc^aA5V`x!2$c@AKvK+!RVTsFCL z;G9{E&S6fWf?EZc{Fg*ANr^4tl(dG{w`tu>jtkhET%gE&nj*O*Mw`S00)L2(JPpNn zPE=vF$O~Y90qYv(^tf>9cbeZo(v6(TySQ18aS?=VU{Py^)8%2 z;b>Jy5|>m+YDg_PlblJeGuHv@(iLK;(esl$5i8a{DBV45@{2R@{wBjI8Ck&nzV-oF5sDTfE;z^>*Sb|jwirHzJ(b1 z9$N70<~dq=G1X}NOZt|g;`q;`Xfm246*Z$tVl-UK-$+u4R3Cv5s!90Iq-Zvyj^Cl0 ze0{=w7ydnl6HDdrDiOPYZBpUsc?n$ISoFC#XT6t`p$M<$IRYFCYj}0Ta~wP~8eYR0 zOM7@!NW*kgBkiFyVD@LM;dLA#-A6(yId}o2x~hjVNv&-(0@}&6)YE=C0`^2Bd^+^2 zX{*onm3SI$faV2i8%T&gh(2^6(`fWE^rvZy5pTn+iClH$8`~Y{HIpKndcl6kyA3>B`J~4Nql)c>1P@gx4$_=7mD7I zoXG}DiljJ%Tvc-G$wiY>R{k?7CY^49e~C0Gu4z*k*f1uW&}0jkyk#>-(uG_S^Jf-N zB$q@kiJ!M6)$fRZOK4DEyYYpJqVDKUWgx4Bt{b@5}MEi?3XZ9KK! zzbr&+n0nIOR|V4fA4EkzJ5_ubJ_;|QK^Zx)yC<@rCmk$3Bl{bkQ5HYIX+$=LUk?3- z!tZYF2UX-?@gqOPi5p?~xSWxxkc;S^+C3sNS-DT6%W&`16mG(EqjSZdnjtN>F9PmefyJkBbJZAx}~=t7*R4R31-D^<&@=Hx#kHj&x~)krtI zohfXzT?}teDz^E1iwe_oAhipn?ZMs zS2fOmhW9ZBSgTrx{|xUADjxBBlzkeC{R}pRzhZ^@E#8;t`VfEO3Jr+hRchDY?)xUS zo9r^mB=jz|k1B0Cego1?t!mgD1=)EDc9+w8mTpIto2ok64DTgsH>*ZcZ z3h*K$*YO?#+mR7Op1{8wa4c8V`6s~bh`azz$UZ#Ks_HBQa0RLBj|yNbRE=c8qrg_I z8d({=DH`mZ)gtf6!8H)rO4XdL040JV+10v&tz0dVeY7vwD%B$S^Vd+YRjWkuC$KEC zRU`Q`*m$zlBKcF;9I{c7{5fnn+3Jz}No)hz8j<{2>?yJ}Bl*+VL9(?}yl;_>R`H%8 zTTjJ%iEMop@AqUIsCaLYjZyK2y#ThMiuX>ku`1qZvT>1LBZ=lYOHP$ z`htzp)!_qMJxUdGB-k2Jk+sI)BmuVO+Ij_m!8NCNrUI+vLN(R!Ob5?qtXbsr%(D1t z9?x9xto)kO!#s;Eenv^pa_}`6c4mZUo8>>Ng6C=Q93D02R`$FAz9W6+MR^W^?@xYy zEzj%V$BZljMx?;^I8I-;{ z=umPx(l=nK^C!GIGrMy0<>wuSHwI;@c|`^O3C@PeU!}b9)PCjHHf>Ess3Vj_$`H#+=iN1}#(Kf~LX>fdfx_Z>|24jr8u&1zh;Ed7kWX*7lh7)75= zeMzlX#TI=Y_2mQdri`b?qJWX-@qaSxwWA`hft>}`H9}p9tpMA13xn?b%b|K3_8KojeM2>dI#nr7{ZrAGb;DksK7T5u zI!oQ=rRRjKBdd5YZ_iJg{yX4hPO8rU-}hI2T>8^P`%VBn+$0jHP=;-SJlaXM%jtb zE~4d^;uf7y-{mxw(6y)n^j$-Z$FI>T4A?+*DF-9z`#AYK9CmXX1D>MBP=WeBN8S-& z?fW7%A^s>aLJm{)q+cbS?kLr!Uk%T9sd8x*%Ww2OO^w^{Wc2-%nhJi6j;-uPsIPN2Wk&N^ES0o2|C_W&|ILl zR-o^f(ELno{Qzxb*Frq9hPEzFt*B+!K~P@gaA@xUTTg4NfsL*g$z@EMfUO^;&b@7@ zZCJJ^U?`}8dVUznw+3)q21Oo~T~#G$G2D?|B0hvChob|-lms^g)UP365TqEypjDArK9%&+urf+A+JtqA3dBDfT$ zb}D%tVPwz*!*~YDhEb8>U=MQ&3@TSo!*dxtuNz&xaH5St zoa#h76Km7K5EJY5{0L+@V!Iojn-<^0=?QvS^gTVE5R2~><|$+Gy(2soExu2rr@F=W zt>CF=@%<`$8e4q-C{Jth$V}{jTAn2EoK#{5MjPH95aO~_b*h<*SIamZ52Sk3KdFLQ9*{!B@36e?MgyKO$d0I8Rc{J%JFCI+nQ)n+#LDki|#5kMkC;l?V#Wd|K9zr5p zNz(|`o-C2!eVB@Lm9Y9}M`(CA(=<}~^0q)u3)`v9@JFtr*-fqP_Nu06H@weLn;nqa z0V>Ab9_1_4j#t_M-(%D+Q}^Af+-Z{#rO8Zs-=k@ly65(ryl1F=THS01XwOmmfI8*b zTDj-EOw(R<-*&s{Tbfo~Kq*3RH{GD=IdzwPyU92N(@cM5(r$Q5P`jYGR<8F-(Nt92 zWO&O_JFmD_0#v0*PX#J*okDGDXZYJhYa3EKzqnSSX-3n1s)MRzR9qB|vTb1+4r;W> zp8<7SSvCXOMYJsQTU1JAmqYsuEf4xFI?RjEo~32I-=f1@g4S~wmaTq^>Sih%-UyiD zW~m&i%&9=$3e?WEwT8DE6-#V|YAjqKQM=q9uZltSA8$jN9{lS{p=r%+p>%HA(zNz3 zO`U0a$ZztOp=>Xh(rBKoGN^p~S#3PkK!0wI{~h^uly@{e)6@XaqbHAw`&Cw{HM|q3 z$W@A56}W(b`M#WYI!*Ve$km0H;vP^=%07?w9Dg=$bMh{weX6pnODa_g72dmwrm_B@ z>L(6={N4?;-|G)rwg`j9Z#P-_J+{+nG>hTgL-r|u3+P#JKeg*@EoRxn)a0xBP<_dJ zjEX6?i_B;rQ2Vg0?Po;Zj|_YQZDakr-REFk<0H31`y<#U)zp3aO=>4K2z>=lC_u3} zd~MBJooud}bNJ#~DE}E{>qFaymVBlBl1fvxSqEyzE3Gk&TC(0Q)ZU}&Q8lu+Hx*;_ zwW@N9!T*lRcOXr9j54$?P2OQtjPonXWRfu!&tB^LRbotZHkfRWr$HKVBG9FMy{v0#J@v0c#EoK~w=#Bay$G~ea z)SZsyqNr*CX4qk9%0Vatim#l!B|r>2>>NHXP=477rFjiGC%Tp z1R4Vct0TUyBjXBW)RPfPxt=5W?Eo2x`G!ExJfPfkT@FUODo;zKCr|6z(-^u3d?}D) z;AZ57Y5L|sWI2t@^QbY$bI_|I9|D8j+t5j~F1yz^hUq=aq>4NW)oyeEIR;*bAwDTI z9c6j~3ad=R82>RSRGB*a9;A&aW#hdN1D(qleF^{WKa0>^`0M69uQ5#=@m+ie0ZcG? zC;rjj1chC7`^YnsJcibC;HPLXj)D0zaT5db{RVLf7<8)IUr1FusPH#rYAk|rfH(&3 zf+4>44e?8>4uhS2M%M}o4?N@R_)3CR5gVgMfW<6^@Lw@}qi@-q83AE)?t-wK1#86V zF{d9yE~y{ih`$AoVZ}^`N>xl#uEKAOUISTGMKe~#FjmD}sMy2fo2go$Xw||T@K!Bk zo~VbcjGYzOaG9U9hHj3f+XSXf(h;QiwOY+)Ebve&qE_ zaPd{cHhf_fdafvBWL0rgZUE=cteDwNTJ?cP=pz2kIWBaO`j{*8D~wl%IXfUv+G{So zjLbDO*9bHl`R_Q87>tgAi7=E88P^20x(iCS2>VQ>{S4v*rT z-D;v@IfolVCR^Tj{Ttq+LV|Figg>a8gK8TppCO~O*;#RBK36q&jP9*gF_A)-X z7sT8~2sgS3bhAoAm&#@t))=w$fyxCTexz?VSmwh=T~{!}%m9b*DBn8hSu9^Vm^;ZV z0#h3dkIWbhGKXib6uS%<{ri6AU>d3yGh}A57dNwXcPVH7lAiZ@D;R2WRPY@##c*jU z-Cs+&{r$C+n>E{}>TBq)rQB-0sr;9apWaBp0v3@K5Do$3gbR;L8lN|LS@X1Vd>-N1&kNt?*5LND9XubSb7$-Oel$fs1=kd z4~AaOEch8MP_mXVuw*>FXIF&4X?9|FFjY1o(Y{VDEk1ELZ~%1BaI7aNE$b)figy5KM;Fq_#*S0W!~8VFR5Q zF#NDun-B`P_(dG&YLKmky*rA8e-X1AIaQ!7j$DR-9#|@9hD@$qmthh zNo;|`V+#BW*mZi4S_W^j81uKE117#MNlL|2b zt%L%-g$jo;g&nIarRAvqn=q+frJCkxNUCWba2A{FEd6aQVyn?25l*{B)MWPpq6%gz zE1kZYu-TK{%P`;%3#R+JLmxI9lL2QvTR+d&68bNo;*tM7oN=9mdM~*U7un7(sL8b9 z@UZHAVm<_(lERug`M%J^{g72-H&czRD$)rZQw?k8^eqGLugDO~(%k9W3SL)a<{);E zDM-Y5D%);;M+&8C9(>L6zv^J(W`U~Taf zo1BOA8bMJJwGled;d>iA%Q4KmN5ddrj0?2{m9HY0m+3G!&|#_14Lz&E_X7g0 z1%spD7hrG59!7GvBgl6byh4zjJTeo_%yBZx01CA>$zdXQRz-{{B_ zW#)1=bh;Ino(cBznrEV=Q`bD|+T{!PAp{wVT@2N(g?at`mpeb{%N^zRlfJ|;UqB2U z`9(_7tK=>)xjhga?^{v-2u6Jif{$eQ#f$o`M0i7m&#V%S0OsPrj(B%d$GvZ2f3I$^ zRIw~w!L<4S>d+4SM8DNXewJ4|p&it!4yJlPi|>VHm2hn8fe5k?t|ng(Ra*qBh9KQ4qpSPsPaxUL~#E**F0qgo=*LpwUk?Z$0VmyE*52ER_cPlA6uEf z2u8oNhSqJ+9j2cwlgf>5U9LJ{x9*$BJS1sR7CEq`k;2Jdh$dl)6sj{A{f=Aaik>hG zvO#xIv@k%I%i5mL+IuV4h6A-JY2+1VJiUhQ?s@EK(4zKJHOYCO_gxx}J=G zo#4=soY|Y4GL#w)!*GgTLI;r>Xb!Oa2v_&k=-miV4)WFPJ?5!jy3Q=j}7J4&RSZa~AS($HqEjwnEdG%-diRz!(Mn z@ZVhmFSjrhe%ke&gNaj*uLDBmkr@bPDwt`h$m$jPg*Y4q4?t5I0nr3TXc$f?qu}-` zl*XhJ_+J$!mA?>2kTLxQgfvk8&^kfM%hmn1FIeFn*jI)j82p;GC#Vg|>`S;fXN+snD3js_2K{stFqe0jBd> z?gSDFTOB-Y$i1jG%{y`@!8(zRr+WQH-RoDuqa=D;DWo5^J{Z^Bk3*9@CP3}{nYXhu zsa}c>VtG5iau?2wdPH}z;k;vxMLcS-Z46dpCLS{DF>I3_GtI@0F%!Znoh_Gnwtk-P z2K)oZ3=0;vIXE{JIQbp~QayME7`q22BUV`bJ=juMJ=m7ngNL&RkFYXQBS`hz3J9dw)IPW2cefvjEIe7cBE0r1k^^@!^Jw1rM|5r+3LWK zG=($eGL#!}IC9T{nLGqJw`WK`HQ)?614?^7JPM_n4|AYZv)>9Z*6i0FeRA?Tj5*bJ zc7w6|&Q&x3!utD;rLg*rE!%zPI|Py0PxYN&m?6%23lXvEJFkLKeWw=~)pyds`1?*I zTGH-2g)phUa|(>=J6FNjeJ27**?p%P0@{7&cewfcP7F*cS9aftX2?2v0-J!^kU39H zXiFdm_7~O`A7FEWQ~hNN6t$_4{$k70UnrNQUHXeH5AuB;*k5e@Qs2-1{-P$mmkHun(e1uSHnCvPxOf2UIL^QPZpyg<}jP%v@#9=V%dLkaK96trTp0Hfi7~({ut|?A}QP&hv@KvL#GZ<@B zZA0Rdr(#B}fCMLh0;U#I9*KYL{X=9}_dvP%@FoGGvnHZb)yN5y)u_hN8;D9(<9%RM zHEsf`z3zHf?LFiQW@R`IxU`@R|eb~e24!HS;&m=3y_V8K8kTQHa zq9S;H#3h5egz!O@;p0mLuPz}{!T4w7G)Q3#VvVRVP()K9Bg&R#L{SbLQMNqDR|*mF z5<<OtQoOMW(3UwR#aHSGCdHSN4&8TSRNdVCGC z8ci<*`!<9BgjZnGc?EWcq4ozG1>d9G?1$Bv#)}xYJbPIRTz09m7v;dZv*kfPAM$M1 zovmN$n+$zm-F<~9(1ZMSXDO_@vt`uXg9z-eyN_^>@)3G6Cs<@LDEV-J0;>xoFDot= zln#^|ggBDIzks%A>~jTs1sEozCkeB4{R(8YQ~ohgZ;q9HXw^dF!-~W zUmvkG#dWA-;L8uA{Tw;BqI-(mGH4zR2V^4(J*vi&K_&NeY*7r_h;pU$RKY)qj8NRp_;86St8q}Q; zddcD23`R|M&w}w!cARoC0F2Nt9BQ10LRJO6tmV>>Rq=2uqAoA0Kv9nYuId48%QB!T z2M%ak9^{*i?Aim`)-Uy~fxo6m+vfv;cnUAPcM_z-N ztd3j>cGZy+!KjY>IvBenTdt}j$HJmI@&GWZBQFP|I`YS0td7ht$0vRbg>+;-44c@i z^gnmx6Uaxgj%+Ecj%>^9$f~=ZMG*8v-CbKFPSsrvFsi$j1;g$-!{1fEM+m#C)`4Ah z)e&G+R~-+=?yA=VyXvn9Xm{0xaPxOnH@Z~ut{M%E)m6`<8B|yO5sbg9^0XJ&Rog)h z?5atS@n?iuU9}ISz^-b`(p4!3c2!#*oozaNh8k_@;lh<|x@calUpb@) zg!rEDA7=UUF{t*B2rdDO_Kygz3*H#=kmbMR-}2Ago`|^jS-$Egj=y|>-aZC?`uEqL zTSxqK(88gq$eH?dc}R@q*WmB`Cagf1=Mca# za0q;wIyxf=AE2jI#LbXBpl_l|{m;;IHo@k9j-GQFR{yi~g6SyVPDHEvR5Q#S$#CBU zWpb|oi?ejF&kMsi=nAS9Hw5`wz>)|hjwz>rQ5edhEga6Gry#V1fExr~9-IzCPOgW# zxQY}3hV!a>SQQlI2IMM`gUvC>zAZ8LVRiM(z`!S3t)& zise{F~I)|r1K+)&z+0_ zJ)cW@K-EDt1N3~t!zYM)L3~VT9aes6e>Xr+-pYTEfc*bE`euLQ|L^DvrMy=oy|jnk5hi zpI%wVAoy7E^I?;9@S&rn4@|cZ?Zz@*L_NnNzI22+9T4tuu~VPN34Ut6^uaIaY%xQJ`6eqIuoF$@5dls)$;1m zI_83Z6I21SUv-dm@WSOsP%w0%0ebp|L*^w1Pwm$69Qe0EoRPcoT11Y&)6?w4d|3+= z=x=oGpU7VpjBcP6AS(^(9P0Fa{`K843k1|G&4_{Gmi2Bm`NYaMAKj|66cvO%LocMmWZG!~Q(Dg;di6@jLKri12y z=7a77-48m`_@Qb~tZtk0UdshPy!Oq#MKL?OcfU|Fy?6a%9p|m+-~EkE$JSrJui^Mo z*M9Jp-tzv<-ajuM*)PA+;#qe$bR2Sao%#N+7rT|3egFFd5^p>=V%bN(j6Jw|ZI`+) zwM+P6^y*haFDAa59F#Ng+X;_VsIlhWqH|wAQj{1~RH@$Zg~==C9$zrJ<<$d@Za=&~ z_FV1ncHQ^>fXDvGYxhnbRMx*b|F1IQ&(*4l&X5+3LoAv9l#7dvc$SHiG*@NX`zh6;pYU}M+KT&wl+ z$RFQ+VA7m>pEh>@(FC&&pcY>%+tAUOsaYlVBfA&N-l&pk<(q zpfey|JUB5SR{*sH^#Bb6<$#Jnyx7mVm4tSC@R&=$~J zperCwES&UWKnb88pghoA&_>X1&>_$X&^gdApjw#N+JpLlQb7wr>p(j}2S9Iu_-y7H zh&PHcp!T4_pi!WWpxvMopx;4Zn6P3%gF$ma>p(j}CqWlMyoGaOG8+sU1)2$313CbD z3&cCm2v8KL5hw{X05lR*2;zO?r=V+~h%)d4^#F|o%>*q29RR%r`UT{{4P6CLG^izL z7-$k`A!rR~8>m(!<~q1zKdc*j~2E@OKvEcq{ozBM@53+EEV(+hDdkvK9R)M3I9_rQgW z1rM@k=y+eAt7R^S$g;Q|)pE_(w0!4$Eju^s8@RG)o8u@~36!Zb%G4X>`3+^^(Q20t z^ZRNof0wVz#k@L^SLXKt$@8(J`raZ9byXAbrJ$aAAl&mP?^@Ky2#J$RNV2?@pu4zU z$E(&}1bYYa+EDU4LdsJO<>qk~@nae?`Xc_ah`%@DPeA;O5Kljen=gv9%qQkB1kV3c zbXrzDQg;k}4^y2{fOwiAo^gmL7xC;sJUp`VbR2ij(=wO8V}5rbPAgu%1I~W-9qQVP zHYkU787_6iMMUYp1#R>UhzB=wXTH8$szkL!Gt1H*c?d!t+93}O5PlN!kSJy0y4;wC zj7JgnPvm78()oB1E&|bBAET{e(Dz26Zm)nAqc62WU0&R%$qzreVHgwb!h_%Ou$7l@8)Ni&|W z5YMBC=O2itD*9Ai^r`nHo)?fN<2f}G|8R8bsl(jf9xIW))h1kWoAsTKdVUe@cL8

~g!*AVI?TkpGz(=w{e3?l*K`;w_oLo;a3gre*$R1Q8AgJva-4<1 z16vZ(^MRHk%`Kq4NcTACbJXi~5RWgU9#Upvt^)Dk&c`N@VHu8Lc<=)!=9OtOJswq2 zPUhpU`V!YmXFNY)47gC2ouof;7fEzMqi{Cn1kmd!-(^r5>XvibRA&>r(52}DZR1fs(M$GRZ9`~Y6O8}RmO*^4YXCWWcQJ&Y3 zm)Fog3O6V><0j%^IbKG7b|Md>kmq$MKMyVy$#Q&zd4qFn4u}WWg8!@XaY}dv4b&a`&FYzy5YJgHx8JPgsmK27K3rPj4V-&gr0IOKE?JMPL)HrqK89nO)||vw z`6xdq_NvGm!dh~sk@AmndZ$7er%|hEWNB_t~+w6nyk7%1aQ0CV# zUh+1=0Z013==<+HuG8aO!-LChGJWfOHWlN(1Z0l;e>Kl@v1``%1E|Xn8tIc;~6pr`JN~1VLa-g4(fs9b{p#9 zbJ#tohi6d_sT<*dgWG*EJkOg2(kB`w>-yz5nqElbYyr$E>-So6x`ifpkAay4LxTyLPcWPog}z(62{%uA@9LsKZ3$`wx_7+eSFx z*o8J@9&5-L;TB~s$T743dJJ(RIL5scad$@C6A<@N#O*}f)e-lHhN0yPsQH*rjIe&V>~9L2H8d5Ytc za}~!Z=PQm=&RMA&{qq)oIbph-Q+RND3)bnsx_;XrbI7Tg41x2=T#^Ci;b`SI0_%GJ30wzexkJ#ozatMjCFt~!{l)8+W#aS-`oKCJ7*ER>tFb&c^+ z11(!~1-JQNUH+@<$H7u=UazIh)aT6uKpw|(b$smeJoqab)3dG@`LhybUXSxA{r}@V z9rq?-S^w2FC6|%@yEf)$@fyA3F>ohr5c`O*N z%fDo{z7FIyAg}9qWKGq+JZJH+p1Cs5JeV&Yl=;k+&nYb*6FSmg`9Q78S=fJJXx@&6 zp~tqYD3b);0MJMfKlWyvtt6oh;K{~=c<>#5%JnNN(au*IL^PRtrb`RcXTD6F9i8ed zu667a!62U3nZJ^t(jd-bWkHzQ)pKB$he=ceRR`4s)dtlC)dSTB(WjAMQ(!Yt3s5Ui zYfu8HJ*WeSzAR^F;kyF8pzb2$c1C?J+YiXP7z`Q;8U{)Rp{dl*m?MChpllH190SC# zG{%WM9ykd!1%xJ4&weqKl`s8g3D0KbFvirSY`9EUYZ;(h8|c2gX zIB1*bw*#L5?GhP7gbPrs-;Q4Zz6g2=bO^-f#HY?rpHly7*9}!#4R%+VeyT2?4?i|} zh~aGOXjgTYv;BwHheo`0_b(gHZ~N`JV=?QS^f~(4^7^qms$RL?Z9~!@v)?+ujbaN_uh;3rY3CiOdj=E!)?p=Pf0#ke__c! z@n0+&JhpG-8wvYYevmbwah;(NeV%)`{I<{PfBwO(g+Z$amM+zK+q{R*4{$|btHKaC1{`24t1yQ5#+aB$V}AEGy3U-ia|Uw^v#?5+Asj-G8&xcuSaza>9e zujQ0Gn_O+!s`b9v2X+mLj4j=0;gda^-O9V+=^t0IYU=L&i$Cd-z~|kkGgiG;w$GSr zYd@dY|AEDeXXe$v)a;&}KNmfFuFkg`A3y%-{R}_%ETov zS<_@mzZV{j?0CoHnUxPkL{++W|FP$KuPIUC#n?M9l)r0s<35X9jr@H{x3PmJJ|A<( zUA;TZF8E~52XDU@*Lw8cFJdRu9UZ-`&z{p~Hica)*}hfZ#n1dU{*m8zJy7|}8Yx9@ z+_(6T@lDI!RkZDT@?$4Gk6iCoD|b)Ih^G7dRlQNgG*;bnwCy7Y-kEdm)9<_`mp`+z zs3>;)FF(8+*3(zpAnP6&SU#U-OI)Xr@8w(HG; z(OEAw-rDv1#)m_Lo}BvO%>{ichGu=1SZ_?M52Cth0deQxEJy}X^;?|$=Q-|Q=e-}N1Ryl!I3sdp}$6(hcg zxK{G_GfThzaMkCP)1y`u?M*hPRroq`(U;wu?0awMt?(@m?{0eI$ibcKvL2aS<)JkT zmVbV9al55^b_{J_t@hgm-th;En%%7Q_6N=q2iF(-&3eRaTa@<0gx-%FDS;njL0^LY07c-$G6FOnv=H<#=qb=)&;`&>AP*+4N}yO! zB4_|83p53^6tofa4Cr+b--%2Q!Sz095s0tc?E<|5`Ve#lbQ4q(6Jd2wQ&1PsP|z6A zOwa?M$3QQD_&oe3s3ay${s`C<)CDvY#Fsi=2E7lu1mbh>&~QAX05t|Bf$j#422BGk z13e0Q4#XE7!!Zd*f#N{}Kv|$Eprs%_4}S*qC#X*;lnFEevH-lP( zdV*3xdqA&&&VarG{Rt|K$-Wk-1;`6Z25~c=IiN2=9dRNU1j+^#f$j%w20aTp3i<@} z4ak9$MIIfPH$_5pI?gwoKJqtPt`ULbl zs8o5}LxP%tx`KS5T+l4g&!F-ZaE=4D1r>nigVus}f?fu_54r?uQ4#eBN(SYD=73g% zwu26U-UYpKC+Y=s1#}ZsvJ(0bs41umh|h5yI6rhq(booG3trGFuGWm22>-Z zeU=9MFwRI+)$D3}u`SW9jhQF|iuoe42&mgu!H9MWu5?sTvy+1PJr!`%VR&+@EPxN^ zTmTO~$z>vGIQ2?azQY-fDlR=Gsytj+P!)uW22pXrX{xw2tHi}MyQ#W>GSmX%n2mwW ziyyJ;#bvid6`rA0T@&oMxL_9pa;Yrw`r4&cKSD1l{ytl)zHe`X97QlJc{z9<_987bzY9|6{&`vB4r8{kk~1^l!h62DXhlxV4d zE9gMVMd1OTqFMp*cPZey0g#S&P+)dZkd00RCBFs+T++b&=JnN?%SCFEUoNr9QgKN) zIP>5_@KkY$G-+BcYEBjR^c62&&nYkDRSL@8?Wp3ecj9#%B312E^$QDNx$r7gTJc@BfRhsT=;M5xMRB_#QiJr@>Q^j3}MYUEM zvz)&%=SqsxM%gKHHCP7ZI;Rql>(5ig#o|SEzK(uy6@hL96_-Z=42x618=%xSx zjgC@r+_Xn3Zt{K|>8Y`{7Z-MCI$Q`G;dz9K>aag)t~*aJZn-R8cS>g-g8n7Za|b!j zB-QmyGOU7fK8i7cFs7bK7U`MfNRm?W-A~x~$|!&v^#Qos9Dqk7#LRTpLY72^NK+(N zw%hO&`T@OK#Mmk>)lOB7TwB#u%D^@EC3-HAPcQBkEvmOf#Wklz#f=2$#k~cjpK@Cc zs<_;qs4lP4s*9cM6uH?-K*cv9p(+7qK#GQ5QA*+tK2UP^A^>+N0<85aKv095eK1;&zxy9SD^SHX^`y?{ zqZgY{eTue5_zkFMz#bF=z+-Br4s!{OEE!&aO9w_19A&Gx(lJ$B09gVqK(thG=Pya@ zX^2#v1Bq(8Q{RH#g?upKiV7lYDBu?!P!4UZ;B#HXr&=rNkwgW2cU}_Y9)qYi<546C z)mhy~y=|2=57~z@RCmtKXh}%hbsznzmy!~6=bWCbBt&G)xI^bRI?B%P;VoKaB8(K_ zB8tRPoxwj*B}+x$YG~Kc2hz&i1VA#(O(PhP`=X1AFVeCMuj?{6bajl;W!R?65Ub0O zt;_J1EE1QM&Tx=SW>@?}?}p3*O;ILkcBZ_>Fd z)x}nEJ%4&#^N+S)oLY4{)%FSs*Q&~C_Q>@u)2he(BljPtw5r>1yI8-4Y1K4;Nx8KL zQ|#|=nrKmRyAR1KcjurNH>elY!^ju%VGN8^s>gH#a>W-o{8UN7H&F_z>jAv4p^~_} z7+k*9o&0nwC2iJyeR-mij&)Oj*o`qrCKQ;Zhs|`I%q1OT6Fpvz>!_yaIHu{deYTG3 z9Ih>pTC=VS?(+{K2iliK;`(_~q=M(Psu$X*78A#X#AvO$Q%6b_w|!&4>~uRI_dKC$ zhQE5UMAg=>;+Nf1rH&nXb1__w$_fq?QBH&qccJbo&!;Fic^2$*B0-cS0 z_Ll}KUq^Ip&%-4Lig#RB^ME!=>aI)Ev4fHx(fuz`R}nwQk@`5dKqpc!(N5$Cw|>BS z2j)C@ZPCrmt==HDN>6YbpGhY4QJ@p)nD@OP&}%( z*0oFi8Dy%sr6dyL(IQ&sZ!QKhR43wWOYeKN^K_I{YK~jgFnpmumA4<&suegbOJ#E1 zbb4_)bx9@nb*)-I$d0R(#B~Sak`6QfsP^K5Mv~$pDJnPnljzk}t%&{)e~X?^)d9=F zO9D=Tm6<4mjxDMz$W-ORTT*l#)G99DFIheNmR4~I97&OH*D>HDRqVL9cMetDQbz)o zk?6U7rv&^29`x#!YNz-e#w1m5K_vmz=CV*#_D?q4goj?{7~6{*0#S9ZKgFGIXjPQI zzPKF`y_)#FB3J7CaKAsK$o=vp;XA^$^Ngx?xwzRD!*h*rsUz-oMpd0rcEI89XcgD< zk)j@2q*Z-7*m12psZ}rddoC9=W?Wq7STey)*Qok4%T}F`M(3`N5`BT3WZR+oBp|<| zV?eHLC@nmuyuMC(TzBTa)s^!P{yzQH86D=Up>{NFAJeMtz3pgnk89OBbODK(8zeEY zU;OpTTT(DVk$tOqjs*5@n)n$|cc{ef;3aTD@9@wqHQBx`Tr6_Ft zNC_}mPYzsr4iZ;41$5Q(QHu^r;um>Payxdwp;QGY(i9*qW35M5&Hd=ZaPTB3xS<2n zAs-IRXs^z8q4T9p7yBD<0K#HIGU9a&e;%cxDOXRy3|-M}nk(sLog+9K4}lmrN@Mk^ z$L`lEZeEFc;4ws0EjrpN?#94?+@t|1^Kc<~stQqG(l`U9A3x%+V{S;z2|XD-0s+@l zP~b#|f^=6q1+O6;M%qb1dQSyg^+m|fJ|%IVYe|=zcQ9S<=^?70hiR1;4I)`NQ&Ouo zRkOVcwrJIdJ?vs}rx3=)6~ZMh?ut$om&20!;76BKT}ZWSja!>h#hu3_Ah(RJ4pkL2 z5>$OOOxLhe1NW$gEm*gG3k|Pms1&7aYjBo;%bmKXHEgY<*}9AE*1&CC;gYT4hOWfQ ziAp(6cccv(>g$^2j-?22T0=>6EJ)nz6Y%mN1ugGZup1){O0FIT;96mT78-mSW@xFSW$IM*Y>j(ISx$2TE#cRFjfAx zA*{7-ZD3ey)z?5>S5vQVim-MX*4mqaX+)z*Fw+$)+i>W(R-2XXNu+Bn0}vRW^+k1{ z&iXLZ3fmN8RM!(KbV@(NQRHz%gt?pxkt@s->ZR)F%73blSB%7xp1DCC!jZhPVWb<) z|H6g=rVhuHK0Q>7B_4MFiEn1Cc%xvgMM7A%ud`IWKW|xacbf0yeK6Br0~!t=)!vpJ zI@RMkO^igTqmS0jvX4?3i!q`dag_b35d_jI(c5Zsk_>mcL=?xmhO=xWV z2PyQ)Nh{18n?I%?u4h_$@BV{h^F$Gli~dR7Epy{Wv5n(n3r5~kEZOY%md*di6D^or z5SLOoIWMCCU#I;CCH{BoG$(sRTzXDgZdP2Y*haC9tUCTrlKMYUx&PDYS#|m!)ad_- zV#c94adw!Lo{`6K!4qXc;YclOAwN4ei`$+QCV^7(rnWTR4p#z^P?CU_C?PFTfnuz%9w5$-!#>8~AU2cJ$5ME#_k!#(lGH@Zq4`z-&9bu7bH=9MTIK)ud{7uIIt;1X}aVODj-d#wW+uR%+>o(6$*vT|tak|ZVJ6(p^ zV5h5mNR}(eUFb60W?lj$Gh(*OZI1IgLtVYh;8+B2Y(5m8fPi7<+57~^txymB*nJg3LNt z>eFq8!b=q>2bY?2qnL)zHfIt1?On-bYSLh6vqp6C=G{<|9 zRm1$EtY^Q=6|#W&tBhg>4@SW{yUmw#7+Xv8)v^iBrY_SwHYOH^l4i4`P~U0JDT7>3 zK;aB?e@>yx9dgMP;`W-GX2iNGxXp7YjAw(Zgge&U0FCK3KQ|IQac*Wp$fJ48%wFfXg`@QJr!*DS4v!-&{Y#a|%q5dBI?=P#@dFQ6Y6g%zI$BCcDtp?R5<&!YjcQ5$kH>HeqUvdO`l?n+dL9_h7U{ySYxMtCl%y z`fLPunKOfCyBuv%sDo2xqgI|&jeKk3>~^q5sI1IJx-N2P$~c8_s(w~aX3i=wN%N|E zw)RG9%9mA#Le83^a&PW)?{_r_G1tu4?`rB!U>a_7$E3jsU(fuo1Qngky^~m=N-E8_ zOC-1w!I?<2IWd#}%ugm3x}w3AaGUo9$GXDJCnm3Vl|z~}y{_=V;2OKa+qg=bpP_D< zjUe-eE7lbT&d~^I3^(6E1Owqej7i-|54XABGgv!A--xd6Myh>Dl5MP zR~!Zn$JRqqBVS03JQ`3VXHg>w@V~7_j!j&~dVb!+0b!VrOv!Xr4l!p>pRG#gFyBLt z%S$r4VO(v|34+boi*7HA=|+xJW0~I=>=A~!H=@v0A;kQ7;(k{}a|s$B{l;}CDg~p& ze0vO?>Y97Yu+e&&XUD{1h_GIQ%^Ub%78Ml%A=dnIY9>408YkNYZRK^vxJS7vv~{&@ z>ulzVHy;mS)Z?=d%|LTSzGuBFtDS3j3~Sak#NES{;Z86gpAl<*WU!`dxy^%RkQ8ES z;2!M?$4F|5L1P}x%~bh0Q2L@&Ckw;TJmw+{4a`?1qwoIL8BMS<+Q)4MXR6WK%+&=W z&%qg@ig|i^tZRt5stDs2!zRJi!Mx@;1%4&^LmTsJ$FjE02u#G!IaxKTvd!IiRL34= z{yZ%c!!FuwE)Pp^l}7GEQLX0h<6{w|hPlU!s;BT4+v)7B` zJYLrwZu9k$vk_yYd1^dDw8i8$b(yaJ3l7dk5ljjN(yd;OtbAN*>MViUG>_F7jC_T1__`C^LtLS46w|g%TUU5%S7=);A*>qk<|pVBsuv`tc+x*8=jykjX|8(D$f}K(Y(1l-)cPl;9q0 z&uMORHBNC(3^t58jt7_d@T6GGvRjM1tuch|Fu%YVU7d^@x~ete%%!V&WvNrHP}FgE zjE-=3YgcePR&Ow-t-r2WnN2w%>Dg4L{J-C1aqhvY&7^3zCm=;*XHi8%nRq?nGMAO| z5^;%QV{+b(dQHcLgt2^M8{)yXM{INi}Jpj=prD8?K&y6!G#L zjOp?5AWm}*b5-dCW}Cwem#C+(=(}WY{!f=(8p1YQgyxA`2-5pB#T9sBic@$+Aw7h?ar z=LHnT{M6j(ifoHBQOQi?v&d_=s_Mc2`7BXC^LtHQ-?0tQ@LOqQ(9w$30-DUaj2*NgwBTs}8$-1Mmg zmt%4txna88p`3Tb29?DV$wWMZ$8*~7R=@_p7$AP(3y%uNJJ`F}VfZNra(IA@ z7u~m136Na~hhK8Se+@IX?8LKqE8KSoTMzm-fpvjnfpvhFLe=y8@O?nM#1ftWq<&9` z*3Sh}UjxYe-3g@q93F%dUlD9C_$?kYQ2z`NzvP79Cvpf7k72_H;i&=fceln@fsCIo zFf(5rL_UwFI+Xd;mi|)(xfNh($mPWT5uOAwe1Bja;Inw-M4SRd@xwa;@rGA;W6|RS z5dQuXegjVoX#W<7pTonS1G0Qi0a^c>fHA;TLB^JfQor1bVlm{>0rEWP@bhH&Waw8* zebbNc4YR(Jf%w@pyfd&7us$#jcpXj3e7*^c2EObtwoH=nInccTd3u2S3}h~$%=V;x zD2Vyx4x@~RE0Pi00`cdnCm02+4t*tHec*41AQt!y5I+ls?*LW;ZUi#EH9-6Z5Rnkv`u4RDS1Tsvv9Zk(PL9Rqg`v$>>1(yhN z;UwB83v!)a%9(;(z?X7AL9Q=Mxt$=_2ButJu#RAPL9P@`yHk*Zj`DYCP$JhaCY}}K z0>_k(338QW%FhcvBe+v=o8TtFM+8?1E*G37I8AVZV7}lzf?UU$>2V<{B9~w$b`ne! zY$C|DnrW{l$aS76hY51wXv)7}vLJGyE8-d9I@ZLs zf?O1v@_fPBf(3$O1ycow3HB81CfG`_nP6=}E>+I>OAB%la?1RWiOBWJiC+nF)pN@7 z&V}=&$gc?=7ThDqh1lu8L69r8Q(i2{xr#F9G-9FP7{P485rV@72MKZsc!ujB*iNv8 zAV1ckoeP)|xgb5Uq9E6jr|cHwI`ou(!1y9BZ%@-f=>uOEcl?{LP0J%NB?Pp+@*ms7r-WF3Z@8hcL(aZ zXdSVuU@Jkc_Dy{qLGGAAxvU^})}YL0>9hxoPNRl$!1xknG}ZwS6BxL1&S3(>w& zaGl^1!G(g81PcW-1k(ij333A=#&?$>Hx8p5BN#1MQIMOO(C!ut68r(zQ`B>l6yiSw zKM_1G$gNjs-zUiZRw!>3+$6X{kUO-{K0|P-V2&X7WutwF;6TC7f*l0o1>*#x1S<=M z33>#7!F3?x<>H6Li-Npfr2L-X+k#vyk@|gt+Xc4@t`_7zNc5W{$W5jw=LzNrCJPP` z^a^$sY$3=^b{M{vV3c5K!EnJpalt}Au82(JW+Oyy+e17f$b}&(zb42JXDL4|_@v-t zf|~`G3oaF$Cpb$mPcTPtq+qHb7pi1BJp?-mCJHtZl-F*Zl|<%_NDRkCFNwS`BmRWz zb0YUgB3=;W#z~a9IyRB}qY)1Xa$7aZ+Xc4@t`_93ZM4r3Aj&>LZudsH zi(p5=rh?q_jrQt-RRl{4au++=Z@M*d6>-X!1-aQC<&%OZ1P=?!o8r!=M3#jgoDYlq zpx{Emxq{OKxql(!&lb!OOcvy}hO~PHxl1JF7J}Sel5!2fs)D5ixxFOqzvCjC$ek{U zR|PK#o)YA?m9)Pi$SpQ0KPkv9H7P$NxLWXj!Nr0_f@;T3_-BipAvj2|pI}EpZY<3B z8wth;RuQZy7$V5+is^p?Hwr}VT1>nscuw#=LGFu8`%8k{Rhlxtb|P*STq($1Y^a|l zI8AVZAa|*zeS{$2nWN0DkBQt2o0uTjQn0QdH_@g&QZPdB7H)c|=T6?lYl2qTp&0{uuw2hFk3J~ zaF8JH`|;=OD0r7(Bf%KK+Je;u<--c6EOg`iQ|`z4TmUZ4tAdvVPYRw8JS=!n@F~G3 z1RoZBP;i0Z9Kn3STtU2~tkT7+_6og%odxl7vC{LsNaim_Fj|oBA5zcf4MYqxg#d+v z9@W@H@J_)H!Q-2?eUIQ8!9>9lo3#DvMvWf{9u<62aFyUZ!SR9_f&&DT1e*$$7QD4V z$A3|9hu~zvEWx`4I}2W2ufx40SSUD5u$^G6U=_h2!7m@t;Xf8UCb(a4yWm>EMS_`v z0|Z+Ma>X9D!?AT5xu_rI^@8^aP7{n0{0SY0emex02~HGD7X11l?f04B+kyuKcM7f( zTr4<7Fj=sNU}M3Gg295nuGQ&W5j-sTwBSm?xq?}Oy#*T!Ru_yA{0R@(SkBJ`-xfS5 z_@v-E!O4Qzg53oh3GyXpRo@tJ#C?L>1=k9C1*-`L3tnEW!<`U(L2!;>fnd5|U%^Dd zMuLB=(((L5@Lj=|1RoV#EI3v09zma=SFp8UeZern?^a4V1t$oO6dWMfQSi_M+JC#? z3PCP>$NKUKb{A|T*g)`3!4Sc3R_Jgi1fLZw5^OCPEm%RYgy5UYb@-}1Rul{t{B4>J_p#tGmzD<$4iM}km?YRy#2mquIOh9770!g%n=+VI8rcGaDZSR!5)HL1rr2Y3N{sNBv?x@ zO0cqE1;H>ukDyb~5d7Vg`W5_9@Vekd!E=J23Ud2dRlkBq1#iDk+AI3qf;$Db3EqC+ zv{LlT1m_CQ6f6>)B$y*ON^qoLs^Boe!Gb*my9y==wij$F*hnx&Fj}y(U|dWhUrFhQ`TU{k?Hg0%#r1S<tn)t*-SU6=Sj6+8oE_>(|}KPvjYf*S?b0qM5}NI$E- zCyCvvzdj-d)(^w6ei$xV?2&>1Ro--b0?BWHacrt|(P3Pa^LYJjc}(5cLD#(_Ha~41W829daqhA%o|b_e9Tchj}eQJ-_i? zBKm0Pc&?|O-}(Nj@_ESM_q}lv51)A!3D57BzZHLeqr8*(L6|(0_Yv|a|8?;9iJtF@ ztbn~5;*UUB?kEaS$I$@31^g}jg#f+G>&m|z{#!op1^8bM;F}?R%jd-aecgbt2?6o{ z8Q>EZpq~)H*9qW*1LAosAg%oYK8FH$=Ecg7Jd=e6M+&}~OV68(Pu5b>C#9tnj>;c9 z5yH^^g{|=2+L-KId^I(Jijg^e6!z+07@v~TxS9F{u3N8`eeeZb4}8ScluV~y{Zm?{ z<>2Efe(~0=f0L9>ojNscm6DP+a%9SgG<;H(o|c!Eo?SS((|oF zXP{-Dv3Z^U($F=nfSD^OmS*E7DJiN9$X7wezg3WC={Xr``Tx7I#AoD=yglzpO^V0b zG$o}V;FH5{eg2Djj%PjJ9?5@RKsyGzQaf51vo%SL?W{I#l9Q2}RX8doBR_v^exM;f ze|&BsKbk9Uu_NhdMPh4`8tG^U46;@1bp!er7rPY~2lX#3o(UDE+uv%7=L^m$X$1ut z`GqO@g}IbC1f=^S@Aem`V#&7JflT;ELh%s#O6p-H7Q zA|oq17bBuDeUuu9W5!O%P&R&A41G?{|0>;TS`da|Xn#^OVPoepJO~~(^%^>zW3Vrn zj{5I?tyR&AGQ5=}O-VJ8S@{U24J@%C!x?21*k4pS~F<>W8W!I MkuN++&yJ)JS120t=>Px# literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/pipe.cpp b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/pipe.cpp new file mode 100644 index 0000000..a5f0d9f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/pipe.cpp @@ -0,0 +1,354 @@ +/***************************************************************************** + +$Id$ + +File: pipe.cpp +Date: 30May07 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#include "project.h" + + +#ifdef OS_UNIX +// THIS ENTIRE FILE IS ONLY COMPILED ON UNIX-LIKE SYSTEMS. + +/****************************** +PipeDescriptor::PipeDescriptor +******************************/ + +PipeDescriptor::PipeDescriptor (int fd, pid_t subpid, EventMachine_t *parent_em): + EventableDescriptor (fd, parent_em), + bReadAttemptedAfterClose (false), + OutboundDataSize (0), + SubprocessPid (subpid) +{ + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + #endif + #ifdef HAVE_KQUEUE + MyEventMachine->ArmKqueueReader (this); + #endif +} + + +/******************************* +PipeDescriptor::~PipeDescriptor +*******************************/ + +PipeDescriptor::~PipeDescriptor() NO_EXCEPT_FALSE +{ + // Run down any stranded outbound data. + for (size_t i=0; i < OutboundPages.size(); i++) + OutboundPages[i].Free(); + + /* As a virtual destructor, we come here before the base-class + * destructor that closes our file-descriptor. + * We have to make sure the subprocess goes down (if it's not + * already down) and we have to reap the zombie. + * + * This implementation is PROVISIONAL and will surely be improved. + * The intention here is that we never block, hence the highly + * undesirable sleeps. But if we can't reap the subprocess even + * after sending it SIGKILL, then something is wrong and we + * throw a fatal exception, which is also not something we should + * be doing. + * + * Eventually the right thing to do will be to have the reactor + * core respond to SIGCHLD by chaining a handler on top of the + * one Ruby may have installed, and dealing with a list of dead + * children that are pending cleanup. + * + * Since we want to have a signal processor integrated into the + * client-visible API, let's wait until that is done before cleaning + * this up. + * + * Added a very ugly hack to support passing the subprocess's exit + * status to the user. It only makes logical sense for user code to access + * the subprocess exit status in the unbind callback. But unbind is called + * back during the EventableDescriptor destructor. So by that time there's + * no way to call back this object through an object binding, because it's + * already been cleaned up. We might have added a parameter to the unbind + * callback, but that would probably break a huge amount of existing code. + * So the hack-solution is to define an instance variable in the EventMachine + * object and stick the exit status in there, where it can easily be accessed + * with an accessor visible to user code. + * User code should ONLY access the exit status from within the unbind callback. + * Otherwise there's no guarantee it'll be valid. + * This hack won't make it impossible to run multiple EventMachines in a single + * process, but it will make it impossible to reliably nest unbind calls + * within other unbind calls. (Not sure if that's even possible.) + */ + + assert (MyEventMachine); + + /* Another hack to make the SubprocessPid available to get_subprocess_status */ + MyEventMachine->SubprocessPid = SubprocessPid; + + /* 01Mar09: Updated to use a small nanosleep in a loop. When nanosleep is interrupted by SIGCHLD, + * it resumes the system call after processing the signal (resulting in unnecessary latency). + * Calling nanosleep in a loop avoids this problem. + */ + struct timespec req = {0, 50000000}; // 0.05s + int n; + + // wait 0.5s for the process to die + for (n=0; n<10; n++) { + if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return; + nanosleep (&req, NULL); + } + + // send SIGTERM and wait another 1s + kill (SubprocessPid, SIGTERM); + for (n=0; n<20; n++) { + nanosleep (&req, NULL); + if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return; + } + + // send SIGKILL and wait another 5s + kill (SubprocessPid, SIGKILL); + for (n=0; n<100; n++) { + nanosleep (&req, NULL); + if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return; + } + + // still not dead, give up! + throw std::runtime_error ("unable to reap subprocess"); +} + + + +/******************** +PipeDescriptor::Read +********************/ + +void PipeDescriptor::Read() +{ + int sd = GetSocket(); + if (sd == INVALID_SOCKET) { + assert (!bReadAttemptedAfterClose); + bReadAttemptedAfterClose = true; + return; + } + + LastActivity = MyEventMachine->GetCurrentLoopTime(); + + int total_bytes_read = 0; + char readbuffer [16 * 1024]; + + for (int i=0; i < 10; i++) { + // Don't read just one buffer and then move on. This is faster + // if there is a lot of incoming. + // But don't read indefinitely. Give other sockets a chance to run. + // NOTICE, we're reading one less than the buffer size. + // That's so we can put a guard byte at the end of what we send + // to user code. + // Use read instead of recv, which on Linux gives a "socket operation + // on nonsocket" error. + + + int r = read (sd, readbuffer, sizeof(readbuffer) - 1); + //cerr << ""; + + if (r > 0) { + total_bytes_read += r; + + // Add a null-terminator at the the end of the buffer + // that we will send to the callback. + // DO NOT EVER CHANGE THIS. We want to explicitly allow users + // to be able to depend on this behavior, so they will have + // the option to do some things faster. Additionally it's + // a security guard against buffer overflows. + readbuffer [r] = 0; + _GenericInboundDispatch(readbuffer, r); + } + else if (r == 0) { + break; + } + else { + // Basically a would-block, meaning we've read everything there is to read. + break; + } + + } + + + if (total_bytes_read == 0) { + // If we read no data on a socket that selected readable, + // it generally means the other end closed the connection gracefully. + ScheduleClose (false); + //bCloseNow = true; + } + +} + +/********************* +PipeDescriptor::Write +*********************/ + +void PipeDescriptor::Write() +{ + int sd = GetSocket(); + assert (sd != INVALID_SOCKET); + + LastActivity = MyEventMachine->GetCurrentLoopTime(); + char output_buffer [16 * 1024]; + size_t nbytes = 0; + + while ((OutboundPages.size() > 0) && (nbytes < sizeof(output_buffer))) { + OutboundPage *op = &(OutboundPages[0]); + if ((nbytes + op->Length - op->Offset) < sizeof (output_buffer)) { + memcpy (output_buffer + nbytes, op->Buffer + op->Offset, op->Length - op->Offset); + nbytes += (op->Length - op->Offset); + op->Free(); + OutboundPages.pop_front(); + } + else { + int len = sizeof(output_buffer) - nbytes; + memcpy (output_buffer + nbytes, op->Buffer + op->Offset, len); + op->Offset += len; + nbytes += len; + } + } + + // We should never have gotten here if there were no data to write, + // so assert that as a sanity check. + // Don't bother to make sure nbytes is less than output_buffer because + // if it were we probably would have crashed already. + assert (nbytes > 0); + + assert (GetSocket() != INVALID_SOCKET); + int bytes_written = write (GetSocket(), output_buffer, nbytes); +#ifdef OS_WIN32 + int e = WSAGetLastError(); +#else + int e = errno; +#endif + + if (bytes_written > 0) { + OutboundDataSize -= bytes_written; + if ((size_t)bytes_written < nbytes) { + int len = nbytes - bytes_written; + char *buffer = (char*) malloc (len + 1); + if (!buffer) + throw std::runtime_error ("bad alloc throwing back data"); + memcpy (buffer, output_buffer + bytes_written, len); + buffer [len] = 0; + OutboundPages.push_front (OutboundPage (buffer, len)); + } + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + if (SelectForWrite()) + EpollEvent.events |= EPOLLOUT; + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + } + else { + #ifdef OS_UNIX + if ((e != EINPROGRESS) && (e != EWOULDBLOCK) && (e != EINTR)) + #endif + #ifdef OS_WIN32 + if ((e != WSAEINPROGRESS) && (e != WSAEWOULDBLOCK)) + #endif + Close(); + } +} + + +/************************* +PipeDescriptor::Heartbeat +*************************/ + +void PipeDescriptor::Heartbeat() +{ + // If an inactivity timeout is defined, then check for it. + if (InactivityTimeout && ((MyEventMachine->GetCurrentLoopTime() - LastActivity) >= InactivityTimeout)) + ScheduleClose (false); + //bCloseNow = true; +} + + +/***************************** +PipeDescriptor::SelectForRead +*****************************/ + +bool PipeDescriptor::SelectForRead() +{ + /* Pipe descriptors, being local by definition, don't have + * a pending state, so this is simpler than for the + * ConnectionDescriptor object. + */ + return bPaused ? false : true; +} + +/****************************** +PipeDescriptor::SelectForWrite +******************************/ + +bool PipeDescriptor::SelectForWrite() +{ + /* Pipe descriptors, being local by definition, don't have + * a pending state, so this is simpler than for the + * ConnectionDescriptor object. + */ + return (GetOutboundDataSize() > 0) && !bPaused ? true : false; +} + + + + +/******************************** +PipeDescriptor::SendOutboundData +********************************/ + +int PipeDescriptor::SendOutboundData (const char *data, unsigned long length) +{ + //if (bCloseNow || bCloseAfterWriting) + if (IsCloseScheduled()) + return 0; + + if (!data && (length > 0)) + throw std::runtime_error ("bad outbound data"); + char *buffer = (char *) malloc (length + 1); + if (!buffer) + throw std::runtime_error ("no allocation for outbound data"); + memcpy (buffer, data, length); + buffer [length] = 0; + OutboundPages.push_back (OutboundPage (buffer, length)); + OutboundDataSize += length; + #ifdef HAVE_EPOLL + EpollEvent.events = (EPOLLIN | EPOLLOUT); + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + return length; +} + +/******************************** +PipeDescriptor::GetSubprocessPid +********************************/ + +bool PipeDescriptor::GetSubprocessPid (pid_t *pid) +{ + bool ok = false; + if (pid && (SubprocessPid > 0)) { + *pid = SubprocessPid; + ok = true; + } + return ok; +} + + +#endif // OS_UNIX + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/pipe.o b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/pipe.o new file mode 100644 index 0000000000000000000000000000000000000000..59aeb4293b69db6108c825cbb3313e27be7c4cfc GIT binary patch literal 723248 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 Av-lWwuoe@fVSmZNr!`Z%ejKfwF+&J8T@2 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

  • 1#86rXr)R{ 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

    $5W%F&B93d;UY=JG4BjislyUv!$5pq}+ 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

    vc^i#v@ZqZGJ18JDZJ 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 S{yElD38tWvDJWjAR{sFtS&$(B literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ssl.cpp b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ssl.cpp new file mode 100644 index 0000000..13f5f16 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ssl.cpp @@ -0,0 +1,615 @@ +/***************************************************************************** + +$Id$ + +File: ssl.cpp +Date: 30Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#ifdef WITH_SSL + +#include "project.h" + + +bool SslContext_t::bLibraryInitialized = false; + + + +static void InitializeDefaultCredentials(); +static EVP_PKEY *DefaultPrivateKey = NULL; +static X509 *DefaultCertificate = NULL; + +static char PrivateMaterials[] = { +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXAIBAAKBgQDCYYhcw6cGRbhBVShKmbWm7UVsEoBnUf0cCh8AX+MKhMxwVDWV\n" +"Igdskntn3cSJjRtmgVJHIK0lpb/FYHQB93Ohpd9/Z18pDmovfFF9nDbFF0t39hJ/\n" +"AqSzFB3GiVPoFFZJEE1vJqh+3jzsSF5K56bZ6azz38VlZgXeSozNW5bXkQIDAQAB\n" +"AoGALA89gIFcr6BIBo8N5fL3aNHpZXjAICtGav+kTUpuxSiaym9cAeTHuAVv8Xgk\n" +"H2Wbq11uz+6JMLpkQJH/WZ7EV59DPOicXrp0Imr73F3EXBfR7t2EQDYHPMthOA1D\n" +"I9EtCzvV608Ze90hiJ7E3guGrGppZfJ+eUWCPgy8CZH1vRECQQDv67rwV/oU1aDo\n" +"6/+d5nqjeW6mWkGqTnUU96jXap8EIw6B+0cUKskwx6mHJv+tEMM2748ZY7b0yBlg\n" +"w4KDghbFAkEAz2h8PjSJG55LwqmXih1RONSgdN9hjB12LwXL1CaDh7/lkEhq0PlK\n" +"PCAUwQSdM17Sl0Xxm2CZiekTSlwmHrtqXQJAF3+8QJwtV2sRJp8u2zVe37IeH1cJ\n" +"xXeHyjTzqZ2803fnjN2iuZvzNr7noOA1/Kp+pFvUZUU5/0G2Ep8zolPUjQJAFA7k\n" +"xRdLkzIx3XeNQjwnmLlncyYPRv+qaE3FMpUu7zftuZBnVCJnvXzUxP3vPgKTlzGa\n" +"dg5XivDRfsV+okY5uQJBAMV4FesUuLQVEKb6lMs7rzZwpeGQhFDRfywJzfom2TLn\n" +"2RdJQQ3dcgnhdVDgt5o1qkmsqQh8uJrJ9SdyLIaZQIc=\n" +"-----END RSA PRIVATE KEY-----\n" +"-----BEGIN CERTIFICATE-----\n" +"MIID6TCCA1KgAwIBAgIJANm4W/Tzs+s+MA0GCSqGSIb3DQEBBQUAMIGqMQswCQYD\n" +"VQQGEwJVUzERMA8GA1UECBMITmV3IFlvcmsxETAPBgNVBAcTCE5ldyBZb3JrMRYw\n" +"FAYDVQQKEw1TdGVhbWhlYXQubmV0MRQwEgYDVQQLEwtFbmdpbmVlcmluZzEdMBsG\n" +"A1UEAxMUb3BlbmNhLnN0ZWFtaGVhdC5uZXQxKDAmBgkqhkiG9w0BCQEWGWVuZ2lu\n" +"ZWVyaW5nQHN0ZWFtaGVhdC5uZXQwHhcNMDYwNTA1MTcwNjAzWhcNMjQwMjIwMTcw\n" +"NjAzWjCBqjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQH\n" +"EwhOZXcgWW9yazEWMBQGA1UEChMNU3RlYW1oZWF0Lm5ldDEUMBIGA1UECxMLRW5n\n" +"aW5lZXJpbmcxHTAbBgNVBAMTFG9wZW5jYS5zdGVhbWhlYXQubmV0MSgwJgYJKoZI\n" +"hvcNAQkBFhllbmdpbmVlcmluZ0BzdGVhbWhlYXQubmV0MIGfMA0GCSqGSIb3DQEB\n" +"AQUAA4GNADCBiQKBgQDCYYhcw6cGRbhBVShKmbWm7UVsEoBnUf0cCh8AX+MKhMxw\n" +"VDWVIgdskntn3cSJjRtmgVJHIK0lpb/FYHQB93Ohpd9/Z18pDmovfFF9nDbFF0t3\n" +"9hJ/AqSzFB3GiVPoFFZJEE1vJqh+3jzsSF5K56bZ6azz38VlZgXeSozNW5bXkQID\n" +"AQABo4IBEzCCAQ8wHQYDVR0OBBYEFPJvPd1Fcmd8o/Tm88r+NjYPICCkMIHfBgNV\n" +"HSMEgdcwgdSAFPJvPd1Fcmd8o/Tm88r+NjYPICCkoYGwpIGtMIGqMQswCQYDVQQG\n" +"EwJVUzERMA8GA1UECBMITmV3IFlvcmsxETAPBgNVBAcTCE5ldyBZb3JrMRYwFAYD\n" +"VQQKEw1TdGVhbWhlYXQubmV0MRQwEgYDVQQLEwtFbmdpbmVlcmluZzEdMBsGA1UE\n" +"AxMUb3BlbmNhLnN0ZWFtaGVhdC5uZXQxKDAmBgkqhkiG9w0BCQEWGWVuZ2luZWVy\n" +"aW5nQHN0ZWFtaGVhdC5uZXSCCQDZuFv087PrPjAMBgNVHRMEBTADAQH/MA0GCSqG\n" +"SIb3DQEBBQUAA4GBAC1CXey/4UoLgJiwcEMDxOvW74plks23090iziFIlGgcIhk0\n" +"Df6hTAs7H3MWww62ddvR8l07AWfSzSP5L6mDsbvq7EmQsmPODwb6C+i2aF3EDL8j\n" +"uw73m4YIGI0Zw2XdBpiOGkx2H56Kya6mJJe/5XORZedh1wpI7zki01tHYbcy\n" +"-----END CERTIFICATE-----\n"}; + +/* These private materials were made with: + * openssl req -new -x509 -keyout cakey.pem -out cacert.pem -nodes -days 6500 + * TODO: We need a full-blown capability to work with user-supplied + * keypairs and properly-signed certificates. + */ + + +/***************** +builtin_passwd_cb +*****************/ + +extern "C" int builtin_passwd_cb (char *buf UNUSED, int bufsize UNUSED, int rwflag UNUSED, void *userdata UNUSED) +{ + strcpy (buf, "kittycat"); + return 8; +} + +/**************************** +InitializeDefaultCredentials +****************************/ + +static void InitializeDefaultCredentials() +{ + BIO *bio = BIO_new_mem_buf (PrivateMaterials, -1); + assert (bio); + + if (DefaultPrivateKey) { + // we may come here in a restart. + EVP_PKEY_free (DefaultPrivateKey); + DefaultPrivateKey = NULL; + } + PEM_read_bio_PrivateKey (bio, &DefaultPrivateKey, builtin_passwd_cb, 0); + + if (DefaultCertificate) { + // we may come here in a restart. + X509_free (DefaultCertificate); + DefaultCertificate = NULL; + } + PEM_read_bio_X509 (bio, &DefaultCertificate, NULL, 0); + + BIO_free (bio); +} + + + +/************************** +SslContext_t::SslContext_t +**************************/ + +SslContext_t::SslContext_t (bool is_server, const string &privkeyfile, const string &certchainfile, const string &cipherlist, const string &ecdh_curve, const string &dhparam, int ssl_version) : + bIsServer (is_server), + pCtx (NULL), + PrivateKey (NULL), + Certificate (NULL) +{ + /* TODO: the usage of the specified private-key and cert-chain filenames only applies to + * client-side connections at this point. Server connections currently use the default materials. + * That needs to be fixed asap. + * Also, in this implementation, server-side connections use statically defined X-509 defaults. + * One thing I'm really not clear on is whether or not you have to explicitly free X509 and EVP_PKEY + * objects when we call our destructor, or whether just calling SSL_CTX_free is enough. + */ + + if (!bLibraryInitialized) { + bLibraryInitialized = true; + SSL_library_init(); + OpenSSL_add_ssl_algorithms(); + OpenSSL_add_all_algorithms(); + SSL_load_error_strings(); + ERR_load_crypto_strings(); + + InitializeDefaultCredentials(); + } + + pCtx = SSL_CTX_new (bIsServer ? SSLv23_server_method() : SSLv23_client_method()); + if (!pCtx) + throw std::runtime_error ("no SSL context"); + + SSL_CTX_set_options (pCtx, SSL_OP_ALL); + + #ifdef SSL_CTRL_CLEAR_OPTIONS + SSL_CTX_clear_options (pCtx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1); + # ifdef SSL_OP_NO_TLSv1_1 + SSL_CTX_clear_options (pCtx, SSL_OP_NO_TLSv1_1); + # endif + # ifdef SSL_OP_NO_TLSv1_2 + SSL_CTX_clear_options (pCtx, SSL_OP_NO_TLSv1_2); + # endif + #endif + + if (!(ssl_version & EM_PROTO_SSLv2)) + SSL_CTX_set_options (pCtx, SSL_OP_NO_SSLv2); + + if (!(ssl_version & EM_PROTO_SSLv3)) + SSL_CTX_set_options (pCtx, SSL_OP_NO_SSLv3); + + if (!(ssl_version & EM_PROTO_TLSv1)) + SSL_CTX_set_options (pCtx, SSL_OP_NO_TLSv1); + + #ifdef SSL_OP_NO_TLSv1_1 + if (!(ssl_version & EM_PROTO_TLSv1_1)) + SSL_CTX_set_options (pCtx, SSL_OP_NO_TLSv1_1); + #endif + + #ifdef SSL_OP_NO_TLSv1_2 + if (!(ssl_version & EM_PROTO_TLSv1_2)) + SSL_CTX_set_options (pCtx, SSL_OP_NO_TLSv1_2); + #endif + + #ifdef SSL_MODE_RELEASE_BUFFERS + SSL_CTX_set_mode (pCtx, SSL_MODE_RELEASE_BUFFERS); + #endif + + if (bIsServer) { + + // The SSL_CTX calls here do NOT allocate memory. + int e; + if (privkeyfile.length() > 0) + e = SSL_CTX_use_PrivateKey_file (pCtx, privkeyfile.c_str(), SSL_FILETYPE_PEM); + else + e = SSL_CTX_use_PrivateKey (pCtx, DefaultPrivateKey); + if (e <= 0) ERR_print_errors_fp(stderr); + assert (e > 0); + + if (certchainfile.length() > 0) + e = SSL_CTX_use_certificate_chain_file (pCtx, certchainfile.c_str()); + else + e = SSL_CTX_use_certificate (pCtx, DefaultCertificate); + if (e <= 0) ERR_print_errors_fp(stderr); + assert (e > 0); + + if (dhparam.length() > 0) { + DH *dh; + BIO *bio; + + bio = BIO_new_file(dhparam.c_str(), "r"); + if (bio == NULL) { + char buf [500]; + snprintf (buf, sizeof(buf)-1, "dhparam: BIO_new_file(%s) failed", dhparam.c_str()); + throw std::runtime_error (buf); + } + + dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); + + if (dh == NULL) { + BIO_free(bio); + char buf [500]; + snprintf (buf, sizeof(buf)-1, "dhparam: PEM_read_bio_DHparams(%s) failed", dhparam.c_str()); + throw new std::runtime_error(buf); + } + + SSL_CTX_set_tmp_dh(pCtx, dh); + + DH_free(dh); + BIO_free(bio); + } + + if (ecdh_curve.length() > 0) { + #if OPENSSL_VERSION_NUMBER >= 0x0090800fL && !defined(OPENSSL_NO_ECDH) + int nid; + EC_KEY *ecdh; + + nid = OBJ_sn2nid((const char *) ecdh_curve.c_str()); + if (nid == 0) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "ecdh_curve: Unknown curve name: %s", ecdh_curve.c_str()); + throw std::runtime_error (buf); + } + + ecdh = EC_KEY_new_by_curve_name(nid); + if (ecdh == NULL) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "ecdh_curve: Unable to create: %s", ecdh_curve.c_str()); + throw std::runtime_error (buf); + } + + SSL_CTX_set_options(pCtx, SSL_OP_SINGLE_ECDH_USE); + + SSL_CTX_set_tmp_ecdh(pCtx, ecdh); + + EC_KEY_free(ecdh); + #else + throw std::runtime_error ("No openssl ECDH support"); + #endif + } + } + + if (cipherlist.length() > 0) + SSL_CTX_set_cipher_list (pCtx, cipherlist.c_str()); + else + SSL_CTX_set_cipher_list (pCtx, "ALL:!ADH:!LOW:!EXP:!DES-CBC3-SHA:@STRENGTH"); + + if (bIsServer) { + SSL_CTX_sess_set_cache_size (pCtx, 128); + SSL_CTX_set_session_id_context (pCtx, (unsigned char*)"eventmachine", 12); + } + else { + int e; + if (privkeyfile.length() > 0) { + e = SSL_CTX_use_PrivateKey_file (pCtx, privkeyfile.c_str(), SSL_FILETYPE_PEM); + if (e <= 0) ERR_print_errors_fp(stderr); + assert (e > 0); + } + if (certchainfile.length() > 0) { + e = SSL_CTX_use_certificate_chain_file (pCtx, certchainfile.c_str()); + if (e <= 0) ERR_print_errors_fp(stderr); + assert (e > 0); + } + } +} + + + +/*************************** +SslContext_t::~SslContext_t +***************************/ + +SslContext_t::~SslContext_t() +{ + if (pCtx) + SSL_CTX_free (pCtx); + if (PrivateKey) + EVP_PKEY_free (PrivateKey); + if (Certificate) + X509_free (Certificate); +} + + + +/****************** +SslBox_t::SslBox_t +******************/ + +SslBox_t::SslBox_t (bool is_server, const string &privkeyfile, const string &certchainfile, bool verify_peer, bool fail_if_no_peer_cert, const string &snihostname, const string &cipherlist, const string &ecdh_curve, const string &dhparam, int ssl_version, const uintptr_t binding): + bIsServer (is_server), + bHandshakeCompleted (false), + bVerifyPeer (verify_peer), + bFailIfNoPeerCert (fail_if_no_peer_cert), + pSSL (NULL), + pbioRead (NULL), + pbioWrite (NULL) +{ + /* TODO someday: make it possible to re-use SSL contexts so we don't have to create + * a new one every time we come here. + */ + + Context = new SslContext_t (bIsServer, privkeyfile, certchainfile, cipherlist, ecdh_curve, dhparam, ssl_version); + assert (Context); + + pbioRead = BIO_new (BIO_s_mem()); + assert (pbioRead); + + pbioWrite = BIO_new (BIO_s_mem()); + assert (pbioWrite); + + pSSL = SSL_new (Context->pCtx); + assert (pSSL); + + if (snihostname.length() > 0) { + SSL_set_tlsext_host_name (pSSL, snihostname.c_str()); + } + + SSL_set_bio (pSSL, pbioRead, pbioWrite); + + // Store a pointer to the binding signature in the SSL object so we can retrieve it later + SSL_set_ex_data(pSSL, 0, (void*) binding); + + if (bVerifyPeer) { + int mode = SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE; + if (bFailIfNoPeerCert) + mode = mode | SSL_VERIFY_FAIL_IF_NO_PEER_CERT; + SSL_set_verify(pSSL, mode, ssl_verify_wrapper); + } + + if (!bIsServer) + SSL_connect (pSSL); +} + + + +/******************* +SslBox_t::~SslBox_t +*******************/ + +SslBox_t::~SslBox_t() +{ + // Freeing pSSL will also free the associated BIOs, so DON'T free them separately. + if (pSSL) { + if (SSL_get_shutdown (pSSL) & SSL_RECEIVED_SHUTDOWN) + SSL_shutdown (pSSL); + else + SSL_clear (pSSL); + SSL_free (pSSL); + } + + delete Context; +} + + + +/*********************** +SslBox_t::PutCiphertext +***********************/ + +bool SslBox_t::PutCiphertext (const char *buf, int bufsize) +{ + assert (buf && (bufsize > 0)); + + assert (pbioRead); + int n = BIO_write (pbioRead, buf, bufsize); + + return (n == bufsize) ? true : false; +} + + +/********************** +SslBox_t::GetPlaintext +**********************/ + +int SslBox_t::GetPlaintext (char *buf, int bufsize) +{ + if (!SSL_is_init_finished (pSSL)) { + int e = bIsServer ? SSL_accept (pSSL) : SSL_connect (pSSL); + if (e != 1) { + int er = SSL_get_error (pSSL, e); + if (er != SSL_ERROR_WANT_READ) { + // Return -1 for a nonfatal error, -2 for an error that should force the connection down. + return (er == SSL_ERROR_SSL) ? (-2) : (-1); + } + else + return 0; + } + bHandshakeCompleted = true; + // If handshake finished, FALL THROUGH and return the available plaintext. + } + + if (!SSL_is_init_finished (pSSL)) { + // We can get here if a browser abandons a handshake. + // The user can see a warning dialog and abort the connection. + //cerr << ""; + return 0; + } + + //cerr << "CIPH: " << SSL_get_cipher (pSSL) << endl; + + int n = SSL_read (pSSL, buf, bufsize); + if (n >= 0) { + return n; + } + else { + if (SSL_get_error (pSSL, n) == SSL_ERROR_WANT_READ) { + return 0; + } + else { + return -1; + } + } + + return 0; +} + + + +/************************** +SslBox_t::CanGetCiphertext +**************************/ + +bool SslBox_t::CanGetCiphertext() +{ + assert (pbioWrite); + return BIO_pending (pbioWrite) ? true : false; +} + + + +/*********************** +SslBox_t::GetCiphertext +***********************/ + +int SslBox_t::GetCiphertext (char *buf, int bufsize) +{ + assert (pbioWrite); + assert (buf && (bufsize > 0)); + + return BIO_read (pbioWrite, buf, bufsize); +} + + + +/********************** +SslBox_t::PutPlaintext +**********************/ + +int SslBox_t::PutPlaintext (const char *buf, int bufsize) +{ + // The caller will interpret the return value as the number of bytes written. + // WARNING WARNING WARNING, are there any situations in which a 0 or -1 return + // from SSL_write means we should immediately retry? The socket-machine loop + // will probably wait for a time-out cycle (perhaps a second) before re-trying. + // THIS WOULD CAUSE A PERCEPTIBLE DELAY! + + /* We internally queue any outbound plaintext that can't be dispatched + * because we're in the middle of a handshake or something. + * When we get called, try to send any queued data first, and then + * send the caller's data (or queue it). We may get called with no outbound + * data, which means we try to send the outbound queue and that's all. + * + * Return >0 if we wrote any data, 0 if we didn't, and <0 for a fatal error. + * Note that if we return 0, the connection is still considered live + * and we are signalling that we have accepted the outbound data (if any). + */ + + OutboundQ.Push (buf, bufsize); + + if (!SSL_is_init_finished (pSSL)) + return 0; + + bool fatal = false; + bool did_work = false; + int pending = BIO_pending(pbioWrite); + + while (OutboundQ.HasPages() && pending < SSLBOX_WRITE_BUFFER_SIZE) { + const char *page; + int length; + OutboundQ.Front (&page, &length); + assert (page && (length > 0)); + int n = SSL_write (pSSL, page, length); + pending = BIO_pending(pbioWrite); + + if (n > 0) { + did_work = true; + OutboundQ.PopFront(); + } + else { + int er = SSL_get_error (pSSL, n); + if ((er != SSL_ERROR_WANT_READ) && (er != SSL_ERROR_WANT_WRITE)) + fatal = true; + break; + } + } + + + if (did_work) + return 1; + else if (fatal) + return -1; + else + return 0; +} + +/********************** +SslBox_t::GetPeerCert +**********************/ + +X509 *SslBox_t::GetPeerCert() +{ + X509 *cert = NULL; + + if (pSSL) + cert = SSL_get_peer_certificate(pSSL); + + return cert; +} + +/********************** +SslBox_t::GetCipherBits +**********************/ + +int SslBox_t::GetCipherBits() +{ + int bits = -1; + if (pSSL) + SSL_get_cipher_bits(pSSL, &bits); + return bits; +} + +/********************** +SslBox_t::GetCipherName +**********************/ + +const char *SslBox_t::GetCipherName() +{ + if (pSSL) + return SSL_get_cipher_name(pSSL); + return NULL; +} + +/********************** +SslBox_t::GetCipherProtocol +**********************/ + +const char *SslBox_t::GetCipherProtocol() +{ + if (pSSL) + return SSL_get_cipher_version(pSSL); + return NULL; +} + +/********************** +SslBox_t::GetSNIHostname +**********************/ + +const char *SslBox_t::GetSNIHostname() +{ + #ifdef TLSEXT_NAMETYPE_host_name + if (pSSL) + return SSL_get_servername (pSSL, TLSEXT_NAMETYPE_host_name); + #endif + return NULL; +} + +/****************** +ssl_verify_wrapper +*******************/ + +extern "C" int ssl_verify_wrapper(int preverify_ok UNUSED, X509_STORE_CTX *ctx) +{ + uintptr_t binding; + X509 *cert; + SSL *ssl; + BUF_MEM *buf; + BIO *out; + int result; + + cert = X509_STORE_CTX_get_current_cert(ctx); + ssl = (SSL*) X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); + binding = (uintptr_t) SSL_get_ex_data(ssl, 0); + + out = BIO_new(BIO_s_mem()); + PEM_write_bio_X509(out, cert); + BIO_write(out, "\0", 1); + BIO_get_mem_ptr(out, &buf); + + ConnectionDescriptor *cd = dynamic_cast (Bindable_t::GetObject(binding)); + result = (cd->VerifySslPeer(buf->data) == true ? 1 : 0); + BIO_free(out); + + return result; +} + +#endif // WITH_SSL + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ssl.h b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ssl.h new file mode 100644 index 0000000..d8524ed --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ssl.h @@ -0,0 +1,103 @@ +/***************************************************************************** + +$Id$ + +File: ssl.h +Date: 30Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#ifndef __SslBox__H_ +#define __SslBox__H_ + + + + +#ifdef WITH_SSL + +/****************** +class SslContext_t +******************/ + +class SslContext_t +{ + public: + SslContext_t (bool is_server, const string &privkeyfile, const string &certchainfile, const string &cipherlist, const string &ecdh_curve, const string &dhparam, int ssl_version); + virtual ~SslContext_t(); + + private: + static bool bLibraryInitialized; + + private: + bool bIsServer; + SSL_CTX *pCtx; + + EVP_PKEY *PrivateKey; + X509 *Certificate; + + friend class SslBox_t; +}; + + +/************** +class SslBox_t +**************/ + +#define SSLBOX_INPUT_CHUNKSIZE 2019 +#define SSLBOX_OUTPUT_CHUNKSIZE 2048 +#define SSLBOX_WRITE_BUFFER_SIZE 8192 // (SSLBOX_OUTPUT_CHUNKSIZE * 4) + +class SslBox_t +{ + public: + SslBox_t (bool is_server, const string &privkeyfile, const string &certchainfile, bool verify_peer, bool fail_if_no_peer_cert, const string &snihostname, const string &cipherlist, const string &ecdh_curve, const string &dhparam, int ssl_version, const uintptr_t binding); + virtual ~SslBox_t(); + + int PutPlaintext (const char*, int); + int GetPlaintext (char*, int); + + bool PutCiphertext (const char*, int); + bool CanGetCiphertext(); + int GetCiphertext (char*, int); + bool IsHandshakeCompleted() {return bHandshakeCompleted;} + + X509 *GetPeerCert(); + int GetCipherBits(); + const char *GetCipherName(); + const char *GetCipherProtocol(); + const char *GetSNIHostname(); + + void Shutdown(); + + protected: + SslContext_t *Context; + + bool bIsServer; + bool bHandshakeCompleted; + bool bVerifyPeer; + bool bFailIfNoPeerCert; + SSL *pSSL; + BIO *pbioRead; + BIO *pbioWrite; + + PageList OutboundQ; +}; + +extern "C" int ssl_verify_wrapper(int, X509_STORE_CTX*); + +#endif // WITH_SSL + + +#endif // __SslBox__H_ + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ssl.o b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/ssl.o new file mode 100644 index 0000000000000000000000000000000000000000..b494d4f5639dd8419fb8908a097a2582c7136d11 GIT binary patch literal 708348 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

      XT22>%N7^Z%S3_iEvQlCpM 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

      ~34 zYSPe7ekHQB_YmNXuy4b@wgD3heuI_7=Is1c>yyUUwAu}rtCko6v>8{WDA1u+>egy^ zv;!h{f&OV72y+@(U6e5*+vWV8p;=EHxK9%n9%$!*X=AC~?p9!DVNplGXqliyG(2r? zYZ0BeLK`Bs1VRJEjz$wf9qD39z6Apt8RStza5^TtUTX{bBlufQq%?MRurH!ueVRo? z9tI*&mw>Hr)b;H#8e?N17TM&{P%D!eUf~Yj$`~~;8)VBsab*!!i+PMhF41a;QKB6X z0+8ll1Jr4BT+$<9g%wP8hE2nl~eggT5;)Whg34ISn*1`mZoxT6>&&YuxVNl2OgyA%im*?=&&(Kz>4v=+ZX82ry!?A$KQAjNQ2e z?d()J4RqYpD>Z7soQkwL2z?Kcb z^r6Y5j95&>Rvng%AhfoFd$MHJNY8@wrAoWWwvlb(CE^Q~2xGSa4G!7|?t&6_3ao+6 z#ly_RNnn;drg2+Spen~{{yB@O?#Oh)w@@i+T5 z-|du@SK=-9M@(ns4WRiAT@T7b)n`$iBVY}{72 zu*zXLVns)C3B8GxmR2+L9l}aAy9H*)Fn`_W2Px0setJg-fK`2EZFQ5UNujQDsvKsm zing(VfLN;)tv-stG`BFVv8dBOG--RNA=aYRk7z^!KvzC< zJz!afTs@6&i9d~e(SMpX#w;k(bpQ}vO0Uk(X@G)n5SY+vj17(CCK9CzdW!xTW1Xxf zY*g_~SWs4$n54{LkaepZ24Z=@TowUonSF7PSqNwHW->|%@rNx|S7%q!8Ua9zW}Q|V zsz6M9kcT?dN)Y19otjPqg80(B7+y57%~=f0FtVr!5f^<$KXzWh$L#zjD-fOr0GA?K zv$R9y8kK#3FxNC@E6l{muL%TJ=1#RdB)SsBPXU4qT`4d%3}ETTFM77E&E{59`sR&n zTH`M?QJC8KDnb#HbPi@HGR>{6EvIK!MLvvP5-hkhwAz`~B{iKO;FdOdtKb|k+D*@I ziX0-Ha+a8)+@Aefm;j(<*n7sb{e{FvvjuuuNSzU&GgyYoZrk~Ov*aR z8rc3QYt7tDFL0*)O1t7}?RF-YvD@11?94c--dvoKsF7G;$yhuxz!@n)M<*l^x zNS#S`(eAND47Z$bmw9fGq+_q1^vRZe1hZ!T3?9-Fj#dPdUR%iu7L5;7&pZ-LK12*h z*}L&4Vl|v@&K?O6%NC~-aJ@lN%wZFf7A4CkN~DsML#9~_qf62R?Y}CGZre0e7it2VRJc`f`$I(%4}BFCB9H)lz}3Jn=+)_;&MS-<`WV!@(70R_rXpx zHwhZ7?>o{q-WtGNc!p?Ty9~~#w~8g&XtP+`giM1$?RX>nWV$YYU4?}#3Q%%cX%q3t zZvhJ)P!q76jqlb1M?QhjQ819$(`%isM*m^_w|Dh&sil=`a=XZ+K_antYBtH!I?3Jq zz-tBuUlH}?_o*e&79e1HjTs^dd7?`_$yhlgL1^(6ROM+YH$Obla_L+yv$o1}&D<2x zuz++#Jc_)>(87fkn9wtqK3b5m$dDfcxvbF_I|a=!ohCt^7UH=qE?>1~dk-#^=%f*w zn=%U~e-?DEpuhInMrj`CYF9;7n4cw*wUyRu@PMFp;lR7g|; zO=?x3qVb9pdU|zppjXP*;a!Tv2kVKtoF!7wM&JY1D;|(cm4G~R z#!ds6GiPSLkF?nx65HBcu?C}SM4{}~98ONfGlWL!GP7wUL{{PXhw>7ewzens)&yB; z;EDYc$q!{Klg_nEjheNW;q^dBic}9)I{J?uvA&s1oKh%{%%PJoOGH2x&Q0$nY%wVx z3%K;rdNIF%mMm;CeA>9tgV;{+BU*$t6Cpn_OKMGUzuN7TR=Ew4&RjqU0z4#1bm`6c z?Y1ewvZw`G35E<=b#6JcxT#8oq$T2q7C&dgRq+wmVIiwP)2-MvbEA2%5mY>6ZA za0+&dXMdA&nP3qZyu>Q>c^qkPZp@-U&Xd4|DCbi`c*=JV1qyULpwDhymyC=wF8D^7 zJFPB_2NM~ls+74~28-d?*5=#9!9kHm2d)O~+|0BD%M+u9`E3eMm0iwOfO%L0asxbQx&A8%4H)1pk5pkQPaEZISss->rhxDm=hd zihM=Kub}(8SrBFR)MpxCvNHMv?|nN4wO6b}?N*bvQ^FHd%UZC-IxERT^k?BizPIHB zw_a)2&I%bQT!;wr1Cte8TcTq_^ewEcrtk2zhh$W(q_^p{0UbIy;)C4U86Tr; zqLcJe7yEEprS0V(u8y!>_9&9{#-2bpPfBWyq!8_mD(-{CY2;t^25 zR3dQ=J_UVHZXX@xiW2Tq@4>B zB@pqjnZ;s;ErA3lyljdYC%j~uSc$11osgO%$Mi``?YE!xHnvOH7s?c~OTZW)`)l*LtiF-XWx>SMOqeQ?)mg$&&XEDToTewiwLXC-crb8l=FLi7>Ab5n8zcE0 zEqPG%V5@HNyv@w~RjAC!sR}Y%oKfVYlO-Bt0bc}#{mMXDyTc1@z(?u}6{tK;a{;tc z-N5V*1c=VS=q!<@mQ!CM4nuHgP3^F>C^A)SyIUO`#IzdZFHz~#+{PwcA8xE|LX8P2 zmL3-~%W18xWY_v->PTIV1TP6ms9+&(bqcshZ1#V-02g~=gCV;NDWno0iGZ`X?K3vg-#OpLQsu3fozheM00Xi8#vg)9rjr* zuN4sRop;z!AqtHEm0BT{Gb^0T@~o`l$?Kmi=uW3F>_(R~4(utC9;8QPdX&mA)=1EL z&JQ^M!IcGk$-DXvHzEs`OHnyh3X=8TSD{f~5st-h#z?8v3>HsDs2vzo(- zV2EdLDVc5;s$q>3#ZAmbwX|!*MV6{)EH)08@X41!b%PX_<%s06x7%4GM95;)b16l>s;!uMygMX<6 zR$tO*n&=6s0AQR63a;)WZ)+BsMFKN0-zL7tyBQK?Xz4$IE}6L@^G}}UY6@Y`cY(}; z%F2e3T|%#PDx~xV&i0z;`ocBaUoq9_*uYuDPUPImfdb`ozH*MN9f@I{kdQu-;UFD* z*A!%BK0Z{PjlV!V^4SsOc>Z~0dH#8NmtM#D+o#lz7-zJfX|%+rkxv1v3JqhP+_Sv^ ziQB-po2yragY&VJZ@$cOA(c*#!ILk?c90z}+{$x!0B`c(K%q;4HlHr|?24cX0;rmd zRB!VIsi3=sYQfrZfrTj?VVd8@Qt(9-)JvL%>hA-HAn3;5?>=- z%U<0#v4vEEGhC@rw;DuOFEMC0p@1fD*5sJq0V_3HGAwY}Vhvo_d=0{XhBrs33!~Y5 z41j)#o7d{XX?|9=m0kjJPs^LHlvjt-aN3^HC^mq+P7d_xVk&-c`B67p-LU4hJ+58d zNfX*^duq!1XhtDe&AB5G*!11Vjp-B$K=v&Y*E3Trh&KONAdJ;QG{jv={op)1A{dSZ zUUV&do}1mQ%o!__z~R{uj71ZGKFfD%^@YmL&L&-ji$x6@abnQY&@vlIy}~0|O=Mg~ zKHh^VJPYeesB_UlS-N6sx-oC%agRxsRy%LPnIn@ercd5$^_37VdPpa0D=meH0$=jShQYe(el+CsL0MwnyP(IBIl zHy8+e7H(VxfB{R7Ps^nl$AoAK(AO@~UhGB(?n3^UY zy4#{1H=&WQcQOTDPt$ZTA-S6;&kJ<9$Qtg}0v!ykxL*MCYQXh8t@|TvIRO2+S%I!2 zaMC~>I!J3q5#t2cE-~)Kj1Fp!IW_vV2k=CD217Xo3B_dJI8f_FdpW|a>;n=fWKBeu zVUFccZ5*iA!_K1Mnw2&Sz7Bpv+b>%8DDIKC4}+DDG`lVtR_O&-Se+?s{&0*7ez*Y< zL%hiHPX6yIH)h;U7mFHnL-tT|XQ_553y$;xvrLnC2X!t5%E*ml{gm&)C8osYNJQ4K zdcall1a3Q(C`*kPCSCl5{2!Q^HvW(!C_8k&`|6_ShD%(}%o+&LBq2|Zn;Qs!H)Lbz&gW=mHp=xggW zxYRf`X68~m@ic~Q2yVUDwT;d6Dx0Cn z;|V3@7fH%3#!a&5n9fb=%eThT=}8tS(G31&lx#s;YKp7`MYKwOm&78CxrsdC##2x5 z(h9L!*{8@I?a3fBB@Um_72<&hg#(?FC60{`jn31i&P4kl-^8um8C|0%8mL4dOfc8B z*`7fhDo9>8mD~Izrj0#iz`JCZoJ3V(Fb=CGrMHLPDo0(zZI&`@>bMy}2isQgJ&YZQ z@H_f`1@^4!2Tt*9L_LxQtHf980uK`R6w!+ybL>?&ylz{u3K{W4-gbH3BX4!}iDoj>?FD^b-m9>7s?ae2N5S5_Xh~2>(U`F+s`} zTBz_734kfu@`iHYp=59Jqm`dzyG|O*WZxO70hL3y}%K{ao zc#i_oTzSCBqxA2D+<(=0OEB;hnZli6=&RBwE}kMGVeMIIJ&Mu_3qY-w42X#2u<+n0 zl@X?!1)zq*1>Wio+$ByB(YjUa_E~)pr8`7%p;R3he_PWK2X|IIM8SQs#hMOoJ3mGm zkP=En63EijhG;ZU07ODRHBLm3hd|IiFf|-WiGYnr9yfN;>Es6~TFb_mI&8A$pqETZ z0%%lfIZ=y2EH9vF&6-w55-I8&1QQ33A~`YeQAy{6X$<-WK#SJODSNJ~|*Y9s|_Q5=b>FnPnCDMA5`!xHrbOWEynam;B;2X zXV!Ad9*3e*`=LlKkr1`P#6d>UV)Rv9*cU(?v=NF7aS0?A>4R}mP754WtKH(bg%XLP zrdlO#&m;xM)^o+iNGiMH!cp`_aY0$Sqqu-f4N_b6b%;cV&!2XbO(!( z`52cOPvK@AY29$pDxMMp7#Gkq@FC}tP-e-exDZq0?J};f!pgCMy-o*IbiBs}uPUEn z@jgqD7O>nfgNviz`bg_w+YGvs|!o(`CgabZrH2NrR8r3xs{*f5Vj;^L#giGz-Lm1@Y-OJ0Fv&Ki@= zn;0iHR|Rg#%vB3k+;MBRGX7khs?;GT;ml8PW$_jpJrn3~$BkJ_Qhja0OQf?EV2P14 zx$dTpflZX9^vIyixSO05rvBjLqd$qOB5la@HTWCALtJzvIDc%13Osiywz>{GoMts& zBx;DcE8pYdt-u}X^i}FfXaXw`lbFIza0!w%{yeZy^B=kxU1CVYTul2{b21|&u$8!Z z8C!(z-$=UOIdn>jK@n@8?0-EYk_fL{)ri@0^U8@hpNQ4INjTic^%1DA=$E=A7Ptxf zrcf+6sc~{uV43v+KgWA~Jn8UG?3x`1{E<3VT$t!NZIh~mcyN-i5+bDYa554R<&6ok zY{f=PLK||QD7QS~cZvcmspcopE$#~%3H6T~?2tRkU0pKM$Pa4lu5$xTq7R+-Mw046 zC)8p0ptH7wI?xL=e*ZaPCeeL9*H)71Lm$w??ns|16Y9+X$nm?>2XGSo>b*^qRJVE| z54%^rH73-l{($56sTXbnU20wZ<&KPvqy?^L?PU&*47mB=9^orBW?x8iwm9Q3HKEW4cYmyo=Efi)K6OxoMGLCI>}0iuSWSSvyVb?g zBam=DIyP zEiP!FN{*JFaqKr5n0Ky_{RM%b_ zxNhr=l{pn$5U4Z}Z~@klDqG{qYf_>ME)4RaS1>eXT+0QcU2Gwe6UJ2jUt;3-G0#u z^HqdgT5Z6G5I=Ebz-uk|SjFgDxsz*f1d!YsMg7nUvmL|`D^p0qYZOgIHP0CVnMLjwM`NdU$QNrssX36C>lP55gCd1y5lyNIU%51SWneDxYG+9wRysNM39qeoYfRl7 z5wBYX0WX^&Ju>8A8XR5Q1V=%@6P@Ru=Q28c+uFm?JA%1v%r8Jt1HlpWIwk>;mlk|;w<^gjzELQmwu9o_BUH|j8kr#E z6&Z%8PHrjtJ^5PTqe=`ZZa57pcB|WdL877Q+rWqXOUrx|jlpi4lM;6NK!boCq(Rq9 z!H9W{qg8ke%4Mdkt3u(LPaSZXJFBS)=K!0Q(-o3$S}HUEhA!+(Q0Ic5abyYt&7q~> zrkeWQ#vhsNmw_5Hgci`XU_zNOax{WdfGZY7>4e(G8qop~ufS)y?86C$&;Z#5kU6kb zv3dZn=Aa^eBUM3i_$4r}pJfN*zVpa6rjnSrBeu40mORGul)1W1F5}6)>u{Karmte$ za#i%O>G0Z4TvKJ55(#J-c(gkjZK22OiaGgDjt!BoJVB$u&_k)JvBQB5{F~qg3t#y% z(gZ>bV1lHGAGlnDdMPs)QYz8?S1JovM^*OR9f;$Y+jji}sV zShOTQC@-NZF+WJn0(NXwI_Pqg-N%w-2SCY9WBi>!Jy&H#;us?7_SpXWIi!lUh9_N* zBk)5OO@ba~XvA|F`VWV4YKWJic99(&#!*cO@8QsVI9Np{OLG8vIcpB^nvvm=O@`A6 z_B#BQkqGDXK;FaKxC>P;zq6!Vb%|5`v_6UivF6(&guKJIvt+Z6D*A#oJVMx;1|W;P z_{gJaD7;;A5U*`#VEPZ@N&T#$d-jRzHxq-r$Dal2I`BRFNXsu6w3A<$ZPk za5i;utg-2_&#-jP;tW6)*UzSE5n&9^CZ)9?t*8e5JUbReAk!#Z z7g{^p+C^jx{EOHa8%7(ta7C7$pjtC`(#0y&O?M!LS>AO%`Y}I3DMjfZ-qXiW(LrW} zM$g{j_SV`VyNN@ZBbd#Q%7)e_9NCzU!>^Uw4~>58>meB!_qvtJ>z*)M!Cjcy~; z4G?i5R4*G zF|X}r#%hu+*7S{;J)mTasbQQ*VnkRTg_UyxW@G9*v~T5uhJXr=o#%1=BJTkO1s^t%bRdsKo48NN~ zB11$OJ~ClP?`ab)KAtu`)oq+(SsdCvN_tSBZKUL?axbY=Z}D9vEe1eI(3Q|y^28&8oqi{JWA~h1 zcPY3CIqmdNNsaDXmNn=o`$c)ox72vqX9ibWD{^`$q2^YjK?a@T!BlO^jmgGK9QI-s7IWS1mf_$JBmB$`s(CwQF5@4)HwL3$&~tRm|UC!Dh|h{>SaZd|#tTTY~P1n5jO4_gGQc`;_{ zU_G8ov-vt3^w`y(33{Nrc{4?Go8=MzZHP0^S-{-BvIlKkMGysf=dGMmL>|7)6bHVzLe`7q0&BIvnHbyywZZ9r_!KFRVWUvq z^n?xip9z`}C@nGW>tl=;nm|6zWbZx*- zHjn5Du!m`dsU7d>c~Nn5}5g`3MRnb zv39nMefZQi{HN5n>RcQ0Y#V^O-|90_)c__xQ6`|xE|CCe-Qj&S>zFE<({ZRRDGr}n z(?yH346`Yd#S`fHNu$>6AOga0hgX{-6z<#NzckHI7TrX52I_Bd5Q)a8$ssuI^_n z92In5Q{hllc3u*vZ6L&r2qwbOTVY)-w-1G*0vpggI23_AX2H`i3uez8rk)~67HQdj z!k|*P4;SKnf^~#7P#hixww7jt{Cp>D{u{Da2SLKA&`hu|LR#38ntgcP5fTX^!tjs? zJ1T><&ch{AeEb~rlX}GDw<0bzW?dPvAM5mlU3urYzfoe{0BCZlb*fsMI%SZA(a5>$HDeZ1XDFb;xr*`tQ!x}HUUVYGjlkU~U&jdQ z90}9qJu3|+U4kKuJs8LU#yp_eNG8b`#h%(Mhgr^1BUd7-KZ%YsT}MD&D@=dmhHUk; zLp{M7B-n5^b%~u>I{{)#iyNFWurTe|*`I8r0c8u4iJ;{dJvh=-O&BjpE^?70g97sa zCPByYFXM@|9f_dkh;_0Du5AdT%06AQCS-yW!g2I+#v=SWX9R)=n}kO&bDGDl@Ny2S zFs)1%|K2Ztwts4O`mIO9;z-0e^d7;l)D`6sYSvIf?DiNEd=Te*SJr9OR^9as)!!=$z?8B#C_mtz+;kv*aE1+&qg1L?y#I8C?YB{bvt18AMD^c!3t5uwV z$e%&P_YI(HtBW2%%*D`oL=bm`^^v^pQAGWbBD$%~J`2%p`^?L*F}P?A9L#wGN+iVj zBnxq%D#pWUMTzZ4RKHpGNZ@+5$*RsPk1X$qk*G@MXHgH+PlA7>8pCq?S){UZS`!cq zZUE69SuImCPe52(pcz6%W?0s!F<^tZm8V5!MN#9w4pve0*sr1MF&V}HvhrY&9z$c| zituWWmp;PSiJ=opz#1wxev9U5QpbVM>66DC%gIJ;4L^V#;+Nb>_{lWG8Y7PSgXNT= zRqq%Mr_p`~0;fO#zX908M9`rh0!iBkP@4liMG(T{TXDeP439stu z3$-6CaygDXBAs$EO%jEt2=Fdlg6qC-ATbpWAOi$d4FPVDfU1Gu?2hiKVGr9_moj~j zK&rtgTE;$#7x{>t;ZTu>51<-|o1zVmA3XKsW{G`18`k1l-E1~a0XC7xI*R7{SI6ni(myAy(Km-7r_8`X~hzxESIRN(yX_zPt|Asg~ zLLwq9{Dz1~*pW)SFW9f(aK~|c9Bn!dApok6FrwZ^bo0w3!=HMpK8bysDH8Px*%p6; zV&4W+ul}5sZMtb)b$a;N5l$VJvfoB%f*b@67~3>x?INy6u2yl&RP3_l-SEtv(E2YW zmZ(%jo=z7jc$})n%NftqK3h2*s(8(_PqmXk1T$Re8PJoeK}k=S;aPDuFT}4)cK%VL#cM~zDRn;kz@-&B|$1CXRFwrxDhP}C0w4bL#k%8i8 z4psO#$Twjy6Vhw_5HayaYV?V>=rKcmWSQ(BF)~k->X2xIT(dx=_3^?YqNGHRk2%cN zxuZ<_45?EV7|8#MjIAaj5PmDsKOlBw;2^S10#Ao42jCmMOTxyw9OfLr_LOfBI7Zo- z?E>0Od(nNQd%$+K6p^u>_OyuIfUt2ahdB+vQREB|_i5tAusq#eW&$B16ORVzv&)i7 z?tq;u0_B`QEXZKA=z@!Cw0}BFPJ&S&Pj^fv8S(LyTXO2b9Z$LamjH>!DI$_fB_Ynrvm58NUeiT= z&?rwUcdJ80R}29rOk~ACF!qJ8UU#YcHp+E}dQz{^3Koq(zNZHR64`NQx_>0aK=Rnq zPf!#^|Du?-mf0(w{jm=fK`{aN$}!)N+>!ch{yg54NE@KcyNEYn?aN5=5Y;gi6|cm} z)2+wpD4&k>_#VkHBw#x~G#ZNY(_~5LIglI{_+cPFKpa2c>j#hQnVG4tk^DQ^J{y3l zJ!aG+KjT!5Sh573=oK3;0k$}7_mfS5!DJ)<8cP=R?3 z(h|zUS)N9e*VXA3#_qJQ#Ot&-jUDr_rvzn@NLl-1(81xSH7-b1N=Xn;^J;stu?{^{ zrd#@zddI5G)U^(0h=j25i`K1uE&QT^O(?>lm+GP88~XDZTq{4x*oJ=i``GkFq_M5) zO=!?L_Tm)hBt}fbK>CCIStib~IZ|B(CDe?twnoFL-PVf`1&0;KuornHGZjHbdL!Ue z1tvuQkcM$FL-X~ZKu83r@xvJdVMk!Fj&^v&iI1CuZbRAW*&Kqk!$YYfWUNB}VK$JK zu5X;e1nTe_!3;&OA;Sh@)&#`zOQ0!dDmGyP?NRP#on~CZL|by=F$t5y-V8@KjQMf$ zT^$sQFbR6~ibI$HeAB;KKn%hpYUmSx@X@G3jXP*vg-=%T=M!zvK7>1os)jKceIg4E zuTh~Q2_`V!!Ulf(Ry$Tul|{ms`&+GrLp+WQJ7~U@Pfff7=v%q97)*;5#HQ15Z2tnQ zDd!N1m()>u#~Hb*u+qn4o^%Lf$TMIA{=ftG5A^!|>kFltv96hR+LH zoN9`wbZnXsA>5u9s^da}+Dty7>~-m(7c6*M5r~EibmoPn9(W88kFJtUjoO0@sukQ| z?GYW%Td%Foj8iLJG^T2KtjMr@ihgxi)yl?3j&0|~%N!ogS;Au@M%P;B74~RW&T$-9 zYl2bwl*19;>BOY#f!$e+J=Y6mwsSe#G3I)rA19VvPr!k<0i6~Fq)BzUZFTdb1VhF3 z0qs20aNgjHgtdL7(CeyYB+!l{pDZ0%Buj9YCRgn95+I4=nx=Y&lmKky>ZS_0PizDl zfkTeiYj}XR>0*OtH;2DVH7BF%hK{4bY@C(Xudd$Fq zq3HB8hM?a>I?E`YNg}FKC0=MYmcG>OXXITrZ5(@vumc5IOAf8TaB0a^p;-zCtx&1w zTX*!GZoSy4H0nZ$!8H{cjjHMgRhW5H(i{b>g0)@4$tU8&LWKlhmg`kj7pgBj%tIK^`vX{8*zRD&rs_mT{C>y@#>aTxUv($LUh5&lHw$Tld+Uz9|1rOO9v-D`s?Ut8`i;8IFpY)`fSr$ zP0o!eH}nh!qf4LETgQk~4_j9^NGvfg=~S{=c!gKhbJHS~Q>3iH+OC+V3t37s_NY*t zBH3V2>|W@pG40cvF6HO|@x9#qM7i^>_&XS^O%9c(DyH`___b_YKo_MU}r2R<-KvKITu1iR9hVS_w;D4h;_|9>cz+kE*1!ddw=evtYH zw~gsHTgdo~MB781cpk~FJsf!rh5jMymlhtUH~3D0G-2mOFlsi{qDQFm@;>t(h`1qO zEfi7!ju45;TSbyWy1A}Li7e&C%+YwuEzl`%p-fZX6Gvm-+=i=Q+E1bT-}qJw{U!saXL>Me{j!^H*&gLERqgA5xnNQW9)NRr*M zr#w-P;E5=7b}{=FpmspWpkQaer!y!5(2U*zAtM_NW71-e$#zo71vEM_EFVRBD{cp1 z{lqJWQ|8O`i3>+(ey1Rp#l|~i)S_Vw9xNCq8mwptZ8*gkMLl*;>dB(A4@)!_QIG2B z;9RwUJXyg21|;OOLa!S69lhE(NN?~mHJDwAyefGL6FRX7LwwisG#YTafrU=3*%;-# zV)(}sI#prWzOR6#*=gf8Kp3GRuusyY2ZZQ3rS-H2Mnt=KL4!_~g2DJYk7ZAmJr5;B z&@c!)5Taot0}TUFI*n@V8+yLouI$!zKHdx+?D|9z3LcSXl77MHp5g?uL+zZFGSbE% zc>iymu`Aatd%BPi@}lo`N9hgRJyHjY<y!2kGt(GclT!`ib*?06Ts_I}P)N9@WjTC~#ONBU= z9YJ!Wr-wpVbo3-ye|wJJ#RrR+;zOjqwj4pEaM^G`sK&|^!G@!E`#%0D9}AA&MFzCr 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 Zoe<6SjiXv)lT`jsM-iPncEokC{|_extU~|* literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.c new file mode 100644 index 0000000..bfd666a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.c @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#include +#include +#include "ArrayType.h" + +static VALUE array_type_s_allocate(VALUE klass); +static VALUE array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength); +static void array_type_mark(ArrayType *); +static void array_type_free(ArrayType *); + +VALUE rbffi_ArrayTypeClass = Qnil; + +static VALUE +array_type_s_allocate(VALUE klass) +{ + ArrayType* array; + VALUE obj; + + obj = Data_Make_Struct(klass, ArrayType, array_type_mark, array_type_free, array); + + array->base.nativeType = NATIVE_ARRAY; + array->base.ffiType = xcalloc(1, sizeof(*array->base.ffiType)); + array->base.ffiType->type = FFI_TYPE_STRUCT; + array->base.ffiType->size = 0; + array->base.ffiType->alignment = 0; + array->rbComponentType = Qnil; + + return obj; +} + +static void +array_type_mark(ArrayType *array) +{ + rb_gc_mark(array->rbComponentType); +} + +static void +array_type_free(ArrayType *array) +{ + xfree(array->base.ffiType); + xfree(array->ffiTypes); + xfree(array); +} + + +/* + * call-seq: initialize(component_type, length) + * @param [Type] component_type + * @param [Numeric] length + * @return [self] + * A new instance of ArrayType. + */ +static VALUE +array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength) +{ + ArrayType* array; + int i; + + Data_Get_Struct(self, ArrayType, array); + + array->length = NUM2UINT(rbLength); + array->rbComponentType = rbComponentType; + Data_Get_Struct(rbComponentType, Type, array->componentType); + + array->ffiTypes = xcalloc(array->length + 1, sizeof(*array->ffiTypes)); + array->base.ffiType->elements = array->ffiTypes; + array->base.ffiType->size = array->componentType->ffiType->size * array->length; + array->base.ffiType->alignment = array->componentType->ffiType->alignment; + + for (i = 0; i < array->length; ++i) { + array->ffiTypes[i] = array->componentType->ffiType; + } + + return self; +} + +/* + * call-seq: length + * @return [Numeric] + * Get array's length + */ +static VALUE +array_type_length(VALUE self) +{ + ArrayType* array; + + Data_Get_Struct(self, ArrayType, array); + + return UINT2NUM(array->length); +} + +/* + * call-seq: element_type + * @return [Type] + * Get element type. + */ +static VALUE +array_type_element_type(VALUE self) +{ + ArrayType* array; + + Data_Get_Struct(self, ArrayType, array); + + return array->rbComponentType; +} + +void +rbffi_ArrayType_Init(VALUE moduleFFI) +{ + VALUE ffi_Type; + + ffi_Type = rbffi_TypeClass; + + /* + * Document-class: FFI::ArrayType < FFI::Type + * + * This is a typed array. The type is a {NativeType native type}. + */ + rbffi_ArrayTypeClass = rb_define_class_under(moduleFFI, "ArrayType", ffi_Type); + /* + * Document-variable: FFI::ArrayType + */ + rb_global_variable(&rbffi_ArrayTypeClass); + /* + * Document-constant: FFI::Type::Array + */ + rb_define_const(ffi_Type, "Array", rbffi_ArrayTypeClass); + + rb_define_alloc_func(rbffi_ArrayTypeClass, array_type_s_allocate); + rb_define_method(rbffi_ArrayTypeClass, "initialize", array_type_initialize, 2); + rb_define_method(rbffi_ArrayTypeClass, "length", array_type_length, 0); + rb_define_method(rbffi_ArrayTypeClass, "elem_type", array_type_element_type, 0); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.h new file mode 100644 index 0000000..356ffb1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_ARRAYTYPE_H +#define RBFFI_ARRAYTYPE_H + +#include +#include +#include "Type.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct ArrayType_ { + Type base; + int length; + ffi_type** ffiTypes; + Type* componentType; + VALUE rbComponentType; +} ArrayType; + +extern void rbffi_ArrayType_Init(VALUE moduleFFI); +extern VALUE rbffi_ArrayTypeClass; + + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_ARRAYTYPE_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.o new file mode 100644 index 0000000000000000000000000000000000000000..5b0367a9b6cd686e7f4451076ddcba75b80f4daf GIT binary patch literal 25936 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.c new file mode 100644 index 0000000..faf4834 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.c @@ -0,0 +1,365 @@ +/* + * Copyright (c) 2008-2010 Wayne Meissner + * Copyright (C) 2009 Aman Gupta + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif +#include +#include +#include "rbffi.h" +#include "rbffi_endian.h" +#include "AbstractMemory.h" + +#define BUFFER_EMBED_MAXLEN (8) +typedef struct Buffer { + AbstractMemory memory; + + union { + VALUE rbParent; /* link to parent buffer */ + char* storage; /* start of malloc area */ + long embed[BUFFER_EMBED_MAXLEN / sizeof(long)]; /* storage for tiny allocations */ + } data; +} Buffer; + +static VALUE buffer_allocate(VALUE klass); +static VALUE buffer_initialize(int argc, VALUE* argv, VALUE self); +static void buffer_release(Buffer* ptr); +static void buffer_mark(Buffer* ptr); +static VALUE buffer_free(VALUE self); + +static VALUE BufferClass = Qnil; + +static VALUE +buffer_allocate(VALUE klass) +{ + Buffer* buffer; + VALUE obj; + + obj = Data_Make_Struct(klass, Buffer, NULL, buffer_release, buffer); + buffer->data.rbParent = Qnil; + buffer->memory.flags = MEM_RD | MEM_WR; + + return obj; +} + +static void +buffer_release(Buffer* ptr) +{ + if ((ptr->memory.flags & MEM_EMBED) == 0 && ptr->data.storage != NULL) { + xfree(ptr->data.storage); + ptr->data.storage = NULL; + } + + xfree(ptr); +} + +/* + * call-seq: initialize(size, count=1, clear=false) + * @param [Integer, Symbol, #size] Type or size in bytes of a buffer cell + * @param [Fixnum] count number of cell in the Buffer + * @param [Boolean] clear if true, set the buffer to all-zero + * @return [self] + * @raise {NoMemoryError} if failed to allocate memory for Buffer + * A new instance of Buffer. + */ +static VALUE +buffer_initialize(int argc, VALUE* argv, VALUE self) +{ + VALUE rbSize = Qnil, rbCount = Qnil, rbClear = Qnil; + Buffer* p; + int nargs; + + Data_Get_Struct(self, Buffer, p); + + nargs = rb_scan_args(argc, argv, "12", &rbSize, &rbCount, &rbClear); + p->memory.typeSize = rbffi_type_size(rbSize); + p->memory.size = p->memory.typeSize * (nargs > 1 ? NUM2LONG(rbCount) : 1); + + if (p->memory.size > BUFFER_EMBED_MAXLEN) { + p->data.storage = xmalloc(p->memory.size + 7); + if (p->data.storage == NULL) { + rb_raise(rb_eNoMemError, "Failed to allocate memory size=%lu bytes", p->memory.size); + return Qnil; + } + + /* ensure the memory is aligned on at least a 8 byte boundary */ + p->memory.address = (void *) (((uintptr_t) p->data.storage + 0x7) & (uintptr_t) ~0x7UL); + + if (p->memory.size > 0 && (nargs < 3 || RTEST(rbClear))) { + memset(p->memory.address, 0, p->memory.size); + } + + } else { + p->memory.flags |= MEM_EMBED; + p->memory.address = (void *) &p->data.embed[0]; + } + + if (rb_block_given_p()) { + return rb_ensure(rb_yield, self, buffer_free, self); + } + + return self; +} + +/* + * call-seq: initialize_copy(other) + * @return [self] + * DO NOT CALL THIS METHOD. + */ +static VALUE +buffer_initialize_copy(VALUE self, VALUE other) +{ + AbstractMemory* src; + Buffer* dst; + + Data_Get_Struct(self, Buffer, dst); + src = rbffi_AbstractMemory_Cast(other, BufferClass); + if ((dst->memory.flags & MEM_EMBED) == 0 && dst->data.storage != NULL) { + xfree(dst->data.storage); + } + dst->data.storage = xmalloc(src->size + 7); + if (dst->data.storage == NULL) { + rb_raise(rb_eNoMemError, "failed to allocate memory size=%lu bytes", src->size); + return Qnil; + } + + dst->memory.address = (void *) (((uintptr_t) dst->data.storage + 0x7) & (uintptr_t) ~0x7UL); + dst->memory.size = src->size; + dst->memory.typeSize = src->typeSize; + + /* finally, copy the actual buffer contents */ + memcpy(dst->memory.address, src->address, src->size); + + return self; +} + +static VALUE +buffer_alloc_inout(int argc, VALUE* argv, VALUE klass) +{ + return buffer_initialize(argc, argv, buffer_allocate(klass)); +} + +static VALUE +slice(VALUE self, long offset, long len) +{ + Buffer* ptr; + Buffer* result; + VALUE obj = Qnil; + + Data_Get_Struct(self, Buffer, ptr); + checkBounds(&ptr->memory, offset, len); + + obj = Data_Make_Struct(BufferClass, Buffer, buffer_mark, -1, result); + result->memory.address = ptr->memory.address + offset; + result->memory.size = len; + result->memory.flags = ptr->memory.flags; + result->memory.typeSize = ptr->memory.typeSize; + result->data.rbParent = self; + + return obj; +} + +/* + * call-seq: + offset + * @param [Numeric] offset + * @return [Buffer] a new instance of Buffer pointing from offset until end of previous buffer. + * Add a Buffer with an offset + */ +static VALUE +buffer_plus(VALUE self, VALUE rbOffset) +{ + Buffer* ptr; + long offset = NUM2LONG(rbOffset); + + Data_Get_Struct(self, Buffer, ptr); + + return slice(self, offset, ptr->memory.size - offset); +} + +/* + * call-seq: slice(offset, length) + * @param [Numeric] offset + * @param [Numeric] length + * @return [Buffer] a new instance of Buffer + * Slice an existing Buffer. + */ +static VALUE +buffer_slice(VALUE self, VALUE rbOffset, VALUE rbLength) +{ + return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength)); +} + +/* + * call-seq: inspect + * @return [String] + * Inspect a Buffer. + */ +static VALUE +buffer_inspect(VALUE self) +{ + char tmp[100]; + Buffer* ptr; + + Data_Get_Struct(self, Buffer, ptr); + + snprintf(tmp, sizeof(tmp), "#", ptr, ptr->memory.address, ptr->memory.size); + + return rb_str_new2(tmp); +} + + +#if BYTE_ORDER == LITTLE_ENDIAN +# define SWAPPED_ORDER BIG_ENDIAN +#else +# define SWAPPED_ORDER LITTLE_ENDIAN +#endif + +/* + * Set or get endianness of Buffer. + * @overload order + * @return [:big, :little] + * Get endianness of Buffer. + * @overload order(order) + * @param [:big, :little, :network] order + * @return [self] + * Set endianness of Buffer (+:network+ is an alias for +:big+). + */ +static VALUE +buffer_order(int argc, VALUE* argv, VALUE self) +{ + Buffer* ptr; + + Data_Get_Struct(self, Buffer, ptr); + if (argc == 0) { + int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER; + return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little")); + } else { + VALUE rbOrder = Qnil; + int order = BYTE_ORDER; + + if (rb_scan_args(argc, argv, "1", &rbOrder) < 1) { + rb_raise(rb_eArgError, "need byte order"); + } + if (SYMBOL_P(rbOrder)) { + ID id = SYM2ID(rbOrder); + if (id == rb_intern("little")) { + order = LITTLE_ENDIAN; + + } else if (id == rb_intern("big") || id == rb_intern("network")) { + order = BIG_ENDIAN; + } + } + if (order != BYTE_ORDER) { + Buffer* p2; + VALUE retval = slice(self, 0, ptr->memory.size); + + Data_Get_Struct(retval, Buffer, p2); + p2->memory.flags |= MEM_SWAP; + return retval; + } + + return self; + } +} + +/* Only used to free the buffer if the yield in the initializer throws an exception */ +static VALUE +buffer_free(VALUE self) +{ + Buffer* ptr; + + Data_Get_Struct(self, Buffer, ptr); + if ((ptr->memory.flags & MEM_EMBED) == 0 && ptr->data.storage != NULL) { + xfree(ptr->data.storage); + ptr->data.storage = NULL; + } + + return self; +} + +static void +buffer_mark(Buffer* ptr) +{ + rb_gc_mark(ptr->data.rbParent); +} + +void +rbffi_Buffer_Init(VALUE moduleFFI) +{ + VALUE ffi_AbstractMemory = rbffi_AbstractMemoryClass; + + /* + * Document-class: FFI::Buffer < FFI::AbstractMemory + * + * A Buffer is a function argument type. It should be use with functions playing with C arrays. + */ + BufferClass = rb_define_class_under(moduleFFI, "Buffer", ffi_AbstractMemory); + + /* + * Document-variable: FFI::Buffer + */ + rb_global_variable(&BufferClass); + rb_define_alloc_func(BufferClass, buffer_allocate); + + /* + * Document-method: alloc_inout + * call-seq: alloc_inout(*args) + * Create a new Buffer for in and out arguments (alias : new_inout). + */ + rb_define_singleton_method(BufferClass, "alloc_inout", buffer_alloc_inout, -1); + /* + * Document-method: alloc_out + * call-seq: alloc_out(*args) + * Create a new Buffer for out arguments (alias : new_out). + */ + rb_define_singleton_method(BufferClass, "alloc_out", buffer_alloc_inout, -1); + /* + * Document-method: alloc_in + * call-seq: alloc_in(*args) + * Create a new Buffer for in arguments (alias : new_in). + */ + rb_define_singleton_method(BufferClass, "alloc_in", buffer_alloc_inout, -1); + rb_define_alias(rb_singleton_class(BufferClass), "new_in", "alloc_in"); + rb_define_alias(rb_singleton_class(BufferClass), "new_out", "alloc_out"); + rb_define_alias(rb_singleton_class(BufferClass), "new_inout", "alloc_inout"); + + rb_define_method(BufferClass, "initialize", buffer_initialize, -1); + rb_define_method(BufferClass, "initialize_copy", buffer_initialize_copy, 1); + rb_define_method(BufferClass, "order", buffer_order, -1); + rb_define_method(BufferClass, "inspect", buffer_inspect, 0); + rb_define_alias(BufferClass, "length", "total"); + rb_define_method(BufferClass, "+", buffer_plus, 1); + rb_define_method(BufferClass, "slice", buffer_slice, 2); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.o new file mode 100644 index 0000000000000000000000000000000000000000..f57811a3103046144224b926ca390b5ab69bf908 GIT binary patch literal 41316 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 + * Copyright (c) 2009, Mike Dalessio + * Copyright (c) 2009, Aman Gupta. + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef _MSC_VER +#include +#endif +#include +#include +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif +#include +#include +#if defined(HAVE_NATIVETHREAD) && (defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) && !defined(_WIN32) +# include +# include +#endif +#include +#include "extconf.h" +#include "rbffi.h" +#include "compat.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "Struct.h" +#include "Function.h" +#include "Type.h" +#include "LastError.h" +#include "Call.h" +#include "MappedType.h" +#include "Thread.h" +#include "LongDouble.h" + +#ifdef USE_RAW +# ifndef __i386__ +# error "RAW argument packing only supported on i386" +# endif + +#define INT8_ADJ (4) +#define INT16_ADJ (4) +#define INT32_ADJ (4) +#define INT64_ADJ (8) +#define LONG_ADJ (sizeof(long)) +#define FLOAT32_ADJ (4) +#define FLOAT64_ADJ (8) +#define ADDRESS_ADJ (sizeof(void *)) +#define LONGDOUBLE_ADJ (ffi_type_longdouble.alignment) + +#endif /* USE_RAW */ + +#ifdef USE_RAW +# define ADJ(p, a) ((p) = (FFIStorage*) (((char *) p) + a##_ADJ)) +#else +# define ADJ(p, a) (++(p)) +#endif + +static void* callback_param(VALUE proc, VALUE cbinfo); +static inline void* getPointer(VALUE value, int type); + +static ID id_to_ptr, id_map_symbol, id_to_native; + +void +rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes, + FFIStorage* paramStorage, void** ffiValues, + VALUE* callbackParameters, int callbackCount, VALUE enums) +{ + VALUE callbackProc = Qnil; + FFIStorage* param = ¶mStorage[0]; + int i, argidx, cbidx, argCount; + + if (unlikely(paramCount != -1 && paramCount != argc)) { + if (argc == (paramCount - 1) && callbackCount == 1 && rb_block_given_p()) { + callbackProc = rb_block_proc(); + } else { + rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", argc, paramCount); + } + } + + argCount = paramCount != -1 ? paramCount : argc; + + for (i = 0, argidx = 0, cbidx = 0; i < argCount; ++i) { + Type* paramType = paramTypes[i]; + int type; + + + if (unlikely(paramType->nativeType == NATIVE_MAPPED)) { + VALUE values[] = { argv[argidx], Qnil }; + argv[argidx] = rb_funcall2(((MappedType *) paramType)->rbConverter, id_to_native, 2, values); + paramType = ((MappedType *) paramType)->type; + } + + type = argidx < argc ? TYPE(argv[argidx]) : T_NONE; + ffiValues[i] = param; + + switch (paramType->nativeType) { + + case NATIVE_INT8: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->s8 = NUM2INT(value); + } else { + param->s8 = NUM2INT(argv[argidx]); + } + + ++argidx; + ADJ(param, INT8); + break; + + case NATIVE_INT16: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->s16 = NUM2INT(value); + + } else { + param->s16 = NUM2INT(argv[argidx]); + } + + ++argidx; + ADJ(param, INT16); + break; + + case NATIVE_INT32: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->s32 = NUM2INT(value); + + } else { + param->s32 = NUM2INT(argv[argidx]); + } + + ++argidx; + ADJ(param, INT32); + break; + + case NATIVE_BOOL: + if (type != T_TRUE && type != T_FALSE) { + rb_raise(rb_eTypeError, "wrong argument type (expected a boolean parameter)"); + } + param->s8 = argv[argidx++] == Qtrue; + ADJ(param, INT8); + break; + + case NATIVE_UINT8: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u8 = NUM2UINT(value); + } else { + param->u8 = NUM2UINT(argv[argidx]); + } + + ADJ(param, INT8); + ++argidx; + break; + + case NATIVE_UINT16: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u16 = NUM2UINT(value); + } else { + param->u16 = NUM2UINT(argv[argidx]); + } + + ADJ(param, INT16); + ++argidx; + break; + + case NATIVE_UINT32: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u32 = NUM2UINT(value); + } else { + param->u32 = NUM2UINT(argv[argidx]); + } + + ADJ(param, INT32); + ++argidx; + break; + + case NATIVE_INT64: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->i64 = NUM2LL(value); + } else { + param->i64 = NUM2LL(argv[argidx]); + } + + ADJ(param, INT64); + ++argidx; + break; + + case NATIVE_UINT64: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u64 = NUM2ULL(value); + } else { + param->u64 = NUM2ULL(argv[argidx]); + } + + ADJ(param, INT64); + ++argidx; + break; + + case NATIVE_LONG: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + *(ffi_sarg *) param = NUM2LONG(value); + } else { + *(ffi_sarg *) param = NUM2LONG(argv[argidx]); + } + + ADJ(param, LONG); + ++argidx; + break; + + case NATIVE_ULONG: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + *(ffi_arg *) param = NUM2ULONG(value); + } else { + *(ffi_arg *) param = NUM2ULONG(argv[argidx]); + } + + ADJ(param, LONG); + ++argidx; + break; + + case NATIVE_FLOAT32: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->f32 = (float) NUM2DBL(value); + } else { + param->f32 = (float) NUM2DBL(argv[argidx]); + } + + ADJ(param, FLOAT32); + ++argidx; + break; + + case NATIVE_FLOAT64: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->f64 = NUM2DBL(value); + } else { + param->f64 = NUM2DBL(argv[argidx]); + } + + ADJ(param, FLOAT64); + ++argidx; + break; + + case NATIVE_LONGDOUBLE: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->ld = rbffi_num2longdouble(value); + } else { + param->ld = rbffi_num2longdouble(argv[argidx]); + } + + ADJ(param, LONGDOUBLE); + ++argidx; + break; + + + case NATIVE_STRING: + if (type == T_NIL) { + param->ptr = NULL; + + } else { + if (rb_safe_level() >= 1 && OBJ_TAINTED(argv[argidx])) { + rb_raise(rb_eSecurityError, "Unsafe string parameter"); + } + + param->ptr = StringValueCStr(argv[argidx]); + } + + ADJ(param, ADDRESS); + ++argidx; + break; + + case NATIVE_POINTER: + case NATIVE_BUFFER_IN: + case NATIVE_BUFFER_OUT: + case NATIVE_BUFFER_INOUT: + param->ptr = getPointer(argv[argidx++], type); + ADJ(param, ADDRESS); + break; + + + case NATIVE_FUNCTION: + case NATIVE_CALLBACK: + if (callbackProc != Qnil) { + param->ptr = callback_param(callbackProc, callbackParameters[cbidx++]); + } else { + param->ptr = callback_param(argv[argidx], callbackParameters[cbidx++]); + ++argidx; + } + ADJ(param, ADDRESS); + break; + + case NATIVE_STRUCT: + ffiValues[i] = getPointer(argv[argidx++], type); + break; + + default: + rb_raise(rb_eArgError, "Invalid parameter type: %d", paramType->nativeType); + } + } +} + +static VALUE +call_blocking_function(void* data) +{ + rbffi_blocking_call_t* b = (rbffi_blocking_call_t *) data; + b->frame->has_gvl = false; + ffi_call(&b->cif, FFI_FN(b->function), b->retval, b->ffiValues); + b->frame->has_gvl = true; + + return Qnil; +} + +VALUE +rbffi_do_blocking_call(void *data) +{ + rbffi_thread_blocking_region(call_blocking_function, data, (void *) -1, NULL); + + return Qnil; +} + +VALUE +rbffi_save_frame_exception(void *data, VALUE exc) +{ + rbffi_frame_t* frame = (rbffi_frame_t *) data; + frame->exc = exc; + return Qnil; +} + +VALUE +rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo) +{ + void* retval; + void** ffiValues; + FFIStorage* params; + VALUE rbReturnValue; + rbffi_frame_t frame = { 0 }; + + retval = alloca(MAX(fnInfo->ffi_cif.rtype->size, FFI_SIZEOF_ARG)); + + if (unlikely(fnInfo->blocking)) { + rbffi_blocking_call_t* bc; + + /* + * due to the way thread switching works on older ruby variants, we + * cannot allocate anything passed to the blocking function on the stack + */ +#if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) + ffiValues = ALLOCA_N(void *, fnInfo->parameterCount); + params = ALLOCA_N(FFIStorage, fnInfo->parameterCount); + bc = ALLOCA_N(rbffi_blocking_call_t, 1); + bc->retval = retval; +#else + ffiValues = ALLOC_N(void *, fnInfo->parameterCount); + params = ALLOC_N(FFIStorage, fnInfo->parameterCount); + bc = ALLOC_N(rbffi_blocking_call_t, 1); + bc->retval = xmalloc(MAX(fnInfo->ffi_cif.rtype->size, FFI_SIZEOF_ARG)); + bc->stkretval = retval; +#endif + bc->cif = fnInfo->ffi_cif; + bc->function = function; + bc->ffiValues = ffiValues; + bc->params = params; + bc->frame = &frame; + + rbffi_SetupCallParams(argc, argv, + fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues, + fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums); + + rbffi_frame_push(&frame); + rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0); + rbffi_frame_pop(&frame); + +#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) + memcpy(bc->stkretval, bc->retval, MAX(bc->cif.rtype->size, FFI_SIZEOF_ARG)); + xfree(bc->params); + xfree(bc->ffiValues); + xfree(bc->retval); + xfree(bc); +#endif + + } else { + + ffiValues = ALLOCA_N(void *, fnInfo->parameterCount); + params = ALLOCA_N(FFIStorage, fnInfo->parameterCount); + + rbffi_SetupCallParams(argc, argv, + fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues, + fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums); + + rbffi_frame_push(&frame); + ffi_call(&fnInfo->ffi_cif, FFI_FN(function), retval, ffiValues); + rbffi_frame_pop(&frame); + } + + if (unlikely(!fnInfo->ignoreErrno)) { + rbffi_save_errno(); + } + + if (RTEST(frame.exc) && frame.exc != Qnil) { + rb_exc_raise(frame.exc); + } + + RB_GC_GUARD(rbReturnValue) = rbffi_NativeValue_ToRuby(fnInfo->returnType, fnInfo->rbReturnType, retval); + RB_GC_GUARD(fnInfo->rbReturnType); + + return rbReturnValue; +} + +static inline void* +getPointer(VALUE value, int type) +{ + if (likely(type == T_DATA && rb_obj_is_kind_of(value, rbffi_AbstractMemoryClass))) { + + return ((AbstractMemory *) DATA_PTR(value))->address; + + } else if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_StructClass)) { + + AbstractMemory* memory = ((Struct *) DATA_PTR(value))->pointer; + return memory != NULL ? memory->address : NULL; + + } else if (type == T_STRING) { + + return StringValuePtr(value); + + } else if (type == T_NIL) { + + return NULL; + + } else if (rb_respond_to(value, id_to_ptr)) { + + VALUE ptr = rb_funcall2(value, id_to_ptr, 0, NULL); + if (rb_obj_is_kind_of(ptr, rbffi_AbstractMemoryClass) && TYPE(ptr) == T_DATA) { + return ((AbstractMemory *) DATA_PTR(ptr))->address; + } + rb_raise(rb_eArgError, "to_ptr returned an invalid pointer"); + } + + rb_raise(rb_eArgError, ":pointer argument is not a valid pointer"); + return NULL; +} + +Invoker +rbffi_GetInvoker(FunctionType *fnInfo) +{ + return rbffi_CallFunction; +} + + +static void* +callback_param(VALUE proc, VALUE cbInfo) +{ + VALUE callback ; + if (unlikely(proc == Qnil)) { + return NULL ; + } + + /* Handle Function pointers here */ + if (rb_obj_is_kind_of(proc, rbffi_FunctionClass)) { + AbstractMemory* ptr; + Data_Get_Struct(proc, AbstractMemory, ptr); + return ptr->address; + } + + callback = rbffi_Function_ForProc(cbInfo, proc); + RB_GC_GUARD(callback); + + return ((AbstractMemory *) DATA_PTR(callback))->address; +} + + +void +rbffi_Call_Init(VALUE moduleFFI) +{ + id_to_ptr = rb_intern("to_ptr"); + id_to_native = rb_intern("to_native"); + id_map_symbol = rb_intern("__map_symbol"); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Call.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Call.h new file mode 100644 index 0000000..56bdd61 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Call.h @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * Copyright (c) 2009, Luc Heinrich + * Copyright (c) 2009, Mike Dalessio + * Copyright (c) 2009, Aman Gupta. + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_CALL_H +#define RBFFI_CALL_H + +#include "Thread.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__i386__) && \ + (defined(HAVE_RAW_API) || defined(USE_INTERNAL_LIBFFI)) && \ + !defined(_WIN32) && !defined(__WIN32__) +# define USE_RAW +#endif + +#if (defined(__i386__) || defined(__x86_64__)) && !(defined(_WIN32) || defined(__WIN32__)) +# define BYPASS_FFI 1 +#endif + +typedef union { +#ifdef USE_RAW + signed int s8, s16, s32; + unsigned int u8, u16, u32; +#else + signed char s8; + unsigned char u8; + signed short s16; + unsigned short u16; + signed int s32; + unsigned int u32; +#endif + signed long long i64; + unsigned long long u64; + signed long sl; + unsigned long ul; + void* ptr; + float f32; + double f64; + long double ld; +} FFIStorage; + +extern void rbffi_Call_Init(VALUE moduleFFI); + +extern void rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes, + FFIStorage* paramStorage, void** ffiValues, + VALUE* callbackParameters, int callbackCount, VALUE enums); + +struct FunctionType_; +extern VALUE rbffi_CallFunction(int argc, VALUE* argv, void* function, struct FunctionType_* fnInfo); + +typedef VALUE (*Invoker)(int argc, VALUE* argv, void* function, struct FunctionType_* fnInfo); + +Invoker rbffi_GetInvoker(struct FunctionType_* fnInfo); + +extern VALUE rbffi_GetEnumValue(VALUE enums, VALUE value); +extern int rbffi_GetSignedIntValue(VALUE value, int type, int minValue, int maxValue, const char* typeName, VALUE enums); + +typedef struct rbffi_blocking_call { + rbffi_frame_t* frame; + void* function; + ffi_cif cif; + void **ffiValues; + void* retval; + void* params; +#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) + void* stkretval; +#endif +} rbffi_blocking_call_t; + +VALUE rbffi_do_blocking_call(void* data); +VALUE rbffi_save_frame_exception(void *data, VALUE exc); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_CALL_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Call.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Call.o new file mode 100644 index 0000000000000000000000000000000000000000..c2ca0d7bafb362e67c0e32be446374a20b6dd9f6 GIT binary patch literal 55844 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 HH~;?u6lv~- literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.c new file mode 100644 index 0000000..5499b40 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.c @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2009, 2010 Wayne Meissner + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef _MSC_VER +#include +#endif +#include +#if defined(__CYGWIN__) || !defined(_WIN32) +# include +#endif +#include +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif +#if defined(__CYGWIN__) || !defined(_WIN32) +# include +#else +# include +# define _WINSOCKAPI_ +# include +#endif +#include +#include + +#if defined(_MSC_VER) && !defined(INT8_MIN) +# include "win32/stdint.h" +#endif +#include +#include "rbffi.h" +#include "compat.h" + +#include "Function.h" +#include "Types.h" +#include "Type.h" +#include "LastError.h" +#include "Call.h" + +#include "ClosurePool.h" + + +#ifndef roundup +# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#endif +#ifdef _WIN32 + typedef char* caddr_t; +#endif + +typedef struct Memory { + void* code; + void* data; + struct Memory* next; +} Memory; + +struct ClosurePool_ { + void* ctx; + int closureSize; + bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize); + struct Memory* blocks; /* Keeps track of all the allocated memory for this pool */ + Closure* list; + long refcnt; +}; + +static long pageSize; + +static void* allocatePage(void); +static bool freePage(void *); +static bool protectPage(void *); + +ClosurePool* +rbffi_ClosurePool_New(int closureSize, + bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize), + void* ctx) +{ + ClosurePool* pool; + + pool = xcalloc(1, sizeof(*pool)); + pool->closureSize = closureSize; + pool->ctx = ctx; + pool->prep = prep; + pool->refcnt = 1; + + return pool; +} + +void +cleanup_closure_pool(ClosurePool* pool) +{ + Memory* memory; + + for (memory = pool->blocks; memory != NULL; ) { + Memory* next = memory->next; + freePage(memory->code); + free(memory->data); + free(memory); + memory = next; + } + xfree(pool); +} + +void +rbffi_ClosurePool_Free(ClosurePool* pool) +{ + if (pool != NULL) { + long refcnt = --(pool->refcnt); + if (refcnt == 0) { + cleanup_closure_pool(pool); + } + } +} + +Closure* +rbffi_Closure_Alloc(ClosurePool* pool) +{ + Closure *list = NULL; + Memory* block = NULL; + caddr_t code = NULL; + char errmsg[256]; + int nclosures; + long trampolineSize; + int i; + + if (pool->list != NULL) { + Closure* closure = pool->list; + pool->list = pool->list->next; + pool->refcnt++; + + return closure; + } + + trampolineSize = roundup(pool->closureSize, 8); + nclosures = (int) (pageSize / trampolineSize); + block = calloc(1, sizeof(*block)); + list = calloc(nclosures, sizeof(*list)); + code = allocatePage(); + + if (block == NULL || list == NULL || code == NULL) { + snprintf(errmsg, sizeof(errmsg), "failed to allocate a page. errno=%d (%s)", errno, strerror(errno)); + goto error; + } + + for (i = 0; i < nclosures; ++i) { + Closure* closure = &list[i]; + closure->next = &list[i + 1]; + closure->pool = pool; + closure->code = (code + (i * trampolineSize)); + + if (!(*pool->prep)(pool->ctx, closure->code, closure, errmsg, sizeof(errmsg))) { + goto error; + } + } + + if (!protectPage(code)) { + goto error; + } + + /* Track the allocated page + Closure memory area */ + block->data = list; + block->code = code; + block->next = pool->blocks; + pool->blocks = block; + + /* Thread the new block onto the free list, apart from the first one. */ + list[nclosures - 1].next = pool->list; + pool->list = list->next; + pool->refcnt++; + + /* Use the first one as the new handle */ + return list; + +error: + free(block); + free(list); + if (code != NULL) { + freePage(code); + } + + + rb_raise(rb_eRuntimeError, "%s", errmsg); + return NULL; +} + +void +rbffi_Closure_Free(Closure* closure) +{ + if (closure != NULL) { + ClosurePool* pool = closure->pool; + long refcnt; + /* Just push it on the front of the free list */ + closure->next = pool->list; + pool->list = closure; + refcnt = --(pool->refcnt); + if (refcnt == 0) { + cleanup_closure_pool(pool); + } + } +} + +void* +rbffi_Closure_CodeAddress(Closure* handle) +{ + return handle->code; +} + + +static long +getPageSize() +{ +#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) + SYSTEM_INFO si; + GetSystemInfo(&si); + return si.dwPageSize; +#else + return sysconf(_SC_PAGESIZE); +#endif +} + +static void* +allocatePage(void) +{ +#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) + return VirtualAlloc(NULL, pageSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); +#else + caddr_t page = mmap(NULL, pageSize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + return (page != (caddr_t) -1) ? page : NULL; +#endif +} + +static bool +freePage(void *addr) +{ +#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) + return VirtualFree(addr, 0, MEM_RELEASE); +#else + return munmap(addr, pageSize) == 0; +#endif +} + +static bool +protectPage(void* page) +{ +#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) + DWORD oldProtect; + return VirtualProtect(page, pageSize, PAGE_EXECUTE_READ, &oldProtect); +#else + return mprotect(page, pageSize, PROT_READ | PROT_EXEC) == 0; +#endif +} + +void +rbffi_ClosurePool_Init(VALUE module) +{ + pageSize = getPageSize(); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.h new file mode 100644 index 0000000..b842375 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2009, 2010 Wayne Meissner + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RUBYFFI_CLOSUREPOOL_H +#define RUBYFFI_CLOSUREPOOL_H + +typedef struct ClosurePool_ ClosurePool; +typedef struct Closure_ Closure; + +struct Closure_ { + void* info; /* opaque handle for storing closure-instance specific data */ + void* function; /* closure-instance specific function, called by custom trampoline */ + void* code; /* The native trampoline code location */ + struct ClosurePool_* pool; + Closure* next; +}; + +void rbffi_ClosurePool_Init(VALUE module); + +ClosurePool* rbffi_ClosurePool_New(int closureSize, + bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize), + void* ctx); + +void rbffi_ClosurePool_Free(ClosurePool *); + +Closure* rbffi_Closure_Alloc(ClosurePool *); +void rbffi_Closure_Free(Closure *); + +void* rbffi_Closure_GetCodeAddress(Closure *); + +#endif /* RUBYFFI_CLOSUREPOOL_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.o new file mode 100644 index 0000000000000000000000000000000000000000..4a2a7dfab0296f61a6a7369590316eb3ce807230 GIT binary patch literal 24736 zcmeHOdwf*YwLT{^XE-6RfdoQ`!9l}IO(vjHxCA6T!sG>kkPs^{gvlfX^XfblR8R>~ zkK-sl=v!;4wYIgl^uhfpUN96?to>EAR=Cw(;VL#-Y_aV{6eaij_St7LnSgr#>Ak%- z`OzWnm+?!AhlB&mur4AiD5PLTYgxTGRW*<7%$hjF27C=Eqm zC;~$f7>dA91co9o6oH`#3`Jll0z(lPioj3=h9d9}7J(N(dhaZL&_4bK zOxCv~$G64-%D^K0Y4ooRH+x}J)WE+LCCf@2ul(G_*JSaibIMrOAo)uxUnlZ%|RD^zWjPrWg5^Gh-yvPtNaOXM-=% zUTK28iJ#M6Xk+I&$GcwIJ0{0l{+afC9c}O{XPKp=QdorN znN#}+<_p&qq=fPM*Lj-)xEp3=;`3W1=f@1`pEK9AXKE`7rsq0~CyhOCE$zZ$V*J+0 z`#Da|XU_#@Yv)DgI*QT&|9IcTlt>#c6j{j-je&kP=p7d;NT0UXjKgKdDdWu3G`Y73mtM9t>h(%vMy1i|^gK6rGV45D2lQ)7 zR+o5J?T>GLwk)!GjHmmx&}E*;tjfrZPEX`Y8W2`IksEcBG2Rfgs=Ke!I1_%Q()gg? z-aFK%O;2}U$l>W*GC7pAYX7R3n2wgzmMpLF+B z8#u;Dl-+rZgPwiIT=0#hO5f>9qu0~bGr8=!XV_6$-!oM+Kgo!0L;oIQ?rD!vkDfYv zE2C>Bd!p4xcuR~^o=7)GRu#R%QSt<*jwc#D1VLYob88QVAAZ6U5#E^|NA}P$>HQx1 zs)RD-U4Q68J_5stAyF@G&{9NR*QMCn@aJ`x_iRgJdy3}1A}BxJjPNTKGLwq zP(6|PV?0KQ(_>VO0q^oW2?Gj8>xt|VF;Rc**>~3EiKhOG$5`-7mnSk00fJ)R{K;|i zV%EY#;ZYvrkmuF|oHW;ztSnh&PG8}kxGabi2^yJUx@_$CL`SvI;piR?WiO*OwP%6x zewlGZsJ!zM#A2=*r#;<0q0yem2DrHd9(a%!!HdM{>xnFKn$OJBc`z+|60uvgzp0_6 z)!*m}b+{T@v57Z?{H_L9XG62U(B%&V+B;@XXmm}U5S*e+2r4DqT3nTtbycqG{DELg zN4slgVNqd`YqGBu`(eS%A`}WQpIJC|;9eVUZ*29u1L3tB-O~y$ zFD!C5``d!EjRd;){gdOS4(?HVfHmNHU_+)>ly+| zU@cYSJo7I0U#~O;{Qhb*R=o4ztilG0uhrks9`5w|%u#qdSu?nKDVi!)+=LB!p>zg1 zLKvSA3~1!#Xng|>d4-XIYV$i9{Uz|jk9Wytzc3_*Hb9G^^_I1_gyLfz&wCYLXaj~K zZiHyx8Sr;n8W!~;PIxzJ3b*@0xTA^>eJf(T?R+y1BBY2P_ML_RHbk#1iy(*FgDuVN zm_3a2T8!-4pi<>;>j-RA8XH0lN^46nqy+p;K2*1va?Gi=V6(8wEn5j;YwYZ3#cn1X z6h@SG>2pwNvD{bIVeYj0m9~z?Fi2fVW$i*fmLkbL9?wdx#m7S}nOjBrT@0)MATcB5$Jlcqy0@Q>ji=v8pO!Dzz4SXG}E6oh7pBnwUzB#cqy? zycT;$Of)DOpVI1<^S8QBR((IFQY*O_v8sCdRV+3`zJlQ9_$2$+e$gkA&EckobdFnS z$EwJ5iKMuNrl9{iO;&A)sdz1Rjx=mju6trre+!cV))6&6e)W z&P_jdbIu5LB!1l`U7^_0%QF8dWmZZO-dAk-D9%Yq!3(3EFNWG^r7Y8y&T2(*WT1c- z$3mDI>6kmlluybj%e*QF2Jt$nDM{I;l#0n$3@8pSR7IV}7SMOWWQvCVU|pkrYNBCj zHZ4VTs3_@q%G6BuU7vC_8fT=awRp>QatQR0Hb%%!QsO!p2|uK>RLRU!=T%c+o$ zqW5G*7sd=qH?s$Lh5<;=#>56J29OiyA2#T*nHX?NiW$7zG#E7lJp;a9FiI`UoP?O= zX(FiORFrWjF&?EapskBHA|+)GRF!Yw*MRwhKo@g1Rk6+stQC*bfoBOx4}!T0SzVcI zvkoh4k3yj7cH56h?b_8KKSNF$=is!qJ%x)yl|O$JWe$pJT@SCm64=ziDZ9|I>RSX( zpN`8u78`f4wiUν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 + +#include +#include "rbffi.h" + +#include "Type.h" +#include "MappedType.h" + + +VALUE rbffi_DataConverterClass = Qnil; +static ID id_native_type_ivar; + +/* + * Get native type. + * @overload native_type(type) + * @param [String, Symbol, Type] type + * @return [Type] + * Get native type from +type+. + * @overload native_type + * @raise {NotImplementedError} This method must be overriden. + */ +static VALUE +conv_native_type(int argc, VALUE* argv, VALUE self) +{ + if (argc == 0) { + if (!rb_ivar_defined(self, id_native_type_ivar)) { + rb_raise(rb_eNotImpError, "native_type method not overridden and no native_type set"); + } + + return rb_ivar_get(self, id_native_type_ivar); + + } else if (argc == 1) { + VALUE type = rbffi_Type_Find(argv[0]); + + rb_ivar_set(self, id_native_type_ivar, type); + + return type; + + } else { + rb_raise(rb_eArgError, "incorrect arguments"); + } +} + +/* + * call-seq: to_native(value, ctx) + * @param value + * @param ctx + * @return [value] + * Convert to a native type. + */ +static VALUE +conv_to_native(VALUE self, VALUE value, VALUE ctx) +{ + return value; +} + +/* + * call-seq: from_native(value, ctx) + * @param value + * @param ctx + * @return [value] + * Convert from a native type. + */ +static VALUE +conv_from_native(VALUE self, VALUE value, VALUE ctx) +{ + return value; +} + + + +void +rbffi_DataConverter_Init(VALUE moduleFFI) +{ + /* + * Document-module: FFI::DataConverter + * This module is used to extend somes classes and give then a common API. + * + * Most of methods defined here must be overriden. + */ + rbffi_DataConverterClass = rb_define_module_under(moduleFFI, "DataConverter"); + + rb_define_method(rbffi_DataConverterClass, "native_type", conv_native_type, -1); + rb_define_method(rbffi_DataConverterClass, "to_native", conv_to_native, 2); + rb_define_method(rbffi_DataConverterClass, "from_native", conv_from_native, 2); + + id_native_type_ivar = rb_intern("@native_type"); +} + + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DataConverter.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DataConverter.o new file mode 100644 index 0000000000000000000000000000000000000000..77f33258522ef88d0ea29c826a2ea048a2541c80 GIT binary patch literal 17436 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 WcjshF^07!m&d94)bFuF`7yAc!{|vnV literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.c new file mode 100644 index 0000000..4a2ea38 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.c @@ -0,0 +1,339 @@ +/* + * Copyright (c) 2008-2010 Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#include +#include +#ifndef _MSC_VER +# include +#endif +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) +# include +# define _WINSOCKAPI_ +# include +# include +#else +# include +#endif +#include +#if defined(_MSC_VER) && !defined(INT8_MIN) +# include "win32/stdint.h" +#endif + +#include + +#include "rbffi.h" +#include "compat.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "DynamicLibrary.h" + +typedef struct LibrarySymbol_ { + Pointer base; + VALUE library; + VALUE name; +} LibrarySymbol; + +static VALUE library_initialize(VALUE self, VALUE libname, VALUE libflags); +static void library_free(Library* lib); + + +static VALUE symbol_allocate(VALUE klass); +static VALUE symbol_new(VALUE library, void* address, VALUE name); +static void symbol_mark(LibrarySymbol* sym); + +static VALUE LibraryClass = Qnil, SymbolClass = Qnil; + +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) +static void* dl_open(const char* name, int flags); +static void dl_error(char* buf, int size); +#define dl_sym(handle, name) GetProcAddress(handle, name) +#define dl_close(handle) FreeLibrary(handle) +#else +# define dl_open(name, flags) dlopen(name, flags != 0 ? flags : RTLD_LAZY) +# define dl_error(buf, size) do { snprintf(buf, size, "%s", dlerror()); } while(0) +# define dl_sym(handle, name) dlsym(handle, name) +# define dl_close(handle) dlclose(handle) +#endif + +static VALUE +library_allocate(VALUE klass) +{ + Library* library; + return Data_Make_Struct(klass, Library, NULL, library_free, library); +} + +/* + * call-seq: DynamicLibrary.open(libname, libflags) + * @param libname (see #initialize) + * @param libflags (see #initialize) + * @return [FFI::DynamicLibrary] + * @raise {LoadError} if +libname+ cannot be opened + * Open a library. + */ +static VALUE +library_open(VALUE klass, VALUE libname, VALUE libflags) +{ + return library_initialize(library_allocate(klass), libname, libflags); +} + +/* + * call-seq: initialize(libname, libflags) + * @param [String] libname name of library to open + * @param [Fixnum] libflags flags for library to open + * @return [FFI::DynamicLibrary] + * @raise {LoadError} if +libname+ cannot be opened + * A new DynamicLibrary instance. + */ +static VALUE +library_initialize(VALUE self, VALUE libname, VALUE libflags) +{ + Library* library; + int flags; + + Check_Type(libflags, T_FIXNUM); + + Data_Get_Struct(self, Library, library); + flags = libflags != Qnil ? NUM2UINT(libflags) : 0; + + library->handle = dl_open(libname != Qnil ? StringValueCStr(libname) : NULL, flags); + if (library->handle == NULL) { + char errmsg[1024]; + dl_error(errmsg, sizeof(errmsg)); + rb_raise(rb_eLoadError, "Could not open library '%s': %s", + libname != Qnil ? StringValueCStr(libname) : "[current process]", + errmsg); + } +#ifdef __CYGWIN__ + // On Cygwin 1.7.17 "dlsym(dlopen(0,0), 'getpid')" fails. (dlerror: "No such process") + // As a workaround we can use "dlsym(RTLD_DEFAULT, 'getpid')" instead. + // Since 0 == RTLD_DEFAULT we won't call dl_close later. + if (libname == Qnil) { + dl_close(library->handle); + library->handle = RTLD_DEFAULT; + } +#endif + rb_iv_set(self, "@name", libname != Qnil ? libname : rb_str_new2("[current process]")); + return self; +} + +static VALUE +library_dlsym(VALUE self, VALUE name) +{ + Library* library; + void* address = NULL; + Check_Type(name, T_STRING); + + Data_Get_Struct(self, Library, library); + address = dl_sym(library->handle, StringValueCStr(name)); + + return address != NULL ? symbol_new(self, address, name) : Qnil; +} + +/* + * call-seq: last_error + * @return [String] library's last error string + */ +static VALUE +library_dlerror(VALUE self) +{ + char errmsg[1024]; + dl_error(errmsg, sizeof(errmsg)); + return rb_tainted_str_new2(errmsg); +} + +static void +library_free(Library* library) +{ + /* dlclose() on MacOS tends to segfault - avoid it */ +#ifndef __APPLE__ + if (library->handle != NULL) { + dl_close(library->handle); + } +#endif + xfree(library); +} + +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) +static void* +dl_open(const char* name, int flags) +{ + if (name == NULL) { + return GetModuleHandle(NULL); + } else { + DWORD dwFlags = PathIsRelativeA(name) ? 0 : LOAD_WITH_ALTERED_SEARCH_PATH; + return LoadLibraryExA(name, NULL, dwFlags); + } +} + +static void +dl_error(char* buf, int size) +{ + FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), + 0, buf, size, NULL); +} +#endif + +static VALUE +symbol_allocate(VALUE klass) +{ + LibrarySymbol* sym; + VALUE obj = Data_Make_Struct(klass, LibrarySymbol, NULL, -1, sym); + sym->name = Qnil; + sym->library = Qnil; + sym->base.rbParent = Qnil; + + return obj; +} + + +/* + * call-seq: initialize_copy(other) + * @param [Object] other + * @return [nil] + * DO NOT CALL THIS METHOD + */ +static VALUE +symbol_initialize_copy(VALUE self, VALUE other) +{ + rb_raise(rb_eRuntimeError, "cannot duplicate symbol"); + return Qnil; +} + +static VALUE +symbol_new(VALUE library, void* address, VALUE name) +{ + LibrarySymbol* sym; + VALUE obj = Data_Make_Struct(SymbolClass, LibrarySymbol, symbol_mark, -1, sym); + + sym->base.memory.address = address; + sym->base.memory.size = LONG_MAX; + sym->base.memory.typeSize = 1; + sym->base.memory.flags = MEM_RD | MEM_WR; + sym->library = library; + sym->name = name; + + return obj; +} + +static void +symbol_mark(LibrarySymbol* sym) +{ + rb_gc_mark(sym->library); + rb_gc_mark(sym->name); +} + +/* + * call-seq: inspect + * @return [String] + * Inspect. + */ +static VALUE +symbol_inspect(VALUE self) +{ + LibrarySymbol* sym; + char buf[256]; + + Data_Get_Struct(self, LibrarySymbol, sym); + snprintf(buf, sizeof(buf), "#", + StringValueCStr(sym->name), sym->base.memory.address); + return rb_str_new2(buf); +} + +void +rbffi_DynamicLibrary_Init(VALUE moduleFFI) +{ + /* + * Document-class: FFI::DynamicLibrary + */ + LibraryClass = rb_define_class_under(moduleFFI, "DynamicLibrary", rb_cObject); + rb_global_variable(&LibraryClass); + /* + * Document-class: FFI::DynamicLibrary::Symbol < FFI::Pointer + * + * An instance of this class represents a library symbol. It may be a {Pointer pointer} to + * a function or to a variable. + */ + SymbolClass = rb_define_class_under(LibraryClass, "Symbol", rbffi_PointerClass); + rb_global_variable(&SymbolClass); + + /* + * Document-const: FFI::NativeLibrary + * Backward compatibility for FFI::DynamicLibrary + */ + rb_define_const(moduleFFI, "NativeLibrary", LibraryClass); /* backwards compat library */ + rb_define_alloc_func(LibraryClass, library_allocate); + rb_define_singleton_method(LibraryClass, "open", library_open, 2); + rb_define_singleton_method(LibraryClass, "last_error", library_dlerror, 0); + rb_define_method(LibraryClass, "initialize", library_initialize, 2); + /* + * Document-method: find_symbol + * call-seq: find_symbol(name) + * @param [String] name library symbol's name + * @return [FFI::DynamicLibrary::Symbol] library symbol + */ + rb_define_method(LibraryClass, "find_symbol", library_dlsym, 1); + /* + * Document-method: find_function + * call-seq: find_function(name) + * @param [String] name library function's name + * @return [FFI::DynamicLibrary::Symbol] library function symbol + */ + rb_define_method(LibraryClass, "find_function", library_dlsym, 1); + /* + * Document-method: find_variable + * call-seq: find_variable(name) + * @param [String] name library variable's name + * @return [FFI::DynamicLibrary::Symbol] library variable symbol + */ + rb_define_method(LibraryClass, "find_variable", library_dlsym, 1); + rb_define_method(LibraryClass, "last_error", library_dlerror, 0); + rb_define_attr(LibraryClass, "name", 1, 0); + + rb_define_alloc_func(SymbolClass, symbol_allocate); + rb_undef_method(SymbolClass, "new"); + rb_define_method(SymbolClass, "inspect", symbol_inspect, 0); + rb_define_method(SymbolClass, "initialize_copy", symbol_initialize_copy, 1); + +#define DEF(x) rb_define_const(LibraryClass, "RTLD_" #x, UINT2NUM(RTLD_##x)) + DEF(LAZY); + DEF(NOW); + DEF(GLOBAL); + DEF(LOCAL); + DEF(NOLOAD); + DEF(NODELETE); + DEF(FIRST); + DEF(DEEPBIND); + DEF(MEMBER); + DEF(BINDING_MASK); + DEF(LOCATION_MASK); + DEF(ALL_MASK); +#undef DEF + +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.h new file mode 100644 index 0000000..97bf7bc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2008-2010 Wayne Meissner + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef _LIBRARY_H +#define _LIBRARY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* if these aren't defined (eg. windows), we need sensible defaults */ +#ifndef RTLD_LAZY +#define RTLD_LAZY 1 +#endif + +#ifndef RTLD_NOW +#define RTLD_NOW 2 +#endif + +#ifndef RTLD_LOCAL +#define RTLD_LOCAL 4 +#endif + +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 8 +#endif + +/* If these aren't defined, they're not supported so define as 0 */ +#ifndef RTLD_NOLOAD +#define RTLD_NOLOAD 0 +#endif + +#ifndef RTLD_NODELETE +#define RTLD_NODELETE 0 +#endif + +#ifndef RTLD_FIRST +#define RTLD_FIRST 0 +#endif + +#ifndef RTLD_DEEPBIND +#define RTLD_DEEPBIND 0 +#endif + +#ifndef RTLD_MEMBER +#define RTLD_MEMBER 0 +#endif + +/* convenience */ +#ifndef RTLD_BINDING_MASK +#define RTLD_BINDING_MASK (RTLD_LAZY | RTLD_NOW) +#endif + +#ifndef RTLD_LOCATION_MASK +#define RTLD_LOCATION_MASK (RTLD_LOCAL | RTLD_GLOBAL) +#endif + +#ifndef RTLD_ALL_MASK +#define RTLD_ALL_MASK (RTLD_BINDING_MASK | RTLD_LOCATION_MASK | RTLD_NOLOAD | RTLD_NODELETE | RTLD_FIRST | RTLD_DEEPBIND | RTLD_MEMBER) +#endif + +typedef struct Library { + void* handle; +} Library; + +extern void rbffi_DynamicLibrary_Init(VALUE ffiModule); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBRARY_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.o new file mode 100644 index 0000000000000000000000000000000000000000..9adf4fd7a7cc4808011112ff5f6bd9bd4f92a147 GIT binary patch literal 33844 zcmeHv3wTt;+5g$gIV>a_mRm?5fd#@t@nDVZB<(Rnks&x_10pW|L-?v=Hz4()bDw||Mz_T zo=kG)o%c8Iyz|bSIdkTmGw(k6uLllkn&xz9+5k|OrujhTor5S9hs4T|oHa{gApN1g z2l{)UzX$qzpuY$Dd!WAu`g@?i2l{)UzX$qzpuY$Dd*I)x2cG%IyZ^#Nz5@^b8r}hD zZX7-Xksk*_CXO3*k?b>aO*P@^EQ6qUzBu49gdjpV9F1&?nrV}-EUKyO=2hxPQjgL% zD__%YV5VE!rDRCM;ikrDq_wuGV2*&p;hy^Ll6v?ygW(Ol&0yP9NK*+(!{NHNXlrBh zdW-L=?;)x0+w3HS<9s_}3r<^_$#A&7Hd@;ahQmt&m4R-4gU3uO`)-6mJO?KW&=*-3 zTOWpzLInC&1y&YY;@hOY$?{x%Ke>T;$72a2q4YJi)b*)vzt@yrF5CUgFnei{?o(gw zx^=CQE!5xBzISE$b+T0Us4u6lvALmzlF9m3q?_e0f2OXCrnJXPwA7xMf+lXwVO9LMZ(Rsn`mCI_WoMh_pDTS z;tTCF^|h?qC{A#)eK(CY+m$1m_v?vPJ5?g7y*B$c*VZNL`(={8_r9dQ==RNhw)f9c z-y&(nut~}+izeAu*RlzAMZ>Y?t&Pp~;c#e)C5gn8@g{ek?7x~R=Jj?EZ#7fQtR#Jr z4dI4XoDDNGd49QE_WvtV-~E^eU8bmrp>uY{yR_h*LS3nt4=XXyJws8 zGPoZ0@w|z-!#hX_GLz#z74p+S51yuJcL8ME`1Y28Qx*@J%*#7z$OHM}P!){76<8Ih zt|$w}PXs%3mI!wEf{EGR#!S&E*tm%%7Lqfe4w3F5zx#9LM+i-c+3O$`jKAJPO9E|7 zQk}Tu@dx=nDb}q6*rbPu$gyJ8E;{UKq!2a~lQGjfx$QE7pGj?Dw{%Vqf zV`%nCvR*$))=5k`1n~!0Nx>6IbpY$pG8lF}gp;H$10?&Rmxi|PJYj57(RxW$Ppv_5oG6aqjnuMnaytf|5N$`(w^M8Q%iX=Vn z5$7T&34fdTndpdM`(e+Tz}i6g+`mFfVN9@N zU~qov@z|i??!(l$=G;ew8g;z}ssfd)ErSZALxGjV zi?raLhoV)%j_X)gu>BvN*zjOt;X(BDq3&T6{}l%I?Z8ykHcRIhJsYbG#gC(*Y|NU# zIe~M<`7s+DjI-ZP=b1}9_-uE-nKr2jDlF4VZLwYGJ;R5Z2O^p{sv<5CM+RQ>C-4JW8i#E12n>kx*TN`WFHAOToEN^ zx5S$2{mm^=KRd(UWOkQ-^2D~u^ZdwPQx|J(jWkF7n_FAzB5iHwYKugZCoCu~E}1t^ z_T;>IX8-z`w{T*czqY=<719eQZazb+t8J$K`q<{C#=6>Q#4o$G=lN3SEx^^WKNPAi z^>2x^wxP%Ur{_)2o9>@d*Muc~?&;IP$FXliQNIwNm=V{}7oU0!2Lez>i*E`Lj;xxS?}e_gD(zA2L58e6wLe@5QS zyy^MtBb(at8yXsO3-V6SE0~*)M_RJsI!(5CF@{Z>Rvidc6=_W^&FlTK=C;Q5&5?S4 zV{=rFHdBUL!yFqJSr`({ZP7MuWmVzoaCt**Q(Hu)qpdNOY;J6lAk2z1nCX(z(xN3L zfyyFz9;u+Xq-J?lX}CBPSZWFthgJ|UPri^afo_S4)un|iLbf6mWkrii0-KwiGO0 zQCb!%s!?TDiVJ~PnpxNK5-W+Cx(yG6DlEqAFjd0ram7_FUs6=8m=auuD-^SQ#S%+H zNsm4{dqrtsiIpeLRF9D(Ok;z>#Z}7}tI?)yz>vmlvvLXFHLR;`Ypl~&77EhPRJ*=S zJ6{aP`c1X1=WF#1t&xZ(-b#p($pI-xt(*mWaAE3;Xk{&si?nK+BAZ$;Uk29U1q7b5 zO8a8Nn!LWXx(&6hS{o-!*1|DUL8f(GSuJM`tu5NpTDv}?)y9yBG(}ibxUdB?aV;)L z&Ia{blboW(ywbXkms!sXJ6wW!S&4;JLD53KCW+x$5Kq6BfH|w1O2gyJXf=-6AS^Bi5)44sGo>WpV&li6&$wx?`p2NlQ_s zN=~#Cg;jF7gk0K|$G0jbV#$^NC8*q2J5o8{JT{ z?)Rk5ftJYHWRYB%b*&|Gj;gD>pST^ZM^ITKt*)$6$@?s*S6!;qa7(08B~P)SvNL6J zt)xzE%Xun&yCoJ@N%2$+<0#g{Mlee2*;cV$HdV>2dn}P&m!}d@HTH1@_hDbMEjwfd z-CBB$^e-W@yO)-g$rXLSmq@Qht3G?qYILtlN@cxmiS#n}ONhKEOLuGOWv-nuhtnInu;v z+6X0904AMzOpKhRkz}L@9r#F=2W!~@lQT<(L5&~vj?!T?F{&BOE>lca3hu<&N^y^Z znl{F&Ulbgh?I;*VLu*o2L#cn3v|t<(rs+a#yfgsqund?W4bW*o4hwdhFww5|zCvi8 z)WaU7N7E)-6$w34EIopqYSV+0F|CIZ^oHotQydPOaOya8{ArNN3gx=SBTxlGl+HLkBAN99mE5SPZ4_zH(n$SG=?G`WcU%M z7^fmmHRdAr8byfHj7r3Vje5jGj26U0jSCSEGcHFw+_)a`2;%_abmPZ}M;V6@k2an} zoMpU%INSIS#A7x02OtC71I|ayT}V3G+@8%y4;-`=v6kXtTU?hTO2aMMwK|o=<67lS z2c?Ls20TA@rey<};#le)JOPQLKpa80NAoQJN9~Rhx6fCom}Tw^Ul0scIL>nWwINf% z`5YTu9^Z7NcxD_}NcrY~F=*IEmq!~)*j)-p_jpDEb&W?<4c@sRwH{=VbFQ}ybOm7N z>6-Tgq{T^|H{JUWm7YIWbDa%=Z2`vL1SHSeQRR-cvOeH!UM6QAw( zzJ&D0OwXC(?NsU0rfRO+0bT~ceOl`EAQ|p*?{`62&b?Ce-i>q$(-j^soA(~ml|Jt; zRJv-o=IJDOClJHoz8^$)yZ;2@bl{?p0j#6Ci=fvroY=d#D3E3wwGryW62I>_s#ilS zogcj;NQ~T!D8r42fkj7NB$&)hYN!(ZJ&K)erbn~qoU69s^kj{mMv)p(hnAfobjVAjLSkV}horyCg8Y9@8pMd3Ab;fvJ&8~~G>&7mCMzywOr#rW&UkQ;Cz*>e{ zzMc;THa~0Hyi?e$W$vaiZ_yaXC~-1GdK5>M^DUY;iUZn|7|ljGJ1IQ+t4#idvxhu! z0>%}u7PXxJ9MxA*>>ANljyus-lN|%KLbYIXegalhdL1h@8+WbMIJI!)D|zRQ=~qHn zG;ZSi(61JoA!gp>NWT==KXIhL2r-_Z^iPo(hJ^nNz__Jp{#qoaB9WmAPe5V+XrQx! zB4n#I;dC&L>YI_{{IzJu_mC6=P_Q|?G(^8V&DUIO)cg4QP)xZTb8?H%tsIqL*)*h zA8ndi%#9O5M=A8tm<-$_g@GT@KJ65q{Zkuwow&8!!O-9tV8f^leMY>Bdi;FFv@X{0i@m-$KuuICy_f zg)vz;PQ|eRM+nC`IGS)=gyX9?zKP>591r2(915cSlYM}|DT4Oj2l_R1!u@8mv|E5t zj-SdIIO&jggEDabBOhmB1fD_iFU#_rQpi_Jc@9_dgJeF>9QncQBm|x$^0Oq*S%Caq zu!(^~k$kf(FJ^D>IjH{`X#+29$`r~nk0MQ8z4lP&lNbX(-7%2o`Q*9zugLJ64#gpE zNT4)>dR&^0@xaxasT*dAu|Ro_TaE*cCm#;~=wnyDdHL^Vyz}^zcZ@ok^Xl|nm!}-h z|3lh?7tKCV@XY((!K;6M;WhbVp80m(+_dxBHeT`6*B1QbF6Wxf1>@iRiE(v2tImJj zMca1|_{|@n>pdLwQyYOJA4egMDjXYdT!>>Ij$3hXEp`OQt2o}p!HpB6aOC3P8iNpT z+Bu*ITnQ06h=WZ*5Gy9oFmSogi0dPi5z>ITa+0@i-qKl~_Xw$yw|7EZQbf&055SKp^;_8DCmoU;6vET*72}MF&;8Lmqhit?LC_tzNk*u*=>f#bh z7Q9|UTyj`qf40xL~E`*yeNiQU`dhf|Wciyy?{Z!JLZK+EELn`Sv;&dyV3DeV_YE7v+}V znEtvcC(nas$svz{a!ok=QjW_*5tP2g?e2Xzmz28}$22L&fhdBK3$}|hek#CU;MgGL zxIz;_$(6Ma_^Oc*HWH`aV>qsS!?g2mf(%OD)}G_;y-wK0%%I8LN_ z5sR@+KA+z}`Kc5iKil$a>RRd}dDxVfzqkcoXquyK`AZ^OB2Dru>lknIylM8{oFKw4UFVzY^ao z^TdWY^7+-~N7y!g7|oBhwdOZA*EPlJ&99}o=GRhwHq`Po@%b=s1FxZ;A8_*O*a=D4 z2F^V_KQo~$F!?3QWHdZX4+LliSHkJgmk#=kKHRujANqi<8!ziq!+OAo>ceiq#Dywxn@TKJiG?CD+;~FJQHE!_NQ{u`(k<#aiy4Mz zt0&giAKuPfw$nM@p{EWCA?@`nK+4tjI9HsmG!OPkxz6zTb-WI8I|g~K0dX0Z=&6Q> zW_zNp-|f6v*9_O+v>II>Y(isM8*U92$C8-(>O~XXe`jj7%pF)J_#K)W|=+@dCojxgUhqP@Vu-K1mbXg z#j^~Q_6#*VSL>Pk^&!S3uCASV`UH``+u>PeiW+!d>>B2Y!bVRcN**03O&sjHbqkd^ zjDt99ub^QI^tt5opv(1?woD)6oG@G;y-*+fvYr*whsN~5XBn=mcP=x{Fl3fOr`YUnB9$ zCB9qY7f5`w#2Y2fz3|jiBk^*HFO&EpiJva<84{l&@o^I8;+A@R5|ZzQP6FO*zcP`X-^|j;Oh{L0e&thOwO*B zbOk8hW90Igf%1z$Cu6*y4vLV?wHV9g3RcTT-!o+6niS>eV!?8J5F3hev(fqN5}%~6 zpmWGSC@JSF^5v4INcsUfiTJ&e-Y6;O8RGI`*Z4U)i@bO*2dYc{7>p2dl3pPxuUq1L zF-ZC^bQbAa*o&eDwy+C|HVS+ZGMVp}lnnVdWd1{v-XiHPNzapXk)(b}K}7jnsb@R* zG*qm|d2FGVS?+BzZpm+VeM|q@6#Sl+XFi zo_|>q|NW%$(~`>Ln(R@2ZBqGyB%as3y}p4-{GKHKcoM%dslI7R{L4x5>LD9qB77^! zo<9La5i4-su=Ax!@|Pv$U!7DRKN#7|YjWplxO-cYxsfQ$ZA=mDM~#>}2{i)Eu}w2# z+t^-gY9RF92?MVRO47o$@re`mN(`U2E4C6-HLZnxl=IB1K{!mq0=- zwe{Vs>JV;$gHupFc1J;h*ac=O?8%vXxx!%>SzC90xNgJw;f7l5x>Q{w_GYoB^>tyH z7MnPmH^Xr-+R$xh_xb6@ti54MTQ>lWt+kEZ0*6%Hh6w5wd%HwcO)cxNLDbq<92R>q zw}~xdRx?b_Zuk0FZEL;IC%d5yecBX>wls$~MWP#8%sjD?)DB2tn+W#{s@-uH2$Stv z1rX*Q=pN@1{TFSlv#x{wM1K$T_dtIS^!LF3z8-km^#2!2TCO#){MC*#@|$aqZA|wO zuAG1mOj!Su;&DP8e9mC_GQR#-;@N`b8NP{!`}>%%`S^d4KR(Oz!^utNcPN$?0ZS$; ze31|SEIh>GUt5Hi4)$`E0wk25Jl7!%$$q;FpkN`|5rmGUV5w9(PUdUB9cAB#^d3B< zC52u(PUc^~5uMNX3S02tnG|~IIGIoV3#h*sC-ZeYbTWkU#B(x}y>y(+k3LiS^-ttO zXwT3~$H{!>se@zj^L5z#(IK0BUPeL3F({ezxptU3u;X7WR+4oXczKrt-9yLqYzR18 zTWogp;TJzm>X`E-ba2tv)<;{GL&qZ2c=qS&*lc=gP=U}=m zS1IwUO!2Ono!^!6`=(Le0r~RIYXp{>*vn10T{Fv8b?y>~C$aYjXjmDFwV1_z$zDn9 zeF`M8?>0!UDl12BxtUw=P-348y_vZFc4U>6uSC`yGb^z-%#3~aT4l0jnXaXY>yKhu zPwah&c`I3)LlycBp~ODsmouXi9-M6L-dB?{o-s2Dx>hCj(uA_aUSR{u+@s2LvP{7f z0io$;fue=&==-w7A$CXCX`PoT_+1E>0obBSb8kdq-}`_Io?nSppVqlXW#s`(?EAaO zDm3%X6nW^mR)b3+G3dt$S(SF!n-FZ+Xd>w=5mwp%3r2Mf+JOPp`BPJmm@~Ldt*jiTS9jiG!X2_j^NWth zD&og?A7=B#S?t^iiH--UF>&Q=pox3w^>6iRSSq+IgJ)oF`-8O19UImm`YW-E^}jQ+ zb1ucYTQyadN(jC2xe%%@!z4BYc+cr>4X3-J)I{uf++ZK;Wu3?V!7f1`uj)K1lD>|m zK2&`So&KzuhaP&&%!)s@=i_LgW5@ACdo!+%ja_9MbGq)Hk3rUXKo$=A;sr+nZcH^7 z9|@##raltzKtSuL^2E!t;@kc3T8D)geyO&Ry|D|!Ifuh}jird6rnGpupT)|3Fj5Rw z%-*|?QL!AYXwl8T#2fbx7e){pg_ewzIxhAlmip0@vQAwfnBvEBlD(Hc>s_a@-=V0w z^DlpACk(Idd`%>L9Vz^og_PZgS&w<<4kO2Y5q4Z&fl4_lcJY%+Syw^lt)j38Qs@5l zI#ay53AVCGejtF!twPeh_S{E$ei-j}RsUby*3$Zrqk2Zo;9f0K{;zn_0Pz7vSgJM1WY4H6Gq+bo}S z+vf-ARsKKkwQhQ=p#WK*Qv!km`g<<|NA8DC5bt#$37u41ZxNsRj;4y z7#|BopeiY6Rl#k(gHYC{jv|{(b(R?Uw}n`R(ng3o^&DFH2@v`)yR=y6Rwe>Cpz%2n z{8KOIMLP%Nl5i<2!kgY1E>l{l;J)~=WKt%BW}o9u)1$UIX?X4)lwvlk6;r0XhwYC2YB5`Ac-{U{%6~Swn>~ z=bLgCMxJjg?FPVawBNDT^uPUl$6C6ZQespe9=4;gN3Ywd*6v}Ooq}cem}F;E;TbE2 zx7`)iZ*yVA3#Dj0VI`<0}M(f30C~ ztBT9G2{AULBF3gD#7^UB#A(Lsh&|c>nk>93;7ofi(gO!^hd7*RH-flgi1;(gaHb`3 z!{pG zJaDFU`z9d8GbWsA>4fn&3T*D!oV_pX<67Yntko8VmeFs_QiYh$?Bm_z9*Zh>{y6CPWK zNE9~N6=3m$0xEYtSg*zUY1lDoiL+rG&C5`H=2pm>mT6Kxrw8HWU!mVw;vycjNE@94or^p$@Wy&QS zVpa6^bhe6mK2!CW?2o~UCYkKbU`3MzJ8?Wp^F%shJbh;8McH}&;n2uEa@_v~PujnN zj01$o>9Jd(Nc6DDE&^-%)-reE zx4?=DuVaN~Q?Ip}$~D#yh{3P+3S^s2rC%-AP-id$KDBgc6t1+K_vlKS`Bx-(7BfFX zLb%dW9-oG^%$I;jH`*~=Jmms(RNX^!e=W=%jAn_kC)kN|z>20nEzB(eE1Lflo1by5 zR6B73I5Dn;7?zk^OYIc84^y{8Tu;N#ftctElb=G@S-R6=GyhzSx2f$)y~{!U(|EeM z0uy}zw^?o*6rG@r;hJiasNe-w@R~6GUZvk;Zw1SrkuY<$Q@G~BZe=w1ZI-!X>=O_$ z-DTP3+9_Os zC3W%UNQg@v32~)Ch|3jei&)ULl5;5|SEu5AKo zo;}V&uU@=Yzs%k4vPPa-_o#eTPAyjyUbxpyuVZmXxPQRXKILQMl5pt|WE0Q27d1cLaswV~hyuMxgM*y)NwrahCf1EwR7J`dQDD z_*?QB3)7eBYw5{>+g=0w?%|5!~8K#^o z=>qD4TO@odf2e1+!yhu*)3-8D`c``I@(#|GXxSjo*MxJWG@8zpG{JPP{0}rWuZMFb z+&n#Z>Z9}Zu`%Uaxt_k2IC-LO_*T|Hb-^X@tvthU{bZ-7K_6_mo&h>^p`HO3*fWrw z&+ah&EZ;Oci++|1bp2;=v3%0(+D~>IWbd0UmUNwclWYjiuKFOj54lVqOP+@X@Ub+h z!)SLJ8n#&M!CfBvc)S-#x*l{Y_%)#8Kr0OGKqi-0_}z!4z?Omk#+Yt?E-EeH^7X!`YX`Vrih7xUD-O&p7+WT-Kt5lA zF#n&pO$5PnZc+Rk$YF8oJr$IC@uEuTnQuakHO@M~=NB@*8T ze3uPxk$3~}s0}|?;^n}_FX_M@>JLhMKJYa*`56+Q2%H;&5QKb|#IasD5U}9`C5~0p zfjKt(V{``Fbqx448~$gB!(a2jI2-<~#NkhNV5ALy5ICNxy>|g0V8d?*&wHn`?^Y>y z9q=w2juq7b-h-9gUdT;?zMa5N*yOm1!?sf|_I+5_1^a0|c;4GpdHQ!^CFCs!{;{om zP}aW)xcq@0(Ql`N=h{P+r=K3%lLMS<3WaBb=Tz5CCQA^nl0H%hu(Qu8|texnd$ zgK~eA^oNr21q5;FU+R7Z=bHSlB>jP;{H-nGN6q=e{ToStA?X%LXGl6i(hty=EXRHU zD@CTOap$7KF*CA~+|YbA|JS}ExQNx7b-KIv!bW?%D(a5N6)O~%oL zBMru|-}lKh&*8l&n1+MrpLQ|LF@iBF(i~U3eu;A|E|Y1FU;YRZabAOEQl8f{Ac1oZ z7y@0C;e5-Vb7Y$LGVZhG>o$hfpfag(kCaOP4S6a(%O 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. + */ + +#ifndef _MSC_VER +#include +#endif +#include +#ifndef _WIN32 +# include +# include +#endif + +#include +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdbool.h" +# if !defined(INT8_MIN) +# include "win32/stdint.h" +# endif +#endif +#include + +#include +#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) +#include +#endif +#include + +#include "rbffi.h" +#include "compat.h" + +#include "AbstractMemory.h" +#include "Pointer.h" +#include "Struct.h" +#include "Platform.h" +#include "Type.h" +#include "LastError.h" +#include "Call.h" +#include "ClosurePool.h" +#include "MappedType.h" +#include "Thread.h" +#include "LongDouble.h" +#include "MethodHandle.h" +#include "Function.h" + +typedef struct Function_ { + Pointer base; + FunctionType* info; + MethodHandle* methodHandle; + bool autorelease; + Closure* closure; + VALUE rbProc; + VALUE rbFunctionInfo; +} Function; + +static void function_mark(Function *); +static void function_free(Function *); +static VALUE function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc); +static void callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data); +static bool callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize); +static void* callback_with_gvl(void* data); +static VALUE invoke_callback(void* data); +static VALUE save_callback_exception(void* data, VALUE exc); + +#define DEFER_ASYNC_CALLBACK 1 + + +#if defined(DEFER_ASYNC_CALLBACK) +static VALUE async_cb_event(void *); +static VALUE async_cb_call(void *); +#endif + +#ifdef HAVE_RB_THREAD_CALL_WITH_GVL +extern void *rb_thread_call_with_gvl(void *(*func)(void *), void *data1); +#endif + +VALUE rbffi_FunctionClass = Qnil; + +#if defined(DEFER_ASYNC_CALLBACK) +static VALUE async_cb_thread = Qnil; +#endif + +static ID id_call = 0, id_to_native = 0, id_from_native = 0, id_cbtable = 0, id_cb_ref = 0; + +struct gvl_callback { + Closure* closure; + void* retval; + void** parameters; + bool done; + rbffi_frame_t *frame; +#if defined(DEFER_ASYNC_CALLBACK) + struct gvl_callback* next; +# ifndef _WIN32 + pthread_cond_t async_cond; + pthread_mutex_t async_mutex; +# else + HANDLE async_event; +# endif +#endif +}; + + +#if defined(DEFER_ASYNC_CALLBACK) +static struct gvl_callback* async_cb_list = NULL; +# ifndef _WIN32 + static pthread_mutex_t async_cb_mutex = PTHREAD_MUTEX_INITIALIZER; + static pthread_cond_t async_cb_cond = PTHREAD_COND_INITIALIZER; +# if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) + static int async_cb_pipe[2]; +# endif +# else + static HANDLE async_cb_cond; + static CRITICAL_SECTION async_cb_lock; +# if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) + static int async_cb_pipe[2]; +# endif +# endif +#endif + + +static VALUE +function_allocate(VALUE klass) +{ + Function *fn; + VALUE obj; + + obj = Data_Make_Struct(klass, Function, function_mark, function_free, fn); + + fn->base.memory.flags = MEM_RD; + fn->base.rbParent = Qnil; + fn->rbProc = Qnil; + fn->rbFunctionInfo = Qnil; + fn->autorelease = true; + + return obj; +} + +static void +function_mark(Function *fn) +{ + rb_gc_mark(fn->base.rbParent); + rb_gc_mark(fn->rbProc); + rb_gc_mark(fn->rbFunctionInfo); +} + +static void +function_free(Function *fn) +{ + if (fn->methodHandle != NULL) { + rbffi_MethodHandle_Free(fn->methodHandle); + } + + if (fn->closure != NULL && fn->autorelease) { + rbffi_Closure_Free(fn->closure); + } + + xfree(fn); +} + +/* + * @param [Type, Symbol] return_type return type for the function + * @param [Array] param_types array of parameters types + * @param [Hash] options see {FFI::FunctionType} for available options + * @return [self] + * A new Function instance. + * + * Define a function from a Proc or a block. + * + * @overload initialize(return_type, param_types, options = {}) { |i| ... } + * @yieldparam i parameters for the function + * @overload initialize(return_type, param_types, proc, options = {}) + * @param [Proc] proc + */ +static VALUE +function_initialize(int argc, VALUE* argv, VALUE self) +{ + + VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbProc = Qnil, rbOptions = Qnil; + VALUE rbFunctionInfo = Qnil; + VALUE infoArgv[3]; + int nargs; + + nargs = rb_scan_args(argc, argv, "22", &rbReturnType, &rbParamTypes, &rbProc, &rbOptions); + + /* + * Callback with block, + * e.g. Function.new(:int, [ :int ]) { |i| blah } + * or Function.new(:int, [ :int ], { :convention => :stdcall }) { |i| blah } + */ + if (rb_block_given_p()) { + if (nargs > 3) { + rb_raise(rb_eArgError, "cannot create function with both proc/address and block"); + } + rbOptions = rbProc; + rbProc = rb_block_proc(); + } else { + /* Callback with proc, or Function with address + * e.g. Function.new(:int, [ :int ], Proc.new { |i| }) + * Function.new(:int, [ :int ], Proc.new { |i| }, { :convention => :stdcall }) + * Function.new(:int, [ :int ], addr) + * Function.new(:int, [ :int ], addr, { :convention => :stdcall }) + */ + } + + infoArgv[0] = rbReturnType; + infoArgv[1] = rbParamTypes; + infoArgv[2] = rbOptions; + rbFunctionInfo = rb_class_new_instance(rbOptions != Qnil ? 3 : 2, infoArgv, rbffi_FunctionTypeClass); + + function_init(self, rbFunctionInfo, rbProc); + + return self; +} + +/* + * call-seq: initialize_copy(other) + * @return [nil] + * DO NOT CALL THIS METHOD + */ +static VALUE +function_initialize_copy(VALUE self, VALUE other) +{ + rb_raise(rb_eRuntimeError, "cannot duplicate function instances"); + return Qnil; +} + +VALUE +rbffi_Function_NewInstance(VALUE rbFunctionInfo, VALUE rbProc) +{ + return function_init(function_allocate(rbffi_FunctionClass), rbFunctionInfo, rbProc); +} + +VALUE +rbffi_Function_ForProc(VALUE rbFunctionInfo, VALUE proc) +{ + VALUE callback, cbref, cbTable; + Function* fp; + + cbref = RTEST(rb_ivar_defined(proc, id_cb_ref)) ? rb_ivar_get(proc, id_cb_ref) : Qnil; + /* If the first callback reference has the same function function signature, use it */ + if (cbref != Qnil && CLASS_OF(cbref) == rbffi_FunctionClass) { + Data_Get_Struct(cbref, Function, fp); + if (fp->rbFunctionInfo == rbFunctionInfo) { + return cbref; + } + } + + cbTable = RTEST(rb_ivar_defined(proc, id_cbtable)) ? rb_ivar_get(proc, id_cbtable) : Qnil; + if (cbTable != Qnil && (callback = rb_hash_aref(cbTable, rbFunctionInfo)) != Qnil) { + return callback; + } + + /* No existing function for the proc with that signature, create a new one and cache it */ + callback = rbffi_Function_NewInstance(rbFunctionInfo, proc); + if (cbref == Qnil) { + /* If there is no other cb already cached for this proc, we can use the ivar slot */ + rb_ivar_set(proc, id_cb_ref, callback); + } else { + /* The proc instance has been used as more than one type of callback, store extras in a hash */ + cbTable = rb_hash_new(); + rb_ivar_set(proc, id_cbtable, cbTable); + rb_hash_aset(cbTable, rbFunctionInfo, callback); + } + + return callback; +} + +static VALUE +function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc) +{ + Function* fn = NULL; + + Data_Get_Struct(self, Function, fn); + + fn->rbFunctionInfo = rbFunctionInfo; + + Data_Get_Struct(fn->rbFunctionInfo, FunctionType, fn->info); + + if (rb_obj_is_kind_of(rbProc, rbffi_PointerClass)) { + Pointer* orig; + Data_Get_Struct(rbProc, Pointer, orig); + fn->base.memory = orig->memory; + fn->base.rbParent = rbProc; + + } else if (rb_obj_is_kind_of(rbProc, rb_cProc) || rb_respond_to(rbProc, id_call)) { + if (fn->info->closurePool == NULL) { + fn->info->closurePool = rbffi_ClosurePool_New(sizeof(ffi_closure), callback_prep, fn->info); + if (fn->info->closurePool == NULL) { + rb_raise(rb_eNoMemError, "failed to create closure pool"); + } + } + +#if defined(DEFER_ASYNC_CALLBACK) + if (async_cb_thread == Qnil) { +#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) && defined(_WIN32) + _pipe(async_cb_pipe, 1024, O_BINARY); +#elif !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) + pipe(async_cb_pipe); + fcntl(async_cb_pipe[0], F_SETFL, fcntl(async_cb_pipe[0], F_GETFL) | O_NONBLOCK); + fcntl(async_cb_pipe[1], F_SETFL, fcntl(async_cb_pipe[1], F_GETFL) | O_NONBLOCK); +#endif + async_cb_thread = rb_thread_create(async_cb_event, NULL); + } + +#endif + + fn->closure = rbffi_Closure_Alloc(fn->info->closurePool); + fn->closure->info = fn; + fn->base.memory.address = fn->closure->code; + fn->base.memory.size = sizeof(*fn->closure); + fn->autorelease = true; + + } else { + rb_raise(rb_eTypeError, "wrong argument type %s, expected pointer or proc", + rb_obj_classname(rbProc)); + } + + fn->rbProc = rbProc; + + return self; +} + +/* + * call-seq: call(*args) + * @param [Array] args function arguments + * @return [FFI::Type] + * Call the function + */ +static VALUE +function_call(int argc, VALUE* argv, VALUE self) +{ + Function* fn; + + Data_Get_Struct(self, Function, fn); + + return (*fn->info->invoke)(argc, argv, fn->base.memory.address, fn->info); +} + +/* + * call-seq: attach(m, name) + * @param [Module] m + * @param [String] name + * @return [self] + * Attach a Function to the Module +m+ as +name+. + */ +static VALUE +function_attach(VALUE self, VALUE module, VALUE name) +{ + Function* fn; + char var[1024]; + + Data_Get_Struct(self, Function, fn); + + if (fn->info->parameterCount == -1) { + rb_raise(rb_eRuntimeError, "cannot attach variadic functions"); + return Qnil; + } + + if (!rb_obj_is_kind_of(module, rb_cModule)) { + rb_raise(rb_eRuntimeError, "trying to attach function to non-module"); + return Qnil; + } + + if (fn->methodHandle == NULL) { + fn->methodHandle = rbffi_MethodHandle_Alloc(fn->info, fn->base.memory.address); + } + + /* + * Stash the Function in a module variable so it does not get garbage collected + */ + snprintf(var, sizeof(var), "@@%s", StringValueCStr(name)); + rb_cv_set(module, var, self); + + rb_define_singleton_method(module, StringValueCStr(name), + rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1); + + + rb_define_method(module, StringValueCStr(name), + rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1); + + return self; +} + +/* + * call-seq: autorelease = autorelease + * @param [Boolean] autorelease + * @return [self] + * Set +autorelease+ attribute (See {Pointer}). + */ +static VALUE +function_set_autorelease(VALUE self, VALUE autorelease) +{ + Function* fn; + + Data_Get_Struct(self, Function, fn); + + fn->autorelease = RTEST(autorelease); + + return self; +} + +static VALUE +function_autorelease_p(VALUE self) +{ + Function* fn; + + Data_Get_Struct(self, Function, fn); + + return fn->autorelease ? Qtrue : Qfalse; +} + +/* + * call-seq: free + * @return [self] + * Free memory allocated by Function. + */ +static VALUE +function_release(VALUE self) +{ + Function* fn; + + Data_Get_Struct(self, Function, fn); + + if (fn->closure == NULL) { + rb_raise(rb_eRuntimeError, "cannot free function which was not allocated"); + } + + rbffi_Closure_Free(fn->closure); + fn->closure = NULL; + + return self; +} + +static void +callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data) +{ + struct gvl_callback cb = { 0 }; + + cb.closure = (Closure *) user_data; + cb.retval = retval; + cb.parameters = parameters; + cb.done = false; + cb.frame = rbffi_frame_current(); + + if (cb.frame != NULL) cb.frame->exc = Qnil; + if (cb.frame != NULL && cb.frame->has_gvl) { + callback_with_gvl(&cb); + +#if defined(HAVE_RB_THREAD_CALL_WITH_GVL) + } else if (cb.frame != NULL) { + rb_thread_call_with_gvl(callback_with_gvl, &cb); +#endif +#if defined(DEFER_ASYNC_CALLBACK) && !defined(_WIN32) + } else { + bool empty = false; + + pthread_mutex_init(&cb.async_mutex, NULL); + pthread_cond_init(&cb.async_cond, NULL); + + /* Now signal the async callback thread */ + pthread_mutex_lock(&async_cb_mutex); + empty = async_cb_list == NULL; + cb.next = async_cb_list; + async_cb_list = &cb; + +#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) + pthread_mutex_unlock(&async_cb_mutex); + /* Only signal if the list was empty */ + if (empty) { + char c; + write(async_cb_pipe[1], &c, 1); + } +#else + pthread_cond_signal(&async_cb_cond); + pthread_mutex_unlock(&async_cb_mutex); +#endif + + /* Wait for the thread executing the ruby callback to signal it is done */ + pthread_mutex_lock(&cb.async_mutex); + while (!cb.done) { + pthread_cond_wait(&cb.async_cond, &cb.async_mutex); + } + pthread_mutex_unlock(&cb.async_mutex); + pthread_cond_destroy(&cb.async_cond); + pthread_mutex_destroy(&cb.async_mutex); + +#elif defined(DEFER_ASYNC_CALLBACK) && defined(_WIN32) + } else { + bool empty = false; + + cb.async_event = CreateEvent(NULL, FALSE, FALSE, NULL); + + /* Now signal the async callback thread */ + EnterCriticalSection(&async_cb_lock); + empty = async_cb_list == NULL; + cb.next = async_cb_list; + async_cb_list = &cb; + LeaveCriticalSection(&async_cb_lock); + +#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) + /* Only signal if the list was empty */ + if (empty) { + char c; + write(async_cb_pipe[1], &c, 1); + } +#else + SetEvent(async_cb_cond); +#endif + + /* Wait for the thread executing the ruby callback to signal it is done */ + WaitForSingleObject(cb.async_event, INFINITE); + CloseHandle(cb.async_event); +#endif + } +} + +#if defined(DEFER_ASYNC_CALLBACK) +struct async_wait { + void* cb; + bool stop; +}; + +static VALUE async_cb_wait(void *); +static void async_cb_stop(void *); + +#if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) +static VALUE +async_cb_event(void* unused) +{ + struct async_wait w = { 0 }; + + w.stop = false; + while (!w.stop) { +#if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) + rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w); +#else + rb_thread_blocking_region(async_cb_wait, &w, async_cb_stop, &w); +#endif + if (w.cb != NULL) { + /* Start up a new ruby thread to run the ruby callback */ + rb_thread_create(async_cb_call, w.cb); + } + } + + return Qnil; +} + +#elif defined(_WIN32) +static VALUE +async_cb_event(void* unused) +{ + while (true) { + struct gvl_callback* cb; + char buf[64]; + fd_set rfds; + + FD_ZERO(&rfds); + FD_SET(async_cb_pipe[0], &rfds); + rb_thread_select(async_cb_pipe[0] + 1, &rfds, NULL, NULL, NULL); + read(async_cb_pipe[0], buf, sizeof(buf)); + + EnterCriticalSection(&async_cb_lock); + cb = async_cb_list; + async_cb_list = NULL; + LeaveCriticalSection(&async_cb_lock); + + while (cb != NULL) { + struct gvl_callback* next = cb->next; + /* Start up a new ruby thread to run the ruby callback */ + rb_thread_create(async_cb_call, cb); + cb = next; + } + } + + return Qnil; +} +#else +static VALUE +async_cb_event(void* unused) +{ + while (true) { + struct gvl_callback* cb; + char buf[64]; + + if (read(async_cb_pipe[0], buf, sizeof(buf)) < 0) { + rb_thread_wait_fd(async_cb_pipe[0]); + while (read(async_cb_pipe[0], buf, sizeof (buf)) < 0) { + if (rb_io_wait_readable(async_cb_pipe[0]) != Qtrue) { + return Qfalse; + } + } + } + + pthread_mutex_lock(&async_cb_mutex); + cb = async_cb_list; + async_cb_list = NULL; + pthread_mutex_unlock(&async_cb_mutex); + + while (cb != NULL) { + struct gvl_callback* next = cb->next; + /* Start up a new ruby thread to run the ruby callback */ + rb_thread_create(async_cb_call, cb); + cb = next; + } + } + + return Qnil; +} +#endif + +#ifdef _WIN32 +static VALUE +async_cb_wait(void *data) +{ + struct async_wait* w = (struct async_wait *) data; + + w->cb = NULL; + + EnterCriticalSection(&async_cb_lock); + + while (!w->stop && async_cb_list == NULL) { + LeaveCriticalSection(&async_cb_lock); + WaitForSingleObject(async_cb_cond, INFINITE); + EnterCriticalSection(&async_cb_lock); + } + + if (async_cb_list != NULL) { + w->cb = async_cb_list; + async_cb_list = async_cb_list->next; + } + + LeaveCriticalSection(&async_cb_lock); + + return Qnil; +} + +static void +async_cb_stop(void *data) +{ + struct async_wait* w = (struct async_wait *) data; + + EnterCriticalSection(&async_cb_lock); + w->stop = true; + LeaveCriticalSection(&async_cb_lock); + SetEvent(async_cb_cond); +} + +#else +static VALUE +async_cb_wait(void *data) +{ + struct async_wait* w = (struct async_wait *) data; + + w->cb = NULL; + + pthread_mutex_lock(&async_cb_mutex); + + while (!w->stop && async_cb_list == NULL) { + pthread_cond_wait(&async_cb_cond, &async_cb_mutex); + } + + if (async_cb_list != NULL) { + w->cb = async_cb_list; + async_cb_list = async_cb_list->next; + } + + pthread_mutex_unlock(&async_cb_mutex); + + return Qnil; +} + +static void +async_cb_stop(void *data) +{ + struct async_wait* w = (struct async_wait *) data; + + pthread_mutex_lock(&async_cb_mutex); + w->stop = true; + pthread_cond_signal(&async_cb_cond); + pthread_mutex_unlock(&async_cb_mutex); +} +#endif + +static VALUE +async_cb_call(void *data) +{ + struct gvl_callback* cb = (struct gvl_callback *) data; + + callback_with_gvl(data); + + /* Signal the original native thread that the ruby code has completed */ +#ifdef _WIN32 + SetEvent(cb->async_event); +#else + pthread_mutex_lock(&cb->async_mutex); + cb->done = true; + pthread_cond_signal(&cb->async_cond); + pthread_mutex_unlock(&cb->async_mutex); +#endif + + return Qnil; +} + +#endif + +static void * +callback_with_gvl(void* data) +{ + rb_rescue2(invoke_callback, (VALUE) data, save_callback_exception, (VALUE) data, rb_eException, (VALUE) 0); + return NULL; +} + +static VALUE +invoke_callback(void* data) +{ + struct gvl_callback* cb = (struct gvl_callback *) data; + + Function* fn = (Function *) cb->closure->info; + FunctionType *cbInfo = fn->info; + Type* returnType = cbInfo->returnType; + void* retval = cb->retval; + void** parameters = cb->parameters; + VALUE* rbParams; + VALUE rbReturnType = cbInfo->rbReturnType; + VALUE rbReturnValue; + int i; + + rbParams = ALLOCA_N(VALUE, cbInfo->parameterCount); + for (i = 0; i < cbInfo->parameterCount; ++i) { + VALUE param; + Type* paramType = cbInfo->parameterTypes[i]; + VALUE rbParamType = rb_ary_entry(cbInfo->rbParameterTypes, i); + + if (unlikely(paramType->nativeType == NATIVE_MAPPED)) { + rbParamType = ((MappedType *) paramType)->rbType; + paramType = ((MappedType *) paramType)->type; + } + + switch (paramType->nativeType) { + case NATIVE_INT8: + param = INT2NUM(*(int8_t *) parameters[i]); + break; + case NATIVE_UINT8: + param = UINT2NUM(*(uint8_t *) parameters[i]); + break; + case NATIVE_INT16: + param = INT2NUM(*(int16_t *) parameters[i]); + break; + case NATIVE_UINT16: + param = UINT2NUM(*(uint16_t *) parameters[i]); + break; + case NATIVE_INT32: + param = INT2NUM(*(int32_t *) parameters[i]); + break; + case NATIVE_UINT32: + param = UINT2NUM(*(uint32_t *) parameters[i]); + break; + case NATIVE_INT64: + param = LL2NUM(*(int64_t *) parameters[i]); + break; + case NATIVE_UINT64: + param = ULL2NUM(*(uint64_t *) parameters[i]); + break; + case NATIVE_LONG: + param = LONG2NUM(*(long *) parameters[i]); + break; + case NATIVE_ULONG: + param = ULONG2NUM(*(unsigned long *) parameters[i]); + break; + case NATIVE_FLOAT32: + param = rb_float_new(*(float *) parameters[i]); + break; + case NATIVE_FLOAT64: + param = rb_float_new(*(double *) parameters[i]); + break; + case NATIVE_LONGDOUBLE: + param = rbffi_longdouble_new(*(long double *) parameters[i]); + break; + case NATIVE_STRING: + param = (*(void **) parameters[i] != NULL) ? rb_tainted_str_new2(*(char **) parameters[i]) : Qnil; + break; + case NATIVE_POINTER: + param = rbffi_Pointer_NewInstance(*(void **) parameters[i]); + break; + case NATIVE_BOOL: + param = (*(uint8_t *) parameters[i]) ? Qtrue : Qfalse; + break; + + case NATIVE_FUNCTION: + case NATIVE_CALLBACK: + case NATIVE_STRUCT: + param = rbffi_NativeValue_ToRuby(paramType, rbParamType, parameters[i]); + break; + + default: + param = Qnil; + break; + } + + /* Convert the native value into a custom ruby value */ + if (unlikely(cbInfo->parameterTypes[i]->nativeType == NATIVE_MAPPED)) { + VALUE values[] = { param, Qnil }; + param = rb_funcall2(((MappedType *) cbInfo->parameterTypes[i])->rbConverter, id_from_native, 2, values); + } + + rbParams[i] = param; + } + + rbReturnValue = rb_funcall2(fn->rbProc, id_call, cbInfo->parameterCount, rbParams); + + if (unlikely(returnType->nativeType == NATIVE_MAPPED)) { + VALUE values[] = { rbReturnValue, Qnil }; + rbReturnValue = rb_funcall2(((MappedType *) returnType)->rbConverter, id_to_native, 2, values); + rbReturnType = ((MappedType *) returnType)->rbType; + returnType = ((MappedType* ) returnType)->type; + } + + if (rbReturnValue == Qnil || TYPE(rbReturnValue) == T_NIL) { + memset(retval, 0, returnType->ffiType->size); + } else switch (returnType->nativeType) { + case NATIVE_INT8: + case NATIVE_INT16: + case NATIVE_INT32: + *((ffi_sarg *) retval) = NUM2INT(rbReturnValue); + break; + case NATIVE_UINT8: + case NATIVE_UINT16: + case NATIVE_UINT32: + *((ffi_arg *) retval) = NUM2UINT(rbReturnValue); + break; + case NATIVE_INT64: + *((int64_t *) retval) = NUM2LL(rbReturnValue); + break; + case NATIVE_UINT64: + *((uint64_t *) retval) = NUM2ULL(rbReturnValue); + break; + case NATIVE_LONG: + *((ffi_sarg *) retval) = NUM2LONG(rbReturnValue); + break; + case NATIVE_ULONG: + *((ffi_arg *) retval) = NUM2ULONG(rbReturnValue); + break; + case NATIVE_FLOAT32: + *((float *) retval) = (float) NUM2DBL(rbReturnValue); + break; + case NATIVE_FLOAT64: + *((double *) retval) = NUM2DBL(rbReturnValue); + break; + case NATIVE_POINTER: + if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) { + *((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address; + } else { + /* Default to returning NULL if not a value pointer object. handles nil case as well */ + *((void **) retval) = NULL; + } + break; + + case NATIVE_BOOL: + *((ffi_arg *) retval) = rbReturnValue == Qtrue; + break; + + case NATIVE_FUNCTION: + case NATIVE_CALLBACK: + if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) { + + *((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address; + + } else if (rb_obj_is_kind_of(rbReturnValue, rb_cProc) || rb_respond_to(rbReturnValue, id_call)) { + VALUE function; + + function = rbffi_Function_ForProc(rbReturnType, rbReturnValue); + + *((void **) retval) = ((AbstractMemory *) DATA_PTR(function))->address; + } else { + *((void **) retval) = NULL; + } + break; + + case NATIVE_STRUCT: + if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_StructClass)) { + AbstractMemory* memory = ((Struct *) DATA_PTR(rbReturnValue))->pointer; + + if (memory->address != NULL) { + memcpy(retval, memory->address, returnType->ffiType->size); + + } else { + memset(retval, 0, returnType->ffiType->size); + } + + } else { + memset(retval, 0, returnType->ffiType->size); + } + break; + + default: + *((ffi_arg *) retval) = 0; + break; + } + + return Qnil; +} + +static VALUE +save_callback_exception(void* data, VALUE exc) +{ + struct gvl_callback* cb = (struct gvl_callback *) data; + + memset(cb->retval, 0, ((Function *) cb->closure->info)->info->returnType->ffiType->size); + if (cb->frame != NULL) cb->frame->exc = exc; + + return Qnil; +} + +static bool +callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) +{ + FunctionType* fnInfo = (FunctionType *) ctx; + ffi_status ffiStatus; + + ffiStatus = ffi_prep_closure(code, &fnInfo->ffi_cif, callback_invoke, closure); + if (ffiStatus != FFI_OK) { + snprintf(errmsg, errmsgsize, "ffi_prep_closure failed. status=%#x", ffiStatus); + return false; + } + + return true; +} + +void +rbffi_Function_Init(VALUE moduleFFI) +{ + rbffi_FunctionInfo_Init(moduleFFI); + /* + * Document-class: FFI::Function < FFI::Pointer + */ + rbffi_FunctionClass = rb_define_class_under(moduleFFI, "Function", rbffi_PointerClass); + + rb_global_variable(&rbffi_FunctionClass); + rb_define_alloc_func(rbffi_FunctionClass, function_allocate); + + rb_define_method(rbffi_FunctionClass, "initialize", function_initialize, -1); + rb_define_method(rbffi_FunctionClass, "initialize_copy", function_initialize_copy, 1); + rb_define_method(rbffi_FunctionClass, "call", function_call, -1); + rb_define_method(rbffi_FunctionClass, "attach", function_attach, 2); + rb_define_method(rbffi_FunctionClass, "free", function_release, 0); + rb_define_method(rbffi_FunctionClass, "autorelease=", function_set_autorelease, 1); + /* + * call-seq: autorelease + * @return [Boolean] + * Get +autorelease+ attribute. + * Synonymous for {#autorelease?}. + */ + rb_define_method(rbffi_FunctionClass, "autorelease", function_autorelease_p, 0); + /* + * call-seq: autorelease? + * @return [Boolean] +autorelease+ attribute + * Get +autorelease+ attribute. + */ + rb_define_method(rbffi_FunctionClass, "autorelease?", function_autorelease_p, 0); + + id_call = rb_intern("call"); + id_cbtable = rb_intern("@__ffi_callback_table__"); + id_cb_ref = rb_intern("@__ffi_callback__"); + id_to_native = rb_intern("to_native"); + id_from_native = rb_intern("from_native"); +#if defined(_WIN32) + InitializeCriticalSection(&async_cb_lock); + async_cb_cond = CreateEvent(NULL, FALSE, FALSE, NULL); +#endif +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Function.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Function.h new file mode 100644 index 0000000..052aaf6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Function.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_FUNCTION_H +#define RBFFI_FUNCTION_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _MSC_VER +# include +#else +# include "win32/stdbool.h" +#endif + +#include + +typedef struct FunctionType_ FunctionType; + +#include "Type.h" +#include "Call.h" +#include "ClosurePool.h" + +struct FunctionType_ { + Type type; /* The native type of a FunctionInfo object */ + VALUE rbReturnType; + VALUE rbParameterTypes; + + Type* returnType; + Type** parameterTypes; + NativeType* nativeParameterTypes; + ffi_type* ffiReturnType; + ffi_type** ffiParameterTypes; + ffi_cif ffi_cif; + Invoker invoke; + ClosurePool* closurePool; + int parameterCount; + int flags; + ffi_abi abi; + int callbackCount; + VALUE* callbackParameters; + VALUE rbEnums; + bool ignoreErrno; + bool blocking; + bool hasStruct; +}; + +extern VALUE rbffi_FunctionTypeClass, rbffi_FunctionClass; + +void rbffi_Function_Init(VALUE moduleFFI); +VALUE rbffi_Function_NewInstance(VALUE functionInfo, VALUE proc); +VALUE rbffi_Function_ForProc(VALUE cbInfo, VALUE proc); +void rbffi_FunctionInfo_Init(VALUE moduleFFI); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_FUNCTION_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Function.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Function.o new file mode 100644 index 0000000000000000000000000000000000000000..a7e0f18dfe1211b4b82d0d35d2443857362dc2ee GIT binary patch literal 85156 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%0A8cEJvh;xon%(xd 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

      PJXCt$EqClc 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 Sx3056;QvWs4CnHb!T8^(5uWD& literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.c new file mode 100644 index 0000000..8085c87 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.c @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * Copyright (C) 2009 Andrea Fazzi + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef _MSC_VER +# include +#endif +#include +#include + +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdbool.h" +#endif + +#include +#include + +#include +#include "rbffi.h" +#include "compat.h" + +#include "AbstractMemory.h" +#include "Types.h" +#include "Type.h" +#include "StructByValue.h" +#include "Function.h" + +static VALUE fntype_allocate(VALUE klass); +static VALUE fntype_initialize(int argc, VALUE* argv, VALUE self); +static void fntype_mark(FunctionType*); +static void fntype_free(FunctionType *); + +VALUE rbffi_FunctionTypeClass = Qnil; + +static VALUE +fntype_allocate(VALUE klass) +{ + FunctionType* fnInfo; + VALUE obj = Data_Make_Struct(klass, FunctionType, fntype_mark, fntype_free, fnInfo); + + fnInfo->type.ffiType = &ffi_type_pointer; + fnInfo->type.nativeType = NATIVE_FUNCTION; + fnInfo->rbReturnType = Qnil; + fnInfo->rbParameterTypes = Qnil; + fnInfo->rbEnums = Qnil; + fnInfo->invoke = rbffi_CallFunction; + fnInfo->closurePool = NULL; + + return obj; +} + +static void +fntype_mark(FunctionType* fnInfo) +{ + rb_gc_mark(fnInfo->rbReturnType); + rb_gc_mark(fnInfo->rbParameterTypes); + rb_gc_mark(fnInfo->rbEnums); + if (fnInfo->callbackCount > 0 && fnInfo->callbackParameters != NULL) { + rb_gc_mark_locations(&fnInfo->callbackParameters[0], &fnInfo->callbackParameters[fnInfo->callbackCount]); + } +} + +static void +fntype_free(FunctionType* fnInfo) +{ + xfree(fnInfo->parameterTypes); + xfree(fnInfo->ffiParameterTypes); + xfree(fnInfo->nativeParameterTypes); + xfree(fnInfo->callbackParameters); + if (fnInfo->closurePool != NULL) { + rbffi_ClosurePool_Free(fnInfo->closurePool); + } + xfree(fnInfo); +} + +/* + * call-seq: initialize(return_type, param_types, options={}) + * @param [Type, Symbol] return_type return type for the function + * @param [Array] param_types array of parameters types + * @param [Hash] options + * @option options [Boolean] :blocking set to true if the C function is a blocking call + * @option options [Symbol] :convention calling convention see {FFI::Library#calling_convention} + * @option options [FFI::Enums] :enums + * @return [self] + * A new FunctionType instance. + */ +static VALUE +fntype_initialize(int argc, VALUE* argv, VALUE self) +{ + FunctionType *fnInfo; + ffi_status status; + VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbOptions = Qnil; + VALUE rbEnums = Qnil, rbConvention = Qnil, rbBlocking = Qnil; +#if defined(X86_WIN32) + VALUE rbConventionStr; +#endif + int i, nargs; + + nargs = rb_scan_args(argc, argv, "21", &rbReturnType, &rbParamTypes, &rbOptions); + if (nargs >= 3 && rbOptions != Qnil) { + rbConvention = rb_hash_aref(rbOptions, ID2SYM(rb_intern("convention"))); + rbEnums = rb_hash_aref(rbOptions, ID2SYM(rb_intern("enums"))); + rbBlocking = rb_hash_aref(rbOptions, ID2SYM(rb_intern("blocking"))); + } + + Check_Type(rbParamTypes, T_ARRAY); + + Data_Get_Struct(self, FunctionType, fnInfo); + fnInfo->parameterCount = (int) RARRAY_LEN(rbParamTypes); + fnInfo->parameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->parameterTypes)); + fnInfo->ffiParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(ffi_type *)); + fnInfo->nativeParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->nativeParameterTypes)); + fnInfo->rbParameterTypes = rb_ary_new2(fnInfo->parameterCount); + fnInfo->rbEnums = rbEnums; + fnInfo->blocking = RTEST(rbBlocking); + fnInfo->hasStruct = false; + + for (i = 0; i < fnInfo->parameterCount; ++i) { + VALUE entry = rb_ary_entry(rbParamTypes, i); + VALUE type = rbffi_Type_Lookup(entry); + + if (!RTEST(type)) { + VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL); + rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName)); + } + + if (rb_obj_is_kind_of(type, rbffi_FunctionTypeClass)) { + REALLOC_N(fnInfo->callbackParameters, VALUE, fnInfo->callbackCount + 1); + fnInfo->callbackParameters[fnInfo->callbackCount++] = type; + } + + if (rb_obj_is_kind_of(type, rbffi_StructByValueClass)) { + fnInfo->hasStruct = true; + } + + rb_ary_push(fnInfo->rbParameterTypes, type); + Data_Get_Struct(type, Type, fnInfo->parameterTypes[i]); + fnInfo->ffiParameterTypes[i] = fnInfo->parameterTypes[i]->ffiType; + fnInfo->nativeParameterTypes[i] = fnInfo->parameterTypes[i]->nativeType; + } + + fnInfo->rbReturnType = rbffi_Type_Lookup(rbReturnType); + if (!RTEST(fnInfo->rbReturnType)) { + VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL); + rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName)); + } + + if (rb_obj_is_kind_of(fnInfo->rbReturnType, rbffi_StructByValueClass)) { + fnInfo->hasStruct = true; + } + + Data_Get_Struct(fnInfo->rbReturnType, Type, fnInfo->returnType); + fnInfo->ffiReturnType = fnInfo->returnType->ffiType; + + +#if defined(X86_WIN32) + rbConventionStr = (rbConvention != Qnil) ? rb_funcall2(rbConvention, rb_intern("to_s"), 0, NULL) : Qnil; + fnInfo->abi = (rbConventionStr != Qnil && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0) + ? FFI_STDCALL : FFI_DEFAULT_ABI; +#else + fnInfo->abi = FFI_DEFAULT_ABI; +#endif + + status = ffi_prep_cif(&fnInfo->ffi_cif, fnInfo->abi, fnInfo->parameterCount, + fnInfo->ffiReturnType, fnInfo->ffiParameterTypes); + switch (status) { + case FFI_BAD_ABI: + rb_raise(rb_eArgError, "Invalid ABI specified"); + case FFI_BAD_TYPEDEF: + rb_raise(rb_eArgError, "Invalid argument type specified"); + case FFI_OK: + break; + default: + rb_raise(rb_eArgError, "Unknown FFI error"); + } + + fnInfo->invoke = rbffi_GetInvoker(fnInfo); + + return self; +} + +/* + * call-seq: result_type + * @return [Type] + * Get the return type of the function type + */ +static VALUE +fntype_result_type(VALUE self) +{ + FunctionType* ft; + + Data_Get_Struct(self, FunctionType, ft); + + return ft->rbReturnType; +} + +/* + * call-seq: param_types + * @return [Array] + * Get parameters types. + */ +static VALUE +fntype_param_types(VALUE self) +{ + FunctionType* ft; + + Data_Get_Struct(self, FunctionType, ft); + + return rb_ary_dup(ft->rbParameterTypes); +} + +void +rbffi_FunctionInfo_Init(VALUE moduleFFI) +{ + VALUE ffi_Type; + + ffi_Type = rbffi_TypeClass; + + /* + * Document-class: FFI::FunctionType < FFI::Type + */ + rbffi_FunctionTypeClass = rb_define_class_under(moduleFFI, "FunctionType",ffi_Type); + rb_global_variable(&rbffi_FunctionTypeClass); + /* + * Document-const: FFI::CallbackInfo = FFI::FunctionType + */ + rb_define_const(moduleFFI, "CallbackInfo", rbffi_FunctionTypeClass); + /* + * Document-const: FFI::FunctionInfo = FFI::FunctionType + */ + rb_define_const(moduleFFI, "FunctionInfo", rbffi_FunctionTypeClass); + /* + * Document-const: FFI::Type::Function = FFI::FunctionType + */ + rb_define_const(ffi_Type, "Function", rbffi_FunctionTypeClass); + + rb_define_alloc_func(rbffi_FunctionTypeClass, fntype_allocate); + rb_define_method(rbffi_FunctionTypeClass, "initialize", fntype_initialize, -1); + rb_define_method(rbffi_FunctionTypeClass, "result_type", fntype_result_type, 0); + rb_define_method(rbffi_FunctionTypeClass, "param_types", fntype_param_types, 0); + +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.o new file mode 100644 index 0000000000000000000000000000000000000000..3e6916a2ca9de51d9ae114bdec031e2432d7fed3 GIT binary patch literal 40488 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LastError.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LastError.c new file mode 100644 index 0000000..795a42e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LastError.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (C) 2009 Aman Gupta + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef _MSC_VER +# include +#endif +#include +#include +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdbool.h" +#endif +#include +#include + +#include "LastError.h" + +#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__) +# include +# define USE_PTHREAD_LOCAL +#endif + +typedef struct ThreadData { + int td_errno; +} ThreadData; + +#if defined(USE_PTHREAD_LOCAL) +static pthread_key_t threadDataKey; +#endif + +static inline ThreadData* thread_data_get(void); + +#if defined(USE_PTHREAD_LOCAL) + +static ThreadData* +thread_data_init(void) +{ + ThreadData* td = xcalloc(1, sizeof(ThreadData)); + + pthread_setspecific(threadDataKey, td); + + return td; +} + + +static inline ThreadData* +thread_data_get(void) +{ + ThreadData* td = pthread_getspecific(threadDataKey); + return td != NULL ? td : thread_data_init(); +} + +static void +thread_data_free(void *ptr) +{ + xfree(ptr); +} + +#else +static ID id_thread_data; + +static ThreadData* +thread_data_init(void) +{ + ThreadData* td; + VALUE obj; + + obj = Data_Make_Struct(rb_cObject, ThreadData, NULL, -1, td); + rb_thread_local_aset(rb_thread_current(), id_thread_data, obj); + + return td; +} + +static inline ThreadData* +thread_data_get() +{ + VALUE obj = rb_thread_local_aref(rb_thread_current(), id_thread_data); + + if (obj != Qnil && TYPE(obj) == T_DATA) { + return (ThreadData *) DATA_PTR(obj); + } + + return thread_data_init(); +} + +#endif + + +/* + * call-seq: error + * @return [Numeric] + * Get +errno+ value. + */ +static VALUE +get_last_error(VALUE self) +{ + return INT2NUM(thread_data_get()->td_errno); +} + + +/* + * call-seq: error(error) + * @param [Numeric] error + * @return [nil] + * Set +errno+ value. + */ +static VALUE +set_last_error(VALUE self, VALUE error) +{ + +#ifdef _WIN32 + SetLastError(NUM2INT(error)); +#else + errno = NUM2INT(error); +#endif + + return Qnil; +} + + +void +rbffi_save_errno(void) +{ + int error = 0; + +#ifdef _WIN32 + error = GetLastError(); +#else + error = errno; +#endif + + thread_data_get()->td_errno = error; +} + + +void +rbffi_LastError_Init(VALUE moduleFFI) +{ + /* + * Document-module: FFI::LastError + * This module defines a couple of method to set and get +errno+ + * for current thread. + */ + VALUE moduleError = rb_define_module_under(moduleFFI, "LastError"); + + rb_define_module_function(moduleError, "error", get_last_error, 0); + rb_define_module_function(moduleError, "error=", set_last_error, 1); + +#if defined(USE_PTHREAD_LOCAL) + pthread_key_create(&threadDataKey, thread_data_free); +#else + id_thread_data = rb_intern("ffi_thread_local_data"); +#endif /* USE_PTHREAD_LOCAL */ +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LastError.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LastError.h new file mode 100644 index 0000000..ee1dfbb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LastError.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_LASTERROR_H +#define RBFFI_LASTERROR_H + +#ifdef __cplusplus +extern "C" { +#endif + + +void rbffi_LastError_Init(VALUE moduleFFI); + +void rbffi_save_errno(void); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_LASTERROR_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LastError.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LastError.o new file mode 100644 index 0000000000000000000000000000000000000000..203ac2bb597e1f4dfaaa53e4b62895a74dca9077 GIT binary patch literal 18236 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 Q(9U0i@UK38y9wX_0rihxl>h($ literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.c new file mode 100644 index 0000000..a21883a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.c @@ -0,0 +1,63 @@ +#include "LongDouble.h" +#include +#include +#include + +#if defined (__CYGWIN__) || defined(__INTERIX) +# define strtold(str, endptr) ((long double) strtod((str), (endptr))) +#endif /* defined (__CYGWIN__) */ + +static VALUE rb_cBigDecimal = Qnil; +static VALUE bigdecimal_load(VALUE unused); +static VALUE bigdecimal_failed(VALUE value); + +VALUE +rbffi_longdouble_new(long double ld) +{ + if (!RTEST(rb_cBigDecimal)) { + /* allow fallback if the bigdecimal library is unavailable in future ruby versions */ + rb_cBigDecimal = rb_rescue(bigdecimal_load, Qnil, bigdecimal_failed, rb_cObject); + } + + if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject) { + char buf[128]; + return rb_funcall(rb_cBigDecimal, rb_intern("new"), 1, rb_str_new(buf, sprintf(buf, "%.35Le", ld))); + } + + /* Fall through to handling as a float */ + return rb_float_new(ld); +} + +long double +rbffi_num2longdouble(VALUE value) +{ + if (TYPE(value) == T_FLOAT) { + return rb_num2dbl(value); + } + + if (!RTEST(rb_cBigDecimal) && rb_const_defined(rb_cObject, rb_intern("BigDecimal"))) { + rb_cBigDecimal = rb_const_get(rb_cObject, rb_intern("BigDecimal")); + } + + if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject && RTEST(rb_obj_is_kind_of(value, rb_cBigDecimal))) { + VALUE s = rb_funcall(value, rb_intern("to_s"), 1, rb_str_new2("E")); + return strtold(RSTRING_PTR(s), NULL); + } + + /* Fall through to handling as a float */ + return rb_num2dbl(value); +} + + +static VALUE +bigdecimal_load(VALUE unused) +{ + rb_require("bigdecimal"); + return rb_const_get(rb_cObject, rb_intern("BigDecimal")); +} + +static VALUE +bigdecimal_failed(VALUE value) +{ + return value; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.h new file mode 100644 index 0000000..2e52ccb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2012, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_LONGDOUBLE_H +#define RBFFI_LONGDOUBLE_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#define strtold strtod +#endif + +extern VALUE rbffi_longdouble_new(long double ld); +extern long double rbffi_num2longdouble(VALUE value); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_LONGDOUBLE_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.o new file mode 100644 index 0000000000000000000000000000000000000000..03289891b7c0c7269955c02e2bc85251e057ab3e GIT binary patch literal 24368 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Makefile new file mode 100644 index 0000000..5a370d7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Makefile @@ -0,0 +1,263 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@:) +ECHO = $(ECHO1:0=@echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 +hdrdir = $(topdir) +arch_hdrdir = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17 +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr +rubysitearchprefix = $(rubylibprefix)/$(sitearch) +rubyarchprefix = $(rubylibprefix)/$(arch) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) +sitearchhdrdir = $(sitehdrdir)/$(sitearch) +rubyarchhdrdir = $(rubyhdrdir)/$(arch) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(vendorlibdir)/$(sitearch) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)./.gem.20180108-62297-xzhdbb +sitelibdir = $(DESTDIR)./.gem.20180108-62297-xzhdbb +sitedir = $(DESTDIR)/Library/Ruby/Site +rubyarchdir = $(rubylibdir)/$(arch) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(DESTDIR)/usr/share/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(DESTDIR)/usr/share/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(DESTDIR)/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk$(prefix)/include +localstatedir = $(prefix)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(DESTDIR)/Library/Ruby/Site +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC = xcrun clang +CXX = xcrun clang++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework CoreFoundation +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) + +RUBY_EXTCONF_H = extconf.h +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = $(optflags) $(debugflags) $(warnflags) +optflags = +debugflags = -g +warnflags = +CCDLFLAGS = +CFLAGS = $(CCDLFLAGS) -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -iwithsysroot /usr/local/libressl/include $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -DRUBY_EXTCONF_H=\"$(RUBY_EXTCONF_H)\" -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) -g -Os -pipe $(ARCH_FLAG) +ldflags = -L. -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib +dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress +ARCH_FLAG = -arch x86_64 -arch i386 +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CC) -dynamic -bundle +LDSHAREDXX = $(CXX) -dynamic -bundle +AR = ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) +RUBY_SO_NAME = ruby.2.3.0 +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = universal-darwin17 +sitearch = $(arch) +ruby_version = 2.3.0 +ruby = $(bindir)/$(RUBY_BASE_NAME) +RUBY = $(ruby) +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h $(RUBY_EXTCONF_H) + +RM = rm -f +RM_RF = $(RUBY) -run -e rm -- -rf +RMDIRS = rmdir -p +MAKEDIRS = mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = + +libpath = . $(libdir) +LIBPATH = -L. -L$(libdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lobjc +ORIG_SRCS = Thread.c Buffer.c DynamicLibrary.c Variadic.c ffi.c Pointer.c MemoryPointer.c Platform.c LongDouble.c Function.c MappedType.c Type.c Types.c StructLayout.c DataConverter.c ArrayType.c StructByReference.c LastError.c Struct.c Call.c MethodHandle.c AbstractMemory.c FunctionInfo.c ClosurePool.c StructByValue.c +SRCS = $(ORIG_SRCS) +OBJS = Thread.o Buffer.o DynamicLibrary.o Variadic.o ffi.o Pointer.o MemoryPointer.o Platform.o LongDouble.o Function.o MappedType.o Type.o Types.o StructLayout.o DataConverter.o ArrayType.o StructByReference.o LastError.o Struct.o Call.o MethodHandle.o AbstractMemory.o FunctionInfo.o ClosurePool.o StructByValue.o +HDRS = $(srcdir)/Type.h $(srcdir)/rbffi_endian.h $(srcdir)/MappedType.h $(srcdir)/Types.h $(srcdir)/LastError.h $(srcdir)/ArrayType.h $(srcdir)/StructByReference.h $(srcdir)/extconf.h $(srcdir)/StructByValue.h $(srcdir)/AbstractMemory.h $(srcdir)/ClosurePool.h $(srcdir)/Call.h $(srcdir)/MethodHandle.h $(srcdir)/Struct.h $(srcdir)/rbffi.h $(srcdir)/Thread.h $(srcdir)/compat.h $(srcdir)/DynamicLibrary.h $(srcdir)/Platform.h $(srcdir)/Function.h $(srcdir)/LongDouble.h $(srcdir)/MemoryPointer.h $(srcdir)/Pointer.h +TARGET = ffi_c +TARGET_NAME = ffi_c +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).bundle +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) +ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) + +TARGET_SO = $(DLLIB) +CLEANLIBS = $(TARGET).bundle +CLEANOBJS = *.o *.bak + +all: $(DLLIB) +static: $(STATIC_LIB) install-rb +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TIMESTAMP_DIR)/.RUBYARCHDIR.time + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb install-rb-default +install-rb-default: pre-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +pre-install-rb-default: + @$(NULLCMD) +$(TIMESTAMP_DIR)/.RUBYARCHDIR.time: + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $< + +$(DLLIB): $(OBJS) Makefile + $(ECHO) linking shared-object $(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + $(Q) $(POSTLINK) + + + +$(OBJS): $(HDRS) $(ruby_headers) +LIBFFI_HOST=--host= +include ${srcdir}/libffi.darwin.mk diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.c new file mode 100644 index 0000000..d1a4189 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.c @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2010, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#include + +#include +#include "rbffi.h" + +#include "Type.h" +#include "MappedType.h" + + +static VALUE mapped_allocate(VALUE); +static VALUE mapped_initialize(VALUE, VALUE); +static void mapped_mark(MappedType *); +static ID id_native_type, id_to_native, id_from_native; + +VALUE rbffi_MappedTypeClass = Qnil; + +static VALUE +mapped_allocate(VALUE klass) +{ + MappedType* m; + + VALUE obj = Data_Make_Struct(klass, MappedType, mapped_mark, -1, m); + + m->rbConverter = Qnil; + m->rbType = Qnil; + m->type = NULL; + m->base.nativeType = NATIVE_MAPPED; + m->base.ffiType = &ffi_type_void; + + return obj; +} + +/* + * call-seq: initialize(converter) + * @param [#native_type, #to_native, #from_native] converter +converter+ must respond to + * all these methods + * @return [self] + */ +static VALUE +mapped_initialize(VALUE self, VALUE rbConverter) +{ + MappedType* m = NULL; + + if (!rb_respond_to(rbConverter, id_native_type)) { + rb_raise(rb_eNoMethodError, "native_type method not implemented"); + } + + if (!rb_respond_to(rbConverter, id_to_native)) { + rb_raise(rb_eNoMethodError, "to_native method not implemented"); + } + + if (!rb_respond_to(rbConverter, id_from_native)) { + rb_raise(rb_eNoMethodError, "from_native method not implemented"); + } + + Data_Get_Struct(self, MappedType, m); + m->rbType = rb_funcall2(rbConverter, id_native_type, 0, NULL); + if (!(rb_obj_is_kind_of(m->rbType, rbffi_TypeClass))) { + rb_raise(rb_eTypeError, "native_type did not return instance of FFI::Type"); + } + + m->rbConverter = rbConverter; + Data_Get_Struct(m->rbType, Type, m->type); + m->base.ffiType = m->type->ffiType; + + return self; +} + +static void +mapped_mark(MappedType* m) +{ + rb_gc_mark(m->rbType); + rb_gc_mark(m->rbConverter); +} + +/* + * call-seq: mapped_type.native_type + * @return [Type] + * Get native type of mapped type. + */ +static VALUE +mapped_native_type(VALUE self) +{ + MappedType*m = NULL; + Data_Get_Struct(self, MappedType, m); + + return m->rbType; +} + +/* + * call-seq: mapped_type.to_native(*args) + * @param args depends on {FFI::DataConverter} used to initialize +self+ + */ +static VALUE +mapped_to_native(int argc, VALUE* argv, VALUE self) +{ + MappedType*m = NULL; + + Data_Get_Struct(self, MappedType, m); + + return rb_funcall2(m->rbConverter, id_to_native, argc, argv); +} + +/* + * call-seq: mapped_type.from_native(*args) + * @param args depends on {FFI::DataConverter} used to initialize +self+ + */ +static VALUE +mapped_from_native(int argc, VALUE* argv, VALUE self) +{ + MappedType*m = NULL; + + Data_Get_Struct(self, MappedType, m); + + return rb_funcall2(m->rbConverter, id_from_native, argc, argv); +} + +void +rbffi_MappedType_Init(VALUE moduleFFI) +{ + /* + * Document-class: FFI::Type::Mapped < FFI::Type + */ + rbffi_MappedTypeClass = rb_define_class_under(rbffi_TypeClass, "Mapped", rbffi_TypeClass); + + rb_global_variable(&rbffi_MappedTypeClass); + + id_native_type = rb_intern("native_type"); + id_to_native = rb_intern("to_native"); + id_from_native = rb_intern("from_native"); + + rb_define_alloc_func(rbffi_MappedTypeClass, mapped_allocate); + rb_define_method(rbffi_MappedTypeClass, "initialize", mapped_initialize, 1); + rb_define_method(rbffi_MappedTypeClass, "type", mapped_native_type, 0); + rb_define_method(rbffi_MappedTypeClass, "native_type", mapped_native_type, 0); + rb_define_method(rbffi_MappedTypeClass, "to_native", mapped_to_native, -1); + rb_define_method(rbffi_MappedTypeClass, "from_native", mapped_from_native, -1); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.h new file mode 100644 index 0000000..4b26cc1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2010, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_MAPPEDTYPE_H +#define RBFFI_MAPPEDTYPE_H + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct MappedType_ { + Type base; + Type* type; + VALUE rbConverter; + VALUE rbType; + +} MappedType; + +void rbffi_MappedType_Init(VALUE moduleFFI); + +extern VALUE rbffi_MappedTypeClass; + + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_MAPPEDTYPE_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.o new file mode 100644 index 0000000000000000000000000000000000000000..d3baaa38544077eae82ebffcd0d394d15e4f8a27 GIT binary patch literal 31652 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≫i^c-%6;bGgZ>z z_X;rmwBl!*{JbL(4!?!k;rBUE;PC5_4!`UzIQ;sA!>>Trc>KcQm%Rpu-+bxt>x09u zM>zbl8*GQ)_o!@}+ha^6c^aQoe)8;Ulg_>*X7Z|3I{OkW`ZN;h>?_a)pu#P*;t&i@ z-vtf4{3@D{L^}FXEa~Vgs-+!$1#24j@!4XHkWRj&W?q3rI{6B;1E_TJC0fK=5@B^U ztn}cHq4i^?Vv}3gq@8 zzNO^#7_kgP>KJh>ejgdU5&B={zngc+JTo_h?3F{yxhQ)F73d}tw@m` zR2C}%=OQBT(WZJXDvBgdcOdc6R|T~LFZVhnr5$*=Wh*J|z#9iiNofaOZk|d?JMePv zQzRG~8~8hj6V-#EaP9H=J)ZrpSq>3yVu4)WH5rvTX7!M{&jUAC{r*&MaGGB^cft2Y46(`9wN^s1f8*Y(m%t>#nrOX!viV@O-vl@I?_XR1w2%J%gmXGruS-d>cifvoIa`ty}g zxz#t|d&Bn~U$5^C)8+e1c$p@yxC;KK_j=v+zN_FU>OOCSnYY}`S#A~$2v5`-=!x26 zW@Y(KhaV`+XTcG5OvZih6+O}s_5G}6=IKB7y7vz(gLi0w*ZrbVX6AW)li&op9L}gc zruCk5MqMtPQ6cU76eQ`5y38zD4sTR8?=$p9y&Fb);Enpt6nGzT_nlW9q(|wy#@*T_ z^(t6aE~(V9OgNm1dS$uck_x|9vi)#LCEHgb_*dEfs5bvg4u0!Za7G;z+9rD?ba@9e zym+4Zr&gxnoTU6wbNDxyu-@f#x{V|Jm5OlND$tq{^FTja@#lcgpS9$BK%1oauVb(& zN540`e$V-ShH+$tN6I~c_3&Zf@5{yJHsap~UhLrG?*<+DrGx+1z(0a++M)bSDSY^| z9^v1I(fmXTKdkCg4~Um(IhEjl=+J*Y=xi_k0@e}!Zr6HBRJlw*terV{=W6!{>+v=s z>F{^8`+@WyD*AJvJN11XIKL^Ne*Wc-YY?%2M=7I7E+;3jx>T zPCY^3yj?;NdfJhpo(9mJ{ToP;TLL*umz>g+_VdJoPnL2p_m14^=s)z8J+EokD^E_EKi2T>_3=*mXljqwC?^p0b1^*K^DTndm0o3!Pg7+(keiL-` zlYqSnt^s7ZMSz$d9{w~Z{(^$vR`8I5EKmLh1(zv^b_;p{O2}thc`v}<)$C^B_lt_L z&xOw~@*EH0?~6Rgls0pb=XeW0U*tJwex>MK_q2a6=i1|>19E<9zh2Jq*A$)4lLtJ? z@R`Ki5_vw?XCO~sc|OamtM=igF8mY0>AUOn+jaWvMj)x>k2uP1a?qVVx|G%Ow>$Dq szg(wJ?mZ3}r!Vf1gRaH^6a+eVru}dE9|Mf}d-B?gHtm1=hxy + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif +#include +#include +#include "rbffi.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "MemoryPointer.h" + + +static VALUE memptr_allocate(VALUE klass); +static void memptr_release(Pointer* ptr); +static VALUE memptr_malloc(VALUE self, long size, long count, bool clear); +static VALUE memptr_free(VALUE self); + +VALUE rbffi_MemoryPointerClass; + +#define MEMPTR(obj) ((MemoryPointer *) rbffi_AbstractMemory_Cast(obj, rbffi_MemoryPointerClass)) + +VALUE +rbffi_MemoryPointer_NewInstance(long size, long count, bool clear) +{ + return memptr_malloc(memptr_allocate(rbffi_MemoryPointerClass), size, count, clear); +} + +static VALUE +memptr_allocate(VALUE klass) +{ + Pointer* p; + VALUE obj = Data_Make_Struct(klass, Pointer, NULL, memptr_release, p); + p->rbParent = Qnil; + p->memory.flags = MEM_RD | MEM_WR; + + return obj; +} + +/* + * call-seq: initialize(size, count=1, clear=true) + * @param [Fixnum, Bignum, Symbol, FFI::Type] size size of a memory cell (in bytes, or type whom size will be used) + * @param [Numeric] count number of cells in memory + * @param [Boolean] clear set memory to all-zero if +true+ + * @return [self] + * A new instance of FFI::MemoryPointer. + */ +static VALUE +memptr_initialize(int argc, VALUE* argv, VALUE self) +{ + VALUE size = Qnil, count = Qnil, clear = Qnil; + int nargs = rb_scan_args(argc, argv, "12", &size, &count, &clear); + + memptr_malloc(self, rbffi_type_size(size), nargs > 1 ? NUM2LONG(count) : 1, + RTEST(clear) || clear == Qnil); + + if (rb_block_given_p()) { + return rb_ensure(rb_yield, self, memptr_free, self); + } + + return self; +} + +static VALUE +memptr_malloc(VALUE self, long size, long count, bool clear) +{ + Pointer* p; + unsigned long msize; + + Data_Get_Struct(self, Pointer, p); + + msize = size * count; + + p->storage = xmalloc(msize + 7); + if (p->storage == NULL) { + rb_raise(rb_eNoMemError, "Failed to allocate memory size=%ld bytes", msize); + return Qnil; + } + p->autorelease = true; + p->memory.typeSize = (int) size; + p->memory.size = msize; + /* ensure the memory is aligned on at least a 8 byte boundary */ + p->memory.address = (char *) (((uintptr_t) p->storage + 0x7) & (uintptr_t) ~0x7UL);; + p->allocated = true; + + if (clear && p->memory.size > 0) { + memset(p->memory.address, 0, p->memory.size); + } + + return self; +} + +static VALUE +memptr_free(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + if (ptr->allocated) { + if (ptr->storage != NULL) { + xfree(ptr->storage); + ptr->storage = NULL; + } + ptr->allocated = false; + } + + return self; +} + +static void +memptr_release(Pointer* ptr) +{ + if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) { + xfree(ptr->storage); + ptr->storage = NULL; + } + xfree(ptr); +} + +/* + * call-seq: from_string(s) + * @param [String] s string + * @return [MemoryPointer] + * Create a {MemoryPointer} with +s+ inside. + */ +static VALUE +memptr_s_from_string(VALUE klass, VALUE to_str) +{ + VALUE s = StringValue(to_str); + VALUE args[] = { INT2FIX(1), LONG2NUM(RSTRING_LEN(s) + 1), Qfalse }; + VALUE obj = rb_class_new_instance(3, args, klass); + rb_funcall(obj, rb_intern("put_string"), 2, INT2FIX(0), s); + + return obj; +} + +void +rbffi_MemoryPointer_Init(VALUE moduleFFI) +{ + VALUE ffi_Pointer; + + ffi_Pointer = rbffi_PointerClass; + + /* + * Document-class: FFI::MemoryPointer < FFI::Pointer + * A MemoryPointer is a specific {Pointer}. It points to a memory composed of cells. All cells have the + * same size. + * + * @example Create a new MemoryPointer + * mp = FFI::MemoryPointer.new(:long, 16) # Create a pointer on a memory of 16 long ints. + * @example Create a new MemoryPointer from a String + * mp1 = FFI::MemoryPointer.from_string("this is a string") + * # same as: + * mp2 = FFI::MemoryPointer.new(:char,16) + * mp2.put_string("this is a string") + */ + rbffi_MemoryPointerClass = rb_define_class_under(moduleFFI, "MemoryPointer", ffi_Pointer); + rb_global_variable(&rbffi_MemoryPointerClass); + + rb_define_alloc_func(rbffi_MemoryPointerClass, memptr_allocate); + rb_define_method(rbffi_MemoryPointerClass, "initialize", memptr_initialize, -1); + rb_define_singleton_method(rbffi_MemoryPointerClass, "from_string", memptr_s_from_string, 1); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.h new file mode 100644 index 0000000..1257683 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (c) 2008, Luc Heinrich + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_MEMORYPOINTER_H +#define RBFFI_MEMORYPOINTER_H + +#ifndef _MSC_VER +# include +#else +# include "win32/stdbool.h" +#endif +#include + +#ifdef __cplusplus +extern "C" { +#endif + + extern void rbffi_MemoryPointer_Init(VALUE moduleFFI); + extern VALUE rbffi_MemoryPointerClass; + extern VALUE rbffi_MemoryPointer_NewInstance(long size, long count, bool clear); +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_MEMORYPOINTER_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.o new file mode 100644 index 0000000000000000000000000000000000000000..6afe94beb6c24426faacb9d70fe60d58b58eb98b GIT binary patch literal 31688 zcmeHv3wV^(x$gRB=ATS1lMI(YK)}cyBnd$gtU(EoI0H!tuqbH)wj=;*kTdd9{e1|BU7# z7;|GSFxCQNEil#sV=XY&0%I*O)&gTKFxCQNEil#sV=XY&0{@j-;D;al>O=gN;sxv?$R_54(NHBKo<_jqr2iNuIT!Trure;#17FA zIHNCqz7VBkctkG)o-1|wLzyP03SGlV*w@_Clfny!*Ob?n z4>3Ng>*X6_@vy{kY`at!4!1^|6YXIbDcR7sseEIlBXTYq8t$9A-Oi-hhooU98hxGJ zEizxaz87@=)DbSL{~xP9?)Drbw%RX;gJlZuY2ucNE2o5|_= zUYVdWU8(K+76%sG9~TLsiyBp5EYj5;MaQJ;yWkv^f3XV0g!6P{C>T}W_DG8~FYHNUjz~+ozG>5k>-*zJ)ED2qW7PVt)cU4sD+*`*Is00=x5KV@IMH=YM^|e&T(u@O z$5rQQO1Ixi%sBK=us>KB zJW^i3CO%RgVCC{2`(7}4q$>GgRr0sNzQevxly4~yZ~g_Pjq>t_^7^{k^5hRg$sdQ3 zzYirpe2Rz1Qe&upOJQ~1*N=w=uFp_KBv%&(Z$1!T^$lzPy7_C8EfcGfSNno}2Qq?v z$4&*4?)~c)RNwroJ%Ngw&cw52(eKHORml^o{42{hOB)WQR%Pi2Xr|HwRmopUVVd^Q z>bLn2W$S7kWr5(p(*01TtnHTr8)gNQM>XdX2(bDoWEC0}{mhxDp}#Pgw~w`!o`)ld>t^|4UWg6`G2e!r2rlZQh6m&#aG%Za|z zu1`)1_BXtG^1D`IVlerNDn9w$ce9>gk?*>LFMJT}uQ(R$JLSu}`(W_P@59Etdk*-X z$$RXXs^pofQJD@fowcEz)*+f=y|6ZMKFm1 z2d;lSm|SME29H!6;Ft>aXPi7-nD8AO%)9FtKlQR7Y zw4#tDl|tRo>f|XUU?znKUQ%%^ksD0DiaIXWb(A7{lq660UN>LFr}bX9K*Z7L*I_W9 ziTjn7BdZIc9yLFj-ph@3BW8uvFm-edPp@8p%AG*@n-5h-w|B>O*LHVw#iKFN(bW;} zh;(*b8x?J_?(N)Qa2He=>FA8M7RI{^Bc0eIMB>rH?J{3s4@6hY>1-`*-W|u%UAjc< zNW@LHa=ye0tEw8S3wK6iJssU$g%=kuE?!(Xzoipz-lB^agDAe>;^HL>#4tOGTSQ4i z53-a*x>{q=Yf5Tk-P@uq@t&gcB_-uB;hH7I?H%#0iRR*t?vij%tfgdUw5zo{R??j4 zYVC}c#1hTBOO_O0P`tRLJ-WT8q^+%^sI>Uv;?m_M*eH?=w}@CX!(j!l?u=lg)>vNE zP$4?IyV?sAT|FJ`U8pKnP%hsp}tr09M+_NLvf`$vXba(Z{d&I_u zRab;Jv_(35qBHau{u;<6|M`0D(jW4J0qQmXqfL>rL{g>v%aRn#MiG{ zTd}&{P^+uT>*@?qy?#wYl_OYLwZ7butE=A_s?k=~hc{MSUeQ!*vXyV#Sbl{eg5`BV z6Gx_op`uoWE=T1|T4iXcB)M6ZOKsBfn8~49+)xcQYbq)Y5vs1JUT=t+^=ljrpG#sO-m|VRZ*imbOc-V*=XXZvX-ty=nxeg9Thbwg5!_P7OrflSuM=;R+CngH)CF7 zccg}X8W|RmR?Im}gO;t4nBW9gQ-L#}tuxZzgH<9fIDG1u7Hh7J#G>Hz#JgjW_Na&? z5Q%n1BN+SPRo&g4!YmrCV&j@fJR+JSJsmA#<0=_kEvH=T_DJk%(b^V^Mnx-S5-4Ox zJQj|la%vHZ^oXs|$PUpN?Gi{qIlDwlWJg5wz|Lr^h{SeFYvsU3O_|%2EU@zxJEUeV zP6_M`$r)t@2-iff31JRLx>{JbFpZ%sR-bTtG%mE_?Nalo3PM;znX@ageF@hPtQno$ z=j}3iQx;i>QDg~Zjo3~j)`K1A&=Rc6H4Upt*bV$(#oj4-kmXFROHhj^Nw+BcW<2<4cTtn3{2~KfUeCVlv>xdG~ zLLG+^Rm>y}*=2Ukj^sxWxj+k7=+F`yo$NYd3b@7*X)w{(9M+aMb@bE_OUInRC^Cm2 zXm1n!v6Jh{k&4U-#t21!8cK(nW68j29h|x^&%^FeAjtZ0h!klWX(HTqCM&IwVh9I?7NoNwXc15ku)C zh)mGAhqR0sN+xNgQ_zTEeW6Yo5*abwOq;)Yb}b`CM$CRA@>NI61{1C078wr9h>8q7 zzp15vphLF^`0h8vo0{noJ8Mn+XO8+2RW;jvlYN-3_l9&enfPf(*9LPomZ42WkxeF^ z<(NOB=?-WOqZXMvr0XgZpW)~lF(h8sx<28Ej2N+_82%BAjA(^_<0x)0(Q6A92$A6)dE^`#u zjZ{3M6^*TRPOb(Mz20Gs$knHl1{{$F6Fum#MyyOmyFOXCrDC zL&13O$^w-(Z%SwalnCKf3QYD4Tev1Gkt$8qLye+8-+%`;{ zVDvzHzF$_AmM#Z5$w`BX$xfQR-^ych!4QY!lp$#d2r+f8EajZZj!DxdIML~rMT2IX z2bpEad@h?YJNr^Z3yWb9P0$Tk2;O-%lF4JHnQTu(%*w`mo;|YVFPkFUeh%A@y}}k0 zVlG>k%{MPw_LUIxb!m1=X$y2|HcMM*bTixehAB?u44-XQ3m)uQjmywet_PUS z`#c`U;9ZYoy3JRRjGrQX4h&E-84EGKzwBi3x$a!~FsX;u!_3TPB>n@*2dOXfNs#@_ z`Y_3?$3W7#9&%@Y7V$%pmIl5Bw$+{U4g!z$70dqt<@{b$c%pwCo<9FMcwXqAhi8WW z5*rf0!|%t_=bwUSrhguuS^lMXX8X(W%<)&_>Gyve&s={8o_YS=c#iYmgy(oa zPjn~vzli5V|D$;3`@fCnB>&TRPW8Wt=Q;kPcuw>G3eV~O(|DfC+4rp5pMl=$Js|v( z8TOv*FGiT_uf%h*|4Pa0?REJ(5WArlF_CvJGG7bQ>hT0-BR+2Y`FM&6fl>tSGCYz< z^(>#rV6kUO{+-MVw&wzo|8vCIAD#;f^4~-Jf0MtoF#jatw9s?W{CppJO~#ik5bj&S z{45gP%O?IUf&%x3{BP-e?u{b}l=TApVS z*gnsz3_Kne2Z$AT7Xp*UBR=1{+%vfVk%dUNf*zkJI3EJ}Q^%N8=1Hr0W z>pX>G$_!8eYpdH=Ks#7R3yoI5(Yv0?wz+*`D%o<(m4R)~2(Xv{#KfdZFy>n?x`#@C z2^k7%z~nOrbjZP^b%;w`W-4$Th>uDezv>z`eM){-?&AR=qb z2_kF!N9KW(HQorWs`2^eC&6x{S&ctqwI0oQ66t$r$D^!aCVPE9$*;<$n132l);%sc zvKHhb0fcHKv#CEUwFQ`GgKQ)VS?-o3=V8Wdke`#}T6A;9{U~@oxvI~fiKsQ*OTE^DrHWuZM3LF$ zT`WznLXzu_jNc#^=Z)(Q_K&d5rf#Ja`UHjc$okDgHDnDWnb`|c=IdoX*^y>vCp+@S z?9Gr+9T}j4>3qmJg|;?3*>AB-IJ2XDR?~``@(k9M2QlmfzoyZfgAnp8A#08h3k*Cz z4xvT@w#ztE$@3x1gvaJW=6~YeH&zb5{>0b%`)@fNJ%3%rhZUDBdh-{*zqEZ{aiFx| z+Am+1TX5m)$4)da_0;|2{L5x_{M(aLU;7U7ejok~_~Y;#bO97x2)`J9C44RXRq&iP zz3?1z2*eQ@1Sfk4;j@xLe(;%|uc{%qK#&fx5^!?mLC9%zgVu3BXv!>vr{fNS^fnT3 zoV}z^XdUcG(*IYN!QLnRyr#JsA#Hxo$q4}ZGdi8C2K%N3a*NQhbf!<3k1oAW*yewU z4Etvs{6s2)V_&jw-RMb=>@~c~z+>@Q@GOsGf#Z#3E$-c)eWK)z+^c%F-BNhY@!Ly( z_#1!e%(uU}`-Y6~|F-7}@nG@t+`CF<{II3)o=?8}%yW;vz5lf(|NP0Nr@eP3r`4>j zSXuM;ClhSPx8P60XQE=$;7j0F!8gEfg})B|Hux{W{}cQXc>YxVJv@JW^8Jdad>_w7 z2*-CVSzHn|>m86}y$jD;!SVe}7N@J0;)_{IfrU*i9k&8x-8#hL`FPfBr%qFLN4ki}P^HbU-rz?v{5#jPHtO7TG9bll{U#f4pGOhOm( zh*Fi2`y*{0*JcXWLqZqKT>x3!5@;zb8Eg^kM7nDEd>E-18(%Y*_W2`CwhUQCPbIRv;(CcL%IwBl88&dz7R9 z%o)=TqC7XS&$Zg`t?aXJ^W5%U1erDP|Ldp}J7bOw9l5oA8Mk@|q%6dwULKnk9#itn zFP+h=NtS;v{A?}97p!zfZk4JTfBo8M%vfgGiGL(;NN=lb!KV}NuCKi+oWQ!l>S_LMZW zbhk!}ap|XIbvHf~cg1^3)R5Mv6?`nsp|* zba8R%1;stBSC`c7?ukdYmsE8$$MEr{q>>kGuIY|l-BYp=-&Bj`g&Wc(jq2-h4?pRa zBzj^c9bGM*iB|QUw@7{GuT{%va0Pucit2B4DS=R?Y-ZgdJ}>&dy@A_85Vkd2^oQg+xPmOv9q&&=XHN|Zp1MGJh3?J3Z5(T(=vGP{iS6{E7S?4W0@x6E7Wb-#1%GhX*+?YPI~ z{+H{@>~krDDou*pIEV6hypP(MuX*Ekz*}NlKAaV}4~duUye!w83HHQ3d#3kBX5hnh zqtg7xthH#unc%qHHzl4S(+yt9POtkXJxxfO$Rw}(AqzG>Y3KjWdmmL4%ko^l`@F7s zXye!Ryv)YB(`vGFv+lH~!X&DM*dhjNZ5;D>T*b0ZuC;b1sWR9&=?dGv308KztUC2n z=6$M9bKSS@gdFsYhZyzwDL?fJy8ta+?efVL_E8L-nb`CG4}{nw6z$bCUoPbHH$L_d zMSNpoKe%ERLcE8Hau8z6Gu?%73g}Z9dicvfjtBWaLx}xG5r1YDAp8`<=?LQpsiz8I zKIn3U*eXr`7{VFgmmtJ`rD!2S%#5P<@tBJ6CkW3&_!2^_A95aK0Rltk!( zo*OlP7eajCE8@8eOq|}X`81YF4 zZYefvNcWyZ<1u_ehxh7mk`A9y`%fyY)_-x)AUVGOSjVKO=(O$5;w3$G73aMYx4GOK=0Y6&KscZpPKMtHbRbxGEOjfjhY2 z=4+#|Zkg1U=xV`@4l;4|15zzpuMW52)|*TGS&iPEil#sV=XY&0%I*O)&gTKFxCQNEil#sV=eF>&;mbD z_^wC{TS+VnjedYyAe9hhSy(!15e&UTRMKY0#GA#oDHMjheOgFbmr~) zBlo>?9r(rw9cRPk->yHHeu0Nm!`%oSXT#!C2m9bp>qx=3LpHr%?tl({HM{pu+M#ru z4Rb#mhv*oZVlfWU(_BhjQtTK7XCKr$>OX=G9unaj)rh)uLdR5;xa&{q*r5QTR3LSP zs%zJ8tXGr}`*5JoZoNw%f*U@LxE*K4se#d_x9Ppm!Rw}f2OVsHMe{(b+$rs${_lmv zQz0!~$HVB4=P=g)p-^S)gbqF5935Qp&QkhH~ z@822d-|Wl#`q6>a88D}IuvsTnP6RmnVgToB3X*$rl3P4L%>y)_^zN^ja`V6LnRrWe z&P~t8{ZLp}J6NPmtT^6xI7b%WUwxwghDoSP-*L}C@-En0x8cm(E{Uw|x!Sx1FiofRw07;r+pZ+jxU^nJ%!`Tt~H zlShcEFX*or{5z{Z5lBpu9r2nxZ!!!r9XKXGrO_2al_yZy3nVSC(_4?s?jI< zD{}h#e>oWqSbeNNGYK8lZzL@kwPA3L$$X^ZZH~cy@5vN!y}Q2>nF1Jn zzZ}?kNzd%TYanu@Qoe!u4tut2{zaS0!-*L{w&aDgkF1&P!S_lrxDHAEdjh>cN5rT0 zU(U%PbzDFlmrET_Up_^!O#>Vx!@l{CA?e4E^kYbR2hBf*q#r}l|2IU^?<9P_<*Z2h zX1qpRBEh$b<1|mc49Q#!|8aQB`NvG7u`YrHZ5(9+q?>kZve*<4|UE16r!qIUGB0MZP!Tq41{&n2ac%(%psUQF!1Lhf?cQnvnWl z1fj6|hD#OdQcl7tWd>gVYQ6Z6Gmf)=w=}2x- ztRWpvDplSsQ=K942*{^~vpx@!c$1XE9|w6q1M^Dj!ruWF?0S#Yhs409ys;Vj3s#6@awi!vSZ;7?*& zmx1BBzy^tRVHF;a!y7!S$L0iim7E5JWu>^pvc80f>k-?{)4z;=hLi-%J;3ygPLK-6 zN)kBMR)u3dgJY7+Tam~sfUXCbnE5wIV7?JSk?l>$Bie{6Ij+c2;7VDAbdk( zS*K|%YXWS8Wo4guE(}O4D^CnOOD9S!>x+zER3NdeGQMnzaQA{qw28*D1~itH`3#no zcWT{r9*JfBKI8R1iDi}Xh8z)i3d~_xR!Y2 zAuQ{!shMvXF`cb8gV@%bG%TykqOq)uYb>jbDlBUuvKlNa+3IXi?qsZnFX8;hwVdn> z9s?Xk39jX|3G0i&v64JbVOTj5<`4(PE4g#wT_2lENawsu5TC+G4I+e1&Zh)UZN$9! zco5qOx8NW`KviW&E!4PGX_MWIzO?hT4fDG zh{zgViHNKruU&H$o5%aas)mcWdAnKW{uy!uquLFI!l<$eGZj8nR(XNOr_y+9p~k1m z6q{SSA4x3%uA>`d?LPyi0;6&+W%PkmP}L8xdY-3nsT9n76e+Tq>LmGnkP4S7$vk9M zxKv4A0#e~psWs~m%Hs|VYrY^RwFdF$!9(9^Oe%9(3pFN{wu>TenJy%|LE};116$!y z+4jQbZs~F03A?pf5B zEKWHsWpJf@V{)Fr8C+@a5X<07`5x0!Z$Xl}xW&WwKRUT7M97JySq4|i?Sf_*Tq$2i z+6cM(Kqi7_wUoh?&OsU4`llel5?8_NjNF(Y58fv-BljxWJcBC@LPD!FxKh5JwG^_B z;`lvG&2f*gKIzNxc=lU3m3Le-V&%EMn_a8?cI7_%QyzdeOghu}4oXiqW6r!9OuETu z7Jb8Cwa@b@*y-ps%ehHUFV}3r)6@C-q%-TQNnf>Z$Y!&&nzRaC_S3R;`DJ$u5BV41 zIRAQhNE_oF%b3DKChT$B0V&K+3}GQ{udj)qyZJ=&DL`bgJ)xLzBP`PE9u#GE z;iZU`*?}j3g9z^w21`e>O(M>YW+`E{Zr+klSrwE+g%cb9L4?@j;`@5Ha$+xD&n8q(KJI3$3X z06&(=7-5iQfI(hiPw_oxU*vszBnGm~+oUj%FB1cKqr^ZKYYZf?mnaHLrNlt`F7w9S ze+&HqulseVwS3qK0SkGb!9ugX~kS*P+3!r!v1{&-xuoB@U9U zZE%ofwx9A-`|N_9#6f0a_Nt|SCbl-;z?{bZ#{X%Aq;J+?GeY1X<^Mdwdg)*077z1R zJKUG<#V{*IIyS2Qx!^BR3$o--Ns}XH4OeUYzeOIbJ^sfL;wpvzL6>-#_acnG>%h+k zKL-A7norDQCupumlp`I69Ny{vO$b5Svk*eu??reX!uP?%8tVV0B_1x(b}`>K;IYX2 z|0nn#Xnp12Jph_(CH0f$ju_W?{I`P7-%5tR4>Z?YLtl?L-V6Q&_*}yczZ3k);77o} zOV@*XiNC~N!;kOi5Azts$gctY=@hxCki%6VzaMJ6^9W}l+>4O?+lUZq0IpT~3z5(0=hY{uaO@@hbL_bw@A;Yz2XuI) z4u7Kdke<)#5RhCc|8X6z(cufQm3ki3VXqD^)uDcgd#*;AsIEsHZm3?)Rvd!?_UNU^m$w2DjM^zQJs=f8U2E zK9ghMu#R)w7@Q`@sKID*oD@R>&U2)v1>;xYH6@KbS^sTfQijGMfv z*vs~mys4N=D@A@&icBib@^dNttDxNIe?5iYm!jueDf~q#^4!y#yd1kGo{FKwSSFwQ pRIxNg{+*O~DrQoh_#=^SRD9hSRucb0-vIr_u#!Ny{ 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. + */ + +#ifndef _MSC_VER +#include +#endif +#include +#ifndef _WIN32 +# include +#endif +#include +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdint.h" +# include "win32/stdbool.h" +#endif +#ifndef _WIN32 +# include +#endif +#include +#include +#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__) +# include +#endif + +#include +#include "rbffi.h" +#include "compat.h" + +#include "Function.h" +#include "Types.h" +#include "Type.h" +#include "LastError.h" +#include "Call.h" +#include "ClosurePool.h" +#include "MethodHandle.h" + + +#define MAX_METHOD_FIXED_ARITY (6) + +#ifndef roundup +# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#endif +#ifdef _WIN32 + typedef char* caddr_t; +#endif + +#ifdef USE_RAW +# define METHOD_CLOSURE ffi_raw_closure +# define METHOD_PARAMS ffi_raw* +#else +# define METHOD_CLOSURE ffi_closure +# define METHOD_PARAMS void** +#endif + + + +static bool prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize); +static long trampoline_size(void); + +#if defined(__x86_64__) && (defined(__linux__) || defined(__APPLE__)) +# define CUSTOM_TRAMPOLINE 1 +#endif + + +struct MethodHandle { + Closure* closure; +}; + +static ClosurePool* defaultClosurePool; + + +MethodHandle* +rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function) +{ + MethodHandle* handle; + Closure* closure = rbffi_Closure_Alloc(defaultClosurePool); + if (closure == NULL) { + rb_raise(rb_eNoMemError, "failed to allocate closure from pool"); + return NULL; + } + + handle = xcalloc(1, sizeof(*handle)); + handle->closure = closure; + closure->info = fnInfo; + closure->function = function; + + return handle; +} + +void +rbffi_MethodHandle_Free(MethodHandle* handle) +{ + if (handle != NULL) { + rbffi_Closure_Free(handle->closure); + } +} + +void* +rbffi_MethodHandle_CodeAddress(MethodHandle* handle) +{ + return handle->closure->code; +} + +#ifndef CUSTOM_TRAMPOLINE +static void attached_method_invoke(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data); + +static ffi_type* methodHandleParamTypes[] = { + &ffi_type_sint, + &ffi_type_pointer, + &ffi_type_ulong, +}; + +static ffi_cif mh_cif; + +static bool +prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) +{ + ffi_status ffiStatus; + +#if defined(USE_RAW) + ffiStatus = ffi_prep_raw_closure(code, &mh_cif, attached_method_invoke, closure); +#else + ffiStatus = ffi_prep_closure(code, &mh_cif, attached_method_invoke, closure); +#endif + if (ffiStatus != FFI_OK) { + snprintf(errmsg, errmsgsize, "ffi_prep_closure failed. status=%#x", ffiStatus); + return false; + } + + return true; +} + + +static long +trampoline_size(void) +{ + return sizeof(METHOD_CLOSURE); +} + +/* + * attached_method_invoke is used functions with more than 6 parameters, or + * with struct param or return values + */ +static void +attached_method_invoke(ffi_cif* cif, void* mretval, METHOD_PARAMS parameters, void* user_data) +{ + Closure* handle = (Closure *) user_data; + FunctionType* fnInfo = (FunctionType *) handle->info; + +#ifdef USE_RAW + int argc = parameters[0].sint; + VALUE* argv = *(VALUE **) ¶meters[1]; +#else + int argc = *(int *) parameters[0]; + VALUE* argv = *(VALUE **) parameters[1]; +#endif + + *(VALUE *) mretval = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo); +} + +#endif + + + +#if defined(CUSTOM_TRAMPOLINE) +#if defined(__x86_64__) + +static VALUE custom_trampoline(int argc, VALUE* argv, VALUE self, Closure*); + +#define TRAMPOLINE_CTX_MAGIC (0xfee1deadcafebabe) +#define TRAMPOLINE_FUN_MAGIC (0xfeedfacebeeff00d) + +/* + * This is a hand-coded trampoline to speedup entry from ruby to the FFI translation + * layer for x86_64 arches. + * + * Since a ruby function has exactly 3 arguments, and the first 6 arguments are + * passed in registers for x86_64, we can tack on a context pointer by simply + * putting a value in %rcx, then jumping to the C trampoline code. + * + * This results in approx a 30% speedup for x86_64 FFI dispatch + */ +__asm__( + ".text\n\t" + ".globl ffi_trampoline\n\t" + ".globl _ffi_trampoline\n\t" + "ffi_trampoline:\n\t" + "_ffi_trampoline:\n\t" + "movabsq $0xfee1deadcafebabe, %rcx\n\t" + "movabsq $0xfeedfacebeeff00d, %r11\n\t" + "jmpq *%r11\n\t" + ".globl ffi_trampoline_end\n\t" + "ffi_trampoline_end:\n\t" + ".globl _ffi_trampoline_end\n\t" + "_ffi_trampoline_end:\n\t" +); + +static VALUE +custom_trampoline(int argc, VALUE* argv, VALUE self, Closure* handle) +{ + FunctionType* fnInfo = (FunctionType *) handle->info; + VALUE rbReturnValue; + + RB_GC_GUARD(rbReturnValue) = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo); + RB_GC_GUARD(self); + + return rbReturnValue; +} + +#elif defined(__i386__) && 0 + +static VALUE custom_trampoline(caddr_t args, Closure*); +#define TRAMPOLINE_CTX_MAGIC (0xfee1dead) +#define TRAMPOLINE_FUN_MAGIC (0xbeefcafe) + +/* + * This is a hand-coded trampoline to speed-up entry from ruby to the FFI translation + * layer for i386 arches. + * + * This does not make a discernible difference vs a raw closure, so for now, + * it is not enabled. + */ +__asm__( + ".text\n\t" + ".globl ffi_trampoline\n\t" + ".globl _ffi_trampoline\n\t" + "ffi_trampoline:\n\t" + "_ffi_trampoline:\n\t" + "subl $12, %esp\n\t" + "leal 16(%esp), %eax\n\t" + "movl %eax, (%esp)\n\t" + "movl $0xfee1dead, 4(%esp)\n\t" + "movl $0xbeefcafe, %eax\n\t" + "call *%eax\n\t" + "addl $12, %esp\n\t" + "ret\n\t" + ".globl ffi_trampoline_end\n\t" + "ffi_trampoline_end:\n\t" + ".globl _ffi_trampoline_end\n\t" + "_ffi_trampoline_end:\n\t" +); + +static VALUE +custom_trampoline(caddr_t args, Closure* handle) +{ + FunctionType* fnInfo = (FunctionType *) handle->info; + return (*fnInfo->invoke)(*(int *) args, *(VALUE **) (args + 4), handle->function, fnInfo); +} + +#endif /* __x86_64__ else __i386__ */ + +extern void ffi_trampoline(int argc, VALUE* argv, VALUE self); +extern void ffi_trampoline_end(void); +static int trampoline_offsets(long *, long *); + +static long trampoline_ctx_offset, trampoline_func_offset; + +static long +trampoline_offset(int off, const long value) +{ + caddr_t ptr; + for (ptr = (caddr_t) &ffi_trampoline + off; ptr < (caddr_t) &ffi_trampoline_end; ++ptr) { + if (*(long *) ptr == value) { + return ptr - (caddr_t) &ffi_trampoline; + } + } + + return -1; +} + +static int +trampoline_offsets(long* ctxOffset, long* fnOffset) +{ + *ctxOffset = trampoline_offset(0, TRAMPOLINE_CTX_MAGIC); + if (*ctxOffset == -1) { + return -1; + } + + *fnOffset = trampoline_offset(0, TRAMPOLINE_FUN_MAGIC); + if (*fnOffset == -1) { + return -1; + } + + return 0; +} + +static bool +prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) +{ + caddr_t ptr = (caddr_t) code; + + memcpy(ptr, &ffi_trampoline, trampoline_size()); + /* Patch the context and function addresses into the stub code */ + *(intptr_t *)(ptr + trampoline_ctx_offset) = (intptr_t) closure; + *(intptr_t *)(ptr + trampoline_func_offset) = (intptr_t) custom_trampoline; + + return true; +} + +static long +trampoline_size(void) +{ + return (caddr_t) &ffi_trampoline_end - (caddr_t) &ffi_trampoline; +} + +#endif /* CUSTOM_TRAMPOLINE */ + + +void +rbffi_MethodHandle_Init(VALUE module) +{ +#ifndef CUSTOM_TRAMPOLINE + ffi_status ffiStatus; +#endif + + defaultClosurePool = rbffi_ClosurePool_New((int) trampoline_size(), prep_trampoline, NULL); + +#if defined(CUSTOM_TRAMPOLINE) + if (trampoline_offsets(&trampoline_ctx_offset, &trampoline_func_offset) != 0) { + rb_raise(rb_eFatal, "Could not locate offsets in trampoline code"); + } +#else + ffiStatus = ffi_prep_cif(&mh_cif, FFI_DEFAULT_ABI, 3, &ffi_type_ulong, + methodHandleParamTypes); + if (ffiStatus != FFI_OK) { + rb_raise(rb_eFatal, "ffi_prep_cif failed. status=%#x", ffiStatus); + } + +#endif +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.h new file mode 100644 index 0000000..c3341bf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_METHODHANDLE_H +#define RBFFI_METHODHANDLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "Function.h" + + +typedef struct MethodHandlePool MethodHandlePool; +typedef struct MethodHandle MethodHandle; + + +MethodHandle* rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function); +void rbffi_MethodHandle_Free(MethodHandle* handle); +void* rbffi_MethodHandle_CodeAddress(MethodHandle* handle); +void rbffi_MethodHandle_Init(VALUE module); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_METHODHANDLE_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.o new file mode 100644 index 0000000000000000000000000000000000000000..230ac8aa1a19327faecb1bf1521a581f7f837cdf GIT binary patch literal 25780 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 SP73o<9sfQn#o*;T82=j<98VGe literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Platform.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Platform.c new file mode 100644 index 0000000..1305ad2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Platform.c @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2008-2010 Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef _MSC_VER +# include +#endif +# include +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdint.h" +# include "win32/stdbool.h" +#endif +#include +#include +#include "rbffi_endian.h" +#include "Platform.h" + +#if defined(__GNU__) || defined(__GLIBC__) +# include +#endif + +static VALUE PlatformModule = Qnil; + +/* + * Determine the cpu type at compile time - useful for MacOSX where the the + * system installed ruby incorrectly reports 'host_cpu' as 'powerpc' when running + * on intel. + */ +#if defined(__x86_64__) || defined(__x86_64) || defined(__amd64) || defined(_M_X64) || defined(_M_AMD64) +# define CPU "x86_64" + +#elif defined(__i386__) || defined(__i386) || defined(_M_IX86) +# define CPU "i386" + +#elif defined(__ppc64__) || defined(__powerpc64__) || defined(_M_PPC) +# define CPU "ppc64" + +#elif defined(__ppc__) || defined(__powerpc__) || defined(__powerpc) +# define CPU "ppc" + +/* Need to check for __sparcv9 first, because __sparc will be defined either way. */ +#elif defined(__sparcv9__) || defined(__sparcv9) +# define CPU "sparcv9" + +#elif defined(__sparc__) || defined(__sparc) +# define CPU "sparc" + +#elif defined(__arm__) || defined(__arm) +# define CPU "arm" + +#elif defined(__mips__) || defined(__mips) +# define CPU "mips" + +#elif defined(__s390__) +# define CPU "s390" + +#else +# define CPU "unknown" +#endif + +static void +export_primitive_types(VALUE module) +{ +#define S(name, T) do { \ + typedef struct { char c; T v; } s; \ + rb_define_const(module, #name "_ALIGN", INT2NUM((sizeof(s) - sizeof(T)) * 8)); \ + rb_define_const(module, #name "_SIZE", INT2NUM(sizeof(T)* 8)); \ +} while(0) + S(INT8, char); + S(INT16, short); + S(INT32, int); + S(INT64, long long); + S(LONG, long); + S(FLOAT, float); + S(DOUBLE, double); + S(ADDRESS, void*); +#undef S +} + +void +rbffi_Platform_Init(VALUE moduleFFI) +{ + PlatformModule = rb_define_module_under(moduleFFI, "Platform"); + rb_define_const(PlatformModule, "BYTE_ORDER", INT2FIX(BYTE_ORDER)); + rb_define_const(PlatformModule, "LITTLE_ENDIAN", INT2FIX(LITTLE_ENDIAN)); + rb_define_const(PlatformModule, "BIG_ENDIAN", INT2FIX(BIG_ENDIAN)); + rb_define_const(PlatformModule, "CPU", rb_str_new2(CPU)); +#if defined(__GNU__) || defined(__GLIBC__) + rb_define_const(PlatformModule, "GNU_LIBC", rb_str_new2(LIBC_SO)); +#endif + export_primitive_types(PlatformModule); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Platform.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Platform.h new file mode 100644 index 0000000..5575e34 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Platform.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2008-2010 Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_PLATFORM_H +#define RBFFI_PLATFORM_H + +#ifdef __cplusplus +extern "C" { +#endif + + extern void rbffi_Platform_Init(VALUE moduleFFI); + + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_PLATFORM_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Platform.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Platform.o new file mode 100644 index 0000000000000000000000000000000000000000..e22ce6ef434cf013f78dcc4eb3dac69ecb824245 GIT binary patch literal 16784 zcmeHNeQ;FO6~Axy?PDPygv6j$uyI5YhwSD95UeO0l8}`Rglqx?Dv!-(6BahRad$(2 zI({@Y6`f$5X{+O?V{L53!D>4ls#q0^Q*Fnp?NtBhm(Us8ID;+IFP&*iy-Ftrb-1E*o_uYHnyXXDv^pO{Z5Dra<8OWVNlprf@!=(_3u__ejj4*~Q zPk9gIJ&^Z6-UE3L; zP-#<{I5bUt(Rg=)nq=#{m7kAKSl_k+tI#*cdgj38v@aQo z_e4^Y_3blQ5ocTIv?`Nw>gx@KrHR@0DSbQ~;_UiDeSNWr84vZ6d6WA4CALpJ@>|bp zpQSI+xl;~swtatLeG9mcZ%$L6w68A|&em7P^FitR+cfp1_x9!N?=`IN7~6MYQRZNP z%Nmbxq8E0h&Hng6G~Q*Jf%=RVJRd3;JPv&{-$wAf@EB$3i|jDFlNb%FLH2r3!TMIQ zK2e-GfAKi(P*s$V&$nn?YRvZEcGmZ8Hf9y{5j`-4edK4k78Y3(iHyGp=~2kj)HsE_ z3pq`T79=84trE#o|Id}$oA$pKY-t)^`YJSyQR}Ataw-CP0nm}hXA<gb6{8Hz%C`sm#J@V4y-6gTO$W{8mhAG`^bhh z4Zh;udei$rL`y7`?oK3oMO{Z*gSo!7zM)kF{B3Q42D4#Zz2CP^)cMz_;_8-mv1j=* zbJ-H%U)Q$W^acED)>*}%e@g?Es+UcmC@Z+OW&%c8!ONCRz$i;NuzuYdMrBcgje+&P zHb$+ogzMM0*TGWD4rXM9ufD#uAsFNu#mOom+|+T9k5=7^Kwx8Y#qLNl6-~q|R(PsB zRTWo-W7sMxS5$%V)UNQ6B<~ zuj?>3bcbT82$$2zepQS|V+_KWNViq?H#aw6q%r)>zTjF5YxHkk*WPS427GH6z*qpV zNm#&yM6jc|ZhgSkB-qlh+V2aP!6tuWn`J#2O)0XcFOf`}eaUEVG#%X?F|Dnj*XnMv zlf0mwOw%8ariE42*yy*04%bpHX`+1`tzGp+(Y z4_nF%4^Wa_crg@KK+f$#6(RmIA!d4T&r)O6MM~%f5))#UOE@l^5G$CkRhN{g*z%-y+$bIRyl)$t$-Hy}A`W;)f&rt?Ms2a&Y6{xq@~Zr97m zbnTF4yp4h|PT+EZaS~Uz@lRZr7&4M)&`P8k3vqQC%W-uWeq0NUEx5Xc-iyrT)^}5; z&)A2|u|;#=Cv!4FU{kP&Y|}PAKsCK`=Q<>dBvkM?E^62s2_7iC9MDr%OVJecH35~| z7HwVX4TCUE7~%{QiP!G>VcQkAb$6dSbn9>FJ%GLpXgeg+Nd9+7L}Uo@&q+=Q@*441 zGq3JR7*Vc!o{J1^m6R?ZWgzMY+3p0Y%gtKIe$f4Bi>5AZPwl+>gTy^_h1&?`_ z7gtV71aB6x!2I0}tqGDvky+t(_zJtbO6;SBc(q)5p;q@y2Nqols4gs-?{$g#S}s2h~8 zBacDWAx=P2(>^XP!d2b_sOF`$IvNh8u}G)9o5P8&hzBpZ-qneCIucK(y!DaYkyxTH zlJu%|Bjs%lh1Ul+d-`~bv&jVO*Q)C3Do=H-C)Ksf8{C^pM|!=1XlF8%-0N+m7r=o; za#zaRignf_UkHi!ZnQRw6fNW4{#4Q%jfZ3XUDn!OX|3(FGz+;vdv=gFl~ve3h;)aT zIsVS+{6J`~xwF=~E->D4xr}~SxqBt@w5!~3mrWEF1Ho#bYwl9lJj1=fVw^kEz#NAA zI;t|~ImGsVsPLv;J{vh+#IEu=zGk<{V?_gf85kgebgGTMUxxRz> zR^}U+zn*z|og(?GnV-)*El|KKXEIOA7V-apqe=eHR$h66`Cl{tbLM}-JS_wyPv5E3 zp4KGdX}S=9AM-TvK=TK2A$*UOm*0$B2T$h+)NVU+(EJWuNN&BAmp2g#+=mO{w0@I( z6`{Zv;X*jg8N$m61x}v@m?)LBpc4KEW5vQOp6s{R3p3e?qls>O)>v;J1Wew#ZBo`Qj?c8NNK%aN@cfoTaya5J^2l5`sdm!(Dya)0g$a^5~fxHLu9{8W~z#CTlpAWXIgQ!FJAQlzY zcjFQ&=b#7hLHio&D5uaLrP(Yuoml_d_$a0JMBDL^9H4?N#(%c>KDDQB z>z}H_`rkx_z_a7kuR+HW=orC?I1R*cj4k;XG-+I7Q^dSKfsTjJ=oLOyAIqVG`~_Hu ztT^{6fOL?)7@^-ToB(r1o`qYZVHH>hcRw?D{+W^^|OK)#XS2ZFimViNz(Zj#HJNhm$vKZ3dK|x zOHK$1UJ%J{Qz%wOMQU6!fbFaUa1coauk~EPYljS8>oRz4$l$fp7Q7a=;B|3E@LJCu zyp|TpS0J)UYo8RjCV>Kqz|znxqTw1Sq!=j0jfhlmnD!t_yw&mkbZ$ZGUywqO3R-{9 zV#kBlS2C~eDZL9U*FDcghW1%XDz;1g_-_ZT{m^MW6yrf_8t(;2AQiO!2FeV{Cjl%C zKvvND-U%uB?tsnhj1KMEE$%{Hze}T-nj#ujU$Og6M_rMtame*m9bsrW$p1GnXcsn0 zJeyYh`8~v+-8UlM+~e+WcOVG;ylb)1Z4WuGl8nQ-vl~HX-EeQVV$Ee|=SnTf4oi|b zZkLl&k}l0~mbgnDZbY7cN>dDPgD-1h^jT@S_$I|fpJn_R;I#FFB>o-79|Zo04VV9> zK+k^Q_u250XY)6xmH2>(BiUSq>K&Rz6J;EQcI{qREa_|0du!iK-f_)Ea&+VI1Se;0Ux z4Sy6o$Bw0c?`Jv8xlxBrZU{K$bJ4B94IAE{)jr1Ud$RDY;6FqkLGnJWEZ3YR*8rYg zsFmDxEQfEC(cjx}tc@9V&xah=u_CN#qqGKqj0jy5nzLeJ@hn&vwbe+}?!cTE- dkEh#X>7 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. + */ + +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdint.h" +# include "win32/stdbool.h" +#endif +#include +#include +#include "rbffi.h" +#include "rbffi_endian.h" +#include "AbstractMemory.h" +#include "Pointer.h" + +#define POINTER(obj) rbffi_AbstractMemory_Cast((obj), rbffi_PointerClass) + +VALUE rbffi_PointerClass = Qnil; +VALUE rbffi_NullPointerSingleton = Qnil; + +static void ptr_release(Pointer* ptr); +static void ptr_mark(Pointer* ptr); + +VALUE +rbffi_Pointer_NewInstance(void* addr) +{ + Pointer* p; + VALUE obj; + + if (addr == NULL) { + return rbffi_NullPointerSingleton; + } + + obj = Data_Make_Struct(rbffi_PointerClass, Pointer, NULL, -1, p); + p->memory.address = addr; + p->memory.size = LONG_MAX; + p->memory.flags = (addr == NULL) ? 0 : (MEM_RD | MEM_WR); + p->memory.typeSize = 1; + p->rbParent = Qnil; + + return obj; +} + +static VALUE +ptr_allocate(VALUE klass) +{ + Pointer* p; + VALUE obj; + + obj = Data_Make_Struct(klass, Pointer, ptr_mark, ptr_release, p); + p->rbParent = Qnil; + p->memory.flags = MEM_RD | MEM_WR; + + return obj; +} + +/* + * @overload initialize(pointer) + * @param [Pointer] pointer another pointer to initialize from + * Create a new pointer from another {Pointer}. + * @overload initialize(type, address) + * @param [Type] type type for pointer + * @param [Integer] address base address for pointer + * Create a new pointer from a {Type} and a base address + * @return [self] + * A new instance of Pointer. + */ +static VALUE +ptr_initialize(int argc, VALUE* argv, VALUE self) +{ + Pointer* p; + VALUE rbType = Qnil, rbAddress = Qnil; + int typeSize = 1; + + Data_Get_Struct(self, Pointer, p); + + switch (rb_scan_args(argc, argv, "11", &rbType, &rbAddress)) { + case 1: + rbAddress = rbType; + typeSize = 1; + break; + case 2: + typeSize = rbffi_type_size(rbType); + break; + default: + rb_raise(rb_eArgError, "Invalid arguments"); + } + + switch (TYPE(rbAddress)) { + case T_FIXNUM: + case T_BIGNUM: + p->memory.address = (void*) (uintptr_t) NUM2LL(rbAddress); + p->memory.size = LONG_MAX; + if (p->memory.address == NULL) { + p->memory.flags = 0; + } + break; + + default: + if (rb_obj_is_kind_of(rbAddress, rbffi_PointerClass)) { + Pointer* orig; + + p->rbParent = rbAddress; + Data_Get_Struct(rbAddress, Pointer, orig); + p->memory = orig->memory; + } else { + rb_raise(rb_eTypeError, "wrong argument type, expected Integer or FFI::Pointer"); + } + break; + } + + p->memory.typeSize = typeSize; + + return self; +} + +/* + * call-seq: ptr.initialize_copy(other) + * @param [Pointer] other source for cloning or dupping + * @return [self] + * @raise {RuntimeError} if +other+ is an unbounded memory area, or is unreadable/unwritable + * @raise {NoMemError} if failed to allocate memory for new object + * DO NOT CALL THIS METHOD. + * + * This method is internally used by #dup and #clone. Memory content is copied from +other+. + */ +static VALUE +ptr_initialize_copy(VALUE self, VALUE other) +{ + AbstractMemory* src; + Pointer* dst; + + Data_Get_Struct(self, Pointer, dst); + src = POINTER(other); + if (src->size == LONG_MAX) { + rb_raise(rb_eRuntimeError, "cannot duplicate unbounded memory area"); + return Qnil; + } + + if ((dst->memory.flags & (MEM_RD | MEM_WR)) != (MEM_RD | MEM_WR)) { + rb_raise(rb_eRuntimeError, "cannot duplicate unreadable/unwritable memory area"); + return Qnil; + } + + if (dst->storage != NULL) { + xfree(dst->storage); + dst->storage = NULL; + } + + dst->storage = xmalloc(src->size + 7); + if (dst->storage == NULL) { + rb_raise(rb_eNoMemError, "failed to allocate memory size=%lu bytes", src->size); + return Qnil; + } + + dst->allocated = true; + dst->autorelease = true; + dst->memory.address = (void *) (((uintptr_t) dst->storage + 0x7) & (uintptr_t) ~0x7UL); + dst->memory.size = src->size; + dst->memory.typeSize = src->typeSize; + + /* finally, copy the actual memory contents */ + memcpy(dst->memory.address, src->address, src->size); + + return self; +} + +static VALUE +slice(VALUE self, long offset, long size) +{ + AbstractMemory* ptr; + Pointer* p; + VALUE retval; + + Data_Get_Struct(self, AbstractMemory, ptr); + checkBounds(ptr, offset, size == LONG_MAX ? 1 : size); + + retval = Data_Make_Struct(rbffi_PointerClass, Pointer, ptr_mark, -1, p); + + p->memory.address = ptr->address + offset; + p->memory.size = size; + p->memory.flags = ptr->flags; + p->memory.typeSize = ptr->typeSize; + p->rbParent = self; + + return retval; +} + +/* + * Document-method: + + * call-seq: ptr + offset + * @param [Numeric] offset + * @return [Pointer] + * Return a new {Pointer} from an existing pointer and an +offset+. + */ +static VALUE +ptr_plus(VALUE self, VALUE offset) +{ + AbstractMemory* ptr; + long off = NUM2LONG(offset); + + Data_Get_Struct(self, AbstractMemory, ptr); + + return slice(self, off, ptr->size == LONG_MAX ? LONG_MAX : ptr->size - off); +} + +/* + * call-seq: ptr.slice(offset, length) + * @param [Numeric] offset + * @param [Numeric] length + * @return [Pointer] + * Return a new {Pointer} from an existing one. This pointer points on same contents + * from +offset+ for a length +length+. + */ +static VALUE +ptr_slice(VALUE self, VALUE rbOffset, VALUE rbLength) +{ + return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength)); +} + +/* + * call-seq: ptr.inspect + * @return [String] + * Inspect pointer object. + */ +static VALUE +ptr_inspect(VALUE self) +{ + char buf[100]; + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + if (ptr->memory.size != LONG_MAX) { + snprintf(buf, sizeof(buf), "#<%s address=%p size=%lu>", + rb_obj_classname(self), ptr->memory.address, ptr->memory.size); + } else { + snprintf(buf, sizeof(buf), "#<%s address=%p>", rb_obj_classname(self), ptr->memory.address); + } + + return rb_str_new2(buf); +} + +/* + * Document-method: null? + * call-seq: ptr.null? + * @return [Boolean] + * Return +true+ if +self+ is a {NULL} pointer. + */ +static VALUE +ptr_null_p(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + return ptr->memory.address == NULL ? Qtrue : Qfalse; +} + +/* + * Document-method: == + * call-seq: ptr == other + * @param [Pointer] other + * Check equality between +self+ and +other+. Equality is tested on {#address}. + */ +static VALUE +ptr_equals(VALUE self, VALUE other) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + if (NIL_P(other)) { + return ptr->memory.address == NULL ? Qtrue : Qfalse; + } + + return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse; +} + +/* + * call-seq: ptr.address + * @return [Numeric] pointer's base address + * Return +self+'s base address (alias: #to_i). + */ +static VALUE +ptr_address(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + return ULL2NUM((uintptr_t) ptr->memory.address); +} + +#if BYTE_ORDER == LITTLE_ENDIAN +# define SWAPPED_ORDER BIG_ENDIAN +#else +# define SWAPPED_ORDER LITTLE_ENDIAN +#endif + +/* + * Get or set +self+'s endianness + * @overload order + * @return [:big, :little] endianness of +self+ + * @overload order(order) + * @param [Symbol] order endianness to set (+:little+, +:big+ or +:network+). +:big+ and +:network+ + * are synonymous. + * @return [self] + */ +static VALUE +ptr_order(int argc, VALUE* argv, VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + if (argc == 0) { + int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER; + return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little")); + } else { + VALUE rbOrder = Qnil; + int order = BYTE_ORDER; + + if (rb_scan_args(argc, argv, "1", &rbOrder) < 1) { + rb_raise(rb_eArgError, "need byte order"); + } + if (SYMBOL_P(rbOrder)) { + ID id = SYM2ID(rbOrder); + if (id == rb_intern("little")) { + order = LITTLE_ENDIAN; + + } else if (id == rb_intern("big") || id == rb_intern("network")) { + order = BIG_ENDIAN; + } + } + if (order != BYTE_ORDER) { + Pointer* p2; + VALUE retval = slice(self, 0, ptr->memory.size); + + Data_Get_Struct(retval, Pointer, p2); + p2->memory.flags |= MEM_SWAP; + return retval; + } + + return self; + } +} + + +/* + * call-seq: ptr.free + * @return [self] + * Free memory pointed by +self+. + */ +static VALUE +ptr_free(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + if (ptr->allocated) { + if (ptr->storage != NULL) { + xfree(ptr->storage); + ptr->storage = NULL; + } + ptr->allocated = false; + + } else { + VALUE caller = rb_funcall(rb_funcall(Qnil, rb_intern("caller"), 0), rb_intern("first"), 0); + + rb_warn("calling free on non allocated pointer %s from %s", RSTRING_PTR(ptr_inspect(self)), RSTRING_PTR(rb_str_to_str(caller))); + } + + return self; +} + +static VALUE +ptr_type_size(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + return INT2NUM(ptr->memory.typeSize); +} + +/* + * call-seq: ptr.autorelease = autorelease + * @param [Boolean] autorelease + * @return [Boolean] +autorelease+ + * Set +autorelease+ attribute. See also Autorelease section. + */ +static VALUE +ptr_autorelease(VALUE self, VALUE autorelease) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + ptr->autorelease = autorelease == Qtrue; + + return autorelease; +} + +/* + * call-seq: ptr.autorelease? + * @return [Boolean] + * Get +autorelease+ attribute. See also Autorelease section. + */ +static VALUE +ptr_autorelease_p(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + return ptr->autorelease ? Qtrue : Qfalse; +} + + +static void +ptr_release(Pointer* ptr) +{ + if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) { + xfree(ptr->storage); + ptr->storage = NULL; + } + xfree(ptr); +} + +static void +ptr_mark(Pointer* ptr) +{ + rb_gc_mark(ptr->rbParent); +} + +void +rbffi_Pointer_Init(VALUE moduleFFI) +{ + VALUE rbNullAddress = ULL2NUM(0); + VALUE ffi_AbstractMemory = rbffi_AbstractMemoryClass; + + /* + * Document-class: FFI::Pointer < FFI::AbstractMemory + * Pointer class is used to manage C pointers with ease. A {Pointer} object is defined by his + * {#address} (as a C pointer). It permits additions with an integer for pointer arithmetic. + * + * ==Autorelease + * A pointer object may autorelease his contents when freed (by default). This behaviour may be + * changed with {#autorelease=} method. + */ + rbffi_PointerClass = rb_define_class_under(moduleFFI, "Pointer", ffi_AbstractMemory); + /* + * Document-variable: Pointer + */ + rb_global_variable(&rbffi_PointerClass); + + rb_define_alloc_func(rbffi_PointerClass, ptr_allocate); + rb_define_method(rbffi_PointerClass, "initialize", ptr_initialize, -1); + rb_define_method(rbffi_PointerClass, "initialize_copy", ptr_initialize_copy, 1); + rb_define_method(rbffi_PointerClass, "inspect", ptr_inspect, 0); + rb_define_method(rbffi_PointerClass, "to_s", ptr_inspect, 0); + rb_define_method(rbffi_PointerClass, "+", ptr_plus, 1); + rb_define_method(rbffi_PointerClass, "slice", ptr_slice, 2); + rb_define_method(rbffi_PointerClass, "null?", ptr_null_p, 0); + rb_define_method(rbffi_PointerClass, "address", ptr_address, 0); + rb_define_alias(rbffi_PointerClass, "to_i", "address"); + rb_define_method(rbffi_PointerClass, "==", ptr_equals, 1); + rb_define_method(rbffi_PointerClass, "order", ptr_order, -1); + rb_define_method(rbffi_PointerClass, "autorelease=", ptr_autorelease, 1); + rb_define_method(rbffi_PointerClass, "autorelease?", ptr_autorelease_p, 0); + rb_define_method(rbffi_PointerClass, "free", ptr_free, 0); + rb_define_method(rbffi_PointerClass, "type_size", ptr_type_size, 0); + + rbffi_NullPointerSingleton = rb_class_new_instance(1, &rbNullAddress, rbffi_PointerClass); + /* + * NULL pointer + */ + rb_define_const(rbffi_PointerClass, "NULL", rbffi_NullPointerSingleton); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.h new file mode 100644 index 0000000..2d86851 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_POINTER_H +#define RBFFI_POINTER_H + +#ifndef _MSC_VER +# include +#else +# include "win32/stdbool.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "AbstractMemory.h" + +extern void rbffi_Pointer_Init(VALUE moduleFFI); +extern VALUE rbffi_Pointer_NewInstance(void* addr); +extern VALUE rbffi_PointerClass; +extern VALUE rbffi_NullPointerSingleton; + +typedef struct Pointer { + AbstractMemory memory; + VALUE rbParent; + char* storage; /* start of malloc area */ + bool autorelease; + bool allocated; +} Pointer; + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_POINTER_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.o new file mode 100644 index 0000000000000000000000000000000000000000..d4643b4b0cb2ddf76a4dfdc9614c01042f0eb53c GIT binary patch literal 54544 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 N&JY#fDS#LJ{|DF + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#include +#ifndef _MSC_VER +# include +# include +# include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif +#include +#include "rbffi.h" +#include "compat.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "MemoryPointer.h" +#include "Function.h" +#include "Types.h" +#include "Function.h" +#include "StructByValue.h" +#include "ArrayType.h" +#include "MappedType.h" +#include "Struct.h" + +typedef struct InlineArray_ { + VALUE rbMemory; + VALUE rbField; + + AbstractMemory* memory; + StructField* field; + MemoryOp *op; + Type* componentType; + ArrayType* arrayType; + int length; +} InlineArray; + + +static void struct_mark(Struct *); +static void struct_free(Struct *); +static VALUE struct_class_layout(VALUE klass); +static void struct_malloc(Struct* s); +static void inline_array_mark(InlineArray *); +static void store_reference_value(StructField* f, Struct* s, VALUE value); + +VALUE rbffi_StructClass = Qnil; + +VALUE rbffi_StructInlineArrayClass = Qnil; +VALUE rbffi_StructLayoutCharArrayClass = Qnil; + +static ID id_pointer_ivar = 0, id_layout_ivar = 0; +static ID id_get = 0, id_put = 0, id_to_ptr = 0, id_to_s = 0, id_layout = 0; + +static inline char* +memory_address(VALUE self) +{ + return ((AbstractMemory *)DATA_PTR((self)))->address; +} + +static VALUE +struct_allocate(VALUE klass) +{ + Struct* s; + VALUE obj = Data_Make_Struct(klass, Struct, struct_mark, struct_free, s); + + s->rbPointer = Qnil; + s->rbLayout = Qnil; + + return obj; +} + +/* + * call-seq: initialize + * @overload initialize(pointer, *args) + * @param [AbstractMemory] pointer + * @param [Array] args + * @return [self] + */ +static VALUE +struct_initialize(int argc, VALUE* argv, VALUE self) +{ + Struct* s; + VALUE rbPointer = Qnil, rest = Qnil, klass = CLASS_OF(self); + int nargs; + + Data_Get_Struct(self, Struct, s); + + nargs = rb_scan_args(argc, argv, "01*", &rbPointer, &rest); + + /* Call up into ruby code to adjust the layout */ + if (nargs > 1) { + s->rbLayout = rb_funcall2(CLASS_OF(self), id_layout, (int) RARRAY_LEN(rest), RARRAY_PTR(rest)); + } else { + s->rbLayout = struct_class_layout(klass); + } + + if (!rb_obj_is_kind_of(s->rbLayout, rbffi_StructLayoutClass)) { + rb_raise(rb_eRuntimeError, "Invalid Struct layout"); + } + + Data_Get_Struct(s->rbLayout, StructLayout, s->layout); + + if (rbPointer != Qnil) { + s->pointer = MEMORY(rbPointer); + s->rbPointer = rbPointer; + } else { + struct_malloc(s); + } + + return self; +} + +/* + * call-seq: initialize_copy(other) + * @return [nil] + * DO NOT CALL THIS METHOD + */ +static VALUE +struct_initialize_copy(VALUE self, VALUE other) +{ + Struct* src; + Struct* dst; + + Data_Get_Struct(self, Struct, dst); + Data_Get_Struct(other, Struct, src); + if (dst == src) { + return self; + } + + dst->rbLayout = src->rbLayout; + dst->layout = src->layout; + + /* + * A new MemoryPointer instance is allocated here instead of just calling + * #dup on rbPointer, since the Pointer may not know its length, or may + * be longer than just this struct. + */ + if (src->pointer->address != NULL) { + dst->rbPointer = rbffi_MemoryPointer_NewInstance(1, src->layout->size, false); + dst->pointer = MEMORY(dst->rbPointer); + memcpy(dst->pointer->address, src->pointer->address, src->layout->size); + } else { + dst->rbPointer = src->rbPointer; + dst->pointer = src->pointer; + } + + if (src->layout->referenceFieldCount > 0) { + dst->rbReferences = ALLOC_N(VALUE, dst->layout->referenceFieldCount); + memcpy(dst->rbReferences, src->rbReferences, dst->layout->referenceFieldCount * sizeof(VALUE)); + } + + return self; +} + +static VALUE +struct_class_layout(VALUE klass) +{ + VALUE layout; + if (!rb_ivar_defined(klass, id_layout_ivar)) { + rb_raise(rb_eRuntimeError, "no Struct layout configured for %s", rb_class2name(klass)); + } + + layout = rb_ivar_get(klass, id_layout_ivar); + if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) { + rb_raise(rb_eRuntimeError, "invalid Struct layout for %s", rb_class2name(klass)); + } + + return layout; +} + +static StructLayout* +struct_layout(VALUE self) +{ + Struct* s = (Struct *) DATA_PTR(self); + if (s->layout != NULL) { + return s->layout; + } + + if (s->layout == NULL) { + s->rbLayout = struct_class_layout(CLASS_OF(self)); + Data_Get_Struct(s->rbLayout, StructLayout, s->layout); + } + + return s->layout; +} + +static Struct* +struct_validate(VALUE self) +{ + Struct* s; + Data_Get_Struct(self, Struct, s); + + if (struct_layout(self) == NULL) { + rb_raise(rb_eRuntimeError, "struct layout == null"); + } + + if (s->pointer == NULL) { + struct_malloc(s); + } + + return s; +} + +static void +struct_malloc(Struct* s) +{ + if (s->rbPointer == Qnil) { + s->rbPointer = rbffi_MemoryPointer_NewInstance(s->layout->size, 1, true); + + } else if (!rb_obj_is_kind_of(s->rbPointer, rbffi_AbstractMemoryClass)) { + rb_raise(rb_eRuntimeError, "invalid pointer in struct"); + } + + s->pointer = (AbstractMemory *) DATA_PTR(s->rbPointer); +} + +static void +struct_mark(Struct *s) +{ + rb_gc_mark(s->rbPointer); + rb_gc_mark(s->rbLayout); + if (s->rbReferences != NULL) { + rb_gc_mark_locations(&s->rbReferences[0], &s->rbReferences[s->layout->referenceFieldCount]); + } +} + +static void +struct_free(Struct* s) +{ + xfree(s->rbReferences); + xfree(s); +} + + +static void +store_reference_value(StructField* f, Struct* s, VALUE value) +{ + if (unlikely(f->referenceIndex == -1)) { + rb_raise(rb_eRuntimeError, "put_reference_value called for non-reference type"); + return; + } + if (s->rbReferences == NULL) { + int i; + s->rbReferences = ALLOC_N(VALUE, s->layout->referenceFieldCount); + for (i = 0; i < s->layout->referenceFieldCount; ++i) { + s->rbReferences[i] = Qnil; + } + } + + s->rbReferences[f->referenceIndex] = value; +} + + +static VALUE +struct_field(Struct* s, VALUE fieldName) +{ + StructLayout* layout = s->layout; + VALUE rbField; + + if (likely(SYMBOL_P(fieldName) && st_lookup(layout->fieldSymbolTable, fieldName, (st_data_t *) &rbField))) { + return rbField; + } + + // TODO does this ever return anything? + rbField = rb_hash_aref(layout->rbFieldMap, fieldName); + if (rbField == Qnil) { + VALUE str = rb_funcall2(fieldName, id_to_s, 0, NULL); + rb_raise(rb_eArgError, "No such field '%s'", StringValuePtr(str)); + } + + return rbField; +} + +/* + * call-seq: struct[field_name] + * @param field_name field to access + * Acces to a Struct field. + */ +static VALUE +struct_aref(VALUE self, VALUE fieldName) +{ + Struct* s; + VALUE rbField; + StructField* f; + + s = struct_validate(self); + + rbField = struct_field(s, fieldName); + f = (StructField *) DATA_PTR(rbField); + + if (f->get != NULL) { + return (*f->get)(f, s); + + } else if (f->memoryOp != NULL) { + return (*f->memoryOp->get)(s->pointer, f->offset); + + } else { + + /* call up to the ruby code to fetch the value */ + return rb_funcall2(rbField, id_get, 1, &s->rbPointer); + } +} + +/* + * call-seq: []=(field_name, value) + * @param field_name field to access + * @param value value to set to +field_name+ + * @return [value] + * Set a field in Struct. + */ +static VALUE +struct_aset(VALUE self, VALUE fieldName, VALUE value) +{ + Struct* s; + VALUE rbField; + StructField* f; + + + s = struct_validate(self); + + rbField = struct_field(s, fieldName); + f = (StructField *) DATA_PTR(rbField); + if (f->put != NULL) { + (*f->put)(f, s, value); + + } else if (f->memoryOp != NULL) { + + (*f->memoryOp->put)(s->pointer, f->offset, value); + + } else { + /* call up to the ruby code to set the value */ + VALUE argv[2]; + argv[0] = s->rbPointer; + argv[1] = value; + rb_funcall2(rbField, id_put, 2, argv); + } + + if (f->referenceRequired) { + store_reference_value(f, s, value); + } + + return value; +} + +/* + * call-seq: pointer= pointer + * @param [AbstractMemory] pointer + * @return [self] + * Make Struct point to +pointer+. + */ +static VALUE +struct_set_pointer(VALUE self, VALUE pointer) +{ + Struct* s; + StructLayout* layout; + AbstractMemory* memory; + + if (!rb_obj_is_kind_of(pointer, rbffi_AbstractMemoryClass)) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Pointer or Buffer)", + rb_obj_classname(pointer)); + return Qnil; + } + + + Data_Get_Struct(self, Struct, s); + Data_Get_Struct(pointer, AbstractMemory, memory); + layout = struct_layout(self); + + if ((int) layout->base.ffiType->size > memory->size) { + rb_raise(rb_eArgError, "memory of %ld bytes too small for struct %s (expected at least %ld)", + memory->size, rb_obj_classname(self), (long) layout->base.ffiType->size); + } + + s->pointer = MEMORY(pointer); + s->rbPointer = pointer; + rb_ivar_set(self, id_pointer_ivar, pointer); + + return self; +} + +/* + * call-seq: pointer + * @return [AbstractMemory] + * Get pointer to Struct contents. + */ +static VALUE +struct_get_pointer(VALUE self) +{ + Struct* s; + + Data_Get_Struct(self, Struct, s); + + return s->rbPointer; +} + +/* + * call-seq: layout= layout + * @param [StructLayout] layout + * @return [self] + * Set the Struct's layout. + */ +static VALUE +struct_set_layout(VALUE self, VALUE layout) +{ + Struct* s; + Data_Get_Struct(self, Struct, s); + + if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", + rb_obj_classname(layout), rb_class2name(rbffi_StructLayoutClass)); + return Qnil; + } + + Data_Get_Struct(layout, StructLayout, s->layout); + rb_ivar_set(self, id_layout_ivar, layout); + + return self; +} + +/* + * call-seq: layout + * @return [StructLayout] + * Get the Struct's layout. + */ +static VALUE +struct_get_layout(VALUE self) +{ + Struct* s; + + Data_Get_Struct(self, Struct, s); + + return s->rbLayout; +} + +/* + * call-seq: null? + * @return [Boolean] + * Test if Struct's pointer is NULL + */ +static VALUE +struct_null_p(VALUE self) +{ + Struct* s; + + Data_Get_Struct(self, Struct, s); + + return s->pointer->address == NULL ? Qtrue : Qfalse; +} + +/* + * (see Pointer#order) + */ +static VALUE +struct_order(int argc, VALUE* argv, VALUE self) +{ + Struct* s; + + Data_Get_Struct(self, Struct, s); + if (argc == 0) { + return rb_funcall(s->rbPointer, rb_intern("order"), 0); + + } else { + VALUE retval = rb_obj_dup(self); + VALUE rbPointer = rb_funcall2(s->rbPointer, rb_intern("order"), argc, argv); + struct_set_pointer(retval, rbPointer); + + return retval; + } +} + +static VALUE +inline_array_allocate(VALUE klass) +{ + InlineArray* array; + VALUE obj; + + obj = Data_Make_Struct(klass, InlineArray, inline_array_mark, -1, array); + array->rbField = Qnil; + array->rbMemory = Qnil; + + return obj; +} + +static void +inline_array_mark(InlineArray* array) +{ + rb_gc_mark(array->rbField); + rb_gc_mark(array->rbMemory); +} + +/* + * Document-method: FFI::Struct::InlineArray#initialize + * call-seq: initialize(memory, field) + * @param [AbstractMemory] memory + * @param [StructField] field + * @return [self] + */ +static VALUE +inline_array_initialize(VALUE self, VALUE rbMemory, VALUE rbField) +{ + InlineArray* array; + + Data_Get_Struct(self, InlineArray, array); + array->rbMemory = rbMemory; + array->rbField = rbField; + + Data_Get_Struct(rbMemory, AbstractMemory, array->memory); + Data_Get_Struct(rbField, StructField, array->field); + Data_Get_Struct(array->field->rbType, ArrayType, array->arrayType); + Data_Get_Struct(array->arrayType->rbComponentType, Type, array->componentType); + + array->op = get_memory_op(array->componentType); + if (array->op == NULL && array->componentType->nativeType == NATIVE_MAPPED) { + array->op = get_memory_op(((MappedType *) array->componentType)->type); + } + + array->length = array->arrayType->length; + + return self; +} + +/* + * call-seq: size + * @return [Numeric] + * Get size + */ +static VALUE +inline_array_size(VALUE self) +{ + InlineArray* array; + + Data_Get_Struct(self, InlineArray, array); + + return UINT2NUM(((ArrayType *) array->field->type)->length); +} + +static int +inline_array_offset(InlineArray* array, int index) +{ + if (index < 0 || (index >= array->length && array->length > 0)) { + rb_raise(rb_eIndexError, "index %d out of bounds", index); + } + + return (int) array->field->offset + (index * (int) array->componentType->ffiType->size); +} + +/* + * call-seq: [](index) + * @param [Numeric] index + * @return [Type, Struct] + */ +static VALUE +inline_array_aref(VALUE self, VALUE rbIndex) +{ + InlineArray* array; + + Data_Get_Struct(self, InlineArray, array); + + if (array->op != NULL) { + VALUE rbNativeValue = array->op->get(array->memory, + inline_array_offset(array, NUM2INT(rbIndex))); + if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) { + return rb_funcall(((MappedType *) array->componentType)->rbConverter, + rb_intern("from_native"), 2, rbNativeValue, Qnil); + } else { + return rbNativeValue; + } + + } else if (array->componentType->nativeType == NATIVE_STRUCT) { + VALUE rbOffset = INT2NUM(inline_array_offset(array, NUM2INT(rbIndex))); + VALUE rbLength = INT2NUM(array->componentType->ffiType->size); + VALUE rbPointer = rb_funcall(array->rbMemory, rb_intern("slice"), 2, rbOffset, rbLength); + + return rb_class_new_instance(1, &rbPointer, ((StructByValue *) array->componentType)->rbStructClass); + } else { + + rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(array->arrayType->rbComponentType)); + return Qnil; + } +} + +/* + * call-seq: []=(index, value) + * @param [Numeric] index + * @param [Type, Struct] + * @return [value] + */ +static VALUE +inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue) +{ + InlineArray* array; + + Data_Get_Struct(self, InlineArray, array); + + if (array->op != NULL) { + if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) { + rbValue = rb_funcall(((MappedType *) array->componentType)->rbConverter, + rb_intern("to_native"), 2, rbValue, Qnil); + } + array->op->put(array->memory, inline_array_offset(array, NUM2INT(rbIndex)), + rbValue); + + } else if (array->componentType->nativeType == NATIVE_STRUCT) { + int offset = inline_array_offset(array, NUM2INT(rbIndex)); + Struct* s; + + if (!rb_obj_is_kind_of(rbValue, rbffi_StructClass)) { + rb_raise(rb_eTypeError, "argument not an instance of struct"); + return Qnil; + } + + checkWrite(array->memory); + checkBounds(array->memory, offset, array->componentType->ffiType->size); + + Data_Get_Struct(rbValue, Struct, s); + checkRead(s->pointer); + checkBounds(s->pointer, 0, array->componentType->ffiType->size); + + memcpy(array->memory->address + offset, s->pointer->address, array->componentType->ffiType->size); + + } else { + ArrayType* arrayType; + Data_Get_Struct(array->field->rbType, ArrayType, arrayType); + + rb_raise(rb_eArgError, "set not supported for %s", rb_obj_classname(arrayType->rbComponentType)); + return Qnil; + } + + return rbValue; +} + +/* + * call-seq: each + * Yield block for each element of +self+. + */ +static VALUE +inline_array_each(VALUE self) +{ + InlineArray* array; + + int i; + + Data_Get_Struct(self, InlineArray, array); + + for (i = 0; i < array->length; ++i) { + rb_yield(inline_array_aref(self, INT2FIX(i))); + } + + return self; +} + +/* + * call-seq: to_a + * @return [Array] + * Convert +self+ to an array. + */ +static VALUE +inline_array_to_a(VALUE self) +{ + InlineArray* array; + VALUE obj; + int i; + + Data_Get_Struct(self, InlineArray, array); + obj = rb_ary_new2(array->length); + + + for (i = 0; i < array->length; ++i) { + rb_ary_push(obj, inline_array_aref(self, INT2FIX(i))); + } + + return obj; +} + +/* + * Document-method: FFI::StructLayout::CharArray#to_s + * call-seq: to_s + * @return [String] + * Convert +self+ to a string. + */ +static VALUE +inline_array_to_s(VALUE self) +{ + InlineArray* array; + VALUE argv[2]; + + Data_Get_Struct(self, InlineArray, array); + + if (array->componentType->nativeType != NATIVE_INT8 && array->componentType->nativeType != NATIVE_UINT8) { + VALUE dummy = Qnil; + return rb_call_super(0, &dummy); + } + + argv[0] = UINT2NUM(array->field->offset); + argv[1] = UINT2NUM(array->length); + + return rb_funcall2(array->rbMemory, rb_intern("get_string"), 2, argv); +} + +/* + * call-seq: to_ptr + * @return [AbstractMemory] + * Get pointer to +self+ content. + */ +static VALUE +inline_array_to_ptr(VALUE self) +{ + InlineArray* array; + + Data_Get_Struct(self, InlineArray, array); + + return rb_funcall(array->rbMemory, rb_intern("slice"), 2, + UINT2NUM(array->field->offset), UINT2NUM(array->arrayType->base.ffiType->size)); +} + + +void +rbffi_Struct_Init(VALUE moduleFFI) +{ + VALUE StructClass; + + rbffi_StructLayout_Init(moduleFFI); + + /* + * Document-class: FFI::Struct + * + * A FFI::Struct means to mirror a C struct. + * + * A Struct is defined as: + * class MyStruct < FFI::Struct + * layout :value1, :int, + * :value2, :double + * end + * and is used as: + * my_struct = MyStruct.new + * my_struct[:value1] = 12 + * + * For more information, see http://github.com/ffi/ffi/wiki/Structs + */ + rbffi_StructClass = rb_define_class_under(moduleFFI, "Struct", rb_cObject); + StructClass = rbffi_StructClass; // put on a line alone to help RDoc + rb_global_variable(&rbffi_StructClass); + + /* + * Document-class: FFI::Struct::InlineArray + */ + rbffi_StructInlineArrayClass = rb_define_class_under(rbffi_StructClass, "InlineArray", rb_cObject); + rb_global_variable(&rbffi_StructInlineArrayClass); + + /* + * Document-class: FFI::StructLayout::CharArray < FFI::Struct::InlineArray + */ + rbffi_StructLayoutCharArrayClass = rb_define_class_under(rbffi_StructLayoutClass, "CharArray", + rbffi_StructInlineArrayClass); + rb_global_variable(&rbffi_StructLayoutCharArrayClass); + + + rb_define_alloc_func(StructClass, struct_allocate); + rb_define_method(StructClass, "initialize", struct_initialize, -1); + rb_define_method(StructClass, "initialize_copy", struct_initialize_copy, 1); + rb_define_method(StructClass, "order", struct_order, -1); + + rb_define_alias(rb_singleton_class(StructClass), "alloc_in", "new"); + rb_define_alias(rb_singleton_class(StructClass), "alloc_out", "new"); + rb_define_alias(rb_singleton_class(StructClass), "alloc_inout", "new"); + rb_define_alias(rb_singleton_class(StructClass), "new_in", "new"); + rb_define_alias(rb_singleton_class(StructClass), "new_out", "new"); + rb_define_alias(rb_singleton_class(StructClass), "new_inout", "new"); + + rb_define_method(StructClass, "pointer", struct_get_pointer, 0); + rb_define_private_method(StructClass, "pointer=", struct_set_pointer, 1); + + rb_define_method(StructClass, "layout", struct_get_layout, 0); + rb_define_private_method(StructClass, "layout=", struct_set_layout, 1); + + rb_define_method(StructClass, "[]", struct_aref, 1); + rb_define_method(StructClass, "[]=", struct_aset, 2); + rb_define_method(StructClass, "null?", struct_null_p, 0); + + rb_include_module(rbffi_StructInlineArrayClass, rb_mEnumerable); + rb_define_alloc_func(rbffi_StructInlineArrayClass, inline_array_allocate); + rb_define_method(rbffi_StructInlineArrayClass, "initialize", inline_array_initialize, 2); + rb_define_method(rbffi_StructInlineArrayClass, "[]", inline_array_aref, 1); + rb_define_method(rbffi_StructInlineArrayClass, "[]=", inline_array_aset, 2); + rb_define_method(rbffi_StructInlineArrayClass, "each", inline_array_each, 0); + rb_define_method(rbffi_StructInlineArrayClass, "size", inline_array_size, 0); + rb_define_method(rbffi_StructInlineArrayClass, "to_a", inline_array_to_a, 0); + rb_define_method(rbffi_StructInlineArrayClass, "to_ptr", inline_array_to_ptr, 0); + + rb_define_method(rbffi_StructLayoutCharArrayClass, "to_s", inline_array_to_s, 0); + rb_define_alias(rbffi_StructLayoutCharArrayClass, "to_str", "to_s"); + + id_pointer_ivar = rb_intern("@pointer"); + id_layout_ivar = rb_intern("@layout"); + id_layout = rb_intern("layout"); + id_get = rb_intern("get"); + id_put = rb_intern("put"); + id_to_ptr = rb_intern("to_ptr"); + id_to_s = rb_intern("to_s"); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Struct.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Struct.h new file mode 100644 index 0000000..85e8263 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Struct.h @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (c) 2009, Luc Heinrich + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_STRUCT_H +#define RBFFI_STRUCT_H + +#include "extconf.h" +#include "AbstractMemory.h" +#include "Type.h" +#ifdef RUBY_1_9 +#include +#else +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + extern void rbffi_Struct_Init(VALUE ffiModule); + extern void rbffi_StructLayout_Init(VALUE ffiModule); + typedef struct StructField_ StructField; + typedef struct StructLayout_ StructLayout; + typedef struct Struct_ Struct; + + struct StructField_ { + Type* type; + unsigned int offset; + + int referenceIndex; + + bool referenceRequired; + VALUE rbType; + VALUE rbName; + + VALUE (*get)(StructField* field, Struct* s); + void (*put)(StructField* field, Struct* s, VALUE value); + + MemoryOp* memoryOp; + }; + + struct StructLayout_ { + Type base; + StructField** fields; + int fieldCount; + int size; + int align; + ffi_type** ffiTypes; + struct st_table* fieldSymbolTable; + + /** The number of reference tracking fields in this struct */ + int referenceFieldCount; + + VALUE rbFieldNames; + VALUE rbFieldMap; + VALUE rbFields; + }; + + struct Struct_ { + StructLayout* layout; + AbstractMemory* pointer; + VALUE* rbReferences; + + VALUE rbLayout; + VALUE rbPointer; + }; + + extern VALUE rbffi_StructClass, rbffi_StructLayoutClass; + extern VALUE rbffi_StructLayoutFieldClass, rbffi_StructLayoutFunctionFieldClass; + extern VALUE rbffi_StructLayoutArrayFieldClass; + extern VALUE rbffi_StructInlineArrayClass; + extern VALUE rbffi_StructLayoutCharArrayClass; + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_STRUCT_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Struct.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Struct.o new file mode 100644 index 0000000000000000000000000000000000000000..fd324ccc5346f12e1fde546dfce3f9fb0de515c9 GIT binary patch literal 95200 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 Bzfu4I literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.c new file mode 100644 index 0000000..73e5111 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2010, Wayne Meissner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * 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. + * * The name of the author or authors 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. + */ + +#ifndef _MSC_VER +# include +#endif +#include +#include +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif +#include +#include + +#include +#include "rbffi.h" +#include "compat.h" + +#include "Pointer.h" +#include "Struct.h" +#include "StructByReference.h" + + +#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) + +static VALUE sbr_allocate(VALUE); +static VALUE sbr_initialize(VALUE, VALUE); +static void sbr_mark(StructByReference *); + +VALUE rbffi_StructByReferenceClass = Qnil; + +static VALUE +sbr_allocate(VALUE klass) +{ + StructByReference* sbr; + + VALUE obj = Data_Make_Struct(klass, StructByReference, sbr_mark, -1, sbr); + + sbr->rbStructClass = Qnil; + + return obj; +} + +/* + * call-seq: initialize(struc_class) + * @param [Struct] struct_calss + * @return [self] + * A new instance of StructByReference. + */ +static VALUE +sbr_initialize(VALUE self, VALUE rbStructClass) +{ + StructByReference* sbr = NULL; + + if (!rb_class_inherited_p(rbStructClass, rbffi_StructClass)) { + rb_raise(rb_eTypeError, "wrong type (expected subclass of FFI::Struct)"); + } + + Data_Get_Struct(self, StructByReference, sbr); + sbr->rbStructClass = rbStructClass; + + return self; +} + +static void +sbr_mark(StructByReference *sbr) +{ + rb_gc_mark(sbr->rbStructClass); +} + + +/* + * call-seq: struct_class + * @return [Struct] + * Get +struct_class+. + */ +static VALUE +sbr_struct_class(VALUE self) +{ + StructByReference* sbr; + + Data_Get_Struct(self, StructByReference, sbr); + + return sbr->rbStructClass; +} + +/* + * call-seq: native_type + * @return [Class] + * Always get {FFI::Type}::POINTER. + */ +static VALUE +sbr_native_type(VALUE self) +{ + return rb_const_get(rbffi_TypeClass, rb_intern("POINTER")); +} + +/* + * call-seq: to_native(value, ctx) + * @param [nil, Struct] value + * @param [nil] ctx + * @return [AbstractMemory] Pointer on +value+. + */ +static VALUE +sbr_to_native(VALUE self, VALUE value, VALUE ctx) +{ + StructByReference* sbr; + Struct* s; + + if (unlikely(value == Qnil)) { + return rbffi_NullPointerSingleton; + } + + Data_Get_Struct(self, StructByReference, sbr); + if (!rb_obj_is_kind_of(value, sbr->rbStructClass)) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", + rb_obj_classname(value), + RSTRING_PTR(rb_class_name(sbr->rbStructClass))); + } + + Data_Get_Struct(value, Struct, s); + + return s->rbPointer; +} + +/* + * call-seq: from_native(value, ctx) + * @param [AbstractMemory] value + * @param [nil] ctx + * @return [Struct] + * Create a struct from content of memory +value+. + */ +static VALUE +sbr_from_native(VALUE self, VALUE value, VALUE ctx) +{ + StructByReference* sbr; + + Data_Get_Struct(self, StructByReference, sbr); + + return rb_class_new_instance(1, &value, sbr->rbStructClass); +} + + +void +rbffi_StructByReference_Init(VALUE moduleFFI) +{ + /* + * Document-class: FFI::StructByReference + * This class includes {FFI::DataConverter} module. + */ + rbffi_StructByReferenceClass = rb_define_class_under(moduleFFI, "StructByReference", rb_cObject); + rb_global_variable(&rbffi_StructByReferenceClass); + rb_include_module(rbffi_StructByReferenceClass, rb_const_get(moduleFFI, rb_intern("DataConverter"))); + + rb_define_alloc_func(rbffi_StructByReferenceClass, sbr_allocate); + rb_define_method(rbffi_StructByReferenceClass, "initialize", sbr_initialize, 1); + rb_define_method(rbffi_StructByReferenceClass, "struct_class", sbr_struct_class, 0); + rb_define_method(rbffi_StructByReferenceClass, "native_type", sbr_native_type, 0); + rb_define_method(rbffi_StructByReferenceClass, "to_native", sbr_to_native, 2); + rb_define_method(rbffi_StructByReferenceClass, "from_native", sbr_from_native, 2); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.h new file mode 100644 index 0000000..cf797af --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * 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. + * * The name of the author or authors 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. + */ + +#ifndef RBFFI_STRUCTBYREFERENCE_H +#define RBFFI_STRUCTBYREFERENCE_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct StructByReference_ { + VALUE rbStructClass; +} StructByReference; + +void rbffi_StructByReference_Init(VALUE moduleFFI); + +extern VALUE rbffi_StructByReferenceClass; + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_STRUCTBYREFERENCE_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.o new file mode 100644 index 0000000000000000000000000000000000000000..6a53b5175ff90b39f5421aae28c68925cd8ff5d7 GIT binary patch literal 33716 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 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. + */ + +#ifndef _MSC_VER +#include +#endif +#include +#include +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif +#include +#include + +#include +#include "rbffi.h" +#include "compat.h" + +#include "Type.h" +#include "StructByValue.h" +#include "Struct.h" + +#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) + +static VALUE sbv_allocate(VALUE); +static VALUE sbv_initialize(VALUE, VALUE); +static void sbv_mark(StructByValue *); +static void sbv_free(StructByValue *); + +VALUE rbffi_StructByValueClass = Qnil; + +static VALUE +sbv_allocate(VALUE klass) +{ + StructByValue* sbv; + + VALUE obj = Data_Make_Struct(klass, StructByValue, sbv_mark, sbv_free, sbv); + + sbv->rbStructClass = Qnil; + sbv->rbStructLayout = Qnil; + sbv->base.nativeType = NATIVE_STRUCT; + + sbv->base.ffiType = xcalloc(1, sizeof(*sbv->base.ffiType)); + sbv->base.ffiType->size = 0; + sbv->base.ffiType->alignment = 1; + sbv->base.ffiType->type = FFI_TYPE_STRUCT; + + return obj; +} + +static VALUE +sbv_initialize(VALUE self, VALUE rbStructClass) +{ + StructByValue* sbv = NULL; + StructLayout* layout = NULL; + VALUE rbLayout = Qnil; + + rbLayout = rb_ivar_get(rbStructClass, rb_intern("@layout")); + if (!rb_obj_is_instance_of(rbLayout, rbffi_StructLayoutClass)) { + rb_raise(rb_eTypeError, "wrong type in @layout ivar (expected FFI::StructLayout)"); + } + + Data_Get_Struct(rbLayout, StructLayout, layout); + Data_Get_Struct(self, StructByValue, sbv); + sbv->rbStructClass = rbStructClass; + sbv->rbStructLayout = rbLayout; + + /* We can just use everything from the ffi_type directly */ + *sbv->base.ffiType = *layout->base.ffiType; + + return self; +} + +static void +sbv_mark(StructByValue *sbv) +{ + rb_gc_mark(sbv->rbStructClass); + rb_gc_mark(sbv->rbStructLayout); +} + +static void +sbv_free(StructByValue *sbv) +{ + xfree(sbv->base.ffiType); + xfree(sbv); +} + + +static VALUE +sbv_layout(VALUE self) +{ + StructByValue* sbv; + + Data_Get_Struct(self, StructByValue, sbv); + return sbv->rbStructLayout; +} + +static VALUE +sbv_struct_class(VALUE self) +{ + StructByValue* sbv; + + Data_Get_Struct(self, StructByValue, sbv); + + return sbv->rbStructClass; +} + +void +rbffi_StructByValue_Init(VALUE moduleFFI) +{ + rbffi_StructByValueClass = rb_define_class_under(moduleFFI, "StructByValue", rbffi_TypeClass); + rb_global_variable(&rbffi_StructByValueClass); + rb_define_const(rbffi_TypeClass, "Struct", rbffi_StructByValueClass); + + rb_define_alloc_func(rbffi_StructByValueClass, sbv_allocate); + rb_define_method(rbffi_StructByValueClass, "initialize", sbv_initialize, 1); + rb_define_method(rbffi_StructByValueClass, "layout", sbv_layout, 0); + rb_define_method(rbffi_StructByValueClass, "struct_class", sbv_struct_class, 0); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.h new file mode 100644 index 0000000..07b2763 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_STRUCTBYVALUE_H +#define RBFFI_STRUCTBYVALUE_H + +#include +#include "Type.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct StructByValue_ { + Type base; + VALUE rbStructClass; + VALUE rbStructLayout; +} StructByValue; + +void rbffi_StructByValue_Init(VALUE moduleFFI); + +extern VALUE rbffi_StructByValueClass; + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_STRUCTBYVALUE_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.o new file mode 100644 index 0000000000000000000000000000000000000000..f6750f46a3999216575694ea87b1e0550b7766b4 GIT binary patch literal 32028 zcmeHv33Ob=nQrwa-B#bLZdu*7EL*s}U}Qjx7rcNSyJbt3Y;D$NIbNEU)Uw-_C8b;P z0!}a(42ohP3z;O7fsi39;Q^V1FoY0D97qTxke31GOePSP;3NbXLJ}sK;Q79~Ro$(& zSl)T(WG3gRj;j8p{`#wK)$OXfb?>K#-@NBOA%xQ*L_VlXhycjqlSoWNrE3LSFCGL!iWen5l?v}J85#q*|z#9%OHF~$vik-zk&!hQ zbK0EtSAM<_RaCjfQ9H*@qtSuHNIV%ESiD>+qS1-|hLsJ*wcFwh4!GWU&*<(b8Y$KAw>8pMmp1t?)qsBG@JLSkU^t

      kI171D0fbW(qb!Tupy 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 C6;OWw literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.c new file mode 100644 index 0000000..483e532 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.c @@ -0,0 +1,698 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (c) 2009, Luc Heinrich + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#include + +#ifndef _MSC_VER +# include +# include +# include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif +#include +#include "rbffi.h" +#include "compat.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "MemoryPointer.h" +#include "Function.h" +#include "Types.h" +#include "StructByValue.h" +#include "ArrayType.h" +#include "Function.h" +#include "MappedType.h" +#include "Struct.h" + +#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) + +static void struct_layout_mark(StructLayout *); +static void struct_layout_free(StructLayout *); +static void struct_field_mark(StructField* ); + +VALUE rbffi_StructLayoutFieldClass = Qnil; +VALUE rbffi_StructLayoutNumberFieldClass = Qnil, rbffi_StructLayoutPointerFieldClass = Qnil; +VALUE rbffi_StructLayoutStringFieldClass = Qnil; +VALUE rbffi_StructLayoutFunctionFieldClass = Qnil, rbffi_StructLayoutArrayFieldClass = Qnil; + +VALUE rbffi_StructLayoutClass = Qnil; + + +static VALUE +struct_field_allocate(VALUE klass) +{ + StructField* field; + VALUE obj; + + obj = Data_Make_Struct(klass, StructField, struct_field_mark, -1, field); + field->rbType = Qnil; + field->rbName = Qnil; + + return obj; +} + +static void +struct_field_mark(StructField* f) +{ + rb_gc_mark(f->rbType); + rb_gc_mark(f->rbName); +} + +/* + * call-seq: initialize(name, offset, type) + * @param [String,Symbol] name + * @param [Fixnum] offset + * @param [FFI::Type] type + * @return [self] + * A new FFI::StructLayout::Field instance. + */ +static VALUE +struct_field_initialize(int argc, VALUE* argv, VALUE self) +{ + VALUE rbOffset = Qnil, rbName = Qnil, rbType = Qnil; + StructField* field; + int nargs; + + Data_Get_Struct(self, StructField, field); + + nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType); + + if (TYPE(rbName) != T_SYMBOL && TYPE(rbName) != T_STRING) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Symbol/String)", + rb_obj_classname(rbName)); + } + + Check_Type(rbOffset, T_FIXNUM); + + if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected FFI::Type)", + rb_obj_classname(rbType)); + } + + field->offset = NUM2UINT(rbOffset); + field->rbName = (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName); + field->rbType = rbType; + Data_Get_Struct(field->rbType, Type, field->type); + field->memoryOp = get_memory_op(field->type); + field->referenceIndex = -1; + + switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) { + case NATIVE_FUNCTION: + case NATIVE_CALLBACK: + case NATIVE_POINTER: + field->referenceRequired = true; + break; + + default: + field->referenceRequired = (rb_respond_to(self, rb_intern("reference_required?")) + && RTEST(rb_funcall2(self, rb_intern("reference_required?"), 0, NULL))) + || (rb_respond_to(rbType, rb_intern("reference_required?")) + && RTEST(rb_funcall2(rbType, rb_intern("reference_required?"), 0, NULL))); + break; + } + + return self; +} + +/* + * call-seq: offset + * @return [Numeric] + * Get the field offset. + */ +static VALUE +struct_field_offset(VALUE self) +{ + StructField* field; + Data_Get_Struct(self, StructField, field); + return UINT2NUM(field->offset); +} + +/* + * call-seq: size + * @return [Numeric] + * Get the field size. + */ +static VALUE +struct_field_size(VALUE self) +{ + StructField* field; + Data_Get_Struct(self, StructField, field); + return UINT2NUM(field->type->ffiType->size); +} + +/* + * call-seq: alignment + * @return [Numeric] + * Get the field alignment. + */ +static VALUE +struct_field_alignment(VALUE self) +{ + StructField* field; + Data_Get_Struct(self, StructField, field); + return UINT2NUM(field->type->ffiType->alignment); +} + +/* + * call-seq: type + * @return [Type] + * Get the field type. + */ +static VALUE +struct_field_type(VALUE self) +{ + StructField* field; + Data_Get_Struct(self, StructField, field); + + return field->rbType; +} + +/* + * call-seq: name + * @return [Symbol] + * Get the field name. + */ +static VALUE +struct_field_name(VALUE self) +{ + StructField* field; + Data_Get_Struct(self, StructField, field); + return field->rbName; +} + +/* + * call-seq: get(pointer) + * @param [AbstractMemory] pointer pointer on a {Struct} + * @return [Object] + * Get an object of type {#type} from memory pointed by +pointer+. + */ +static VALUE +struct_field_get(VALUE self, VALUE pointer) +{ + StructField* f; + + Data_Get_Struct(self, StructField, f); + if (f->memoryOp == NULL) { + rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType)); + return Qnil; + } + + return (*f->memoryOp->get)(MEMORY(pointer), f->offset); +} + +/* + * call-seq: put(pointer, value) + * @param [AbstractMemory] pointer pointer on a {Struct} + * @param [Object] value this object must be a kind of {#type} + * @return [self] + * Put an object to memory pointed by +pointer+. + */ +static VALUE +struct_field_put(VALUE self, VALUE pointer, VALUE value) +{ + StructField* f; + + Data_Get_Struct(self, StructField, f); + if (f->memoryOp == NULL) { + rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType)); + return self; + } + + (*f->memoryOp->put)(MEMORY(pointer), f->offset, value); + + return self; +} + +/* + * call-seq: get(pointer) + * @param [AbstractMemory] pointer pointer on a {Struct} + * @return [Function] + * Get a {Function} from memory pointed by +pointer+. + */ +static VALUE +function_field_get(VALUE self, VALUE pointer) +{ + StructField* f; + + Data_Get_Struct(self, StructField, f); + + return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset)); +} + +/* + * call-seq: put(pointer, proc) + * @param [AbstractMemory] pointer pointer to a {Struct} + * @param [Function, Proc] proc + * @return [Function] + * Set a {Function} to memory pointed by +pointer+ as a function. + * + * If a Proc is submitted as +proc+, it is automatically transformed to a {Function}. + */ +static VALUE +function_field_put(VALUE self, VALUE pointer, VALUE proc) +{ + StructField* f; + VALUE value = Qnil; + + Data_Get_Struct(self, StructField, f); + + if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) { + value = proc; + } else if (rb_obj_is_kind_of(proc, rb_cProc) || rb_respond_to(proc, rb_intern("call"))) { + value = rbffi_Function_ForProc(f->rbType, proc); + } else { + rb_raise(rb_eTypeError, "wrong type (expected Proc or Function)"); + } + + (*rbffi_AbstractMemoryOps.pointer->put)(MEMORY(pointer), f->offset, value); + + return self; +} + +static inline bool +isCharArray(ArrayType* arrayType) +{ + return arrayType->componentType->nativeType == NATIVE_INT8 + || arrayType->componentType->nativeType == NATIVE_UINT8; +} + +/* + * call-seq: get(pointer) + * @param [AbstractMemory] pointer pointer on a {Struct} + * @return [FFI::StructLayout::CharArray, FFI::Struct::InlineArray] + * Get an array from a {Struct}. + */ +static VALUE +array_field_get(VALUE self, VALUE pointer) +{ + StructField* f; + ArrayType* array; + VALUE argv[2]; + + Data_Get_Struct(self, StructField, f); + Data_Get_Struct(f->rbType, ArrayType, array); + + argv[0] = pointer; + argv[1] = self; + + return rb_class_new_instance(2, argv, isCharArray(array) + ? rbffi_StructLayoutCharArrayClass : rbffi_StructInlineArrayClass); +} + +/* + * call-seq: put(pointer, value) + * @param [AbstractMemory] pointer pointer on a {Struct} + * @param [String, Array] value +value+ may be a String only if array's type is a kind of +int8+ + * @return [value] + * Set an array in a {Struct}. + */ +static VALUE +array_field_put(VALUE self, VALUE pointer, VALUE value) +{ + StructField* f; + ArrayType* array; + + + Data_Get_Struct(self, StructField, f); + Data_Get_Struct(f->rbType, ArrayType, array); + + if (isCharArray(array) && rb_obj_is_instance_of(value, rb_cString)) { + VALUE argv[2]; + + argv[0] = INT2FIX(f->offset); + argv[1] = value; + + rb_funcall2(pointer, rb_intern("put_string"), 2, argv); + + } else { +#ifdef notyet + MemoryOp* op; + int count = RARRAY_LEN(value); + int i; + AbstractMemory* memory = MEMORY(pointer); + + if (count > array->length) { + rb_raise(rb_eIndexError, "array too large"); + } + + /* clear the contents in case of a short write */ + checkWrite(memory); + checkBounds(memory, f->offset, f->type->ffiType->size); + if (count < array->length) { + memset(memory->address + f->offset + (count * array->componentType->ffiType->size), + 0, (array->length - count) * array->componentType->ffiType->size); + } + + /* now copy each element in */ + if ((op = get_memory_op(array->componentType)) != NULL) { + + for (i = 0; i < count; ++i) { + (*op->put)(memory, f->offset + (i * array->componentType->ffiType->size), rb_ary_entry(value, i)); + } + + } else if (array->componentType->nativeType == NATIVE_STRUCT) { + + for (i = 0; i < count; ++i) { + VALUE entry = rb_ary_entry(value, i); + Struct* s; + + if (!rb_obj_is_kind_of(entry, rbffi_StructClass)) { + rb_raise(rb_eTypeError, "array element not an instance of FFI::Struct"); + break; + } + + Data_Get_Struct(entry, Struct, s); + checkRead(s->pointer); + checkBounds(s->pointer, 0, array->componentType->ffiType->size); + + memcpy(memory->address + f->offset + (i * array->componentType->ffiType->size), + s->pointer->address, array->componentType->ffiType->size); + } + + } else { + rb_raise(rb_eNotImpError, "put not supported for arrays of type %s", rb_obj_classname(array->rbComponentType)); + } +#else + rb_raise(rb_eNotImpError, "cannot set array field"); +#endif + } + + return value; +} + + +static VALUE +struct_layout_allocate(VALUE klass) +{ + StructLayout* layout; + VALUE obj; + + obj = Data_Make_Struct(klass, StructLayout, struct_layout_mark, struct_layout_free, layout); + layout->rbFieldMap = Qnil; + layout->rbFieldNames = Qnil; + layout->rbFields = Qnil; + layout->fieldSymbolTable = st_init_numtable(); + layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType)); + layout->base.ffiType->size = 0; + layout->base.ffiType->alignment = 0; + layout->base.ffiType->type = FFI_TYPE_STRUCT; + + return obj; +} + +/* + * call-seq: initialize(fields, size, align) + * @param [Array] fields + * @param [Numeric] size + * @param [Numeric] align + * @return [self] + * A new StructLayout instance. + */ +static VALUE +struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align) +{ + StructLayout* layout; + ffi_type* ltype; + int i; + + Data_Get_Struct(self, StructLayout, layout); + layout->fieldCount = (int) RARRAY_LEN(fields); + layout->rbFieldMap = rb_hash_new(); + layout->rbFieldNames = rb_ary_new2(layout->fieldCount); + layout->size = (int) FFI_ALIGN(NUM2INT(size), NUM2INT(align)); + layout->align = NUM2INT(align); + layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *)); + layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *)); + layout->rbFields = rb_ary_new2(layout->fieldCount); + layout->referenceFieldCount = 0; + layout->base.ffiType->elements = layout->ffiTypes; + layout->base.ffiType->size = layout->size; + layout->base.ffiType->alignment = layout->align; + + ltype = layout->base.ffiType; + for (i = 0; i < (int) layout->fieldCount; ++i) { + VALUE rbField = rb_ary_entry(fields, i); + VALUE rbName; + StructField* field; + ffi_type* ftype; + + + if (!rb_obj_is_kind_of(rbField, rbffi_StructLayoutFieldClass)) { + rb_raise(rb_eTypeError, "wrong type for field %d.", i); + } + rbName = rb_funcall2(rbField, rb_intern("name"), 0, NULL); + + Data_Get_Struct(rbField, StructField, field); + layout->fields[i] = field; + + if (field->type == NULL || field->type->ffiType == NULL) { + rb_raise(rb_eRuntimeError, "type of field %d not supported", i); + } + + ftype = field->type->ffiType; + if (ftype->size == 0 && i < ((int) layout->fieldCount - 1)) { + rb_raise(rb_eTypeError, "type of field %d has zero size", i); + } + + if (field->referenceRequired) { + field->referenceIndex = layout->referenceFieldCount++; + } + + + layout->ffiTypes[i] = ftype->size > 0 ? ftype : NULL; + st_insert(layout->fieldSymbolTable, rbName, rbField); + rb_hash_aset(layout->rbFieldMap, rbName, rbField); + rb_ary_push(layout->rbFields, rbField); + rb_ary_push(layout->rbFieldNames, rbName); + } + + if (ltype->size == 0) { + rb_raise(rb_eRuntimeError, "Struct size is zero"); + } + + return self; +} + +/* + * call-seq: [](field) + * @param [Symbol] field + * @return [StructLayout::Field] + * Get a field from the layout. + */ +static VALUE +struct_layout_union_bang(VALUE self) +{ + const ffi_type *alignment_types[] = { &ffi_type_sint8, &ffi_type_sint16, &ffi_type_sint32, &ffi_type_sint64, + &ffi_type_float, &ffi_type_double, &ffi_type_longdouble, NULL }; + StructLayout* layout; + ffi_type *t = NULL; + int count, i; + + Data_Get_Struct(self, StructLayout, layout); + + for (i = 0; alignment_types[i] != NULL; ++i) { + if (alignment_types[i]->alignment == layout->align) { + t = (ffi_type *) alignment_types[i]; + break; + } + } + if (t == NULL) { + rb_raise(rb_eRuntimeError, "cannot create libffi union representation for alignment %d", layout->align); + return Qnil; + } + + count = (int) layout->size / (int) t->size; + xfree(layout->ffiTypes); + layout->ffiTypes = xcalloc(count + 1, sizeof(ffi_type *)); + layout->base.ffiType->elements = layout->ffiTypes; + + for (i = 0; i < count; ++i) { + layout->ffiTypes[i] = t; + } + + return self; +} + +static VALUE +struct_layout_aref(VALUE self, VALUE field) +{ + StructLayout* layout; + + Data_Get_Struct(self, StructLayout, layout); + + return rb_hash_aref(layout->rbFieldMap, field); +} + +/* + * call-seq: fields + * @return [Array] + * Get fields list. + */ +static VALUE +struct_layout_fields(VALUE self) +{ + StructLayout* layout; + + Data_Get_Struct(self, StructLayout, layout); + + return rb_ary_dup(layout->rbFields); +} + +/* + * call-seq: members + * @return [Array] + * Get list of field names. + */ +static VALUE +struct_layout_members(VALUE self) +{ + StructLayout* layout; + + Data_Get_Struct(self, StructLayout, layout); + + return rb_ary_dup(layout->rbFieldNames); +} + +/* + * call-seq: to_a + * @return [Array] + * Get an array of fields. + */ +static VALUE +struct_layout_to_a(VALUE self) +{ + StructLayout* layout; + + Data_Get_Struct(self, StructLayout, layout); + + return rb_ary_dup(layout->rbFields); +} + +static void +struct_layout_mark(StructLayout *layout) +{ + rb_gc_mark(layout->rbFieldMap); + rb_gc_mark(layout->rbFieldNames); + rb_gc_mark(layout->rbFields); +} + +static void +struct_layout_free(StructLayout *layout) +{ + xfree(layout->ffiTypes); + xfree(layout->base.ffiType); + xfree(layout->fields); + st_free_table(layout->fieldSymbolTable); + xfree(layout); +} + + +void +rbffi_StructLayout_Init(VALUE moduleFFI) +{ + VALUE ffi_Type = rbffi_TypeClass; + + /* + * Document-class: FFI::StructLayout < FFI::Type + * + * This class aims at defining a struct layout. + */ + rbffi_StructLayoutClass = rb_define_class_under(moduleFFI, "StructLayout", ffi_Type); + rb_global_variable(&rbffi_StructLayoutClass); + + /* + * Document-class: FFI::StructLayout::Field + * A field in a {StructLayout}. + */ + rbffi_StructLayoutFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Field", rb_cObject); + rb_global_variable(&rbffi_StructLayoutFieldClass); + + /* + * Document-class: FFI::StructLayout::Number + * A numeric {Field} in a {StructLayout}. + */ + rbffi_StructLayoutNumberFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Number", rbffi_StructLayoutFieldClass); + rb_global_variable(&rbffi_StructLayoutNumberFieldClass); + + /* + * Document-class: FFI::StructLayout::String + * A string {Field} in a {StructLayout}. + */ + rbffi_StructLayoutStringFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "String", rbffi_StructLayoutFieldClass); + rb_global_variable(&rbffi_StructLayoutStringFieldClass); + + /* + * Document-class: FFI::StructLayout::Pointer + * A pointer {Field} in a {StructLayout}. + */ + rbffi_StructLayoutPointerFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Pointer", rbffi_StructLayoutFieldClass); + rb_global_variable(&rbffi_StructLayoutPointerFieldClass); + + /* + * Document-class: FFI::StructLayout::Function + * A function pointer {Field} in a {StructLayout}. + */ + rbffi_StructLayoutFunctionFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Function", rbffi_StructLayoutFieldClass); + rb_global_variable(&rbffi_StructLayoutFunctionFieldClass); + + /* + * Document-class: FFI::StructLayout::Array + * An array {Field} in a {StructLayout}. + */ + rbffi_StructLayoutArrayFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Array", rbffi_StructLayoutFieldClass); + rb_global_variable(&rbffi_StructLayoutArrayFieldClass); + + rb_define_alloc_func(rbffi_StructLayoutFieldClass, struct_field_allocate); + rb_define_method(rbffi_StructLayoutFieldClass, "initialize", struct_field_initialize, -1); + rb_define_method(rbffi_StructLayoutFieldClass, "offset", struct_field_offset, 0); + rb_define_method(rbffi_StructLayoutFieldClass, "size", struct_field_size, 0); + rb_define_method(rbffi_StructLayoutFieldClass, "alignment", struct_field_alignment, 0); + rb_define_method(rbffi_StructLayoutFieldClass, "name", struct_field_name, 0); + rb_define_method(rbffi_StructLayoutFieldClass, "type", struct_field_type, 0); + rb_define_method(rbffi_StructLayoutFieldClass, "put", struct_field_put, 2); + rb_define_method(rbffi_StructLayoutFieldClass, "get", struct_field_get, 1); + + rb_define_method(rbffi_StructLayoutFunctionFieldClass, "put", function_field_put, 2); + rb_define_method(rbffi_StructLayoutFunctionFieldClass, "get", function_field_get, 1); + + rb_define_method(rbffi_StructLayoutArrayFieldClass, "get", array_field_get, 1); + rb_define_method(rbffi_StructLayoutArrayFieldClass, "put", array_field_put, 2); + + rb_define_alloc_func(rbffi_StructLayoutClass, struct_layout_allocate); + rb_define_method(rbffi_StructLayoutClass, "initialize", struct_layout_initialize, 3); + rb_define_method(rbffi_StructLayoutClass, "[]", struct_layout_aref, 1); + rb_define_method(rbffi_StructLayoutClass, "fields", struct_layout_fields, 0); + rb_define_method(rbffi_StructLayoutClass, "members", struct_layout_members, 0); + rb_define_method(rbffi_StructLayoutClass, "to_a", struct_layout_to_a, 0); + rb_define_method(rbffi_StructLayoutClass, "__union!", struct_layout_union_bang, 0); + +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.o new file mode 100644 index 0000000000000000000000000000000000000000..e3d9de9368f20ffc6b7ce69f5dcb4be508bcfbae GIT binary patch literal 73352 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 PaR;5A8MXjQVOjqToXXF& literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.c new file mode 100644 index 0000000..32ae05f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.c @@ -0,0 +1,352 @@ +/* + * Copyright (c) 2010 Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef _MSC_VER +#include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif + +#if defined(__CYGWIN__) || !defined(_WIN32) +# include +# include +# include +# include +#else +# include +# define _WINSOCKAPI_ +# include +#endif +#include +#include "Thread.h" + +#ifdef _WIN32 +static volatile DWORD frame_thread_key = TLS_OUT_OF_INDEXES; +#else +static pthread_key_t thread_data_key; +struct thread_data { + rbffi_frame_t* frame; +}; +static inline struct thread_data* thread_data_get(void); + +#endif + +rbffi_frame_t* +rbffi_frame_current(void) +{ +#ifdef _WIN32 + return (rbffi_frame_t *) TlsGetValue(frame_thread_key); +#else + struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key); + return td != NULL ? td->frame : NULL; +#endif +} + +void +rbffi_frame_push(rbffi_frame_t* frame) +{ + memset(frame, 0, sizeof(*frame)); + frame->has_gvl = true; + frame->exc = Qnil; + +#ifdef _WIN32 + frame->prev = TlsGetValue(frame_thread_key); + TlsSetValue(frame_thread_key, frame); +#else + frame->td = thread_data_get(); + frame->prev = frame->td->frame; + frame->td->frame = frame; +#endif +} + +void +rbffi_frame_pop(rbffi_frame_t* frame) +{ +#ifdef _WIN32 + TlsSetValue(frame_thread_key, frame->prev); +#else + frame->td->frame = frame->prev; +#endif +} + +#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) + +#if !defined(_WIN32) + +struct BlockingThread { + pthread_t tid; + VALUE (*fn)(void *); + void *data; + void (*ubf)(void *); + void *data2; + VALUE retval; + int wrfd; + int rdfd; +}; + +static void* +rbffi_blocking_thread(void* args) +{ + struct BlockingThread* thr = (struct BlockingThread *) args; + char c = 1; + VALUE retval; + + retval = (*thr->fn)(thr->data); + + pthread_testcancel(); + + thr->retval = retval; + + write(thr->wrfd, &c, sizeof(c)); + + return NULL; +} + +static VALUE +wait_for_thread(void *data) +{ + struct BlockingThread* thr = (struct BlockingThread *) data; + char c; + + if (read(thr->rdfd, &c, 1) < 1) { + rb_thread_wait_fd(thr->rdfd); + while (read(thr->rdfd, &c, 1) < 1 && rb_io_wait_readable(thr->rdfd) == Qtrue) { + ; + } + } + + return Qnil; +} + +static VALUE +cleanup_blocking_thread(void *data, VALUE exc) +{ + struct BlockingThread* thr = (struct BlockingThread *) data; + + if (thr->ubf != (void (*)(void *)) -1) { + (*thr->ubf)(thr->data2); + } else { + pthread_kill(thr->tid, SIGVTALRM); + } + + return exc; +} + +VALUE +rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2) +{ + struct BlockingThread* thr; + int fd[2]; + VALUE exc; + + if (pipe(fd) < 0) { + rb_raise(rb_eSystemCallError, "pipe(2) failed"); + return Qnil; + } + fcntl(fd[0], F_SETFL, fcntl(fd[0], F_GETFL) | O_NONBLOCK); + + thr = ALLOC_N(struct BlockingThread, 1); + thr->rdfd = fd[0]; + thr->wrfd = fd[1]; + thr->fn = func; + thr->data = data1; + thr->ubf = ubf; + thr->data2 = data2; + thr->retval = Qnil; + + if (pthread_create(&thr->tid, NULL, rbffi_blocking_thread, thr) != 0) { + close(fd[0]); + close(fd[1]); + xfree(thr); + rb_raise(rb_eSystemCallError, "pipe(2) failed"); + return Qnil; + } + + exc = rb_rescue2(wait_for_thread, (VALUE) thr, cleanup_blocking_thread, (VALUE) thr, + rb_eException); + + pthread_join(thr->tid, NULL); + close(fd[1]); + close(fd[0]); + xfree(thr); + + if (exc != Qnil) { + rb_exc_raise(exc); + } + + return thr->retval; +} + +#else +/* win32 implementation */ + +struct BlockingThread { + HANDLE tid; + VALUE (*fn)(void *); + void *data; + void (*ubf)(void *); + void *data2; + VALUE retval; + int wrfd; + int rdfd; +}; + +static DWORD __stdcall +rbffi_blocking_thread(LPVOID args) +{ + struct BlockingThread* thr = (struct BlockingThread *) args; + char c = 1; + VALUE retval; + + retval = (*thr->fn)(thr->data); + thr->retval = retval; + + write(thr->wrfd, &c, sizeof(c)); + + return 0; +} + +static VALUE +wait_for_thread(void *data) +{ + struct BlockingThread* thr = (struct BlockingThread *) data; + char c, res; + fd_set rfds; + + FD_ZERO(&rfds); + FD_SET(thr->rdfd, &rfds); + rb_thread_select(thr->rdfd + 1, &rfds, NULL, NULL, NULL); + read(thr->rdfd, &c, 1); + return Qnil; +} + +static VALUE +cleanup_blocking_thread(void *data, VALUE exc) +{ + struct BlockingThread* thr = (struct BlockingThread *) data; + + if (thr->ubf != (void (*)(void *)) -1) { + (*thr->ubf)(thr->data2); + } else { + TerminateThread(thr->tid, 0); + } + + return exc; +} + +VALUE +rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2) +{ + struct BlockingThread* thr; + int fd[2]; + VALUE exc; + DWORD state; + DWORD res; + + if (_pipe(fd, 1024, O_BINARY) == -1) { + rb_raise(rb_eSystemCallError, "_pipe() failed"); + return Qnil; + } + + thr = ALLOC_N(struct BlockingThread, 1); + thr->rdfd = fd[0]; + thr->wrfd = fd[1]; + thr->fn = func; + thr->data = data1; + thr->ubf = ubf; + thr->data2 = data2; + thr->retval = Qnil; + + thr->tid = CreateThread(NULL, 0, rbffi_blocking_thread, thr, 0, NULL); + if (!thr->tid) { + close(fd[0]); + close(fd[1]); + xfree(thr); + rb_raise(rb_eSystemCallError, "CreateThread() failed"); + return Qnil; + } + + exc = rb_rescue2(wait_for_thread, (VALUE) thr, cleanup_blocking_thread, (VALUE) thr, + rb_eException); + + /* The thread should be finished, already. */ + WaitForSingleObject(thr->tid, INFINITE); + CloseHandle(thr->tid); + close(fd[1]); + close(fd[0]); + xfree(thr); + + if (exc != Qnil) { + rb_exc_raise(exc); + } + + return thr->retval; +} + +#endif /* !_WIN32 */ + +#endif /* HAVE_RB_THREAD_BLOCKING_REGION */ + +#ifndef _WIN32 +static struct thread_data* thread_data_init(void); + +static inline struct thread_data* +thread_data_get(void) +{ + struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key); + return td != NULL ? td : thread_data_init(); +} + +static struct thread_data* +thread_data_init(void) +{ + struct thread_data* td = calloc(1, sizeof(struct thread_data)); + + pthread_setspecific(thread_data_key, td); + + return td; +} + +static void +thread_data_free(void *ptr) +{ + free(ptr); +} +#endif + +void +rbffi_Thread_Init(VALUE moduleFFI) +{ +#ifdef _WIN32 + frame_thread_key = TlsAlloc(); +#else + pthread_key_create(&thread_data_key, thread_data_free); +#endif +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.h new file mode 100644 index 0000000..c51a5a9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2010 Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_THREAD_H +#define RBFFI_THREAD_H + +#ifndef _MSC_VER +# include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif +#include +#include "extconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef _WIN32 +# include +#else +# include +#endif + +typedef struct { +#ifdef _WIN32 + DWORD id; +#else + pthread_t id; +#endif + bool valid; + bool has_gvl; + VALUE exc; +} rbffi_thread_t; + +typedef struct rbffi_frame { +#ifndef _WIN32 + struct thread_data* td; +#endif + struct rbffi_frame* prev; + bool has_gvl; + VALUE exc; +} rbffi_frame_t; + +rbffi_frame_t* rbffi_frame_current(void); +void rbffi_frame_push(rbffi_frame_t* frame); +void rbffi_frame_pop(rbffi_frame_t* frame); + +#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL +# define rbffi_thread_blocking_region rb_thread_call_without_gvl + +#elif defined(HAVE_RB_THREAD_BLOCKING_REGION) +# define rbffi_thread_blocking_region rb_thread_blocking_region + +#else + +VALUE rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2); + +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_THREAD_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Thread.o new file mode 100644 index 0000000000000000000000000000000000000000..ed9a2af7f020b70eba8f61e3bdc3bc91d06dd60f GIT binary patch literal 17256 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 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. + */ + +#ifndef _MSC_VER +#include +#endif + +#include +#include +#include +#include "rbffi.h" +#include "compat.h" +#include "Types.h" +#include "Type.h" + + +typedef struct BuiltinType_ { + Type type; + char* name; +} BuiltinType; + +static void builtin_type_free(BuiltinType *); + +VALUE rbffi_TypeClass = Qnil; + +static VALUE classBuiltinType = Qnil; +static VALUE moduleNativeType = Qnil; +static VALUE typeMap = Qnil, sizeMap = Qnil; +static ID id_find_type = 0, id_type_size = 0, id_size = 0; + +static VALUE +type_allocate(VALUE klass) +{ + Type* type; + VALUE obj = Data_Make_Struct(klass, Type, NULL, -1, type); + + type->nativeType = -1; + type->ffiType = &ffi_type_void; + + return obj; +} + +/* + * Document-method: initialize + * call-seq: initialize(value) + * @param [Fixnum,Type] value + * @return [self] + */ +static VALUE +type_initialize(VALUE self, VALUE value) +{ + Type* type; + Type* other; + + Data_Get_Struct(self, Type, type); + + if (FIXNUM_P(value)) { + type->nativeType = FIX2INT(value); + } else if (rb_obj_is_kind_of(value, rbffi_TypeClass)) { + Data_Get_Struct(value, Type, other); + type->nativeType = other->nativeType; + type->ffiType = other->ffiType; + } else { + rb_raise(rb_eArgError, "wrong type"); + } + + return self; +} + +/* + * call-seq: type.size + * @return [Fixnum] + * Return type's size, in bytes. + */ +static VALUE +type_size(VALUE self) +{ + Type *type; + + Data_Get_Struct(self, Type, type); + + return INT2FIX(type->ffiType->size); +} + +/* + * call-seq: type.alignment + * @return [Fixnum] + * Get Type alignment. + */ +static VALUE +type_alignment(VALUE self) +{ + Type *type; + + Data_Get_Struct(self, Type, type); + + return INT2FIX(type->ffiType->alignment); +} + +/* + * call-seq: type.inspect + * @return [String] + * Inspect {Type} object. + */ +static VALUE +type_inspect(VALUE self) +{ + char buf[100]; + Type *type; + + Data_Get_Struct(self, Type, type); + + snprintf(buf, sizeof(buf), "#<%s:%p size=%d alignment=%d>", + rb_obj_classname(self), type, (int) type->ffiType->size, (int) type->ffiType->alignment); + + return rb_str_new2(buf); +} + +static VALUE +builtin_type_new(VALUE klass, int nativeType, ffi_type* ffiType, const char* name) +{ + BuiltinType* type; + VALUE obj = Qnil; + + obj = Data_Make_Struct(klass, BuiltinType, NULL, builtin_type_free, type); + + type->name = strdup(name); + type->type.nativeType = nativeType; + type->type.ffiType = ffiType; + + return obj; +} + +static void +builtin_type_free(BuiltinType *type) +{ + free(type->name); + xfree(type); +} + +/* + * call-seq: type.inspect + * @return [String] + * Inspect {Type::Builtin} object. + */ +static VALUE +builtin_type_inspect(VALUE self) +{ + char buf[100]; + BuiltinType *type; + + Data_Get_Struct(self, BuiltinType, type); + snprintf(buf, sizeof(buf), "#<%s:%s size=%d alignment=%d>", + rb_obj_classname(self), type->name, (int) type->type.ffiType->size, type->type.ffiType->alignment); + + return rb_str_new2(buf); +} + +int +rbffi_type_size(VALUE type) +{ + int t = TYPE(type); + + if (t == T_FIXNUM || t == T_BIGNUM) { + return NUM2INT(type); + + } else if (t == T_SYMBOL) { + /* + * Try looking up directly in the type and size maps + */ + VALUE nType; + if ((nType = rb_hash_lookup(typeMap, type)) != Qnil) { + if (rb_obj_is_kind_of(nType, rbffi_TypeClass)) { + Type* type; + Data_Get_Struct(nType, Type, type); + return (int) type->ffiType->size; + + } else if (rb_respond_to(nType, id_size)) { + return NUM2INT(rb_funcall2(nType, id_size, 0, NULL)); + } + } + + /* Not found - call up to the ruby version to resolve */ + return NUM2INT(rb_funcall2(rbffi_FFIModule, id_type_size, 1, &type)); + + } else { + return NUM2INT(rb_funcall2(type, id_size, 0, NULL)); + } +} + +VALUE +rbffi_Type_Lookup(VALUE name) +{ + int t = TYPE(name); + if (t == T_SYMBOL || t == T_STRING) { + /* + * Try looking up directly in the type Map + */ + VALUE nType; + if ((nType = rb_hash_lookup(typeMap, name)) != Qnil && rb_obj_is_kind_of(nType, rbffi_TypeClass)) { + return nType; + } + } else if (rb_obj_is_kind_of(name, rbffi_TypeClass)) { + + return name; + } + + /* Nothing found - let caller handle raising exceptions */ + return Qnil; +} + +/** + * rbffi_Type_Find() is like rbffi_Type_Lookup, but an error is raised if the + * type is not found. + */ +VALUE +rbffi_Type_Find(VALUE name) +{ + VALUE rbType = rbffi_Type_Lookup(name); + + if (!RTEST(rbType)) { + VALUE s = rb_inspect(name); + rb_raise(rb_eTypeError, "invalid type, %s", RSTRING_PTR(s)); + RB_GC_GUARD(s); + } + + return rbType; +} + +void +rbffi_Type_Init(VALUE moduleFFI) +{ + /* + * Document-class: FFI::Type + * This class manages C types. + * + * It embbed {FFI::Type::Builtin} objects as constants (for names, + * see {FFI::NativeType}). + */ + rbffi_TypeClass = rb_define_class_under(moduleFFI, "Type", rb_cObject); + + /* + * Document-constant: FFI::TypeDefs + */ + rb_define_const(moduleFFI, "TypeDefs", typeMap = rb_hash_new()); + rb_define_const(moduleFFI, "SizeTypes", sizeMap = rb_hash_new()); + rb_global_variable(&typeMap); + rb_global_variable(&sizeMap); + id_find_type = rb_intern("find_type"); + id_type_size = rb_intern("type_size"); + id_size = rb_intern("size"); + + /* + * Document-class: FFI::Type::Builtin + * Class for Built-in types. + */ + classBuiltinType = rb_define_class_under(rbffi_TypeClass, "Builtin", rbffi_TypeClass); + /* + * Document-module: FFI::NativeType + * This module defines constants for native (C) types. + * + * ==Native type constants + * Native types are defined by constants : + * * INT8, SCHAR, CHAR + * * UINT8, UCHAR + * * INT16, SHORT, SSHORT + * * UINT16, USHORT + * * INT32,, INT, SINT + * * UINT32, UINT + * * INT64, LONG_LONG, SLONG_LONG + * * UINT64, ULONG_LONG + * * LONG, SLONG + * * ULONG + * * FLOAT32, FLOAT + * * FLOAT64, DOUBLE + * * POINTER + * * CALLBACK + * * FUNCTION + * * CHAR_ARRAY + * * BOOL + * * STRING (immutable string, nul terminated) + * * STRUCT (struct-b-value param or result) + * * ARRAY (array type definition) + * * MAPPED (custom native type) + * For function return type only : + * * VOID + * For function argument type only : + * * BUFFER_IN + * * BUFFER_OUT + * * VARARGS (function takes a variable number of arguments) + * + * All these constants are exported to {FFI} module prefixed with "TYPE_". + * They are objets from {FFI::Type::Builtin} class. + */ + moduleNativeType = rb_define_module_under(moduleFFI, "NativeType"); + + /* + * Document-global: FFI::Type + */ + rb_global_variable(&rbffi_TypeClass); + rb_global_variable(&classBuiltinType); + rb_global_variable(&moduleNativeType); + + rb_define_alloc_func(rbffi_TypeClass, type_allocate); + rb_define_method(rbffi_TypeClass, "initialize", type_initialize, 1); + rb_define_method(rbffi_TypeClass, "size", type_size, 0); + rb_define_method(rbffi_TypeClass, "alignment", type_alignment, 0); + rb_define_method(rbffi_TypeClass, "inspect", type_inspect, 0); + + /* Make Type::Builtin non-allocatable */ + rb_undef_method(CLASS_OF(classBuiltinType), "new"); + rb_define_method(classBuiltinType, "inspect", builtin_type_inspect, 0); + + rb_global_variable(&rbffi_TypeClass); + rb_global_variable(&classBuiltinType); + + /* Define all the builtin types */ + #define T(x, ffiType) do { \ + VALUE t = Qnil; \ + rb_define_const(rbffi_TypeClass, #x, t = builtin_type_new(classBuiltinType, NATIVE_##x, ffiType, #x)); \ + rb_define_const(moduleNativeType, #x, t); \ + rb_define_const(moduleFFI, "TYPE_" #x, t); \ + } while(0) + + #define A(old_type, new_type) do { \ + VALUE t = rb_const_get(rbffi_TypeClass, rb_intern(#old_type)); \ + rb_const_set(rbffi_TypeClass, rb_intern(#new_type), t); \ + } while(0) + + /* + * Document-constant: FFI::Type::Builtin::VOID + */ + T(VOID, &ffi_type_void); + T(INT8, &ffi_type_sint8); + A(INT8, SCHAR); + A(INT8, CHAR); + T(UINT8, &ffi_type_uint8); + A(UINT8, UCHAR); + + T(INT16, &ffi_type_sint16); + A(INT16, SHORT); + A(INT16, SSHORT); + T(UINT16, &ffi_type_uint16); + A(UINT16, USHORT); + T(INT32, &ffi_type_sint32); + A(INT32, INT); + A(INT32, SINT); + T(UINT32, &ffi_type_uint32); + A(UINT32, UINT); + T(INT64, &ffi_type_sint64); + A(INT64, LONG_LONG); + A(INT64, SLONG_LONG); + T(UINT64, &ffi_type_uint64); + A(UINT64, ULONG_LONG); + T(LONG, &ffi_type_slong); + A(LONG, SLONG); + T(ULONG, &ffi_type_ulong); + T(FLOAT32, &ffi_type_float); + A(FLOAT32, FLOAT); + T(FLOAT64, &ffi_type_double); + A(FLOAT64, DOUBLE); + T(LONGDOUBLE, &ffi_type_longdouble); + T(POINTER, &ffi_type_pointer); + T(STRING, &ffi_type_pointer); + T(BUFFER_IN, &ffi_type_pointer); + T(BUFFER_OUT, &ffi_type_pointer); + T(BUFFER_INOUT, &ffi_type_pointer); + T(BOOL, &ffi_type_uchar); + T(VARARGS, &ffi_type_void); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Type.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Type.h new file mode 100644 index 0000000..d5522ee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Type.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * Copyright (C) 2009 Luc Heinrich + * + * This file is part of ruby-ffi. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Evan Phoenix nor the names of its contributors + * may 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. + * + */ + +#ifndef RBFFI_TYPE_H +#define RBFFI_TYPE_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct Type_ Type; + +#include "Types.h" + +struct Type_ { + NativeType nativeType; + ffi_type* ffiType; +}; + +extern VALUE rbffi_TypeClass; +extern VALUE rbffi_Type_Lookup(VALUE type); +extern VALUE rbffi_Type_Find(VALUE type); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_TYPE_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Type.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Type.o new file mode 100644 index 0000000000000000000000000000000000000000..649c1317ffcf7f17f29883eaf08fd60cf05af0be GIT binary patch literal 87588 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 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. + */ + +#include +#include "Pointer.h" +#include "rbffi.h" +#include "Function.h" +#include "StructByValue.h" +#include "Types.h" +#include "Struct.h" +#include "MappedType.h" +#include "MemoryPointer.h" +#include "LongDouble.h" + +static ID id_from_native = 0; + + +VALUE +rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr) +{ + switch (type->nativeType) { + case NATIVE_VOID: + return Qnil; + case NATIVE_INT8: + return INT2NUM((signed char) *(ffi_sarg *) ptr); + case NATIVE_INT16: + return INT2NUM((signed short) *(ffi_sarg *) ptr); + case NATIVE_INT32: + return INT2NUM((signed int) *(ffi_sarg *) ptr); + case NATIVE_LONG: + return LONG2NUM((signed long) *(ffi_sarg *) ptr); + case NATIVE_INT64: + return LL2NUM(*(signed long long *) ptr); + + case NATIVE_UINT8: + return UINT2NUM((unsigned char) *(ffi_arg *) ptr); + case NATIVE_UINT16: + return UINT2NUM((unsigned short) *(ffi_arg *) ptr); + case NATIVE_UINT32: + return UINT2NUM((unsigned int) *(ffi_arg *) ptr); + case NATIVE_ULONG: + return ULONG2NUM((unsigned long) *(ffi_arg *) ptr); + case NATIVE_UINT64: + return ULL2NUM(*(unsigned long long *) ptr); + + case NATIVE_FLOAT32: + return rb_float_new(*(float *) ptr); + case NATIVE_FLOAT64: + return rb_float_new(*(double *) ptr); + + case NATIVE_LONGDOUBLE: + return rbffi_longdouble_new(*(long double *) ptr); + + case NATIVE_STRING: + return (*(void **) ptr != NULL) ? rb_tainted_str_new2(*(char **) ptr) : Qnil; + case NATIVE_POINTER: + return rbffi_Pointer_NewInstance(*(void **) ptr); + case NATIVE_BOOL: + return ((unsigned char) *(ffi_arg *) ptr) ? Qtrue : Qfalse; + + case NATIVE_FUNCTION: + case NATIVE_CALLBACK: { + return *(void **) ptr != NULL + ? rbffi_Function_NewInstance(rbType, rbffi_Pointer_NewInstance(*(void **) ptr)) + : Qnil; + } + + case NATIVE_STRUCT: { + StructByValue* sbv = (StructByValue *)type; + AbstractMemory* mem; + VALUE rbMemory = rbffi_MemoryPointer_NewInstance(1, sbv->base.ffiType->size, false); + + Data_Get_Struct(rbMemory, AbstractMemory, mem); + memcpy(mem->address, ptr, sbv->base.ffiType->size); + RB_GC_GUARD(rbMemory); + RB_GC_GUARD(rbType); + + return rb_class_new_instance(1, &rbMemory, sbv->rbStructClass); + } + + case NATIVE_MAPPED: { + /* + * For mapped types, first convert to the real native type, then upcall to + * ruby to convert to the expected return type + */ + MappedType* m = (MappedType *) type; + VALUE values[2], rbReturnValue; + + values[0] = rbffi_NativeValue_ToRuby(m->type, m->rbType, ptr); + values[1] = Qnil; + + + rbReturnValue = rb_funcall2(m->rbConverter, id_from_native, 2, values); + RB_GC_GUARD(values[0]); + RB_GC_GUARD(rbType); + + return rbReturnValue; + } + + default: + rb_raise(rb_eRuntimeError, "Unknown type: %d", type->nativeType); + return Qnil; + } +} + +void +rbffi_Types_Init(VALUE moduleFFI) +{ + id_from_native = rb_intern("from_native"); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Types.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Types.h new file mode 100644 index 0000000..0d4806f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Types.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (c) 2009, Luc Heinrich + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_TYPES_H +#define RBFFI_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + NATIVE_VOID, + NATIVE_INT8, + NATIVE_UINT8, + NATIVE_INT16, + NATIVE_UINT16, + NATIVE_INT32, + NATIVE_UINT32, + NATIVE_INT64, + NATIVE_UINT64, + NATIVE_LONG, + NATIVE_ULONG, + NATIVE_FLOAT32, + NATIVE_FLOAT64, + NATIVE_LONGDOUBLE, + NATIVE_POINTER, + NATIVE_CALLBACK, + NATIVE_FUNCTION, + NATIVE_BUFFER_IN, + NATIVE_BUFFER_OUT, + NATIVE_BUFFER_INOUT, + NATIVE_CHAR_ARRAY, + NATIVE_BOOL, + + /** An immutable string. Nul terminated, but only copies in to the native function */ + NATIVE_STRING, + + /** The function takes a variable number of arguments */ + NATIVE_VARARGS, + + /** Struct-by-value param or result */ + NATIVE_STRUCT, + + /** An array type definition */ + NATIVE_ARRAY, + + /** Custom native type */ + NATIVE_MAPPED, +} NativeType; + +#include +#include "Type.h" + +VALUE rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr); +void rbffi_Types_Init(VALUE moduleFFI); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_TYPES_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Types.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Types.o new file mode 100644 index 0000000000000000000000000000000000000000..bba9f7da564c0aff10ecb7b02e3c12aa6e78b767 GIT binary patch literal 26284 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 + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef _MSC_VER +#include +#endif +#include + +#include +#ifndef _MSC_VER +# include +# include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif +#include + +#include +#include "rbffi.h" +#include "compat.h" + +#include "AbstractMemory.h" +#include "Pointer.h" +#include "Types.h" +#include "Type.h" +#include "LastError.h" +#include "MethodHandle.h" +#include "Call.h" +#include "Thread.h" + +typedef struct VariadicInvoker_ { + VALUE rbAddress; + VALUE rbReturnType; + VALUE rbEnums; + + Type* returnType; + ffi_abi abi; + void* function; + int paramCount; + bool blocking; +} VariadicInvoker; + + +static VALUE variadic_allocate(VALUE klass); +static VALUE variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, + VALUE rbReturnType, VALUE options); +static void variadic_mark(VariadicInvoker *); + +static VALUE classVariadicInvoker = Qnil; + + +static VALUE +variadic_allocate(VALUE klass) +{ + VariadicInvoker *invoker; + VALUE obj = Data_Make_Struct(klass, VariadicInvoker, variadic_mark, -1, invoker); + + invoker->rbAddress = Qnil; + invoker->rbEnums = Qnil; + invoker->rbReturnType = Qnil; + invoker->blocking = false; + + return obj; +} + +static void +variadic_mark(VariadicInvoker *invoker) +{ + rb_gc_mark(invoker->rbEnums); + rb_gc_mark(invoker->rbAddress); + rb_gc_mark(invoker->rbReturnType); +} + +static VALUE +variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, VALUE rbReturnType, VALUE options) +{ + VariadicInvoker* invoker = NULL; + VALUE retval = Qnil; + VALUE convention = Qnil; + VALUE fixed = Qnil; +#if defined(X86_WIN32) + VALUE rbConventionStr; +#endif + int i; + + Check_Type(options, T_HASH); + convention = rb_hash_aref(options, ID2SYM(rb_intern("convention"))); + + Data_Get_Struct(self, VariadicInvoker, invoker); + invoker->rbEnums = rb_hash_aref(options, ID2SYM(rb_intern("enums"))); + invoker->rbAddress = rbFunction; + invoker->function = rbffi_AbstractMemory_Cast(rbFunction, rbffi_PointerClass)->address; + invoker->blocking = RTEST(rb_hash_aref(options, ID2SYM(rb_intern("blocking")))); + +#if defined(X86_WIN32) + rbConventionStr = rb_funcall2(convention, rb_intern("to_s"), 0, NULL); + invoker->abi = (RTEST(convention) && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0) + ? FFI_STDCALL : FFI_DEFAULT_ABI; +#else + invoker->abi = FFI_DEFAULT_ABI; +#endif + + invoker->rbReturnType = rbffi_Type_Lookup(rbReturnType); + if (!RTEST(invoker->rbReturnType)) { + VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL); + rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName)); + } + + Data_Get_Struct(rbReturnType, Type, invoker->returnType); + + invoker->paramCount = -1; + + fixed = rb_ary_new2(RARRAY_LEN(rbParameterTypes) - 1); + for (i = 0; i < RARRAY_LEN(rbParameterTypes); ++i) { + VALUE entry = rb_ary_entry(rbParameterTypes, i); + VALUE rbType = rbffi_Type_Lookup(entry); + Type* type; + + if (!RTEST(rbType)) { + VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL); + rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName)); + } + Data_Get_Struct(rbType, Type, type); + if (type->nativeType != NATIVE_VARARGS) { + rb_ary_push(fixed, entry); + } + } + /* + * @fixed and @type_map are used by the parameter mangling ruby code + */ + rb_iv_set(self, "@fixed", fixed); + rb_iv_set(self, "@type_map", rb_hash_aref(options, ID2SYM(rb_intern("type_map")))); + + return retval; +} + +static VALUE +variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues) +{ + VariadicInvoker* invoker; + FFIStorage* params; + void* retval; + ffi_cif cif; + void** ffiValues; + ffi_type** ffiParamTypes; + ffi_type* ffiReturnType; + Type** paramTypes; + VALUE* argv; + int paramCount = 0, fixedCount = 0, i; + ffi_status ffiStatus; + rbffi_frame_t frame = { 0 }; + + Check_Type(parameterTypes, T_ARRAY); + Check_Type(parameterValues, T_ARRAY); + + Data_Get_Struct(self, VariadicInvoker, invoker); + paramCount = (int) RARRAY_LEN(parameterTypes); + paramTypes = ALLOCA_N(Type *, paramCount); + ffiParamTypes = ALLOCA_N(ffi_type *, paramCount); + params = ALLOCA_N(FFIStorage, paramCount); + ffiValues = ALLOCA_N(void*, paramCount); + argv = ALLOCA_N(VALUE, paramCount); + retval = alloca(MAX(invoker->returnType->ffiType->size, FFI_SIZEOF_ARG)); + + for (i = 0; i < paramCount; ++i) { + VALUE rbType = rb_ary_entry(parameterTypes, i); + + if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) { + rb_raise(rb_eTypeError, "wrong type. Expected (FFI::Type)"); + } + Data_Get_Struct(rbType, Type, paramTypes[i]); + + switch (paramTypes[i]->nativeType) { + case NATIVE_INT8: + case NATIVE_INT16: + case NATIVE_INT32: + rbType = rb_const_get(rbffi_TypeClass, rb_intern("INT32")); + Data_Get_Struct(rbType, Type, paramTypes[i]); + break; + case NATIVE_UINT8: + case NATIVE_UINT16: + case NATIVE_UINT32: + rbType = rb_const_get(rbffi_TypeClass, rb_intern("UINT32")); + Data_Get_Struct(rbType, Type, paramTypes[i]); + break; + + case NATIVE_FLOAT32: + rbType = rb_const_get(rbffi_TypeClass, rb_intern("DOUBLE")); + Data_Get_Struct(rbType, Type, paramTypes[i]); + break; + + default: + break; + } + + + ffiParamTypes[i] = paramTypes[i]->ffiType; + if (ffiParamTypes[i] == NULL) { + rb_raise(rb_eArgError, "Invalid parameter type #%x", paramTypes[i]->nativeType); + } + argv[i] = rb_ary_entry(parameterValues, i); + } + + ffiReturnType = invoker->returnType->ffiType; + if (ffiReturnType == NULL) { + rb_raise(rb_eArgError, "Invalid return type"); + } + + /*Get the number of fixed args from @fixed array*/ + fixedCount = RARRAY_LEN(rb_iv_get(self, "@fixed")); + +#ifdef HAVE_FFI_PREP_CIF_VAR + ffiStatus = ffi_prep_cif_var(&cif, invoker->abi, fixedCount, paramCount, ffiReturnType, ffiParamTypes); +#else + ffiStatus = ffi_prep_cif(&cif, invoker->abi, paramCount, ffiReturnType, ffiParamTypes); +#endif + switch (ffiStatus) { + case FFI_BAD_ABI: + rb_raise(rb_eArgError, "Invalid ABI specified"); + case FFI_BAD_TYPEDEF: + rb_raise(rb_eArgError, "Invalid argument type specified"); + case FFI_OK: + break; + default: + rb_raise(rb_eArgError, "Unknown FFI error"); + } + + rbffi_SetupCallParams(paramCount, argv, -1, paramTypes, params, + ffiValues, NULL, 0, invoker->rbEnums); + + rbffi_frame_push(&frame); +#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL + /* In Call.c, blocking: true is supported on older ruby variants + * without rb_thread_call_without_gvl by allocating on the heap instead + * of the stack. Since this functionality is being added later, + * we’re skipping support for old rubies here. */ + if(unlikely(invoker->blocking)) { + rbffi_blocking_call_t* bc; + bc = ALLOCA_N(rbffi_blocking_call_t, 1); + bc->retval = retval; + bc->function = invoker->function; + bc->ffiValues = ffiValues; + bc->params = params; + bc->frame = &frame; + bc->cif = cif; + + rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0); + } else { + ffi_call(&cif, FFI_FN(invoker->function), retval, ffiValues); + } +#else + ffi_call(&cif, FFI_FN(invoker->function), retval, ffiValues); +#endif + rbffi_frame_pop(&frame); + + rbffi_save_errno(); + + if (RTEST(frame.exc) && frame.exc != Qnil) { + rb_exc_raise(frame.exc); + } + + return rbffi_NativeValue_ToRuby(invoker->returnType, invoker->rbReturnType, retval); +} + + +void +rbffi_Variadic_Init(VALUE moduleFFI) +{ + classVariadicInvoker = rb_define_class_under(moduleFFI, "VariadicInvoker", rb_cObject); + rb_global_variable(&classVariadicInvoker); + + rb_define_alloc_func(classVariadicInvoker, variadic_allocate); + + rb_define_method(classVariadicInvoker, "initialize", variadic_initialize, 4); + rb_define_method(classVariadicInvoker, "invoke", variadic_invoke, 2); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Variadic.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/Variadic.o new file mode 100644 index 0000000000000000000000000000000000000000..012bfcb3dc526790cbf6f89efd0a76ab6dccbd1c GIT binary patch literal 42856 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�n(HTIP5VY>5agc;6P5cY5$K(HpQ8VFx5E#VVZLU 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 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. + */ + +#ifndef RBFFI_COMPAT_H +#define RBFFI_COMPAT_H + +#include + +#ifndef RARRAY_LEN +# define RARRAY_LEN(ary) RARRAY(ary)->len +#endif + +#ifndef RARRAY_PTR +# define RARRAY_PTR(ary) RARRAY(ary)->ptr +#endif + +#ifndef RSTRING_LEN +# define RSTRING_LEN(s) RSTRING(s)->len +#endif + +#ifndef RSTRING_PTR +# define RSTRING_PTR(s) RSTRING(s)->ptr +#endif + +#ifndef NUM2ULL +# define NUM2ULL(x) rb_num2ull((VALUE)x) +#endif + +#ifndef roundup +# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#endif + +#ifdef __GNUC__ +# define likely(x) __builtin_expect((x), 1) +# define unlikely(x) __builtin_expect((x), 0) +#else +# define likely(x) (x) +# define unlikely(x) (x) +#endif + +#ifndef MAX +# define MAX(a, b) ((a) < (b) ? (b) : (a)) +#endif +#ifndef MIN +# define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef RB_GC_GUARD +# define RB_GC_GUARD(x) (x) +#endif + +#endif /* RBFFI_COMPAT_H */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/extconf.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/extconf.h new file mode 100644 index 0000000..19cb44e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/extconf.h @@ -0,0 +1,7 @@ +#ifndef EXTCONF_H +#define EXTCONF_H +#define HAVE_RB_THREAD_CALL_WITH_GVL 1 +#define HAVE_RB_THREAD_CALL_WITHOUT_GVL 1 +#define USE_INTERNAL_LIBFFI 1 +#define RUBY_1_9 1 +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/extconf.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/extconf.rb new file mode 100644 index 0000000..d444b6b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/extconf.rb @@ -0,0 +1,66 @@ +#!/usr/bin/env ruby + +if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx' + require 'mkmf' + require 'rbconfig' + dir_config("ffi_c") + + # recent versions of ruby add restrictive ansi and warning flags on a whim - kill them all + $warnflags = '' + $CFLAGS.gsub!(/[\s+]-ansi/, '') + $CFLAGS.gsub!(/[\s+]-std=[^\s]+/, '') + # solaris 10 needs -c99 for + $CFLAGS << " -std=c99" if RbConfig::CONFIG['host_os'] =~ /solaris(!?2\.11)/ + + if ENV['RUBY_CC_VERSION'].nil? && (pkg_config("libffi") || + have_header("ffi.h") || + find_header("ffi.h", "/usr/local/include", "/usr/include/ffi")) + + # We need at least ffi_call and ffi_prep_closure + libffi_ok = have_library("ffi", "ffi_call", [ "ffi.h" ]) || + have_library("libffi", "ffi_call", [ "ffi.h" ]) + libffi_ok &&= have_func("ffi_prep_closure") + + # Check if the raw api is available. + $defs << "-DHAVE_RAW_API" if have_func("ffi_raw_call") && have_func("ffi_prep_raw_closure") + end + + have_header('shlwapi.h') + have_func('rb_thread_blocking_region') + have_func('rb_thread_call_with_gvl') + have_func('rb_thread_call_without_gvl') + have_func('ffi_prep_cif_var') + + $defs << "-DHAVE_EXTCONF_H" if $defs.empty? # needed so create_header works + $defs << "-DUSE_INTERNAL_LIBFFI" unless libffi_ok + $defs << "-DRUBY_1_9" if RUBY_VERSION >= "1.9.0" + $defs << "-DFFI_BUILDING" if RbConfig::CONFIG['host_os'] =~ /mswin/ # for compatibility with newer libffi + + create_header + + $LOCAL_LIBS << " ./libffi/.libs/libffi_convenience.lib" if !libffi_ok && RbConfig::CONFIG['host_os'] =~ /mswin/ + + create_makefile("ffi_c") + unless libffi_ok + File.open("Makefile", "a") do |mf| + mf.puts "LIBFFI_HOST=--host=#{RbConfig::CONFIG['host_alias']}" if RbConfig::CONFIG.has_key?("host_alias") + if RbConfig::CONFIG['host_os'].downcase =~ /darwin/ + mf.puts "include ${srcdir}/libffi.darwin.mk" + elsif RbConfig::CONFIG['host_os'].downcase =~ /bsd/ + mf.puts '.include "${srcdir}/libffi.bsd.mk"' + elsif RbConfig::CONFIG['host_os'].downcase =~ /mswin64/ + mf.puts '!include $(srcdir)/libffi.vc64.mk' + elsif RbConfig::CONFIG['host_os'].downcase =~ /mswin32/ + mf.puts '!include $(srcdir)/libffi.vc.mk' + else + mf.puts "include ${srcdir}/libffi.mk" + end + end + end + +else + File.open("Makefile", "w") do |mf| + mf.puts "# Dummy makefile for non-mri rubies" + mf.puts "all install::\n" + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi.c new file mode 100644 index 0000000..ea9a058 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (C) 2009 Luc Heinrich + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#include +#include +#include + +#include + +#include "rbffi.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "MemoryPointer.h" +#include "Struct.h" +#include "StructByValue.h" +#include "StructByReference.h" +#include "DynamicLibrary.h" +#include "Platform.h" +#include "Types.h" +#include "LastError.h" +#include "Function.h" +#include "ClosurePool.h" +#include "MethodHandle.h" +#include "Call.h" +#include "ArrayType.h" +#include "MappedType.h" + +void Init_ffi_c(void); + +VALUE rbffi_FFIModule = Qnil; + +static VALUE moduleFFI = Qnil; + +void +Init_ffi_c(void) +{ + /* + * Document-module: FFI + * + * This module embbed type constants from {FFI::NativeType}. + */ + rbffi_FFIModule = moduleFFI = rb_define_module("FFI"); + rb_global_variable(&rbffi_FFIModule); + + rbffi_Thread_Init(rbffi_FFIModule); + + /* FFI::Type needs to be initialized before most other classes */ + rbffi_Type_Init(moduleFFI); + + rbffi_DataConverter_Init(moduleFFI); + + rbffi_ArrayType_Init(moduleFFI); + rbffi_LastError_Init(moduleFFI); + rbffi_Call_Init(moduleFFI); + rbffi_ClosurePool_Init(moduleFFI); + rbffi_MethodHandle_Init(moduleFFI); + rbffi_Platform_Init(moduleFFI); + rbffi_AbstractMemory_Init(moduleFFI); + rbffi_Pointer_Init(moduleFFI); + rbffi_Function_Init(moduleFFI); + rbffi_MemoryPointer_Init(moduleFFI); + rbffi_Buffer_Init(moduleFFI); + rbffi_StructByValue_Init(moduleFFI); + rbffi_StructByReference_Init(moduleFFI); + rbffi_Struct_Init(moduleFFI); + rbffi_DynamicLibrary_Init(moduleFFI); + rbffi_Variadic_Init(moduleFFI); + rbffi_Types_Init(moduleFFI); + rbffi_MappedType_Init(moduleFFI); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi.o new file mode 100644 index 0000000000000000000000000000000000000000..099bd763dd1aceb47dbd21051799c49f6fa62ad1 GIT binary patch literal 16536 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 S-PpJX7xyu79}}MiCjL*^b;ExE literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi_c.bundle b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/ffi_c.bundle new file mode 100755 index 0000000000000000000000000000000000000000..c6c4767c2277cb8a83cac90e733b39192f290e5f GIT binary patch literal 349780 zcmeFad3Y4X7B)Ts27(YKDA9;Sf`SBBq6`voBqIcRWTGgdxF9MnxPmaFAX_xag|=rH{1|cf}+$IR0ItON`CKqPETiudcWWE{r5eOd7epkpL6Qe zsZ&*_PMxZ*UcGzql0YEPDk~6ZhimIVAQw-Iw&1=aehO=~2C%=K?!j>R>+dfO{H1}v zH1L-O{?fo-8u&{Ce`(+^4g95nzclcd2L95(UmEy-Ndxcf{BAcU`B|9w2eR?/R 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�`Hp#7-}a{Z-d&P3(TsA&CTFg~rwsobF2 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

      X{}o(@*XOjSqkM?*cH-ODxXI6~b}g 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 a_j1Sj`pJG17j@k?U*^-Ou{oWZn)+WG;($E> literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi.5.dylib b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi.5.dylib new file mode 100755 index 0000000000000000000000000000000000000000..d80acad7fc9000d64d6e743b6a5fa178d7b2c93c GIT binary patch literal 22896 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 b`!l|(koNd)m%(7icRRd`_IBHz+~)ruN*X}D literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi_convenience.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi_convenience.la new file mode 120000 index 0000000..0727452 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/.libs/libffi_convenience.la @@ -0,0 +1 @@ +../libffi_convenience.la \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/Makefile new file mode 100644 index 0000000..a30dcdb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/Makefile @@ -0,0 +1,1820 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + + +VPATH = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-apple-darwin17.3.0 +host_triplet = i386-apple-darwin +target_triplet = i386-apple-darwin +#am__append_1 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S +#am__append_2 = src/x86/ffi.c src/x86/sysv.S +#am__append_3 = src/x86/ffi.c src/x86/freebsd.S +#am__append_4 = src/x86/ffi.c src/x86/win32.S +#am__append_5 = src/x86/ffi.c src/x86/win64.S +am__append_6 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S +#am__append_7 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S +#am__append_8 = src/alpha/ffi.c src/alpha/osf.S +#am__append_9 = src/ia64/ffi.c src/ia64/unix.S +#am__append_10 = src/m32r/sysv.S src/m32r/ffi.c +#am__append_11 = src/m68k/ffi.c src/m68k/sysv.S +#am__append_12 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S +#am__append_13 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S +#am__append_14 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S +#am__append_15 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S +#am__append_16 = src/arm/sysv.S src/arm/ffi.c +##am__append_17 = src/arm/trampoline.S +#am__append_18 = src/avr32/sysv.S src/avr32/ffi.c +#am__append_19 = src/cris/sysv.S src/cris/ffi.c +#am__append_20 = src/frv/eabi.S src/frv/ffi.c +#am__append_21 = src/s390/sysv.S src/s390/ffi.c +#am__append_22 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S +#am__append_23 = src/sh/sysv.S src/sh/ffi.c +#am__append_24 = src/sh64/sysv.S src/sh64/ffi.c +#am__append_25 = src/pa/linux.S src/pa/ffi.c +#am__append_26 = src/pa/hpux32.S src/pa/ffi.c +# Build debug. Define FFI_DEBUG on the commandline so that, when building with +# MSVC, it can link against the debug CRT. +#am__append_27 = -DFFI_DEBUG +subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \ + $(srcdir)/doc/version.texi $(srcdir)/fficonfig.h.in \ + $(srcdir)/libffi.pc.in $(top_srcdir)/configure ChangeLog \ + compile config.guess config.sub depcomp install-sh ltmain.sh \ + mdate-sh missing texinfo.tex +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = fficonfig.h +CONFIG_CLEAN_FILES = libffi.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(infodir)" \ + "$(DESTDIR)$(pkgconfigdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +libffi_la_LIBADD = +am__dirstamp = $(am__leading_dot)dirstamp +am_libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ + src/raw_api.lo src/java_raw_api.lo src/closures.lo +#am__objects_1 = src/mips/ffi.lo src/mips/o32.lo \ +# src/mips/n32.lo +#am__objects_2 = src/x86/ffi.lo src/x86/sysv.lo +#am__objects_3 = src/x86/ffi.lo src/x86/freebsd.lo +#am__objects_4 = src/x86/ffi.lo src/x86/win32.lo +#am__objects_5 = src/x86/ffi.lo src/x86/win64.lo +am__objects_6 = src/x86/ffi.lo src/x86/darwin.lo \ + src/x86/ffi64.lo src/x86/darwin64.lo +#am__objects_7 = src/sparc/ffi.lo src/sparc/v8.lo \ +# src/sparc/v9.lo +#am__objects_8 = src/alpha/ffi.lo src/alpha/osf.lo +#am__objects_9 = src/ia64/ffi.lo src/ia64/unix.lo +#am__objects_10 = src/m32r/sysv.lo src/m32r/ffi.lo +#am__objects_11 = src/m68k/ffi.lo src/m68k/sysv.lo +#am__objects_12 = src/powerpc/ffi.lo src/powerpc/sysv.lo \ +# src/powerpc/ppc_closure.lo \ +# src/powerpc/linux64.lo \ +# src/powerpc/linux64_closure.lo +#am__objects_13 = src/powerpc/ffi_darwin.lo \ +# src/powerpc/aix.lo \ +# src/powerpc/aix_closure.lo +#am__objects_14 = src/powerpc/ffi_darwin.lo \ +# src/powerpc/darwin.lo \ +# src/powerpc/darwin_closure.lo +#am__objects_15 = src/powerpc/ffi.lo \ +# src/powerpc/sysv.lo \ +# src/powerpc/ppc_closure.lo +#am__objects_16 = src/arm/sysv.lo src/arm/ffi.lo +##am__objects_17 = src/arm/trampoline.lo +#am__objects_18 = src/avr32/sysv.lo src/avr32/ffi.lo +#am__objects_19 = src/cris/sysv.lo src/cris/ffi.lo +#am__objects_20 = src/frv/eabi.lo src/frv/ffi.lo +#am__objects_21 = src/s390/sysv.lo src/s390/ffi.lo +#am__objects_22 = src/x86/ffi64.lo src/x86/unix64.lo \ +# src/x86/ffi.lo src/x86/sysv.lo +#am__objects_23 = src/sh/sysv.lo src/sh/ffi.lo +#am__objects_24 = src/sh64/sysv.lo src/sh64/ffi.lo +#am__objects_25 = src/pa/linux.lo src/pa/ffi.lo +#am__objects_26 = src/pa/hpux32.lo src/pa/ffi.lo +nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) \ + $(am__objects_6) $(am__objects_7) $(am__objects_8) \ + $(am__objects_9) $(am__objects_10) $(am__objects_11) \ + $(am__objects_12) $(am__objects_13) $(am__objects_14) \ + $(am__objects_15) $(am__objects_16) $(am__objects_17) \ + $(am__objects_18) $(am__objects_19) $(am__objects_20) \ + $(am__objects_21) $(am__objects_22) $(am__objects_23) \ + $(am__objects_24) $(am__objects_25) $(am__objects_26) +libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \ + $(nodist_libffi_la_OBJECTS) +libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ +libffi_convenience_la_LIBADD = +am__objects_27 = src/debug.lo src/prep_cif.lo src/types.lo \ + src/raw_api.lo src/java_raw_api.lo src/closures.lo +am_libffi_convenience_la_OBJECTS = $(am__objects_27) +am__objects_28 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) $(am__objects_18) \ + $(am__objects_19) $(am__objects_20) $(am__objects_21) \ + $(am__objects_22) $(am__objects_23) $(am__objects_24) \ + $(am__objects_25) $(am__objects_26) +nodist_libffi_convenience_la_OBJECTS = $(am__objects_28) +libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ + $(nodist_libffi_convenience_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) +LTCPPASCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libffi_la_SOURCES) $(nodist_libffi_la_SOURCES) \ + $(libffi_convenience_la_SOURCES) \ + $(nodist_libffi_convenience_la_SOURCES) +DIST_SOURCES = $(libffi_la_SOURCES) $(libffi_convenience_la_SOURCES) +INFO_DEPS = $(srcdir)/doc/libffi.info +am__TEXINFO_TEX_DIR = $(srcdir) +DVIS = doc/libffi.dvi +PDFS = doc/libffi.pdf +PSS = doc/libffi.ps +HTMLS = doc/libffi.html +TEXINFOS = doc/libffi.texi +TEXI2DVI = texi2dvi +TEXI2PDF = $(TEXI2DVI) --pdf --batch +MAKEINFOHTML = $(MAKEINFO) --html +AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) +DVIPS = dvips +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +DATA = $(pkgconfig_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run aclocal-1.11 +ALLOCA = +AMTAR = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run tar +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoconf +AUTOHEADER = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoheader +AUTOMAKE = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run automake-1.11 +AWK = awk +CC = xcrun clang +CCAS = xcrun clang +CCASDEPMODE = depmode=none +CCASFLAGS = -arch i386 +CCDEPMODE = depmode=none +CFLAGS = -arch i386 -Wall -fexceptions +CPP = xcrun clang -E +CPPFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = dsymutil +DUMPBIN = : +ECHO_C = \c +ECHO_N = +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +LDFLAGS = -arch i386 +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = lipo +LN_S = ln -s +LTLIBOBJS = +MAINT = # +MAKEINFO = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo +MANIFEST_TOOL = : +MKDIR_P = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +NM = nm +NMEDIT = nmedit +OBJDUMP = objdump +OBJEXT = o +OTOOL = otool +OTOOL64 = : +PACKAGE = libffi +PACKAGE_BUGREPORT = http://sourceware.org/libffi.html +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.0.10 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.0.10 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_DARWIN +TARGETDIR = x86 +VERSION = 3.0.10 +abs_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386 +abs_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +abs_top_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386 +abs_top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = +ac_ct_DUMPBIN = link -dump +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-apple-darwin17.3.0 +build_alias = +build_cpu = x86_64 +build_os = darwin17.3.0 +build_vendor = apple +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = i386-apple-darwin +host_alias = i386-apple-darwin +host_cpu = i386 +host_os = darwin +host_vendor = apple +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +sys_symbol_underscore = +sysconfdir = ${prefix}/etc +target = i386-apple-darwin +target_alias = i386-apple-darwin +target_cpu = i386 +target_os = darwin +target_vendor = apple +toolexecdir = $(libdir)/gcc-lib/$(target_alias) +toolexeclibdir = $(libdir)/ +top_build_prefix = +top_builddir = . +top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +AUTOMAKE_OPTIONS = foreign subdir-objects +SUBDIRS = include testsuite man +EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ + src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \ + src/arm/ffi.c src/arm/sysv.S src/arm/trampoline.S \ + src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \ + src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \ + src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \ + src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \ + src/mips/n32.S src/mips/o32.S src/mips/ffitarget.h \ + src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ + src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ + src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/linux64.S \ + src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ + src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S \ + src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ + src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ + src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ + src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c \ + src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S \ + src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c \ + src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S \ + src/x86/win32.S src/x86/win64.S src/x86/darwin.S \ + src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S \ + src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c \ + src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/frv/eabi.S \ + src/frv/ffitarget.h src/dlmalloc.c src/moxie/ffi.c \ + src/moxie/eabi.S libtool-version ChangeLog.libffi \ + m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 \ + m4/ltversion.m4 build-ios.sh src/arm/gentramp.sh src/debug.c \ + msvcc.sh + +info_TEXINFOS = doc/libffi.texi + +# Work around what appears to be a GNU make bug handling MAKEFLAGS +# values defined in terms of make variables, as is the case for CC and +# friends when we are called from the top level Makefile. +AM_MAKEFLAGS = \ + "AR_FLAGS=$(AR_FLAGS)" \ + "CC_FOR_BUILD=$(CC_FOR_BUILD)" \ + "CFLAGS=$(CFLAGS)" \ + "CXXFLAGS=$(CXXFLAGS)" \ + "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \ + "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \ + "INSTALL=$(INSTALL)" \ + "INSTALL_DATA=$(INSTALL_DATA)" \ + "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ + "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \ + "JC1FLAGS=$(JC1FLAGS)" \ + "LDFLAGS=$(LDFLAGS)" \ + "LIBCFLAGS=$(LIBCFLAGS)" \ + "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \ + "MAKE=$(MAKE)" \ + "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \ + "PICFLAG=$(PICFLAG)" \ + "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \ + "RUNTESTFLAGS=$(RUNTESTFLAGS)" \ + "SHELL=$(SHELL)" \ + "exec_prefix=$(exec_prefix)" \ + "infodir=$(infodir)" \ + "libdir=$(libdir)" \ + "mandir=$(mandir)" \ + "prefix=$(prefix)" \ + "AR=$(AR)" \ + "AS=$(AS)" \ + "CC=$(CC)" \ + "CXX=$(CXX)" \ + "LD=$(LD)" \ + "NM=$(NM)" \ + "RANLIB=$(RANLIB)" \ + "DESTDIR=$(DESTDIR)" + +MAKEOVERRIDES = +ACLOCAL_AMFLAGS = $(ACLOCAL_AMFLAGS) -I m4 +lib_LTLIBRARIES = libffi.la +noinst_LTLIBRARIES = libffi_convenience.la +libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \ + src/raw_api.c src/java_raw_api.c src/closures.c + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libffi.pc +nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \ + $(am__append_3) $(am__append_4) $(am__append_5) \ + $(am__append_6) $(am__append_7) $(am__append_8) \ + $(am__append_9) $(am__append_10) $(am__append_11) \ + $(am__append_12) $(am__append_13) $(am__append_14) \ + $(am__append_15) $(am__append_16) $(am__append_17) \ + $(am__append_18) $(am__append_19) $(am__append_20) \ + $(am__append_21) $(am__append_22) $(am__append_23) \ + $(am__append_24) $(am__append_25) $(am__append_26) +libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) +nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) +AM_CFLAGS = -g $(am__append_27) +libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) +AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src +AM_CCASFLAGS = $(AM_CPPFLAGS) +all: fficonfig.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .S .c .dvi .lo .o .obj .ps +am--refresh: + @: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: # $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +fficonfig.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status fficonfig.h +$(srcdir)/fficonfig.h.in: # $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f fficonfig.h stamp-h1 +libffi.pc: $(top_builddir)/config.status $(srcdir)/libffi.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) +src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/$(DEPDIR) + @: > src/$(DEPDIR)/$(am__dirstamp) +src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/prep_cif.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/types.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/java_raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/closures.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/mips/$(am__dirstamp): + @$(MKDIR_P) src/mips + @: > src/mips/$(am__dirstamp) +src/mips/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/mips/$(DEPDIR) + @: > src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/ffi.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/o32.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/n32.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/x86/$(am__dirstamp): + @$(MKDIR_P) src/x86 + @: > src/x86/$(am__dirstamp) +src/x86/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/x86/$(DEPDIR) + @: > src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/ffi.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/sysv.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/freebsd.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/win32.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/win64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/darwin.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/ffi64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/darwin64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/sparc/$(am__dirstamp): + @$(MKDIR_P) src/sparc + @: > src/sparc/$(am__dirstamp) +src/sparc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sparc/$(DEPDIR) + @: > src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/ffi.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/v8.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/v9.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/alpha/$(am__dirstamp): + @$(MKDIR_P) src/alpha + @: > src/alpha/$(am__dirstamp) +src/alpha/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/alpha/$(DEPDIR) + @: > src/alpha/$(DEPDIR)/$(am__dirstamp) +src/alpha/ffi.lo: src/alpha/$(am__dirstamp) \ + src/alpha/$(DEPDIR)/$(am__dirstamp) +src/alpha/osf.lo: src/alpha/$(am__dirstamp) \ + src/alpha/$(DEPDIR)/$(am__dirstamp) +src/ia64/$(am__dirstamp): + @$(MKDIR_P) src/ia64 + @: > src/ia64/$(am__dirstamp) +src/ia64/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/ia64/$(DEPDIR) + @: > src/ia64/$(DEPDIR)/$(am__dirstamp) +src/ia64/ffi.lo: src/ia64/$(am__dirstamp) \ + src/ia64/$(DEPDIR)/$(am__dirstamp) +src/ia64/unix.lo: src/ia64/$(am__dirstamp) \ + src/ia64/$(DEPDIR)/$(am__dirstamp) +src/m32r/$(am__dirstamp): + @$(MKDIR_P) src/m32r + @: > src/m32r/$(am__dirstamp) +src/m32r/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/m32r/$(DEPDIR) + @: > src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m32r/sysv.lo: src/m32r/$(am__dirstamp) \ + src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m32r/ffi.lo: src/m32r/$(am__dirstamp) \ + src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m68k/$(am__dirstamp): + @$(MKDIR_P) src/m68k + @: > src/m68k/$(am__dirstamp) +src/m68k/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/m68k/$(DEPDIR) + @: > src/m68k/$(DEPDIR)/$(am__dirstamp) +src/m68k/ffi.lo: src/m68k/$(am__dirstamp) \ + src/m68k/$(DEPDIR)/$(am__dirstamp) +src/m68k/sysv.lo: src/m68k/$(am__dirstamp) \ + src/m68k/$(DEPDIR)/$(am__dirstamp) +src/powerpc/$(am__dirstamp): + @$(MKDIR_P) src/powerpc + @: > src/powerpc/$(am__dirstamp) +src/powerpc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/powerpc/$(DEPDIR) + @: > src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ffi.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/sysv.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ppc_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/linux64.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/linux64_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ffi_darwin.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/aix.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/aix_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/darwin.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/darwin_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/arm/$(am__dirstamp): + @$(MKDIR_P) src/arm + @: > src/arm/$(am__dirstamp) +src/arm/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/arm/$(DEPDIR) + @: > src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/sysv.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/ffi.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/trampoline.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/avr32/$(am__dirstamp): + @$(MKDIR_P) src/avr32 + @: > src/avr32/$(am__dirstamp) +src/avr32/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/avr32/$(DEPDIR) + @: > src/avr32/$(DEPDIR)/$(am__dirstamp) +src/avr32/sysv.lo: src/avr32/$(am__dirstamp) \ + src/avr32/$(DEPDIR)/$(am__dirstamp) +src/avr32/ffi.lo: src/avr32/$(am__dirstamp) \ + src/avr32/$(DEPDIR)/$(am__dirstamp) +src/cris/$(am__dirstamp): + @$(MKDIR_P) src/cris + @: > src/cris/$(am__dirstamp) +src/cris/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/cris/$(DEPDIR) + @: > src/cris/$(DEPDIR)/$(am__dirstamp) +src/cris/sysv.lo: src/cris/$(am__dirstamp) \ + src/cris/$(DEPDIR)/$(am__dirstamp) +src/cris/ffi.lo: src/cris/$(am__dirstamp) \ + src/cris/$(DEPDIR)/$(am__dirstamp) +src/frv/$(am__dirstamp): + @$(MKDIR_P) src/frv + @: > src/frv/$(am__dirstamp) +src/frv/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/frv/$(DEPDIR) + @: > src/frv/$(DEPDIR)/$(am__dirstamp) +src/frv/eabi.lo: src/frv/$(am__dirstamp) \ + src/frv/$(DEPDIR)/$(am__dirstamp) +src/frv/ffi.lo: src/frv/$(am__dirstamp) \ + src/frv/$(DEPDIR)/$(am__dirstamp) +src/s390/$(am__dirstamp): + @$(MKDIR_P) src/s390 + @: > src/s390/$(am__dirstamp) +src/s390/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/s390/$(DEPDIR) + @: > src/s390/$(DEPDIR)/$(am__dirstamp) +src/s390/sysv.lo: src/s390/$(am__dirstamp) \ + src/s390/$(DEPDIR)/$(am__dirstamp) +src/s390/ffi.lo: src/s390/$(am__dirstamp) \ + src/s390/$(DEPDIR)/$(am__dirstamp) +src/x86/unix64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/sh/$(am__dirstamp): + @$(MKDIR_P) src/sh + @: > src/sh/$(am__dirstamp) +src/sh/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sh/$(DEPDIR) + @: > src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh/sysv.lo: src/sh/$(am__dirstamp) \ + src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh/ffi.lo: src/sh/$(am__dirstamp) src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh64/$(am__dirstamp): + @$(MKDIR_P) src/sh64 + @: > src/sh64/$(am__dirstamp) +src/sh64/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sh64/$(DEPDIR) + @: > src/sh64/$(DEPDIR)/$(am__dirstamp) +src/sh64/sysv.lo: src/sh64/$(am__dirstamp) \ + src/sh64/$(DEPDIR)/$(am__dirstamp) +src/sh64/ffi.lo: src/sh64/$(am__dirstamp) \ + src/sh64/$(DEPDIR)/$(am__dirstamp) +src/pa/$(am__dirstamp): + @$(MKDIR_P) src/pa + @: > src/pa/$(am__dirstamp) +src/pa/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/pa/$(DEPDIR) + @: > src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/linux.lo: src/pa/$(am__dirstamp) \ + src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/hpux32.lo: src/pa/$(am__dirstamp) \ + src/pa/$(DEPDIR)/$(am__dirstamp) +libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) + $(libffi_la_LINK) -rpath $(libdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) +libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) + $(LINK) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f src/alpha/ffi.$(OBJEXT) + -rm -f src/alpha/ffi.lo + -rm -f src/alpha/osf.$(OBJEXT) + -rm -f src/alpha/osf.lo + -rm -f src/arm/ffi.$(OBJEXT) + -rm -f src/arm/ffi.lo + -rm -f src/arm/sysv.$(OBJEXT) + -rm -f src/arm/sysv.lo + -rm -f src/arm/trampoline.$(OBJEXT) + -rm -f src/arm/trampoline.lo + -rm -f src/avr32/ffi.$(OBJEXT) + -rm -f src/avr32/ffi.lo + -rm -f src/avr32/sysv.$(OBJEXT) + -rm -f src/avr32/sysv.lo + -rm -f src/closures.$(OBJEXT) + -rm -f src/closures.lo + -rm -f src/cris/ffi.$(OBJEXT) + -rm -f src/cris/ffi.lo + -rm -f src/cris/sysv.$(OBJEXT) + -rm -f src/cris/sysv.lo + -rm -f src/debug.$(OBJEXT) + -rm -f src/debug.lo + -rm -f src/frv/eabi.$(OBJEXT) + -rm -f src/frv/eabi.lo + -rm -f src/frv/ffi.$(OBJEXT) + -rm -f src/frv/ffi.lo + -rm -f src/ia64/ffi.$(OBJEXT) + -rm -f src/ia64/ffi.lo + -rm -f src/ia64/unix.$(OBJEXT) + -rm -f src/ia64/unix.lo + -rm -f src/java_raw_api.$(OBJEXT) + -rm -f src/java_raw_api.lo + -rm -f src/m32r/ffi.$(OBJEXT) + -rm -f src/m32r/ffi.lo + -rm -f src/m32r/sysv.$(OBJEXT) + -rm -f src/m32r/sysv.lo + -rm -f src/m68k/ffi.$(OBJEXT) + -rm -f src/m68k/ffi.lo + -rm -f src/m68k/sysv.$(OBJEXT) + -rm -f src/m68k/sysv.lo + -rm -f src/mips/ffi.$(OBJEXT) + -rm -f src/mips/ffi.lo + -rm -f src/mips/n32.$(OBJEXT) + -rm -f src/mips/n32.lo + -rm -f src/mips/o32.$(OBJEXT) + -rm -f src/mips/o32.lo + -rm -f src/pa/ffi.$(OBJEXT) + -rm -f src/pa/ffi.lo + -rm -f src/pa/hpux32.$(OBJEXT) + -rm -f src/pa/hpux32.lo + -rm -f src/pa/linux.$(OBJEXT) + -rm -f src/pa/linux.lo + -rm -f src/powerpc/aix.$(OBJEXT) + -rm -f src/powerpc/aix.lo + -rm -f src/powerpc/aix_closure.$(OBJEXT) + -rm -f src/powerpc/aix_closure.lo + -rm -f src/powerpc/darwin.$(OBJEXT) + -rm -f src/powerpc/darwin.lo + -rm -f src/powerpc/darwin_closure.$(OBJEXT) + -rm -f src/powerpc/darwin_closure.lo + -rm -f src/powerpc/ffi.$(OBJEXT) + -rm -f src/powerpc/ffi.lo + -rm -f src/powerpc/ffi_darwin.$(OBJEXT) + -rm -f src/powerpc/ffi_darwin.lo + -rm -f src/powerpc/linux64.$(OBJEXT) + -rm -f src/powerpc/linux64.lo + -rm -f src/powerpc/linux64_closure.$(OBJEXT) + -rm -f src/powerpc/linux64_closure.lo + -rm -f src/powerpc/ppc_closure.$(OBJEXT) + -rm -f src/powerpc/ppc_closure.lo + -rm -f src/powerpc/sysv.$(OBJEXT) + -rm -f src/powerpc/sysv.lo + -rm -f src/prep_cif.$(OBJEXT) + -rm -f src/prep_cif.lo + -rm -f src/raw_api.$(OBJEXT) + -rm -f src/raw_api.lo + -rm -f src/s390/ffi.$(OBJEXT) + -rm -f src/s390/ffi.lo + -rm -f src/s390/sysv.$(OBJEXT) + -rm -f src/s390/sysv.lo + -rm -f src/sh/ffi.$(OBJEXT) + -rm -f src/sh/ffi.lo + -rm -f src/sh/sysv.$(OBJEXT) + -rm -f src/sh/sysv.lo + -rm -f src/sh64/ffi.$(OBJEXT) + -rm -f src/sh64/ffi.lo + -rm -f src/sh64/sysv.$(OBJEXT) + -rm -f src/sh64/sysv.lo + -rm -f src/sparc/ffi.$(OBJEXT) + -rm -f src/sparc/ffi.lo + -rm -f src/sparc/v8.$(OBJEXT) + -rm -f src/sparc/v8.lo + -rm -f src/sparc/v9.$(OBJEXT) + -rm -f src/sparc/v9.lo + -rm -f src/types.$(OBJEXT) + -rm -f src/types.lo + -rm -f src/x86/darwin.$(OBJEXT) + -rm -f src/x86/darwin.lo + -rm -f src/x86/darwin64.$(OBJEXT) + -rm -f src/x86/darwin64.lo + -rm -f src/x86/ffi.$(OBJEXT) + -rm -f src/x86/ffi.lo + -rm -f src/x86/ffi64.$(OBJEXT) + -rm -f src/x86/ffi64.lo + -rm -f src/x86/freebsd.$(OBJEXT) + -rm -f src/x86/freebsd.lo + -rm -f src/x86/sysv.$(OBJEXT) + -rm -f src/x86/sysv.lo + -rm -f src/x86/unix64.$(OBJEXT) + -rm -f src/x86/unix64.lo + -rm -f src/x86/win32.$(OBJEXT) + -rm -f src/x86/win32.lo + -rm -f src/x86/win64.$(OBJEXT) + -rm -f src/x86/win64.lo + +distclean-compile: + -rm -f *.tab.c + +#include src/$(DEPDIR)/closures.Plo +#include src/$(DEPDIR)/debug.Plo +#include src/$(DEPDIR)/java_raw_api.Plo +#include src/$(DEPDIR)/prep_cif.Plo +#include src/$(DEPDIR)/raw_api.Plo +#include src/$(DEPDIR)/types.Plo +#include src/alpha/$(DEPDIR)/ffi.Plo +#include src/alpha/$(DEPDIR)/osf.Plo +#include src/arm/$(DEPDIR)/ffi.Plo +#include src/arm/$(DEPDIR)/sysv.Plo +#include src/arm/$(DEPDIR)/trampoline.Plo +#include src/avr32/$(DEPDIR)/ffi.Plo +#include src/avr32/$(DEPDIR)/sysv.Plo +#include src/cris/$(DEPDIR)/ffi.Plo +#include src/cris/$(DEPDIR)/sysv.Plo +#include src/frv/$(DEPDIR)/eabi.Plo +#include src/frv/$(DEPDIR)/ffi.Plo +#include src/ia64/$(DEPDIR)/ffi.Plo +#include src/ia64/$(DEPDIR)/unix.Plo +#include src/m32r/$(DEPDIR)/ffi.Plo +#include src/m32r/$(DEPDIR)/sysv.Plo +#include src/m68k/$(DEPDIR)/ffi.Plo +#include src/m68k/$(DEPDIR)/sysv.Plo +#include src/mips/$(DEPDIR)/ffi.Plo +#include src/mips/$(DEPDIR)/n32.Plo +#include src/mips/$(DEPDIR)/o32.Plo +#include src/pa/$(DEPDIR)/ffi.Plo +#include src/pa/$(DEPDIR)/hpux32.Plo +#include src/pa/$(DEPDIR)/linux.Plo +#include src/powerpc/$(DEPDIR)/aix.Plo +#include src/powerpc/$(DEPDIR)/aix_closure.Plo +#include src/powerpc/$(DEPDIR)/darwin.Plo +#include src/powerpc/$(DEPDIR)/darwin_closure.Plo +#include src/powerpc/$(DEPDIR)/ffi.Plo +#include src/powerpc/$(DEPDIR)/ffi_darwin.Plo +#include src/powerpc/$(DEPDIR)/linux64.Plo +#include src/powerpc/$(DEPDIR)/linux64_closure.Plo +#include src/powerpc/$(DEPDIR)/ppc_closure.Plo +#include src/powerpc/$(DEPDIR)/sysv.Plo +#include src/s390/$(DEPDIR)/ffi.Plo +#include src/s390/$(DEPDIR)/sysv.Plo +#include src/sh/$(DEPDIR)/ffi.Plo +#include src/sh/$(DEPDIR)/sysv.Plo +#include src/sh64/$(DEPDIR)/ffi.Plo +#include src/sh64/$(DEPDIR)/sysv.Plo +#include src/sparc/$(DEPDIR)/ffi.Plo +#include src/sparc/$(DEPDIR)/v8.Plo +#include src/sparc/$(DEPDIR)/v9.Plo +#include src/x86/$(DEPDIR)/darwin.Plo +#include src/x86/$(DEPDIR)/darwin64.Plo +#include src/x86/$(DEPDIR)/ffi.Plo +#include src/x86/$(DEPDIR)/ffi64.Plo +#include src/x86/$(DEPDIR)/freebsd.Plo +#include src/x86/$(DEPDIR)/sysv.Plo +#include src/x86/$(DEPDIR)/unix64.Plo +#include src/x86/$(DEPDIR)/win32.Plo +#include src/x86/$(DEPDIR)/win64.Plo + +.S.o: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +# $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) + $(CPPASCOMPILE) -c -o $@ $< + +.S.obj: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +# $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) + $(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.S.lo: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +# $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Plo +# source='$<' object='$@' libtool=yes +# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) + $(LTCPPASCOMPILE) -c -o $@ $< + +.c.o: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +# $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) + $(COMPILE) -c -o $@ $< + +.c.obj: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +# $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) + $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +# $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Plo +# source='$<' object='$@' libtool=yes +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) + $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf src/.libs src/_libs + -rm -rf src/alpha/.libs src/alpha/_libs + -rm -rf src/arm/.libs src/arm/_libs + -rm -rf src/avr32/.libs src/avr32/_libs + -rm -rf src/cris/.libs src/cris/_libs + -rm -rf src/frv/.libs src/frv/_libs + -rm -rf src/ia64/.libs src/ia64/_libs + -rm -rf src/m32r/.libs src/m32r/_libs + -rm -rf src/m68k/.libs src/m68k/_libs + -rm -rf src/mips/.libs src/mips/_libs + -rm -rf src/pa/.libs src/pa/_libs + -rm -rf src/powerpc/.libs src/powerpc/_libs + -rm -rf src/s390/.libs src/s390/_libs + -rm -rf src/sh/.libs src/sh/_libs + -rm -rf src/sh64/.libs src/sh64/_libs + -rm -rf src/sparc/.libs src/sparc/_libs + -rm -rf src/x86/.libs src/x86/_libs + +distclean-libtool: + -rm -f libtool config.lt +doc/$(am__dirstamp): + @$(MKDIR_P) doc + @: > doc/$(am__dirstamp) + +$(srcdir)/doc/libffi.info: doc/libffi.texi $(srcdir)/doc/version.texi + restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + am__cwd=`pwd` && $(am__cd) $(srcdir) && \ + rm -rf $$backupdir && mkdir $$backupdir && \ + if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ + done; \ + else :; fi && \ + cd "$$am__cwd"; \ + if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \ + -o $@ $(srcdir)/doc/libffi.texi; \ + then \ + rc=0; \ + $(am__cd) $(srcdir); \ + else \ + rc=$$?; \ + $(am__cd) $(srcdir) && \ + $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ + fi; \ + rm -rf $$backupdir; exit $$rc + +doc/libffi.dvi: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \ + $(TEXI2DVI) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi + +doc/libffi.pdf: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \ + $(TEXI2PDF) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi + +doc/libffi.html: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) + rm -rf $(@:.html=.htp) + if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \ + -o $(@:.html=.htp) `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi; \ + then \ + rm -rf $@; \ + if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ + mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ + else \ + if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ + rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ + exit 1; \ + fi +$(srcdir)/doc/version.texi: # $(srcdir)/doc/stamp-vti +$(srcdir)/doc/stamp-vti: doc/libffi.texi $(top_srcdir)/configure + test -f doc/$(am__dirstamp) || $(MAKE) $(AM_MAKEFLAGS) doc/$(am__dirstamp) + @(dir=.; test -f ./doc/libffi.texi || dir=$(srcdir); \ + set `$(SHELL) $(srcdir)/mdate-sh $$dir/doc/libffi.texi`; \ + echo "@set UPDATED $$1 $$2 $$3"; \ + echo "@set UPDATED-MONTH $$2 $$3"; \ + echo "@set EDITION $(VERSION)"; \ + echo "@set VERSION $(VERSION)") > vti.tmp + @cmp -s vti.tmp $(srcdir)/doc/version.texi \ + || (echo "Updating $(srcdir)/doc/version.texi"; \ + cp vti.tmp $(srcdir)/doc/version.texi) + -@rm -f vti.tmp + @cp $(srcdir)/doc/version.texi $@ + +mostlyclean-vti: + -rm -f vti.tmp + +maintainer-clean-vti: +# -rm -f $(srcdir)/doc/stamp-vti $(srcdir)/doc/version.texi +.dvi.ps: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(DVIPS) -o $@ $< + +uninstall-dvi-am: + @$(NORMAL_UNINSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ + rm -f "$(DESTDIR)$(dvidir)/$$f"; \ + done + +uninstall-html-am: + @$(NORMAL_UNINSTALL) + @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ + rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ + done + +uninstall-info-am: + @$(PRE_UNINSTALL) + @if test -d '$(DESTDIR)$(infodir)' && \ + (install-info --version && \ + install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ + if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ + then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ + done; \ + else :; fi + @$(NORMAL_UNINSTALL) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ + (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ + echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ + rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ + else :; fi); \ + done + +uninstall-pdf-am: + @$(NORMAL_UNINSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ + done + +uninstall-ps-am: + @$(NORMAL_UNINSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ + rm -f "$(DESTDIR)$(psdir)/$$f"; \ + done + +dist-info: $(INFO_DEPS) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; \ + for base in $$list; do \ + case $$base in \ + $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$base; then d=.; else d=$(srcdir); fi; \ + base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ + for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ + if test -f $$file; then \ + relfile=`expr "$$file" : "$$d/\(.*\)"`; \ + test -f "$(distdir)/$$relfile" || \ + cp -p $$file "$(distdir)/$$relfile"; \ + else :; fi; \ + done; \ + done + +mostlyclean-aminfo: + -rm -rf libffi.aux libffi.cp libffi.cps libffi.fn libffi.ky libffi.log \ + libffi.pg libffi.tmp libffi.toc libffi.tp libffi.vr + +clean-aminfo: + -test -z "doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html" \ + || rm -rf doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html + +maintainer-clean-aminfo: + @list='$(INFO_DEPS)'; for i in $$list; do \ + i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ + echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ + rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ + done +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-info + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(INFO_DEPS) $(LTLIBRARIES) $(DATA) fficonfig.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f doc/$(am__dirstamp) + -rm -f src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/$(am__dirstamp) + -rm -f src/alpha/$(DEPDIR)/$(am__dirstamp) + -rm -f src/alpha/$(am__dirstamp) + -rm -f src/arm/$(DEPDIR)/$(am__dirstamp) + -rm -f src/arm/$(am__dirstamp) + -rm -f src/avr32/$(DEPDIR)/$(am__dirstamp) + -rm -f src/avr32/$(am__dirstamp) + -rm -f src/cris/$(DEPDIR)/$(am__dirstamp) + -rm -f src/cris/$(am__dirstamp) + -rm -f src/frv/$(DEPDIR)/$(am__dirstamp) + -rm -f src/frv/$(am__dirstamp) + -rm -f src/ia64/$(DEPDIR)/$(am__dirstamp) + -rm -f src/ia64/$(am__dirstamp) + -rm -f src/m32r/$(DEPDIR)/$(am__dirstamp) + -rm -f src/m32r/$(am__dirstamp) + -rm -f src/m68k/$(DEPDIR)/$(am__dirstamp) + -rm -f src/m68k/$(am__dirstamp) + -rm -f src/mips/$(DEPDIR)/$(am__dirstamp) + -rm -f src/mips/$(am__dirstamp) + -rm -f src/pa/$(DEPDIR)/$(am__dirstamp) + -rm -f src/pa/$(am__dirstamp) + -rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/powerpc/$(am__dirstamp) + -rm -f src/s390/$(DEPDIR)/$(am__dirstamp) + -rm -f src/s390/$(am__dirstamp) + -rm -f src/sh/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sh/$(am__dirstamp) + -rm -f src/sh64/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sh64/$(am__dirstamp) + -rm -f src/sparc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sparc/$(am__dirstamp) + -rm -f src/x86/$(DEPDIR)/$(am__dirstamp) + -rm -f src/x86/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-aminfo clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: $(DVIS) + +html: html-recursive + +html-am: $(HTMLS) + +info: info-recursive + +info-am: $(INFO_DEPS) + +install-data-am: install-info-am install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: $(DVIS) + @$(NORMAL_INSTALL) + test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)" + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ + done +install-exec-am: install-libLTLIBRARIES + +install-html-am: $(HTMLS) + @$(NORMAL_INSTALL) + test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)" + @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__strip_dir) \ + if test -d "$$d$$p"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ + echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ + $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ + else \ + list2="$$list2 $$d$$p"; \ + fi; \ + done; \ + test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done; } +install-info: install-info-recursive + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ + for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ + $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ + if test -f $$ifile; then \ + echo "$$ifile"; \ + else : ; fi; \ + done; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done + @$(POST_INSTALL) + @if (install-info --version && \ + install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ + install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ + done; \ + else : ; fi +install-man: + +install-pdf-am: $(PDFS) + @$(NORMAL_INSTALL) + test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)" + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done +install-ps: install-ps-recursive + +install-ps-am: $(PSS) + @$(NORMAL_INSTALL) + test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)" + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-aminfo mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool mostlyclean-vti + +pdf: pdf-recursive + +pdf-am: $(PDFS) + +ps: ps-recursive + +ps-am: $(PSS) + +uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ + uninstall-libLTLIBRARIES uninstall-pdf-am \ + uninstall-pkgconfigDATA uninstall-ps-am + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-aminfo \ + clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstLTLIBRARIES ctags ctags-recursive dist dist-all \ + dist-bzip2 dist-gzip dist-info dist-lzma dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-pdf install-pdf-am install-pkgconfigDATA \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-aminfo maintainer-clean-generic \ + maintainer-clean-vti mostlyclean mostlyclean-aminfo \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + mostlyclean-vti pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-dvi-am uninstall-html-am \ + uninstall-info-am uninstall-libLTLIBRARIES uninstall-pdf-am \ + uninstall-pkgconfigDATA uninstall-ps-am + + +# No install-html or install-pdf support in automake yet +.PHONY: install-html install-pdf +install-html: +install-pdf: + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/config.log b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/config.log new file mode 100644 index 0000000..7350629 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/config.log @@ -0,0 +1,1144 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by libffi configure 3.0.10, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure --disable-static --with-pic=yes --disable-dependency-tracking --host=i386-apple-darwin + +## --------- ## +## Platform. ## +## --------- ## + +hostname = test2.allow2.com +uname -m = x86_64 +uname -r = 17.3.0 +uname -s = Darwin +uname -v = Darwin Kernel Version 17.3.0: Thu Nov 9 18:09:22 PST 2017; root:xnu-4570.31.3~1/RELEASE_X86_64 + +/usr/bin/uname -p = i386 +/bin/uname -X = unknown + +/bin/arch = unknown +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = Mach kernel version: + Darwin Kernel Version 17.3.0: Thu Nov 9 18:09:22 PST 2017; root:xnu-4570.31.3~1/RELEASE_X86_64 +Kernel configured for up to 8 processors. +4 processors are physically available. +8 processors are logically available. +Processor type: i486 (Intel 80486) +Processors active: 0 1 2 3 4 5 6 7 +Primary memory available: 12.00 gigabytes +Default processor set: 561 tasks, 3363 threads, 8 processors +Load average: 9.40, Mach factor: 1.26 +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /Users/andrew/.nvm/versions/node/v9.2.0/bin +PATH: /Users/andrew/google-cloud-sdk/bin +PATH: /Users/andrew/Library/Python/2.7/bin +PATH: /usr/local/bin/mongo +PATH: /usr/local/mysql/bin +PATH: /usr/local/bin +PATH: /usr/bin +PATH: /bin +PATH: /usr/sbin +PATH: /sbin +PATH: /usr/local/go/bin +PATH: /opt/X11/bin +PATH: /usr/local/apache-maven-2.2.1/bin + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:2550: checking build system type +configure:2564: result: x86_64-apple-darwin17.3.0 +configure:2584: checking host system type +configure:2597: result: i386-apple-darwin +configure:2617: checking target system type +configure:2630: result: i386-apple-darwin +configure:2722: checking for gsed +configure:2753: result: sed +configure:2781: checking for a BSD-compatible install +configure:2849: result: /usr/bin/install -c +configure:2860: checking whether build environment is sane +configure:2910: result: yes +configure:2956: checking for i386-apple-darwin-strip +configure:2986: result: no +configure:2996: checking for strip +configure:3012: found /usr/bin/strip +configure:3023: result: strip +configure:3048: checking for a thread-safe mkdir -p +configure:3087: result: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +configure:3100: checking for gawk +configure:3130: result: no +configure:3100: checking for mawk +configure:3130: result: no +configure:3100: checking for nawk +configure:3130: result: no +configure:3100: checking for awk +configure:3116: found /usr/bin/awk +configure:3127: result: awk +configure:3138: checking whether make sets $(MAKE) +configure:3160: result: yes +configure:3259: checking for i386-apple-darwin-gcc +configure:3286: result: xcrun clang +configure:3555: checking for C compiler version +configure:3564: xcrun clang --version >&5 +Apple LLVM version 9.0.0 (clang-900.0.39.2) +Target: x86_64-apple-darwin17.3.0 +Thread model: posix +InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin +configure:3575: $? = 0 +configure:3564: xcrun clang -v >&5 +Apple LLVM version 9.0.0 (clang-900.0.39.2) +Target: x86_64-apple-darwin17.3.0 +Thread model: posix +InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin +configure:3575: $? = 0 +configure:3564: xcrun clang -V >&5 +clang: error: argument to '-V' is missing (expected 1 value) +clang: error: no input files +configure:3575: $? = 1 +configure:3564: xcrun clang -qversion >&5 +clang: error: unknown argument: '-qversion' +clang: error: no input files +configure:3575: $? = 1 +configure:3595: checking whether the C compiler works +configure:3617: xcrun clang -arch i386 -arch i386 conftest.c >&5 +configure:3621: $? = 0 +configure:3669: result: yes +configure:3672: checking for C compiler default output file name +configure:3674: result: a.out +configure:3680: checking for suffix of executables +configure:3687: xcrun clang -o conftest -arch i386 -arch i386 conftest.c >&5 +configure:3691: $? = 0 +configure:3713: result: +configure:3735: checking whether we are cross compiling +configure:3743: xcrun clang -o conftest -arch i386 -arch i386 conftest.c >&5 +configure:3747: $? = 0 +configure:3754: ./conftest +configure:3758: $? = 0 +configure:3773: result: no +configure:3778: checking for suffix of object files +configure:3800: xcrun clang -c -arch i386 conftest.c >&5 +configure:3804: $? = 0 +configure:3825: result: o +configure:3829: checking whether we are using the GNU C compiler +configure:3848: xcrun clang -c -arch i386 conftest.c >&5 +configure:3848: $? = 0 +configure:3857: result: yes +configure:3866: checking whether xcrun clang accepts -g +configure:3886: xcrun clang -c -g conftest.c >&5 +configure:3886: $? = 0 +configure:3927: result: yes +configure:3944: checking for xcrun clang option to accept ISO C89 +configure:4008: xcrun clang -c -arch i386 conftest.c >&5 +configure:4008: $? = 0 +configure:4021: result: none needed +configure:4052: checking for style of include used by make +configure:4080: result: GNU +configure:4105: checking dependency style of xcrun clang +configure:4215: result: none +configure:4245: checking dependency style of xcrun clang +configure:4353: result: none +configure:4369: checking whether xcrun clang and cc understand -c and -o together +configure:4400: xcrun clang -c conftest.c -o conftest2.o >&5 +configure:4404: $? = 0 +configure:4410: xcrun clang -c conftest.c -o conftest2.o >&5 +configure:4414: $? = 0 +configure:4425: cc -c conftest.c >&5 +configure:4429: $? = 0 +configure:4437: cc -c conftest.c -o conftest2.o >&5 +configure:4441: $? = 0 +configure:4447: cc -c conftest.c -o conftest2.o >&5 +configure:4451: $? = 0 +configure:4469: result: yes +configure:4540: checking how to print strings +configure:4567: result: printf +configure:4588: checking for a sed that does not truncate output +configure:4652: result: /usr/bin/sed +configure:4670: checking for grep that handles long lines and -e +configure:4728: result: /usr/bin/grep +configure:4733: checking for egrep +configure:4795: result: /usr/bin/grep -E +configure:4800: checking for fgrep +configure:4862: result: /usr/bin/grep -F +configure:4897: checking for ld used by xcrun clang +configure:4964: result: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +configure:4971: checking if the linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) is GNU ld +configure:4986: result: no +configure:4998: checking for BSD- or MS-compatible name lister (nm) +configure:5047: result: no +configure:5061: checking for i386-apple-darwin-dumpbin +configure:5091: result: no +configure:5061: checking for i386-apple-darwin-link +configure:5091: result: no +configure:5105: checking for dumpbin +configure:5135: result: no +configure:5105: checking for link +configure:5121: found /bin/link +configure:5132: result: link -dump +configure:5177: checking the name lister (nm) interface +configure:5184: xcrun clang -c -arch i386 conftest.c >&5 +configure:5187: nm "conftest.o" +configure:5190: output +00000000 S _some_variable +configure:5197: result: BSD nm +configure:5200: checking whether ln -s works +configure:5204: result: yes +configure:5212: checking the maximum length of command line arguments +configure:5337: result: 196608 +configure:5354: checking whether the shell understands some XSI constructs +configure:5364: result: yes +configure:5368: checking whether the shell understands "+=" +configure:5374: result: yes +configure:5409: checking how to convert x86_64-apple-darwin17.3.0 file names to i386-apple-darwin format +configure:5449: result: func_convert_file_noop +configure:5456: checking how to convert x86_64-apple-darwin17.3.0 file names to toolchain format +configure:5476: result: func_convert_file_noop +configure:5483: checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld option to reload object files +configure:5490: result: -r +configure:5524: checking for i386-apple-darwin-objdump +configure:5554: result: no +configure:5564: checking for objdump +configure:5580: found /usr/bin/objdump +configure:5591: result: objdump +configure:5623: checking how to recognize dependent libraries +configure:5825: result: pass_all +configure:5870: checking for i386-apple-darwin-dlltool +configure:5900: result: no +configure:5910: checking for dlltool +configure:5940: result: no +configure:5970: checking how to associate runtime and link libraries +configure:5997: result: printf %s\n +configure:6014: checking for i386-apple-darwin-ar +configure:6044: result: no +configure:6058: checking for ar +configure:6074: found /usr/bin/ar +configure:6085: result: ar +configure:6122: checking for archiver @FILE support +configure:6139: xcrun clang -c -arch i386 conftest.c >&5 +configure:6139: $? = 0 +configure:6142: ar cru libconftest.a @conftest.lst >&5 +ar: @conftest.lst: No such file or directory +configure:6145: $? = 1 +configure:6165: result: no +configure:6183: checking for i386-apple-darwin-strip +configure:6210: result: strip +configure:6282: checking for i386-apple-darwin-ranlib +configure:6312: result: no +configure:6322: checking for ranlib +configure:6338: found /usr/bin/ranlib +configure:6349: result: ranlib +configure:6451: checking command to parse nm output from xcrun clang object +configure:6570: xcrun clang -c -arch i386 conftest.c >&5 +configure:6573: $? = 0 +configure:6577: nm conftest.o \| sed -n -e 's/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' | sed '/ __gnu_lto/d' \> conftest.nm +configure:6580: $? = 0 +cannot find nm_test_var in conftest.nm +configure:6570: xcrun clang -c -arch i386 conftest.c >&5 +configure:6573: $? = 0 +configure:6577: nm conftest.o \| sed -n -e 's/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*_\([_A-Za-z][_A-Za-z0-9]*\)$/\1 _\2 \2/p' | sed '/ __gnu_lto/d' \> conftest.nm +configure:6580: $? = 0 +configure:6646: xcrun clang -o conftest -arch i386 -arch i386 conftest.c conftstm.o >&5 +configure:6649: $? = 0 +configure:6687: result: ok +configure:6724: checking for sysroot +configure:6754: result: no +configure:6957: checking for i386-apple-darwin-mt +configure:6987: result: no +configure:6997: checking for mt +configure:7027: result: no +configure:7047: checking if : is a manifest tool +configure:7053: : '-?' +configure:7061: result: no +configure:7077: checking for i386-apple-darwin-dsymutil +configure:7107: result: no +configure:7117: checking for dsymutil +configure:7133: found /usr/bin/dsymutil +configure:7144: result: dsymutil +configure:7169: checking for i386-apple-darwin-nmedit +configure:7199: result: no +configure:7209: checking for nmedit +configure:7225: found /usr/bin/nmedit +configure:7236: result: nmedit +configure:7261: checking for i386-apple-darwin-lipo +configure:7291: result: no +configure:7301: checking for lipo +configure:7317: found /usr/bin/lipo +configure:7328: result: lipo +configure:7353: checking for i386-apple-darwin-otool +configure:7383: result: no +configure:7393: checking for otool +configure:7409: found /usr/bin/otool +configure:7420: result: otool +configure:7445: checking for i386-apple-darwin-otool64 +configure:7475: result: no +configure:7485: checking for otool64 +configure:7515: result: no +configure:7560: checking for -single_module linker flag + xcrun clang -arch i386 -arch i386 -o libconftest.dylib -dynamiclib -Wl,-single_module conftest.c +configure:7587: result: yes +configure:7589: checking for -exported_symbols_list linker flag +configure:7609: xcrun clang -o conftest -arch i386 -arch i386 -Wl,-exported_symbols_list,conftest.sym conftest.c >&5 +configure:7609: $? = 0 +configure:7619: result: yes +configure:7621: checking for -force_load linker flag + xcrun clang -arch i386 -c -o conftest.o conftest.c +ar cru libconftest.a conftest.o +ranlib libconftest.a + xcrun clang -arch i386 -arch i386 -o conftest conftest.c -Wl,-force_load,./libconftest.a +configure:7651: result: yes +configure:7693: checking how to run the C preprocessor +configure:7724: xcrun clang -E conftest.c +configure:7724: $? = 0 +configure:7738: xcrun clang -E conftest.c +conftest.c:11:10: fatal error: 'ac_nonexistent.h' file not found +#include + ^~~~~~~~~~~~~~~~~~ +1 error generated. +configure:7738: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| /* end confdefs.h. */ +| #include +configure:7763: result: xcrun clang -E +configure:7783: xcrun clang -E conftest.c +configure:7783: $? = 0 +configure:7797: xcrun clang -E conftest.c +conftest.c:11:10: fatal error: 'ac_nonexistent.h' file not found +#include + ^~~~~~~~~~~~~~~~~~ +1 error generated. +configure:7797: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| /* end confdefs.h. */ +| #include +configure:7826: checking for ANSI C header files +configure:7846: xcrun clang -c -arch i386 conftest.c >&5 +configure:7846: $? = 0 +configure:7919: xcrun clang -o conftest -arch i386 -arch i386 conftest.c >&5 +configure:7919: $? = 0 +configure:7919: ./conftest +configure:7919: $? = 0 +configure:7930: result: yes +configure:7943: checking for sys/types.h +configure:7943: xcrun clang -c -arch i386 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for sys/stat.h +configure:7943: xcrun clang -c -arch i386 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for stdlib.h +configure:7943: xcrun clang -c -arch i386 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for string.h +configure:7943: xcrun clang -c -arch i386 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for memory.h +configure:7943: xcrun clang -c -arch i386 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for strings.h +configure:7943: xcrun clang -c -arch i386 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for inttypes.h +configure:7943: xcrun clang -c -arch i386 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for stdint.h +configure:7943: xcrun clang -c -arch i386 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for unistd.h +configure:7943: xcrun clang -c -arch i386 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7957: checking for dlfcn.h +configure:7957: xcrun clang -c -arch i386 conftest.c >&5 +configure:7957: $? = 0 +configure:7957: result: yes +configure:8144: checking for objdir +configure:8159: result: .libs +configure:8430: checking if xcrun clang supports -fno-rtti -fno-exceptions +configure:8448: xcrun clang -c -arch i386 -fno-rtti -fno-exceptions conftest.c >&5 +configure:8452: $? = 0 +configure:8465: result: yes +configure:8775: checking for xcrun clang option to produce PIC +configure:8782: result: -fno-common -DPIC +configure:8790: checking if xcrun clang PIC flag -fno-common -DPIC works +configure:8808: xcrun clang -c -arch i386 -fno-common -DPIC -DPIC conftest.c >&5 +configure:8812: $? = 0 +configure:8825: result: yes +configure:8854: checking if xcrun clang static flag -static works +configure:8882: result: no +configure:8897: checking if xcrun clang supports -c -o file.o +configure:8918: xcrun clang -c -arch i386 -o out/conftest2.o conftest.c >&5 +configure:8922: $? = 0 +configure:8944: result: yes +configure:8952: checking if xcrun clang supports -c -o file.o +configure:8999: result: yes +configure:9032: checking whether the xcrun clang linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) supports shared libraries +configure:10190: result: yes +configure:10435: checking dynamic linker characteristics +configure:11171: result: darwin dyld +configure:11278: checking how to hardcode library paths into programs +configure:11303: result: immediate +configure:11843: checking whether stripping libraries is possible +configure:11857: result: yes +configure:11883: checking if libtool supports shared libraries +configure:11885: result: yes +configure:11888: checking whether to build shared libraries +configure:11909: result: yes +configure:11912: checking whether to build static libraries +configure:11916: result: no +configure:11954: checking for C compiler vendor +configure:11978: xcrun clang -c -arch i386 conftest.c >&5 +conftest.c:29:7: error: use of undeclared identifier 'thisisanerror' + thisisanerror; + ^ +1 error generated. +configure:11978: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| #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_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__ICC) || defined(__ECC) || defined(__INTEL_COMPILER)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:11978: xcrun clang -c -arch i386 conftest.c >&5 +conftest.c:29:7: error: use of undeclared identifier 'thisisanerror' + thisisanerror; + ^ +1 error generated. +configure:11978: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| #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_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__xlc__) || defined(__xlC__) || defined(__IBMC__) || defined(__IBMCPP__)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:11978: xcrun clang -c -arch i386 conftest.c >&5 +conftest.c:29:7: error: use of undeclared identifier 'thisisanerror' + thisisanerror; + ^ +1 error generated. +configure:11978: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| #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_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__PATHCC__) || defined(__PATHSCALE__)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:11978: xcrun clang -c -arch i386 conftest.c >&5 +configure:11978: $? = 0 +configure:11985: result: clang +configure:12771: checking CFLAGS for maximum warnings +configure:12797: xcrun clang -c -arch i386 -pedantic -Wall conftest.c >&5 +configure:12797: $? = 0 +configure:12811: result: -Wall +configure:12824: : CFLAGS="$CFLAGS $ac_cv_cflags_warn_all" +configure:12827: $? = 0 +configure:12839: checking whether to enable maintainer-specific portions of Makefiles +configure:12848: result: no +configure:12864: checking sys/mman.h usability +configure:12864: xcrun clang -c -arch i386 -Wall -fexceptions conftest.c >&5 +configure:12864: $? = 0 +configure:12864: result: yes +configure:12864: checking sys/mman.h presence +configure:12864: xcrun clang -E conftest.c +configure:12864: $? = 0 +configure:12864: result: yes +configure:12864: checking for sys/mman.h +configure:12864: result: yes +configure:12876: checking for mmap +configure:12876: xcrun clang -o conftest -arch i386 -Wall -fexceptions -arch i386 conftest.c >&5 +configure:12876: $? = 0 +configure:12876: result: yes +configure:12886: checking for sys/mman.h +configure:12886: result: yes +configure:12894: checking for mmap +configure:12894: result: yes +configure:12907: checking whether read-only mmap of a plain file works +configure:12924: result: yes +configure:12926: checking whether mmap from /dev/zero works +configure:12948: result: no +configure:12952: checking for MAP_ANON(YMOUS) +configure:12975: xcrun clang -c -arch i386 -Wall -fexceptions conftest.c >&5 +conftest.c:36:5: warning: unused variable 'n' [-Wunused-variable] +int n = MAP_ANONYMOUS; + ^ +1 warning generated. +configure:12975: $? = 0 +configure:12982: result: yes +configure:12988: checking whether mmap with MAP_ANON(YMOUS) works +configure:13005: result: yes +configure:13398: checking for ANSI C header files +configure:13502: result: yes +configure:13512: checking for memcpy +configure:13512: xcrun clang -o conftest -arch i386 -Wall -fexceptions -arch i386 conftest.c >&5 +conftest.c:51:6: warning: incompatible redeclaration of library function 'memcpy' [-Wincompatible-library-redeclaration] +char memcpy (); + ^ +conftest.c:51:6: note: 'memcpy' is a builtin with type 'void *(void *, const void *, unsigned long)' +1 warning generated. +configure:13512: $? = 0 +configure:13512: result: yes +configure:13521: checking for size_t +configure:13521: xcrun clang -c -arch i386 -Wall -fexceptions conftest.c >&5 +configure:13521: $? = 0 +configure:13521: xcrun clang -c -arch i386 -Wall -fexceptions conftest.c >&5 +conftest.c:65:21: error: expected expression +if (sizeof ((size_t))) + ^ +1 error generated. +configure:13521: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| #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_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MMAP_FILE 1 +| #define HAVE_MMAP_ANON 1 +| #define STDC_HEADERS 1 +| #define HAVE_MEMCPY 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| if (sizeof ((size_t))) +| return 0; +| ; +| return 0; +| } +configure:13521: result: yes +configure:13534: checking for working alloca.h +configure:13551: xcrun clang -o conftest -arch i386 -Wall -fexceptions -arch i386 conftest.c >&5 +configure:13551: $? = 0 +configure:13559: result: yes +configure:13567: checking for alloca +configure:13604: xcrun clang -o conftest -arch i386 -Wall -fexceptions -arch i386 conftest.c >&5 +configure:13604: $? = 0 +configure:13612: result: yes +configure:13726: checking size of double +configure:13731: xcrun clang -o conftest -arch i386 -Wall -fexceptions -arch i386 conftest.c >&5 +configure:13731: $? = 0 +configure:13731: ./conftest +configure:13731: $? = 0 +configure:13745: result: 8 +configure:13759: checking size of long double +configure:13764: xcrun clang -o conftest -arch i386 -Wall -fexceptions -arch i386 conftest.c >&5 +configure:13764: $? = 0 +configure:13764: ./conftest +configure:13764: $? = 0 +configure:13778: result: 16 +configure:13803: checking whether byte ordering is bigendian +configure:13818: xcrun clang -c -arch i386 -Wall -fexceptions conftest.c >&5 +configure:13818: $? = 0 +configure:13863: xcrun clang -c -arch i386 -Wall -fexceptions conftest.c >&5 +configure:13863: $? = 0 +configure:13881: xcrun clang -c -arch i386 -Wall -fexceptions conftest.c >&5 +conftest.c:41:4: error: use of undeclared identifier 'not' + not big endian + ^ +1 error generated. +configure:13881: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| #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_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MMAP_FILE 1 +| #define HAVE_MMAP_ANON 1 +| #define STDC_HEADERS 1 +| #define HAVE_MEMCPY 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_ALLOCA 1 +| #define SIZEOF_DOUBLE 8 +| #define SIZEOF_LONG_DOUBLE 16 +| #define HAVE_LONG_DOUBLE 1 +| /* end confdefs.h. */ +| #include +| #include +| +| int +| main () +| { +| #if BYTE_ORDER != BIG_ENDIAN +| not big endian +| #endif +| +| ; +| return 0; +| } +configure:14009: result: no +configure:14028: checking assembler .cfi pseudo-op support +configure:14046: xcrun clang -c -arch i386 -Wall -fexceptions conftest.c >&5 +configure:14046: $? = 0 +configure:14054: result: yes +configure:14335: checking whether .eh_frame section should be read-only +configure:14354: result: no +configure:14369: checking for __attribute__((visibility("hidden"))) +configure:14378: xcrun clang -Werror -S conftest.c -o conftest.s 1>&5 +configure:14381: $? = 0 +configure:14390: result: no +configure:14750: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by libffi config.status 3.0.10, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on test2.allow2.com + +config.status:1204: creating include/Makefile +config.status:1204: creating include/ffi.h +config.status:1204: creating Makefile +config.status:1204: creating testsuite/Makefile +config.status:1204: creating man/Makefile +config.status:1204: creating libffi.pc +config.status:1204: creating fficonfig.h +config.status:1430: linking /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffitarget.h to include/ffitarget.h +config.status:1449: executing buildir commands +config.status:1462: skipping top_srcdir/Makefile - not created +config.status:1449: executing depfiles commands +config.status:1449: executing libtool commands +config.status:1449: executing include commands +config.status:1449: executing src commands + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_build=x86_64-apple-darwin17.3.0 +ac_cv_c_bigendian=no +ac_cv_c_compiler_gnu=yes +ac_cv_cflags_warn_all=-Wall +ac_cv_decl_map_anon=yes +ac_cv_env_CCASFLAGS_set= +ac_cv_env_CCASFLAGS_value= +ac_cv_env_CCAS_set= +ac_cv_env_CCAS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set=set +ac_cv_env_host_alias_value=i386-apple-darwin +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_func_alloca_works=yes +ac_cv_func_memcpy=yes +ac_cv_func_mmap=yes +ac_cv_func_mmap_anon=yes +ac_cv_func_mmap_dev_zero=no +ac_cv_func_mmap_file=yes +ac_cv_header_dlfcn_h=yes +ac_cv_header_inttypes_h=yes +ac_cv_header_memory_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_sys_mman_h=yes +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_unistd_h=yes +ac_cv_host=i386-apple-darwin +ac_cv_objext=o +ac_cv_path_EGREP='/usr/bin/grep -E' +ac_cv_path_FGREP='/usr/bin/grep -F' +ac_cv_path_GREP=/usr/bin/grep +ac_cv_path_SED=/usr/bin/sed +ac_cv_path_ax_enable_builddir_sed=sed +ac_cv_path_install='/usr/bin/install -c' +ac_cv_prog_AWK=awk +ac_cv_prog_CC=' xcrun clang' +ac_cv_prog_CPP=' xcrun clang -E' +ac_cv_prog_STRIP=strip +ac_cv_prog_ac_ct_AR=ar +ac_cv_prog_ac_ct_DSYMUTIL=dsymutil +ac_cv_prog_ac_ct_DUMPBIN='link -dump' +ac_cv_prog_ac_ct_LIPO=lipo +ac_cv_prog_ac_ct_NMEDIT=nmedit +ac_cv_prog_ac_ct_OBJDUMP=objdump +ac_cv_prog_ac_ct_OTOOL=otool +ac_cv_prog_ac_ct_RANLIB=ranlib +ac_cv_prog_ac_ct_STRIP=strip +ac_cv_prog_cc_c89= +ac_cv_prog_cc_g=yes +ac_cv_prog_cc_xcrun_c_o=yes +ac_cv_prog_make_make_set=yes +ac_cv_sizeof_double=8 +ac_cv_sizeof_long_double=16 +ac_cv_target=i386-apple-darwin +ac_cv_type_size_t=yes +ac_cv_working_alloca_h=yes +am_cv_CCAS_dependencies_compiler_type=none +am_cv_CC_dependencies_compiler_type=none +ax_cv_c_compiler_vendor=clang +libffi_cv_as_cfi_pseudo_op=yes +libffi_cv_hidden_visibility_attribute=no +libffi_cv_ro_eh_frame=no +lt_cv_apple_cc_single_mod=yes +lt_cv_ar_at_file=no +lt_cv_deplibs_check_method=pass_all +lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_ld_exported_symbols_list=yes +lt_cv_ld_force_load=yes +lt_cv_ld_reload_flag=-r +lt_cv_nm_interface='BSD nm' +lt_cv_objdir=.libs +lt_cv_path_LD=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +lt_cv_path_NM=no +lt_cv_path_mainfest_tool=no +lt_cv_prog_compiler_c_o=yes +lt_cv_prog_compiler_pic='-fno-common -DPIC' +lt_cv_prog_compiler_pic_works=yes +lt_cv_prog_compiler_rtti_exceptions=yes +lt_cv_prog_compiler_static_works=no +lt_cv_prog_gnu_ld=no +lt_cv_sharedlib_from_linklib_cmd='printf %s\n' +lt_cv_sys_global_symbol_pipe='sed -n -e '\''s/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*_\([_A-Za-z][_A-Za-z0-9]*\)$/\1 _\2 \2/p'\'' | sed '\''/ __gnu_lto/d'\''' +lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \([^ ]*\)$/ {"\2", (void *) \&\2},/p'\''' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \(lib[^ ]*\)$/ {"\2", (void *) \&\2},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \([^ ]*\)$/ {"lib\2", (void *) \&\2},/p'\''' +lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^T .* \(.*\)$/extern int \1();/p'\'' -e '\''s/^[BCDEGRST]* .* \(.*\)$/extern char \1;/p'\''' +lt_cv_sys_max_cmd_len=196608 +lt_cv_to_host_file_cmd=func_convert_file_noop +lt_cv_to_tool_file_cmd=func_convert_file_noop + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +ACLOCAL='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run aclocal-1.11' +ALLOCA='' +ALPHA_FALSE='' +ALPHA_TRUE='#' +AMDEPBACKSLASH='' +AMDEP_FALSE='' +AMDEP_TRUE='#' +AMTAR='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run tar' +AM_LTLDFLAGS='' +AM_RUNTESTFLAGS='' +AR='ar' +ARM_FALSE='' +ARM_TRUE='#' +AUTOCONF='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoconf' +AUTOHEADER='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoheader' +AUTOMAKE='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run automake-1.11' +AVR32_FALSE='' +AVR32_TRUE='#' +AWK='awk' +CC=' xcrun clang' +CCAS=' xcrun clang' +CCASDEPMODE='depmode=none' +CCASFLAGS='-arch i386 ' +CCDEPMODE='depmode=none' +CFLAGS='-arch i386 -Wall -fexceptions' +CPP=' xcrun clang -E' +CPPFLAGS='' +CYGPATH_W='echo' +DEFS='-DHAVE_CONFIG_H' +DEPDIR='.deps' +DLLTOOL='false' +DSYMUTIL='dsymutil' +DUMPBIN=':' +ECHO_C='\c' +ECHO_N='' +ECHO_T='' +EGREP='/usr/bin/grep -E' +EXEEXT='' +FFI_DEBUG_FALSE='' +FFI_DEBUG_TRUE='#' +FFI_EXEC_TRAMPOLINE_TABLE='0' +FFI_EXEC_TRAMPOLINE_TABLE_FALSE='' +FFI_EXEC_TRAMPOLINE_TABLE_TRUE='#' +FGREP='/usr/bin/grep -F' +FRV_FALSE='' +FRV_TRUE='#' +GREP='/usr/bin/grep' +HAVE_LONG_DOUBLE='1' +IA64_FALSE='' +IA64_TRUE='#' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL}' +INSTALL_SCRIPT='${INSTALL}' +INSTALL_STRIP_PROGRAM='$(install_sh) -c -s' +LD='/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld' +LDFLAGS='-arch i386' +LIBFFI_CRIS_FALSE='' +LIBFFI_CRIS_TRUE='#' +LIBOBJS='' +LIBS='' +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +LIPO='lipo' +LN_S='ln -s' +LTLIBOBJS='' +M32R_FALSE='' +M32R_TRUE='#' +M68K_FALSE='' +M68K_TRUE='#' +MAINT='#' +MAINTAINER_MODE_FALSE='' +MAINTAINER_MODE_TRUE='#' +MAKEINFO='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo' +MANIFEST_TOOL=':' +MIPS_FALSE='' +MIPS_TRUE='#' +MKDIR_P='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d' +MOXIE_FALSE='' +MOXIE_TRUE='#' +NM='nm' +NMEDIT='nmedit' +OBJDUMP='objdump' +OBJEXT='o' +OTOOL64=':' +OTOOL='otool' +PA64_HPUX_FALSE='' +PA64_HPUX_TRUE='#' +PACKAGE='libffi' +PACKAGE_BUGREPORT='http://sourceware.org/libffi.html' +PACKAGE_NAME='libffi' +PACKAGE_STRING='libffi 3.0.10' +PACKAGE_TARNAME='libffi' +PACKAGE_URL='' +PACKAGE_VERSION='3.0.10' +PATH_SEPARATOR=':' +PA_HPUX_FALSE='' +PA_HPUX_TRUE='#' +PA_LINUX_FALSE='' +PA_LINUX_TRUE='#' +POWERPC_AIX_FALSE='' +POWERPC_AIX_TRUE='#' +POWERPC_DARWIN_FALSE='' +POWERPC_DARWIN_TRUE='#' +POWERPC_FALSE='' +POWERPC_FREEBSD_FALSE='' +POWERPC_FREEBSD_TRUE='#' +POWERPC_TRUE='#' +PRTDIAG='' +RANLIB='ranlib' +S390_FALSE='' +S390_TRUE='#' +SED='/usr/bin/sed' +SET_MAKE='' +SH64_FALSE='' +SH64_TRUE='#' +SHELL='/bin/sh' +SH_FALSE='' +SH_TRUE='#' +SPARC_FALSE='' +SPARC_TRUE='#' +STRIP='strip' +TARGET='X86_DARWIN' +TARGETDIR='x86' +TESTSUBDIR_FALSE='#' +TESTSUBDIR_TRUE='' +VERSION='3.0.10' +X86_64_FALSE='' +X86_64_TRUE='#' +X86_DARWIN_FALSE='#' +X86_DARWIN_TRUE='' +X86_FALSE='' +X86_FREEBSD_FALSE='' +X86_FREEBSD_TRUE='#' +X86_TRUE='#' +X86_WIN32_FALSE='' +X86_WIN32_TRUE='#' +X86_WIN64_FALSE='' +X86_WIN64_TRUE='#' +ac_ct_AR='ar' +ac_ct_CC='' +ac_ct_DUMPBIN='link -dump' +am__EXEEXT_FALSE='' +am__EXEEXT_TRUE='#' +am__fastdepCCAS_FALSE='' +am__fastdepCCAS_TRUE='#' +am__fastdepCC_FALSE='' +am__fastdepCC_TRUE='#' +am__include='include' +am__isrc=' -I$(srcdir)' +am__leading_dot='.' +am__quote='' +am__tar='${AMTAR} chof - "$$tardir"' +am__untar='${AMTAR} xf -' +ax_enable_builddir_sed='sed' +bindir='${exec_prefix}/bin' +build='x86_64-apple-darwin17.3.0' +build_alias='' +build_cpu='x86_64' +build_os='darwin17.3.0' +build_vendor='apple' +datadir='${datarootdir}' +datarootdir='${prefix}/share' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +dvidir='${docdir}' +exec_prefix='${prefix}' +host='i386-apple-darwin' +host_alias='i386-apple-darwin' +host_cpu='i386' +host_os='darwin' +host_vendor='apple' +htmldir='${docdir}' +includedir='${prefix}/include' +infodir='${datarootdir}/info' +install_sh='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh' +libdir='${exec_prefix}/lib' +libexecdir='${exec_prefix}/libexec' +localedir='${datarootdir}/locale' +localstatedir='${prefix}/var' +mandir='${datarootdir}/man' +mkdir_p='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d' +oldincludedir='/usr/include' +pdfdir='${docdir}' +prefix='/usr/local' +program_transform_name='s,x,x,' +psdir='${docdir}' +sbindir='${exec_prefix}/sbin' +sharedstatedir='${prefix}/com' +sys_symbol_underscore='' +sysconfdir='${prefix}/etc' +target='i386-apple-darwin' +target_alias='i386-apple-darwin' +target_cpu='i386' +target_os='darwin' +target_vendor='apple' +toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +toolexeclibdir='$(libdir)/' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +/* confdefs.h */ +#define PACKAGE_NAME "libffi" +#define PACKAGE_TARNAME "libffi" +#define PACKAGE_VERSION "3.0.10" +#define PACKAGE_STRING "libffi 3.0.10" +#define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +#define PACKAGE_URL "" +#define PACKAGE "libffi" +#define VERSION "3.0.10" +#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_DLFCN_H 1 +#define LT_OBJDIR ".libs/" +#define HAVE_SYS_MMAN_H 1 +#define HAVE_MMAP 1 +#define HAVE_MMAP_FILE 1 +#define HAVE_MMAP_ANON 1 +#define STDC_HEADERS 1 +#define HAVE_MEMCPY 1 +#define HAVE_ALLOCA_H 1 +#define HAVE_ALLOCA 1 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_LONG_DOUBLE 16 +#define HAVE_LONG_DOUBLE 1 +#define HAVE_AS_CFI_PSEUDO_OP 1 +#define EH_FRAME_FLAGS "aw" + +configure: exit 0 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/config.status b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/config.status new file mode 100755 index 0000000..d1c70da --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/config.status @@ -0,0 +1,2336 @@ +#! /bin/sh +# Generated by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by libffi $as_me 3.0.10, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +# Files that config.status was made for. +config_files=" include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc" +config_headers=" fficonfig.h" +config_links=" include/ffitarget.h:src/x86/ffitarget.h" +config_commands=" buildir depfiles libtool include src" + +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration links: +$config_links + +Configuration commands: +$config_commands + +Report bugs to ." + +ac_cs_config="'--disable-static' '--with-pic=yes' '--disable-dependency-tracking' '--host=i386-apple-darwin' 'host_alias=i386-apple-darwin'" +ac_cs_version="\ +libffi config.status 3.0.10 +configured by /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure, generated by GNU Autoconf 2.68, + with options \"$ac_cs_config\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386' +srcdir='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi' +INSTALL='/usr/bin/install -c' +MKDIR_P='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d' +AWK='awk' +test -n "$AWK" || AWK=awk +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +if $ac_cs_recheck; then + set X '/bin/sh' '/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure' '--disable-static' '--with-pic=yes' '--disable-dependency-tracking' '--host=i386-apple-darwin' 'host_alias=i386-apple-darwin' $ac_configure_extra_args --no-create --no-recursion + shift + $as_echo "running CONFIG_SHELL=/bin/sh $*" >&6 + CONFIG_SHELL='/bin/sh' + export CONFIG_SHELL + exec "$@" +fi + +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +# +# INIT-COMMANDS +# +ax_enable_builddir_srcdir="/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi" # /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +ax_enable_builddir_host="" # / i386-apple-darwin +ax_enable_builddir_version="3.0.10" # 3.0.10 +ax_enable_builddir_package="libffi" # libffi +ax_enable_builddir_auxdir="/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi" # +ax_enable_builddir_sed="sed" # /usr/bin/sed +ax_enable_builddir="." # + +AMDEP_TRUE="#" ac_aux_dir="/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +double_quote_subst='s/\(["`\\]\)/\\\1/g' +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +macro_version='2.4' +macro_revision='1.3293' +enable_shared='yes' +enable_static='no' +pic_mode='yes' +enable_fast_install='needless' +SHELL='/bin/sh' +ECHO='printf %s\n' +host_alias='i386-apple-darwin' +host='i386-apple-darwin' +host_os='darwin' +build_alias='' +build='x86_64-apple-darwin17.3.0' +build_os='darwin17.3.0' +SED='/usr/bin/sed' +Xsed='/usr/bin/sed -e 1s/^X//' +GREP='/usr/bin/grep' +EGREP='/usr/bin/grep -E' +FGREP='/usr/bin/grep -F' +LD='/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld' +NM='nm' +LN_S='ln -s' +max_cmd_len='196608' +ac_objext='o' +exeext='' +lt_unset='unset' +lt_SP2NL='tr \040 \012' +lt_NL2SP='tr \015\012 \040\040' +lt_cv_to_host_file_cmd='func_convert_file_noop' +lt_cv_to_tool_file_cmd='func_convert_file_noop' +reload_flag=' -r' +reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' +OBJDUMP='objdump' +deplibs_check_method='pass_all' +file_magic_cmd='$MAGIC_CMD' +file_magic_glob='' +want_nocaseglob='no' +DLLTOOL='false' +sharedlib_from_linklib_cmd='printf %s\n' +AR='ar' +AR_FLAGS='cru' +archiver_list_spec='' +STRIP='strip' +RANLIB='ranlib' +old_postinstall_cmds='chmod 644 $oldlib~$RANLIB $oldlib' +old_postuninstall_cmds='' +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs~$RANLIB $oldlib' +lock_old_archive_extraction='yes' +CC=' xcrun clang' +CFLAGS='-arch i386 -Wall -fexceptions' +compiler=' xcrun clang' +GCC='yes' +lt_cv_sys_global_symbol_pipe='sed -n -e '\''s/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*_\([_A-Za-z][_A-Za-z0-9]*\)$/\1 _\2 \2/p'\'' | sed '\''/ __gnu_lto/d'\''' +lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^T .* \(.*\)$/extern int \1();/p'\'' -e '\''s/^[BCDEGRST]* .* \(.*\)$/extern char \1;/p'\''' +lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \([^ ]*\)$/ {"\2", (void *) \&\2},/p'\''' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \(lib[^ ]*\)$/ {"\2", (void *) \&\2},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \([^ ]*\)$/ {"lib\2", (void *) \&\2},/p'\''' +nm_file_list_spec='' +lt_sysroot='' +objdir='.libs' +MAGIC_CMD='file' +lt_prog_compiler_no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' +lt_prog_compiler_pic=' -fno-common -DPIC' +lt_prog_compiler_wl='-Wl,' +lt_prog_compiler_static='' +lt_cv_prog_compiler_c_o='yes' +need_locks='no' +MANIFEST_TOOL=':' +DSYMUTIL='dsymutil' +NMEDIT='nmedit' +LIPO='lipo' +OTOOL='otool' +OTOOL64=':' +libext='a' +shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +extract_expsyms_cmds='' +archive_cmds_need_lc='no' +enable_shared_with_static_runtimes='no' +export_dynamic_flag_spec='' +whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' +compiler_needs_object='no' +old_archive_from_new_cmds='' +old_archive_from_expsyms_cmds='' +archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring $single_module' +archive_expsym_cmds='sed '\''s,^,_,'\'' < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring $single_module ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' +module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs $compiler_flags' +module_expsym_cmds='sed -e '\''s,^,_,'\'' < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs $compiler_flags ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' +with_gnu_ld='no' +allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' +no_undefined_flag='' +hardcode_libdir_flag_spec='' +hardcode_libdir_flag_spec_ld='' +hardcode_libdir_separator='' +hardcode_direct='no' +hardcode_direct_absolute='no' +hardcode_minus_L='no' +hardcode_shlibpath_var='unsupported' +hardcode_automatic='yes' +inherit_rpath='no' +link_all_deplibs='yes' +always_export_symbols='no' +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' +include_expsyms='' +prelink_cmds='' +postlink_cmds='' +file_list_spec='' +variables_saved_for_relink='PATH DYLD_LIBRARY_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH' +need_lib_prefix='no' +need_version='no' +version_type='darwin' +runpath_var='' +shlibpath_var='DYLD_LIBRARY_PATH' +shlibpath_overrides_runpath='yes' +libname_spec='lib$name' +library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' +soname_spec='${libname}${release}${major}$shared_ext' +install_override_mode='' +postinstall_cmds='' +postuninstall_cmds='' +finish_cmds='' +finish_eval='' +hardcode_into_libs='no' +sys_lib_search_path_spec='/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0 /usr/local/lib' +sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' +hardcode_action='immediate' +enable_dlopen='unknown' +enable_dlopen_self='unknown' +enable_dlopen_self_static='unknown' +old_striplib='strip -S' +striplib='strip -x' + +LTCC=' xcrun clang' +LTCFLAGS='-arch i386 ' +compiler=' xcrun clang' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL ECHO SED GREP EGREP FGREP LD NM LN_S lt_SP2NL lt_NL2SP reload_flag OBJDUMP deplibs_check_method file_magic_cmd file_magic_glob want_nocaseglob DLLTOOL sharedlib_from_linklib_cmd AR AR_FLAGS archiver_list_spec STRIP RANLIB CC CFLAGS compiler lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl lt_cv_sys_global_symbol_to_c_name_address lt_cv_sys_global_symbol_to_c_name_address_lib_prefix nm_file_list_spec lt_prog_compiler_no_builtin_flag lt_prog_compiler_pic lt_prog_compiler_wl lt_prog_compiler_static lt_cv_prog_compiler_c_o need_locks MANIFEST_TOOL DSYMUTIL NMEDIT LIPO OTOOL OTOOL64 shrext_cmds export_dynamic_flag_spec whole_archive_flag_spec compiler_needs_object with_gnu_ld allow_undefined_flag no_undefined_flag hardcode_libdir_flag_spec hardcode_libdir_flag_spec_ld hardcode_libdir_separator exclude_expsyms include_expsyms file_list_spec variables_saved_for_relink libname_spec library_names_spec soname_spec install_override_mode finish_eval old_striplib striplib; do + case `eval \\$ECHO \\""\\$$var"\\"` in + *[\\\`\"\$]*) + eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED \"\$sed_quote_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\$$var\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds old_postinstall_cmds old_postuninstall_cmds old_archive_cmds extract_expsyms_cmds old_archive_from_new_cmds old_archive_from_expsyms_cmds archive_cmds archive_expsym_cmds module_cmds module_expsym_cmds export_symbols_cmds prelink_cmds postlink_cmds postinstall_cmds postuninstall_cmds finish_cmds sys_lib_search_path_spec sys_lib_dlsearch_path_spec; do + case `eval \\$ECHO \\""\\$$var"\\"` in + *[\\\`\"\$]*) + eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\$$var\\\"" + ;; + esac +done + +ac_aux_dir='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi' +xsi_shell='yes' +lt_shell_append='yes' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='libffi' + VERSION='3.0.10' + TIMESTAMP='' + RM='rm -f' + ofile='libtool' + + + +TARGETDIR="x86" + + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "fficonfig.h") CONFIG_HEADERS="$CONFIG_HEADERS fficonfig.h" ;; + "buildir") CONFIG_COMMANDS="$CONFIG_COMMANDS buildir" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "include") CONFIG_COMMANDS="$CONFIG_COMMANDS include" ;; + "src") CONFIG_COMMANDS="$CONFIG_COMMANDS src" ;; + "include/ffitarget.h") CONFIG_LINKS="$CONFIG_LINKS include/ffitarget.h:src/$TARGETDIR/ffitarget.h" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "include/ffi.h") CONFIG_FILES="$CONFIG_FILES include/ffi.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;; + "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; + "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +cat >>"$ac_tmp/subs1.awk" <<\_ACAWK && +S["am__EXEEXT_FALSE"]="" +S["am__EXEEXT_TRUE"]="#" +S["LTLIBOBJS"]="" +S["LIBOBJS"]="" +S["toolexeclibdir"]="$(libdir)/" +S["toolexecdir"]="$(libdir)/gcc-lib/$(target_alias)" +S["FFI_DEBUG_FALSE"]="" +S["FFI_DEBUG_TRUE"]="#" +S["TARGETDIR"]="x86" +S["TARGET"]="X86_DARWIN" +S["FFI_EXEC_TRAMPOLINE_TABLE"]="0" +S["FFI_EXEC_TRAMPOLINE_TABLE_FALSE"]="" +S["FFI_EXEC_TRAMPOLINE_TABLE_TRUE"]="#" +S["sys_symbol_underscore"]="" +S["HAVE_LONG_DOUBLE"]="1" +S["ALLOCA"]="" +S["PA64_HPUX_FALSE"]="" +S["PA64_HPUX_TRUE"]="#" +S["PA_HPUX_FALSE"]="" +S["PA_HPUX_TRUE"]="#" +S["PA_LINUX_FALSE"]="" +S["PA_LINUX_TRUE"]="#" +S["SH64_FALSE"]="" +S["SH64_TRUE"]="#" +S["SH_FALSE"]="" +S["SH_TRUE"]="#" +S["X86_64_FALSE"]="" +S["X86_64_TRUE"]="#" +S["S390_FALSE"]="" +S["S390_TRUE"]="#" +S["FRV_FALSE"]="" +S["FRV_TRUE"]="#" +S["LIBFFI_CRIS_FALSE"]="" +S["LIBFFI_CRIS_TRUE"]="#" +S["AVR32_FALSE"]="" +S["AVR32_TRUE"]="#" +S["ARM_FALSE"]="" +S["ARM_TRUE"]="#" +S["POWERPC_FREEBSD_FALSE"]="" +S["POWERPC_FREEBSD_TRUE"]="#" +S["POWERPC_DARWIN_FALSE"]="" +S["POWERPC_DARWIN_TRUE"]="#" +S["POWERPC_AIX_FALSE"]="" +S["POWERPC_AIX_TRUE"]="#" +S["POWERPC_FALSE"]="" +S["POWERPC_TRUE"]="#" +S["MOXIE_FALSE"]="" +S["MOXIE_TRUE"]="#" +S["M68K_FALSE"]="" +S["M68K_TRUE"]="#" +S["M32R_FALSE"]="" +S["M32R_TRUE"]="#" +S["IA64_FALSE"]="" +S["IA64_TRUE"]="#" +S["ALPHA_FALSE"]="" +S["ALPHA_TRUE"]="#" +S["X86_DARWIN_FALSE"]="#" +S["X86_DARWIN_TRUE"]="" +S["X86_WIN64_FALSE"]="" +S["X86_WIN64_TRUE"]="#" +S["X86_WIN32_FALSE"]="" +S["X86_WIN32_TRUE"]="#" +S["X86_FREEBSD_FALSE"]="" +S["X86_FREEBSD_TRUE"]="#" +S["X86_FALSE"]="" +S["X86_TRUE"]="#" +S["SPARC_FALSE"]="" +S["SPARC_TRUE"]="#" +S["MIPS_FALSE"]="" +S["MIPS_TRUE"]="#" +S["AM_LTLDFLAGS"]="" +S["AM_RUNTESTFLAGS"]="" +S["TESTSUBDIR_FALSE"]="#" +S["TESTSUBDIR_TRUE"]="" +S["MAINT"]="#" +S["MAINTAINER_MODE_FALSE"]="" +S["MAINTAINER_MODE_TRUE"]="#" +S["PRTDIAG"]="" +S["CPP"]=" xcrun clang -E" +S["OTOOL64"]=":" +S["OTOOL"]="otool" +S["LIPO"]="lipo" +S["NMEDIT"]="nmedit" +S["DSYMUTIL"]="dsymutil" +S["MANIFEST_TOOL"]=":" +S["RANLIB"]="ranlib" +S["ac_ct_AR"]="ar" +S["AR"]="ar" +S["DLLTOOL"]="false" +S["OBJDUMP"]="objdump" +S["LN_S"]="ln -s" +S["NM"]="nm" +S["ac_ct_DUMPBIN"]="link -dump" +S["DUMPBIN"]=":" +S["LD"]="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" +S["FGREP"]="/usr/bin/grep -F" +S["EGREP"]="/usr/bin/grep -E" +S["GREP"]="/usr/bin/grep" +S["SED"]="/usr/bin/sed" +S["LIBTOOL"]="$(SHELL) $(top_builddir)/libtool" +S["am__fastdepCCAS_FALSE"]="" +S["am__fastdepCCAS_TRUE"]="#" +S["CCASDEPMODE"]="depmode=none" +S["CCASFLAGS"]="-arch i386 " +S["CCAS"]=" xcrun clang" +S["am__fastdepCC_FALSE"]="" +S["am__fastdepCC_TRUE"]="#" +S["CCDEPMODE"]="depmode=none" +S["AMDEPBACKSLASH"]="" +S["AMDEP_FALSE"]="" +S["AMDEP_TRUE"]="#" +S["am__quote"]="" +S["am__include"]="include" +S["DEPDIR"]=".deps" +S["OBJEXT"]="o" +S["EXEEXT"]="" +S["ac_ct_CC"]="" +S["CPPFLAGS"]="" +S["LDFLAGS"]="-arch i386" +S["CFLAGS"]="-arch i386 -Wall -fexceptions" +S["CC"]=" xcrun clang" +S["am__untar"]="${AMTAR} xf -" +S["am__tar"]="${AMTAR} chof - \"$$tardir\"" +S["AMTAR"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run tar" +S["am__leading_dot"]="." +S["SET_MAKE"]="" +S["AWK"]="awk" +S["mkdir_p"]="/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d" +S["MKDIR_P"]="/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d" +S["INSTALL_STRIP_PROGRAM"]="$(install_sh) -c -s" +S["STRIP"]="strip" +S["install_sh"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh" +S["MAKEINFO"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo" +S["AUTOHEADER"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoheader" +S["AUTOMAKE"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run automake-1.11" +S["AUTOCONF"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoconf" +S["ACLOCAL"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run aclocal-1.11" +S["VERSION"]="3.0.10" +S["PACKAGE"]="libffi" +S["CYGPATH_W"]="echo" +S["am__isrc"]=" -I$(srcdir)" +S["INSTALL_DATA"]="${INSTALL} -m 644" +S["INSTALL_SCRIPT"]="${INSTALL}" +S["INSTALL_PROGRAM"]="${INSTALL}" +S["ax_enable_builddir_sed"]="sed" +S["target_os"]="darwin" +S["target_vendor"]="apple" +S["target_cpu"]="i386" +S["target"]="i386-apple-darwin" +S["host_os"]="darwin" +S["host_vendor"]="apple" +S["host_cpu"]="i386" +S["host"]="i386-apple-darwin" +S["build_os"]="darwin17.3.0" +S["build_vendor"]="apple" +S["build_cpu"]="x86_64" +S["build"]="x86_64-apple-darwin17.3.0" +S["target_alias"]="i386-apple-darwin" +S["host_alias"]="i386-apple-darwin" +S["build_alias"]="" +S["LIBS"]="" +S["ECHO_T"]="" +S["ECHO_N"]="" +S["ECHO_C"]="\\c" +S["DEFS"]="-DHAVE_CONFIG_H" +S["mandir"]="${datarootdir}/man" +S["localedir"]="${datarootdir}/locale" +S["libdir"]="${exec_prefix}/lib" +S["psdir"]="${docdir}" +S["pdfdir"]="${docdir}" +S["dvidir"]="${docdir}" +S["htmldir"]="${docdir}" +S["infodir"]="${datarootdir}/info" +S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}" +S["oldincludedir"]="/usr/include" +S["includedir"]="${prefix}/include" +S["localstatedir"]="${prefix}/var" +S["sharedstatedir"]="${prefix}/com" +S["sysconfdir"]="${prefix}/etc" +S["datadir"]="${datarootdir}" +S["datarootdir"]="${prefix}/share" +S["libexecdir"]="${exec_prefix}/libexec" +S["sbindir"]="${exec_prefix}/sbin" +S["bindir"]="${exec_prefix}/bin" +S["program_transform_name"]="s,x,x," +S["prefix"]="/usr/local" +S["exec_prefix"]="${prefix}" +S["PACKAGE_URL"]="" +S["PACKAGE_BUGREPORT"]="http://sourceware.org/libffi.html" +S["PACKAGE_STRING"]="libffi 3.0.10" +S["PACKAGE_VERSION"]="3.0.10" +S["PACKAGE_TARNAME"]="libffi" +S["PACKAGE_NAME"]="libffi" +S["PATH_SEPARATOR"]=":" +S["SHELL"]="/bin/sh" +_ACAWK +cat >>"$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +D["PACKAGE_NAME"]=" \"libffi\"" +D["PACKAGE_TARNAME"]=" \"libffi\"" +D["PACKAGE_VERSION"]=" \"3.0.10\"" +D["PACKAGE_STRING"]=" \"libffi 3.0.10\"" +D["PACKAGE_BUGREPORT"]=" \"http://sourceware.org/libffi.html\"" +D["PACKAGE_URL"]=" \"\"" +D["PACKAGE"]=" \"libffi\"" +D["VERSION"]=" \"3.0.10\"" +D["STDC_HEADERS"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_DLFCN_H"]=" 1" +D["LT_OBJDIR"]=" \".libs/\"" +D["HAVE_SYS_MMAN_H"]=" 1" +D["HAVE_MMAP"]=" 1" +D["HAVE_MMAP_FILE"]=" 1" +D["HAVE_MMAP_ANON"]=" 1" +D["STDC_HEADERS"]=" 1" +D["HAVE_MEMCPY"]=" 1" +D["HAVE_ALLOCA_H"]=" 1" +D["HAVE_ALLOCA"]=" 1" +D["SIZEOF_DOUBLE"]=" 8" +D["SIZEOF_LONG_DOUBLE"]=" 16" +D["HAVE_LONG_DOUBLE"]=" 1" +D["HAVE_AS_CFI_PSEUDO_OP"]=" 1" +D["EH_FRAME_FLAGS"]=" \"aw\"" + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\t (]|$)/ { + line = $ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + ac_datarootdir_hack=' + s&@datadir@&${datarootdir}&g + s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g + s&@infodir@&${datarootdir}/info&g + s&@localedir@&${datarootdir}/locale&g + s&@mandir@&${datarootdir}/man&g + s&\${datarootdir}&${prefix}/share&g' ;; +esac +ac_sed_extra=" + +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + :L) + # + # CONFIG_LINK + # + + if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then + : + else + # Prefer the file from the source tree if names are identical. + if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then + ac_source=$srcdir/$ac_source + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 +$as_echo "$as_me: linking $ac_source to $ac_file" >&6;} + + if test ! -r "$ac_source"; then + as_fn_error $? "$ac_source: file not found" "$LINENO" 5 + fi + rm -f "$ac_file" + + # Try a relative symlink, then a hard link, then a copy. + case $ac_source in + [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; + *) ac_rel_source=$ac_top_build_prefix$ac_source ;; + esac + ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || + ln "$ac_source" "$ac_file" 2>/dev/null || + cp -p "$ac_source" "$ac_file" || + as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 + fi + ;; + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "buildir":C) ac_top_srcdir="$ax_enable_builddir_srcdir" + if test ".$ax_enable_builddir" = ".." ; then + if test -f "$top_srcdir/Makefile" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - left untouched" >&5 +$as_echo "$as_me: skipping top_srcdir/Makefile - left untouched" >&6;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - not created" >&5 +$as_echo "$as_me: skipping top_srcdir/Makefile - not created" >&6;} + fi + else + if test -f "$ac_top_srcdir/Makefile" ; then + a=`grep "^VERSION " "$ac_top_srcdir/Makefile"` ; b=`grep "^VERSION " Makefile` + test "$a" != "$b" && rm "$ac_top_srcdir/Makefile" + fi + if test -f "$ac_top_srcdir/Makefile" ; then + echo "$ac_top_srcdir/Makefile : $ac_top_srcdir/Makefile.in" > $tmp/conftemp.mk + echo " @ echo 'REMOVED,,,' >\$@" >> $tmp/conftemp.mk + eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" + if grep '^REMOVED,,,' "$ac_top_srcdir/Makefile" >/dev/null + then rm $ac_top_srcdir/Makefile ; fi + cp $tmp/conftemp.mk $ac_top_srcdir/makefiles.mk~ ## DEBUGGING + fi + if test ! -f "$ac_top_srcdir/Makefile" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: create top_srcdir/Makefile guessed from local Makefile" >&5 +$as_echo "$as_me: create top_srcdir/Makefile guessed from local Makefile" >&6;} + x='`' ; cat >$tmp/conftemp.sed <<_EOF +/^\$/n +x +/^\$/bS +x +/\\\\\$/{H;d;} +{H;s/.*//;x;} +bM +:S +x +/\\\\\$/{h;d;} +{h;s/.*//;x;} +:M +s/\\(\\n\\) /\\1 /g +/^ /d +/^[ ]*[\\#]/d +/^VPATH *=/d +s/^srcdir *=.*/srcdir = ./ +s/^top_srcdir *=.*/top_srcdir = ./ +/[:=]/!d +/^\\./d +/ = /b +/ .= /b +/:/!b +s/:.*/:/ +s/ / /g +s/ \\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/ \\1 \\1-all\\2/g +s/^\\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/\\1 \\1-all\\2/ +s/ / /g +/^all all-all[ :]/i\\ +all-configured : all-all +s/ [a-zA-Z0-9-]*-all [a-zA-Z0-9-]*-all-all//g +/-all-all/d +a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done +/dist-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ + ; if test "\$\$found" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +/dist-[a-zA-Z0-9]*-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ + ; if test "\$\$found" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +/distclean-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ + ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ + ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile +_EOF + cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefile.sed~" ## DEBUGGING + $ax_enable_builddir_sed -f $tmp/conftemp.sed Makefile >$ac_top_srcdir/Makefile + if test -f "$ac_top_srcdir/Makefile.mk" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&5 +$as_echo "$as_me: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&6;} + cat $ac_top_srcdir/Makefile.mk >>$ac_top_srcdir/Makefile + fi ; xxxx="####" + echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$ac_top_srcdir/Makefile + # sanity check + if grep '^; echo "MAKE ' $ac_top_srcdir/Makefile >/dev/null ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: buggy sed found - it deletes tab in \"a\" text parts" >&5 +$as_echo "$as_me: buggy sed found - it deletes tab in \"a\" text parts" >&6;} + $ax_enable_builddir_sed -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $ac_top_srcdir/Makefile \ + >$ac_top_srcdir/Makefile~ + (test -s $ac_top_srcdir/Makefile~ && mv $ac_top_srcdir/Makefile~ $ac_top_srcdir/Makefile) 2>/dev/null + fi + else + xxxx="\\#\\#\\#\\#" + # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed + echo "s!^$xxxx [^|]* | *$ax_enable_builddir *\$!$xxxx ...... $ax_enable_builddir!" >$tmp/conftemp.sed + $ax_enable_builddir_sed -f "$tmp/conftemp.sed" "$ac_top_srcdir/Makefile" >$tmp/mkfile.tmp + cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefiles.sed~" ## DEBUGGING + cp "$tmp/mkfile.tmp" "$ac_top_srcdir/makefiles.out~" ## DEBUGGING + if cmp -s "$ac_top_srcdir/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: keeping top_srcdir/Makefile from earlier configure" >&5 +$as_echo "$as_me: keeping top_srcdir/Makefile from earlier configure" >&6;} + rm "$tmp/mkfile.tmp" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: reusing top_srcdir/Makefile from earlier configure" >&5 +$as_echo "$as_me: reusing top_srcdir/Makefile from earlier configure" >&6;} + mv "$tmp/mkfile.tmp" "$ac_top_srcdir/Makefile" + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&5 +$as_echo "$as_me: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&6;} + xxxx="####" + echo "$xxxx" "$ax_enable_builddir_host" "|$ax_enable_builddir" >>$ac_top_srcdir/Makefile + fi + ;; + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="" + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + "include":C) test -d include || mkdir include ;; + "src":C) +test -d src || mkdir src +test -d src/$TARGETDIR || mkdir src/$TARGETDIR + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/fficonfig.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/fficonfig.h new file mode 100644 index 0000000..6f218ec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/fficonfig.h @@ -0,0 +1,200 @@ +/* fficonfig.h. Generated from fficonfig.h.in by configure. */ +/* fficonfig.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "aw" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ +/* #undef FFI_EXEC_TRAMPOLINE_TABLE */ + +/* Cannot use malloc on this target, so, we revert to alternative means */ +/* #undef FFI_MMAP_EXEC_WRIT */ + +/* Define this is you do not want support for the raw API. */ +/* #undef FFI_NO_RAW_API */ + +/* Define this is you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .ascii. */ +/* #undef HAVE_AS_ASCII_PSEUDO_OP */ + +/* Define if your assembler supports .cfi_* directives. */ +#define HAVE_AS_CFI_PSEUDO_OP 1 + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if your assembler and linker support unaligned PC relative relocs. + */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define if your assembler supports .string. */ +/* #undef HAVE_AS_STRING_PSEUDO_OP */ + +/* Define if your assembler supports unwind section type. */ +/* #undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE */ + +/* Define if your assembler supports PC relative relocs. */ +/* #undef HAVE_AS_X86_PCREL */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if __attribute__((visibility("hidden"))) is supported. */ +/* #undef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if you have the long double type and it is bigger than a double */ +#define HAVE_LONG_DOUBLE 1 + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if .eh_frame sections should be read-only. */ +/* #undef HAVE_RO_EH_FRAME */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 3.0.10" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.0.10" + +/* The size of `double', as computed by sizeof. */ +#define SIZEOF_DOUBLE 8 + +/* The size of `long double', as computed by sizeof. */ +#define SIZEOF_LONG_DOUBLE 16 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define this if you are using Purify and want to suppress spurious messages. + */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "3.0.10" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) .hidden name +#else +#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +#endif +#else +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) +#else +#define FFI_HIDDEN +#endif +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/Makefile new file mode 100644 index 0000000..e6c8b40 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/Makefile @@ -0,0 +1,487 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# include/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +VPATH = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-apple-darwin17.3.0 +host_triplet = i386-apple-darwin +target_triplet = i386-apple-darwin +subdir = include +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/ffi.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = ffi.h ffitarget.h +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(includesdir)" +HEADERS = $(nodist_includes_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run aclocal-1.11 +ALLOCA = +AMTAR = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run tar +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoconf +AUTOHEADER = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoheader +AUTOMAKE = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run automake-1.11 +AWK = awk +CC = xcrun clang +CCAS = xcrun clang +CCASDEPMODE = depmode=none +CCASFLAGS = -arch i386 +CCDEPMODE = depmode=none +CFLAGS = -arch i386 -Wall -fexceptions +CPP = xcrun clang -E +CPPFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = dsymutil +DUMPBIN = : +ECHO_C = \c +ECHO_N = +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +LDFLAGS = -arch i386 +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = lipo +LN_S = ln -s +LTLIBOBJS = +MAINT = # +MAKEINFO = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo +MANIFEST_TOOL = : +MKDIR_P = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +NM = nm +NMEDIT = nmedit +OBJDUMP = objdump +OBJEXT = o +OTOOL = otool +OTOOL64 = : +PACKAGE = libffi +PACKAGE_BUGREPORT = http://sourceware.org/libffi.html +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.0.10 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.0.10 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_DARWIN +TARGETDIR = x86 +VERSION = 3.0.10 +abs_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include +abs_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include +abs_top_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386 +abs_top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = +ac_ct_DUMPBIN = link -dump +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-apple-darwin17.3.0 +build_alias = +build_cpu = x86_64 +build_os = darwin17.3.0 +build_vendor = apple +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = i386-apple-darwin +host_alias = i386-apple-darwin +host_cpu = i386 +host_os = darwin +host_vendor = apple +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include +sys_symbol_underscore = +sysconfdir = ${prefix}/etc +target = i386-apple-darwin +target_alias = i386-apple-darwin +target_cpu = i386 +target_os = darwin +target_vendor = apple +toolexecdir = $(libdir)/gcc-lib/$(target_alias) +toolexeclibdir = $(libdir)/ +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +AUTOMAKE_OPTIONS = foreign +DISTCLEANFILES = ffitarget.h +EXTRA_DIST = ffi.h.in ffi_common.h +includesdir = $(libdir)/libffi-3.0.10/include +nodist_includes_HEADERS = ffi.h ffitarget.h +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: # $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +ffi.h: $(top_builddir)/config.status $(srcdir)/ffi.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-nodist_includesHEADERS: $(nodist_includes_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)" + @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \ + done + +uninstall-nodist_includesHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(includesdir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(includesdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-nodist_includesHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-nodist_includesHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool ctags distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-nodist_includesHEADERS \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-nodist_includesHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/ffi.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/ffi.h new file mode 100644 index 0000000..687c24b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/ffi.h @@ -0,0 +1,427 @@ +/* -----------------------------------------------------------------*-C-*- + libffi 3.0.10 - Copyright (c) 2011 Anthony Green + - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the ``Software''), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and cloure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifndef X86_DARWIN +#define X86_DARWIN +#endif + +/* ---- System configuration information --------------------------------- */ + +#include + +#ifndef LIBFFI_ASM + +#ifdef _MSC_VER +#define __attribute__(X) +#endif + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ + +#define FFI_64_BIT_MAX 9223372036854775807 + +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif /* _AIX52 or newer */ +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ +# ifndef __PPC64__ +# if defined (__IBMC__) || defined (__IBMCPP__) +# define FFI_LONG_LONG_MAX LONGLONG_MAX +# endif +# endif /* __PPC64__ */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif +# endif +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t */ +/* can hold a pointer. */ + +typedef struct _ffi_type +{ + size_t size; + unsigned short alignment; + unsigned short type; + struct _ffi_type **elements; +} ffi_type; + +#ifndef LIBFFI_HIDE_BASIC_TYPES +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else + #error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else + #error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else + #error "int size not supported" +#endif + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX + #error "no 64-bit data type supported" +# endif +#elif LONG_MAX != FFI_64_BIT_MAX + #error "long size not supported" +#endif + +#if LONG_MAX == 2147483647 +# define ffi_type_ulong ffi_type_uint32 +# define ffi_type_slong ffi_type_sint32 +#elif LONG_MAX == FFI_64_BIT_MAX +# define ffi_type_ulong ffi_type_uint64 +# define ffi_type_slong ffi_type_sint64 +#else + #error "long size not supported" +#endif + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_pointer; + +#if 1 +extern ffi_type ffi_type_longdouble; +#else +#define ffi_type_longdouble ffi_type_double +#endif +#endif /* LIBFFI_HIDE_BASIC_TYPES */ + +typedef enum { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct { + ffi_abi abi; + unsigned nargs; + ffi_type **arg_types; + ffi_type *rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == FFI_64_BIT_MAX +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +#ifndef FFI_SIZEOF_JAVA_RAW +# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 +/* This is a special case for mips64/n32 ABI (and perhaps others) where + sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ +typedef union { + signed int sint; + unsigned int uint; + float flt; + char data[FFI_SIZEOF_JAVA_RAW]; + void* ptr; +} ffi_java_raw; +#else +typedef ffi_raw ffi_java_raw; +#endif + + +void ffi_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_raw *avalue); + +void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +size_t ffi_raw_size (ffi_cif *cif); + +/* This is analogous to the raw API, except it uses Java parameter */ +/* packing, even on 64-bit machines. I.e. on 64-bit machines */ +/* longs and doubles are followed by an empty 64-bit word. */ + +void ffi_java_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_java_raw *avalue); + +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); +size_t ffi_java_raw_size (ffi_cif *cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +#ifdef _MSC_VER +__declspec(align(8)) +#endif +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void *user_data; +#ifdef __GNUC__ +} ffi_closure __attribute__((aligned (8))); +#else +} ffi_closure; +# ifdef __sgi +# pragma pack 0 +# endif +#endif + +void *ffi_closure_alloc (size_t size, void **code); +void ffi_closure_free (void *); + +ffi_status +ffi_prep_closure (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data); + +ffi_status +ffi_prep_closure_loc (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void*codeloc); + +#ifdef __sgi +# pragma pack 8 +#endif +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void *user_data; + +} ffi_raw_closure; + +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); + void *user_data; + +} ffi_java_raw_closure; + +ffi_status +ffi_prep_raw_closure (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data); + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc); + +ffi_status +ffi_prep_java_raw_closure (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data); + +ffi_status +ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, + void *codeloc); + +#endif /* FFI_CLOSURES */ + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status ffi_prep_cif(ffi_cif *cif, + ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, + ffi_type **atypes); + +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +/* ---- Definitions shared with assembly code ---------------------------- */ + +#endif + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 +#if 1 +#define FFI_TYPE_LONGDOUBLE 4 +#else +#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/ffitarget.h new file mode 120000 index 0000000..74944a5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/include/ffitarget.h @@ -0,0 +1 @@ +/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffitarget.h \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi.la new file mode 100644 index 0000000..d0ee7cf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi.la @@ -0,0 +1,41 @@ +# libffi.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libffi.5.dylib' + +# Names of this library. +library_names='libffi.5.dylib libffi.dylib' + +# The name of the static archive. +old_library='' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags=' ' + +# Libraries that this one depends upon. +dependency_libs='' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libffi. +current=5 +age=0 +revision=10 + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib' diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi.pc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi.pc new file mode 100644 index 0000000..cff9466 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi.pc @@ -0,0 +1,10 @@ +prefix=/usr/local +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${libdir}/libffi-3.0.10/include + +Name: libffi +Description: Library supporting Foreign Function Interfaces +Version: 3.0.10 +Libs: -L${libdir} -lffi +Cflags: -I${includedir} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi_convenience.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi_convenience.la new file mode 100644 index 0000000..a8500cf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libffi_convenience.la @@ -0,0 +1,41 @@ +# libffi_convenience.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libffi_convenience.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags=' ' + +# Libraries that this one depends upon. +dependency_libs='' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libffi_convenience. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libtool b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libtool new file mode 100755 index 0000000..a588e44 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/libtool @@ -0,0 +1,10056 @@ +#! /bin/sh + +# libtool - Provide generalized library-building support services. +# Generated automatically by config.status (libffi) 3.0.10 +# Libtool was configured on host test2.allow2.com: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="" + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=2.4 +macro_revision=1.3293 + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=no + +# What type of objects to build. +pic_mode=yes + +# Whether or not to optimize for fast installation. +fast_install=needless + +# Shell to use when invoking shell scripts. +SHELL="/bin/sh" + +# An echo program that protects backslashes. +ECHO="printf %s\\n" + +# The host system. +host_alias=i386-apple-darwin +host=i386-apple-darwin +host_os=darwin + +# The build system. +build_alias= +build=x86_64-apple-darwin17.3.0 +build_os=darwin17.3.0 + +# A sed program that does not truncate output. +SED="/usr/bin/sed" + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP="/usr/bin/grep" + +# An ERE matcher. +EGREP="/usr/bin/grep -E" + +# A literal string matcher. +FGREP="/usr/bin/grep -F" + +# A BSD- or MS-compatible name lister. +NM="nm" + +# Whether we need soft or hard links. +LN_S="ln -s" + +# What is the maximum length of a command? +max_cmd_len=196608 + +# Object file suffix (normally "o"). +objext=o + +# Executable file suffix (normally ""). +exeext= + +# whether the shell understands "unset". +lt_unset=unset + +# turn spaces into newlines. +SP2NL="tr \\040 \\012" + +# turn newlines into spaces. +NL2SP="tr \\015\\012 \\040\\040" + +# convert $build file names to $host format. +to_host_file_cmd=func_convert_file_noop + +# convert $build files to toolchain format. +to_tool_file_cmd=func_convert_file_noop + +# An object symbol dumper. +OBJDUMP="objdump" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd="\$MAGIC_CMD" + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob="" + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob="no" + +# DLL creation program. +DLLTOOL="false" + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd="printf %s\\n" + +# The archiver. +AR="ar" + +# Flags to create an archive. +AR_FLAGS="cru" + +# How to feed a file listing to the archiver. +archiver_list_spec="" + +# A symbol stripping program. +STRIP="strip" + +# Commands used to install an old-style archive. +RANLIB="ranlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib" +old_postuninstall_cmds="" + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=yes + +# A C compiler. +LTCC=" xcrun clang" + +# LTCC compiler flags. +LTCFLAGS="-arch i386 -Wall -fexceptions" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([BCDEGRST][BCDEGRST]*\\)[ ][ ]*_\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 _\\2 \\2/p' | sed '/ __gnu_lto/d'" + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl="sed -n -e 's/^T .* \\(.*\\)\$/extern int \\1();/p' -e 's/^[BCDEGRST]* .* \\(.*\\)\$/extern char \\1;/p'" + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\)[ ]*\$/ {\\\"\\1\\\", (void *) 0},/p' -e 's/^[BCDEGRST]* \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (void *) \\&\\2},/p'" + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \\([^ ]*\\)[ ]*\$/ {\\\"\\1\\\", (void *) 0},/p' -e 's/^[BCDEGRST]* \\([^ ]*\\) \\(lib[^ ]*\\)\$/ {\"\\2\", (void *) \\&\\2},/p' -e 's/^[BCDEGRST]* \\([^ ]*\\) \\([^ ]*\\)\$/ {\"lib\\2\", (void *) \\&\\2},/p'" + +# Specify filename containing input files for $NM. +nm_file_list_spec="" + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot= + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=file + +# Must we lock files when doing compilation? +need_locks="no" + +# Manifest tool. +MANIFEST_TOOL=":" + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL="dsymutil" + +# Tool to change global to local symbols on Mac OS X. +NMEDIT="nmedit" + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO="lipo" + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL="otool" + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=":" + +# Old archive suffix (normally "a"). +libext=a + +# Shared library suffix (normally ".so"). +shrext_cmds="\`test .\$module = .yes && echo .so || echo .dylib\`" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink="PATH DYLD_LIBRARY_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Do we need the "lib" prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Library versioning type. +version_type=darwin + +# Shared library runtime path variable. +runpath_var= + +# Shared library path variable. +shlibpath_var=DYLD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=yes + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec="\${libname}\${release}\${major}\$shared_ext \${libname}\$shared_ext" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${major}\$shared_ext" + +# Permission mode override for installation of shared libraries. +install_override_mode="" + +# Command to use after installation of a shared archive. +postinstall_cmds="" + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="" + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval="" + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=no + +# Compile-time system search path for libraries. +sys_lib_search_path_spec="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0 /usr/local/lib" + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec="/usr/local/lib /lib /usr/lib" + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Commands to strip libraries. +old_striplib="strip -S" +striplib="strip -x" + + +# The linker used to build libraries. +LD="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LTCC \$LTCFLAGS -nostdlib \${wl}-r -o \$output\$reload_objs" + +# Commands used to build an old-style archive. +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib" + +# A language specific compiler. +CC=" xcrun clang" + +# Is the compiler the GNU compiler? +with_gcc=yes + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin -fno-rtti -fno-exceptions" + +# Additional compiler flags for building library objects. +pic_flag=" -fno-common -DPIC" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Compiler flag to prevent dynamic linking. +link_static_flag="" + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=no + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\`for conv in \$convenience\\\"\\\"; do test -n \\\"\$conv\\\" && new_convenience=\\\"\$new_convenience \${wl}-force_load,\$conv\\\"; done; func_echo_all \\\"\$new_convenience\\\"\`" + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object="no" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build a shared archive. +archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring \$single_module" +archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring \$single_module \${wl}-exported_symbols_list,\$output_objdir/\${libname}-symbols.expsym" + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags" +module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags \${wl}-exported_symbols_list,\$output_objdir/\${libname}-symbols.expsym" + +# Whether we are building with GNU ld or not. +with_gnu_ld="no" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="\${wl}-flat_namespace \${wl}-undefined \${wl}suppress" + +# Flag that enforces no undefined symbols. +no_undefined_flag="" + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist +hardcode_libdir_flag_spec="" + +# If ld is used when linking, flag to hardcode $libdir into a binary +# during linking. This must work even if $libdir does not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator="" + +# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=no + +# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting ${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=no + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=no + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=yes + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=no + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=yes + +# Set to "yes" if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds="" + +# Commands necessary for finishing linking programs. +postlink_cmds="" + +# Specify filename containing input files. +file_list_spec="" + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# ### END LIBTOOL CONFIG + + +# libtool (GNU libtool) 2.4 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool 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 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4 +TIMESTAMP="" +package_revision=1.3293 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${EGREP="/bin/grep -E"} +: ${FGREP="/bin/grep -F"} +: ${GREP="/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/bin/sed"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} # Extended-shell func_dirname implementation + + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} # Extended-shell func_basename implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} # Extended-shell func_dirname_and_basename implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} # Extended-shell func_stripname implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=: + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} +} # Extended-shell func_split_short_opt implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=} +} # Extended-shell func_split_long_opt implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ +eval "${1}+=\${2}" +} # Extended-shell func_append implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}+=\\ \$func_quote_for_eval_result" +} # Extended-shell func_append_quoted implementation + + +# func_arith arithmetic-term... +func_arith () +{ +func_arith_result=$(( $* )) +} # Extended-shell func_arith implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ +func_len_result=${#1} +} # Extended-shell func_len implementation + + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} # Extended-shell func_lo2o implementation + + +# func_xform libobj-or-source +func_xform () +{ +func_xform_result=${1%.*}.lo +} # Extended-shell func_xform implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +preserve_args+=" $opt" + ;; + --no-verbose) + opt_verbose=false +preserve_args+=" $opt" + ;; + --silent|--quiet) + opt_silent=: +preserve_args+=" $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +preserve_args+=" $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +preserve_args+=" $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || preserve_args+=" --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_to_host_path_result+="$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + pie_flag+=" $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + later+=" $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + base_compile+=" $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + removelist+=" $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist+=" $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + command+=" -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + command+=" -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command+="$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + dir+="/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + libdirs+=" $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + libs+=" $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || admincmds+=" + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + install_prog+="$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + files+=" $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog+=" $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + install_shared_prog+=" $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + install_shared_prog+=" -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs+=" $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs+=" $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs+=" $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir+="$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs+=" $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) symtab_cflags+=" $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \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" +#define SHELL_SPACE_CHARS " \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" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' + + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + libtool_args+=" $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command+=" @OUTPUT@" + finalize_command+=" @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command+=" @SYMFILE@" + finalize_command+=" @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles+=" $arg" + else + dlprefiles+=" $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) deplibs+=" $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# moreargs+=" $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles+=" $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles+=" $pic_object" + prev= + fi + + # A PIC object. + libobjs+=" $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects+=" $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects+=" $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + libobjs+=" $pic_object" + non_pic_objects+=" $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath+=" $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath+=" $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs+=" $arg" + prev= + continue + ;; + xcclinker) + linker_flags+=" $qarg" + compiler_flags+=" $qarg" + prev= + compile_command+=" $qarg" + finalize_command+=" $qarg" + continue + ;; + xcompiler) + compiler_flags+=" $qarg" + prev= + compile_command+=" $qarg" + finalize_command+=" $qarg" + continue + ;; + xlinker) + linker_flags+=" $qarg" + compiler_flags+=" $wl$qarg" + prev= + compile_command+=" $wl$qarg" + finalize_command+=" $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + compile_command+=" $link_static_flag" + finalize_command+=" $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command+=" $arg" + finalize_command+=" $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) deplibs+=" $arg" ;; + *) deplibs+=" -L$dir" ;; + esac + lib_search_path+=" $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath+=":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath+=":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs+=" System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs+=" $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + compiler_flags+=" $arg" + compile_command+=" $arg" + finalize_command+=" $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags+=" $arg" + compile_command+=" $arg" + finalize_command+=" $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags+=" $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath+=" $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg+=" $func_quote_for_eval_result" + compiler_flags+=" $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg+=" $wl$func_quote_for_eval_result" + compiler_flags+=" $wl$func_quote_for_eval_result" + linker_flags+=" $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + compile_command+=" $arg" + finalize_command+=" $arg" + compiler_flags+=" $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs+=" $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles+=" $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles+=" $pic_object" + prev= + fi + + # A PIC object. + libobjs+=" $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects+=" $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects+=" $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + libobjs+=" $pic_object" + non_pic_objects+=" $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs+=" $arg" + old_deplibs+=" $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles+=" $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles+=" $func_resolve_sysroot_result" + prev= + else + deplibs+=" $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command+=" $arg" + finalize_command+=" $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command+=" $arg" + finalize_command+=" $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs+=" $deplib" ;; + esac + fi + libs+=" $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs+=" $pre_post_deps" ;; + esac + pre_post_deps+=" $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs+=" $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags+=" $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags+=" $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags+=" $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + newlib_search_path+=" $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + newlib_search_path+=" $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath+=" $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles+=" $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles+=" $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) new_inherited_linker_flags+=" $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles+=" $dlopen" + test -n "$dlpreopen" && dlprefiles+=" $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience+=" $ladir/$objdir/$old_library" + old_convenience+=" $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs+=" $deplib" ;; + esac + fi + tmp_libs+=" $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles+=" $lib $dependency_libs" + else + newdlfiles+=" $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path+=" $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path+=" $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + newdlprefiles+=" $dir/$linklib" + else + newdlprefiles+=" $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs+=" $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles+=" $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs+=" $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles+=" $dir/$dlname" + else + newdlprefiles+=" $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path+=" $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + newlib_search_path+=" $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs+=" $deplib" ;; + esac + fi + tmp_libs+=" $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) temp_rpath+="$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath+=" $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + notinst_deplibs+=" $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs+=" $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath+=" $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir+=" -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath+="$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath+="$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath+="$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir+=" -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath+=" $temp_xrpath";; + esac;; + *) temp_deplibs+=" $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path+=" $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + specialdeplibs+=" $func_resolve_sysroot_result" ;; + esac + fi + tmp_libs+=" $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + compiler_flags+=" ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags+=" -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path+=" $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs+=" $deplib" ;; + esac + ;; + *) tmp_libs+=" $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs+=" $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs+="$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + libobjs+=" $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring+=":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + libobjs+=" $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist+=" $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs+=" $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + temp_xrpath+=" -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles+=" $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles+=" $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs+=" System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs+=" -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs+=" $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs+=" $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs+=" $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs+=" $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs+=" $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs+=" -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs+=" $deplib" ;; + esac + ;; + *) new_libs+=" $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs+="$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath+=" $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_apped perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath+="$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames+=" $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + delfiles+=" $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + delfiles+=" $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles+=" $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs+=" $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $convenience + libobjs+=" $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags+=" $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + delfiles+=" $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + delfiles+=" $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + objlist+=" $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles+=" $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles+=" $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs+=" $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated+=" $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + compile_command+=" ${wl}-bind_at_load" + finalize_command+=" ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs+=" -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs+=" $deplib" ;; + esac + ;; + *) new_libs+=" $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command+=" $compile_deplibs" + finalize_command+=" $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs+="$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath+=" $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath+=" $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath+=":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath+=":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs+="$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath+=" $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath+=" $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath+="$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath+="$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + oldobjs+=" $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $addlibs + oldobjs+=" $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs+=" $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + oldobjs+=" $gentop/$newobj" + ;; + *) oldobjs+=" $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + objlist+=" $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs+=" ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + newdependency_libs+=" -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + newdependency_libs+=" -R$func_replace_sysroot_result" + ;; + *) newdependency_libs+=" $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlfiles+=" ${lt_sysroot:+=}$libdir/$name" + ;; + *) newdlfiles+=" $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlprefiles+=" ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles+=" $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles+=" $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) RM+=" $arg"; rmforce=yes ;; + -*) RM+=" $arg" ;; + *) files+=" $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) rmdirs+=" $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles+=" $odir/$n" + done + test -n "$old_library" && rmfiles+=" $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && rmfiles+=" $odir/$dlname" ;; + esac + test -n "$libdir" && rmfiles+=" $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + rmfiles+=" $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles+=" $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles+=" $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + rmfiles+=" $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles+=" $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles+=" $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles+=" $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/man/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/man/Makefile new file mode 100644 index 0000000..6cee43d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/man/Makefile @@ -0,0 +1,466 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# man/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +VPATH = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-apple-darwin17.3.0 +host_triplet = i386-apple-darwin +target_triplet = i386-apple-darwin +subdir = man +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man3dir = $(mandir)/man3 +am__installdirs = "$(DESTDIR)$(man3dir)" +NROFF = nroff +MANS = $(man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run aclocal-1.11 +ALLOCA = +AMTAR = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run tar +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoconf +AUTOHEADER = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoheader +AUTOMAKE = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run automake-1.11 +AWK = awk +CC = xcrun clang +CCAS = xcrun clang +CCASDEPMODE = depmode=none +CCASFLAGS = -arch i386 +CCDEPMODE = depmode=none +CFLAGS = -arch i386 -Wall -fexceptions +CPP = xcrun clang -E +CPPFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = dsymutil +DUMPBIN = : +ECHO_C = \c +ECHO_N = +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +LDFLAGS = -arch i386 +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = lipo +LN_S = ln -s +LTLIBOBJS = +MAINT = # +MAKEINFO = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo +MANIFEST_TOOL = : +MKDIR_P = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +NM = nm +NMEDIT = nmedit +OBJDUMP = objdump +OBJEXT = o +OTOOL = otool +OTOOL64 = : +PACKAGE = libffi +PACKAGE_BUGREPORT = http://sourceware.org/libffi.html +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.0.10 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.0.10 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_DARWIN +TARGETDIR = x86 +VERSION = 3.0.10 +abs_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/man +abs_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man +abs_top_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386 +abs_top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = +ac_ct_DUMPBIN = link -dump +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-apple-darwin17.3.0 +build_alias = +build_cpu = x86_64 +build_os = darwin17.3.0 +build_vendor = apple +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = i386-apple-darwin +host_alias = i386-apple-darwin +host_cpu = i386 +host_os = darwin +host_vendor = apple +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man +sys_symbol_underscore = +sysconfdir = ${prefix}/etc +target = i386-apple-darwin +target_alias = i386-apple-darwin +target_cpu = i386 +target_os = darwin +target_vendor = apple +toolexecdir = $(libdir)/gcc-lib/$(target_alias) +toolexeclibdir = $(libdir)/ +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +AUTOMAKE_OPTIONS = foreign +EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 +man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign man/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: # $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man3: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" + @list=''; test -n "$(man3dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ + done; } + +uninstall-man3: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man3dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man3dir)" && rm -f $$files; } +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man3dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man3 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-man + +uninstall-man: uninstall-man3 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man3 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-man uninstall-man3 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.deps/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/closures.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/closures.o new file mode 100644 index 0000000000000000000000000000000000000000..925f555caf2daa72321476f57375fd3a8b0c4099 GIT binary patch literal 2668 zcmcgu-D@0G6u+~(vzcZ$n=~mk8qrl^TfxlTCVnKE*2H8bkw$8p*dVmS?Ck7j%4BAl znN8D@iZ&Ho79YeS*azQy>mMMfPYnoy9}j|k?1O@WzDOR54X(d)XEseXA;gy+ICDPk zxxahv$2q${{PWkpZH%!vSOO=&{q)I(_AMINh2EDL8$%pPnoryj#c5h#E(Z@LY1(Xl ze)fS)nhmD;wA9)G#$x15u=hw1XW2 z*sdWWG;KS^ceG(pdoq+;zB@4VLcuea2y-WfzfTOyDY>*pE5-?|b`$=qQ64|zJR)^R z9-i)$O)S`o@k2wlW>+JUjC8zPn6Fz873#?UJj+teI=k;psOQPGW7jM)g|#y&8D%avXCvJ8w8^7wL340Ay%c{mLOf?D7D zU0|GsKdVG>gL_jd37}hqk&$? zG-9blMj>;MSXbl&u}K8d>IiF$9>Y8%? z_Bg$~?5R_4&t#WO&$nDBJEG>)T=tk@qbvqSaxm1P5q0oc#^-#5aNQ|-<|TgGb1#}k z;17%s@^RaCFAb_?D_E!&RLkX>?-_i_bc(LW3st9Ro7}4wF7rWkNX_xGx#;s!$r?DW zj;P0nIXWAen!#0uXZot~@D?7hhK65cB9(A;O~=lRZJv^6n#{MZgdZ(n zw(FF$RmZo=j#6XUY<@^b`vs-MXqUFu-qC&G0DShx<^dIvuo>T@yy9o3aZixKcGJahc7rGT5*~^ z2M^H~p%868h7w|I0xZoPLYy=ola7#;h<&{LQs}q_8)h&Unm1rFnd;64OLIrat;Zyq zvhq%75CltpgwH4(v6F2R5N!!X_}SFi@hRAwb%EUoBA*m>XVUL}KKt&uM}Pcv82S`g zBnWvFOe9u@ydW&ZM7T7Us1+A)z43oynss|9go}R1laMm%KE()+hCccGr@n7iUbsI7 z{VbUFOgYfO9R`DF|Ky@0p>`sui7Q<>!=x2O>PpLr4-rMZ<#CGGXf)_**my>{9(%2W zdJT=yc|4CX5wm4%26JO9NlQuhGadL!v?kdPwPYEmZekgFfHvauc`5@HKTCYVbpq1~ zd_HL|nYLRoJwEHYwy~gF&A3Ukq*v`gT{eQ|2(S7cH3W15bRsU=61N<~uA;iwmiB;+ z`a!X1mehst>C2)3;&&2~th6gn$!*CuWI0)uANyMFPL9f{YjW4999Ly2c|vB&oAQD7 zujDueq~vN$#_{3s3@}hSI3#MNgKYQ{S|q8c$UYXyrz819BzrJO<9)C@p%9TEooa~w b*F|ndW!u!5wzd0+UZX9BO=#Ol=wj?YDFn(L literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/debug.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/debug.o new file mode 100644 index 0000000000000000000000000000000000000000..fae55e1b48fc55ac923febc035b8ca701128a1d1 GIT binary patch literal 3456 zcmcgvUu;ul6#s79+jVQ#4Mz|Ixax|CuzN>A*(M-`6fkO^6}*zzfC)AN=#650LC(Dlv;uW~{&S^|mV=L44sP z=brDJ@0{QF?|kQLzrOv;KMjmACs+Wxz#r2mP}X-)`!4i8g07*DB*hcA*nWy)sngbS zkfMx5#>bX*YMljBJi%+eay*n%P&p||!nBM`cA~1^i9zuJa8$G%Y~iR;6(y<0^Aiey zxK&a54u?k$R6RaH>mw{WUxxv66{dor>502y9JW2%X#?)06&SI2+)$?&tDgs9oI&jU zU}Ul>orbB$_z4)hv6c_)d0fPvddl-zF%Kh_olwn{80+aUKsW5bvc|tFFeYOOK9%}; z5C*349~iM*PE(a^Y?7w2Vl5khLFsezp7SVU=<#FxVCv^_9vDGjyx54(om8`ynt9}6 ziF%AnHpVOWfnlA<-E}SB14F=u%-s_sr)RR3YS3nY6s3P~cxa@0V}3w>0)|~^;@#Dc zyV{}{HLau!>}c6of9HM%Mh;yc0;9SC(7lYMD=^hu&ty4D{eBE%z)`GaErN({Ajjye zK~+fF^H#FB%9EvzwcuOurTKO@Gj~nJbE>il3LnN zb363Ihh`VL=1Chb4z?DfzGB{U_A}aq;;GBnjzWI15WQ6xTqv^Q;9@a)tC(LXxPpb5 zpsO$t^c2Q|zJe8Oou4a}N`=V${M(T8Z{X9?zL&TKQ#7=#jdl zuE3KC4R^D%rwfX-y+;adW^&YoiyX@)4fVJ@Z0N_-gk^SyLvmQt^y49EB4efVaVewA zifJU|DK(qa4LP3ACN)(y^6?XLNZKxS$rI|NDW_7I&TUeUw5?l4i6&J^$XX_jhD_1C zU`mMxH)>~Qd-pSp=3!cTPD!hV%C(q@Wm~*SR|_wSX)$#=XRt&%X0TL7Q<+A2ii^Wy zRX?T>6h$yIbF%zVET-w%i9kMUW+t*~GQdMLv?o;rSIuTx$A~;u)l}*;nXpRO=x-C9 z{#N%o|0>}jq`O06)Y#kP^!Iw7^=|S#hm>?m@T@nwMCP!)`r8;2TNnvoMoKqbq#hcWQkl8cv&J@-oJO$p>Ms{mfpMY`L=U?uu&CGg8BL(kAsQ$ZbJ5OjUgw>7*E)GWlX{) zsvi?|r1XD$=v^mXO<*7@lr(oI6Y)5B8R3z=vJUEZfvMFBP{;mCwu2W~cumAqd zx}`7AL=u5FXD-h?y)=XVb70CNIzu|uAHlzZX(tJfjv@#NqVpmXZ7h;Kjd6rI#S9eUVpPuVH^Eb{xC|u^Vdp(H;V}gRRC_5SIMS z_|hv*a}yqDMP@QR7MVoM!Yg6Q;|V>fO8D6#@7M8*0VPWAQ>Ro-tyrt2E2W2WNQ zr>0_g&61`QR;5SIn+DZ;nLji#e|6+cHlgK{R7%T|RbBzC*0hpIH6^8~wxG14L5amg zUTT~HK@^(yitM`RZE|dF6L-2LarZ89|1QzF%k9a}itH^ocxD_T{Rm1U5a-gIC~u^A zgn*#Sj9sMPIG{N?ht1Hb=zzFRDT=AMrfs>$mc6#zV#`goeB73g+VU|vHN?}*9|pHT zp|ZHsZbR^-BRdtm4qGQX`N7Ods%bAjH07sBiN)#l;Lnf!b}0(pw4`bnIhb?!FJq<3 K{mU;MWB&q!N>xMv literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/java_raw_api.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/java_raw_api.o new file mode 100644 index 0000000000000000000000000000000000000000..3153b056523bc40abb8d0027003241f8fa4190d5 GIT binary patch literal 6044 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 VEaN}%@a4tX-^ literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/prep_cif.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/prep_cif.o new file mode 100644 index 0000000000000000000000000000000000000000..090f19e008cf8226200f6832e11396e5326531cb GIT binary patch literal 5336 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 HbKm~~mg*ro literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/raw_api.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/.libs/raw_api.o new file mode 100644 index 0000000000000000000000000000000000000000..20c92778368ebab253f40240a5be0b8c9a0fc778 GIT binary patch literal 6624 zcmcgxdvH|M89(=NHkWL&*(6JdiV~Zk;K(ilB9Rq|uneIDDIppKTsNCdvbfoe`#`YJ z%ET%=>rAmeI<{7wR>o=_t4`IK)(0=&k5Q>pTOGycglRfPjW!iD{r%3~-Go4G`;T|> zopZk5`OfeA?s?v`dF88rd{ZKXFd!O4LgtxB>hk*itT@gS_6V^WcFftHQf}J?gXzfT z^jM={aBZM{?U>HeW#DCdy81({5IR9qT*Hh{FxVOC$aDu&>7=bMy|`)3GF4{6_Dzrn z==kVIQ4uO|#1dg;5ey#9ai=5S@RQPfJ}y0mBh=B6jBFz3u^iLUasLZPG~ShF zBEfj5mth?9F16s;3B2c9=Y;$?p;)A3f2r;=^D}3rtxtumWgB8zi3aGL_A%sKqKHGRhKzqO z71g>dl8>+aFXguENBx8DT)@f(jyxL}p>-~BB)1s)kSdt{16npP+`nyDRNSyeRS)Gv z#bb*d{UhZSKXEB!q<^=W4U8PBDb(i#n)N?t^zYV;zzC~Q1LooW-J@X31%_0Mp+k3% zj*jL6BmMi`8}?O9TP##Oo?O74YbndMS=qKD*%q`%i+oUn&jyC_R71IzBMY0%ihgc5 zxxnDKpr$BfB)g}7kBR0vk!u;wYKPe8@TC;hU|f`Y2J}4#^`l}%hDhY|3hN!h@`Y|Gmf*S`hx9L!q|=5F3`Gc2{eqwgaISU-vv z8p^)Vzt_yR4dKQ9u1s0;1UL0*J>2$_WrrF@OD2YJObzMbIwyBGsHI~VYb8_i+% zbIV{BL16$etZjq2%s_72@VKzE>4viG)&}>$y+`PM_GQ5h`T z&syNa*-kYW_Qj$dDEQbq8M-PM>Wg~A-<{uC(YXue3q}&^h>B&)nuE)l*R-w;HeJxH zwAM>nFH(iJRn6`5=c(e#rf~*K1IwD)R*p5e@cYWiKn97@knP~G@cf1&8yZf5Jf256H1C!h1o_5q19RQ$IMbaiDX*Y0nIBknLB69 zgybXw#v)&p{mej$N;(njOD99gWN3@R3Q7RBFeTG>+7+SO{FnNGcOc zi>L^tMIj>Qslq#@;4R;+L^1`KXcroG#S&=Q8A^wQ>PWg*PVlM>G$qn~A{;CBNZ}>X zE4_W9D-#zPtc0K<&?>d*u4-wx+>Vo6m0A^6s%~nA%jrDVxe#ZeF+&)xsrZmJO|5{* z8qr*Bxbg;$1{f@II$>KRrTzX5quaME?j;CeCDr=k9!_zP|NpRGQlP#z{0XW+K&$IY@Qm zJfw!Pf(SZNf6}-VMPY;p7*`_Ih2)p;HWZCTj%$&Xm?hR$K=OJdw*oMG9JeF0H0vh9 zcObcsaMbZ2GKXf}NB9vWj}zYL*oUk{xAqWz3CZh(uWl4CXA^Dteuj4CPo0bEag|B@v38KE=w6eO%C{0Oz_ ztb~?+oZ4yRh1T~ZwHfaq6=ge-ECQ3(<|Nvvjd3-S3(TAMsG3Fi;)9m1LM|H_5xEre zLcR#J*c8_J^URB3@h)0wZPVC(yJFs~qTFsX=ef3%3(S4W&vyDDmtyX>nR^uTwTgL? z8y388X>D`KJgf!jhOwOpR1W_IDfyJIFKl12xvcwgKIRhYdd{KtPj;!0El8GwLf>m8 zNO(1pi>bd_UaLRjBKrZV&+7HU6-Ma;G|->Z>rGb_8iUfG*Xu3UZ&*j|1--t^buTqq zzNpu`UB54AFX{Cj3#q<=N z-%`-hdcDK-3uyE3R(b}Z2&)lAi-gt^l;kQTPeao`cANS^*UKp0M&tKL`ysU7QG1`- zr_dgy_5roS(4L_7AvG6D>@@u&XhPl%^>r9%e#cwLq^XwCAtDPMUm!Eh%I9HI^(qn* zANt4~8umMcRbsu3%rk)GWQe|8n_R1(t<}teat208pRd73O)FS9g!%%gWi=c{j-eia z>aO81s(6+`^@uTNrNUYWvng6F8`sjNmNQG0pe%1~T8{2l_X^lyPsu;TGz5w-;87yX z`81v|{p2m@p0aSm51v?e%TzPTJIdvdKFBo?&T+PVgb5z5CKlJ(I#(-;PFtUA*H<9t zQ;5f|K5jh!j}3qOI1yrB(d^$-H~^$oI&@HMTcn{;x7rdXbKX{(-s)@~9Ooluh z?3lOY1asHRH~Akv{M3%X4_7-}_dR&^f%8t*o|CT`yJlar!}-S0rS2>KX6%Xqf9B=u z19c}2{MPr}pWzDE-LmzGUoV*X)hE-wyz`qkx1Rz0m+xI!anon7o>YCn*mc)E zFaGO^t!E!T6P<8AWDO(&*$l}+?tnZ5c@gpsx@&H6PY_S{?v+UK#qq?gwPUH*C<4AXD0Lk#J1uZB}6jYie~{K9u79dot+T3 zdK=;{Lx@|74RI5ICb%JBA|4p4;oeVUZriqF9v*~vp4bpKDni`3Y)T$Lgm@y^kXocr zx#n$%3zk+~!!{QW9YQ>XY%3mpgm@O(5a$vhE^NCYk3d2^6>W$c7@^ORa{}SvGAG1! zUx>?YxCgKeaoeC3w;-E~=Q5$rF)OvlK;^b&H{|h5E1uYPL!RV>c(~gTN`*C{UA;zV zTP@99Ce0l%11sv$csQ2nj0hiZSCgRXB zJiOxMuacYyro`tP2hyn5WNGQ2Wc5|D*5Q{fzbtbsl9edd_+_bIPW4M;g)DbOf%~P? zE2pfGPQRSw=$5);C%|D9~ukx!o3{Sfh zo9Xh+F_(+r@QyKumEd=SuEHxzRv05c0#}{G$Z1xUoCetAC41HV(uA+Nb;n|-u7mvq zyW?W(i+0`u-#EJ>=Gh>t!Do48W!~wu_0j{N8i5os&pLTJu+#j~=auNfd0uIHrPJ~G z(cQ6jLU+tUcNk9#{Txj;lv*Fj8Q_@Zmvj8`Jk_6umDWqJU_~n?38qH*&6pRs%#?fb zJDBOV^FMMm!{kvrzueB(+qv7$%k2Dn`3=B4#m)=u4uWq6JT(EYfGxj+X~Xhj$XvUO zOkEU+^ZWi{2#V@qUMP!TZ=^Tewc(rCpjAN%wiHgHzX z<9u_pAB*Nu&N>sOw>ZZoxenK{r*&gdj;U-um`eRTn1ko&&N;HBl5HAJc8b$j^evZ> zV;)Iv+;JXZ4mWo!*qHix>`CDqBlipU*L_LNaWRaVd6csG`W!`>-;!^TnUclogaHbdm z)ehQ8|7UQoNgSc9)yVjG49-OfDnwNdHx}EBdUGFLz)9iUX-x(*6(W>zm;;P>ON|^J z%g_fG0E27L8e|h5jaOE6_F24JFe%km-3?=udcX z(X&pWY|iK-W%rnw_r0#69(~BR-I<=ugym0Gav96j4X>Qnr%k8emi1i4DcGi7uH@$Q zo=k71Tc0qeJiS=7x;AG9GMoE#R6?poUbn3r1f9{rY02d8-CMh?-u|tE^WdwEY1b-5 znlP%k@T_Oe;9>Z}cAbfI#qq2O$1J2R#}`=}@{|cFg1t$%>4$&A zMyR`*n&8&BJO~wYxGdr6O$OJeS#$>HSBSU3l@$QHAtcmpEjZZf7HG*qJk~RETI&F7 zR!XTJ@DqTQveGV6BhXG$^OW{v%BpI<(w<5=&|aslqO>=PP{kGM96@q z9w2fxLbhuv|12m!N5~FMJxb(yggm0DHjxz8Fr49TO`RpODnbS|^(2u^5i+c)uK^L_ zz~e&)kSnNqtbF`74q^!rRxQei3^X>?zcE;8$T?WISg%-78UN|!586vF?m2vBZbKs5 zFy8Uqp^+o=?~Z(b82FCWzIUT?73J`U}*I7q10% zf_8$2K~IBh&~Xr#1wXNY4-75=#r;y}0#F>2IyZ>ommm&qD)qMmO$Z(}>g%M=t)YHf z>Rfc{eSBb?llqULD!6epwMsjW2*u0N&gG|mOxiC=JHMBsx);*CXfL?d|HX&>hqRK( zF?fBrrz%i(73L$(_tD1AbMyE0H*S6W^1hFbZ@G2R$n~B6@EOo4(3_wOAYMAg z4T4YrICvci@qVr*AOx=yp?T0o0z&X=5#rsHP;mF4o&d?f2jQZKmGn*AYFUP7fM_t#>PiC#E-(Itrt=N8MHt$z0 zdc`ZVAL&6O)Pt_5TTb4t6iiX&_p~Jn;rWGvS;NVmnWl#fWVF8vbN`^&69NGx$L%gW=C%wOJcsKa2Hh!;6uc wmKKAu$HhSKXCPL?t{v-P+m3bFw_`vy?ii4rIR@x~)*J)$KrfF0dH@jOAH%G8)c^nh literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/closures.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/closures.lo new file mode 100644 index 0000000..859ad3b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/closures.lo @@ -0,0 +1,12 @@ +# src/closures.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/closures.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/debug.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/debug.lo new file mode 100644 index 0000000..866fece --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/debug.lo @@ -0,0 +1,12 @@ +# src/debug.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/debug.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/java_raw_api.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/java_raw_api.lo new file mode 100644 index 0000000..40a22f8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/java_raw_api.lo @@ -0,0 +1,12 @@ +# src/java_raw_api.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/java_raw_api.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/prep_cif.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/prep_cif.lo new file mode 100644 index 0000000..9639133 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/prep_cif.lo @@ -0,0 +1,12 @@ +# src/prep_cif.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/prep_cif.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/raw_api.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/raw_api.lo new file mode 100644 index 0000000..3a66579 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/raw_api.lo @@ -0,0 +1,12 @@ +# src/raw_api.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/raw_api.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/types.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/types.lo new file mode 100644 index 0000000..b4da327 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/types.lo @@ -0,0 +1,12 @@ +# src/types.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/types.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.deps/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.libs/darwin.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.libs/darwin.o new file mode 100644 index 0000000000000000000000000000000000000000..8761894eb909dd5a33b1a2270a832353d6056ff3 GIT binary patch literal 2660 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 I$qoPi5B!T`a{vGU literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.libs/ffi64.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-i386/src/x86/.libs/ffi64.o new file mode 100644 index 0000000000000000000000000000000000000000..9c8b471bb4a14cb47c9f5e3c57c72c0cf5230202 GIT binary patch literal 1424 zcmchX%}(1u5XaY$1c{c23VHz4$_J2&)a-_&ijt$%P;sCV0{U@V+0G_0a%^kugmCKv z^vE+*>aAB^qE~w8EA#>Sp_Uo%S`dSxT*^rMF|#|r{qL^5Uw{4hyFdt;hhjjPgEB_P zRDK`(ci2yud=6vSVm_9KdLHMA7$?_BoFDJLKfd;}9_HulL*{ed5zes3<3y$*&fD*- z!&ljG+CJ7ACW2}UI!7`5(AEAV1M|^77gT$r#$!k=(_uS~6eB|NI*_ppGiPCVK{rHb zp0Ndtrx3rGL5H-1o``QVUh2JE&cGPhZYm|O0~v^!&ak7%7d)^BDC5>%+5p&u__wJ# z6eDy_(u>LK=xfHG85pUK$aeFLkD6f?LCmDxxLc(oIg9Sx%NJlghurp5hW^I9K;SZY z9p8cR1me*Y2A&swL!_{XHL>u7&Heqiug#H=u@?qri&kmXeCGOa{gqY~99nPD+BRWt zVwl40pd-a8JCNataFe)V)tKe`;c1Qbyre&Ls24IGOP7sA&Lv?t#Q6B&RiS;tYVXL}!+1IdZT2>)Sc&`t`(JZbQ2-b|Zw4trTO /dev/null 2>&1; then \ + exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \ + if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ + then :; else exit_status=1; fi; \ + done; \ + else echo "WARNING: could not find \`runtest'" 1>&2; :;\ + fi; \ + exit $$exit_status +site.exp: Makefile + @echo 'Making a new site.exp file...' + @echo '## these variables are automatically generated by make ##' >site.tmp + @echo '# Do not edit here. If you wish to override these values' >>site.tmp + @echo '# edit the last section' >>site.tmp + @echo 'set srcdir $(srcdir)' >>site.tmp + @echo "set objdir `pwd`" >>site.tmp + @echo 'set build_alias "$(build_alias)"' >>site.tmp + @echo 'set build_triplet $(build_triplet)' >>site.tmp + @echo 'set host_alias "$(host_alias)"' >>site.tmp + @echo 'set host_triplet $(host_triplet)' >>site.tmp + @echo 'set target_alias "$(target_alias)"' >>site.tmp + @echo 'set target_triplet $(target_triplet)' >>site.tmp + @echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp + @test ! -f site.exp || \ + sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp + @-rm -f site.bak + @test ! -f site.exp || mv site.exp site.bak + @mv site.tmp site.exp + +distclean-DEJAGNU: + -rm -f site.exp site.bak + -l='$(DEJATOOL)'; for tool in $$l; do \ + rm -f $$tool.sum $$tool.log; \ + done + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-DEJAGNU distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \ + clean-libtool distclean distclean-DEJAGNU distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17/.libs/libffi_convenience.a b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17/.libs/libffi_convenience.a new file mode 100644 index 0000000000000000000000000000000000000000..282f3e5fec2ab699a19bd21e637d3e33c0e4cc28 GIT binary patch literal 100616 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17/include/ffi.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17/include/ffi.h new file mode 100644 index 0000000..5905ce9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17/include/ffi.h @@ -0,0 +1,7 @@ +#if defined(__i386__) +#include "libffi-i386/include/ffi.h" +#elif defined(__x86_64__) +#include "libffi-x86_64/include/ffi.h" +#elif defined(__ppc__) +#include "libffi-ppc/include/ffi.h" +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17/include/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17/include/ffitarget.h new file mode 100644 index 0000000..2e69d75 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-universal-darwin17/include/ffitarget.h @@ -0,0 +1,7 @@ +#if defined(__i386__) +#include "libffi-i386/include/ffitarget.h" +#elif defined(__x86_64__) +#include "libffi-x86_64/include/ffitarget.h" +#elif defined(__ppc__) +#include "libffi-ppc/include/ffitarget.h" +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.5.dylib b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.5.dylib new file mode 100755 index 0000000000000000000000000000000000000000..50f5f6f4dc05f32d9127f5550f3f44400a6fbc26 GIT binary patch literal 27456 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.dylib b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.dylib new file mode 120000 index 0000000..f2a9b0f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.dylib @@ -0,0 +1 @@ +libffi.5.dylib \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.la new file mode 120000 index 0000000..004dbb5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.la @@ -0,0 +1 @@ +../libffi.la \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.lai b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.lai new file mode 100644 index 0000000..a3e788a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi.lai @@ -0,0 +1,41 @@ +# libffi.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libffi.5.dylib' + +# Names of this library. +library_names='libffi.5.dylib libffi.dylib' + +# The name of the static archive. +old_library='' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags=' ' + +# Libraries that this one depends upon. +dependency_libs='' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libffi. +current=5 +age=0 +revision=10 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib' diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi_convenience.a b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi_convenience.a new file mode 100644 index 0000000000000000000000000000000000000000..4c9c8ef0483eec870b90966e1c592fd9ffbcbd12 GIT binary patch literal 55616 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�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 cg^^V?@uV}FX5TAqk-@aC?J^%m! literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi_convenience.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi_convenience.la new file mode 120000 index 0000000..0727452 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/.libs/libffi_convenience.la @@ -0,0 +1 @@ +../libffi_convenience.la \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/Makefile new file mode 100644 index 0000000..69372ef --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/Makefile @@ -0,0 +1,1820 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + + +VPATH = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-apple-darwin17.3.0 +host_triplet = x86_64-apple-darwin +target_triplet = x86_64-apple-darwin +#am__append_1 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S +#am__append_2 = src/x86/ffi.c src/x86/sysv.S +#am__append_3 = src/x86/ffi.c src/x86/freebsd.S +#am__append_4 = src/x86/ffi.c src/x86/win32.S +#am__append_5 = src/x86/ffi.c src/x86/win64.S +am__append_6 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S +#am__append_7 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S +#am__append_8 = src/alpha/ffi.c src/alpha/osf.S +#am__append_9 = src/ia64/ffi.c src/ia64/unix.S +#am__append_10 = src/m32r/sysv.S src/m32r/ffi.c +#am__append_11 = src/m68k/ffi.c src/m68k/sysv.S +#am__append_12 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S +#am__append_13 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S +#am__append_14 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S +#am__append_15 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S +#am__append_16 = src/arm/sysv.S src/arm/ffi.c +##am__append_17 = src/arm/trampoline.S +#am__append_18 = src/avr32/sysv.S src/avr32/ffi.c +#am__append_19 = src/cris/sysv.S src/cris/ffi.c +#am__append_20 = src/frv/eabi.S src/frv/ffi.c +#am__append_21 = src/s390/sysv.S src/s390/ffi.c +#am__append_22 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S +#am__append_23 = src/sh/sysv.S src/sh/ffi.c +#am__append_24 = src/sh64/sysv.S src/sh64/ffi.c +#am__append_25 = src/pa/linux.S src/pa/ffi.c +#am__append_26 = src/pa/hpux32.S src/pa/ffi.c +# Build debug. Define FFI_DEBUG on the commandline so that, when building with +# MSVC, it can link against the debug CRT. +#am__append_27 = -DFFI_DEBUG +subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \ + $(srcdir)/doc/version.texi $(srcdir)/fficonfig.h.in \ + $(srcdir)/libffi.pc.in $(top_srcdir)/configure ChangeLog \ + compile config.guess config.sub depcomp install-sh ltmain.sh \ + mdate-sh missing texinfo.tex +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = fficonfig.h +CONFIG_CLEAN_FILES = libffi.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(infodir)" \ + "$(DESTDIR)$(pkgconfigdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +libffi_la_LIBADD = +am__dirstamp = $(am__leading_dot)dirstamp +am_libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ + src/raw_api.lo src/java_raw_api.lo src/closures.lo +#am__objects_1 = src/mips/ffi.lo src/mips/o32.lo \ +# src/mips/n32.lo +#am__objects_2 = src/x86/ffi.lo src/x86/sysv.lo +#am__objects_3 = src/x86/ffi.lo src/x86/freebsd.lo +#am__objects_4 = src/x86/ffi.lo src/x86/win32.lo +#am__objects_5 = src/x86/ffi.lo src/x86/win64.lo +am__objects_6 = src/x86/ffi.lo src/x86/darwin.lo \ + src/x86/ffi64.lo src/x86/darwin64.lo +#am__objects_7 = src/sparc/ffi.lo src/sparc/v8.lo \ +# src/sparc/v9.lo +#am__objects_8 = src/alpha/ffi.lo src/alpha/osf.lo +#am__objects_9 = src/ia64/ffi.lo src/ia64/unix.lo +#am__objects_10 = src/m32r/sysv.lo src/m32r/ffi.lo +#am__objects_11 = src/m68k/ffi.lo src/m68k/sysv.lo +#am__objects_12 = src/powerpc/ffi.lo src/powerpc/sysv.lo \ +# src/powerpc/ppc_closure.lo \ +# src/powerpc/linux64.lo \ +# src/powerpc/linux64_closure.lo +#am__objects_13 = src/powerpc/ffi_darwin.lo \ +# src/powerpc/aix.lo \ +# src/powerpc/aix_closure.lo +#am__objects_14 = src/powerpc/ffi_darwin.lo \ +# src/powerpc/darwin.lo \ +# src/powerpc/darwin_closure.lo +#am__objects_15 = src/powerpc/ffi.lo \ +# src/powerpc/sysv.lo \ +# src/powerpc/ppc_closure.lo +#am__objects_16 = src/arm/sysv.lo src/arm/ffi.lo +##am__objects_17 = src/arm/trampoline.lo +#am__objects_18 = src/avr32/sysv.lo src/avr32/ffi.lo +#am__objects_19 = src/cris/sysv.lo src/cris/ffi.lo +#am__objects_20 = src/frv/eabi.lo src/frv/ffi.lo +#am__objects_21 = src/s390/sysv.lo src/s390/ffi.lo +#am__objects_22 = src/x86/ffi64.lo src/x86/unix64.lo \ +# src/x86/ffi.lo src/x86/sysv.lo +#am__objects_23 = src/sh/sysv.lo src/sh/ffi.lo +#am__objects_24 = src/sh64/sysv.lo src/sh64/ffi.lo +#am__objects_25 = src/pa/linux.lo src/pa/ffi.lo +#am__objects_26 = src/pa/hpux32.lo src/pa/ffi.lo +nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) \ + $(am__objects_6) $(am__objects_7) $(am__objects_8) \ + $(am__objects_9) $(am__objects_10) $(am__objects_11) \ + $(am__objects_12) $(am__objects_13) $(am__objects_14) \ + $(am__objects_15) $(am__objects_16) $(am__objects_17) \ + $(am__objects_18) $(am__objects_19) $(am__objects_20) \ + $(am__objects_21) $(am__objects_22) $(am__objects_23) \ + $(am__objects_24) $(am__objects_25) $(am__objects_26) +libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \ + $(nodist_libffi_la_OBJECTS) +libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ +libffi_convenience_la_LIBADD = +am__objects_27 = src/debug.lo src/prep_cif.lo src/types.lo \ + src/raw_api.lo src/java_raw_api.lo src/closures.lo +am_libffi_convenience_la_OBJECTS = $(am__objects_27) +am__objects_28 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) $(am__objects_18) \ + $(am__objects_19) $(am__objects_20) $(am__objects_21) \ + $(am__objects_22) $(am__objects_23) $(am__objects_24) \ + $(am__objects_25) $(am__objects_26) +nodist_libffi_convenience_la_OBJECTS = $(am__objects_28) +libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ + $(nodist_libffi_convenience_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) +LTCPPASCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libffi_la_SOURCES) $(nodist_libffi_la_SOURCES) \ + $(libffi_convenience_la_SOURCES) \ + $(nodist_libffi_convenience_la_SOURCES) +DIST_SOURCES = $(libffi_la_SOURCES) $(libffi_convenience_la_SOURCES) +INFO_DEPS = $(srcdir)/doc/libffi.info +am__TEXINFO_TEX_DIR = $(srcdir) +DVIS = doc/libffi.dvi +PDFS = doc/libffi.pdf +PSS = doc/libffi.ps +HTMLS = doc/libffi.html +TEXINFOS = doc/libffi.texi +TEXI2DVI = texi2dvi +TEXI2PDF = $(TEXI2DVI) --pdf --batch +MAKEINFOHTML = $(MAKEINFO) --html +AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) +DVIPS = dvips +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +DATA = $(pkgconfig_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run aclocal-1.11 +ALLOCA = +AMTAR = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run tar +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoconf +AUTOHEADER = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoheader +AUTOMAKE = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run automake-1.11 +AWK = awk +CC = xcrun clang +CCAS = xcrun clang +CCASDEPMODE = depmode=none +CCASFLAGS = -arch x86_64 +CCDEPMODE = depmode=none +CFLAGS = -arch x86_64 -Wall -fexceptions +CPP = xcrun clang -E +CPPFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = dsymutil +DUMPBIN = : +ECHO_C = \c +ECHO_N = +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +LDFLAGS = -arch x86_64 +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = lipo +LN_S = ln -s +LTLIBOBJS = +MAINT = # +MAKEINFO = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo +MANIFEST_TOOL = : +MKDIR_P = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +NM = nm +NMEDIT = nmedit +OBJDUMP = objdump +OBJEXT = o +OTOOL = otool +OTOOL64 = : +PACKAGE = libffi +PACKAGE_BUGREPORT = http://sourceware.org/libffi.html +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.0.10 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.0.10 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_DARWIN +TARGETDIR = x86 +VERSION = 3.0.10 +abs_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64 +abs_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +abs_top_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64 +abs_top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = +ac_ct_DUMPBIN = link -dump +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-apple-darwin17.3.0 +build_alias = +build_cpu = x86_64 +build_os = darwin17.3.0 +build_vendor = apple +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-apple-darwin +host_alias = x86_64-apple-darwin +host_cpu = x86_64 +host_os = darwin +host_vendor = apple +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +sys_symbol_underscore = +sysconfdir = ${prefix}/etc +target = x86_64-apple-darwin +target_alias = x86_64-apple-darwin +target_cpu = x86_64 +target_os = darwin +target_vendor = apple +toolexecdir = $(libdir)/gcc-lib/$(target_alias) +toolexeclibdir = $(libdir)/ +top_build_prefix = +top_builddir = . +top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +AUTOMAKE_OPTIONS = foreign subdir-objects +SUBDIRS = include testsuite man +EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ + src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \ + src/arm/ffi.c src/arm/sysv.S src/arm/trampoline.S \ + src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \ + src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \ + src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \ + src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \ + src/mips/n32.S src/mips/o32.S src/mips/ffitarget.h \ + src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ + src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ + src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/linux64.S \ + src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ + src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S \ + src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ + src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ + src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ + src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c \ + src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S \ + src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c \ + src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S \ + src/x86/win32.S src/x86/win64.S src/x86/darwin.S \ + src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S \ + src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c \ + src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/frv/eabi.S \ + src/frv/ffitarget.h src/dlmalloc.c src/moxie/ffi.c \ + src/moxie/eabi.S libtool-version ChangeLog.libffi \ + m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 \ + m4/ltversion.m4 build-ios.sh src/arm/gentramp.sh src/debug.c \ + msvcc.sh + +info_TEXINFOS = doc/libffi.texi + +# Work around what appears to be a GNU make bug handling MAKEFLAGS +# values defined in terms of make variables, as is the case for CC and +# friends when we are called from the top level Makefile. +AM_MAKEFLAGS = \ + "AR_FLAGS=$(AR_FLAGS)" \ + "CC_FOR_BUILD=$(CC_FOR_BUILD)" \ + "CFLAGS=$(CFLAGS)" \ + "CXXFLAGS=$(CXXFLAGS)" \ + "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \ + "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \ + "INSTALL=$(INSTALL)" \ + "INSTALL_DATA=$(INSTALL_DATA)" \ + "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ + "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \ + "JC1FLAGS=$(JC1FLAGS)" \ + "LDFLAGS=$(LDFLAGS)" \ + "LIBCFLAGS=$(LIBCFLAGS)" \ + "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \ + "MAKE=$(MAKE)" \ + "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \ + "PICFLAG=$(PICFLAG)" \ + "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \ + "RUNTESTFLAGS=$(RUNTESTFLAGS)" \ + "SHELL=$(SHELL)" \ + "exec_prefix=$(exec_prefix)" \ + "infodir=$(infodir)" \ + "libdir=$(libdir)" \ + "mandir=$(mandir)" \ + "prefix=$(prefix)" \ + "AR=$(AR)" \ + "AS=$(AS)" \ + "CC=$(CC)" \ + "CXX=$(CXX)" \ + "LD=$(LD)" \ + "NM=$(NM)" \ + "RANLIB=$(RANLIB)" \ + "DESTDIR=$(DESTDIR)" + +MAKEOVERRIDES = +ACLOCAL_AMFLAGS = $(ACLOCAL_AMFLAGS) -I m4 +lib_LTLIBRARIES = libffi.la +noinst_LTLIBRARIES = libffi_convenience.la +libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \ + src/raw_api.c src/java_raw_api.c src/closures.c + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libffi.pc +nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \ + $(am__append_3) $(am__append_4) $(am__append_5) \ + $(am__append_6) $(am__append_7) $(am__append_8) \ + $(am__append_9) $(am__append_10) $(am__append_11) \ + $(am__append_12) $(am__append_13) $(am__append_14) \ + $(am__append_15) $(am__append_16) $(am__append_17) \ + $(am__append_18) $(am__append_19) $(am__append_20) \ + $(am__append_21) $(am__append_22) $(am__append_23) \ + $(am__append_24) $(am__append_25) $(am__append_26) +libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) +nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) +AM_CFLAGS = -g $(am__append_27) +libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) +AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src +AM_CCASFLAGS = $(AM_CPPFLAGS) +all: fficonfig.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .S .c .dvi .lo .o .obj .ps +am--refresh: + @: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: # $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +fficonfig.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status fficonfig.h +$(srcdir)/fficonfig.h.in: # $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f fficonfig.h stamp-h1 +libffi.pc: $(top_builddir)/config.status $(srcdir)/libffi.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) +src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/$(DEPDIR) + @: > src/$(DEPDIR)/$(am__dirstamp) +src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/prep_cif.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/types.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/java_raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/closures.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/mips/$(am__dirstamp): + @$(MKDIR_P) src/mips + @: > src/mips/$(am__dirstamp) +src/mips/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/mips/$(DEPDIR) + @: > src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/ffi.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/o32.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/n32.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/x86/$(am__dirstamp): + @$(MKDIR_P) src/x86 + @: > src/x86/$(am__dirstamp) +src/x86/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/x86/$(DEPDIR) + @: > src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/ffi.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/sysv.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/freebsd.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/win32.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/win64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/darwin.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/ffi64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/darwin64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/sparc/$(am__dirstamp): + @$(MKDIR_P) src/sparc + @: > src/sparc/$(am__dirstamp) +src/sparc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sparc/$(DEPDIR) + @: > src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/ffi.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/v8.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/v9.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/alpha/$(am__dirstamp): + @$(MKDIR_P) src/alpha + @: > src/alpha/$(am__dirstamp) +src/alpha/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/alpha/$(DEPDIR) + @: > src/alpha/$(DEPDIR)/$(am__dirstamp) +src/alpha/ffi.lo: src/alpha/$(am__dirstamp) \ + src/alpha/$(DEPDIR)/$(am__dirstamp) +src/alpha/osf.lo: src/alpha/$(am__dirstamp) \ + src/alpha/$(DEPDIR)/$(am__dirstamp) +src/ia64/$(am__dirstamp): + @$(MKDIR_P) src/ia64 + @: > src/ia64/$(am__dirstamp) +src/ia64/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/ia64/$(DEPDIR) + @: > src/ia64/$(DEPDIR)/$(am__dirstamp) +src/ia64/ffi.lo: src/ia64/$(am__dirstamp) \ + src/ia64/$(DEPDIR)/$(am__dirstamp) +src/ia64/unix.lo: src/ia64/$(am__dirstamp) \ + src/ia64/$(DEPDIR)/$(am__dirstamp) +src/m32r/$(am__dirstamp): + @$(MKDIR_P) src/m32r + @: > src/m32r/$(am__dirstamp) +src/m32r/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/m32r/$(DEPDIR) + @: > src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m32r/sysv.lo: src/m32r/$(am__dirstamp) \ + src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m32r/ffi.lo: src/m32r/$(am__dirstamp) \ + src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m68k/$(am__dirstamp): + @$(MKDIR_P) src/m68k + @: > src/m68k/$(am__dirstamp) +src/m68k/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/m68k/$(DEPDIR) + @: > src/m68k/$(DEPDIR)/$(am__dirstamp) +src/m68k/ffi.lo: src/m68k/$(am__dirstamp) \ + src/m68k/$(DEPDIR)/$(am__dirstamp) +src/m68k/sysv.lo: src/m68k/$(am__dirstamp) \ + src/m68k/$(DEPDIR)/$(am__dirstamp) +src/powerpc/$(am__dirstamp): + @$(MKDIR_P) src/powerpc + @: > src/powerpc/$(am__dirstamp) +src/powerpc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/powerpc/$(DEPDIR) + @: > src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ffi.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/sysv.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ppc_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/linux64.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/linux64_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ffi_darwin.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/aix.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/aix_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/darwin.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/darwin_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/arm/$(am__dirstamp): + @$(MKDIR_P) src/arm + @: > src/arm/$(am__dirstamp) +src/arm/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/arm/$(DEPDIR) + @: > src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/sysv.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/ffi.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/trampoline.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/avr32/$(am__dirstamp): + @$(MKDIR_P) src/avr32 + @: > src/avr32/$(am__dirstamp) +src/avr32/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/avr32/$(DEPDIR) + @: > src/avr32/$(DEPDIR)/$(am__dirstamp) +src/avr32/sysv.lo: src/avr32/$(am__dirstamp) \ + src/avr32/$(DEPDIR)/$(am__dirstamp) +src/avr32/ffi.lo: src/avr32/$(am__dirstamp) \ + src/avr32/$(DEPDIR)/$(am__dirstamp) +src/cris/$(am__dirstamp): + @$(MKDIR_P) src/cris + @: > src/cris/$(am__dirstamp) +src/cris/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/cris/$(DEPDIR) + @: > src/cris/$(DEPDIR)/$(am__dirstamp) +src/cris/sysv.lo: src/cris/$(am__dirstamp) \ + src/cris/$(DEPDIR)/$(am__dirstamp) +src/cris/ffi.lo: src/cris/$(am__dirstamp) \ + src/cris/$(DEPDIR)/$(am__dirstamp) +src/frv/$(am__dirstamp): + @$(MKDIR_P) src/frv + @: > src/frv/$(am__dirstamp) +src/frv/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/frv/$(DEPDIR) + @: > src/frv/$(DEPDIR)/$(am__dirstamp) +src/frv/eabi.lo: src/frv/$(am__dirstamp) \ + src/frv/$(DEPDIR)/$(am__dirstamp) +src/frv/ffi.lo: src/frv/$(am__dirstamp) \ + src/frv/$(DEPDIR)/$(am__dirstamp) +src/s390/$(am__dirstamp): + @$(MKDIR_P) src/s390 + @: > src/s390/$(am__dirstamp) +src/s390/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/s390/$(DEPDIR) + @: > src/s390/$(DEPDIR)/$(am__dirstamp) +src/s390/sysv.lo: src/s390/$(am__dirstamp) \ + src/s390/$(DEPDIR)/$(am__dirstamp) +src/s390/ffi.lo: src/s390/$(am__dirstamp) \ + src/s390/$(DEPDIR)/$(am__dirstamp) +src/x86/unix64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/sh/$(am__dirstamp): + @$(MKDIR_P) src/sh + @: > src/sh/$(am__dirstamp) +src/sh/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sh/$(DEPDIR) + @: > src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh/sysv.lo: src/sh/$(am__dirstamp) \ + src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh/ffi.lo: src/sh/$(am__dirstamp) src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh64/$(am__dirstamp): + @$(MKDIR_P) src/sh64 + @: > src/sh64/$(am__dirstamp) +src/sh64/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sh64/$(DEPDIR) + @: > src/sh64/$(DEPDIR)/$(am__dirstamp) +src/sh64/sysv.lo: src/sh64/$(am__dirstamp) \ + src/sh64/$(DEPDIR)/$(am__dirstamp) +src/sh64/ffi.lo: src/sh64/$(am__dirstamp) \ + src/sh64/$(DEPDIR)/$(am__dirstamp) +src/pa/$(am__dirstamp): + @$(MKDIR_P) src/pa + @: > src/pa/$(am__dirstamp) +src/pa/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/pa/$(DEPDIR) + @: > src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/linux.lo: src/pa/$(am__dirstamp) \ + src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/hpux32.lo: src/pa/$(am__dirstamp) \ + src/pa/$(DEPDIR)/$(am__dirstamp) +libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) + $(libffi_la_LINK) -rpath $(libdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) +libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) + $(LINK) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f src/alpha/ffi.$(OBJEXT) + -rm -f src/alpha/ffi.lo + -rm -f src/alpha/osf.$(OBJEXT) + -rm -f src/alpha/osf.lo + -rm -f src/arm/ffi.$(OBJEXT) + -rm -f src/arm/ffi.lo + -rm -f src/arm/sysv.$(OBJEXT) + -rm -f src/arm/sysv.lo + -rm -f src/arm/trampoline.$(OBJEXT) + -rm -f src/arm/trampoline.lo + -rm -f src/avr32/ffi.$(OBJEXT) + -rm -f src/avr32/ffi.lo + -rm -f src/avr32/sysv.$(OBJEXT) + -rm -f src/avr32/sysv.lo + -rm -f src/closures.$(OBJEXT) + -rm -f src/closures.lo + -rm -f src/cris/ffi.$(OBJEXT) + -rm -f src/cris/ffi.lo + -rm -f src/cris/sysv.$(OBJEXT) + -rm -f src/cris/sysv.lo + -rm -f src/debug.$(OBJEXT) + -rm -f src/debug.lo + -rm -f src/frv/eabi.$(OBJEXT) + -rm -f src/frv/eabi.lo + -rm -f src/frv/ffi.$(OBJEXT) + -rm -f src/frv/ffi.lo + -rm -f src/ia64/ffi.$(OBJEXT) + -rm -f src/ia64/ffi.lo + -rm -f src/ia64/unix.$(OBJEXT) + -rm -f src/ia64/unix.lo + -rm -f src/java_raw_api.$(OBJEXT) + -rm -f src/java_raw_api.lo + -rm -f src/m32r/ffi.$(OBJEXT) + -rm -f src/m32r/ffi.lo + -rm -f src/m32r/sysv.$(OBJEXT) + -rm -f src/m32r/sysv.lo + -rm -f src/m68k/ffi.$(OBJEXT) + -rm -f src/m68k/ffi.lo + -rm -f src/m68k/sysv.$(OBJEXT) + -rm -f src/m68k/sysv.lo + -rm -f src/mips/ffi.$(OBJEXT) + -rm -f src/mips/ffi.lo + -rm -f src/mips/n32.$(OBJEXT) + -rm -f src/mips/n32.lo + -rm -f src/mips/o32.$(OBJEXT) + -rm -f src/mips/o32.lo + -rm -f src/pa/ffi.$(OBJEXT) + -rm -f src/pa/ffi.lo + -rm -f src/pa/hpux32.$(OBJEXT) + -rm -f src/pa/hpux32.lo + -rm -f src/pa/linux.$(OBJEXT) + -rm -f src/pa/linux.lo + -rm -f src/powerpc/aix.$(OBJEXT) + -rm -f src/powerpc/aix.lo + -rm -f src/powerpc/aix_closure.$(OBJEXT) + -rm -f src/powerpc/aix_closure.lo + -rm -f src/powerpc/darwin.$(OBJEXT) + -rm -f src/powerpc/darwin.lo + -rm -f src/powerpc/darwin_closure.$(OBJEXT) + -rm -f src/powerpc/darwin_closure.lo + -rm -f src/powerpc/ffi.$(OBJEXT) + -rm -f src/powerpc/ffi.lo + -rm -f src/powerpc/ffi_darwin.$(OBJEXT) + -rm -f src/powerpc/ffi_darwin.lo + -rm -f src/powerpc/linux64.$(OBJEXT) + -rm -f src/powerpc/linux64.lo + -rm -f src/powerpc/linux64_closure.$(OBJEXT) + -rm -f src/powerpc/linux64_closure.lo + -rm -f src/powerpc/ppc_closure.$(OBJEXT) + -rm -f src/powerpc/ppc_closure.lo + -rm -f src/powerpc/sysv.$(OBJEXT) + -rm -f src/powerpc/sysv.lo + -rm -f src/prep_cif.$(OBJEXT) + -rm -f src/prep_cif.lo + -rm -f src/raw_api.$(OBJEXT) + -rm -f src/raw_api.lo + -rm -f src/s390/ffi.$(OBJEXT) + -rm -f src/s390/ffi.lo + -rm -f src/s390/sysv.$(OBJEXT) + -rm -f src/s390/sysv.lo + -rm -f src/sh/ffi.$(OBJEXT) + -rm -f src/sh/ffi.lo + -rm -f src/sh/sysv.$(OBJEXT) + -rm -f src/sh/sysv.lo + -rm -f src/sh64/ffi.$(OBJEXT) + -rm -f src/sh64/ffi.lo + -rm -f src/sh64/sysv.$(OBJEXT) + -rm -f src/sh64/sysv.lo + -rm -f src/sparc/ffi.$(OBJEXT) + -rm -f src/sparc/ffi.lo + -rm -f src/sparc/v8.$(OBJEXT) + -rm -f src/sparc/v8.lo + -rm -f src/sparc/v9.$(OBJEXT) + -rm -f src/sparc/v9.lo + -rm -f src/types.$(OBJEXT) + -rm -f src/types.lo + -rm -f src/x86/darwin.$(OBJEXT) + -rm -f src/x86/darwin.lo + -rm -f src/x86/darwin64.$(OBJEXT) + -rm -f src/x86/darwin64.lo + -rm -f src/x86/ffi.$(OBJEXT) + -rm -f src/x86/ffi.lo + -rm -f src/x86/ffi64.$(OBJEXT) + -rm -f src/x86/ffi64.lo + -rm -f src/x86/freebsd.$(OBJEXT) + -rm -f src/x86/freebsd.lo + -rm -f src/x86/sysv.$(OBJEXT) + -rm -f src/x86/sysv.lo + -rm -f src/x86/unix64.$(OBJEXT) + -rm -f src/x86/unix64.lo + -rm -f src/x86/win32.$(OBJEXT) + -rm -f src/x86/win32.lo + -rm -f src/x86/win64.$(OBJEXT) + -rm -f src/x86/win64.lo + +distclean-compile: + -rm -f *.tab.c + +#include src/$(DEPDIR)/closures.Plo +#include src/$(DEPDIR)/debug.Plo +#include src/$(DEPDIR)/java_raw_api.Plo +#include src/$(DEPDIR)/prep_cif.Plo +#include src/$(DEPDIR)/raw_api.Plo +#include src/$(DEPDIR)/types.Plo +#include src/alpha/$(DEPDIR)/ffi.Plo +#include src/alpha/$(DEPDIR)/osf.Plo +#include src/arm/$(DEPDIR)/ffi.Plo +#include src/arm/$(DEPDIR)/sysv.Plo +#include src/arm/$(DEPDIR)/trampoline.Plo +#include src/avr32/$(DEPDIR)/ffi.Plo +#include src/avr32/$(DEPDIR)/sysv.Plo +#include src/cris/$(DEPDIR)/ffi.Plo +#include src/cris/$(DEPDIR)/sysv.Plo +#include src/frv/$(DEPDIR)/eabi.Plo +#include src/frv/$(DEPDIR)/ffi.Plo +#include src/ia64/$(DEPDIR)/ffi.Plo +#include src/ia64/$(DEPDIR)/unix.Plo +#include src/m32r/$(DEPDIR)/ffi.Plo +#include src/m32r/$(DEPDIR)/sysv.Plo +#include src/m68k/$(DEPDIR)/ffi.Plo +#include src/m68k/$(DEPDIR)/sysv.Plo +#include src/mips/$(DEPDIR)/ffi.Plo +#include src/mips/$(DEPDIR)/n32.Plo +#include src/mips/$(DEPDIR)/o32.Plo +#include src/pa/$(DEPDIR)/ffi.Plo +#include src/pa/$(DEPDIR)/hpux32.Plo +#include src/pa/$(DEPDIR)/linux.Plo +#include src/powerpc/$(DEPDIR)/aix.Plo +#include src/powerpc/$(DEPDIR)/aix_closure.Plo +#include src/powerpc/$(DEPDIR)/darwin.Plo +#include src/powerpc/$(DEPDIR)/darwin_closure.Plo +#include src/powerpc/$(DEPDIR)/ffi.Plo +#include src/powerpc/$(DEPDIR)/ffi_darwin.Plo +#include src/powerpc/$(DEPDIR)/linux64.Plo +#include src/powerpc/$(DEPDIR)/linux64_closure.Plo +#include src/powerpc/$(DEPDIR)/ppc_closure.Plo +#include src/powerpc/$(DEPDIR)/sysv.Plo +#include src/s390/$(DEPDIR)/ffi.Plo +#include src/s390/$(DEPDIR)/sysv.Plo +#include src/sh/$(DEPDIR)/ffi.Plo +#include src/sh/$(DEPDIR)/sysv.Plo +#include src/sh64/$(DEPDIR)/ffi.Plo +#include src/sh64/$(DEPDIR)/sysv.Plo +#include src/sparc/$(DEPDIR)/ffi.Plo +#include src/sparc/$(DEPDIR)/v8.Plo +#include src/sparc/$(DEPDIR)/v9.Plo +#include src/x86/$(DEPDIR)/darwin.Plo +#include src/x86/$(DEPDIR)/darwin64.Plo +#include src/x86/$(DEPDIR)/ffi.Plo +#include src/x86/$(DEPDIR)/ffi64.Plo +#include src/x86/$(DEPDIR)/freebsd.Plo +#include src/x86/$(DEPDIR)/sysv.Plo +#include src/x86/$(DEPDIR)/unix64.Plo +#include src/x86/$(DEPDIR)/win32.Plo +#include src/x86/$(DEPDIR)/win64.Plo + +.S.o: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +# $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) + $(CPPASCOMPILE) -c -o $@ $< + +.S.obj: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +# $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) + $(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.S.lo: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +# $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Plo +# source='$<' object='$@' libtool=yes +# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) + $(LTCPPASCOMPILE) -c -o $@ $< + +.c.o: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +# $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) + $(COMPILE) -c -o $@ $< + +.c.obj: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +# $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) + $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +# depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +# $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Plo +# source='$<' object='$@' libtool=yes +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) + $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf src/.libs src/_libs + -rm -rf src/alpha/.libs src/alpha/_libs + -rm -rf src/arm/.libs src/arm/_libs + -rm -rf src/avr32/.libs src/avr32/_libs + -rm -rf src/cris/.libs src/cris/_libs + -rm -rf src/frv/.libs src/frv/_libs + -rm -rf src/ia64/.libs src/ia64/_libs + -rm -rf src/m32r/.libs src/m32r/_libs + -rm -rf src/m68k/.libs src/m68k/_libs + -rm -rf src/mips/.libs src/mips/_libs + -rm -rf src/pa/.libs src/pa/_libs + -rm -rf src/powerpc/.libs src/powerpc/_libs + -rm -rf src/s390/.libs src/s390/_libs + -rm -rf src/sh/.libs src/sh/_libs + -rm -rf src/sh64/.libs src/sh64/_libs + -rm -rf src/sparc/.libs src/sparc/_libs + -rm -rf src/x86/.libs src/x86/_libs + +distclean-libtool: + -rm -f libtool config.lt +doc/$(am__dirstamp): + @$(MKDIR_P) doc + @: > doc/$(am__dirstamp) + +$(srcdir)/doc/libffi.info: doc/libffi.texi $(srcdir)/doc/version.texi + restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + am__cwd=`pwd` && $(am__cd) $(srcdir) && \ + rm -rf $$backupdir && mkdir $$backupdir && \ + if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ + done; \ + else :; fi && \ + cd "$$am__cwd"; \ + if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \ + -o $@ $(srcdir)/doc/libffi.texi; \ + then \ + rc=0; \ + $(am__cd) $(srcdir); \ + else \ + rc=$$?; \ + $(am__cd) $(srcdir) && \ + $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ + fi; \ + rm -rf $$backupdir; exit $$rc + +doc/libffi.dvi: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \ + $(TEXI2DVI) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi + +doc/libffi.pdf: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \ + $(TEXI2PDF) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi + +doc/libffi.html: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) + rm -rf $(@:.html=.htp) + if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \ + -o $(@:.html=.htp) `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi; \ + then \ + rm -rf $@; \ + if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ + mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ + else \ + if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ + rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ + exit 1; \ + fi +$(srcdir)/doc/version.texi: # $(srcdir)/doc/stamp-vti +$(srcdir)/doc/stamp-vti: doc/libffi.texi $(top_srcdir)/configure + test -f doc/$(am__dirstamp) || $(MAKE) $(AM_MAKEFLAGS) doc/$(am__dirstamp) + @(dir=.; test -f ./doc/libffi.texi || dir=$(srcdir); \ + set `$(SHELL) $(srcdir)/mdate-sh $$dir/doc/libffi.texi`; \ + echo "@set UPDATED $$1 $$2 $$3"; \ + echo "@set UPDATED-MONTH $$2 $$3"; \ + echo "@set EDITION $(VERSION)"; \ + echo "@set VERSION $(VERSION)") > vti.tmp + @cmp -s vti.tmp $(srcdir)/doc/version.texi \ + || (echo "Updating $(srcdir)/doc/version.texi"; \ + cp vti.tmp $(srcdir)/doc/version.texi) + -@rm -f vti.tmp + @cp $(srcdir)/doc/version.texi $@ + +mostlyclean-vti: + -rm -f vti.tmp + +maintainer-clean-vti: +# -rm -f $(srcdir)/doc/stamp-vti $(srcdir)/doc/version.texi +.dvi.ps: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(DVIPS) -o $@ $< + +uninstall-dvi-am: + @$(NORMAL_UNINSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ + rm -f "$(DESTDIR)$(dvidir)/$$f"; \ + done + +uninstall-html-am: + @$(NORMAL_UNINSTALL) + @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ + rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ + done + +uninstall-info-am: + @$(PRE_UNINSTALL) + @if test -d '$(DESTDIR)$(infodir)' && \ + (install-info --version && \ + install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ + if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ + then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ + done; \ + else :; fi + @$(NORMAL_UNINSTALL) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ + (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ + echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ + rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ + else :; fi); \ + done + +uninstall-pdf-am: + @$(NORMAL_UNINSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ + done + +uninstall-ps-am: + @$(NORMAL_UNINSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ + rm -f "$(DESTDIR)$(psdir)/$$f"; \ + done + +dist-info: $(INFO_DEPS) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; \ + for base in $$list; do \ + case $$base in \ + $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$base; then d=.; else d=$(srcdir); fi; \ + base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ + for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ + if test -f $$file; then \ + relfile=`expr "$$file" : "$$d/\(.*\)"`; \ + test -f "$(distdir)/$$relfile" || \ + cp -p $$file "$(distdir)/$$relfile"; \ + else :; fi; \ + done; \ + done + +mostlyclean-aminfo: + -rm -rf libffi.aux libffi.cp libffi.cps libffi.fn libffi.ky libffi.log \ + libffi.pg libffi.tmp libffi.toc libffi.tp libffi.vr + +clean-aminfo: + -test -z "doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html" \ + || rm -rf doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html + +maintainer-clean-aminfo: + @list='$(INFO_DEPS)'; for i in $$list; do \ + i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ + echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ + rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ + done +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-info + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(INFO_DEPS) $(LTLIBRARIES) $(DATA) fficonfig.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f doc/$(am__dirstamp) + -rm -f src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/$(am__dirstamp) + -rm -f src/alpha/$(DEPDIR)/$(am__dirstamp) + -rm -f src/alpha/$(am__dirstamp) + -rm -f src/arm/$(DEPDIR)/$(am__dirstamp) + -rm -f src/arm/$(am__dirstamp) + -rm -f src/avr32/$(DEPDIR)/$(am__dirstamp) + -rm -f src/avr32/$(am__dirstamp) + -rm -f src/cris/$(DEPDIR)/$(am__dirstamp) + -rm -f src/cris/$(am__dirstamp) + -rm -f src/frv/$(DEPDIR)/$(am__dirstamp) + -rm -f src/frv/$(am__dirstamp) + -rm -f src/ia64/$(DEPDIR)/$(am__dirstamp) + -rm -f src/ia64/$(am__dirstamp) + -rm -f src/m32r/$(DEPDIR)/$(am__dirstamp) + -rm -f src/m32r/$(am__dirstamp) + -rm -f src/m68k/$(DEPDIR)/$(am__dirstamp) + -rm -f src/m68k/$(am__dirstamp) + -rm -f src/mips/$(DEPDIR)/$(am__dirstamp) + -rm -f src/mips/$(am__dirstamp) + -rm -f src/pa/$(DEPDIR)/$(am__dirstamp) + -rm -f src/pa/$(am__dirstamp) + -rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/powerpc/$(am__dirstamp) + -rm -f src/s390/$(DEPDIR)/$(am__dirstamp) + -rm -f src/s390/$(am__dirstamp) + -rm -f src/sh/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sh/$(am__dirstamp) + -rm -f src/sh64/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sh64/$(am__dirstamp) + -rm -f src/sparc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sparc/$(am__dirstamp) + -rm -f src/x86/$(DEPDIR)/$(am__dirstamp) + -rm -f src/x86/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-aminfo clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: $(DVIS) + +html: html-recursive + +html-am: $(HTMLS) + +info: info-recursive + +info-am: $(INFO_DEPS) + +install-data-am: install-info-am install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: $(DVIS) + @$(NORMAL_INSTALL) + test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)" + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ + done +install-exec-am: install-libLTLIBRARIES + +install-html-am: $(HTMLS) + @$(NORMAL_INSTALL) + test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)" + @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__strip_dir) \ + if test -d "$$d$$p"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ + echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ + $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ + else \ + list2="$$list2 $$d$$p"; \ + fi; \ + done; \ + test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done; } +install-info: install-info-recursive + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ + for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ + $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ + if test -f $$ifile; then \ + echo "$$ifile"; \ + else : ; fi; \ + done; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done + @$(POST_INSTALL) + @if (install-info --version && \ + install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ + install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ + done; \ + else : ; fi +install-man: + +install-pdf-am: $(PDFS) + @$(NORMAL_INSTALL) + test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)" + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done +install-ps: install-ps-recursive + +install-ps-am: $(PSS) + @$(NORMAL_INSTALL) + test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)" + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-aminfo mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool mostlyclean-vti + +pdf: pdf-recursive + +pdf-am: $(PDFS) + +ps: ps-recursive + +ps-am: $(PSS) + +uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ + uninstall-libLTLIBRARIES uninstall-pdf-am \ + uninstall-pkgconfigDATA uninstall-ps-am + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-aminfo \ + clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstLTLIBRARIES ctags ctags-recursive dist dist-all \ + dist-bzip2 dist-gzip dist-info dist-lzma dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-pdf install-pdf-am install-pkgconfigDATA \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-aminfo maintainer-clean-generic \ + maintainer-clean-vti mostlyclean mostlyclean-aminfo \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + mostlyclean-vti pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-dvi-am uninstall-html-am \ + uninstall-info-am uninstall-libLTLIBRARIES uninstall-pdf-am \ + uninstall-pkgconfigDATA uninstall-ps-am + + +# No install-html or install-pdf support in automake yet +.PHONY: install-html install-pdf +install-html: +install-pdf: + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/config.log b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/config.log new file mode 100644 index 0000000..f7a28e2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/config.log @@ -0,0 +1,1144 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by libffi configure 3.0.10, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure --disable-static --with-pic=yes --disable-dependency-tracking --host=x86_64-apple-darwin + +## --------- ## +## Platform. ## +## --------- ## + +hostname = test2.allow2.com +uname -m = x86_64 +uname -r = 17.3.0 +uname -s = Darwin +uname -v = Darwin Kernel Version 17.3.0: Thu Nov 9 18:09:22 PST 2017; root:xnu-4570.31.3~1/RELEASE_X86_64 + +/usr/bin/uname -p = i386 +/bin/uname -X = unknown + +/bin/arch = unknown +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = Mach kernel version: + Darwin Kernel Version 17.3.0: Thu Nov 9 18:09:22 PST 2017; root:xnu-4570.31.3~1/RELEASE_X86_64 +Kernel configured for up to 8 processors. +4 processors are physically available. +8 processors are logically available. +Processor type: i486 (Intel 80486) +Processors active: 0 1 2 3 4 5 6 7 +Primary memory available: 12.00 gigabytes +Default processor set: 561 tasks, 3373 threads, 8 processors +Load average: 4.24, Mach factor: 3.75 +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /Users/andrew/.nvm/versions/node/v9.2.0/bin +PATH: /Users/andrew/google-cloud-sdk/bin +PATH: /Users/andrew/Library/Python/2.7/bin +PATH: /usr/local/bin/mongo +PATH: /usr/local/mysql/bin +PATH: /usr/local/bin +PATH: /usr/bin +PATH: /bin +PATH: /usr/sbin +PATH: /sbin +PATH: /usr/local/go/bin +PATH: /opt/X11/bin +PATH: /usr/local/apache-maven-2.2.1/bin + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:2550: checking build system type +configure:2564: result: x86_64-apple-darwin17.3.0 +configure:2584: checking host system type +configure:2597: result: x86_64-apple-darwin +configure:2617: checking target system type +configure:2630: result: x86_64-apple-darwin +configure:2722: checking for gsed +configure:2753: result: sed +configure:2781: checking for a BSD-compatible install +configure:2849: result: /usr/bin/install -c +configure:2860: checking whether build environment is sane +configure:2910: result: yes +configure:2956: checking for x86_64-apple-darwin-strip +configure:2986: result: no +configure:2996: checking for strip +configure:3012: found /usr/bin/strip +configure:3023: result: strip +configure:3048: checking for a thread-safe mkdir -p +configure:3087: result: /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +configure:3100: checking for gawk +configure:3130: result: no +configure:3100: checking for mawk +configure:3130: result: no +configure:3100: checking for nawk +configure:3130: result: no +configure:3100: checking for awk +configure:3116: found /usr/bin/awk +configure:3127: result: awk +configure:3138: checking whether make sets $(MAKE) +configure:3160: result: yes +configure:3259: checking for x86_64-apple-darwin-gcc +configure:3286: result: xcrun clang +configure:3555: checking for C compiler version +configure:3564: xcrun clang --version >&5 +Apple LLVM version 9.0.0 (clang-900.0.39.2) +Target: x86_64-apple-darwin17.3.0 +Thread model: posix +InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin +configure:3575: $? = 0 +configure:3564: xcrun clang -v >&5 +Apple LLVM version 9.0.0 (clang-900.0.39.2) +Target: x86_64-apple-darwin17.3.0 +Thread model: posix +InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin +configure:3575: $? = 0 +configure:3564: xcrun clang -V >&5 +clang: error: argument to '-V' is missing (expected 1 value) +clang: error: no input files +configure:3575: $? = 1 +configure:3564: xcrun clang -qversion >&5 +clang: error: unknown argument: '-qversion' +clang: error: no input files +configure:3575: $? = 1 +configure:3595: checking whether the C compiler works +configure:3617: xcrun clang -arch x86_64 -arch x86_64 conftest.c >&5 +configure:3621: $? = 0 +configure:3669: result: yes +configure:3672: checking for C compiler default output file name +configure:3674: result: a.out +configure:3680: checking for suffix of executables +configure:3687: xcrun clang -o conftest -arch x86_64 -arch x86_64 conftest.c >&5 +configure:3691: $? = 0 +configure:3713: result: +configure:3735: checking whether we are cross compiling +configure:3743: xcrun clang -o conftest -arch x86_64 -arch x86_64 conftest.c >&5 +configure:3747: $? = 0 +configure:3754: ./conftest +configure:3758: $? = 0 +configure:3773: result: no +configure:3778: checking for suffix of object files +configure:3800: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:3804: $? = 0 +configure:3825: result: o +configure:3829: checking whether we are using the GNU C compiler +configure:3848: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:3848: $? = 0 +configure:3857: result: yes +configure:3866: checking whether xcrun clang accepts -g +configure:3886: xcrun clang -c -g conftest.c >&5 +configure:3886: $? = 0 +configure:3927: result: yes +configure:3944: checking for xcrun clang option to accept ISO C89 +configure:4008: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:4008: $? = 0 +configure:4021: result: none needed +configure:4052: checking for style of include used by make +configure:4080: result: GNU +configure:4105: checking dependency style of xcrun clang +configure:4215: result: none +configure:4245: checking dependency style of xcrun clang +configure:4353: result: none +configure:4369: checking whether xcrun clang and cc understand -c and -o together +configure:4400: xcrun clang -c conftest.c -o conftest2.o >&5 +configure:4404: $? = 0 +configure:4410: xcrun clang -c conftest.c -o conftest2.o >&5 +configure:4414: $? = 0 +configure:4425: cc -c conftest.c >&5 +configure:4429: $? = 0 +configure:4437: cc -c conftest.c -o conftest2.o >&5 +configure:4441: $? = 0 +configure:4447: cc -c conftest.c -o conftest2.o >&5 +configure:4451: $? = 0 +configure:4469: result: yes +configure:4540: checking how to print strings +configure:4567: result: printf +configure:4588: checking for a sed that does not truncate output +configure:4652: result: /usr/bin/sed +configure:4670: checking for grep that handles long lines and -e +configure:4728: result: /usr/bin/grep +configure:4733: checking for egrep +configure:4795: result: /usr/bin/grep -E +configure:4800: checking for fgrep +configure:4862: result: /usr/bin/grep -F +configure:4897: checking for ld used by xcrun clang +configure:4964: result: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +configure:4971: checking if the linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) is GNU ld +configure:4986: result: no +configure:4998: checking for BSD- or MS-compatible name lister (nm) +configure:5047: result: no +configure:5061: checking for x86_64-apple-darwin-dumpbin +configure:5091: result: no +configure:5061: checking for x86_64-apple-darwin-link +configure:5091: result: no +configure:5105: checking for dumpbin +configure:5135: result: no +configure:5105: checking for link +configure:5121: found /bin/link +configure:5132: result: link -dump +configure:5177: checking the name lister (nm) interface +configure:5184: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:5187: nm "conftest.o" +configure:5190: output +0000000000000000 S _some_variable +configure:5197: result: BSD nm +configure:5200: checking whether ln -s works +configure:5204: result: yes +configure:5212: checking the maximum length of command line arguments +configure:5337: result: 196608 +configure:5354: checking whether the shell understands some XSI constructs +configure:5364: result: yes +configure:5368: checking whether the shell understands "+=" +configure:5374: result: yes +configure:5409: checking how to convert x86_64-apple-darwin17.3.0 file names to x86_64-apple-darwin format +configure:5449: result: func_convert_file_noop +configure:5456: checking how to convert x86_64-apple-darwin17.3.0 file names to toolchain format +configure:5476: result: func_convert_file_noop +configure:5483: checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld option to reload object files +configure:5490: result: -r +configure:5524: checking for x86_64-apple-darwin-objdump +configure:5554: result: no +configure:5564: checking for objdump +configure:5580: found /usr/bin/objdump +configure:5591: result: objdump +configure:5623: checking how to recognize dependent libraries +configure:5825: result: pass_all +configure:5870: checking for x86_64-apple-darwin-dlltool +configure:5900: result: no +configure:5910: checking for dlltool +configure:5940: result: no +configure:5970: checking how to associate runtime and link libraries +configure:5997: result: printf %s\n +configure:6014: checking for x86_64-apple-darwin-ar +configure:6044: result: no +configure:6058: checking for ar +configure:6074: found /usr/bin/ar +configure:6085: result: ar +configure:6122: checking for archiver @FILE support +configure:6139: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:6139: $? = 0 +configure:6142: ar cru libconftest.a @conftest.lst >&5 +ar: @conftest.lst: No such file or directory +configure:6145: $? = 1 +configure:6165: result: no +configure:6183: checking for x86_64-apple-darwin-strip +configure:6210: result: strip +configure:6282: checking for x86_64-apple-darwin-ranlib +configure:6312: result: no +configure:6322: checking for ranlib +configure:6338: found /usr/bin/ranlib +configure:6349: result: ranlib +configure:6451: checking command to parse nm output from xcrun clang object +configure:6570: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:6573: $? = 0 +configure:6577: nm conftest.o \| sed -n -e 's/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' | sed '/ __gnu_lto/d' \> conftest.nm +configure:6580: $? = 0 +cannot find nm_test_var in conftest.nm +configure:6570: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:6573: $? = 0 +configure:6577: nm conftest.o \| sed -n -e 's/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*_\([_A-Za-z][_A-Za-z0-9]*\)$/\1 _\2 \2/p' | sed '/ __gnu_lto/d' \> conftest.nm +configure:6580: $? = 0 +configure:6646: xcrun clang -o conftest -arch x86_64 -arch x86_64 conftest.c conftstm.o >&5 +configure:6649: $? = 0 +configure:6687: result: ok +configure:6724: checking for sysroot +configure:6754: result: no +configure:6957: checking for x86_64-apple-darwin-mt +configure:6987: result: no +configure:6997: checking for mt +configure:7027: result: no +configure:7047: checking if : is a manifest tool +configure:7053: : '-?' +configure:7061: result: no +configure:7077: checking for x86_64-apple-darwin-dsymutil +configure:7107: result: no +configure:7117: checking for dsymutil +configure:7133: found /usr/bin/dsymutil +configure:7144: result: dsymutil +configure:7169: checking for x86_64-apple-darwin-nmedit +configure:7199: result: no +configure:7209: checking for nmedit +configure:7225: found /usr/bin/nmedit +configure:7236: result: nmedit +configure:7261: checking for x86_64-apple-darwin-lipo +configure:7291: result: no +configure:7301: checking for lipo +configure:7317: found /usr/bin/lipo +configure:7328: result: lipo +configure:7353: checking for x86_64-apple-darwin-otool +configure:7383: result: no +configure:7393: checking for otool +configure:7409: found /usr/bin/otool +configure:7420: result: otool +configure:7445: checking for x86_64-apple-darwin-otool64 +configure:7475: result: no +configure:7485: checking for otool64 +configure:7515: result: no +configure:7560: checking for -single_module linker flag + xcrun clang -arch x86_64 -arch x86_64 -o libconftest.dylib -dynamiclib -Wl,-single_module conftest.c +configure:7587: result: yes +configure:7589: checking for -exported_symbols_list linker flag +configure:7609: xcrun clang -o conftest -arch x86_64 -arch x86_64 -Wl,-exported_symbols_list,conftest.sym conftest.c >&5 +configure:7609: $? = 0 +configure:7619: result: yes +configure:7621: checking for -force_load linker flag + xcrun clang -arch x86_64 -c -o conftest.o conftest.c +ar cru libconftest.a conftest.o +ranlib libconftest.a + xcrun clang -arch x86_64 -arch x86_64 -o conftest conftest.c -Wl,-force_load,./libconftest.a +configure:7651: result: yes +configure:7693: checking how to run the C preprocessor +configure:7724: xcrun clang -E conftest.c +configure:7724: $? = 0 +configure:7738: xcrun clang -E conftest.c +conftest.c:11:10: fatal error: 'ac_nonexistent.h' file not found +#include + ^~~~~~~~~~~~~~~~~~ +1 error generated. +configure:7738: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| /* end confdefs.h. */ +| #include +configure:7763: result: xcrun clang -E +configure:7783: xcrun clang -E conftest.c +configure:7783: $? = 0 +configure:7797: xcrun clang -E conftest.c +conftest.c:11:10: fatal error: 'ac_nonexistent.h' file not found +#include + ^~~~~~~~~~~~~~~~~~ +1 error generated. +configure:7797: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| /* end confdefs.h. */ +| #include +configure:7826: checking for ANSI C header files +configure:7846: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:7846: $? = 0 +configure:7919: xcrun clang -o conftest -arch x86_64 -arch x86_64 conftest.c >&5 +configure:7919: $? = 0 +configure:7919: ./conftest +configure:7919: $? = 0 +configure:7930: result: yes +configure:7943: checking for sys/types.h +configure:7943: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for sys/stat.h +configure:7943: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for stdlib.h +configure:7943: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for string.h +configure:7943: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for memory.h +configure:7943: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for strings.h +configure:7943: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for inttypes.h +configure:7943: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for stdint.h +configure:7943: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7943: checking for unistd.h +configure:7943: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:7943: $? = 0 +configure:7943: result: yes +configure:7957: checking for dlfcn.h +configure:7957: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:7957: $? = 0 +configure:7957: result: yes +configure:8144: checking for objdir +configure:8159: result: .libs +configure:8430: checking if xcrun clang supports -fno-rtti -fno-exceptions +configure:8448: xcrun clang -c -arch x86_64 -fno-rtti -fno-exceptions conftest.c >&5 +configure:8452: $? = 0 +configure:8465: result: yes +configure:8775: checking for xcrun clang option to produce PIC +configure:8782: result: -fno-common -DPIC +configure:8790: checking if xcrun clang PIC flag -fno-common -DPIC works +configure:8808: xcrun clang -c -arch x86_64 -fno-common -DPIC -DPIC conftest.c >&5 +configure:8812: $? = 0 +configure:8825: result: yes +configure:8854: checking if xcrun clang static flag -static works +configure:8882: result: no +configure:8897: checking if xcrun clang supports -c -o file.o +configure:8918: xcrun clang -c -arch x86_64 -o out/conftest2.o conftest.c >&5 +configure:8922: $? = 0 +configure:8944: result: yes +configure:8952: checking if xcrun clang supports -c -o file.o +configure:8999: result: yes +configure:9032: checking whether the xcrun clang linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) supports shared libraries +configure:10190: result: yes +configure:10435: checking dynamic linker characteristics +configure:11171: result: darwin dyld +configure:11278: checking how to hardcode library paths into programs +configure:11303: result: immediate +configure:11843: checking whether stripping libraries is possible +configure:11857: result: yes +configure:11883: checking if libtool supports shared libraries +configure:11885: result: yes +configure:11888: checking whether to build shared libraries +configure:11909: result: yes +configure:11912: checking whether to build static libraries +configure:11916: result: no +configure:11954: checking for C compiler vendor +configure:11978: xcrun clang -c -arch x86_64 conftest.c >&5 +conftest.c:29:7: error: use of undeclared identifier 'thisisanerror' + thisisanerror; + ^ +1 error generated. +configure:11978: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| #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_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__ICC) || defined(__ECC) || defined(__INTEL_COMPILER)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:11978: xcrun clang -c -arch x86_64 conftest.c >&5 +conftest.c:29:7: error: use of undeclared identifier 'thisisanerror' + thisisanerror; + ^ +1 error generated. +configure:11978: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| #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_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__xlc__) || defined(__xlC__) || defined(__IBMC__) || defined(__IBMCPP__)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:11978: xcrun clang -c -arch x86_64 conftest.c >&5 +conftest.c:29:7: error: use of undeclared identifier 'thisisanerror' + thisisanerror; + ^ +1 error generated. +configure:11978: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| #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_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__PATHCC__) || defined(__PATHSCALE__)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:11978: xcrun clang -c -arch x86_64 conftest.c >&5 +configure:11978: $? = 0 +configure:11985: result: clang +configure:12771: checking CFLAGS for maximum warnings +configure:12797: xcrun clang -c -arch x86_64 -pedantic -Wall conftest.c >&5 +configure:12797: $? = 0 +configure:12811: result: -Wall +configure:12824: : CFLAGS="$CFLAGS $ac_cv_cflags_warn_all" +configure:12827: $? = 0 +configure:12839: checking whether to enable maintainer-specific portions of Makefiles +configure:12848: result: no +configure:12864: checking sys/mman.h usability +configure:12864: xcrun clang -c -arch x86_64 -Wall -fexceptions conftest.c >&5 +configure:12864: $? = 0 +configure:12864: result: yes +configure:12864: checking sys/mman.h presence +configure:12864: xcrun clang -E conftest.c +configure:12864: $? = 0 +configure:12864: result: yes +configure:12864: checking for sys/mman.h +configure:12864: result: yes +configure:12876: checking for mmap +configure:12876: xcrun clang -o conftest -arch x86_64 -Wall -fexceptions -arch x86_64 conftest.c >&5 +configure:12876: $? = 0 +configure:12876: result: yes +configure:12886: checking for sys/mman.h +configure:12886: result: yes +configure:12894: checking for mmap +configure:12894: result: yes +configure:12907: checking whether read-only mmap of a plain file works +configure:12924: result: yes +configure:12926: checking whether mmap from /dev/zero works +configure:12948: result: no +configure:12952: checking for MAP_ANON(YMOUS) +configure:12975: xcrun clang -c -arch x86_64 -Wall -fexceptions conftest.c >&5 +conftest.c:36:5: warning: unused variable 'n' [-Wunused-variable] +int n = MAP_ANONYMOUS; + ^ +1 warning generated. +configure:12975: $? = 0 +configure:12982: result: yes +configure:12988: checking whether mmap with MAP_ANON(YMOUS) works +configure:13005: result: yes +configure:13398: checking for ANSI C header files +configure:13502: result: yes +configure:13512: checking for memcpy +configure:13512: xcrun clang -o conftest -arch x86_64 -Wall -fexceptions -arch x86_64 conftest.c >&5 +conftest.c:51:6: warning: incompatible redeclaration of library function 'memcpy' [-Wincompatible-library-redeclaration] +char memcpy (); + ^ +conftest.c:51:6: note: 'memcpy' is a builtin with type 'void *(void *, const void *, unsigned long)' +1 warning generated. +configure:13512: $? = 0 +configure:13512: result: yes +configure:13521: checking for size_t +configure:13521: xcrun clang -c -arch x86_64 -Wall -fexceptions conftest.c >&5 +configure:13521: $? = 0 +configure:13521: xcrun clang -c -arch x86_64 -Wall -fexceptions conftest.c >&5 +conftest.c:65:21: error: expected expression +if (sizeof ((size_t))) + ^ +1 error generated. +configure:13521: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| #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_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MMAP_FILE 1 +| #define HAVE_MMAP_ANON 1 +| #define STDC_HEADERS 1 +| #define HAVE_MEMCPY 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| if (sizeof ((size_t))) +| return 0; +| ; +| return 0; +| } +configure:13521: result: yes +configure:13534: checking for working alloca.h +configure:13551: xcrun clang -o conftest -arch x86_64 -Wall -fexceptions -arch x86_64 conftest.c >&5 +configure:13551: $? = 0 +configure:13559: result: yes +configure:13567: checking for alloca +configure:13604: xcrun clang -o conftest -arch x86_64 -Wall -fexceptions -arch x86_64 conftest.c >&5 +configure:13604: $? = 0 +configure:13612: result: yes +configure:13726: checking size of double +configure:13731: xcrun clang -o conftest -arch x86_64 -Wall -fexceptions -arch x86_64 conftest.c >&5 +configure:13731: $? = 0 +configure:13731: ./conftest +configure:13731: $? = 0 +configure:13745: result: 8 +configure:13759: checking size of long double +configure:13764: xcrun clang -o conftest -arch x86_64 -Wall -fexceptions -arch x86_64 conftest.c >&5 +configure:13764: $? = 0 +configure:13764: ./conftest +configure:13764: $? = 0 +configure:13778: result: 16 +configure:13803: checking whether byte ordering is bigendian +configure:13818: xcrun clang -c -arch x86_64 -Wall -fexceptions conftest.c >&5 +configure:13818: $? = 0 +configure:13863: xcrun clang -c -arch x86_64 -Wall -fexceptions conftest.c >&5 +configure:13863: $? = 0 +configure:13881: xcrun clang -c -arch x86_64 -Wall -fexceptions conftest.c >&5 +conftest.c:41:4: error: use of undeclared identifier 'not' + not big endian + ^ +1 error generated. +configure:13881: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.0.10" +| #define PACKAGE_STRING "libffi 3.0.10" +| #define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.0.10" +| #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_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MMAP_FILE 1 +| #define HAVE_MMAP_ANON 1 +| #define STDC_HEADERS 1 +| #define HAVE_MEMCPY 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_ALLOCA 1 +| #define SIZEOF_DOUBLE 8 +| #define SIZEOF_LONG_DOUBLE 16 +| #define HAVE_LONG_DOUBLE 1 +| /* end confdefs.h. */ +| #include +| #include +| +| int +| main () +| { +| #if BYTE_ORDER != BIG_ENDIAN +| not big endian +| #endif +| +| ; +| return 0; +| } +configure:14009: result: no +configure:14028: checking assembler .cfi pseudo-op support +configure:14046: xcrun clang -c -arch x86_64 -Wall -fexceptions conftest.c >&5 +configure:14046: $? = 0 +configure:14054: result: yes +configure:14335: checking whether .eh_frame section should be read-only +configure:14354: result: no +configure:14369: checking for __attribute__((visibility("hidden"))) +configure:14378: xcrun clang -Werror -S conftest.c -o conftest.s 1>&5 +configure:14381: $? = 0 +configure:14390: result: no +configure:14750: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by libffi config.status 3.0.10, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on test2.allow2.com + +config.status:1204: creating include/Makefile +config.status:1204: creating include/ffi.h +config.status:1204: creating Makefile +config.status:1204: creating testsuite/Makefile +config.status:1204: creating man/Makefile +config.status:1204: creating libffi.pc +config.status:1204: creating fficonfig.h +config.status:1430: linking /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffitarget.h to include/ffitarget.h +config.status:1449: executing buildir commands +config.status:1462: skipping top_srcdir/Makefile - not created +config.status:1449: executing depfiles commands +config.status:1449: executing libtool commands +config.status:1449: executing include commands +config.status:1449: executing src commands + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_build=x86_64-apple-darwin17.3.0 +ac_cv_c_bigendian=no +ac_cv_c_compiler_gnu=yes +ac_cv_cflags_warn_all=-Wall +ac_cv_decl_map_anon=yes +ac_cv_env_CCASFLAGS_set= +ac_cv_env_CCASFLAGS_value= +ac_cv_env_CCAS_set= +ac_cv_env_CCAS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set=set +ac_cv_env_host_alias_value=x86_64-apple-darwin +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_func_alloca_works=yes +ac_cv_func_memcpy=yes +ac_cv_func_mmap=yes +ac_cv_func_mmap_anon=yes +ac_cv_func_mmap_dev_zero=no +ac_cv_func_mmap_file=yes +ac_cv_header_dlfcn_h=yes +ac_cv_header_inttypes_h=yes +ac_cv_header_memory_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_sys_mman_h=yes +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_unistd_h=yes +ac_cv_host=x86_64-apple-darwin +ac_cv_objext=o +ac_cv_path_EGREP='/usr/bin/grep -E' +ac_cv_path_FGREP='/usr/bin/grep -F' +ac_cv_path_GREP=/usr/bin/grep +ac_cv_path_SED=/usr/bin/sed +ac_cv_path_ax_enable_builddir_sed=sed +ac_cv_path_install='/usr/bin/install -c' +ac_cv_prog_AWK=awk +ac_cv_prog_CC=' xcrun clang' +ac_cv_prog_CPP=' xcrun clang -E' +ac_cv_prog_STRIP=strip +ac_cv_prog_ac_ct_AR=ar +ac_cv_prog_ac_ct_DSYMUTIL=dsymutil +ac_cv_prog_ac_ct_DUMPBIN='link -dump' +ac_cv_prog_ac_ct_LIPO=lipo +ac_cv_prog_ac_ct_NMEDIT=nmedit +ac_cv_prog_ac_ct_OBJDUMP=objdump +ac_cv_prog_ac_ct_OTOOL=otool +ac_cv_prog_ac_ct_RANLIB=ranlib +ac_cv_prog_ac_ct_STRIP=strip +ac_cv_prog_cc_c89= +ac_cv_prog_cc_g=yes +ac_cv_prog_cc_xcrun_c_o=yes +ac_cv_prog_make_make_set=yes +ac_cv_sizeof_double=8 +ac_cv_sizeof_long_double=16 +ac_cv_target=x86_64-apple-darwin +ac_cv_type_size_t=yes +ac_cv_working_alloca_h=yes +am_cv_CCAS_dependencies_compiler_type=none +am_cv_CC_dependencies_compiler_type=none +ax_cv_c_compiler_vendor=clang +libffi_cv_as_cfi_pseudo_op=yes +libffi_cv_hidden_visibility_attribute=no +libffi_cv_ro_eh_frame=no +lt_cv_apple_cc_single_mod=yes +lt_cv_ar_at_file=no +lt_cv_deplibs_check_method=pass_all +lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_ld_exported_symbols_list=yes +lt_cv_ld_force_load=yes +lt_cv_ld_reload_flag=-r +lt_cv_nm_interface='BSD nm' +lt_cv_objdir=.libs +lt_cv_path_LD=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +lt_cv_path_NM=no +lt_cv_path_mainfest_tool=no +lt_cv_prog_compiler_c_o=yes +lt_cv_prog_compiler_pic='-fno-common -DPIC' +lt_cv_prog_compiler_pic_works=yes +lt_cv_prog_compiler_rtti_exceptions=yes +lt_cv_prog_compiler_static_works=no +lt_cv_prog_gnu_ld=no +lt_cv_sharedlib_from_linklib_cmd='printf %s\n' +lt_cv_sys_global_symbol_pipe='sed -n -e '\''s/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*_\([_A-Za-z][_A-Za-z0-9]*\)$/\1 _\2 \2/p'\'' | sed '\''/ __gnu_lto/d'\''' +lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \([^ ]*\)$/ {"\2", (void *) \&\2},/p'\''' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \(lib[^ ]*\)$/ {"\2", (void *) \&\2},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \([^ ]*\)$/ {"lib\2", (void *) \&\2},/p'\''' +lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^T .* \(.*\)$/extern int \1();/p'\'' -e '\''s/^[BCDEGRST]* .* \(.*\)$/extern char \1;/p'\''' +lt_cv_sys_max_cmd_len=196608 +lt_cv_to_host_file_cmd=func_convert_file_noop +lt_cv_to_tool_file_cmd=func_convert_file_noop + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +ACLOCAL='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run aclocal-1.11' +ALLOCA='' +ALPHA_FALSE='' +ALPHA_TRUE='#' +AMDEPBACKSLASH='' +AMDEP_FALSE='' +AMDEP_TRUE='#' +AMTAR='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run tar' +AM_LTLDFLAGS='' +AM_RUNTESTFLAGS='' +AR='ar' +ARM_FALSE='' +ARM_TRUE='#' +AUTOCONF='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoconf' +AUTOHEADER='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoheader' +AUTOMAKE='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run automake-1.11' +AVR32_FALSE='' +AVR32_TRUE='#' +AWK='awk' +CC=' xcrun clang' +CCAS=' xcrun clang' +CCASDEPMODE='depmode=none' +CCASFLAGS='-arch x86_64 ' +CCDEPMODE='depmode=none' +CFLAGS='-arch x86_64 -Wall -fexceptions' +CPP=' xcrun clang -E' +CPPFLAGS='' +CYGPATH_W='echo' +DEFS='-DHAVE_CONFIG_H' +DEPDIR='.deps' +DLLTOOL='false' +DSYMUTIL='dsymutil' +DUMPBIN=':' +ECHO_C='\c' +ECHO_N='' +ECHO_T='' +EGREP='/usr/bin/grep -E' +EXEEXT='' +FFI_DEBUG_FALSE='' +FFI_DEBUG_TRUE='#' +FFI_EXEC_TRAMPOLINE_TABLE='0' +FFI_EXEC_TRAMPOLINE_TABLE_FALSE='' +FFI_EXEC_TRAMPOLINE_TABLE_TRUE='#' +FGREP='/usr/bin/grep -F' +FRV_FALSE='' +FRV_TRUE='#' +GREP='/usr/bin/grep' +HAVE_LONG_DOUBLE='1' +IA64_FALSE='' +IA64_TRUE='#' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL}' +INSTALL_SCRIPT='${INSTALL}' +INSTALL_STRIP_PROGRAM='$(install_sh) -c -s' +LD='/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld' +LDFLAGS='-arch x86_64' +LIBFFI_CRIS_FALSE='' +LIBFFI_CRIS_TRUE='#' +LIBOBJS='' +LIBS='' +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +LIPO='lipo' +LN_S='ln -s' +LTLIBOBJS='' +M32R_FALSE='' +M32R_TRUE='#' +M68K_FALSE='' +M68K_TRUE='#' +MAINT='#' +MAINTAINER_MODE_FALSE='' +MAINTAINER_MODE_TRUE='#' +MAKEINFO='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo' +MANIFEST_TOOL=':' +MIPS_FALSE='' +MIPS_TRUE='#' +MKDIR_P='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d' +MOXIE_FALSE='' +MOXIE_TRUE='#' +NM='nm' +NMEDIT='nmedit' +OBJDUMP='objdump' +OBJEXT='o' +OTOOL64=':' +OTOOL='otool' +PA64_HPUX_FALSE='' +PA64_HPUX_TRUE='#' +PACKAGE='libffi' +PACKAGE_BUGREPORT='http://sourceware.org/libffi.html' +PACKAGE_NAME='libffi' +PACKAGE_STRING='libffi 3.0.10' +PACKAGE_TARNAME='libffi' +PACKAGE_URL='' +PACKAGE_VERSION='3.0.10' +PATH_SEPARATOR=':' +PA_HPUX_FALSE='' +PA_HPUX_TRUE='#' +PA_LINUX_FALSE='' +PA_LINUX_TRUE='#' +POWERPC_AIX_FALSE='' +POWERPC_AIX_TRUE='#' +POWERPC_DARWIN_FALSE='' +POWERPC_DARWIN_TRUE='#' +POWERPC_FALSE='' +POWERPC_FREEBSD_FALSE='' +POWERPC_FREEBSD_TRUE='#' +POWERPC_TRUE='#' +PRTDIAG='' +RANLIB='ranlib' +S390_FALSE='' +S390_TRUE='#' +SED='/usr/bin/sed' +SET_MAKE='' +SH64_FALSE='' +SH64_TRUE='#' +SHELL='/bin/sh' +SH_FALSE='' +SH_TRUE='#' +SPARC_FALSE='' +SPARC_TRUE='#' +STRIP='strip' +TARGET='X86_DARWIN' +TARGETDIR='x86' +TESTSUBDIR_FALSE='#' +TESTSUBDIR_TRUE='' +VERSION='3.0.10' +X86_64_FALSE='' +X86_64_TRUE='#' +X86_DARWIN_FALSE='#' +X86_DARWIN_TRUE='' +X86_FALSE='' +X86_FREEBSD_FALSE='' +X86_FREEBSD_TRUE='#' +X86_TRUE='#' +X86_WIN32_FALSE='' +X86_WIN32_TRUE='#' +X86_WIN64_FALSE='' +X86_WIN64_TRUE='#' +ac_ct_AR='ar' +ac_ct_CC='' +ac_ct_DUMPBIN='link -dump' +am__EXEEXT_FALSE='' +am__EXEEXT_TRUE='#' +am__fastdepCCAS_FALSE='' +am__fastdepCCAS_TRUE='#' +am__fastdepCC_FALSE='' +am__fastdepCC_TRUE='#' +am__include='include' +am__isrc=' -I$(srcdir)' +am__leading_dot='.' +am__quote='' +am__tar='${AMTAR} chof - "$$tardir"' +am__untar='${AMTAR} xf -' +ax_enable_builddir_sed='sed' +bindir='${exec_prefix}/bin' +build='x86_64-apple-darwin17.3.0' +build_alias='' +build_cpu='x86_64' +build_os='darwin17.3.0' +build_vendor='apple' +datadir='${datarootdir}' +datarootdir='${prefix}/share' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +dvidir='${docdir}' +exec_prefix='${prefix}' +host='x86_64-apple-darwin' +host_alias='x86_64-apple-darwin' +host_cpu='x86_64' +host_os='darwin' +host_vendor='apple' +htmldir='${docdir}' +includedir='${prefix}/include' +infodir='${datarootdir}/info' +install_sh='${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh' +libdir='${exec_prefix}/lib' +libexecdir='${exec_prefix}/libexec' +localedir='${datarootdir}/locale' +localstatedir='${prefix}/var' +mandir='${datarootdir}/man' +mkdir_p='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d' +oldincludedir='/usr/include' +pdfdir='${docdir}' +prefix='/usr/local' +program_transform_name='s,x,x,' +psdir='${docdir}' +sbindir='${exec_prefix}/sbin' +sharedstatedir='${prefix}/com' +sys_symbol_underscore='' +sysconfdir='${prefix}/etc' +target='x86_64-apple-darwin' +target_alias='x86_64-apple-darwin' +target_cpu='x86_64' +target_os='darwin' +target_vendor='apple' +toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +toolexeclibdir='$(libdir)/' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +/* confdefs.h */ +#define PACKAGE_NAME "libffi" +#define PACKAGE_TARNAME "libffi" +#define PACKAGE_VERSION "3.0.10" +#define PACKAGE_STRING "libffi 3.0.10" +#define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" +#define PACKAGE_URL "" +#define PACKAGE "libffi" +#define VERSION "3.0.10" +#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_DLFCN_H 1 +#define LT_OBJDIR ".libs/" +#define HAVE_SYS_MMAN_H 1 +#define HAVE_MMAP 1 +#define HAVE_MMAP_FILE 1 +#define HAVE_MMAP_ANON 1 +#define STDC_HEADERS 1 +#define HAVE_MEMCPY 1 +#define HAVE_ALLOCA_H 1 +#define HAVE_ALLOCA 1 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_LONG_DOUBLE 16 +#define HAVE_LONG_DOUBLE 1 +#define HAVE_AS_CFI_PSEUDO_OP 1 +#define EH_FRAME_FLAGS "aw" + +configure: exit 0 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/config.status b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/config.status new file mode 100755 index 0000000..8894936 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/config.status @@ -0,0 +1,2336 @@ +#! /bin/sh +# Generated by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by libffi $as_me 3.0.10, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +# Files that config.status was made for. +config_files=" include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc" +config_headers=" fficonfig.h" +config_links=" include/ffitarget.h:src/x86/ffitarget.h" +config_commands=" buildir depfiles libtool include src" + +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration links: +$config_links + +Configuration commands: +$config_commands + +Report bugs to ." + +ac_cs_config="'--disable-static' '--with-pic=yes' '--disable-dependency-tracking' '--host=x86_64-apple-darwin' 'host_alias=x86_64-apple-darwin'" +ac_cs_version="\ +libffi config.status 3.0.10 +configured by /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure, generated by GNU Autoconf 2.68, + with options \"$ac_cs_config\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64' +srcdir='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi' +INSTALL='/usr/bin/install -c' +MKDIR_P='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d' +AWK='awk' +test -n "$AWK" || AWK=awk +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +if $ac_cs_recheck; then + set X '/bin/sh' '/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure' '--disable-static' '--with-pic=yes' '--disable-dependency-tracking' '--host=x86_64-apple-darwin' 'host_alias=x86_64-apple-darwin' $ac_configure_extra_args --no-create --no-recursion + shift + $as_echo "running CONFIG_SHELL=/bin/sh $*" >&6 + CONFIG_SHELL='/bin/sh' + export CONFIG_SHELL + exec "$@" +fi + +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +# +# INIT-COMMANDS +# +ax_enable_builddir_srcdir="/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi" # /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +ax_enable_builddir_host="" # / x86_64-apple-darwin +ax_enable_builddir_version="3.0.10" # 3.0.10 +ax_enable_builddir_package="libffi" # libffi +ax_enable_builddir_auxdir="/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi" # +ax_enable_builddir_sed="sed" # /usr/bin/sed +ax_enable_builddir="." # + +AMDEP_TRUE="#" ac_aux_dir="/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +double_quote_subst='s/\(["`\\]\)/\\\1/g' +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +macro_version='2.4' +macro_revision='1.3293' +enable_shared='yes' +enable_static='no' +pic_mode='yes' +enable_fast_install='needless' +SHELL='/bin/sh' +ECHO='printf %s\n' +host_alias='x86_64-apple-darwin' +host='x86_64-apple-darwin' +host_os='darwin' +build_alias='' +build='x86_64-apple-darwin17.3.0' +build_os='darwin17.3.0' +SED='/usr/bin/sed' +Xsed='/usr/bin/sed -e 1s/^X//' +GREP='/usr/bin/grep' +EGREP='/usr/bin/grep -E' +FGREP='/usr/bin/grep -F' +LD='/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld' +NM='nm' +LN_S='ln -s' +max_cmd_len='196608' +ac_objext='o' +exeext='' +lt_unset='unset' +lt_SP2NL='tr \040 \012' +lt_NL2SP='tr \015\012 \040\040' +lt_cv_to_host_file_cmd='func_convert_file_noop' +lt_cv_to_tool_file_cmd='func_convert_file_noop' +reload_flag=' -r' +reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' +OBJDUMP='objdump' +deplibs_check_method='pass_all' +file_magic_cmd='$MAGIC_CMD' +file_magic_glob='' +want_nocaseglob='no' +DLLTOOL='false' +sharedlib_from_linklib_cmd='printf %s\n' +AR='ar' +AR_FLAGS='cru' +archiver_list_spec='' +STRIP='strip' +RANLIB='ranlib' +old_postinstall_cmds='chmod 644 $oldlib~$RANLIB $oldlib' +old_postuninstall_cmds='' +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs~$RANLIB $oldlib' +lock_old_archive_extraction='yes' +CC=' xcrun clang' +CFLAGS='-arch x86_64 -Wall -fexceptions' +compiler=' xcrun clang' +GCC='yes' +lt_cv_sys_global_symbol_pipe='sed -n -e '\''s/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*_\([_A-Za-z][_A-Za-z0-9]*\)$/\1 _\2 \2/p'\'' | sed '\''/ __gnu_lto/d'\''' +lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^T .* \(.*\)$/extern int \1();/p'\'' -e '\''s/^[BCDEGRST]* .* \(.*\)$/extern char \1;/p'\''' +lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \([^ ]*\)$/ {"\2", (void *) \&\2},/p'\''' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \(lib[^ ]*\)$/ {"\2", (void *) \&\2},/p'\'' -e '\''s/^[BCDEGRST]* \([^ ]*\) \([^ ]*\)$/ {"lib\2", (void *) \&\2},/p'\''' +nm_file_list_spec='' +lt_sysroot='' +objdir='.libs' +MAGIC_CMD='file' +lt_prog_compiler_no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' +lt_prog_compiler_pic=' -fno-common -DPIC' +lt_prog_compiler_wl='-Wl,' +lt_prog_compiler_static='' +lt_cv_prog_compiler_c_o='yes' +need_locks='no' +MANIFEST_TOOL=':' +DSYMUTIL='dsymutil' +NMEDIT='nmedit' +LIPO='lipo' +OTOOL='otool' +OTOOL64=':' +libext='a' +shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +extract_expsyms_cmds='' +archive_cmds_need_lc='no' +enable_shared_with_static_runtimes='no' +export_dynamic_flag_spec='' +whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' +compiler_needs_object='no' +old_archive_from_new_cmds='' +old_archive_from_expsyms_cmds='' +archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring $single_module' +archive_expsym_cmds='sed '\''s,^,_,'\'' < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring $single_module ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' +module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs $compiler_flags' +module_expsym_cmds='sed -e '\''s,^,_,'\'' < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs $compiler_flags ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' +with_gnu_ld='no' +allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' +no_undefined_flag='' +hardcode_libdir_flag_spec='' +hardcode_libdir_flag_spec_ld='' +hardcode_libdir_separator='' +hardcode_direct='no' +hardcode_direct_absolute='no' +hardcode_minus_L='no' +hardcode_shlibpath_var='unsupported' +hardcode_automatic='yes' +inherit_rpath='no' +link_all_deplibs='yes' +always_export_symbols='no' +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' +include_expsyms='' +prelink_cmds='' +postlink_cmds='' +file_list_spec='' +variables_saved_for_relink='PATH DYLD_LIBRARY_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH' +need_lib_prefix='no' +need_version='no' +version_type='darwin' +runpath_var='' +shlibpath_var='DYLD_LIBRARY_PATH' +shlibpath_overrides_runpath='yes' +libname_spec='lib$name' +library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' +soname_spec='${libname}${release}${major}$shared_ext' +install_override_mode='' +postinstall_cmds='' +postuninstall_cmds='' +finish_cmds='' +finish_eval='' +hardcode_into_libs='no' +sys_lib_search_path_spec='/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0 /usr/local/lib' +sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' +hardcode_action='immediate' +enable_dlopen='unknown' +enable_dlopen_self='unknown' +enable_dlopen_self_static='unknown' +old_striplib='strip -S' +striplib='strip -x' + +LTCC=' xcrun clang' +LTCFLAGS='-arch x86_64 ' +compiler=' xcrun clang' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL ECHO SED GREP EGREP FGREP LD NM LN_S lt_SP2NL lt_NL2SP reload_flag OBJDUMP deplibs_check_method file_magic_cmd file_magic_glob want_nocaseglob DLLTOOL sharedlib_from_linklib_cmd AR AR_FLAGS archiver_list_spec STRIP RANLIB CC CFLAGS compiler lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl lt_cv_sys_global_symbol_to_c_name_address lt_cv_sys_global_symbol_to_c_name_address_lib_prefix nm_file_list_spec lt_prog_compiler_no_builtin_flag lt_prog_compiler_pic lt_prog_compiler_wl lt_prog_compiler_static lt_cv_prog_compiler_c_o need_locks MANIFEST_TOOL DSYMUTIL NMEDIT LIPO OTOOL OTOOL64 shrext_cmds export_dynamic_flag_spec whole_archive_flag_spec compiler_needs_object with_gnu_ld allow_undefined_flag no_undefined_flag hardcode_libdir_flag_spec hardcode_libdir_flag_spec_ld hardcode_libdir_separator exclude_expsyms include_expsyms file_list_spec variables_saved_for_relink libname_spec library_names_spec soname_spec install_override_mode finish_eval old_striplib striplib; do + case `eval \\$ECHO \\""\\$$var"\\"` in + *[\\\`\"\$]*) + eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED \"\$sed_quote_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\$$var\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds old_postinstall_cmds old_postuninstall_cmds old_archive_cmds extract_expsyms_cmds old_archive_from_new_cmds old_archive_from_expsyms_cmds archive_cmds archive_expsym_cmds module_cmds module_expsym_cmds export_symbols_cmds prelink_cmds postlink_cmds postinstall_cmds postuninstall_cmds finish_cmds sys_lib_search_path_spec sys_lib_dlsearch_path_spec; do + case `eval \\$ECHO \\""\\$$var"\\"` in + *[\\\`\"\$]*) + eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\$$var\\\"" + ;; + esac +done + +ac_aux_dir='/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi' +xsi_shell='yes' +lt_shell_append='yes' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='libffi' + VERSION='3.0.10' + TIMESTAMP='' + RM='rm -f' + ofile='libtool' + + + +TARGETDIR="x86" + + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "fficonfig.h") CONFIG_HEADERS="$CONFIG_HEADERS fficonfig.h" ;; + "buildir") CONFIG_COMMANDS="$CONFIG_COMMANDS buildir" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "include") CONFIG_COMMANDS="$CONFIG_COMMANDS include" ;; + "src") CONFIG_COMMANDS="$CONFIG_COMMANDS src" ;; + "include/ffitarget.h") CONFIG_LINKS="$CONFIG_LINKS include/ffitarget.h:src/$TARGETDIR/ffitarget.h" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "include/ffi.h") CONFIG_FILES="$CONFIG_FILES include/ffi.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;; + "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; + "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +cat >>"$ac_tmp/subs1.awk" <<\_ACAWK && +S["am__EXEEXT_FALSE"]="" +S["am__EXEEXT_TRUE"]="#" +S["LTLIBOBJS"]="" +S["LIBOBJS"]="" +S["toolexeclibdir"]="$(libdir)/" +S["toolexecdir"]="$(libdir)/gcc-lib/$(target_alias)" +S["FFI_DEBUG_FALSE"]="" +S["FFI_DEBUG_TRUE"]="#" +S["TARGETDIR"]="x86" +S["TARGET"]="X86_DARWIN" +S["FFI_EXEC_TRAMPOLINE_TABLE"]="0" +S["FFI_EXEC_TRAMPOLINE_TABLE_FALSE"]="" +S["FFI_EXEC_TRAMPOLINE_TABLE_TRUE"]="#" +S["sys_symbol_underscore"]="" +S["HAVE_LONG_DOUBLE"]="1" +S["ALLOCA"]="" +S["PA64_HPUX_FALSE"]="" +S["PA64_HPUX_TRUE"]="#" +S["PA_HPUX_FALSE"]="" +S["PA_HPUX_TRUE"]="#" +S["PA_LINUX_FALSE"]="" +S["PA_LINUX_TRUE"]="#" +S["SH64_FALSE"]="" +S["SH64_TRUE"]="#" +S["SH_FALSE"]="" +S["SH_TRUE"]="#" +S["X86_64_FALSE"]="" +S["X86_64_TRUE"]="#" +S["S390_FALSE"]="" +S["S390_TRUE"]="#" +S["FRV_FALSE"]="" +S["FRV_TRUE"]="#" +S["LIBFFI_CRIS_FALSE"]="" +S["LIBFFI_CRIS_TRUE"]="#" +S["AVR32_FALSE"]="" +S["AVR32_TRUE"]="#" +S["ARM_FALSE"]="" +S["ARM_TRUE"]="#" +S["POWERPC_FREEBSD_FALSE"]="" +S["POWERPC_FREEBSD_TRUE"]="#" +S["POWERPC_DARWIN_FALSE"]="" +S["POWERPC_DARWIN_TRUE"]="#" +S["POWERPC_AIX_FALSE"]="" +S["POWERPC_AIX_TRUE"]="#" +S["POWERPC_FALSE"]="" +S["POWERPC_TRUE"]="#" +S["MOXIE_FALSE"]="" +S["MOXIE_TRUE"]="#" +S["M68K_FALSE"]="" +S["M68K_TRUE"]="#" +S["M32R_FALSE"]="" +S["M32R_TRUE"]="#" +S["IA64_FALSE"]="" +S["IA64_TRUE"]="#" +S["ALPHA_FALSE"]="" +S["ALPHA_TRUE"]="#" +S["X86_DARWIN_FALSE"]="#" +S["X86_DARWIN_TRUE"]="" +S["X86_WIN64_FALSE"]="" +S["X86_WIN64_TRUE"]="#" +S["X86_WIN32_FALSE"]="" +S["X86_WIN32_TRUE"]="#" +S["X86_FREEBSD_FALSE"]="" +S["X86_FREEBSD_TRUE"]="#" +S["X86_FALSE"]="" +S["X86_TRUE"]="#" +S["SPARC_FALSE"]="" +S["SPARC_TRUE"]="#" +S["MIPS_FALSE"]="" +S["MIPS_TRUE"]="#" +S["AM_LTLDFLAGS"]="" +S["AM_RUNTESTFLAGS"]="" +S["TESTSUBDIR_FALSE"]="#" +S["TESTSUBDIR_TRUE"]="" +S["MAINT"]="#" +S["MAINTAINER_MODE_FALSE"]="" +S["MAINTAINER_MODE_TRUE"]="#" +S["PRTDIAG"]="" +S["CPP"]=" xcrun clang -E" +S["OTOOL64"]=":" +S["OTOOL"]="otool" +S["LIPO"]="lipo" +S["NMEDIT"]="nmedit" +S["DSYMUTIL"]="dsymutil" +S["MANIFEST_TOOL"]=":" +S["RANLIB"]="ranlib" +S["ac_ct_AR"]="ar" +S["AR"]="ar" +S["DLLTOOL"]="false" +S["OBJDUMP"]="objdump" +S["LN_S"]="ln -s" +S["NM"]="nm" +S["ac_ct_DUMPBIN"]="link -dump" +S["DUMPBIN"]=":" +S["LD"]="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" +S["FGREP"]="/usr/bin/grep -F" +S["EGREP"]="/usr/bin/grep -E" +S["GREP"]="/usr/bin/grep" +S["SED"]="/usr/bin/sed" +S["LIBTOOL"]="$(SHELL) $(top_builddir)/libtool" +S["am__fastdepCCAS_FALSE"]="" +S["am__fastdepCCAS_TRUE"]="#" +S["CCASDEPMODE"]="depmode=none" +S["CCASFLAGS"]="-arch x86_64 " +S["CCAS"]=" xcrun clang" +S["am__fastdepCC_FALSE"]="" +S["am__fastdepCC_TRUE"]="#" +S["CCDEPMODE"]="depmode=none" +S["AMDEPBACKSLASH"]="" +S["AMDEP_FALSE"]="" +S["AMDEP_TRUE"]="#" +S["am__quote"]="" +S["am__include"]="include" +S["DEPDIR"]=".deps" +S["OBJEXT"]="o" +S["EXEEXT"]="" +S["ac_ct_CC"]="" +S["CPPFLAGS"]="" +S["LDFLAGS"]="-arch x86_64" +S["CFLAGS"]="-arch x86_64 -Wall -fexceptions" +S["CC"]=" xcrun clang" +S["am__untar"]="${AMTAR} xf -" +S["am__tar"]="${AMTAR} chof - \"$$tardir\"" +S["AMTAR"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run tar" +S["am__leading_dot"]="." +S["SET_MAKE"]="" +S["AWK"]="awk" +S["mkdir_p"]="/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d" +S["MKDIR_P"]="/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d" +S["INSTALL_STRIP_PROGRAM"]="$(install_sh) -c -s" +S["STRIP"]="strip" +S["install_sh"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh" +S["MAKEINFO"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo" +S["AUTOHEADER"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoheader" +S["AUTOMAKE"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run automake-1.11" +S["AUTOCONF"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoconf" +S["ACLOCAL"]="${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run aclocal-1.11" +S["VERSION"]="3.0.10" +S["PACKAGE"]="libffi" +S["CYGPATH_W"]="echo" +S["am__isrc"]=" -I$(srcdir)" +S["INSTALL_DATA"]="${INSTALL} -m 644" +S["INSTALL_SCRIPT"]="${INSTALL}" +S["INSTALL_PROGRAM"]="${INSTALL}" +S["ax_enable_builddir_sed"]="sed" +S["target_os"]="darwin" +S["target_vendor"]="apple" +S["target_cpu"]="x86_64" +S["target"]="x86_64-apple-darwin" +S["host_os"]="darwin" +S["host_vendor"]="apple" +S["host_cpu"]="x86_64" +S["host"]="x86_64-apple-darwin" +S["build_os"]="darwin17.3.0" +S["build_vendor"]="apple" +S["build_cpu"]="x86_64" +S["build"]="x86_64-apple-darwin17.3.0" +S["target_alias"]="x86_64-apple-darwin" +S["host_alias"]="x86_64-apple-darwin" +S["build_alias"]="" +S["LIBS"]="" +S["ECHO_T"]="" +S["ECHO_N"]="" +S["ECHO_C"]="\\c" +S["DEFS"]="-DHAVE_CONFIG_H" +S["mandir"]="${datarootdir}/man" +S["localedir"]="${datarootdir}/locale" +S["libdir"]="${exec_prefix}/lib" +S["psdir"]="${docdir}" +S["pdfdir"]="${docdir}" +S["dvidir"]="${docdir}" +S["htmldir"]="${docdir}" +S["infodir"]="${datarootdir}/info" +S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}" +S["oldincludedir"]="/usr/include" +S["includedir"]="${prefix}/include" +S["localstatedir"]="${prefix}/var" +S["sharedstatedir"]="${prefix}/com" +S["sysconfdir"]="${prefix}/etc" +S["datadir"]="${datarootdir}" +S["datarootdir"]="${prefix}/share" +S["libexecdir"]="${exec_prefix}/libexec" +S["sbindir"]="${exec_prefix}/sbin" +S["bindir"]="${exec_prefix}/bin" +S["program_transform_name"]="s,x,x," +S["prefix"]="/usr/local" +S["exec_prefix"]="${prefix}" +S["PACKAGE_URL"]="" +S["PACKAGE_BUGREPORT"]="http://sourceware.org/libffi.html" +S["PACKAGE_STRING"]="libffi 3.0.10" +S["PACKAGE_VERSION"]="3.0.10" +S["PACKAGE_TARNAME"]="libffi" +S["PACKAGE_NAME"]="libffi" +S["PATH_SEPARATOR"]=":" +S["SHELL"]="/bin/sh" +_ACAWK +cat >>"$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +D["PACKAGE_NAME"]=" \"libffi\"" +D["PACKAGE_TARNAME"]=" \"libffi\"" +D["PACKAGE_VERSION"]=" \"3.0.10\"" +D["PACKAGE_STRING"]=" \"libffi 3.0.10\"" +D["PACKAGE_BUGREPORT"]=" \"http://sourceware.org/libffi.html\"" +D["PACKAGE_URL"]=" \"\"" +D["PACKAGE"]=" \"libffi\"" +D["VERSION"]=" \"3.0.10\"" +D["STDC_HEADERS"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_DLFCN_H"]=" 1" +D["LT_OBJDIR"]=" \".libs/\"" +D["HAVE_SYS_MMAN_H"]=" 1" +D["HAVE_MMAP"]=" 1" +D["HAVE_MMAP_FILE"]=" 1" +D["HAVE_MMAP_ANON"]=" 1" +D["STDC_HEADERS"]=" 1" +D["HAVE_MEMCPY"]=" 1" +D["HAVE_ALLOCA_H"]=" 1" +D["HAVE_ALLOCA"]=" 1" +D["SIZEOF_DOUBLE"]=" 8" +D["SIZEOF_LONG_DOUBLE"]=" 16" +D["HAVE_LONG_DOUBLE"]=" 1" +D["HAVE_AS_CFI_PSEUDO_OP"]=" 1" +D["EH_FRAME_FLAGS"]=" \"aw\"" + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\t (]|$)/ { + line = $ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + ac_datarootdir_hack=' + s&@datadir@&${datarootdir}&g + s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g + s&@infodir@&${datarootdir}/info&g + s&@localedir@&${datarootdir}/locale&g + s&@mandir@&${datarootdir}/man&g + s&\${datarootdir}&${prefix}/share&g' ;; +esac +ac_sed_extra=" + +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + :L) + # + # CONFIG_LINK + # + + if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then + : + else + # Prefer the file from the source tree if names are identical. + if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then + ac_source=$srcdir/$ac_source + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 +$as_echo "$as_me: linking $ac_source to $ac_file" >&6;} + + if test ! -r "$ac_source"; then + as_fn_error $? "$ac_source: file not found" "$LINENO" 5 + fi + rm -f "$ac_file" + + # Try a relative symlink, then a hard link, then a copy. + case $ac_source in + [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; + *) ac_rel_source=$ac_top_build_prefix$ac_source ;; + esac + ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || + ln "$ac_source" "$ac_file" 2>/dev/null || + cp -p "$ac_source" "$ac_file" || + as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 + fi + ;; + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "buildir":C) ac_top_srcdir="$ax_enable_builddir_srcdir" + if test ".$ax_enable_builddir" = ".." ; then + if test -f "$top_srcdir/Makefile" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - left untouched" >&5 +$as_echo "$as_me: skipping top_srcdir/Makefile - left untouched" >&6;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - not created" >&5 +$as_echo "$as_me: skipping top_srcdir/Makefile - not created" >&6;} + fi + else + if test -f "$ac_top_srcdir/Makefile" ; then + a=`grep "^VERSION " "$ac_top_srcdir/Makefile"` ; b=`grep "^VERSION " Makefile` + test "$a" != "$b" && rm "$ac_top_srcdir/Makefile" + fi + if test -f "$ac_top_srcdir/Makefile" ; then + echo "$ac_top_srcdir/Makefile : $ac_top_srcdir/Makefile.in" > $tmp/conftemp.mk + echo " @ echo 'REMOVED,,,' >\$@" >> $tmp/conftemp.mk + eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" + if grep '^REMOVED,,,' "$ac_top_srcdir/Makefile" >/dev/null + then rm $ac_top_srcdir/Makefile ; fi + cp $tmp/conftemp.mk $ac_top_srcdir/makefiles.mk~ ## DEBUGGING + fi + if test ! -f "$ac_top_srcdir/Makefile" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: create top_srcdir/Makefile guessed from local Makefile" >&5 +$as_echo "$as_me: create top_srcdir/Makefile guessed from local Makefile" >&6;} + x='`' ; cat >$tmp/conftemp.sed <<_EOF +/^\$/n +x +/^\$/bS +x +/\\\\\$/{H;d;} +{H;s/.*//;x;} +bM +:S +x +/\\\\\$/{h;d;} +{h;s/.*//;x;} +:M +s/\\(\\n\\) /\\1 /g +/^ /d +/^[ ]*[\\#]/d +/^VPATH *=/d +s/^srcdir *=.*/srcdir = ./ +s/^top_srcdir *=.*/top_srcdir = ./ +/[:=]/!d +/^\\./d +/ = /b +/ .= /b +/:/!b +s/:.*/:/ +s/ / /g +s/ \\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/ \\1 \\1-all\\2/g +s/^\\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/\\1 \\1-all\\2/ +s/ / /g +/^all all-all[ :]/i\\ +all-configured : all-all +s/ [a-zA-Z0-9-]*-all [a-zA-Z0-9-]*-all-all//g +/-all-all/d +a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done +/dist-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ + ; if test "\$\$found" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +/dist-[a-zA-Z0-9]*-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ + ; if test "\$\$found" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +/distclean-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ + ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ + ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile +_EOF + cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefile.sed~" ## DEBUGGING + $ax_enable_builddir_sed -f $tmp/conftemp.sed Makefile >$ac_top_srcdir/Makefile + if test -f "$ac_top_srcdir/Makefile.mk" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&5 +$as_echo "$as_me: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&6;} + cat $ac_top_srcdir/Makefile.mk >>$ac_top_srcdir/Makefile + fi ; xxxx="####" + echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$ac_top_srcdir/Makefile + # sanity check + if grep '^; echo "MAKE ' $ac_top_srcdir/Makefile >/dev/null ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: buggy sed found - it deletes tab in \"a\" text parts" >&5 +$as_echo "$as_me: buggy sed found - it deletes tab in \"a\" text parts" >&6;} + $ax_enable_builddir_sed -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $ac_top_srcdir/Makefile \ + >$ac_top_srcdir/Makefile~ + (test -s $ac_top_srcdir/Makefile~ && mv $ac_top_srcdir/Makefile~ $ac_top_srcdir/Makefile) 2>/dev/null + fi + else + xxxx="\\#\\#\\#\\#" + # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed + echo "s!^$xxxx [^|]* | *$ax_enable_builddir *\$!$xxxx ...... $ax_enable_builddir!" >$tmp/conftemp.sed + $ax_enable_builddir_sed -f "$tmp/conftemp.sed" "$ac_top_srcdir/Makefile" >$tmp/mkfile.tmp + cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefiles.sed~" ## DEBUGGING + cp "$tmp/mkfile.tmp" "$ac_top_srcdir/makefiles.out~" ## DEBUGGING + if cmp -s "$ac_top_srcdir/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: keeping top_srcdir/Makefile from earlier configure" >&5 +$as_echo "$as_me: keeping top_srcdir/Makefile from earlier configure" >&6;} + rm "$tmp/mkfile.tmp" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: reusing top_srcdir/Makefile from earlier configure" >&5 +$as_echo "$as_me: reusing top_srcdir/Makefile from earlier configure" >&6;} + mv "$tmp/mkfile.tmp" "$ac_top_srcdir/Makefile" + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&5 +$as_echo "$as_me: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&6;} + xxxx="####" + echo "$xxxx" "$ax_enable_builddir_host" "|$ax_enable_builddir" >>$ac_top_srcdir/Makefile + fi + ;; + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="" + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + "include":C) test -d include || mkdir include ;; + "src":C) +test -d src || mkdir src +test -d src/$TARGETDIR || mkdir src/$TARGETDIR + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/fficonfig.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/fficonfig.h new file mode 100644 index 0000000..6f218ec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/fficonfig.h @@ -0,0 +1,200 @@ +/* fficonfig.h. Generated from fficonfig.h.in by configure. */ +/* fficonfig.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "aw" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ +/* #undef FFI_EXEC_TRAMPOLINE_TABLE */ + +/* Cannot use malloc on this target, so, we revert to alternative means */ +/* #undef FFI_MMAP_EXEC_WRIT */ + +/* Define this is you do not want support for the raw API. */ +/* #undef FFI_NO_RAW_API */ + +/* Define this is you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .ascii. */ +/* #undef HAVE_AS_ASCII_PSEUDO_OP */ + +/* Define if your assembler supports .cfi_* directives. */ +#define HAVE_AS_CFI_PSEUDO_OP 1 + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if your assembler and linker support unaligned PC relative relocs. + */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define if your assembler supports .string. */ +/* #undef HAVE_AS_STRING_PSEUDO_OP */ + +/* Define if your assembler supports unwind section type. */ +/* #undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE */ + +/* Define if your assembler supports PC relative relocs. */ +/* #undef HAVE_AS_X86_PCREL */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if __attribute__((visibility("hidden"))) is supported. */ +/* #undef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if you have the long double type and it is bigger than a double */ +#define HAVE_LONG_DOUBLE 1 + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if .eh_frame sections should be read-only. */ +/* #undef HAVE_RO_EH_FRAME */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://sourceware.org/libffi.html" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 3.0.10" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.0.10" + +/* The size of `double', as computed by sizeof. */ +#define SIZEOF_DOUBLE 8 + +/* The size of `long double', as computed by sizeof. */ +#define SIZEOF_LONG_DOUBLE 16 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define this if you are using Purify and want to suppress spurious messages. + */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "3.0.10" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) .hidden name +#else +#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +#endif +#else +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) +#else +#define FFI_HIDDEN +#endif +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/Makefile new file mode 100644 index 0000000..9e6ac13 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/Makefile @@ -0,0 +1,487 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# include/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +VPATH = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-apple-darwin17.3.0 +host_triplet = x86_64-apple-darwin +target_triplet = x86_64-apple-darwin +subdir = include +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/ffi.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = ffi.h ffitarget.h +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(includesdir)" +HEADERS = $(nodist_includes_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run aclocal-1.11 +ALLOCA = +AMTAR = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run tar +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoconf +AUTOHEADER = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoheader +AUTOMAKE = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run automake-1.11 +AWK = awk +CC = xcrun clang +CCAS = xcrun clang +CCASDEPMODE = depmode=none +CCASFLAGS = -arch x86_64 +CCDEPMODE = depmode=none +CFLAGS = -arch x86_64 -Wall -fexceptions +CPP = xcrun clang -E +CPPFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = dsymutil +DUMPBIN = : +ECHO_C = \c +ECHO_N = +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +LDFLAGS = -arch x86_64 +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = lipo +LN_S = ln -s +LTLIBOBJS = +MAINT = # +MAKEINFO = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo +MANIFEST_TOOL = : +MKDIR_P = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +NM = nm +NMEDIT = nmedit +OBJDUMP = objdump +OBJEXT = o +OTOOL = otool +OTOOL64 = : +PACKAGE = libffi +PACKAGE_BUGREPORT = http://sourceware.org/libffi.html +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.0.10 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.0.10 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_DARWIN +TARGETDIR = x86 +VERSION = 3.0.10 +abs_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include +abs_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include +abs_top_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64 +abs_top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = +ac_ct_DUMPBIN = link -dump +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-apple-darwin17.3.0 +build_alias = +build_cpu = x86_64 +build_os = darwin17.3.0 +build_vendor = apple +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-apple-darwin +host_alias = x86_64-apple-darwin +host_cpu = x86_64 +host_os = darwin +host_vendor = apple +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include +sys_symbol_underscore = +sysconfdir = ${prefix}/etc +target = x86_64-apple-darwin +target_alias = x86_64-apple-darwin +target_cpu = x86_64 +target_os = darwin +target_vendor = apple +toolexecdir = $(libdir)/gcc-lib/$(target_alias) +toolexeclibdir = $(libdir)/ +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +AUTOMAKE_OPTIONS = foreign +DISTCLEANFILES = ffitarget.h +EXTRA_DIST = ffi.h.in ffi_common.h +includesdir = $(libdir)/libffi-3.0.10/include +nodist_includes_HEADERS = ffi.h ffitarget.h +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: # $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +ffi.h: $(top_builddir)/config.status $(srcdir)/ffi.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-nodist_includesHEADERS: $(nodist_includes_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)" + @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \ + done + +uninstall-nodist_includesHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(includesdir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(includesdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-nodist_includesHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-nodist_includesHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool ctags distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-nodist_includesHEADERS \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-nodist_includesHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/ffi.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/ffi.h new file mode 100644 index 0000000..687c24b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/ffi.h @@ -0,0 +1,427 @@ +/* -----------------------------------------------------------------*-C-*- + libffi 3.0.10 - Copyright (c) 2011 Anthony Green + - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the ``Software''), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and cloure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifndef X86_DARWIN +#define X86_DARWIN +#endif + +/* ---- System configuration information --------------------------------- */ + +#include + +#ifndef LIBFFI_ASM + +#ifdef _MSC_VER +#define __attribute__(X) +#endif + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ + +#define FFI_64_BIT_MAX 9223372036854775807 + +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif /* _AIX52 or newer */ +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ +# ifndef __PPC64__ +# if defined (__IBMC__) || defined (__IBMCPP__) +# define FFI_LONG_LONG_MAX LONGLONG_MAX +# endif +# endif /* __PPC64__ */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif +# endif +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t */ +/* can hold a pointer. */ + +typedef struct _ffi_type +{ + size_t size; + unsigned short alignment; + unsigned short type; + struct _ffi_type **elements; +} ffi_type; + +#ifndef LIBFFI_HIDE_BASIC_TYPES +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else + #error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else + #error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else + #error "int size not supported" +#endif + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX + #error "no 64-bit data type supported" +# endif +#elif LONG_MAX != FFI_64_BIT_MAX + #error "long size not supported" +#endif + +#if LONG_MAX == 2147483647 +# define ffi_type_ulong ffi_type_uint32 +# define ffi_type_slong ffi_type_sint32 +#elif LONG_MAX == FFI_64_BIT_MAX +# define ffi_type_ulong ffi_type_uint64 +# define ffi_type_slong ffi_type_sint64 +#else + #error "long size not supported" +#endif + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_pointer; + +#if 1 +extern ffi_type ffi_type_longdouble; +#else +#define ffi_type_longdouble ffi_type_double +#endif +#endif /* LIBFFI_HIDE_BASIC_TYPES */ + +typedef enum { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct { + ffi_abi abi; + unsigned nargs; + ffi_type **arg_types; + ffi_type *rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == FFI_64_BIT_MAX +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +#ifndef FFI_SIZEOF_JAVA_RAW +# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 +/* This is a special case for mips64/n32 ABI (and perhaps others) where + sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ +typedef union { + signed int sint; + unsigned int uint; + float flt; + char data[FFI_SIZEOF_JAVA_RAW]; + void* ptr; +} ffi_java_raw; +#else +typedef ffi_raw ffi_java_raw; +#endif + + +void ffi_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_raw *avalue); + +void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +size_t ffi_raw_size (ffi_cif *cif); + +/* This is analogous to the raw API, except it uses Java parameter */ +/* packing, even on 64-bit machines. I.e. on 64-bit machines */ +/* longs and doubles are followed by an empty 64-bit word. */ + +void ffi_java_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_java_raw *avalue); + +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); +size_t ffi_java_raw_size (ffi_cif *cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +#ifdef _MSC_VER +__declspec(align(8)) +#endif +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void *user_data; +#ifdef __GNUC__ +} ffi_closure __attribute__((aligned (8))); +#else +} ffi_closure; +# ifdef __sgi +# pragma pack 0 +# endif +#endif + +void *ffi_closure_alloc (size_t size, void **code); +void ffi_closure_free (void *); + +ffi_status +ffi_prep_closure (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data); + +ffi_status +ffi_prep_closure_loc (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void*codeloc); + +#ifdef __sgi +# pragma pack 8 +#endif +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void *user_data; + +} ffi_raw_closure; + +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); + void *user_data; + +} ffi_java_raw_closure; + +ffi_status +ffi_prep_raw_closure (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data); + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc); + +ffi_status +ffi_prep_java_raw_closure (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data); + +ffi_status +ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, + void *codeloc); + +#endif /* FFI_CLOSURES */ + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status ffi_prep_cif(ffi_cif *cif, + ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, + ffi_type **atypes); + +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +/* ---- Definitions shared with assembly code ---------------------------- */ + +#endif + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 +#if 1 +#define FFI_TYPE_LONGDOUBLE 4 +#else +#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/ffitarget.h new file mode 120000 index 0000000..74944a5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/include/ffitarget.h @@ -0,0 +1 @@ +/Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffitarget.h \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi.la new file mode 100644 index 0000000..d0ee7cf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi.la @@ -0,0 +1,41 @@ +# libffi.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libffi.5.dylib' + +# Names of this library. +library_names='libffi.5.dylib libffi.dylib' + +# The name of the static archive. +old_library='' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags=' ' + +# Libraries that this one depends upon. +dependency_libs='' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libffi. +current=5 +age=0 +revision=10 + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib' diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi.pc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi.pc new file mode 100644 index 0000000..cff9466 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi.pc @@ -0,0 +1,10 @@ +prefix=/usr/local +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${libdir}/libffi-3.0.10/include + +Name: libffi +Description: Library supporting Foreign Function Interfaces +Version: 3.0.10 +Libs: -L${libdir} -lffi +Cflags: -I${includedir} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi_convenience.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi_convenience.la new file mode 100644 index 0000000..a8500cf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libffi_convenience.la @@ -0,0 +1,41 @@ +# libffi_convenience.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libffi_convenience.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags=' ' + +# Libraries that this one depends upon. +dependency_libs='' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libffi_convenience. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libtool b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libtool new file mode 100755 index 0000000..226c2ba --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/libtool @@ -0,0 +1,10056 @@ +#! /bin/sh + +# libtool - Provide generalized library-building support services. +# Generated automatically by config.status (libffi) 3.0.10 +# Libtool was configured on host test2.allow2.com: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="" + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=2.4 +macro_revision=1.3293 + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=no + +# What type of objects to build. +pic_mode=yes + +# Whether or not to optimize for fast installation. +fast_install=needless + +# Shell to use when invoking shell scripts. +SHELL="/bin/sh" + +# An echo program that protects backslashes. +ECHO="printf %s\\n" + +# The host system. +host_alias=x86_64-apple-darwin +host=x86_64-apple-darwin +host_os=darwin + +# The build system. +build_alias= +build=x86_64-apple-darwin17.3.0 +build_os=darwin17.3.0 + +# A sed program that does not truncate output. +SED="/usr/bin/sed" + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP="/usr/bin/grep" + +# An ERE matcher. +EGREP="/usr/bin/grep -E" + +# A literal string matcher. +FGREP="/usr/bin/grep -F" + +# A BSD- or MS-compatible name lister. +NM="nm" + +# Whether we need soft or hard links. +LN_S="ln -s" + +# What is the maximum length of a command? +max_cmd_len=196608 + +# Object file suffix (normally "o"). +objext=o + +# Executable file suffix (normally ""). +exeext= + +# whether the shell understands "unset". +lt_unset=unset + +# turn spaces into newlines. +SP2NL="tr \\040 \\012" + +# turn newlines into spaces. +NL2SP="tr \\015\\012 \\040\\040" + +# convert $build file names to $host format. +to_host_file_cmd=func_convert_file_noop + +# convert $build files to toolchain format. +to_tool_file_cmd=func_convert_file_noop + +# An object symbol dumper. +OBJDUMP="objdump" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd="\$MAGIC_CMD" + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob="" + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob="no" + +# DLL creation program. +DLLTOOL="false" + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd="printf %s\\n" + +# The archiver. +AR="ar" + +# Flags to create an archive. +AR_FLAGS="cru" + +# How to feed a file listing to the archiver. +archiver_list_spec="" + +# A symbol stripping program. +STRIP="strip" + +# Commands used to install an old-style archive. +RANLIB="ranlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib" +old_postuninstall_cmds="" + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=yes + +# A C compiler. +LTCC=" xcrun clang" + +# LTCC compiler flags. +LTCFLAGS="-arch x86_64 -Wall -fexceptions" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([BCDEGRST][BCDEGRST]*\\)[ ][ ]*_\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 _\\2 \\2/p' | sed '/ __gnu_lto/d'" + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl="sed -n -e 's/^T .* \\(.*\\)\$/extern int \\1();/p' -e 's/^[BCDEGRST]* .* \\(.*\\)\$/extern char \\1;/p'" + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\)[ ]*\$/ {\\\"\\1\\\", (void *) 0},/p' -e 's/^[BCDEGRST]* \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (void *) \\&\\2},/p'" + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \\([^ ]*\\)[ ]*\$/ {\\\"\\1\\\", (void *) 0},/p' -e 's/^[BCDEGRST]* \\([^ ]*\\) \\(lib[^ ]*\\)\$/ {\"\\2\", (void *) \\&\\2},/p' -e 's/^[BCDEGRST]* \\([^ ]*\\) \\([^ ]*\\)\$/ {\"lib\\2\", (void *) \\&\\2},/p'" + +# Specify filename containing input files for $NM. +nm_file_list_spec="" + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot= + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=file + +# Must we lock files when doing compilation? +need_locks="no" + +# Manifest tool. +MANIFEST_TOOL=":" + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL="dsymutil" + +# Tool to change global to local symbols on Mac OS X. +NMEDIT="nmedit" + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO="lipo" + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL="otool" + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=":" + +# Old archive suffix (normally "a"). +libext=a + +# Shared library suffix (normally ".so"). +shrext_cmds="\`test .\$module = .yes && echo .so || echo .dylib\`" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink="PATH DYLD_LIBRARY_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Do we need the "lib" prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Library versioning type. +version_type=darwin + +# Shared library runtime path variable. +runpath_var= + +# Shared library path variable. +shlibpath_var=DYLD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=yes + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec="\${libname}\${release}\${major}\$shared_ext \${libname}\$shared_ext" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${major}\$shared_ext" + +# Permission mode override for installation of shared libraries. +install_override_mode="" + +# Command to use after installation of a shared archive. +postinstall_cmds="" + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="" + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval="" + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=no + +# Compile-time system search path for libraries. +sys_lib_search_path_spec="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0 /usr/local/lib" + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec="/usr/local/lib /lib /usr/lib" + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Commands to strip libraries. +old_striplib="strip -S" +striplib="strip -x" + + +# The linker used to build libraries. +LD="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LTCC \$LTCFLAGS -nostdlib \${wl}-r -o \$output\$reload_objs" + +# Commands used to build an old-style archive. +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib" + +# A language specific compiler. +CC=" xcrun clang" + +# Is the compiler the GNU compiler? +with_gcc=yes + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin -fno-rtti -fno-exceptions" + +# Additional compiler flags for building library objects. +pic_flag=" -fno-common -DPIC" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Compiler flag to prevent dynamic linking. +link_static_flag="" + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=no + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\`for conv in \$convenience\\\"\\\"; do test -n \\\"\$conv\\\" && new_convenience=\\\"\$new_convenience \${wl}-force_load,\$conv\\\"; done; func_echo_all \\\"\$new_convenience\\\"\`" + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object="no" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build a shared archive. +archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring \$single_module" +archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring \$single_module \${wl}-exported_symbols_list,\$output_objdir/\${libname}-symbols.expsym" + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags" +module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags \${wl}-exported_symbols_list,\$output_objdir/\${libname}-symbols.expsym" + +# Whether we are building with GNU ld or not. +with_gnu_ld="no" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="\${wl}-flat_namespace \${wl}-undefined \${wl}suppress" + +# Flag that enforces no undefined symbols. +no_undefined_flag="" + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist +hardcode_libdir_flag_spec="" + +# If ld is used when linking, flag to hardcode $libdir into a binary +# during linking. This must work even if $libdir does not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator="" + +# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=no + +# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting ${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=no + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=no + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=yes + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=no + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=yes + +# Set to "yes" if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds="" + +# Commands necessary for finishing linking programs. +postlink_cmds="" + +# Specify filename containing input files. +file_list_spec="" + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# ### END LIBTOOL CONFIG + + +# libtool (GNU libtool) 2.4 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool 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 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4 +TIMESTAMP="" +package_revision=1.3293 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${EGREP="/bin/grep -E"} +: ${FGREP="/bin/grep -F"} +: ${GREP="/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/bin/sed"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} # Extended-shell func_dirname implementation + + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} # Extended-shell func_basename implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} # Extended-shell func_dirname_and_basename implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} # Extended-shell func_stripname implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=: + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} +} # Extended-shell func_split_short_opt implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=} +} # Extended-shell func_split_long_opt implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ +eval "${1}+=\${2}" +} # Extended-shell func_append implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}+=\\ \$func_quote_for_eval_result" +} # Extended-shell func_append_quoted implementation + + +# func_arith arithmetic-term... +func_arith () +{ +func_arith_result=$(( $* )) +} # Extended-shell func_arith implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ +func_len_result=${#1} +} # Extended-shell func_len implementation + + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} # Extended-shell func_lo2o implementation + + +# func_xform libobj-or-source +func_xform () +{ +func_xform_result=${1%.*}.lo +} # Extended-shell func_xform implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +preserve_args+=" $opt" + ;; + --no-verbose) + opt_verbose=false +preserve_args+=" $opt" + ;; + --silent|--quiet) + opt_silent=: +preserve_args+=" $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +preserve_args+=" $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +preserve_args+=" $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || preserve_args+=" --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_to_host_path_result+="$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + pie_flag+=" $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + later+=" $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + base_compile+=" $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + removelist+=" $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist+=" $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + command+=" -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + command+=" -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command+="$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + dir+="/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + libdirs+=" $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + libs+=" $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || admincmds+=" + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + install_prog+="$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + files+=" $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog+=" $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + install_shared_prog+=" $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + install_shared_prog+=" -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs+=" $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs+=" $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs+=" $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir+="$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs+=" $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) symtab_cflags+=" $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \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" +#define SHELL_SPACE_CHARS " \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" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' + + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + libtool_args+=" $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command+=" @OUTPUT@" + finalize_command+=" @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command+=" @SYMFILE@" + finalize_command+=" @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles+=" $arg" + else + dlprefiles+=" $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) deplibs+=" $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# moreargs+=" $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles+=" $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles+=" $pic_object" + prev= + fi + + # A PIC object. + libobjs+=" $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects+=" $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects+=" $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + libobjs+=" $pic_object" + non_pic_objects+=" $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath+=" $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath+=" $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs+=" $arg" + prev= + continue + ;; + xcclinker) + linker_flags+=" $qarg" + compiler_flags+=" $qarg" + prev= + compile_command+=" $qarg" + finalize_command+=" $qarg" + continue + ;; + xcompiler) + compiler_flags+=" $qarg" + prev= + compile_command+=" $qarg" + finalize_command+=" $qarg" + continue + ;; + xlinker) + linker_flags+=" $qarg" + compiler_flags+=" $wl$qarg" + prev= + compile_command+=" $wl$qarg" + finalize_command+=" $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + compile_command+=" $link_static_flag" + finalize_command+=" $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command+=" $arg" + finalize_command+=" $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) deplibs+=" $arg" ;; + *) deplibs+=" -L$dir" ;; + esac + lib_search_path+=" $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath+=":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath+=":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs+=" System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs+=" $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + compiler_flags+=" $arg" + compile_command+=" $arg" + finalize_command+=" $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags+=" $arg" + compile_command+=" $arg" + finalize_command+=" $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags+=" $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath+=" $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg+=" $func_quote_for_eval_result" + compiler_flags+=" $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg+=" $wl$func_quote_for_eval_result" + compiler_flags+=" $wl$func_quote_for_eval_result" + linker_flags+=" $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + compile_command+=" $arg" + finalize_command+=" $arg" + compiler_flags+=" $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs+=" $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles+=" $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles+=" $pic_object" + prev= + fi + + # A PIC object. + libobjs+=" $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects+=" $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects+=" $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + libobjs+=" $pic_object" + non_pic_objects+=" $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs+=" $arg" + old_deplibs+=" $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles+=" $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles+=" $func_resolve_sysroot_result" + prev= + else + deplibs+=" $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command+=" $arg" + finalize_command+=" $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command+=" $arg" + finalize_command+=" $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs+=" $deplib" ;; + esac + fi + libs+=" $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs+=" $pre_post_deps" ;; + esac + pre_post_deps+=" $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs+=" $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags+=" $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags+=" $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags+=" $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + newlib_search_path+=" $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + newlib_search_path+=" $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath+=" $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles+=" $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles+=" $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) new_inherited_linker_flags+=" $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles+=" $dlopen" + test -n "$dlpreopen" && dlprefiles+=" $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience+=" $ladir/$objdir/$old_library" + old_convenience+=" $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs+=" $deplib" ;; + esac + fi + tmp_libs+=" $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles+=" $lib $dependency_libs" + else + newdlfiles+=" $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path+=" $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path+=" $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + newdlprefiles+=" $dir/$linklib" + else + newdlprefiles+=" $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs+=" $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles+=" $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs+=" $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles+=" $dir/$dlname" + else + newdlprefiles+=" $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path+=" $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + newlib_search_path+=" $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs+=" $deplib" ;; + esac + fi + tmp_libs+=" $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) temp_rpath+="$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath+=" $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + notinst_deplibs+=" $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs+=" $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath+=" $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir+=" -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath+="$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath+="$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath+="$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir+=" -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath+=" $temp_xrpath";; + esac;; + *) temp_deplibs+=" $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path+=" $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + specialdeplibs+=" $func_resolve_sysroot_result" ;; + esac + fi + tmp_libs+=" $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + compiler_flags+=" ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags+=" -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path+=" $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs+=" $deplib" ;; + esac + ;; + *) tmp_libs+=" $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs+=" $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs+="$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + libobjs+=" $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring+=":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + libobjs+=" $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist+=" $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs+=" $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + temp_xrpath+=" -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles+=" $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles+=" $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs+=" System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs+=" -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs+=" $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs+=" $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs+=" $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs+=" $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs+=" $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs+=" -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs+=" $deplib" ;; + esac + ;; + *) new_libs+=" $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs+="$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath+=" $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_apped perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath+="$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames+=" $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + delfiles+=" $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + delfiles+=" $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles+=" $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs+=" $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $convenience + libobjs+=" $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags+=" $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + delfiles+=" $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + delfiles+=" $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + objlist+=" $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles+=" $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles+=" $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs+=" $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated+=" $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + compile_command+=" ${wl}-bind_at_load" + finalize_command+=" ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs+=" -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs+=" $deplib" ;; + esac + ;; + *) new_libs+=" $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command+=" $compile_deplibs" + finalize_command+=" $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs+="$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath+=" $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath+=" $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath+=":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath+=":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs+="$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath+=" $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath+=" $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath+="$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath+="$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + oldobjs+=" $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $addlibs + oldobjs+=" $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs+=" $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + oldobjs+=" $gentop/$newobj" + ;; + *) oldobjs+=" $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + objlist+=" $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs+=" ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + newdependency_libs+=" -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + newdependency_libs+=" -R$func_replace_sysroot_result" + ;; + *) newdependency_libs+=" $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlfiles+=" ${lt_sysroot:+=}$libdir/$name" + ;; + *) newdlfiles+=" $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlprefiles+=" ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles+=" $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles+=" $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) RM+=" $arg"; rmforce=yes ;; + -*) RM+=" $arg" ;; + *) files+=" $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) rmdirs+=" $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles+=" $odir/$n" + done + test -n "$old_library" && rmfiles+=" $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && rmfiles+=" $odir/$dlname" ;; + esac + test -n "$libdir" && rmfiles+=" $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + rmfiles+=" $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles+=" $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles+=" $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + rmfiles+=" $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles+=" $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles+=" $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles+=" $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/man/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/man/Makefile new file mode 100644 index 0000000..a3b3054 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/man/Makefile @@ -0,0 +1,466 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# man/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +VPATH = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-apple-darwin17.3.0 +host_triplet = x86_64-apple-darwin +target_triplet = x86_64-apple-darwin +subdir = man +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man3dir = $(mandir)/man3 +am__installdirs = "$(DESTDIR)$(man3dir)" +NROFF = nroff +MANS = $(man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run aclocal-1.11 +ALLOCA = +AMTAR = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run tar +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoconf +AUTOHEADER = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoheader +AUTOMAKE = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run automake-1.11 +AWK = awk +CC = xcrun clang +CCAS = xcrun clang +CCASDEPMODE = depmode=none +CCASFLAGS = -arch x86_64 +CCDEPMODE = depmode=none +CFLAGS = -arch x86_64 -Wall -fexceptions +CPP = xcrun clang -E +CPPFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = dsymutil +DUMPBIN = : +ECHO_C = \c +ECHO_N = +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +LDFLAGS = -arch x86_64 +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = lipo +LN_S = ln -s +LTLIBOBJS = +MAINT = # +MAKEINFO = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo +MANIFEST_TOOL = : +MKDIR_P = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +NM = nm +NMEDIT = nmedit +OBJDUMP = objdump +OBJEXT = o +OTOOL = otool +OTOOL64 = : +PACKAGE = libffi +PACKAGE_BUGREPORT = http://sourceware.org/libffi.html +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.0.10 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.0.10 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_DARWIN +TARGETDIR = x86 +VERSION = 3.0.10 +abs_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/man +abs_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man +abs_top_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64 +abs_top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = +ac_ct_DUMPBIN = link -dump +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-apple-darwin17.3.0 +build_alias = +build_cpu = x86_64 +build_os = darwin17.3.0 +build_vendor = apple +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-apple-darwin +host_alias = x86_64-apple-darwin +host_cpu = x86_64 +host_os = darwin +host_vendor = apple +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man +sys_symbol_underscore = +sysconfdir = ${prefix}/etc +target = x86_64-apple-darwin +target_alias = x86_64-apple-darwin +target_cpu = x86_64 +target_os = darwin +target_vendor = apple +toolexecdir = $(libdir)/gcc-lib/$(target_alias) +toolexeclibdir = $(libdir)/ +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +AUTOMAKE_OPTIONS = foreign +EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 +man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign man/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: # $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man3: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" + @list=''; test -n "$(man3dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ + done; } + +uninstall-man3: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man3dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man3dir)" && rm -f $$files; } +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man3dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man3 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-man + +uninstall-man: uninstall-man3 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man3 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-man uninstall-man3 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.deps/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.libs/closures.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.libs/closures.o new file mode 100644 index 0000000000000000000000000000000000000000..19dc6e8e077ece2b5bf66d4fb86207198f53f947 GIT binary patch literal 2908 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.libs/java_raw_api.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/.libs/java_raw_api.o new file mode 100644 index 0000000000000000000000000000000000000000..26592994402b837278e4d046ad50b696c6b083c9 GIT binary patch literal 9736 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%0D!Y5ni z8O_}z1O$|}3b%Cy^oVItW1S`-tmUHCOmvDlQ0L!Ejk;w{?-bg-#md@>RaL+ZA7pyr zMyvVuo$gjqYni)scY~M(cyfbqcZx};aVc=6sJ$VFwK~|jH-LW(Uja5A-*{LBPy+o8jO{!R|vx_?G$1iLh;nLF|l}6Lom#P znz2|H)urwMtcWpplBj`#^B`s}BHt<|TI<9lP*YpQObN^YKnF3VqpO+wwtYwFrDoM$ z^p~}Yi%X5!Q-rmuZIvin36XBUD7TtK38qX#XxUC-ca_sEwc4=@kf~W_#9b@q(2@$v zy;EES9{N**%|?UfOQixzCxG%I#;sybtH53fD9ZxHmYvrl=22Q5*cY^lC9UErxmV1) zscg?S?1)lx%3j03OG(>^R1s-f-5j*o`E?)T7~pKw9YYJKj;Slsx4O&G;$YQGLW@!- z&?2>~+O%q$ReObM|IOBG{Y8hiT-9?N~Gq@BVpY3Ih^Uli^9+9S?!=jU!a=z{6m_A&H(V`xqOn;`cp z!&S9&hh8w^K+bJ>!JML7bo|GL{}ss(kGU_;56FK4@IGEb@@BqxP+s^KL-}iTiI0Er R{>O*pO@4m3@O~dL`G1qlyPKe%(aa_ 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/closures.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/closures.lo new file mode 100644 index 0000000..859ad3b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/closures.lo @@ -0,0 +1,12 @@ +# src/closures.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/closures.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/debug.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/debug.lo new file mode 100644 index 0000000..866fece --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/debug.lo @@ -0,0 +1,12 @@ +# src/debug.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/debug.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/java_raw_api.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/java_raw_api.lo new file mode 100644 index 0000000..40a22f8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/java_raw_api.lo @@ -0,0 +1,12 @@ +# src/java_raw_api.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/java_raw_api.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/prep_cif.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/prep_cif.lo new file mode 100644 index 0000000..9639133 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/prep_cif.lo @@ -0,0 +1,12 @@ +# src/prep_cif.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/prep_cif.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/raw_api.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/raw_api.lo new file mode 100644 index 0000000..3a66579 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/raw_api.lo @@ -0,0 +1,12 @@ +# src/raw_api.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/raw_api.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/types.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/types.lo new file mode 100644 index 0000000..b4da327 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/types.lo @@ -0,0 +1,12 @@ +# src/types.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/types.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.deps/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.libs/darwin.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.libs/darwin.o new file mode 100644 index 0000000000000000000000000000000000000000..58d891c38ec4864cef8e880a06fd3046261e4165 GIT binary patch literal 200 zcmX^A>+L^w1_nlE1|R{%OhCK>h+#ky$e01+;Gs{T$pOt|0AY}sAP^s4l3Gy$VMF*K ct`Q*!J~|8CJfM67vKkd2M*t+i!UYxv0Q$BJ0{{R3 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.libs/darwin64.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.libs/darwin64.o new file mode 100644 index 0000000000000000000000000000000000000000..a91406a2f1958c72102782c0348fbe603b19b7c4 GIT binary patch literal 1528 zcmb7EO-NKx6uwh09c=JU;9~k?W^orT`Z17-h*FuUJMyMP1{*?rn$1he#xSiRNT;Bm z%WG($P0NTjMT-bg2&r@`#1>5nB}ouMpkN@nC|ops=gpfea?^qDeBU|up7ZWIkNe&( zfBRX=m}@PA12mwOL;!$o1ZHiux{FaEEJZc2VvL@Qu!fQ_!|07CdkeY{M?u{EA67XJ9 zTA3YFxeo}eW2^+60w=+!V+{Zqor{2$49kUcg8#>Kt3t@Mwnr+jRMIU~hgVk(KB-=X z)pA5-gK9i%?F(By?y%M94O{iTh*cMeSoM`xU+}9Xczig0?=hZOo1c{FxKCOUCap_u zX`S%~`OrH(y_H_*XnV!&i0e~re&!&eZeReo4%`F|14n^lfB~EWXwL-)w;bkvmgW8w zA}0CJ3#m%8l0S2Jm^dT(b30b#v0vVyU1o+n_t&r`zJUZ=B%VH)mFZqFZ-#mQ7`Zp! zM`?Gj+DOHJ7P43Y-&(i&@$^Ajb%v#=ES4FfpEASX2SH7Y` zS0811P|(n&nvv<7A_r+-5_$RMI5Y;I`)BY6u+RjUKms@q9CC03OrUi_i-UfL%}jCb zd?+YpF;6~RV2g<6Yzs59#J!ZsEIK^hRb1D_thAzHVTt$aV&Q=^=Lu8t#OMQ>v)uxt zAESOI9|(#ncwN-MM@0jCvuK4sDbB(_5-A)GVo=!gSGKOUkA-C6hq;T+@e9~JL|gy> literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.libs/ffi.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/.libs/ffi.o new file mode 100644 index 0000000000000000000000000000000000000000..47ad93a3567a42e5a6c86bdfe45c228a0649aa97 GIT binary patch literal 1588 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 PV?N7DW#{sQ#!su1-pzB;y5vQ;0%L7C^G! zC)a`9k({%s6bY>#33pw;-{Q_t&_2KKUBD%mYUu$4B%>k>5#92UX=A z?1SwN+8yz+4hxn%3MD3BwmfKXBPMmjl!-u-t*J+Vr0!otN$x<5J009JXcQ{B5QCDj z{V-z7x@gJ?cZxNHoy&$9Xua5cYT;lp9+9hIR7W8KJozYh1rQztw2*(+%?pHsjXYzy z)YlESSMkIn2&kX7LK|&` zQ7eou38%v6*yS*4nsE!1>cFb^h>V?HNL4J)U=8G=!w4@+FDJDzW38|sTeO&%oE4jx z3jAa$^i*D|_>>>=8DA1&?FN$mu2D{LqC(L50{bILalR}ds&NKVoc3>F3AVt?;hcuW zSuMmtfUz|`l=dR56>Qzu)iSa9qWrRZxcvy9!o20e`H2RbMm>1Jc!;w#oJt^jdAqGx z=LycIAW{q_L&%dU#)F6#E#w#+90#}Yt3l8Ai4z65Tu1p_Ag%)f#-u@`Yu$VyLB*V7 zef~(4%K}NJ>~cns$Hwv)vA3LCwij4rP>!%`>bjoRxN$WBEGv+yGpe;%a>~7M%C_> zelzHIy2QUtwSLvQRl8iZtzZ&-s=Wq&CYXNuL+v4j?}hw1c>Op7KV+b#Z@LT6=728+ zJh8u4(Wg*?W8Z#1r{LIkP(NT7=&?T=6~$o0i>@!@CVK4JuHe|8GAOM^k;O-|(eN|l z=tLV$*XWP`l?_`p{5Xbwb0L5KP&4{>5uQtaa)B|Ue=6Y-uVk0|k%gdK@)HipPe0ih XMIZH>jX2#Sf3YFi)DIG3IN0(3*hS73 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/darwin.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/darwin.lo new file mode 100644 index 0000000..2209a09 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/darwin.lo @@ -0,0 +1,12 @@ +# src/x86/darwin.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/darwin.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/darwin64.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/darwin64.lo new file mode 100644 index 0000000..4f9cc6c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/darwin64.lo @@ -0,0 +1,12 @@ +# src/x86/darwin64.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/darwin64.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/ffi.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/ffi.lo new file mode 100644 index 0000000..e132172 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/ffi.lo @@ -0,0 +1,12 @@ +# src/x86/ffi.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/ffi.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/ffi64.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/ffi64.lo new file mode 100644 index 0000000..e11ba90 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/src/x86/ffi64.lo @@ -0,0 +1,12 @@ +# src/x86/ffi64.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/ffi64.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/stamp-h1 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/stamp-h1 new file mode 100644 index 0000000..e43c201 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/stamp-h1 @@ -0,0 +1 @@ +timestamp for fficonfig.h diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/testsuite/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/testsuite/Makefile new file mode 100644 index 0000000..a51b3a7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/testsuite/Makefile @@ -0,0 +1,500 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# testsuite/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +VPATH = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-apple-darwin17.3.0 +host_triplet = x86_64-apple-darwin +target_triplet = x86_64-apple-darwin +subdir = testsuite +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +DEJATOOL = $(PACKAGE) +RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run aclocal-1.11 +ALLOCA = +AMTAR = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run tar +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoconf +AUTOHEADER = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run autoheader +AUTOMAKE = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run automake-1.11 +AWK = awk +CC = xcrun clang +CCAS = xcrun clang +CCASDEPMODE = depmode=none +CCASFLAGS = -arch x86_64 +CCDEPMODE = depmode=none +CFLAGS = -arch x86_64 -Wall -fexceptions +CPP = xcrun clang -E +CPPFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = dsymutil +DUMPBIN = : +ECHO_C = \c +ECHO_N = +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +LDFLAGS = -arch x86_64 +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = lipo +LN_S = ln -s +LTLIBOBJS = +MAINT = # +MAKEINFO = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing --run makeinfo +MANIFEST_TOOL = : +MKDIR_P = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +NM = nm +NMEDIT = nmedit +OBJDUMP = objdump +OBJEXT = o +OTOOL = otool +OTOOL64 = : +PACKAGE = libffi +PACKAGE_BUGREPORT = http://sourceware.org/libffi.html +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.0.10 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.0.10 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_DARWIN +TARGETDIR = x86 +VERSION = 3.0.10 +abs_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64/testsuite +abs_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite +abs_top_builddir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi-x86_64 +abs_top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = +ac_ct_DUMPBIN = link -dump +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-apple-darwin17.3.0 +build_alias = +build_cpu = x86_64 +build_os = darwin17.3.0 +build_vendor = apple +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-apple-darwin +host_alias = x86_64-apple-darwin +host_cpu = x86_64 +host_os = darwin +host_vendor = apple +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh -c -d +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite +sys_symbol_underscore = +sysconfdir = ${prefix}/etc +target = x86_64-apple-darwin +target_alias = x86_64-apple-darwin +target_cpu = x86_64 +target_os = darwin +target_vendor = apple +toolexecdir = $(libdir)/gcc-lib/$(target_alias) +toolexeclibdir = $(libdir)/ +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /Users/andrew/Projects-A2/Allow2.github.io/_src/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi +AUTOMAKE_OPTIONS = foreign dejagnu + +# Setup the testing framework, if you have one +EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \ + echo $(top_builddir)/../expect/expect ; \ + else echo expect ; fi` + +RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \ + echo $(top_srcdir)/../dejagnu/runtest ; \ + else echo runtest; fi` + +CLEANFILES = *.exe core* *.log *.sum +EXTRA_DIST = libffi.special/special.exp \ +libffi.special/unwindtest_ffi_call.cc libffi.special/unwindtest.cc \ +libffi.special/ffitestcxx.h config/default.exp lib/target-libpath.exp \ +lib/libffi.exp lib/wrapper.exp libffi.call/float.c \ +libffi.call/cls_multi_schar.c libffi.call/float3.c \ +libffi.call/cls_3_1byte.c libffi.call/stret_large2.c \ +libffi.call/cls_5_1_byte.c libffi.call/stret_medium.c \ +libffi.call/promotion.c libffi.call/cls_dbls_struct.c \ +libffi.call/nested_struct.c libffi.call/closure_fn1.c \ +libffi.call/cls_4_1byte.c libffi.call/cls_float.c \ +libffi.call/cls_2byte.c libffi.call/closure_fn4.c \ +libffi.call/return_fl2.c libffi.call/nested_struct7.c \ +libffi.call/cls_uint.c libffi.call/cls_align_sint64.c \ +libffi.call/float1.c libffi.call/cls_19byte.c \ +libffi.call/nested_struct1.c libffi.call/cls_4byte.c \ +libffi.call/return_fl1.c libffi.call/cls_align_pointer.c \ +libffi.call/nested_struct4.c libffi.call/nested_struct3.c \ +libffi.call/struct7.c libffi.call/nested_struct9.c \ +libffi.call/cls_sshort.c libffi.call/cls_ulonglong.c \ +libffi.call/cls_pointer_stack.c libffi.call/cls_multi_uchar.c \ +libffi.call/testclosure.c libffi.call/cls_3byte1.c \ +libffi.call/struct6.c libffi.call/return_uc.c libffi.call/return_ll1.c \ +libffi.call/cls_ushort.c libffi.call/stret_medium2.c \ +libffi.call/cls_multi_ushortchar.c libffi.call/return_dbl2.c \ +libffi.call/closure_loc_fn0.c libffi.call/return_sc.c \ +libffi.call/nested_struct8.c libffi.call/cls_7_1_byte.c \ +libffi.call/return_ll.c libffi.call/cls_pointer.c \ +libffi.call/err_bad_abi.c libffi.call/return_dbl1.c \ +libffi.call/call.exp libffi.call/ffitest.h libffi.call/strlen.c \ +libffi.call/return_sl.c libffi.call/cls_1_1byte.c \ +libffi.call/struct1.c libffi.call/cls_64byte.c libffi.call/return_ul.c \ +libffi.call/cls_double.c libffi.call/many_win32.c \ +libffi.call/cls_16byte.c libffi.call/cls_align_double.c \ +libffi.call/cls_align_uint16.c libffi.call/cls_9byte1.c \ +libffi.call/cls_multi_sshortchar.c libffi.call/cls_multi_ushort.c \ +libffi.call/closure_stdcall.c libffi.call/return_fl.c \ +libffi.call/strlen_win32.c libffi.call/return_ldl.c \ +libffi.call/cls_align_float.c libffi.call/struct3.c \ +libffi.call/cls_uchar.c libffi.call/cls_sint.c libffi.call/float2.c \ +libffi.call/cls_align_longdouble_split.c \ +libffi.call/cls_longdouble_va.c libffi.call/cls_multi_sshort.c \ +libffi.call/stret_large.c libffi.call/cls_align_sint16.c \ +libffi.call/nested_struct6.c libffi.call/cls_5byte.c \ +libffi.call/return_dbl.c libffi.call/cls_20byte.c \ +libffi.call/cls_8byte.c libffi.call/pyobjc-tc.c \ +libffi.call/cls_24byte.c libffi.call/cls_align_longdouble_split2.c \ +libffi.call/cls_6_1_byte.c libffi.call/cls_schar.c \ +libffi.call/cls_18byte.c libffi.call/closure_fn3.c \ +libffi.call/err_bad_typedef.c libffi.call/closure_fn2.c \ +libffi.call/struct2.c libffi.call/cls_3byte2.c \ +libffi.call/cls_align_longdouble.c libffi.call/cls_20byte1.c \ +libffi.call/return_fl3.c libffi.call/cls_align_uint32.c \ +libffi.call/problem1.c libffi.call/float4.c \ +libffi.call/cls_align_uint64.c libffi.call/struct9.c \ +libffi.call/closure_fn5.c libffi.call/cls_align_sint32.c \ +libffi.call/closure_fn0.c libffi.call/closure_fn6.c \ +libffi.call/struct4.c libffi.call/nested_struct2.c \ +libffi.call/cls_6byte.c libffi.call/cls_7byte.c libffi.call/many.c \ +libffi.call/struct8.c libffi.call/negint.c libffi.call/struct5.c \ +libffi.call/cls_12byte.c libffi.call/cls_double_va.c \ +libffi.call/cls_longdouble.c libffi.call/cls_9byte2.c \ +libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ +libffi.call/huge_struct.c + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign testsuite/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: # $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +check-DEJAGNU: site.exp + srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \ + EXPECT=$(EXPECT); export EXPECT; \ + runtest=$(RUNTEST); \ + if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ + exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \ + if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ + then :; else exit_status=1; fi; \ + done; \ + else echo "WARNING: could not find \`runtest'" 1>&2; :;\ + fi; \ + exit $$exit_status +site.exp: Makefile + @echo 'Making a new site.exp file...' + @echo '## these variables are automatically generated by make ##' >site.tmp + @echo '# Do not edit here. If you wish to override these values' >>site.tmp + @echo '# edit the last section' >>site.tmp + @echo 'set srcdir $(srcdir)' >>site.tmp + @echo "set objdir `pwd`" >>site.tmp + @echo 'set build_alias "$(build_alias)"' >>site.tmp + @echo 'set build_triplet $(build_triplet)' >>site.tmp + @echo 'set host_alias "$(host_alias)"' >>site.tmp + @echo 'set host_triplet $(host_triplet)' >>site.tmp + @echo 'set target_alias "$(target_alias)"' >>site.tmp + @echo 'set target_triplet $(target_triplet)' >>site.tmp + @echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp + @test ! -f site.exp || \ + sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp + @-rm -f site.bak + @test ! -f site.exp || mv site.exp site.bak + @mv site.tmp site.exp + +distclean-DEJAGNU: + -rm -f site.exp site.bak + -l='$(DEJATOOL)'; for tool in $$l; do \ + rm -f $$tool.sum $$tool.log; \ + done + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-DEJAGNU distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \ + clean-libtool distclean distclean-DEJAGNU distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.bsd.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.bsd.mk new file mode 100644 index 0000000..16ec6b5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.bsd.mk @@ -0,0 +1,34 @@ +# -*- makefile -*- +# +# Makefile for BSD systems +# + +INCFLAGS += -I${LIBFFI_BUILD_DIR}/include +LOCAL_LIBS += ${LIBFFI} -lpthread + +LIBFFI_CFLAGS = ${FFI_MMAP_EXEC} -pthread +LIBFFI_BUILD_DIR = ${.CURDIR}/libffi-${arch} + +.if ${srcdir} == "." + LIBFFI_SRC_DIR := ${.CURDIR}/libffi +.else + LIBFFI_SRC_DIR := ${srcdir}/libffi +.endif + + +LIBFFI = ${LIBFFI_BUILD_DIR}/.libs/libffi_convenience.a +LIBFFI_CONFIGURE = ${LIBFFI_SRC_DIR}/configure --disable-static \ + --with-pic=yes --disable-dependency-tracking + +$(OBJS): ${LIBFFI} + +$(LIBFFI): + @mkdir -p ${LIBFFI_BUILD_DIR} + @if [ ! -f ${LIBFFI_BUILD_DIR}/Makefile ]; then \ + echo "Configuring libffi"; \ + cd ${LIBFFI_BUILD_DIR} && \ + /usr/bin/env CC="${CC}" LD="${LD}" CFLAGS="${LIBFFI_CFLAGS}" GREP_OPTIONS="" \ + /bin/sh ${LIBFFI_CONFIGURE} ${LIBFFI_HOST} > /dev/null; \ + fi + @cd ${LIBFFI_BUILD_DIR} && ${MAKE} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.darwin.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.darwin.mk new file mode 100644 index 0000000..f68badd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.darwin.mk @@ -0,0 +1,95 @@ +# -*- makefile -*- + +include ${srcdir}/libffi.gnu.mk + +CCACHE := $(shell type -p ccache) +BUILD_DIR := $(shell pwd) + +INCFLAGS += -I"$(BUILD_DIR)" + +# Work out which arches we need to compile the lib for +ARCHES := +ARCHFLAGS ?= $(filter -arch %, $(CFLAGS)) + +ifneq ($(findstring -arch ppc,$(ARCHFLAGS)),) + ARCHES += ppc +endif + +ifneq ($(findstring -arch i386,$(ARCHFLAGS)),) + ARCHES += i386 +endif + +ifneq ($(findstring -arch x86_64,$(ARCHFLAGS)),) + ARCHES += x86_64 +endif + +ifeq ($(strip $(ARCHES)),) +LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch) +# Just build the one (default) architecture +$(LIBFFI): + @mkdir -p "$(LIBFFI_BUILD_DIR)" "$(@D)" + @if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \ + echo "Configuring libffi"; \ + cd "$(LIBFFI_BUILD_DIR)" && \ + /usr/bin/env CC="$(CC)" LD="$(LD)" CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \ + /bin/sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \ + fi + cd "$(LIBFFI_BUILD_DIR)" && $(MAKE) + +else +LIBTARGETS = $(foreach arch,$(ARCHES),"$(BUILD_DIR)"/libffi-$(arch)/.libs/libffi_convenience.a) + +# Build a fat binary and assemble +build_ffi = \ + mkdir -p "$(BUILD_DIR)"/libffi-$(1); \ + (if [ ! -f "$(BUILD_DIR)"/libffi-$(1)/Makefile ]; then \ + echo "Configuring libffi for $(1)"; \ + cd "$(BUILD_DIR)"/libffi-$(1) && \ + env CC="$(CCACHE) $(CC)" CFLAGS="-arch $(1) $(LIBFFI_CFLAGS)" LDFLAGS="-arch $(1)" \ + $(LIBFFI_CONFIGURE) --host=$(1)-apple-darwin > /dev/null; \ + fi); \ + env MACOSX_DEPLOYMENT_TARGET=10.4 $(MAKE) -C "$(BUILD_DIR)"/libffi-$(1) + +target_ffi = "$(BUILD_DIR)"/libffi-$(1)/.libs/libffi_convenience.a:; $(call build_ffi,$(1)) + +# Work out which arches we need to compile the lib for +ifneq ($(findstring ppc,$(ARCHES)),) + $(call target_ffi,ppc) +endif + +ifneq ($(findstring i386,$(ARCHES)),) + $(call target_ffi,i386) +endif + +ifneq ($(findstring x86_64,$(ARCHES)),) + $(call target_ffi,x86_64) +endif + + +$(LIBFFI): $(LIBTARGETS) + # Assemble into a FAT (x86_64, i386, ppc) library + @mkdir -p "$(@D)" + /usr/bin/libtool -static -o $@ \ + $(foreach arch, $(ARCHES),"$(BUILD_DIR)"/libffi-$(arch)/.libs/libffi_convenience.a) + @mkdir -p "$(LIBFFI_BUILD_DIR)"/include + $(RM) "$(LIBFFI_BUILD_DIR)"/include/ffi.h + @( \ + printf "#if defined(__i386__)\n"; \ + printf "#include \"libffi-i386/include/ffi.h\"\n"; \ + printf "#elif defined(__x86_64__)\n"; \ + printf "#include \"libffi-x86_64/include/ffi.h\"\n";\ + printf "#elif defined(__ppc__)\n"; \ + printf "#include \"libffi-ppc/include/ffi.h\"\n";\ + printf "#endif\n";\ + ) > "$(LIBFFI_BUILD_DIR)"/include/ffi.h + @( \ + printf "#if defined(__i386__)\n"; \ + printf "#include \"libffi-i386/include/ffitarget.h\"\n"; \ + printf "#elif defined(__x86_64__)\n"; \ + printf "#include \"libffi-x86_64/include/ffitarget.h\"\n";\ + printf "#elif defined(__ppc__)\n"; \ + printf "#include \"libffi-ppc/include/ffitarget.h\"\n";\ + printf "#endif\n";\ + ) > "$(LIBFFI_BUILD_DIR)"/include/ffitarget.h + +endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.gnu.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.gnu.mk new file mode 100644 index 0000000..2af7a75 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.gnu.mk @@ -0,0 +1,31 @@ +# -*- makefile -*- +# +# Common definitions for all systems that use GNU make +# + + +# Tack the extra deps onto the autogenerated variables +INCFLAGS += -I"$(LIBFFI_BUILD_DIR)"/include +LOCAL_LIBS += $(LIBFFI) +BUILD_DIR = $(shell pwd) +LIBFFI_CFLAGS = $(FFI_MMAP_EXEC) +LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch) + +ifeq ($(srcdir),.) + LIBFFI_SRC_DIR := $(shell pwd)/libffi +else ifeq ($(srcdir),..) + LIBFFI_SRC_DIR := $(shell pwd)/../libffi +else + LIBFFI_SRC_DIR := $(realpath $(srcdir)/libffi) +endif + +LIBFFI = "$(LIBFFI_BUILD_DIR)"/.libs/libffi_convenience.a +LIBFFI_CONFIGURE = "$(LIBFFI_SRC_DIR)"/configure --disable-static \ + --with-pic=yes --disable-dependency-tracking + +$(OBJS): $(LIBFFI) + +# +# libffi.mk or libffi.darwin.mk contains rules for building the actual library +# + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.mk new file mode 100644 index 0000000..85c15c5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.mk @@ -0,0 +1,13 @@ +# -*- makefile -*- + +include ${srcdir}/libffi.gnu.mk + +$(LIBFFI): + @mkdir -p "$(LIBFFI_BUILD_DIR)" "$@(D)" + @if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \ + echo "Configuring libffi"; \ + cd "$(LIBFFI_BUILD_DIR)" && \ + /usr/bin/env CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \ + /bin/sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \ + fi + $(MAKE) -C "$(LIBFFI_BUILD_DIR)" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc.mk new file mode 100644 index 0000000..c62e55f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc.mk @@ -0,0 +1,26 @@ +# -*- makefile -*- +# +# Makefile for msvc +# + +# Tack the extra deps onto the autogenerated variables +INCFLAGS = $(INCFLAGS) -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86 +LOCAL_LIBS = $(LOCAL_LIBS) $(LIBFFI) +BUILD_DIR = $(MAKEDIR) +LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi + +!IF "$(srcdir)" == "." +LIBFFI_SRC_DIR = $(MAKEDIR)/libffi +!ELSE +LIBFFI_SRC_DIR = $(srcdir)/libffi +!ENDIF + +LIBFFI = $(LIBFFI_BUILD_DIR)/.libs/libffi_convenience.lib + +$(OBJS): $(LIBFFI) + +$(LIBFFI): + @$(MAKEDIRS) $(LIBFFI_BUILD_DIR) + @cd $(LIBFFI_BUILD_DIR) && $(MAKE) -f Makefile.vc + + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc64.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc64.mk new file mode 100644 index 0000000..9582948 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc64.mk @@ -0,0 +1,26 @@ +# -*- makefile -*- +# +# Makefile for msvc +# + +# Tack the extra deps onto the autogenerated variables +INCFLAGS = $(INCFLAGS) -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86 +LOCAL_LIBS = $(LOCAL_LIBS) $(LIBFFI) +BUILD_DIR = $(MAKEDIR) +LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi + +!IF "$(srcdir)" == "." +LIBFFI_SRC_DIR = $(MAKEDIR)/libffi +!ELSE +LIBFFI_SRC_DIR = $(srcdir)/libffi +!ENDIF + +LIBFFI = $(LIBFFI_BUILD_DIR)/.libs/libffi_convenience.lib + +$(OBJS): $(LIBFFI) + +$(LIBFFI): + @$(MAKEDIRS) $(LIBFFI_BUILD_DIR) + @cd $(LIBFFI_BUILD_DIR) && $(MAKE) -f Makefile.vc64 + + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog new file mode 100644 index 0000000..d5d1024 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog @@ -0,0 +1,4600 @@ +2011-08-22 Jasper Lievisse Adriaanse + + * configure.ac: Add OpenBSD/hppa and OpenBSD/powerpc support. + * configure: Rebuilt. + +2011-07-11 Andrew Haley + + * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Clear icache. + +2011-06-29 Rainer Orth + + * testsuite/libffi.call/cls_double_va.c: Move PR number to comment. + * testsuite/libffi.call/cls_longdouble_va.c: Likewise. + +2011-06-29 Rainer Orth + + PR libffi/46660 + * testsuite/libffi.call/cls_double_va.c: xfail dg-output on + mips-sgi-irix6*. + * testsuite/libffi.call/cls_longdouble_va.c: Likewise. + +2011-06-14 Rainer Orth + + * testsuite/libffi.call/huge_struct.c (test_large_fn): Use PRIu8, + PRId8 instead of %hhu, %hhd. + * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRId8, + PRIu8): Define. + [__sgi__] (PRId8, PRIu8): Define. + +2011-04-29 Rainer Orth + + * src/alpha/osf.S (UA_SI, FDE_ENCODING, FDE_ENCODE, FDE_ARANGE): + Define. + Use them to handle ELF vs. ECOFF differences. + [__osf__] (_GLOBAL__F_ffi_call_osf): Define. + +2011-03-30 Timothy Wall + + * src/powerpc/darwin.S: Fix unknown FDE encoding. + * src/powerpc/darwin_closure.S: ditto. + +2011-02-25 Anthony Green + + * src/powerpc/ffi.c (ffi_prep_closure_loc): Allow for more + 32-bit ABIs. + +2011-02-15 Anthony Green + + * m4/ax_cc_maxopt.m4: Don't -malign-double or use -ffast-math. + * configure: Rebuilt. + +2011-02-13 Ralf Wildenhues + + * configure: Regenerate. + +2011-02-13 Anthony Green + + * include/ffi_common.h (UNLIKELY, LIKELY): Define. + * src/x86/ffi64.c (UNLIKELY, LIKELY): Remove definition. + * src/prep_cif.c (UNLIKELY, LIKELY): Remove definition. + + * src/prep_cif.c (initialize_aggregate): Convert assertion into + FFI_BAD_TYPEDEF return. Initialize arg size and alignment to 0. + + * src/pa/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, + just return FFI_BAD_ABI when things are wrong. + * src/arm/ffi.c (ffi_prep_closure_loc): Ditto. + * src/powerpc/ffi.c (ffi_prep_closure_loc): Ditto. + * src/mips/ffi.c (ffi_prep_closure_loc): Ditto. + * src/ia64/ffi.c (ffi_prep_closure_loc): Ditto. + * src/avr32/ffi.c (ffi_prep_closure_loc): Ditto. + +2011-02-11 Anthony Green + + * src/sparc/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, + just return FFI_BAD_ABI when things are wrong. + +2011-02-09 Stuart Shelton + + http://bugs.gentoo.org/show_bug.cgi?id=286911 + * src/mips/ffitarget.h: Clean up error messages. + * src/java_raw_api.c (ffi_java_translate_args): Cast raw arg to + ffi_raw*. + * include/ffi.h.in: Add pragma for SGI compiler. + +2011-02-09 Anthony Green + + * configure.ac: Add powerpc64-*-darwin* support. + +2011-02-09 Anthony Green + + * README: Mention Interix. + +2011-02-09 Jonathan Callen + + * configure.ac: Add Interix to win32/cygwin/mingw case. + * configure: Ditto. + * src/closures.c: Treat Interix like Cygwin, instead of as a + generic win32. + +2011-02-09 Anthony Green + + * testsuite/libffi.call/err_bad_typedef.c: Remove xfail. + * testsuite/libffi.call/err_bad_abi.c: Remove xfail. + * src/x86/ffi64.c (UNLIKELY, LIKELY): Define. + (ffi_prep_closure_loc): Check for bad ABI. + * src/prep_cif.c (UNLIKELY, LIKELY): Define. + (initialize_aggregate): Check for bad types. + +2011-02-09 Landon Fuller + + * Makefile.am (EXTRA_DIST): Add build-ios.sh, src/arm/gentramp.sh, + src/arm/trampoline.S. + (nodist_libffi_la_SOURCES): Add src/arc/trampoline.S. + * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Define. + * src/arm/ffi.c (ffi_trampoline_table) + (ffi_closure_trampoline_table_page, ffi_trampoline_table_entry) + (FFI_TRAMPOLINE_CODELOC_CONFIG, FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) + (FFI_TRAMPOLINE_COUNT, ffi_trampoline_lock, ffi_trampoline_tables) + (ffi_trampoline_table_alloc, ffi_closure_alloc, ffi_closure_free): + Define for FFI_EXEC_TRAMPOLINE_TABLE case (iOS). + (ffi_prep_closure_loc): Handl FFI_EXEC_TRAMPOLINE_TABLE case + separately. + * src/arm/sysv.S: Handle Apple iOS host. + * src/closures.c: Handle FFI_EXEC_TRAMPOLINE_TABLE case. + * build-ios.sh: New file. + * fficonfig.h.in, configure, Makefile.in: Rebuilt. + * README: Mention ARM iOS. + +2011-02-08 Oren Held + + * src/dlmalloc.c (_STRUCT_MALLINFO): Define in order to avoid + redefinition of mallinfo on HP-UX. + +2011-02-08 Ginn Chen + + * src/sparc/ffi.c (ffi_call): Make compatible with Solaris Studio + aggregate return ABI. Flush cache. + (ffi_prep_closure_loc): Flush cache. + +2011-02-11 Anthony Green + + From Tom Honermann : + * src/powerpc/aix.S (ffi_call_AIX): Support for xlc toolchain on + AIX. Declare .ffi_prep_args. Insert nops after branch + instructions so that the AIX linker can insert TOC reload + instructions. + * src/powerpc/aix_closure.S: Declare .ffi_closure_helper_DARWIN. + +2011-02-08 Ed + + * src/powerpc/asm.h: Fix grammar nit in comment. + +2011-02-08 Uli Link + + * include/ffi.h.in (FFI_64_BIT_MAX): Define and use. + +2011-02-09 Rainer Orth + + PR libffi/46661 + * testsuite/libffi.call/cls_pointer.c (main): Cast void * to + uintptr_t first. + * testsuite/libffi.call/cls_pointer_stack.c (main): Likewise. + +2011-02-08 Rafael Avila de Espindola + + * configure.ac: Fix x86 test for pc related relocs. + * configure: Rebuilt. + +2011-02-07 Joel Sherrill + + * libffi/src/m68k/ffi.c: Add RTEMS support for cache flushing. + Handle case when CPU variant does not have long double support. + * libffi/src/m68k/sysv.S: Add support for mc68000, Coldfire, + and cores with soft floating point. + +2011-02-07 Joel Sherrill + + * configure.ac: Add mips*-*-rtems* support. + * configure: Regenerate. + * src/mips/ffitarget.h: Ensure needed constants are available + for targets which do not have sgidefs.h. + +2011-01-26 Dave Korn + + PR target/40125 + * configure.ac (AM_LTLDFLAGS): Add -bindir option for windows DLLs. + * configure: Regenerate. + +2010-12-18 Iain Sandoe + + PR libffi/29152 + PR libffi/42378 + * src/powerpc/darwin_closure.S: Provide Darwin64 implementation, + update comments. + * src/powerpc/ffitarget.h (POWERPC_DARWIN64): New, + (FFI_TRAMPOLINE_SIZE): Update for Darwin64. + * src/powerpc/darwin.S: Provide Darwin64 implementation, + update comments. + * src/powerpc/ffi_darwin.c: Likewise. + +2010-12-06 Rainer Orth + + * configure.ac (libffi_cv_as_ascii_pseudo_op): Use double + backslashes. + (libffi_cv_as_string_pseudo_op): Likewise. + * configure: Regenerate. + +2010-12-03 Chung-Lin Tang + + * src/arm/sysv.S (ffi_closure_SYSV): Add UNWIND to .pad directive. + (ffi_closure_VFP): Same. + (ffi_call_VFP): Move down to before ffi_closure_VFP. Add '.fpu vfp' + directive. + +2010-12-01 Rainer Orth + + * testsuite/libffi.call/ffitest.h [__sgi] (PRId64, PRIu64): Define. + (PRIuPTR): Define. + +2010-11-29 Richard Henderson + Rainer Orth + + * src/x86/sysv.S (FDE_ENCODING, FDE_ENCODE): Define. + (.eh_frame): Use FDE_ENCODING. + (.LASFDE1, .LASFDE2, LASFDE3): Simplify with FDE_ENCODE. + +2010-11-22 Jacek Caban + + * configure.ac: Check for symbol underscores on mingw-w64. + * configure: Rebuilt. + * src/x86/win64.S: Correctly access extern symbols in respect to + underscores. + +2010-11-15 Rainer Orth + + * testsuite/lib/libffi-dg.exp: Rename ... + * testsuite/lib/libffi.exp: ... to this. + * libffi/testsuite/libffi.call/call.exp: Don't load libffi-dg.exp. + * libffi/testsuite/libffi.special/special.exp: Likewise. + +2010-10-28 Chung-Lin Tang + + * src/arm/ffi.c (ffi_prep_args): Add VFP register argument handling + code, new parameter, and return value. Update comments. + (ffi_prep_cif_machdep): Add case for VFP struct return values. Add + call to layout_vfp_args(). + (ffi_call_SYSV): Update declaration. + (ffi_call_VFP): New declaration. + (ffi_call): Add VFP struct return conditions. Call ffi_call_VFP() + when ABI is FFI_VFP. + (ffi_closure_VFP): New declaration. + (ffi_closure_SYSV_inner): Add new vfp_args parameter, update call to + ffi_prep_incoming_args_SYSV(). + (ffi_prep_incoming_args_SYSV): Update parameters. Add VFP argument + case handling. + (ffi_prep_closure_loc): Pass ffi_closure_VFP to trampoline + construction under VFP hard-float. + (rec_vfp_type_p): New function. + (vfp_type_p): Same. + (place_vfp_arg): Same. + (layout_vfp_args): Same. + * src/arm/ffitarget.h (ffi_abi): Add FFI_VFP. Define FFI_DEFAULT_ABI + based on __ARM_PCS_VFP. + (FFI_EXTRA_CIF_FIELDS): Define for adding VFP hard-float specific + fields. + (FFI_TYPE_STRUCT_VFP_FLOAT): Define internally used type code. + (FFI_TYPE_STRUCT_VFP_DOUBLE): Same. + * src/arm/sysv.S (ffi_call_SYSV): Change call of ffi_prep_args() to + direct call. Move function pointer load upwards. + (ffi_call_VFP): New function. + (ffi_closure_VFP): Same. + + * testsuite/lib/libffi-dg.exp (check-flags): New function. + (dg-skip-if): New function. + * testsuite/libffi.call/cls_double_va.c: Skip if target is arm*-*-* + and compiler options include -mfloat-abi=hard. + * testsuite/libffi.call/cls_longdouble_va.c: Same. + +2010-10-01 Jakub Jelinek + + PR libffi/45677 + * src/x86/ffi64.c (ffi_prep_cif_machdep): Ensure cif->bytes is + a multiple of 8. + * testsuite/libffi.call/many2.c: New test. + +2010-08-20 Mark Wielaard + + * src/closures.c (open_temp_exec_file_mnt): Check if getmntent_r + returns NULL. + +2010-08-09 Andreas Tobler + + * configure.ac: Add target powerpc64-*-freebsd*. + * configure: Regenerate. + * testsuite/libffi.call/cls_align_longdouble_split.c: Pass + -mlong-double-128 only to linux targets. + * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise. + * testsuite/libffi.call/cls_longdouble.c: Likewise. + * testsuite/libffi.call/huge_struct.c: Likewise. + +2010-08-05 Dan Witte + + * Makefile.am: Pass FFI_DEBUG define to msvcc.sh for linking to the + debug CRT when --enable-debug is given. + * configure.ac: Define it. + * msvcc.sh: Translate -g and -DFFI_DEBUG appropriately. + +2010-08-04 Dan Witte + + * src/x86/ffitarget.h: Add X86_ANY define for all x86/x86_64 + platforms. + * src/x86/ffi.c: Remove redundant ifdef checks. + * src/prep_cif.c: Push stack space computation into src/x86/ffi.c + for X86_ANY so return value space doesn't get added twice. + +2010-08-03 Neil Rashbrooke + + * msvcc.sh: Don't pass -safeseh to ml64 because behavior is buggy. + +2010-07-22 Dan Witte + + * src/*/ffitarget.h: Make FFI_LAST_ABI one past the last valid ABI. + * src/prep_cif.c: Fix ABI assertion. + * src/cris/ffi.c: Ditto. + +2010-07-10 Evan Phoenix + + * src/closures.c (selinux_enabled_check): Fix strncmp usage bug. + +2010-07-07 Dan Horák + + * include/ffi.h.in: Protect #define with #ifndef. + * src/powerpc/ffitarget.h: Ditto. + * src/s390/ffitarget.h: Ditto. + * src/sparc/ffitarget.h: Ditto. + +2010-07-07 Neil Roberts + + * src/x86/sysv.S (ffi_call_SYSV): Align the stack pointer to + 16-bytes. + +2010-07-02 Jakub Jelinek + + * Makefile.am (AM_MAKEFLAGS): Pass also mandir to submakes. + * Makefile.in: Regenerated. + +2010-05-19 Rainer Orth + + * configure.ac (libffi_cv_as_x86_pcrel): Check for illegal in as + output, too. + (libffi_cv_as_ascii_pseudo_op): Check for .ascii. + (libffi_cv_as_string_pseudo_op): Check for .string. + * configure: Regenerate. + * fficonfig.h.in: Regenerate. + * src/x86/sysv.S (.eh_frame): Use .ascii, .string or error. + +2010-05-11 Dan Witte + + * doc/libffi.tex: Document previous change. + +2010-05-11 Makoto Kato + + * src/x86/ffi.c (ffi_call): Don't copy structs passed by value. + +2010-05-05 Michael Kohler + + * src/dlmalloc.c (dlfree): Fix spelling. + * src/ia64/ffi.c (ffi_prep_cif_machdep): Ditto. + * configure.ac: Ditto. + * configure: Rebuilt. + +2010-04-13 Dan Witte + + * msvcc.sh: Build with -W3 instead of -Wall. + * src/powerpc/ffi_darwin.c: Remove build warnings. + * src/x86/ffi.c: Ditto. + * src/x86/ffitarget.h: Ditto. + +2010-04-12 Dan Witte + Walter Meinl + + * configure.ac: Add OS/2 support. + * configure: Rebuilt. + * src/closures.c: Ditto. + * src/dlmalloc.c: Ditto. + * src/x86/win32.S: Ditto. + +2010-04-07 Jakub Jelinek + + * testsuite/libffi.call/err_bad_abi.c: Remove unused args variable. + +2010-04-02 Ralf Wildenhues + + * Makefile.in: Regenerate. + * aclocal.m4: Regenerate. + * include/Makefile.in: Regenerate. + * man/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2010-03-30 Dan Witte + + * msvcc.sh: Disable build warnings. + * README (tested): Clarify windows build procedure. + +2010-03-15 Rainer Orth + + * configure.ac (libffi_cv_as_x86_64_unwind_section_type): New test. + * configure: Regenerate. + * fficonfig.h.in: Regenerate. + * libffi/src/x86/unix64.S (.eh_frame) + [HAVE_AS_X86_64_UNWIND_SECTION_TYPE]: Use @unwind section type. + +2010-03-14 Matthias Klose + + * src/x86/ffi64.c: Fix typo in comment. + * src/x86/ffi.c: Use /* ... */ comment style. + +2010-02-24 Rainer Orth + + * doc/libffi.texi (The Closure API): Fix typo. + * doc/libffi.info: Remove. + +2010-02-15 Matthias Klose + + * src/arm/sysv.S (__ARM_ARCH__): Define for processor + __ARM_ARCH_7EM__. + +2010-01-15 Anthony Green + + * README: Add notes on building with Microsoft Visual C++. + +2010-01-15 Daniel Witte + + * msvcc.sh: New file. + + * src/x86/win32.S: Port assembly routines to MSVC and #ifdef. + * src/x86/ffi.c: Tweak function declaration and remove excess + parens. + * include/ffi.h.in: Add __declspec(align(8)) to typedef struct + ffi_closure. + + * src/x86/ffi.c: Merge ffi_call_SYSV and ffi_call_STDCALL into new + function ffi_call_win32 on X86_WIN32. + * src/x86/win32.S (ffi_call_SYSV): Rename to ffi_call_win32. + (ffi_call_STDCALL): Remove. + + * src/prep_cif.c (ffi_prep_cif): Move stack space allocation code + to ffi_prep_cif_machdep for x86. + * src/x86/ffi.c (ffi_prep_cif_machdep): To here. + +2010-01-15 Oliver Kiddle + + * src/x86/ffitarget.h (ffi_abi): Check for __i386 and __amd64 for + Sun Studio compiler compatibility. + +2010-01-12 Conrad Irwin + + * doc/libffi.texi: Add closure example. + +2010-01-07 Rainer Orth + + PR libffi/40701 + * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRIdLL, + PRIuLL, PRId64, PRIu64, PRIuPTR): Define. + * testsuite/libffi.call/cls_align_sint64.c: Add -Wno-format on + alpha*-dec-osf*. + * testsuite/libffi.call/cls_align_uint64.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/return_ll1.c: Likewise. + * testsuite/libffi.call/stret_medium2.c: Likewise. + * testsuite/libffi.special/ffitestcxx.h (allocate_mmap): Cast + MAP_FAILED to char *. + +2010-01-06 Rainer Orth + + * src/mips/n32.S: Use .abicalls and .eh_frame with __GNUC__. + +2009-12-31 Anthony Green + + * README: Update for libffi 3.0.9. + +2009-12-27 Matthias Klose + + * configure.ac (HAVE_LONG_DOUBLE): Define for mips when + appropriate. + * configure: Rebuilt. + +2009-12-26 Anthony Green + + * testsuite/libffi.call/cls_longdouble_va.c: Mark as xfail for + avr32*-*-*. + * testsuite/libffi.call/cls_double_va.c: Ditto. + +2009-12-26 Andreas Tobler + + * testsuite/libffi.call/ffitest.h: Conditionally include stdint.h + and inttypes.h. + * testsuite/libffi.special/unwindtest.cc: Ditto. + +2009-12-26 Andreas Tobler + + * configure.ac: Add amd64-*-openbsd*. + * configure: Rebuilt. + * testsuite/lib/libffi-dg.exp (libffi_target_compile): Link + openbsd programs with -lpthread. + +2009-12-26 Anthony Green + + * testsuite/libffi.call/cls_double_va.c, + testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c: Remove xfail for + mips*-*-* and arm*-*-*. + * testsuite/libffi.call/cls_align_longdouble_split.c, + testsuite/libffi.call/cls_align_longdouble_split2.c, + testsuite/libffi.call/stret_medium2.c, + testsuite/libffi.call/stret_medium.c, + testsuite/libffi.call/stret_large.c, + testsuite/libffi.call/stret_large2.c: Remove xfail for arm*-*-*. + +2009-12-31 Kay Tietz + + * testsuite/libffi.call/ffitest.h, + testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRuLL): Fix + definitions. + +2009-12-31 Carlo Bramini + + * configure.ac (AM_LTLDFLAGS): Define for windows hosts. + * Makefile.am (libffi_la_LDFLAGS): Add AM_LTLDFLAGS. + * configure: Rebuilt. + * Makefile.in: Rebuilt. + +2009-12-31 Anthony Green + Blake Chaffin. + + * testsuite/libffi.call/huge_struct.c: New test case from Blake + Chaffin @ Apple. + +2009-12-28 David Edelsohn + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Copy abi and nargs to + local variables. + (aix_adjust_aggregate_sizes): New function. + (ffi_prep_cif_machdep): Call it. + +2009-12-26 Andreas Tobler + + * configure.ac: Define FFI_MMAP_EXEC_WRIT for the given targets. + * configure: Regenerate. + * fficonfig.h.in: Likewise. + * src/closures.c: Remove the FFI_MMAP_EXEC_WRIT definition for + Solaris/x86. + +2009-12-26 Andreas Schwab + + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Advance intarg_count + when a float arguments is passed in memory. + (ffi_closure_helper_SYSV): Mark general registers as used up when + a 64bit or soft-float long double argument is passed in memory. + +2009-12-25 Matthias Klose + + * man/ffi_call.3: Fix #include in examples. + * doc/libffi.texi: Add dircategory. + +2009-12-25 Frank Everdij + + * include/ffi.h.in: Placed '__GNUC__' ifdef around + '__attribute__((aligned(8)))' in ffi_closure, fixes compile for + IRIX MIPSPro c99. + * include/ffi_common.h: Added '__sgi' define to non + '__attribute__((__mode__()))' integer typedefs. + * src/mips/ffi.c (ffi_call, ffi_closure_mips_inner_O32, + ffi_closure_mips_inner_N32): Added 'defined(_MIPSEB)' to BE check. + (ffi_closure_mips_inner_O32, ffi_closure_mips_inner_N32): Added + FFI_LONGDOUBLE support and alignment(N32 only). + * src/mips/ffitarget.h: Corrected '#include ' for IRIX and + fixed non '__attribute__((__mode__()))' integer typedefs. + * src/mips/n32.S: Put '#ifdef linux' around '.abicalls' and '.eh_frame' + since they are Linux/GNU Assembler specific. + +2009-12-25 Bradley Smith + + * configure.ac, Makefile.am, src/avr32/ffi.c, + src/avr32/ffitarget.h, + src/avr32/sysv.S: Add AVR32 port. + * configure, Makefile.in: Rebuilt. + +2009-12-21 Andreas Tobler + + * configure.ac: Make i?86 build on FreeBSD and OpenBSD. + * configure: Regenerate. + +2009-12-15 John David Anglin + + * testsuite/libffi.call/ffitest.h: Define PRIuPTR on PA HP-UX. + +2009-12-13 John David Anglin + + * src/pa/ffi.c (ffi_closure_inner_pa32): Handle FFI_TYPE_LONGDOUBLE + type on HP-UX. + +2009-12-11 Eric Botcazou + + * src/sparc/ffi.c (ffi_closure_sparc_inner_v9): Properly align 'long + double' arguments. + +2009-12-11 Eric Botcazou + + * testsuite/libffi.call/ffitest.h: Define PRIuPTR on Solaris < 10. + +2009-12-10 Rainer Orth + + PR libffi/40700 + * src/closures.c [X86_64 && __sun__ && __svr4__] + (FFI_MMAP_EXEC_WRIT): Define. + +2009-12-08 David Daney + + * testsuite/libffi.call/stret_medium.c: Remove xfail for mips*-*-* + * testsuite/libffi.call/cls_align_longdouble_split2.c: Same. + * testsuite/libffi.call/stret_large.c: Same. + * testsuite/libffi.call/cls_align_longdouble_split.c: Same. + * testsuite/libffi.call/stret_large2.c: Same. + * testsuite/libffi.call/stret_medium2.c: Same. + +2009-12-07 David Edelsohn + + * src/powerpc/aix_closure.S (libffi_closure_ASM): Fix tablejump + typo. + +2009-12-05 David Edelsohn + + * src/powerpc/aix.S: Update AIX32 code to be consistent with AIX64 + code. + * src/powerpc/aix_closure.S: Same. + +2009-12-05 Ralf Wildenhues + + * Makefile.in: Regenerate. + * configure: Regenerate. + * include/Makefile.in: Regenerate. + * man/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2009-12-04 David Edelsohn + + * src/powerpc/aix_closure.S: Reorganize 64-bit code to match + linux64_closure.S. + +2009-12-04 Uros Bizjak + + PR libffi/41908 + * src/x86/ffi64.c (classify_argument): Update from + gcc/config/i386/i386.c. + (ffi_closure_unix64_inner): Do not use the address of two consecutive + SSE registers directly. + * testsuite/libffi.call/cls_dbls_struct.c (main): Remove xfail + for x86_64 linux targets. + +2009-12-04 David Edelsohn + + * src/powerpc/ffi_darwin.c (ffi_closure_helper_DARWIN): Increment + pfr for long double split between fpr13 and stack. + +2009-12-03 David Edelsohn + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Increment next_arg and + fparg_count twice for long double. + +2009-12-03 David Edelsohn + + PR libffi/42243 + * src/powerpc/ffi_darwin.c (ffi_prep_args): Remove extra parentheses. + +2009-12-03 Uros Bizjak + + * testsuite/libffi.call/cls_longdouble_va.c (main): Fix format string. + Remove xfails for x86 linux targets. + +2009-12-02 David Edelsohn + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Fix typo in INT64 + case. + +2009-12-01 David Edelsohn + + * src/powerpc/aix.S (ffi_call_AIX): Convert to more standard + register usage. Call ffi_prep_args directly. Add long double + return value support. + * src/powerpc/ffi_darwin.c (ffi_prep_args): Double arg increment + applies to FFI_TYPE_DOUBLE. Correct fpr_base increment typo. + Separate FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases. + (ffi_prep_cif_machdep): Only 16 byte stack alignment in 64 bit + mode. + (ffi_closure_helper_DARWIN): Remove nf and ng counters. Move temp + into case. + * src/powerpc/aix_closure.S: Maintain 16 byte stack alignment. + Allocate result area between params and FPRs. + +2009-11-30 David Edelsohn + + PR target/35484 + * src/powerpc/ffitarget.h (POWERPC64): Define for PPC64 Linux and + AIX64. + * src/powerpc/aix.S: Implement AIX64 version. + * src/powerpc/aix_closure.S: Implement AIX64 version. + (ffi_closure_ASM): Use extsb, lha and displament addresses. + * src/powerpc/ffi_darwin.c (ffi_prep_args): Implement AIX64 + support. + (ffi_prep_cif_machdep): Same. + (ffi_call): Same. + (ffi_closure_helper_DARWIN): Same. + +2009-11-02 Andreas Tobler + + PR libffi/41908 + * testsuite/libffi.call/testclosure.c: New test. + +2009-09-28 Kai Tietz + + * src/x86/win64.S (_ffi_call_win64 stack): Remove for gnu + assembly version use of ___chkstk. + +2009-09-23 Matthias Klose + + PR libffi/40242, PR libffi/41443 + * src/arm/sysv.S (__ARM_ARCH__): Define for processors + __ARM_ARCH_6T2__, __ARM_ARCH_6M__, __ARM_ARCH_7__, + __ARM_ARCH_7A__, __ARM_ARCH_7R__, __ARM_ARCH_7M__. + Change the conditionals to __SOFTFP__ || __ARM_EABI__ + for -mfloat-abi=softfp to work. + +2009-09-17 Loren J. Rittle + + PR testsuite/32843 (strikes again) + * src/x86/ffi.c (ffi_prep_cif_machdep): Add X86_FREEBSD to + enable proper extension on char and short. + +2009-09-15 David Daney + + * src/java_raw_api.c (ffi_java_raw_to_rvalue): Remove special + handling for FFI_TYPE_POINTER. + * src/mips/ffitarget.h (FFI_TYPE_STRUCT_D_SOFT, + FFI_TYPE_STRUCT_F_SOFT, FFI_TYPE_STRUCT_DD_SOFT, + FFI_TYPE_STRUCT_FF_SOFT, FFI_TYPE_STRUCT_FD_SOFT, + FFI_TYPE_STRUCT_DF_SOFT, FFI_TYPE_STRUCT_SOFT): New defines. + (FFI_N32_SOFT_FLOAT, FFI_N64_SOFT_FLOAT): New ffi_abi enumerations. + (enum ffi_abi): Set FFI_DEFAULT_ABI for soft-float. + * src/mips/n32.S (ffi_call_N32): Add handling for soft-float + structure and pointer returns. + (ffi_closure_N32): Add handling for pointer returns. + * src/mips/ffi.c (ffi_prep_args, calc_n32_struct_flags, + calc_n32_return_struct_flags): Handle soft-float. + (ffi_prep_cif_machdep): Handle soft-float, fix pointer handling. + (ffi_call_N32): Declare proper argument types. + (ffi_call, copy_struct_N32, ffi_closure_mips_inner_N32): Handle + soft-float. + +2009-08-24 Ralf Wildenhues + + * configure.ac (AC_PREREQ): Bump to 2.64. + +2009-08-22 Ralf Wildenhues + + * Makefile.am (install-html, install-pdf): Remove. + * Makefile.in: Regenerate. + + * Makefile.in: Regenerate. + * aclocal.m4: Regenerate. + * configure: Regenerate. + * fficonfig.h.in: Regenerate. + * include/Makefile.in: Regenerate. + * man/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2009-07-30 Ralf Wildenhues + + * configure.ac (_AC_ARG_VAR_PRECIOUS): Use m4_rename_force. + +2009-07-24 Dave Korn + + PR libffi/40807 + * src/x86/ffi.c (ffi_prep_cif_machdep): Also use sign/zero-extending + return types for X86_WIN32. + * src/x86/win32.S (_ffi_call_SYSV): Handle omitted return types. + (_ffi_call_STDCALL, _ffi_closure_SYSV, _ffi_closure_raw_SYSV, + _ffi_closure_STDCALL): Likewise. + + * src/closures.c (is_selinux_enabled): Define to const 0 for Cygwin. + (dlmmap, dlmunmap): Also use these functions on Cygwin. + +2009-07-11 Richard Sandiford + + PR testsuite/40699 + PR testsuite/40707 + PR testsuite/40709 + * testsuite/lib/libffi-dg.exp: Revert 2009-07-02, 2009-07-01 and + 2009-06-30 commits. + +2009-07-01 Richard Sandiford + + * testsuite/lib/libffi-dg.exp (libffi-init): Set ld_library_path + to "" before adding paths. (This reinstates an assignment that + was removed by my 2009-06-30 commit, but changes the initial + value from "." to "".) + +2009-07-01 H.J. Lu + + PR testsuite/40601 + * testsuite/lib/libffi-dg.exp (libffi-init): Properly set + gccdir. Adjust ld_library_path for gcc only if gccdir isn't + empty. + +2009-06-30 Richard Sandiford + + * testsuite/lib/libffi-dg.exp (libffi-init): Don't add "." + to ld_library_path. Use add_path. Add just find_libgcc_s + to ld_library_path, not every libgcc multilib directory. + +2009-06-16 Wim Lewis + + * src/powerpc/ffi.c: Avoid clobbering cr3 and cr4, which are + supposed to be callee-saved. + * src/powerpc/sysv.S (small_struct_return_value): Fix overrun of + return buffer for odd-size structs. + +2009-06-16 Andreas Tobler + + PR libffi/40444 + * testsuite/lib/libffi-dg.exp (libffi_target_compile): Add + allow_stack_execute for Darwin. + +2009-06-16 Andrew Haley + + * configure.ac (TARGETDIR): Add missing blank lines. + * configure: Regenerate. + +2009-06-16 Andrew Haley + + * testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_medium2.c: Fix printf format + specifiers. + * testsuite/libffi.call/ffitest.h, + testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. + +2009-06-15 Andrew Haley + + * testsuite/libffi.call/err_bad_typedef.c: xfail everywhere. + * testsuite/libffi.call/err_bad_abi.c: Likewise. + +2009-06-12 Andrew Haley + + * Makefile.am: Remove info_TEXINFOS. + +2009-06-12 Andrew Haley + + * ChangeLog.libffi: testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_medium2.c: Fix printf format + specifiers. + testsuite/libffi.special/unwindtest.cc: include stdint.h. + +2009-06-11 Timothy Wall + + * Makefile.am, + configure.ac, + include/ffi.h.in, + include/ffi_common.h, + src/closures.c, + src/dlmalloc.c, + src/x86/ffi.c, + src/x86/ffitarget.h, + src/x86/win64.S (new), + README: Added win64 support (mingw or MSVC) + * Makefile.in, + include/Makefile.in, + man/Makefile.in, + testsuite/Makefile.in, + configure, + aclocal.m4: Regenerated + * ltcf-c.sh: properly escape cygwin/w32 path + * man/ffi_call.3: Clarify size requirements for return value. + * src/x86/ffi64.c: Fix filename in comment. + * src/x86/win32.S: Remove unused extern. + + * testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/closure_stdcall.c, + testsuite/libffi.call/cls_12byte.c, + testsuite/libffi.call/cls_16byte.c, + testsuite/libffi.call/cls_18byte.c, + testsuite/libffi.call/cls_19byte.c, + testsuite/libffi.call/cls_1_1byte.c, + testsuite/libffi.call/cls_20byte.c, + testsuite/libffi.call/cls_20byte1.c, + testsuite/libffi.call/cls_24byte.c, + testsuite/libffi.call/cls_2byte.c, + testsuite/libffi.call/cls_3_1byte.c, + testsuite/libffi.call/cls_3byte1.c, + testsuite/libffi.call/cls_3byte2.c, + testsuite/libffi.call/cls_4_1byte.c, + testsuite/libffi.call/cls_4byte.c, + testsuite/libffi.call/cls_5_1_byte.c, + testsuite/libffi.call/cls_5byte.c, + testsuite/libffi.call/cls_64byte.c, + testsuite/libffi.call/cls_6_1_byte.c, + testsuite/libffi.call/cls_6byte.c, + testsuite/libffi.call/cls_7_1_byte.c, + testsuite/libffi.call/cls_7byte.c, + testsuite/libffi.call/cls_8byte.c, + testsuite/libffi.call/cls_9byte1.c, + testsuite/libffi.call/cls_9byte2.c, + testsuite/libffi.call/cls_align_double.c, + testsuite/libffi.call/cls_align_float.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_align_longdouble_split.c, + testsuite/libffi.call/cls_align_longdouble_split2.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_align_sint16.c, + testsuite/libffi.call/cls_align_sint32.c, + testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint16.c, + testsuite/libffi.call/cls_align_uint32.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_dbls_struct.c, + testsuite/libffi.call/cls_double.c, + testsuite/libffi.call/cls_double_va.c, + testsuite/libffi.call/cls_float.c, + testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_multi_schar.c, + testsuite/libffi.call/cls_multi_sshort.c, + testsuite/libffi.call/cls_multi_sshortchar.c, + testsuite/libffi.call/cls_multi_uchar.c, + testsuite/libffi.call/cls_multi_ushort.c, + testsuite/libffi.call/cls_multi_ushortchar.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c, + testsuite/libffi.call/cls_schar.c, + testsuite/libffi.call/cls_sint.c, + testsuite/libffi.call/cls_sshort.c, + testsuite/libffi.call/cls_uchar.c, + testsuite/libffi.call/cls_uint.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/cls_ushort.c, + testsuite/libffi.call/err_bad_abi.c, + testsuite/libffi.call/err_bad_typedef.c, + testsuite/libffi.call/float2.c, + testsuite/libffi.call/huge_struct.c, + testsuite/libffi.call/nested_struct.c, + testsuite/libffi.call/nested_struct1.c, + testsuite/libffi.call/nested_struct10.c, + testsuite/libffi.call/nested_struct2.c, + testsuite/libffi.call/nested_struct3.c, + testsuite/libffi.call/nested_struct4.c, + testsuite/libffi.call/nested_struct5.c, + testsuite/libffi.call/nested_struct6.c, + testsuite/libffi.call/nested_struct7.c, + testsuite/libffi.call/nested_struct8.c, + testsuite/libffi.call/nested_struct9.c, + testsuite/libffi.call/problem1.c, + testsuite/libffi.call/return_ldl.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_large.c, + testsuite/libffi.call/stret_large2.c, + testsuite/libffi.call/stret_medium.c, + testsuite/libffi.call/stret_medium2.c, + testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead + of checking for MMAP. Use intptr_t instead of long casts. + +2009-06-11 Kaz Kojima + + * testsuite/libffi.call/cls_longdouble_va.c: Add xfail sh*-*-linux-*. + * testsuite/libffi.call/err_bad_abi.c: Add xfail sh*-*-*. + * testsuite/libffi.call/err_bad_typedef.c: Likewise. + +2009-06-09 Andrew Haley + + * src/x86/freebsd.S: Add missing file. + +2009-06-08 Andrew Haley + + Import from libffi 3.0.8: + + * doc/libffi.texi: New file. + * doc/libffi.info: Likewise. + * doc/stamp-vti: Likewise. + * man/Makefile.am: New file. + * man/ffi_call.3: New file. + + * Makefile.am (EXTRA_DIST): Add src/x86/darwin64.S, + src/dlmalloc.c. + (nodist_libffi_la_SOURCES): Add X86_FREEBSD. + + * configure.ac: Bump version to 3.0.8. + parisc*-*-linux*: Add. + i386-*-freebsd* | i386-*-openbsd*: Add. + powerpc-*-beos*: Add. + AM_CONDITIONAL X86_FREEBSD: Add. + AC_CONFIG_FILES: Add man/Makefile. + + * include/ffi.h.in (FFI_FN): Change void (*)() to void (*)(void). + +2009-06-08 Andrew Haley + + * README: Import from libffi 3.0.8. + +2009-06-08 Andrew Haley + + * testsuite/libffi.call/err_bad_abi.c: Add xfails. + * testsuite/libffi.call/cls_longdouble_va.c: Add xfails. + * testsuite/libffi.call/cls_dbls_struct.c: Add xfail x86_64-*-linux-*. + * testsuite/libffi.call/err_bad_typedef.c: Add xfails. + + * testsuite/libffi.call/stret_medium2.c: Add __UNUSED__ to args. + * testsuite/libffi.call/stret_medium.c: Likewise. + * testsuite/libffi.call/stret_large2.c: Likewise. + * testsuite/libffi.call/stret_large.c: Likewise. + +2008-12-26 Timothy Wall + + * testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_align_longdouble_split.c, + testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected + failures on x86_64 cygwin/mingw. + +2008-12-22 Timothy Wall + + * testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/closure_loc_fn0.c, + testsuite/libffi.call/closure_stdcall.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c: use portable cast from + pointer to integer (intptr_t). + * testsuite/libffi.call/cls_longdouble.c: disable for win64. + +2008-07-24 Anthony Green + + * testsuite/libffi.call/cls_dbls_struct.c, + testsuite/libffi.call/cls_double_va.c, + testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c, + testsuite/libffi.call/err_bad_abi.c: Clean up failures from + compiler warnings. + +2008-03-04 Anthony Green + Blake Chaffin + hos@tamanegi.org + + * testsuite/libffi.call/cls_align_longdouble_split2.c + testsuite/libffi.call/cls_align_longdouble_split.c + testsuite/libffi.call/cls_dbls_struct.c + testsuite/libffi.call/cls_double_va.c + testsuite/libffi.call/cls_longdouble.c + testsuite/libffi.call/cls_longdouble_va.c + testsuite/libffi.call/cls_pointer.c + testsuite/libffi.call/cls_pointer_stack.c + testsuite/libffi.call/err_bad_abi.c + testsuite/libffi.call/err_bad_typedef.c + testsuite/libffi.call/stret_large2.c + testsuite/libffi.call/stret_large.c + testsuite/libffi.call/stret_medium2.c + testsuite/libffi.call/stret_medium.c: New tests from Apple. + +2009-06-05 Andrew Haley + + * src/x86/ffitarget.h, src/x86/ffi.c: Merge stdcall changes from + libffi. + +2009-06-04 Andrew Haley + + * src/x86/ffitarget.h, src/x86/win32.S, src/x86/ffi.c: Back out + stdcall changes. + +2008-02-26 Anthony Green + Thomas Heller + + * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C + comment. + +2008-02-03 Timothy Wall + + * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return + offset based on code pointer, not data pointer. + +2008-01-31 Timothy Wall + + * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall + closures. + * src/x86/ffitarget.h: Increase size of trampoline for stdcall + closures. + * src/x86/win32.S: Add assembly for stdcall closure. + * src/x86/ffi.c: Initialize stdcall closure trampoline. + +2009-06-04 Andrew Haley + + * include/ffi.h.in: Change void (*)() to void (*)(void). + * src/x86/ffi.c: Likewise. + +2009-06-04 Andrew Haley + + * src/powerpc/ppc_closure.S: Insert licence header. + * src/powerpc/linux64_closure.S: Likewise. + * src/m68k/sysv.S: Likewise. + + * src/sh64/ffi.c: Change void (*)() to void (*)(void). + * src/powerpc/ffi.c: Likewise. + * src/powerpc/ffi_darwin.c: Likewise. + * src/m32r/ffi.c: Likewise. + * src/sh64/ffi.c: Likewise. + * src/x86/ffi64.c: Likewise. + * src/alpha/ffi.c: Likewise. + * src/alpha/osf.S: Likewise. + * src/frv/ffi.c: Likewise. + * src/s390/ffi.c: Likewise. + * src/pa/ffi.c: Likewise. + * src/pa/hpux32.S: Likewise. + * src/ia64/unix.S: Likewise. + * src/ia64/ffi.c: Likewise. + * src/sparc/ffi.c: Likewise. + * src/mips/ffi.c: Likewise. + * src/sh/ffi.c: Likewise. + +2008-02-15 David Daney + + * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): + Define (conditionally), and use it to include cachectl.h. + (ffi_prep_closure_loc): Fix cache flushing. + * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. + +2009-06-04 Andrew Haley + + include/ffi.h.in, + src/arm/ffitarget.h, + src/arm/ffi.c, + src/arm/sysv.S, + src/powerpc/ffitarget.h, + src/closures.c, + src/sh64/ffitarget.h, + src/sh64/ffi.c, + src/sh64/sysv.S, + src/types.c, + src/x86/ffi64.c, + src/x86/ffitarget.h, + src/x86/win32.S, + src/x86/darwin.S, + src/x86/ffi.c, + src/x86/sysv.S, + src/x86/unix64.S, + src/alpha/ffitarget.h, + src/alpha/ffi.c, + src/alpha/osf.S, + src/m68k/ffitarget.h, + src/frv/ffitarget.h, + src/frv/ffi.c, + src/s390/ffitarget.h, + src/s390/sysv.S, + src/cris/ffitarget.h, + src/pa/linux.S, + src/pa/ffitarget.h, + src/pa/ffi.c, + src/raw_api.c, + src/ia64/ffitarget.h, + src/ia64/unix.S, + src/ia64/ffi.c, + src/ia64/ia64_flags.h, + src/java_raw_api.c, + src/debug.c, + src/sparc/v9.S, + src/sparc/ffitarget.h, + src/sparc/ffi.c, + src/sparc/v8.S, + src/mips/ffitarget.h, + src/mips/n32.S, + src/mips/o32.S, + src/mips/ffi.c, + src/prep_cif.c, + src/sh/ffitarget.h, + src/sh/ffi.c, + src/sh/sysv.S: Update license text. + +2009-05-22 Dave Korn + + * src/x86/win32.S (_ffi_closure_STDCALL): New function. + (.eh_frame): Add FDE for it. + +2009-05-22 Dave Korn + + * configure.ac: Also check if assembler supports pc-relative + relocs on X86_WIN32 targets. + * configure: Regenerate. + * src/x86/win32.S (ffi_prep_args): Declare extern, not global. + (_ffi_call_SYSV): Add missing function type symbol .def and + add EH markup labels. + (_ffi_call_STDCALL): Likewise. + (_ffi_closure_SYSV): Likewise. + (_ffi_closure_raw_SYSV): Likewise. + (.eh_frame): Add hand-crafted EH data. + +2009-04-09 Jakub Jelinek + + * testsuite/lib/libffi-dg.exp: Change copyright header to refer to + version 3 of the GNU General Public License and to point readers + at the COPYING3 file and the FSF's license web page. + * testsuite/libffi.call/call.exp: Likewise. + * testsuite/libffi.special/special.exp: Likewise. + +2009-03-01 Ralf Wildenhues + + * configure: Regenerate. + +2008-12-18 Rainer Orth + + PR libffi/26048 + * configure.ac (HAVE_AS_X86_PCREL): New test. + * configure: Regenerate. + * fficonfig.h.in: Regenerate. + * src/x86/sysv.S [!FFI_NO_RAW_API]: Precalculate + RAW_CLOSURE_CIF_OFFSET, RAW_CLOSURE_FUN_OFFSET, + RAW_CLOSURE_USER_DATA_OFFSET for the Solaris 10/x86 assembler. + (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. + * src/x86/unix64.S (.Lstore_table): Move to .text section. + (.Lload_table): Likewise. + (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. + +2008-12-18 Ralf Wildenhues + + * configure: Regenerate. + +2008-11-21 Eric Botcazou + + * src/sparc/ffi.c (ffi_prep_cif_machdep): Add support for + signed/unsigned int8/16 return values. + * src/sparc/v8.S (ffi_call_v8): Likewise. + (ffi_closure_v8): Likewise. + +2008-09-26 Peter O'Gorman + Steve Ellcey + + * configure: Regenerate for new libtool. + * Makefile.in: Ditto. + * include/Makefile.in: Ditto. + * aclocal.m4: Ditto. + +2008-08-25 Andreas Tobler + + * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and + FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. + Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. + Adjust copyright notice. + * src/powerpc/ffi.c: Add two new flags to indicate if we have one + register or two register to use for FFI_SYSV structs. + (ffi_prep_cif_machdep): Pass the right register flag introduced above. + (ffi_closure_helper_SYSV): Fix the return type for + FFI_SYSV_TYPE_SMALL_STRUCT. Comment. + Adjust copyright notice. + +2008-07-16 Kaz Kojima + + * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned + int. + +2008-06-17 Ralf Wildenhues + + * configure: Regenerate. + * include/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2008-06-07 Joseph Myers + + * configure.ac (parisc*-*-linux*, powerpc-*-sysv*, + powerpc-*-beos*): Remove. + * configure: Regenerate. + +2008-05-09 Julian Brown + + * Makefile.am (LTLDFLAGS): New. + (libffi_la_LDFLAGS): Use above. + * Makefile.in: Regenerate. + +2008-04-18 Paolo Bonzini + + PR bootstrap/35457 + * aclocal.m4: Regenerate. + * configure: Regenerate. + +2008-03-26 Kaz Kojima + + * src/sh/sysv.S: Add .note.GNU-stack on Linux. + * src/sh64/sysv.S: Likewise. + +2008-03-26 Daniel Jacobowitz + + * src/arm/sysv.S: Fix ARM comment marker. + +2008-03-26 Jakub Jelinek + + * src/alpha/osf.S: Add .note.GNU-stack on Linux. + * src/s390/sysv.S: Likewise. + * src/powerpc/ppc_closure.S: Likewise. + * src/powerpc/sysv.S: Likewise. + * src/x86/unix64.S: Likewise. + * src/x86/sysv.S: Likewise. + * src/sparc/v8.S: Likewise. + * src/sparc/v9.S: Likewise. + * src/m68k/sysv.S: Likewise. + * src/arm/sysv.S: Likewise. + +2008-03-16 Ralf Wildenhues + + * aclocal.m4: Regenerate. + * configure: Likewise. + * Makefile.in: Likewise. + * include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + +2008-02-12 Bjoern Koenig + Andreas Tobler + + * configure.ac: Add amd64-*-freebsd* target. + * configure: Regenerate. + +2008-01-30 H.J. Lu + + PR libffi/34612 + * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when + returning struct. + + * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" + tests. + +2008-01-24 David Edelsohn + + * configure: Regenerate. + +2008-01-06 Andreas Tobler + + * src/x86/ffi.c (ffi_prep_cif_machdep): Fix thinko. + +2008-01-05 Andreas Tobler + + PR testsuite/32843 + * src/x86/ffi.c (ffi_prep_cif_machdep): Add code for + signed/unsigned int8/16 for X86_DARWIN. + Updated copyright info. + Handle one and two byte structs with special cif->flags. + * src/x86/ffitarget.h: Add special types for one and two byte structs. + Updated copyright info. + * src/x86/darwin.S (ffi_call_SYSV): Rewrite to use a jump table like + sysv.S + Remove code to pop args from the stack after call. + Special-case signed/unsigned for int8/16, one and two byte structs. + (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, + FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, + FFI_TYPE_SINT32. + Updated copyright info. + +2007-12-08 David Daney + + * src/mips/n32.S (ffi_call_N32): Replace dadd with ADDU, dsub with + SUBU, add with ADDU and use smaller code sequences. + +2007-12-07 David Daney + + * src/mips/ffi.c (ffi_prep_cif_machdep): Handle long double return + type. + +2007-12-06 David Daney + + * include/ffi.h.in (FFI_SIZEOF_JAVA_RAW): Define if not already + defined. + (ffi_java_raw): New typedef. + (ffi_java_raw_call, ffi_java_ptrarray_to_raw, + ffi_java_raw_to_ptrarray): Change parameter types from ffi_raw to + ffi_java_raw. + (ffi_java_raw_closure) : Same. + (ffi_prep_java_raw_closure, ffi_prep_java_raw_closure_loc): Change + parameter types. + * src/java_raw_api.c (ffi_java_raw_size): Replace FFI_SIZEOF_ARG with + FFI_SIZEOF_JAVA_RAW. + (ffi_java_raw_to_ptrarray): Change type of raw to ffi_java_raw. + Replace FFI_SIZEOF_ARG with FFI_SIZEOF_JAVA_RAW. Use + sizeof(ffi_java_raw) for alignment calculations. + (ffi_java_ptrarray_to_raw): Same. + (ffi_java_rvalue_to_raw): Add special handling for FFI_TYPE_POINTER + if FFI_SIZEOF_JAVA_RAW == 4. + (ffi_java_raw_to_rvalue): Same. + (ffi_java_raw_call): Change type of raw to ffi_java_raw. + (ffi_java_translate_args): Same. + (ffi_prep_java_raw_closure_loc, ffi_prep_java_raw_closure): Change + parameter types. + * src/mips/ffitarget.h (FFI_SIZEOF_JAVA_RAW): Define for N32 ABI. + +2007-12-06 David Daney + + * src/mips/n32.S (ffi_closure_N32): Use 64-bit add instruction on + pointer values. + +2007-12-01 Andreas Tobler + + PR libffi/31937 + * src/powerpc/ffitarget.h: Introduce new ABI FFI_LINUX_SOFT_FLOAT. + Add local FFI_TYPE_UINT128 to handle soft-float long-double-128. + * src/powerpc/ffi.c: Distinguish between __NO_FPRS__ and not and + set the NUM_FPR_ARG_REGISTERS according to. + Add support for potential soft-float support under hard-float + architecture. + (ffi_prep_args_SYSV): Set NUM_FPR_ARG_REGISTERS to 0 in case of + FFI_LINUX_SOFT_FLOAT, handle float, doubles and long-doubles according + to the FFI_LINUX_SOFT_FLOAT ABI. + (ffi_prep_cif_machdep): Likewise. + (ffi_closure_helper_SYSV): Likewise. + * src/powerpc/ppc_closure.S: Make sure not to store float/double + on archs where __NO_FPRS__ is true. + Add FFI_TYPE_UINT128 support. + * src/powerpc/sysv.S: Add support for soft-float long-double-128. + Adjust copyright notice. + +2007-11-25 Andreas Tobler + + * src/closures.c: Move defintion of MAYBE_UNUSED from here to ... + * include/ffi_common.h: ... here. + Update copyright. + +2007-11-17 Andreas Tobler + + * src/powerpc/sysv.S: Load correct cr to compare if we have long double. + * src/powerpc/linux64.S: Likewise. + * src/powerpc/ffi.c: Add a comment to show which part goes into cr6. + * testsuite/libffi.call/return_ldl.c: New test. + +2007-09-04 + + * src/arm/sysv.S (UNWIND): New. + (Whole file): Conditionally compile unwinder directives. + * src/arm/sysv.S: Add unwinder directives. + + * src/arm/ffi.c (ffi_prep_args): Align structs by at least 4 bytes. + Only treat r0 as a struct address if we're actually returning a + struct by address. + Only copy the bytes that are actually within a struct. + (ffi_prep_cif_machdep): A Composite Type not larger than 4 bytes + is returned in r0, not passed by address. + (ffi_call): Allocate a word-sized temporary for the case where + a composite is returned in r0. + (ffi_prep_incoming_args_SYSV): Align as necessary. + +2007-08-05 Steven Newbury + + * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Use __clear_cache instead of + directly using the sys_cacheflush syscall. + +2007-07-27 Andrew Haley + + * src/arm/sysv.S (ffi_closure_SYSV): Add soft-float. + +2007-09-03 Maciej W. Rozycki + + * Makefile.am: Unify MIPS_IRIX and MIPS_LINUX into MIPS. + * configure.ac: Likewise. + * Makefile.in: Regenerate. + * include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + * configure: Likewise. + +2007-08-24 David Daney + + * testsuite/libffi.call/return_sl.c: New test. + +2007-08-10 David Daney + + * testsuite/libffi.call/cls_multi_ushort.c, + testsuite/libffi.call/cls_align_uint16.c, + testsuite/libffi.call/nested_struct1.c, + testsuite/libffi.call/nested_struct3.c, + testsuite/libffi.call/cls_7_1_byte.c, + testsuite/libffi.call/nested_struct5.c, + testsuite/libffi.call/cls_double.c, + testsuite/libffi.call/nested_struct7.c, + testsuite/libffi.call/cls_sint.c, + testsuite/libffi.call/nested_struct9.c, + testsuite/libffi.call/cls_20byte1.c, + testsuite/libffi.call/cls_multi_sshortchar.c, + testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_3byte2.c, + testsuite/libffi.call/cls_multi_schar.c, + testsuite/libffi.call/cls_multi_uchar.c, + testsuite/libffi.call/cls_19byte.c, + testsuite/libffi.call/cls_9byte1.c, + testsuite/libffi.call/cls_align_float.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/problem1.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/cls_sshort.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/cls_align_double.c, + testsuite/libffi.call/nested_struct.c, + testsuite/libffi.call/cls_2byte.c, + testsuite/libffi.call/nested_struct10.c, + testsuite/libffi.call/cls_4byte.c, + testsuite/libffi.call/cls_6byte.c, + testsuite/libffi.call/cls_8byte.c, + testsuite/libffi.call/cls_multi_sshort.c, + testsuite/libffi.call/cls_align_sint16.c, + testsuite/libffi.call/cls_align_uint32.c, + testsuite/libffi.call/cls_20byte.c, + testsuite/libffi.call/cls_float.c, + testsuite/libffi.call/nested_struct2.c, + testsuite/libffi.call/cls_5_1_byte.c, + testsuite/libffi.call/nested_struct4.c, + testsuite/libffi.call/cls_24byte.c, + testsuite/libffi.call/nested_struct6.c, + testsuite/libffi.call/cls_64byte.c, + testsuite/libffi.call/nested_struct8.c, + testsuite/libffi.call/cls_uint.c, + testsuite/libffi.call/cls_multi_ushortchar.c, + testsuite/libffi.call/cls_schar.c, + testsuite/libffi.call/cls_uchar.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_1_1byte.c, + testsuite/libffi.call/cls_12byte.c, + testsuite/libffi.call/cls_3_1byte.c, + testsuite/libffi.call/cls_3byte1.c, + testsuite/libffi.call/cls_4_1byte.c, + testsuite/libffi.call/cls_6_1_byte.c, + testsuite/libffi.call/cls_16byte.c, + testsuite/libffi.call/cls_18byte.c, + testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/cls_9byte2.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/cls_ushort.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/cls_5byte.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_7byte.c, + testsuite/libffi.call/cls_align_sint32.c, + testsuite/libffi.special/unwindtest_ffi_call.cc, + testsuite/libffi.special/unwindtest.cc: Remove xfail for mips64*-*-*. + +2007-08-10 David Daney + + PR libffi/28313 + * configure.ac: Don't treat mips64 as a special case. + * Makefile.am (nodist_libffi_la_SOURCES): Add n32.S. + * configure: Regenerate + * Makefile.in: Ditto. + * fficonfig.h.in: Ditto. + * src/mips/ffitarget.h (REG_L, REG_S, SUBU, ADDU, SRL, LI): Indent. + (LA, EH_FRAME_ALIGN, FDE_ADDR_BYTES): New preprocessor macros. + (FFI_DEFAULT_ABI): Set for n64 case. + (FFI_CLOSURES, FFI_TRAMPOLINE_SIZE): Define for n32 and n64 cases. + * src/mips/n32.S (ffi_call_N32): Add debug macros and labels for FDE. + (ffi_closure_N32): New function. + (.eh_frame): New section + * src/mips/o32.S: Clean up comments. + (ffi_closure_O32): Pass ffi_closure parameter in $12. + * src/mips/ffi.c: Use FFI_MIPS_N32 instead of + _MIPS_SIM == _ABIN32 throughout. + (FFI_MIPS_STOP_HERE): New, use in place of + ffi_stop_here. + (ffi_prep_args): Use unsigned long to hold pointer values. Rewrite + to support n32/n64 ABIs. + (calc_n32_struct_flags): Rewrite. + (calc_n32_return_struct_flags): Remove unused variable. Reverse + position of flag bits. + (ffi_prep_cif_machdep): Rewrite n32 portion. + (ffi_call): Enable for n64. Add special handling for small structure + return values. + (ffi_prep_closure_loc): Add n32 and n64 support. + (ffi_closure_mips_inner_O32): Add cast to silence warning. + (copy_struct_N32, ffi_closure_mips_inner_N32): New functions. + +2007-08-08 David Daney + + * testsuite/libffi.call/ffitest.h (ffi_type_mylong): Remove definition. + * testsuite/libffi.call/cls_align_uint16.c (main): Use correct type + specifiers. + * testsuite/libffi.call/nested_struct1.c (main): Ditto. + * testsuite/libffi.call/cls_sint.c (main): Ditto. + * testsuite/libffi.call/nested_struct9.c (main): Ditto. + * testsuite/libffi.call/cls_20byte1.c (main): Ditto. + * testsuite/libffi.call/cls_9byte1.c (main): Ditto. + * testsuite/libffi.call/closure_fn1.c (main): Ditto. + * testsuite/libffi.call/closure_fn3.c (main): Ditto. + * testsuite/libffi.call/return_dbl2.c (main): Ditto. + * testsuite/libffi.call/cls_sshort.c (main): Ditto. + * testsuite/libffi.call/return_fl3.c (main): Ditto. + * testsuite/libffi.call/closure_fn5.c (main): Ditto. + * testsuite/libffi.call/nested_struct.c (main): Ditto. + * testsuite/libffi.call/nested_struct10.c (main): Ditto. + * testsuite/libffi.call/return_ll1.c (main): Ditto. + * testsuite/libffi.call/cls_8byte.c (main): Ditto. + * testsuite/libffi.call/cls_align_uint32.c (main): Ditto. + * testsuite/libffi.call/cls_align_sint16.c (main): Ditto. + * testsuite/libffi.call/cls_20byte.c (main): Ditto. + * testsuite/libffi.call/nested_struct2.c (main): Ditto. + * testsuite/libffi.call/cls_24byte.c (main): Ditto. + * testsuite/libffi.call/nested_struct6.c (main): Ditto. + * testsuite/libffi.call/cls_uint.c (main): Ditto. + * testsuite/libffi.call/cls_12byte.c (main): Ditto. + * testsuite/libffi.call/cls_16byte.c (main): Ditto. + * testsuite/libffi.call/closure_fn0.c (main): Ditto. + * testsuite/libffi.call/cls_9byte2.c (main): Ditto. + * testsuite/libffi.call/closure_fn2.c (main): Ditto. + * testsuite/libffi.call/return_dbl1.c (main): Ditto. + * testsuite/libffi.call/closure_fn4.c (main): Ditto. + * testsuite/libffi.call/closure_fn6.c (main): Ditto. + * testsuite/libffi.call/cls_align_sint32.c (main): Ditto. + +2007-08-07 Andrew Haley + + * src/x86/sysv.S (ffi_closure_raw_SYSV): Fix typo in previous + checkin. + +2007-08-06 Andrew Haley + + PR testsuite/32843 + * src/x86/sysv.S (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, + FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, + FFI_TYPE_SINT32. + +2007-08-02 David Daney + + * testsuite/libffi.call/return_ul.c (main): Define return type as + ffi_arg. Use proper printf conversion specifier. + +2007-07-30 Andrew Haley + + PR testsuite/32843 + * src/x86/ffi.c (ffi_prep_cif_machdep): in x86 case, add code for + signed/unsigned int8/16. + * src/x86/sysv.S (ffi_call_SYSV): Rewrite to: + Use a jump table. + Remove code to pop args from the stack after call. + Special-case signed/unsigned int8/16. + * testsuite/libffi.call/return_sc.c (main): Revert. + +2007-07-26 Richard Guenther + + PR testsuite/32843 + * testsuite/libffi.call/return_sc.c (main): Verify call + result as signed char, not ffi_arg. + +2007-07-16 Rainer Orth + + * configure.ac (i?86-*-solaris2.1[0-9]): Set TARGET to X86_64. + * configure: Regenerate. + +2007-07-11 David Daney + + * src/mips/ffi.c: Don't include sys/cachectl.h. + (ffi_prep_closure_loc): Use __builtin___clear_cache() instead of + cacheflush(). + +2007-05-18 Aurelien Jarno + + * src/arm/ffi.c (ffi_prep_closure_loc): Renamed and ajusted + from (ffi_prep_closure): ... this. + (FFI_INIT_TRAMPOLINE): Adjust. + +2005-12-31 Phil Blundell + + * src/arm/ffi.c (ffi_prep_incoming_args_SYSV, + ffi_closure_SYSV_inner, ffi_prep_closure): New, add closure support. + * src/arm/sysv.S(ffi_closure_SYSV): Likewise. + * src/arm/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. + (FFI_CLOSURES): Enable closure support. + +2007-07-03 Andrew Haley + + * testsuite/libffi.call/cls_multi_ushort.c, + testsuite/libffi.call/cls_align_uint16.c, + testsuite/libffi.call/nested_struct1.c, + testsuite/libffi.call/nested_struct3.c, + testsuite/libffi.call/cls_7_1_byte.c, + testsuite/libffi.call/cls_double.c, + testsuite/libffi.call/nested_struct5.c, + testsuite/libffi.call/nested_struct7.c, + testsuite/libffi.call/cls_sint.c, + testsuite/libffi.call/nested_struct9.c, + testsuite/libffi.call/cls_20byte1.c, + testsuite/libffi.call/cls_multi_sshortchar.c, + testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_3byte2.c, + testsuite/libffi.call/cls_multi_schar.c, + testsuite/libffi.call/cls_multi_uchar.c, + testsuite/libffi.call/cls_19byte.c, + testsuite/libffi.call/cls_9byte1.c, + testsuite/libffi.call/cls_align_float.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/problem1.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/cls_sshort.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/cls_align_double.c, + testsuite/libffi.call/cls_2byte.c, + testsuite/libffi.call/nested_struct.c, + testsuite/libffi.call/nested_struct10.c, + testsuite/libffi.call/cls_4byte.c, + testsuite/libffi.call/cls_6byte.c, + testsuite/libffi.call/cls_8byte.c, + testsuite/libffi.call/cls_multi_sshort.c, + testsuite/libffi.call/cls_align_uint32.c, + testsuite/libffi.call/cls_align_sint16.c, + testsuite/libffi.call/cls_float.c, + testsuite/libffi.call/cls_20byte.c, + testsuite/libffi.call/cls_5_1_byte.c, + testsuite/libffi.call/nested_struct2.c, + testsuite/libffi.call/cls_24byte.c, + testsuite/libffi.call/nested_struct4.c, + testsuite/libffi.call/nested_struct6.c, + testsuite/libffi.call/cls_64byte.c, + testsuite/libffi.call/nested_struct8.c, + testsuite/libffi.call/cls_uint.c, + testsuite/libffi.call/cls_multi_ushortchar.c, + testsuite/libffi.call/cls_schar.c, + testsuite/libffi.call/cls_uchar.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_1_1byte.c, + testsuite/libffi.call/cls_12byte.c, + testsuite/libffi.call/cls_3_1byte.c, + testsuite/libffi.call/cls_3byte1.c, + testsuite/libffi.call/cls_4_1byte.c, + testsuite/libffi.call/cls_6_1_byte.c, + testsuite/libffi.call/cls_16byte.c, + testsuite/libffi.call/cls_18byte.c, + testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/cls_9byte2.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/cls_ushort.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/cls_5byte.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_7byte.c, + testsuite/libffi.call/cls_align_sint32.c, + testsuite/libffi.special/unwindtest_ffi_call.cc, + testsuite/libffi.special/unwindtest.cc: Enable for ARM. + +2007-07-05 H.J. Lu + + * aclocal.m4: Regenerated. + +2007-06-02 Paolo Bonzini + + * configure: Regenerate. + +2007-05-23 Steve Ellcey + + * Makefile.in: Regenerate. + * configure: Regenerate. + * aclocal.m4: Regenerate. + * include/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2007-05-10 Roman Zippel + + * src/m68k/ffi.c (ffi_prep_incoming_args_SYSV, + ffi_closure_SYSV_inner,ffi_prep_closure): New, add closure support. + * src/m68k/sysv.S(ffi_closure_SYSV,ffi_closure_struct_SYSV): Likewise. + * src/m68k/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. + (FFI_CLOSURES): Enable closure support. + +2007-05-10 Roman Zippel + + * configure.ac (HAVE_AS_CFI_PSEUDO_OP): New test. + * configure: Regenerate. + * fficonfig.h.in: Regenerate. + * src/m68k/sysv.S (CFI_STARTPROC,CFI_ENDPROC, + CFI_OFFSET,CFI_DEF_CFA): New macros. + (ffi_call_SYSV): Add callframe annotation. + +2007-05-10 Roman Zippel + + * src/m68k/ffi.c (ffi_prep_args,ffi_prep_cif_machdep): Fix + numerous test suite failures. + * src/m68k/sysv.S (ffi_call_SYSV): Likewise. + +2007-04-11 Paolo Bonzini + + * Makefile.am (EXTRA_DIST): Bring up to date. + * Makefile.in: Regenerate. + * src/frv/eabi.S: Remove RCS keyword. + +2007-04-06 Richard Henderson + + * configure.ac: Tidy target case. + (HAVE_LONG_DOUBLE): Allow the target to override. + * configure: Regenerate. + * include/ffi.h.in: Don't define ffi_type_foo if + LIBFFI_HIDE_BASIC_TYPES is defined. + (ffi_type_longdouble): If not HAVE_LONG_DOUBLE, define + to ffi_type_double. + * types.c (LIBFFI_HIDE_BASIC_TYPES): Define. + (FFI_TYPEDEF, ffi_type_void): Mark the data const. + (ffi_type_longdouble): Special case for Alpha. Don't define + if long double == double. + + * src/alpha/ffi.c (FFI_TYPE_LONGDOUBLE): Assert unique value. + (ffi_prep_cif_machdep): Handle it as the 128-bit type. + (ffi_call, ffi_closure_osf_inner): Likewise. + (ffi_closure_osf_inner): Likewise. Mark hidden. + (ffi_call_osf, ffi_closure_osf): Mark hidden. + * src/alpha/ffitarget.h (FFI_LAST_ABI): Tidy definition. + * src/alpha/osf.S (ffi_call_osf, ffi_closure_osf): Mark hidden. + (load_table): Handle 128-bit long double. + + * testsuite/libffi.call/float4.c: Add -mieee for alpha. + +2007-04-06 Tom Tromey + + PR libffi/31491: + * README: Fixed bug in example. + +2007-04-03 Jakub Jelinek + + * src/closures.c: Include sys/statfs.h. + (_GNU_SOURCE): Define on Linux. + (FFI_MMAP_EXEC_SELINUX): Define. + (selinux_enabled): New variable. + (selinux_enabled_check): New function. + (is_selinux_enabled): Define. + (dlmmap): Use it. + +2007-03-24 Uros Bizjak + + * testsuite/libffi.call/return_fl2.c (return_fl): Mark as static. + Use 'volatile float sum' to create sum of floats to avoid false + negative due to excess precision on ix86 targets. + (main): Ditto. + +2007-03-08 Alexandre Oliva + + * src/powerpc/ffi.c (flush_icache): Fix left-over from previous + patch. + (ffi_prep_closure_loc): Remove unneeded casts. Add needed ones. + +2007-03-07 Alexandre Oliva + + * include/ffi.h.in (ffi_closure_alloc, ffi_closure_free): New. + (ffi_prep_closure_loc): New. + (ffi_prep_raw_closure_loc): New. + (ffi_prep_java_raw_closure_loc): New. + * src/closures.c: New file. + * src/dlmalloc.c [FFI_MMAP_EXEC_WRIT] (struct malloc_segment): + Replace sflags with exec_offset. + [FFI_MMAP_EXEC_WRIT] (mmap_exec_offset, add_segment_exec_offset, + sub_segment_exec_offset): New macros. + (get_segment_flags, set_segment_flags, check_segment_merge): New + macros. + (is_mmapped_segment, is_extern_segment): Use get_segment_flags. + (add_segment, sys_alloc, create_mspace, create_mspace_with_base, + destroy_mspace): Use new macros. + (sys_alloc): Silence warning. + * Makefile.am (libffi_la_SOURCES): Add src/closures.c. + * Makefile.in: Rebuilt. + * src/prep_cif [FFI_CLOSURES] (ffi_prep_closure): Implement in + terms of ffi_prep_closure_loc. + * src/raw_api.c (ffi_prep_raw_closure_loc): Renamed and adjusted + from... + (ffi_prep_raw_closure): ... this. Re-implement in terms of the + renamed version. + * src/java_raw_api (ffi_prep_java_raw_closure_loc): Renamed and + adjusted from... + (ffi_prep_java_raw_closure): ... this. Re-implement in terms of + the renamed version. + * src/alpha/ffi.c (ffi_prep_closure_loc): Renamed from + (ffi_prep_closure): ... this. + * src/pa/ffi.c: Likewise. + * src/cris/ffi.c: Likewise. Adjust. + * src/frv/ffi.c: Likewise. + * src/ia64/ffi.c: Likewise. + * src/mips/ffi.c: Likewise. + * src/powerpc/ffi_darwin.c: Likewise. + * src/s390/ffi.c: Likewise. + * src/sh/ffi.c: Likewise. + * src/sh64/ffi.c: Likewise. + * src/sparc/ffi.c: Likewise. + * src/x86/ffi64.c: Likewise. + * src/x86/ffi.c: Likewise. + (FFI_INIT_TRAMPOLINE): Adjust. + (ffi_prep_raw_closure_loc): Renamed and adjusted from... + (ffi_prep_raw_closure): ... this. + * src/powerpc/ffi.c (ffi_prep_closure_loc): Renamed from + (ffi_prep_closure): ... this. + (flush_icache): Adjust. + +2007-03-07 Alexandre Oliva + + * src/dlmalloc.c: New file, imported version 2.8.3 of Doug + Lea's malloc. + +2007-03-01 Brooks Moses + + * Makefile.am: Add dummy install-pdf target. + * Makefile.in: Regenerate + +2007-02-13 Andreas Krebbel + + * src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep, + ffi_closure_helper_SYSV): Add long double handling. + +2007-02-02 Jakub Jelinek + + * src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2 + immediately after bctrl instruction. + +2007-01-18 Alexandre Oliva + + * Makefile.am (all-recursive, install-recursive, + mostlyclean-recursive, clean-recursive, distclean-recursive, + maintainer-clean-recursive): Add missing targets. + * Makefile.in: Rebuilt. + +2006-12-14 Andreas Tobler + + * configure.ac: Add TARGET for x86_64-*-darwin*. + * Makefile.am (nodist_libffi_la_SOURCES): Add rules for 64-bit sources + for X86_DARWIN. + * src/x86/ffitarget.h: Set trampoline size for x86_64-*-darwin*. + * src/x86/darwin64.S: New file for x86_64-*-darwin* support. + * configure: Regenerate. + * Makefile.in: Regenerate. + * include/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + * testsuite/libffi.special/unwindtest_ffi_call.cc: New test case for + ffi_call only. + +2006-12-13 Andreas Tobler + + * aclocal.m4: Regenerate with aclocal -I .. as written in the + Makefile.am. + +2006-10-31 Geoffrey Keating + + * src/powerpc/ffi_darwin.c (darwin_adjust_aggregate_sizes): New. + (ffi_prep_cif_machdep): Call darwin_adjust_aggregate_sizes for + Darwin. + * testsuite/libffi.call/nested_struct4.c: Remove Darwin XFAIL. + * testsuite/libffi.call/nested_struct6.c: Remove Darwin XFAIL. + +2006-10-10 Paolo Bonzini + Sandro Tolaini + + * configure.ac [i*86-*-darwin*]: Set X86_DARWIN symbol and + conditional. + * configure: Regenerated. + * Makefile.am (nodist_libffi_la_SOURCES) [X86_DARWIN]: New case. + (EXTRA_DIST): Add src/x86/darwin.S. + * Makefile.in: Regenerated. + * include/Makefile.in: Regenerated. + * testsuite/Makefile.in: Regenerated. + + * src/x86/ffi.c (ffi_prep_cif_machdep) [X86_DARWIN]: Treat like + X86_WIN32, and additionally align stack to 16 bytes. + * src/x86/darwin.S: New, based on sysv.S. + * src/prep_cif.c (ffi_prep_cif) [X86_DARWIN]: Align > 8-byte structs. + +2006-09-12 David Daney + + PR libffi/23935 + * include/Makefile.am: Install both ffi.h and ffitarget.h in + $(libdir)/gcc/$(target_alias)/$(gcc_version)/include. + * aclocal.m4: Regenerated for automake 1.9.6. + * Makefile.in: Regenerated. + * include/Makefile.in: Regenerated. + * testsuite/Makefile.in: Regenerated. + +2006-08-17 Andreas Tobler + + * include/ffi_common.h (struct): Revert accidental commit. + +2006-08-15 Andreas Tobler + + * include/ffi_common.h: Remove lint directives. + * include/ffi.h.in: Likewise. + +2006-07-25 Torsten Schoenfeld + + * include/ffi.h.in (ffi_type_ulong, ffi_type_slong): Define correctly + for 32-bit architectures. + * testsuite/libffi.call/return_ul.c: New test case. + +2006-07-19 David Daney + + * testsuite/libffi.call/closure_fn6.c: Remove xfail for mips, + xfail remains for mips64. + +2006-05-23 Carlos O'Donell + + * Makefile.am: Add install-html target. Add install-html to .PHONY + * Makefile.in: Regenerate. + * aclocal.m4: Regenerate. + * include/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2006-05-18 John David Anglin + + * pa/ffi.c (ffi_prep_args_pa32): Load floating point arguments from + stack slot. + +2006-04-22 Andreas Tobler + + * README: Remove notice about 'Crazy Comments'. + * src/debug.c: Remove lint directives. Cleanup white spaces. + * src/java_raw_api.c: Likewise. + * src/prep_cif.c: Likewise. + * src/raw_api.c: Likewise. + * src/ffitest.c: Delete. No longer needed, all test cases migrated + to the testsuite. + * src/arm/ffi.c: Remove lint directives. + * src/m32r/ffi.c: Likewise. + * src/pa/ffi.c: Likewise. + * src/powerpc/ffi.c: Likewise. + * src/powerpc/ffi_darwin.c: Likewise. + * src/sh/ffi.c: Likewise. + * src/sh64/ffi.c: Likewise. + * src/x86/ffi.c: Likewise. + * testsuite/libffi.call/float2.c: Likewise. + * testsuite/libffi.call/promotion.c: Likewise. + * testsuite/libffi.call/struct1.c: Likewise. + +2006-04-13 Andreas Tobler + + * src/pa/hpux32.S: Correct unwind offset calculation for + ffi_closure_pa32. + * src/pa/linux.S: Likewise. + +2006-04-12 James E Wilson + + PR libgcj/26483 + * src/ia64/ffi.c (stf_spill, ldf_fill): Rewrite as macros. + (hfa_type_load): Call stf_spill. + (hfa_type_store): Call ldf_fill. + (ffi_call): Adjust calls to above routines. Add local temps for + macro result. + +2006-04-10 Matthias Klose + + * testsuite/lib/libffi-dg.exp (libffi-init): Recognize multilib + directory names containing underscores. + +2006-04-07 James E Wilson + + * testsuite/libffi.call/float4.c: New testcase. + +2006-04-05 John David Anglin + Andreas Tobler + + * Makefile.am: Add PA_HPUX port. + * Makefile.in: Regenerate. + * include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + * configure.ac: Add PA_HPUX rules. + * configure: Regenerate. + * src/pa/ffitarget.h: Rename linux target to PA_LINUX. + Add PA_HPUX and PA64_HPUX. + Rename FFI_LINUX ABI to FFI_PA32 ABI. + (FFI_TRAMPOLINE_SIZE): Define for 32-bit HP-UX targets. + (FFI_TYPE_SMALL_STRUCT2): Define. + (FFI_TYPE_SMALL_STRUCT4): Likewise. + (FFI_TYPE_SMALL_STRUCT8): Likewise. + (FFI_TYPE_SMALL_STRUCT3): Redefine. + (FFI_TYPE_SMALL_STRUCT5): Likewise. + (FFI_TYPE_SMALL_STRUCT6): Likewise. + (FFI_TYPE_SMALL_STRUCT7): Likewise. + * src/pa/ffi.c (ROUND_DOWN): Delete. + (fldw, fstw, fldd, fstd): Use '__asm__'. + (ffi_struct_type): Add support for FFI_TYPE_SMALL_STRUCT2, + FFI_TYPE_SMALL_STRUCT4 and FFI_TYPE_SMALL_STRUCT8. + (ffi_prep_args_LINUX): Rename to ffi_prep_args_pa32. Update comment. + Simplify incrementing of stack slot variable. Change type of local + 'n' to unsigned int. + (ffi_size_stack_LINUX): Rename to ffi_size_stack_pa32. Handle long + double on PA_HPUX. + (ffi_prep_cif_machdep): Likewise. + (ffi_call): Likewise. + (ffi_closure_inner_LINUX): Rename to ffi_closure_inner_pa32. Change + return type to ffi_status. Simplify incrementing of stack slot + variable. Only copy floating point argument registers when PA_LINUX + is true. Reformat debug statement. + Add support for FFI_TYPE_SMALL_STRUCT2, FFI_TYPE_SMALL_STRUCT4 and + FFI_TYPE_SMALL_STRUCT8. + (ffi_closure_LINUX): Rename to ffi_closure_pa32. Add 'extern' to + declaration. + (ffi_prep_closure): Make linux trampoline conditional on PA_LINUX. + Add nops to cache flush. Add trampoline for PA_HPUX. + * src/pa/hpux32.S: New file. + * src/pa/linux.S (ffi_call_LINUX): Rename to ffi_call_pa32. Rename + ffi_prep_args_LINUX to ffi_prep_args_pa32. + Localize labels. Add support for 2, 4 and 8-byte small structs. Handle + unaligned destinations in 3, 5, 6 and 7-byte small structs. Order + argument type checks so that common argument types appear first. + (ffi_closure_LINUX): Rename to ffi_closure_pa32. Rename + ffi_closure_inner_LINUX to ffi_closure_inner_pa32. + +2006-03-24 Alan Modra + + * src/powerpc/ffitarget.h (enum ffi_abi): Add FFI_LINUX. Default + for 32-bit using IBM extended double format. Fix FFI_LAST_ABI. + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Handle linux variant of + FFI_TYPE_LONGDOUBLE. + (ffi_prep_args64): Assert using IBM extended double. + (ffi_prep_cif_machdep): Don't munge FFI_TYPE_LONGDOUBLE type. + Handle FFI_LINUX FFI_TYPE_LONGDOUBLE return and args. + (ffi_call): Handle FFI_LINUX. + (ffi_closure_helper_SYSV): Non FFI_LINUX long double return needs + gpr3 return pointer as for struct return. Handle FFI_LINUX + FFI_TYPE_LONGDOUBLE return and args. Don't increment "nf" + unnecessarily. + * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Load both f1 and f2 + for FFI_TYPE_LONGDOUBLE. Move epilogue insns into case table. + Don't use r6 as pointer to results, instead use sp offset. Don't + make a special call to load lr with case table address, instead + use offset from previous call. + * src/powerpc/sysv.S (ffi_call_SYSV): Save long double return. + * src/powerpc/linux64.S (ffi_call_LINUX64): Simplify long double + return. + +2006-03-15 Kaz Kojima + + * src/sh64/ffi.c (ffi_prep_cif_machdep): Handle float arguments + passed with FP registers correctly. + (ffi_closure_helper_SYSV): Likewise. + * src/sh64/sysv.S: Likewise. + +2006-03-01 Andreas Tobler + + * testsuite/libffi.special/unwindtest.cc (closure_test_fn): Mark cif, + args and userdata unused. + (closure_test_fn1): Mark cif and userdata unused. + (main): Remove unused res. + +2006-02-28 Andreas Tobler + + * testsuite/libffi.call/call.exp: Adjust FSF address. Add test runs for + -O2, -O3, -Os and the warning flags -W -Wall. + * testsuite/libffi.special/special.exp: Likewise. + * testsuite/libffi.call/ffitest.h: Add an __UNUSED__ macro to mark + unused parameter unused for gcc or else do nothing. + * testsuite/libffi.special/ffitestcxx.h: Likewise. + * testsuite/libffi.call/cls_12byte.c (cls_struct_12byte_gn): Mark cif + and userdata unused. + * testsuite/libffi.call/cls_16byte.c (cls_struct_16byte_gn): Likewise. + * testsuite/libffi.call/cls_18byte.c (cls_struct_18byte_gn): Likewise. + * testsuite/libffi.call/cls_19byte.c (cls_struct_19byte_gn): Likewise. + * testsuite/libffi.call/cls_1_1byte.c (cls_struct_1_1byte_gn): Likewise. + * testsuite/libffi.call/cls_20byte.c (cls_struct_20byte_gn): Likewise. + * testsuite/libffi.call/cls_20byte1.c (cls_struct_20byte_gn): Likewise. + * testsuite/libffi.call/cls_24byte.c (cls_struct_24byte_gn): Likewise. + * testsuite/libffi.call/cls_2byte.c (cls_struct_2byte_gn): Likewise. + * testsuite/libffi.call/cls_3_1byte.c (cls_struct_3_1byte_gn): Likewise. + * testsuite/libffi.call/cls_3byte1.c (cls_struct_3byte_gn): Likewise. + * testsuite/libffi.call/cls_3byte2.c (cls_struct_3byte_gn1): Likewise. + * testsuite/libffi.call/cls_4_1byte.c (cls_struct_4_1byte_gn): Likewise. + * testsuite/libffi.call/cls_4byte.c (cls_struct_4byte_gn): Likewise. + * testsuite/libffi.call/cls_5_1_byte.c (cls_struct_5byte_gn): Likewise. + * testsuite/libffi.call/cls_5byte.c (cls_struct_5byte_gn): Likewise. + * testsuite/libffi.call/cls_64byte.c (cls_struct_64byte_gn): Likewise. + * testsuite/libffi.call/cls_6_1_byte.c (cls_struct_6byte_gn): Likewise. + * testsuite/libffi.call/cls_6byte.c (cls_struct_6byte_gn): Likewise. + * testsuite/libffi.call/cls_7_1_byte.c (cls_struct_7byte_gn): Likewise. + * testsuite/libffi.call/cls_7byte.c (cls_struct_7byte_gn): Likewise. + * testsuite/libffi.call/cls_8byte.c (cls_struct_8byte_gn): Likewise. + * testsuite/libffi.call/cls_9byte1.c (cls_struct_9byte_gn): Likewise. + * testsuite/libffi.call/cls_9byte2.c (cls_struct_9byte_gn): Likewise. + * testsuite/libffi.call/cls_align_double.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_float.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_longdouble.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_pointer.c (cls_struct_align_fn): Cast + void* to avoid compiler warning. + (main): Likewise. + (cls_struct_align_gn): Mark cif and userdata unused. + * testsuite/libffi.call/cls_align_sint16.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_sint32.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_sint64.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_uint16.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_uint32.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_double.c (cls_ret_double_fn): Likewise. + * testsuite/libffi.call/cls_float.c (cls_ret_float_fn): Likewise. + * testsuite/libffi.call/cls_multi_schar.c (test_func_gn): Mark cif and + data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_multi_sshort.c (test_func_gn): Mark cif and + data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_multi_sshortchar.c (test_func_gn): Mark cif + and data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_multi_uchar.c (test_func_gn): Mark cif and + data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_multi_ushort.c (test_func_gn): Mark cif and + data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_multi_ushortchar.c (test_func_gn): Mark cif + and data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_schar.c (cls_ret_schar_fn): Mark cif and + userdata unused. + (cls_ret_schar_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/cls_sint.c (cls_ret_sint_fn): Mark cif and + userdata unused. + (cls_ret_sint_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/cls_sshort.c (cls_ret_sshort_fn): Mark cif and + userdata unused. + (cls_ret_sshort_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/cls_uchar.c (cls_ret_uchar_fn): Mark cif and + userdata unused. + (cls_ret_uchar_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Mark cif and + userdata unused. + (cls_ret_uint_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/cls_ulonglong.c (cls_ret_ulonglong_fn): Mark cif + and userdata unused. + * testsuite/libffi.call/cls_ushort.c (cls_ret_ushort_fn): Mark cif and + userdata unused. + (cls_ret_ushort_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/float.c (floating): Remove unused parameter e. + * testsuite/libffi.call/float1.c (main): Remove unused variable i. + Cleanup white spaces. + * testsuite/libffi.call/negint.c (checking): Remove unused variable i. + * testsuite/libffi.call/nested_struct.c (cls_struct_combined_gn): Mark + cif and userdata unused. + * testsuite/libffi.call/nested_struct1.c (cls_struct_combined_gn): + Likewise. + * testsuite/libffi.call/nested_struct10.c (B_gn): Likewise. + * testsuite/libffi.call/nested_struct2.c (B_fn): Adjust printf + formatters to silence gcc. + (B_gn): Mark cif and userdata unused. + * testsuite/libffi.call/nested_struct3.c (B_gn): Mark cif and userdata + unused. + * testsuite/libffi.call/nested_struct4.c: Mention related PR. + (B_gn): Mark cif and userdata unused. + * testsuite/libffi.call/nested_struct5.c (B_gn): Mark cif and userdata + unused. + * testsuite/libffi.call/nested_struct6.c: Mention related PR. + (B_gn): Mark cif and userdata unused. + * testsuite/libffi.call/nested_struct7.c (B_gn): Mark cif and userdata + unused. + * testsuite/libffi.call/nested_struct8.c (B_gn): Likewise. + * testsuite/libffi.call/nested_struct9.c (B_gn): Likewise. + * testsuite/libffi.call/problem1.c (stub): Likewise. + * testsuite/libffi.call/pyobjc-tc.c (main): Cast the result to silence + gcc. + * testsuite/libffi.call/return_fl2.c (return_fl): Add the note mentioned + in the last commit for this test case in the test case itself. + * testsuite/libffi.call/closure_fn0.c (closure_test_fn0): Mark cif as + unused. + * testsuite/libffi.call/closure_fn1.c (closure_test_fn1): Likewise. + * testsuite/libffi.call/closure_fn2.c (closure_test_fn2): Likewise. + * testsuite/libffi.call/closure_fn3.c (closure_test_fn3): Likewise. + * testsuite/libffi.call/closure_fn4.c (closure_test_fn0): Likewise. + * testsuite/libffi.call/closure_fn5.c (closure_test_fn5): Likewise. + * testsuite/libffi.call/closure_fn6.c (closure_test_fn0): Likewise. + +2006-02-22 Kaz Kojima + + * src/sh/sysv.S: Fix register numbers in the FDE for + ffi_closure_SYSV. + +2006-02-20 Andreas Tobler + + * testsuite/libffi.call/return_fl2.c (return_fl): Remove static + declaration to avoid a false negative on ix86. See PR323. + +2006-02-18 Kaz Kojima + + * src/sh/ffi.c (ffi_closure_helper_SYSV): Remove unused variable + and cast integer to void * if needed. Update the pointer to + the FP register saved area correctly. + +2006-02-17 Andreas Tobler + + * testsuite/libffi.call/nested_struct6.c: XFAIL this test until PR25630 + is fixed. + * testsuite/libffi.call/nested_struct4.c: Likewise. + +2006-02-16 Andreas Tobler + + * testsuite/libffi.call/return_dbl.c: New test case. + * testsuite/libffi.call/return_dbl1.c: Likewise. + * testsuite/libffi.call/return_dbl2.c: Likewise. + * testsuite/libffi.call/return_fl.c: Likewise. + * testsuite/libffi.call/return_fl1.c: Likewise. + * testsuite/libffi.call/return_fl2.c: Likewise. + * testsuite/libffi.call/return_fl3.c: Likewise. + * testsuite/libffi.call/closure_fn6.c: Likewise. + + * testsuite/libffi.call/nested_struct2.c: Remove ffi_type_mylong + definition. + * testsuite/libffi.call/ffitest.h: Add ffi_type_mylong definition + here to be used by other test cases too. + + * testsuite/libffi.call/nested_struct10.c: New test case. + * testsuite/libffi.call/nested_struct9.c: Likewise. + * testsuite/libffi.call/nested_struct8.c: Likewise. + * testsuite/libffi.call/nested_struct7.c: Likewise. + * testsuite/libffi.call/nested_struct6.c: Likewise. + * testsuite/libffi.call/nested_struct5.c: Likewise. + * testsuite/libffi.call/nested_struct4.c: Likewise. + +2006-01-21 Andreas Tobler + + * configure.ac: Enable libffi for sparc64-*-freebsd*. + * configure: Rebuilt. + +2006-01-18 Jakub Jelinek + + * src/powerpc/sysv.S (smst_two_register): Don't call __ashldi3, + instead do the shifting inline. + * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't compute %r5 + shift count unconditionally. Simplify load sequences for 1, 2, 3, 4 + and 8 byte structs, for the remaining struct sizes don't call + __lshrdi3, instead do the shifting inline. + +2005-12-07 Thiemo Seufer + + * src/mips/ffitarget.h: Remove obsolete sgidefs.h include. Add + missing parentheses. + * src/mips/o32.S (ffi_call_O32): Code formatting. Define + and use A3_OFF, FP_OFF, RA_OFF. Micro-optimizations. + (ffi_closure_O32): Likewise, but with newly defined A3_OFF2, + A2_OFF2, A1_OFF2, A0_OFF2, RA_OFF2, FP_OFF2, S0_OFF2, GP_OFF2, + V1_OFF2, V0_OFF2, FA_1_1_OFF2, FA_1_0_OFF2, FA_0_1_OFF2, + FA_0_0_OFF2. + * src/mips/ffi.c (ffi_prep_args): Code formatting. Fix + endianness bugs. + (ffi_prep_closure): Improve trampoline instruction scheduling. + (ffi_closure_mips_inner_O32): Fix endianness bugs. + +2005-12-03 Alan Modra + + * src/powerpc/ffi.c: Formatting. + (ffi_prep_args_SYSV): Avoid possible aliasing problems by using unions. + (ffi_prep_args64): Likewise. + +2005-09-30 Geoffrey Keating + + * testsuite/lib/libffi-dg.exp (libffi_target_compile): For + darwin, use -shared-libgcc not -lgcc_s, and explain why. + +2005-09-26 Tom Tromey + + * testsuite/libffi.call/float1.c (value_type): New typedef. + (CANARY): New define. + (main): Check for result buffer overflow. + * src/powerpc/linux64.S: Handle linux64 long double returns. + * src/powerpc/ffi.c (FLAG_RETURNS_128BITS): New constant. + (ffi_prep_cif_machdep): Handle linux64 long double returns. + +2005-08-25 Alan Modra + + PR target/23404 + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Correct placement of stack + homed fp args. + (ffi_status ffi_prep_cif_machdep): Correct stack sizing for same. + +2005-08-11 Jakub Jelinek + + * configure.ac (HAVE_HIDDEN_VISIBILITY_ATTRIBUTE): New test. + (AH_BOTTOM): Add FFI_HIDDEN definition. + * configure: Rebuilt. + * fficonfig.h.in: Rebuilt. + * src/powerpc/ffi.c (hidden): Remove. + (ffi_closure_LINUX64, ffi_prep_args64, ffi_call_LINUX64, + ffi_closure_helper_LINUX64): Use FFI_HIDDEN instead of hidden. + * src/powerpc/linux64_closure.S (ffi_closure_LINUX64, + .ffi_closure_LINUX64): Use FFI_HIDDEN instead of .hidden. + * src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): Remove, + add FFI_HIDDEN to its prototype. + (ffi_closure_SYSV_inner): New. + * src/x86/sysv.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. + * src/x86/win32.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. + +2005-08-10 Alfred M. Szmidt + + PR libffi/21819: + * configure: Rebuilt. + * configure.ac: Handle i*86-*-gnu*. + +2005-08-09 Jakub Jelinek + + * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Use + DW_CFA_offset_extended_sf rather than + DW_CFA_GNU_negative_offset_extended. + * src/powerpc/sysv.S (ffi_call_SYSV): Likewise. + +2005-07-22 SUGIOKA Toshinobu + + * src/sh/sysv.S (ffi_call_SYSV): Stop argument popping correctly + on sh3. + (ffi_closure_SYSV): Change the stack layout for sh3 struct argument. + * src/sh/ffi.c (ffi_prep_args): Fix sh3 argument copy, when it is + partially on register. + (ffi_closure_helper_SYSV): Likewise. + (ffi_prep_cif_machdep): Don't set too many cif->flags. + +2005-07-20 Kaz Kojima + + * src/sh/ffi.c (ffi_call): Handle small structures correctly. + Remove empty line. + * src/sh64/ffi.c (simple_type): Remove. + (return_type): Handle small structures correctly. + (ffi_prep_args): Likewise. + (ffi_call): Likewise. + (ffi_closure_helper_SYSV): Likewise. + * src/sh64/sysv.S (ffi_call_SYSV): Handle 1, 2 and 4-byte return. + Emit position independent code if PIC and remove wrong datalabel + prefixes from EH data. + +2005-07-19 Andreas Tobler + + * Makefile.am (nodist_libffi_la_SOURCES): Add POWERPC_FREEBSD. + * Makefile.in: Regenerate. + * include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + * configure.ac: Add POWERPC_FREEBSD rules. + * configure: Regenerate. + * src/powerpc/ffitarget.h: Add POWERPC_FREEBSD rules. + (FFI_SYSV_TYPE_SMALL_STRUCT): Define. + * src/powerpc/ffi.c: Add flags to handle small structure returns + in ffi_call_SYSV. + (ffi_prep_cif_machdep): Handle small structures for SYSV 4 ABI. + Aka FFI_SYSV. + (ffi_closure_helper_SYSV): Likewise. + * src/powerpc/ppc_closure.S: Add return types for small structures. + * src/powerpc/sysv.S: Add bits to handle small structures for + final SYSV 4 ABI. + +2005-07-10 Andreas Tobler + + * testsuite/libffi.call/cls_5_1_byte.c: New test file. + * testsuite/libffi.call/cls_6_1_byte.c: Likewise. + * testsuite/libffi.call/cls_7_1_byte.c: Likewise. + +2005-07-05 Randolph Chung + + * src/pa/ffi.c (ffi_struct_type): Rename FFI_TYPE_SMALL_STRUCT1 + as FFI_TYPE_SMALL_STRUCT3. Break out handling for 5-7 byte + structures. Kill compilation warnings. + (ffi_closure_inner_LINUX): Print return values as hex in debug + message. Rename FFI_TYPE_SMALL_STRUCT1 as FFI_TYPE_SMALL_STRUCT3. + Properly handle 5-7 byte structure returns. + * src/pa/ffitarget.h (FFI_TYPE_SMALL_STRUCT1) + (FFI_TYPE_SMALL_STRUCT2): Remove. + (FFI_TYPE_SMALL_STRUCT3, FFI_TYPE_SMALL_STRUCT5) + (FFI_TYPE_SMALL_STRUCT6, FFI_TYPE_SMALL_STRUCT7): Define. + * src/pa/linux.S: Mark source file as using PA1.1 assembly. + (checksmst1, checksmst2): Remove. + (checksmst3): Optimize handling of 3-byte struct returns. + (checksmst567): Properly handle 5-7 byte struct returns. + +2005-06-15 Rainer Orth + + PR libgcj/21943 + * src/mips/n32.S: Enforce PIC code. + * src/mips/o32.S: Likewise. + +2005-06-15 Rainer Orth + + * configure.ac: Treat i*86-*-solaris2.10 and up as X86_64. + * configure: Regenerate. + +2005-06-01 Alan Modra + + * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't use JUMPTARGET + to call ffi_closure_helper_SYSV. Append @local instead. + * src/powerpc/sysv.S (ffi_call_SYSV): Likewise for ffi_prep_args_SYSV. + +2005-05-17 Kelley Cook + + * configure.ac: Use AC_C_BIGENDIAN instead of AC_C_BIGENDIAN_CROSS. + Use AC_CHECK_SIZEOF instead of AC_COMPILE_CHECK_SIZEOF. + * Makefile.am (ACLOCAL_AMFLAGS): Remove -I ../config. + * aclocal.m4, configure, fficonfig.h.in, Makefile.in, + include/Makefile.in, testsuite/Makefile.in: Regenerate. + +2005-05-09 Mike Stump + + * configure: Regenerate. + +2005-05-08 Richard Henderson + + PR libffi/21285 + * src/alpha/osf.S: Update unwind into to match code. + +2005-05-04 Andreas Degert + Richard Henderson + + * src/x86/ffi64.c (ffi_prep_cif_machdep): Save sse-used flag in + bit 11 of flags. + (ffi_call): Mask return type field. Pass ssecount to ffi_call_unix64. + (ffi_prep_closure): Set carry bit if sse-used flag set. + * src/x86/unix64.S (ffi_call_unix64): Add ssecount argument. + Only load sse registers if ssecount non-zero. + (ffi_closure_unix64): Only save sse registers if carry set on entry. + +2005-04-29 Ralf Corsepius + + * configure.ac: Add i*86-*-rtems*, sparc*-*-rtems*, + powerpc-*rtems*, arm*-*-rtems*, sh-*-rtems*. + * configure: Regenerate. + +2005-04-20 Hans-Peter Nilsson + + * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): In regsub use, + have Tcl8.3-compatible intermediate variable. + +2005-04-18 Simon Posnjak + Hans-Peter Nilsson + + * Makefile.am: Add CRIS support. + * configure.ac: Likewise. + * Makefile.in, configure, testsuite/Makefile.in, + include/Makefile.in: Regenerate. + * src/cris: New directory. + * src/cris/ffi.c, src/cris/sysv.S, src/cris/ffitarget.h: New files. + * src/prep_cif.c (ffi_prep_cif): Wrap in #ifndef __CRIS__. + + * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): Replace \n with + \r?\n in output tests. + +2005-04-12 Mike Stump + + * configure: Regenerate. + +2005-03-30 Hans Boehm + + * src/ia64/ffitarget.h (ffi_arg): Use long long instead of DI. + +2005-03-30 Steve Ellcey + + * src/ia64/ffitarget.h (ffi_arg) ADD DI attribute. + (ffi_sarg) Ditto. + * src/ia64/unix.S (ffi_closure_unix): Extend gp + to 64 bits in ILP32 mode. + Load 64 bits even for short data. + +2005-03-23 Mike Stump + + * src/powerpc/darwin.S: Update for -m64 multilib. + * src/powerpc/darwin_closure.S: Likewise. + +2005-03-21 Zack Weinberg + + * configure.ac: Do not invoke TL_AC_GCC_VERSION. + Do not set tool_include_dir. + * aclocal.m4, configure, Makefile.in, testsuite/Makefile.in: + Regenerate. + * include/Makefile.am: Set gcc_version and toollibffidir. + * include/Makefile.in: Regenerate. + +2005-02-22 Andrew Haley + + * src/powerpc/ffi.c (ffi_prep_cif_machdep): Bump alignment to + odd-numbered register pairs for 64-bit integer types. + +2005-02-23 Andreas Tobler + + PR libffi/20104 + * testsuite/libffi.call/return_ll1.c: New test case. + +2005-02-11 Janis Johnson + + * testsuite/libffi.call/cls_align_longdouble.c: Remove dg-options. + * testsuite/libffi.call/float.c: Ditto. + * testsuite/libffi.call/float2.c: Ditto. + * testsuite/libffi.call/float3.c: Ditto. + +2005-02-08 Andreas Tobler + + * src/frv/ffitarget.h: Remove PPC stuff which does not belong to frv. + +2005-01-12 Eric Botcazou + + * testsuite/libffi.special/special.exp (cxx_options): Add + -shared-libgcc. + +2004-12-31 Richard Henderson + + * src/types.c (FFI_AGGREGATE_TYPEDEF): Remove. + (FFI_TYPEDEF): Rename from FFI_INTEGRAL_TYPEDEF. Replace size and + offset parameters with a type parameter; deduce size and structure + alignment. Update all users. + +2004-12-31 Richard Henderson + + * src/types.c (FFI_TYPE_POINTER): Define with sizeof. + (FFI_TYPE_LONGDOUBLE): Fix for ia64. + * src/ia64/ffitarget.h (struct ffi_ia64_trampoline_struct): Move + into ffi_prep_closure. + * src/ia64/ia64_flags.h, src/ia64/ffi.c, src/ia64/unix.S: Rewrite + from scratch. + +2004-12-27 Richard Henderson + + * src/x86/unix64.S: Fix typo in unwind info. + +2004-12-25 Richard Henderson + + * src/x86/ffi64.c (struct register_args): Rename from stackLayout. + (enum x86_64_reg_class): Add X86_64_COMPLEX_X87_CLASS. + (merge_classes): Check for it. + (SSE_CLASS_P): New. + (classify_argument): Pass byte_offset by value; perform all updates + inside struct case. + (examine_argument): Add classes argument; handle + X86_64_COMPLEX_X87_CLASS. + (ffi_prep_args): Merge into ... + (ffi_call): ... here. Share stack frame with ffi_call_unix64. + (ffi_prep_cif_machdep): Setup cif->flags for proper structure return. + (ffi_fill_return_value): Remove. + (ffi_prep_closure): Remove dead assert. + (ffi_closure_unix64_inner): Rename from ffi_closure_UNIX64_inner. + Rewrite to use struct register_args instead of va_list. Create + flags for handling structure returns. + * src/x86/unix64.S: Remove dead strings. + (ffi_call_unix64): Rename from ffi_call_UNIX64. Rewrite to share + stack frame with ffi_call. Handle structure returns properly. + (float2sse, floatfloat2sse, double2sse): Remove. + (sse2float, sse2double, sse2floatfloat): Remove. + (ffi_closure_unix64): Rename from ffi_closure_UNIX64. Rewrite + to handle structure returns properly. + +2004-12-08 David Edelsohn + + * Makefile.am (AM_MAKEFLAGS): Remove duplicate LIBCFLAGS and + PICFLAG. + * Makefile.in: Regenerated. + +2004-12-02 Richard Sandiford + + * configure.ac: Use TL_AC_GCC_VERSION to set gcc_version. + * configure, aclocal.m4, Makefile.in: Regenerate. + * include/Makefile.in, testsuite/Makefile.in: Regenerate. + +2004-11-29 Kelley Cook + + * configure: Regenerate for libtool change. + +2004-11-25 Kelley Cook + + * configure: Regenerate for libtool reversion. + +2004-11-24 Kelley Cook + + * configure: Regenerate for libtool change. + +2004-11-23 John David Anglin + + * testsuite/lib/libffi-dg.exp: Use new procs in target-libpath.exp. + +2004-11-23 Richard Sandiford + + * src/mips/o32.S (ffi_call_O32, ffi_closure_O32): Use jalr instead + of jal. Use an absolute encoding for the frame information. + +2004-11-23 Kelley Cook + + * Makefile.am: Remove no-dependencies. Add ACLOCAL_AMFLAGS. + * acinclude.m4: Delete logic for sincludes. + * aclocal.m4, Makefile.in, configure: Regenerate. + * include/Makefile: Likewise. + * testsuite/Makefile: Likewise. + +2004-11-22 Eric Botcazou + + * src/sparc/ffi.c (ffi_prep_closure): Align doubles and 64-bit integers + on a 8-byte boundary. + * src/sparc/v8.S (ffi_closure_v8): Reserve frame space for arguments. + +2004-10-27 Richard Earnshaw + + * src/arm/ffi.c (ffi_prep_cif_machdep): Handle functions that return + long long values. Round stack allocation to a multiple of 8 bytes + for ATPCS compatibility. + * src/arm/sysv.S (ffi_call_SYSV): Rework to avoid use of APCS register + names. Handle returning long long types. Add Thumb and interworking + support. Improve soft-float code. + +2004-10-27 Richard Earnshaw + + * testsuite/lib/libffi-db.exp (load_gcc_lib): New function. + (libffi_exit): New function. + (libffi_init): Build the testglue wrapper if needed. + +2004-10-25 Eric Botcazou + + PR other/18138 + * testsuite/lib/libffi-dg.exp: Accept more than one multilib libgcc. + +2004-10-25 Kazuhiro Inaoka + + * src/m32r/libffitarget.h (FFI_CLOSURES): Set to 0. + +2004-10-20 Kaz Kojima + + * src/sh/sysv.S (ffi_call_SYSV): Don't align for double data. + * testsuite/libffi.call/float3.c: New test case. + +2004-10-18 Kaz Kojima + + * src/sh/ffi.c (ffi_prep_closure): Set T bit in trampoline for + the function returning a structure pointed with R2. + * src/sh/sysv.S (ffi_closure_SYSV): Use R2 as the pointer to + the structure return value if T bit set. Emit position + independent code and EH data if PIC. + +2004-10-13 Kazuhiro Inaoka + + * Makefile.am: Add m32r support. + * configure.ac: Likewise. + * Makefile.in: Regenerate. + * confiugre: Regenerate. + * src/types.c: Add m32r port to FFI_INTERNAL_TYPEDEF + (uint64, sint64, double, longdouble) + * src/m32r: New directory. + * src/m32r/ffi.c: New file. + * src/m32r/sysv.S: Likewise. + * src/m32r/ffitarget.h: Likewise. + +2004-10-02 Kaz Kojima + + * testsuite/libffi.call/negint.c: New test case. + +2004-09-14 H.J. Lu + + PR libgcj/17465 + * testsuite/lib/libffi-dg.exp: Don't use global ld_library_path. + Set up LD_LIBRARY_PATH, SHLIB_PATH, LD_LIBRARYN32_PATH, + LD_LIBRARY64_PATH, LD_LIBRARY_PATH_32, LD_LIBRARY_PATH_64 and + DYLD_LIBRARY_PATH. + +2004-09-05 Andreas Tobler + + * testsuite/libffi.call/many_win32.c: Remove whitespaces. + * testsuite/libffi.call/promotion.c: Likewise. + * testsuite/libffi.call/return_ll.c: Remove unused var. Cleanup + whitespaces. + * testsuite/libffi.call/return_sc.c: Likewise. + * testsuite/libffi.call/return_uc.c: Likewise. + +2004-09-05 Andreas Tobler + + * src/powerpc/darwin.S: Fix comments and identation. + * src/powerpc/darwin_closure.S: Likewise. + +2004-09-02 Andreas Tobler + + * src/powerpc/ffi_darwin.c: Add flag for longdouble return values. + (ffi_prep_args): Handle longdouble arguments. + (ffi_prep_cif_machdep): Set flags for longdouble. Calculate space for + longdouble. + (ffi_closure_helper_DARWIN): Add closure handling for longdouble. + * src/powerpc/darwin.S (_ffi_call_DARWIN): Add handling of longdouble + values. + * src/powerpc/darwin_closure.S (_ffi_closure_ASM): Likewise. + * src/types.c: Defined longdouble size and alignment for darwin. + +2004-09-02 Andreas Tobler + + * src/powerpc/aix.S: Remove whitespaces. + * src/powerpc/aix_closure.S: Likewise. + * src/powerpc/asm.h: Likewise. + * src/powerpc/ffi.c: Likewise. + * src/powerpc/ffitarget.h: Likewise. + * src/powerpc/linux64.S: Likewise. + * src/powerpc/linux64_closure.S: Likewise. + * src/powerpc/ppc_closure.S: Likewise. + * src/powerpc/sysv.S: Likewise. + +2004-08-30 Anthony Green + + * Makefile.am: Add frv support. + * Makefile.in, testsuite/Makefile.in: Rebuilt. + * configure.ac: Read configure.host. + * configure.in: Read configure.host. + * configure.host: New file. frv-elf needs libgloss. + * include/ffi.h.in: Force ffi_closure to have a nice big (8) + alignment. This is needed to frv and shouldn't harm the others. + * include/ffi_common.h (ALIGN_DOWN): New macro. + * src/frv/ffi.c, src/frv/ffitarget.h, src/frv/eabi.S: New files. + +2004-08-24 David Daney + + * testsuite/libffi.call/closure_fn0.c: Xfail mips64* instead of mips*. + * testsuite/libffi.call/closure_fn1.c: Likewise. + * testsuite/libffi.call/closure_fn2.c Likewise. + * testsuite/libffi.call/closure_fn3.c: Likewise. + * testsuite/libffi.call/closure_fn4.c: Likewise. + * testsuite/libffi.call/closure_fn5.c: Likewise. + * testsuite/libffi.call/cls_18byte.c: Likewise. + * testsuite/libffi.call/cls_19byte.c: Likewise. + * testsuite/libffi.call/cls_1_1byte.c: Likewise. + * testsuite/libffi.call/cls_20byte.c: Likewise. + * testsuite/libffi.call/cls_20byte1.c: Likewise. + * testsuite/libffi.call/cls_24byte.c: Likewise. + * testsuite/libffi.call/cls_2byte.c: Likewise. + * testsuite/libffi.call/cls_3_1byte.c: Likewise. + * testsuite/libffi.call/cls_3byte1.c: Likewise. + * testsuite/libffi.call/cls_3byte2.c: Likewise. + * testsuite/libffi.call/cls_4_1byte.c: Likewise. + * testsuite/libffi.call/cls_4byte.c: Likewise. + * testsuite/libffi.call/cls_64byte.c: Likewise. + * testsuite/libffi.call/cls_6byte.c: Likewise. + * testsuite/libffi.call/cls_7byte.c: Likewise. + * testsuite/libffi.call/cls_8byte.c: Likewise. + * testsuite/libffi.call/cls_9byte1.c: Likewise. + * testsuite/libffi.call/cls_9byte2.c: Likewise. + * testsuite/libffi.call/cls_align_double.c: Likewise. + * testsuite/libffi.call/cls_align_float.c: Likewise. + * testsuite/libffi.call/cls_align_longdouble.c: Likewise. + * testsuite/libffi.call/cls_align_pointer.c: Likewise. + * testsuite/libffi.call/cls_align_sint16.c: Likewise. + * testsuite/libffi.call/cls_align_sint32.c: Likewise. + * testsuite/libffi.call/cls_align_sint64.c: Likewise. + * testsuite/libffi.call/cls_align_uint16.c: Likewise. + * testsuite/libffi.call/cls_align_uint32.c: Likewise. + * testsuite/libffi.call/cls_align_uint64.c: Likewise. + * testsuite/libffi.call/cls_double.c: Likewise. + * testsuite/libffi.call/cls_float.c: Likewise. + * testsuite/libffi.call/cls_multi_schar.c: Likewise. + * testsuite/libffi.call/cls_multi_sshort.c: Likewise. + * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. + * testsuite/libffi.call/cls_multi_uchar.c: Likewise. + * testsuite/libffi.call/cls_multi_ushort.c: Likewise. + * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. + * testsuite/libffi.call/cls_schar.c: Likewise. + * testsuite/libffi.call/cls_sint.c: Likewise. + * testsuite/libffi.call/cls_sshort.c: Likewise. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/nested_struct.c: Likewise. + * testsuite/libffi.call/nested_struct1.c: Likewise. + * testsuite/libffi.call/nested_struct2.c: Likewise. + * testsuite/libffi.call/nested_struct3.c: Likewise. + * testsuite/libffi.call/problem1.c: Likewise. + * testsuite/libffi.special/unwindtest.cc: Likewise. + * testsuite/libffi.call/cls_12byte.c: Likewise and set return value + to zero. + * testsuite/libffi.call/cls_16byte.c: Likewise. + * testsuite/libffi.call/cls_5byte.c: Likewise. + +2004-08-23 David Daney + + PR libgcj/13141 + * src/mips/ffitarget.h (FFI_O32_SOFT_FLOAT): New ABI. + * src/mips/ffi.c (ffi_prep_args): Fix alignment calculation. + (ffi_prep_cif_machdep): Handle FFI_O32_SOFT_FLOAT floating point + parameters and return types. + (ffi_call): Handle FFI_O32_SOFT_FLOAT ABI. + (ffi_prep_closure): Ditto. + (ffi_closure_mips_inner_O32): Handle FFI_O32_SOFT_FLOAT ABI, fix + alignment calculations. + * src/mips/o32.S (ffi_closure_O32): Don't use floating point + instructions if FFI_O32_SOFT_FLOAT, make stack frame ABI compliant. + +2004-08-14 Casey Marshall + + * src/mips/ffi.c (ffi_pref_cif_machdep): set `cif->flags' to + contain `FFI_TYPE_UINT64' as return type for any 64-bit + integer (O32 ABI only). + (ffi_prep_closure): new function. + (ffi_closure_mips_inner_O32): new function. + * src/mips/ffitarget.h: Define `FFI_CLOSURES' and + `FFI_TRAMPOLINE_SIZE' appropriately if the ABI is o32. + * src/mips/o32.S (ffi_call_O32): add labels for .eh_frame. Return + 64 bit integers correctly. + (ffi_closure_O32): new function. + Added DWARF-2 unwind info for both functions. + +2004-08-10 Andrew Haley + + * src/x86/ffi64.c (ffi_prep_args ): 8-align all stack arguments. + +2004-08-01 Robert Millan + + * configure.ac: Detect knetbsd-gnu and kfreebsd-gnu. + * configure: Regenerate. + +2004-07-30 Maciej W. Rozycki + + * acinclude.m4 (AC_FUNC_MMAP_BLACKLIST): Check for + and mmap() explicitly instead of relying on preset autoconf cache + variables. + * aclocal.m4: Regenerate. + * configure: Regenerate. + +2004-07-11 Ulrich Weigand + + * src/s390/ffi.c (ffi_prep_args): Fix C aliasing violation. + (ffi_check_float_struct): Remove unused prototype. + +2004-06-30 Geoffrey Keating + + * src/powerpc/ffi_darwin.c (flush_icache): ';' is a comment + character on Darwin, use '\n\t' instead. + +2004-06-26 Matthias Klose + + * libtool-version: Fix typo in revision/age. + +2004-06-17 Matthias Klose + + * libtool-version: New. + * Makefile.am (libffi_la_LDFLAGS): Use -version-info for soname. + * Makefile.in: Regenerate. + +2004-06-15 Paolo Bonzini + + * Makefile.am: Remove useless multilib rules. + * Makefile.in: Regenerate. + * aclocal.m4: Regenerate with automake 1.8.5. + * configure.ac: Remove useless multilib configury. + * configure: Regenerate. + +2004-06-15 Paolo Bonzini + + * .cvsignore: New file. + +2004-06-10 Jakub Jelinek + + * src/ia64/unix.S (ffi_call_unix): Insert group barrier break + fp_done. + (ffi_closure_UNIX): Fix f14/f15 adjustment if FLOAT_SZ is ever + changed from 8. + +2004-06-06 Sean McNeil + + * configure.ac: Add x86_64-*-freebsd* support. + * configure: Regenerate. + +2004-04-26 Joe Buck + + Bug 15093 + * configure.ac: Test for existence of mmap and sys/mman.h before + checking blacklist. Fix suggested by Jim Wilson. + * configure: Regenerate. + +2004-04-26 Matt Austern + + * src/powerpc/darwin.S: Go through a non-lazy pointer for initial + FDE location. + * src/powerpc/darwin_closure.S: Likewise. + +2004-04-24 Andreas Tobler + + * testsuite/libffi.call/cls_multi_schar.c (main): Fix initialization + error. Reported by Thomas Heller . + * testsuite/libffi.call/cls_multi_sshort.c (main): Likewise. + * testsuite/libffi.call/cls_multi_ushort.c (main): Likewise. + +2004-03-20 Matthias Klose + + * src/pa/linux.S: Fix typo. + +2004-03-19 Matthias Klose + + * Makefile.am: Update. + * Makefile.in: Regenerate. + * src/pa/ffi.h.in: Remove. + * src/pa/ffitarget.h: New file. + +2004-02-10 Randolph Chung + + * Makefile.am: Add PA support. + * Makefile.in: Regenerate. + * include/Makefile.in: Regenerate. + * configure.ac: Add PA target. + * configure: Regenerate. + * src/pa/ffi.c: New file. + * src/pa/ffi.h.in: Add PA support. + * src/pa/linux.S: New file. + * prep_cif.c: Add PA support. + +2004-03-16 Hosaka Yuji + + * src/types.c: Fix alignment size of X86_WIN32 case int64 and + double. + * src/x86/ffi.c (ffi_prep_args): Replace ecif->cif->rtype->type + with ecif->cif->flags. + (ffi_call, ffi_prep_incoming_args_SYSV): Replace cif->rtype->type + with cif->flags. + (ffi_prep_cif_machdep): Add X86_WIN32 struct case. + (ffi_closure_SYSV): Add 1 or 2-bytes struct case for X86_WIN32. + * src/x86/win32.S (retstruct1b, retstruct2b, sc_retstruct1b, + sc_retstruct2b): Add for 1 or 2-bytes struct case. + +2004-03-15 Kelley Cook + + * configure.in: Rename file to ... + * configure.ac: ... this. + * fficonfig.h.in: Regenerate. + * Makefile.in: Regenerate. + * include/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2004-03-12 Matt Austern + + * src/powerpc/darwin.S: Fix EH information so it corresponds to + changes in EH format resulting from addition of linkonce support. + * src/powerpc/darwin_closure.S: Likewise. + +2004-03-11 Andreas Tobler + Paolo Bonzini + + * Makefile.am (AUTOMAKE_OPTIONS): Set them. + Remove VPATH. Remove rules for object files. Remove multilib support. + (AM_CCASFLAGS): Add. + * configure.in (AC_CONFIG_HEADERS): Relace AM_CONFIG_HEADER. + (AC_PREREQ): Bump version to 2.59. + (AC_INIT): Fill with version info and bug address. + (ORIGINAL_LD_FOR_MULTILIBS): Remove. + (AM_ENABLE_MULTILIB): Use this instead of AC_ARG_ENABLE. + De-precious CC so that the right flags are passed down to multilibs. + (AC_MSG_ERROR): Replace obsolete macro AC_ERROR. + (AC_CONFIG_FILES): Replace obsolete macro AC_LINK_FILES. + (AC_OUTPUT): Reorganize the output with AC_CONFIG_COMMANDS. + * configure: Rebuilt. + * aclocal.m4: Likewise. + * Makefile.in, include/Makefile.in, testsuite/Makefile.in: Likewise. + * fficonfig.h.in: Likewise. + +2004-03-11 Andreas Schwab + + * src/ia64/ffi.c (ffi_prep_incoming_args_UNIX): Get floating point + arguments from fp registers only for the first 8 parameter slots. + Don't convert a float parameter when passed in memory. + +2004-03-09 Hans-Peter Nilsson + + * configure: Regenerate for config/accross.m4 correction. + +2004-02-25 Matt Kraai + + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Change + ecif->cif->bytes to bytes. + (ffi_prep_cif_machdep): Add braces around nested if statement. + +2004-02-09 Alan Modra + + * src/types.c (pointer): POWERPC64 has 8 byte pointers. + + * src/powerpc/ffi.c (ffi_prep_args64): Correct long double handling. + (ffi_closure_helper_LINUX64): Fix typo. + * testsuite/libffi.call/cls_align_longdouble.c: Pass -mlong-double-128 + for powerpc64-*-*. + * testsuite/libffi.call/float.c: Likewise. + * testsuite/libffi.call/float2.c: Likewise. + +2004-02-08 Alan Modra + + * src/powerpc/ffi.c (ffi_prep_cif_machdep ): Correct + long double function return and long double arg handling. + (ffi_closure_helper_LINUX64): Formatting. Delete unused "ng" var. + Use "end_pfr" instead of "nf". Correct long double handling. + Localise "temp". + * src/powerpc/linux64.S (ffi_call_LINUX64): Save f2 long double + return value. + * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Allocate + space for long double return value. Adjust stack frame and offsets. + Load f2 long double return. + +2004-02-07 Alan Modra + + * src/types.c: Use 16 byte long double for POWERPC64. + +2004-01-25 Eric Botcazou + + * src/sparc/ffi.c (ffi_prep_args_v9): Shift the parameter array + when the structure return address is passed in %o0. + (ffi_V9_return_struct): Rename into ffi_v9_layout_struct. + (ffi_v9_layout_struct): Align the field following a nested structure + on a word boundary. Use memmove instead of memcpy. + (ffi_call): Update call to ffi_V9_return_struct. + (ffi_prep_closure): Define 'ctx' only for V8. + (ffi_closure_sparc_inner): Clone into ffi_closure_sparc_inner_v8 + and ffi_closure_sparc_inner_v9. + (ffi_closure_sparc_inner_v8): Return long doubles by reference. + Always skip the structure return address. For structures and long + doubles, copy the argument directly. + (ffi_closure_sparc_inner_v9): Skip the structure return address only + if required. Shift the maximum floating-point slot accordingly. For + big structures, copy the argument directly; otherwise, left-justify the + argument and call ffi_v9_layout_struct to lay out the structure on + the stack. + * src/sparc/v8.S: Undef STACKFRAME before defining it. + (ffi_closure_v8): Pass the structure return address. Update call to + ffi_closure_sparc_inner_v8. Short-circuit FFI_TYPE_INT handling. + Skip the 'unimp' insn when returning long doubles and structures. + * src/sparc/v9.S: Undef STACKFRAME before defining it. + (ffi_closure_v9): Increase the frame size by 2 words. Short-circuit + FFI_TYPE_INT handling. Load structures both in integers and + floating-point registers on return. + * README: Update status of the SPARC port. + +2004-01-24 Andreas Tobler + + * testsuite/libffi.call/pyobjc-tc.c (main): Treat result value + as of type ffi_arg. + * testsuite/libffi.call/struct3.c (main): Fix CHECK. + +2004-01-22 Ulrich Weigand + + * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Treat result + value as of type ffi_arg, not unsigned int. + +2004-01-21 Michael Ritzert + + * ffi64.c (ffi_prep_args): Cast the RHS of an assignment instead + of the LHS. + +2004-01-12 Andreas Tobler + + * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_32 for + Solaris. + +2004-01-08 Rainer Orth + + * testsuite/libffi.call/ffitest.h (allocate_mmap): Cast MAP_FAILED + to void *. + +2003-12-10 Richard Henderson + + * testsuite/libffi.call/cls_align_pointer.c: Cast pointers to + size_t instead of int. + +2003-12-04 Hosaka Yuji + + * testsuite/libffi.call/many_win32.c: Include . + * testsuite/libffi.call/many_win32.c (main): Replace variable + int i with unsigned long ul. + + * testsuite/libffi.call/cls_align_uint64.c: New test case. + * testsuite/libffi.call/cls_align_sint64.c: Likewise. + * testsuite/libffi.call/cls_align_uint32.c: Likewise. + * testsuite/libffi.call/cls_align_sint32.c: Likewise. + * testsuite/libffi.call/cls_align_uint16.c: Likewise. + * testsuite/libffi.call/cls_align_sint16.c: Likewise. + * testsuite/libffi.call/cls_align_float.c: Likewise. + * testsuite/libffi.call/cls_align_double.c: Likewise. + * testsuite/libffi.call/cls_align_longdouble.c: Likewise. + * testsuite/libffi.call/cls_align_pointer.c: Likewise. + +2003-12-02 Hosaka Yuji + + PR other/13221 + * src/x86/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): + Align arguments to 32 bits. + +2003-12-01 Andreas Tobler + + PR other/13221 + * testsuite/libffi.call/cls_multi_sshort.c: New test case. + * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. + * testsuite/libffi.call/cls_multi_uchar.c: Likewise. + * testsuite/libffi.call/cls_multi_schar.c: Likewise. + * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. + * testsuite/libffi.call/cls_multi_ushort.c: Likewise. + + * testsuite/libffi.special/unwindtest.cc: Cosmetics. + +2003-11-26 Kaveh R. Ghazi + + * testsuite/libffi.call/ffitest.h: Include . + * testsuite/libffi.special/ffitestcxx.h: Likewise. + +2003-11-22 Andreas Tobler + + * Makefile.in: Rebuilt. + * configure: Likewise. + * testsuite/libffi.special/unwindtest.cc: Convert the mmap to + the right type. + +2003-11-21 Andreas Jaeger + Andreas Tobler + + * acinclude.m4: Add AC_FUNC_MMAP_BLACKLIST. + * configure.in: Call AC_FUNC_MMAP_BLACKLIST. + * Makefile.in: Rebuilt. + * aclocal.m4: Likewise. + * configure: Likewise. + * fficonfig.h.in: Likewise. + * testsuite/lib/libffi-dg.exp: Add include dir. + * testsuite/libffi.call/ffitest.h: Add MMAP definitions. + * testsuite/libffi.special/ffitestcxx.h: Likewise. + * testsuite/libffi.call/closure_fn0.c: Use MMAP functionality + for ffi_closure if available. + * testsuite/libffi.call/closure_fn1.c: Likewise. + * testsuite/libffi.call/closure_fn2.c: Likewise. + * testsuite/libffi.call/closure_fn3.c: Likewise. + * testsuite/libffi.call/closure_fn4.c: Likewise. + * testsuite/libffi.call/closure_fn5.c: Likewise. + * testsuite/libffi.call/cls_12byte.c: Likewise. + * testsuite/libffi.call/cls_16byte.c: Likewise. + * testsuite/libffi.call/cls_18byte.c: Likewise. + * testsuite/libffi.call/cls_19byte.c: Likewise. + * testsuite/libffi.call/cls_1_1byte.c: Likewise. + * testsuite/libffi.call/cls_20byte.c: Likewise. + * testsuite/libffi.call/cls_20byte1.c: Likewise. + * testsuite/libffi.call/cls_24byte.c: Likewise. + * testsuite/libffi.call/cls_2byte.c: Likewise. + * testsuite/libffi.call/cls_3_1byte.c: Likewise. + * testsuite/libffi.call/cls_3byte1.c: Likewise. + * testsuite/libffi.call/cls_3byte2.c: Likewise. + * testsuite/libffi.call/cls_4_1byte.c: Likewise. + * testsuite/libffi.call/cls_4byte.c: Likewise. + * testsuite/libffi.call/cls_5byte.c: Likewise. + * testsuite/libffi.call/cls_64byte.c: Likewise. + * testsuite/libffi.call/cls_6byte.c: Likewise. + * testsuite/libffi.call/cls_7byte.c: Likewise. + * testsuite/libffi.call/cls_8byte.c: Likewise. + * testsuite/libffi.call/cls_9byte1.c: Likewise. + * testsuite/libffi.call/cls_9byte2.c: Likewise. + * testsuite/libffi.call/cls_double.c: Likewise. + * testsuite/libffi.call/cls_float.c: Likewise. + * testsuite/libffi.call/cls_schar.c: Likewise. + * testsuite/libffi.call/cls_sint.c: Likewise. + * testsuite/libffi.call/cls_sshort.c: Likewise. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/nested_struct.c: Likewise. + * testsuite/libffi.call/nested_struct1.c: Likewise. + * testsuite/libffi.call/nested_struct2.c: Likewise. + * testsuite/libffi.call/nested_struct3.c: Likewise. + * testsuite/libffi.call/problem1.c: Likewise. + * testsuite/libffi.special/unwindtest.cc: Likewise. + +2003-11-20 Andreas Tobler + + * testsuite/lib/libffi-dg.exp: Make the -lgcc_s conditional. + +2003-11-19 Andreas Tobler + + * testsuite/lib/libffi-dg.exp: Add DYLD_LIBRARY_PATH for darwin. + Add -lgcc_s to additional flags. + +2003-11-12 Andreas Tobler + + * configure.in, include/Makefile.am: PR libgcj/11147, install + the ffitarget.h header file in a gcc versioned and target + dependent place. + * configure: Regenerated. + * Makefile.in, include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + +2003-11-09 Andreas Tobler + + * testsuite/libffi.call/closure_fn0.c: Print result and check + with dg-output to make debugging easier. + * testsuite/libffi.call/closure_fn1.c: Likewise. + * testsuite/libffi.call/closure_fn2.c: Likewise. + * testsuite/libffi.call/closure_fn3.c: Likewise. + * testsuite/libffi.call/closure_fn4.c: Likewise. + * testsuite/libffi.call/closure_fn5.c: Likewise. + * testsuite/libffi.call/cls_12byte.c: Likewise. + * testsuite/libffi.call/cls_16byte.c: Likewise. + * testsuite/libffi.call/cls_18byte.c: Likewise. + * testsuite/libffi.call/cls_19byte.c: Likewise. + * testsuite/libffi.call/cls_1_1byte.c: Likewise. + * testsuite/libffi.call/cls_20byte.c: Likewise. + * testsuite/libffi.call/cls_20byte1.c: Likewise. + * testsuite/libffi.call/cls_24byte.c: Likewise. + * testsuite/libffi.call/cls_2byte.c: Likewise. + * testsuite/libffi.call/cls_3_1byte.c: Likewise. + * testsuite/libffi.call/cls_3byte1.c: Likewise. + * testsuite/libffi.call/cls_3byte2.c: Likewise. + * testsuite/libffi.call/cls_4_1byte.c: Likewise. + * testsuite/libffi.call/cls_4byte.c: Likewise. + * testsuite/libffi.call/cls_5byte.c: Likewise. + * testsuite/libffi.call/cls_64byte.c: Likewise. + * testsuite/libffi.call/cls_6byte.c: Likewise. + * testsuite/libffi.call/cls_7byte.c: Likewise. + * testsuite/libffi.call/cls_8byte.c: Likewise. + * testsuite/libffi.call/cls_9byte1.c: Likewise. + * testsuite/libffi.call/cls_9byte2.c: Likewise. + * testsuite/libffi.call/cls_double.c: Likewise. + * testsuite/libffi.call/cls_float.c: Likewise. + * testsuite/libffi.call/cls_schar.c: Likewise. + * testsuite/libffi.call/cls_sint.c: Likewise. + * testsuite/libffi.call/cls_sshort.c: Likewise. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/problem1.c: Likewise. + + * testsuite/libffi.special/unwindtest.cc: Make ffi_closure + static. + +2003-11-08 Andreas Tobler + + * testsuite/libffi.call/cls_9byte2.c: New test case. + * testsuite/libffi.call/cls_9byte1.c: Likewise. + * testsuite/libffi.call/cls_64byte.c: Likewise. + * testsuite/libffi.call/cls_20byte1.c: Likewise. + * testsuite/libffi.call/cls_19byte.c: Likewise. + * testsuite/libffi.call/cls_18byte.c: Likewise. + * testsuite/libffi.call/closure_fn4.c: Likewise. + * testsuite/libffi.call/closure_fn5.c: Likewise. + * testsuite/libffi.call/cls_schar.c: Likewise. + * testsuite/libffi.call/cls_sint.c: Likewise. + * testsuite/libffi.call/cls_sshort.c: Likewise. + * testsuite/libffi.call/nested_struct2.c: Likewise. + * testsuite/libffi.call/nested_struct3.c: Likewise. + +2003-11-08 Andreas Tobler + + * testsuite/libffi.call/cls_double.c: Do a check on the result. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/return_sc.c: Cleanup whitespaces. + +2003-11-06 Andreas Tobler + + * src/prep_cif.c (ffi_prep_cif): Move the validity check after + the initialization. + +2003-10-23 Andreas Tobler + + * src/java_raw_api.c (ffi_java_ptrarray_to_raw): Replace + FFI_ASSERT(FALSE) with FFI_ASSERT(0). + +2003-10-22 David Daney + + * src/mips/ffitarget.h: Replace undefined UINT32 and friends with + __attribute__((__mode__(__SI__))) and friends. + +2003-10-22 Andreas Schwab + + * src/ia64/ffi.c: Replace FALSE/TRUE with false/true. + +2003-10-21 Andreas Tobler + + * configure.in: AC_LINK_FILES(ffitarget.h). + * configure: Regenerate. + * Makefile.in: Likewise. + * include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + * fficonfig.h.in: Likewise. + +2003-10-21 Paolo Bonzini + Richard Henderson + + Avoid that ffi.h includes fficonfig.h. + + * Makefile.am (EXTRA_DIST): Include ffitarget.h files + (TARGET_SRC_MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. + (TARGET_SRC_MIPS_SGI): Removed. + (MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. + (MIPS_SGI): Removed. + (CLEANFILES): Removed. + (mostlyclean-am, clean-am, mostlyclean-sub, clean-sub): New + targets. + * acconfig.h: Removed. + * configure.in: Compute sizeofs only for double and long double. + Use them to define and subst HAVE_LONG_DOUBLE. Include comments + into AC_DEFINE instead of using acconfig.h. Create + include/ffitarget.h instead of include/fficonfig.h. Rename + MIPS_GCC to MIPS_IRIX, drop MIPS_SGI since we are in gcc's tree. + AC_DEFINE EH_FRAME_FLAGS. + * include/Makefile.am (DISTCLEANFILES): New automake macro. + (hack_DATA): Add ffitarget.h. + * include/ffi.h.in: Remove all system specific definitions. + Declare raw API even if it is not installed, why bother? + Use limits.h instead of SIZEOF_* to define ffi_type_*. Do + not define EH_FRAME_FLAGS, it is in fficonfig.h now. Include + ffitarget.h instead of fficonfig.h. Remove ALIGN macro. + (UINT_ARG, INT_ARG): Removed, use ffi_arg and ffi_sarg instead. + * include/ffi_common.h (bool): Do not define. + (ffi_assert): Accept failed assertion. + (ffi_type_test): Return void and accept file/line. + (FFI_ASSERT): Pass stringized failed assertion. + (FFI_ASSERT_AT): New macro. + (FFI_ASSERT_VALID_TYPE): New macro. + (UINT8, SINT8, UINT16, SINT16, UINT32, SINT32, + UINT64, SINT64): Define here with gcc's __attribute__ macro + instead of in ffi.h + (FLOAT32, ALIGN): Define here instead of in ffi.h + * include/ffi-mips.h: Removed. Its content moved to + src/mips/ffitarget.h after separating assembly and C sections. + * src/alpha/ffi.c, src/alpha/ffi.c, src/java_raw_api.c + src/prep_cif.c, src/raw_api.c, src/ia64/ffi.c, + src/mips/ffi.c, src/mips/n32.S, src/mips/o32.S, + src/mips/ffitarget.h, src/sparc/ffi.c, src/x86/ffi64.c: + SIZEOF_ARG -> FFI_SIZEOF_ARG. + * src/ia64/ffi.c: Include stdbool.h (provided by GCC 2.95+). + * src/debug.c (ffi_assert): Accept stringized failed assertion. + (ffi_type_test): Rewritten. + * src/prep-cif.c (initialize_aggregate, ffi_prep_cif): Call + FFI_ASSERT_VALID_TYPE. + * src/alpha/ffitarget.h, src/arm/ffitarget.h, + src/ia64/ffitarget.h, src/m68k/ffitarget.h, + src/mips/ffitarget.h, src/powerpc/ffitarget.h, + src/s390/ffitarget.h, src/sh/ffitarget.h, + src/sh64/ffitarget.h, src/sparc/ffitarget.h, + src/x86/ffitarget.h: New files. + * src/alpha/osf.S, src/arm/sysv.S, src/ia64/unix.S, + src/m68k/sysv.S, src/mips/n32.S, src/mips/o32.S, + src/powerpc/aix.S, src/powerpc/darwin.S, + src/powerpc/ffi_darwin.c, src/powerpc/linux64.S, + src/powerpc/linux64_closure.S, src/powerpc/ppc_closure.S, + src/powerpc/sysv.S, src/s390/sysv.S, src/sh/sysv.S, + src/sh64/sysv.S, src/sparc/v8.S, src/sparc/v9.S, + src/x86/sysv.S, src/x86/unix64.S, src/x86/win32.S: + include fficonfig.h + +2003-10-20 Rainer Orth + + * src/mips/ffi.c: Use _ABIN32, _ABIO32 instead of external + _MIPS_SIM_NABI32, _MIPS_SIM_ABI32. + +2003-10-19 Andreas Tobler + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Declare bytes again. + Used when FFI_DEBUG = 1. + +2003-10-14 Alan Modra + + * src/types.c (double, longdouble): Default POWERPC64 to 8 byte size + and align. + +2003-10-06 Rainer Orth + + * include/ffi_mips.h: Define FFI_MIPS_N32 for N32/N64 ABIs, + FFI_MIPS_O32 for O32 ABI. + +2003-10-01 Andreas Tobler + + * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_64 for + SPARC64. Cleanup whitespaces. + +2003-09-19 Andreas Tobler + + * testsuite/libffi.call/closure_fn0.c: Xfail mips, arm, + strongarm, xscale. Cleanup whitespaces. + * testsuite/libffi.call/closure_fn1.c: Likewise. + * testsuite/libffi.call/closure_fn2.c: Likewise. + * testsuite/libffi.call/closure_fn3.c: Likewise. + * testsuite/libffi.call/cls_12byte.c: Likewise. + * testsuite/libffi.call/cls_16byte.c: Likewise. + * testsuite/libffi.call/cls_1_1byte.c: Likewise. + * testsuite/libffi.call/cls_20byte.c: Likewise. + * testsuite/libffi.call/cls_24byte.c: Likewise. + * testsuite/libffi.call/cls_2byte.c: Likewise. + * testsuite/libffi.call/cls_3_1byte.c: Likewise. + * testsuite/libffi.call/cls_3byte1.c: Likewise. + * testsuite/libffi.call/cls_3byte2.c: Likewise. + * testsuite/libffi.call/cls_4_1byte.c: Likewise. + * testsuite/libffi.call/cls_4byte.c: Likewise. + * testsuite/libffi.call/cls_5byte.c: Likewise. + * testsuite/libffi.call/cls_6byte.c: Likewise. + * testsuite/libffi.call/cls_7byte.c: Likewise. + * testsuite/libffi.call/cls_8byte.c: Likewise. + * testsuite/libffi.call/cls_double.c: Likewise. + * testsuite/libffi.call/cls_float.c: Likewise. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/nested_struct.c: Likewise. + * testsuite/libffi.call/nested_struct1.c: Likewise. + * testsuite/libffi.call/problem1.c: Likewise. + * testsuite/libffi.special/unwindtest.cc: Likewise. + * testsuite/libffi.call/pyobjc-tc.c: Cleanup whitespaces. + +2003-09-18 David Edelsohn + + * src/powerpc/aix.S: Cleanup whitespaces. + * src/powerpc/aix_closure.S: Likewise. + +2003-09-18 Andreas Tobler + + * src/powerpc/darwin.S: Cleanup whitespaces, comment formatting. + * src/powerpc/darwin_closure.S: Likewise. + * src/powerpc/ffi_darwin.c: Likewise. + +2003-09-18 Andreas Tobler + David Edelsohn + + * src/types.c (double): Add AIX and Darwin to the right TYPEDEF. + * src/powerpc/aix_closure.S: Remove the pointer to the outgoing + parameter stack. + * src/powerpc/darwin_closure.S: Likewise. + * src/powerpc/ffi_darwin.c (ffi_prep_args): Handle structures + according to the Darwin/AIX ABI. + (ffi_prep_cif_machdep): Likewise. + (ffi_closure_helper_DARWIN): Likewise. + Remove the outgoing parameter stack logic. Simplify the evaluation + of the different CASE types. + (ffi_prep_clousure): Avoid the casts on lvalues. Change the branch + statement in the trampoline code. + +2003-09-18 Kaz Kojima + + * src/sh/ffi.c (ffi_prep_args): Take account into the alignement + for the register size. + (ffi_closure_helper_SYSV): Handle the structure return value + address correctly. + (ffi_closure_helper_SYSV): Return the appropriate type when + the registers are used for the structure return value. + * src/sh/sysv.S (ffi_closure_SYSV): Fix the stack layout for + the 64-bit return value. Update copyright years. + +2003-09-17 Rainer Orth + + * testsuite/lib/libffi-dg.exp (libffi_target_compile): Search in + srcdir for ffi_mips.h. + +2003-09-12 Alan Modra + + * src/prep_cif.c (initialize_aggregate): Include tail padding in + structure size. + * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Correct + placement of float result. + * testsuite/libffi.special/unwindtest.cc (closure_test_fn1): Correct + cast of "resp" for big-endian 64 bit machines. + +2003-09-11 Alan Modra + + * src/types.c (double, longdouble): Merge identical SH and ARM + typedefs, and add POWERPC64. + * src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for + struct split over gpr and rest. + (ffi_prep_cif_machdep): Correct intarg_count for structures. + * src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets. + +2003-09-09 Andreas Tobler + + * src/powerpc/ffi.c (ffi_closure_helper_SYSV) Handle struct + passing correctly. + +2003-09-09 Alan Modra + + * configure: Regenerate. + +2003-09-04 Andreas Tobler + + * Makefile.am: Remove build rules for ffitest. + * Makefile.in: Rebuilt. + +2003-09-04 Andreas Tobler + + * src/java_raw_api.c: Include to fix compiler warning + about implicit declaration of abort(). + +2003-09-04 Andreas Tobler + + * Makefile.am: Add dejagnu test framework. Fixes PR other/11411. + * Makefile.in: Rebuilt. + * configure.in: Add dejagnu test framework. + * configure: Rebuilt. + + * testsuite/Makefile.am: New file. + * testsuite/Makefile.in: Built + * testsuite/lib/libffi-dg.exp: New file. + * testsuite/config/default.exp: Likewise. + * testsuite/libffi.call/call.exp: Likewise. + * testsuite/libffi.call/ffitest.h: Likewise. + * testsuite/libffi.call/closure_fn0.c: Likewise. + * testsuite/libffi.call/closure_fn1.c: Likewise. + * testsuite/libffi.call/closure_fn2.c: Likewise. + * testsuite/libffi.call/closure_fn3.c: Likewise. + * testsuite/libffi.call/cls_1_1byte.c: Likewise. + * testsuite/libffi.call/cls_3_1byte.c: Likewise. + * testsuite/libffi.call/cls_4_1byte.c: Likewise. + * testsuite/libffi.call/cls_2byte.c: Likewise. + * testsuite/libffi.call/cls_3byte1.c: Likewise. + * testsuite/libffi.call/cls_3byte2.c: Likewise. + * testsuite/libffi.call/cls_4byte.c: Likewise. + * testsuite/libffi.call/cls_5byte.c: Likewise. + * testsuite/libffi.call/cls_6byte.c: Likewise. + * testsuite/libffi.call/cls_7byte.c: Likewise. + * testsuite/libffi.call/cls_8byte.c: Likewise. + * testsuite/libffi.call/cls_12byte.c: Likewise. + * testsuite/libffi.call/cls_16byte.c: Likewise. + * testsuite/libffi.call/cls_20byte.c: Likewise. + * testsuite/libffi.call/cls_24byte.c: Likewise. + * testsuite/libffi.call/cls_double.c: Likewise. + * testsuite/libffi.call/cls_float.c: Likewise. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/float.c: Likewise. + * testsuite/libffi.call/float1.c: Likewise. + * testsuite/libffi.call/float2.c: Likewise. + * testsuite/libffi.call/many.c: Likewise. + * testsuite/libffi.call/many_win32.c: Likewise. + * testsuite/libffi.call/nested_struct.c: Likewise. + * testsuite/libffi.call/nested_struct1.c: Likewise. + * testsuite/libffi.call/pyobjc-tc.c: Likewise. + * testsuite/libffi.call/problem1.c: Likewise. + * testsuite/libffi.call/promotion.c: Likewise. + * testsuite/libffi.call/return_ll.c: Likewise. + * testsuite/libffi.call/return_sc.c: Likewise. + * testsuite/libffi.call/return_uc.c: Likewise. + * testsuite/libffi.call/strlen.c: Likewise. + * testsuite/libffi.call/strlen_win32.c: Likewise. + * testsuite/libffi.call/struct1.c: Likewise. + * testsuite/libffi.call/struct2.c: Likewise. + * testsuite/libffi.call/struct3.c: Likewise. + * testsuite/libffi.call/struct4.c: Likewise. + * testsuite/libffi.call/struct5.c: Likewise. + * testsuite/libffi.call/struct6.c: Likewise. + * testsuite/libffi.call/struct7.c: Likewise. + * testsuite/libffi.call/struct8.c: Likewise. + * testsuite/libffi.call/struct9.c: Likewise. + * testsuite/libffi.special/special.exp: New file. + * testsuite/libffi.special/ffitestcxx.h: Likewise. + * testsuite/libffi.special/unwindtest.cc: Likewise. + + +2003-08-13 Kaz Kojima + + * src/sh/ffi.c (OFS_INT16): Set 0 for little endian case. Update + copyright years. + +2003-08-02 Alan Modra + + * src/powerpc/ffi.c (ffi_prep_args64): Modify for changed gcc + structure passing. + (ffi_closure_helper_LINUX64): Likewise. + * src/powerpc/linux64.S: Remove code writing to parm save area. + * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Use return + address in lr from ffi_closure_helper_LINUX64 call to calculate + table address. Optimize function tail. + +2003-07-28 Andreas Tobler + + * src/sparc/ffi.c: Handle all floating point registers. + * src/sparc/v9.S: Likewise. Fixes second part of PR target/11410. + +2003-07-11 Gerald Pfeifer + + * README: Note that libffi is not part of GCC. Update the project + URL and status. + +2003-06-19 Franz Sirl + + * src/powerpc/ppc_closure.S: Include ffi.h. + +2003-06-13 Rainer Orth + + * src/x86/sysv.S: Avoid gas-only .uleb128/.sleb128 directives. + Use C style comments. + +2003-06-13 Kaz Kojima + + * Makefile.am: Add SHmedia support. Fix a typo of SH support. + * Makefile.in: Regenerate. + * configure.in (sh64-*-linux*, sh5*-*-linux*): Add target. + * configure: Regenerate. + * include/ffi.h.in: Add SHmedia support. + * src/sh64/ffi.c: New file. + * src/sh64/sysv.S: New file. + +2003-05-16 Jakub Jelinek + + * configure.in (HAVE_RO_EH_FRAME): Check whether .eh_frame section + should be read-only. + * configure: Rebuilt. + * fficonfig.h.in: Rebuilt. + * include/ffi.h.in (EH_FRAME_FLAGS): Define. + * src/alpha/osf.S: Use EH_FRAME_FLAGS. + * src/powerpc/linux64.S: Likewise. + * src/powerpc/linux64_closure.S: Likewise. Include ffi.h. + * src/powerpc/sysv.S: Use EH_FRAME_FLAGS. Use pcrel encoding + if -fpic/-fPIC/-mrelocatable. + * src/powerpc/powerpc_closure.S: Likewise. + * src/sparc/v8.S: If HAVE_RO_EH_FRAME is defined, don't include + #write in .eh_frame flags. + * src/sparc/v9.S: Likewise. + * src/x86/unix64.S: Use EH_FRAME_FLAGS. + * src/x86/sysv.S: Likewise. Use pcrel encoding if -fpic/-fPIC. + * src/s390/sysv.S: Use EH_FRAME_FLAGS. Include ffi.h. + +2003-05-07 Jeff Sturm + + Fixes PR bootstrap/10656 + * configure.in (HAVE_AS_REGISTER_PSEUDO_OP): Test assembler + support for .register pseudo-op. + * src/sparc/v8.S: Use it. + * fficonfig.h.in: Rebuilt. + * configure: Rebuilt. + +2003-04-18 Jakub Jelinek + + * include/ffi.h.in (POWERPC64): Define if 64-bit. + (enum ffi_abi): Add FFI_LINUX64 on POWERPC. + Make it the default on POWERPC64. + (FFI_TRAMPOLINE_SIZE): Define to 24 on POWERPC64. + * configure.in: Change powerpc-*-linux* into powerpc*-*-linux*. + * configure: Rebuilt. + * src/powerpc/ffi.c (hidden): Define. + (ffi_prep_args_SYSV): Renamed from + ffi_prep_args. Cast pointers to unsigned long to shut up warnings. + (NUM_GPR_ARG_REGISTERS64, NUM_FPR_ARG_REGISTERS64, + ASM_NEEDS_REGISTERS64): New. + (ffi_prep_args64): New function. + (ffi_prep_cif_machdep): Handle FFI_LINUX64 ABI. + (ffi_call): Likewise. + (ffi_prep_closure): Likewise. + (flush_icache): Surround by #ifndef POWERPC64. + (ffi_dblfl): New union type. + (ffi_closure_helper_SYSV): Use it to avoid aliasing problems. + (ffi_closure_helper_LINUX64): New function. + * src/powerpc/ppc_closure.S: Surround whole file by #ifndef + __powerpc64__. + * src/powerpc/sysv.S: Likewise. + (ffi_call_SYSV): Rename ffi_prep_args to ffi_prep_args_SYSV. + * src/powerpc/linux64.S: New file. + * src/powerpc/linux64_closure.S: New file. + * Makefile.am (EXTRA_DIST): Add src/powerpc/linux64.S and + src/powerpc/linux64_closure.S. + (TARGET_SRC_POWERPC): Likewise. + + * src/ffitest.c (closure_test_fn, closure_test_fn1, closure_test_fn2, + closure_test_fn3): Fix result printing on big-endian 64-bit + machines. + (main): Print tst2_arg instead of uninitialized tst2_result. + + * src/ffitest.c (main): Hide what closure pointer really points to + from the compiler. + +2003-04-16 Richard Earnshaw + + * configure.in (arm-*-netbsdelf*): Add configuration. + (configure): Regenerated. + +2003-04-04 Loren J. Rittle + + * include/Makefile.in: Regenerate. + +2003-03-21 Zdenek Dvorak + + * libffi/include/ffi.h.in: Define X86 instead of X86_64 in 32 + bit mode. + * libffi/src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): + Receive closure pointer through parameter, read args using + __builtin_dwarf_cfa. + (FFI_INIT_TRAMPOLINE): Send closure reference through eax. + +2003-03-12 Andreas Schwab + + * configure.in: Avoid trailing /. in toolexeclibdir. + * configure: Rebuilt. + +2003-03-03 Andreas Tobler + + * src/powerpc/darwin_closure.S: Recode to fit dynamic libraries. + +2003-02-06 Andreas Tobler + + * libffi/src/powerpc/darwin_closure.S: + Fix alignement bug, allocate 8 bytes for the result. + * libffi/src/powerpc/aix_closure.S: + Likewise. + * libffi/src/powerpc/ffi_darwin.c: + Update stackframe description for aix/darwin_closure.S. + +2003-02-06 Jakub Jelinek + + * src/s390/ffi.c (ffi_closure_helper_SYSV): Add hidden visibility + attribute. + +2003-01-31 Christian Cornelssen , + Andreas Schwab + + * configure.in: Adjust command to source config-ml.in to account + for changes to the libffi_basedir definition. + (libffi_basedir): Remove ${srcdir} from value and include trailing + slash if nonempty. + + * configure: Regenerate. + +2003-01-29 Franz Sirl + + * src/powerpc/ppc_closure.S: Recode to fit shared libs. + +2003-01-28 Andrew Haley + + * include/ffi.h.in: Enable FFI_CLOSURES for x86_64. + * src/x86/ffi64.c (ffi_prep_closure): New. + (ffi_closure_UNIX64_inner): New. + * src/x86/unix64.S (ffi_closure_UNIX64): New. + +2003-01-27 Alexandre Oliva + + * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. + Remove USE_LIBDIR conditional. + * Makefile.am (toolexecdir, toolexeclibdir): Don't override. + * Makefile.in, configure: Rebuilt. + +2003-01027 David Edelsohn + + * Makefile.am (TARGET_SRC_POWERPC_AIX): Fix typo. + * Makefile.in: Regenerate. + +2003-01-22 Andrew Haley + + * src/powerpc/darwin.S (_ffi_call_AIX): Add Augmentation size to + unwind info. + +2003-01-21 Andreas Tobler + + * src/powerpc/darwin.S: Add unwind info. + * src/powerpc/darwin_closure.S: Likewise. + +2003-01-14 Andrew Haley + + * src/x86/ffi64.c (ffi_prep_args): Check for void retval. + (ffi_prep_cif_machdep): Likewise. + * src/x86/unix64.S: Add unwind info. + +2003-01-14 Andreas Jaeger + + * src/ffitest.c (main): Only use ffi_closures if those are + supported. + +2003-01-13 Andreas Tobler + + * libffi/src/ffitest.c + add closure testcases + +2003-01-13 Kevin B. Hendricks + + * libffi/src/powerpc/ffi.c + fix alignment bug for float (4 byte aligned iso 8 byte) + +2003-01-09 Geoffrey Keating + + * src/powerpc/ffi_darwin.c: Remove RCS version string. + * src/powerpc/darwin.S: Remove RCS version string. + +2003-01-03 Jeff Sturm + + * include/ffi.h.in: Add closure defines for SPARC, SPARC64. + * src/ffitest.c (main): Use static storage for closure. + * src/sparc/ffi.c (ffi_prep_closure, ffi_closure_sparc_inner): New. + * src/sparc/v8.S (ffi_closure_v8): New. + * src/sparc/v9.S (ffi_closure_v9): New. + +2002-11-10 Ranjit Mathew + + * include/ffi.h.in: Added FFI_STDCALL ffi_type + enumeration for X86_WIN32. + * src/x86/win32.S: Added ffi_call_STDCALL function + definition. + * src/x86/ffi.c (ffi_call/ffi_raw_call): Added + switch cases for recognising FFI_STDCALL and + calling ffi_call_STDCALL if target is X86_WIN32. + * src/ffitest.c (my_stdcall_strlen/stdcall_many): + stdcall versions of the "my_strlen" and "many" + test functions (for X86_WIN32). + Added test cases to test stdcall invocation using + these functions. + +2002-12-02 Kaz Kojima + + * src/sh/sysv.S: Add DWARF2 unwind info. + +2002-11-27 Ulrich Weigand + + * src/s390/sysv.S (.eh_frame section): Make section read-only. + +2002-11-26 Jim Wilson + + * src/types.c (FFI_TYPE_POINTER): Has size 8 on IA64. + +2002-11-23 H.J. Lu + + * acinclude.m4: Add dummy AM_PROG_LIBTOOL. + Include ../config/accross.m4. + * aclocal.m4; Rebuild. + * configure: Likewise. + +2002-11-15 Ulrich Weigand + + * src/s390/sysv.S (.eh_frame section): Adapt to pcrel FDE encoding. + +2002-11-11 DJ Delorie + + * configure.in: Look for common files in the right place. + +2002-10-08 Ulrich Weigand + + * src/java_raw_api.c (ffi_java_raw_to_ptrarray): Interpret + raw data as _Jv_word values, not ffi_raw. + (ffi_java_ptrarray_to_raw): Likewise. + (ffi_java_rvalue_to_raw): New function. + (ffi_java_raw_call): Call it. + (ffi_java_raw_to_rvalue): New function. + (ffi_java_translate_args): Call it. + * src/ffitest.c (closure_test_fn): Interpret return value + as ffi_arg, not int. + * src/s390/ffi.c (ffi_prep_cif_machdep): Add missing + FFI_TYPE_POINTER case. + (ffi_closure_helper_SYSV): Likewise. Also, assume return + values extended to word size. + +2002-10-02 Andreas Jaeger + + * src/x86/ffi64.c (ffi_prep_cif_machdep): Remove debug output. + +2002-10-01 Bo Thorsen + + * include/ffi.h.in: Fix i386 win32 compilation. + +2002-09-30 Ulrich Weigand + + * configure.in: Add s390x-*-linux-* target. + * configure: Regenerate. + * include/ffi.h.in: Define S390X for s390x targets. + (FFI_CLOSURES): Define for s390/s390x. + (FFI_TRAMPOLINE_SIZE): Likewise. + (FFI_NATIVE_RAW_API): Likewise. + * src/prep_cif.c (ffi_prep_cif): Do not compute stack space for s390. + * src/types.c (FFI_TYPE_POINTER): Use 8-byte pointers on s390x. + * src/s390/ffi.c: Major rework of existing code. Add support for + s390x targets. Add closure support. + * src/s390/sysv.S: Likewise. + +2002-09-29 Richard Earnshaw + + * src/arm/sysv.S: Fix typo. + +2002-09-28 Richard Earnshaw + + * src/arm/sysv.S: If we don't have machine/asm.h and the pre-processor + has defined __USER_LABEL_PREFIX__, then use it in CNAME. + (ffi_call_SYSV): Handle soft-float. + +2002-09-27 Bo Thorsen + + * include/ffi.h.in: Fix multilib x86-64 support. + +2002-09-22 Kaveh R. Ghazi + + * Makefile.am (all-multi): Fix multilib parallel build. + +2002-07-19 Kaz Kojima + + * configure.in (sh[34]*-*-linux*): Add brackets. + * configure: Regenerate. + +2002-07-18 Kaz Kojima + + * Makefile.am: Add SH support. + * Makefile.in: Regenerate. + * configure.in (sh-*-linux*, sh[34]*-*-linux*): Add target. + * configure: Regenerate. + * include/ffi.h.in: Add SH support. + * src/sh/ffi.c: New file. + * src/sh/sysv.S: New file. + * src/types.c: Add SH support. + +2002-07-16 Bo Thorsen + + * src/x86/ffi64.c: New file that adds x86-64 support. + * src/x86/unix64.S: New file that handles argument setup for + x86-64. + * src/x86/sysv.S: Don't use this on x86-64. + * src/x86/ffi.c: Don't use this on x86-64. + Remove unused vars. + * src/prep_cif.c (ffi_prep_cif): Don't do stack size calculation + for x86-64. + * src/ffitest.c (struct6): New test that tests a special case in + the x86-64 ABI. + (struct7): Likewise. + (struct8): Likewise. + (struct9): Likewise. + (closure_test_fn): Silence warning about this when it's not used. + (main): Add the new tests. + (main): Fix a couple of wrong casts and silence some compiler warnings. + * include/ffi.h.in: Add x86-64 ABI definition. + * fficonfig.h.in: Regenerate. + * Makefile.am: Add x86-64 support. + * configure.in: Likewise. + * Makefile.in: Regenerate. + * configure: Likewise. + +2002-06-24 Bo Thorsen + + * src/types.c: Merge settings for similar architectures. + Add x86-64 sizes and alignments. + +2002-06-23 Bo Thorsen + + * src/arm/ffi.c (ffi_prep_args): Remove unused vars. + * src/sparc/ffi.c (ffi_prep_args_v8): Likewise. + * src/mips/ffi.c (ffi_prep_args): Likewise. + * src/m68k/ffi.c (ffi_prep_args): Likewise. + +2002-07-18 H.J. Lu (hjl@gnu.org) + + * Makefile.am (TARGET_SRC_MIPS_LINUX): New. + (libffi_la_SOURCES): Support MIPS_LINUX. + (libffi_convenience_la_SOURCES): Likewise. + * Makefile.in: Regenerated. + + * configure.in (mips64*-*): Skip. + (mips*-*-linux*): New. + * configure: Regenerated. + + * src/mips/ffi.c: Include . + +2002-06-06 Ulrich Weigand + + * src/s390/sysv.S: Save/restore %r6. Add DWARF-2 unwind info. + +2002-05-27 Roger Sayle + + * src/x86/ffi.c (ffi_prep_args): Remove reference to avn. + +2002-05-27 Bo Thorsen + + * src/x86/ffi.c (ffi_prep_args): Remove unused variable and + fix formatting. + +2002-05-13 Andreas Tobler + + * src/powerpc/ffi_darwin.c (ffi_prep_closure): Declare fd at + beginning of function (for older apple cc). + +2002-05-08 Alexandre Oliva + + * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at + script entry, and set LD to it when configuring multilibs. + * configure: Rebuilt. + +2002-05-05 Jason Thorpe + + * configure.in (sparc64-*-netbsd*): Add target. + (sparc-*-netbsdelf*): Likewise. + * configure: Regenerate. + +2002-04-28 David S. Miller + + * configure.in, configure: Fix SPARC test in previous change. + +2002-04-29 Gerhard Tonn + + * Makefile.am: Add Linux for S/390 support. + * Makefile.in: Regenerate. + * configure.in: Add Linux for S/390 support. + * configure: Regenerate. + * include/ffi.h.in: Add Linux for S/390 support. + * src/s390/ffi.c: New file from libffi CVS tree. + * src/s390/sysv.S: New file from libffi CVS tree. + +2002-04-28 Jakub Jelinek + + * configure.in (HAVE_AS_SPARC_UA_PCREL): Check for working + %r_disp32(). + * src/sparc/v8.S: Use it. + * src/sparc/v9.S: Likewise. + * fficonfig.h.in: Rebuilt. + * configure: Rebuilt. + +2002-04-08 Hans Boehm + + * src/java_raw_api.c (ffi_java_raw_size): Handle FFI_TYPE_DOUBLE + correctly. + * src/ia64/unix.S: Add unwind information. Fix comments. + Save sp in a way that's compatible with unwind info. + (ffi_call_unix): Correctly restore sp in all cases. + * src/ia64/ffi.c: Add, fix comments. + +2002-04-08 Jakub Jelinek + + * src/sparc/v8.S: Make .eh_frame dependent on target word size. + +2002-04-06 Jason Thorpe + + * configure.in (alpha*-*-netbsd*): Add target. + * configure: Regenerate. + +2002-04-04 Jeff Sturm + + * src/sparc/v8.S: Add unwind info. + * src/sparc/v9.S: Likewise. + +2002-03-30 Krister Walfridsson + + * configure.in: Enable i*86-*-netbsdelf*. + * configure: Rebuilt. + +2002-03-29 David Billinghurst + + PR other/2620 + * src/mips/n32.s: Delete + * src/mips/o32.s: Delete + +2002-03-21 Loren J. Rittle + + * configure.in: Enable alpha*-*-freebsd*. + * configure: Rebuilt. + +2002-03-17 Bryce McKinlay + + * Makefile.am: libfficonvenience -> libffi_convenience. + * Makefile.in: Rebuilt. + + * Makefile.am: Define ffitest_OBJECTS. + * Makefile.in: Rebuilt. + +2002-03-07 Andreas Tobler + David Edelsohn + + * Makefile.am (EXTRA_DIST): Add Darwin and AIX closure files. + (TARGET_SRC_POWERPC_AIX): Add aix_closure.S. + (TARGET_SRC_POWERPC_DARWIN): Add darwin_closure.S. + * Makefile.in: Regenerate. + * include/ffi.h.in: Add AIX and Darwin closure definitions. + * src/powerpc/ffi_darwin.c (ffi_prep_closure): New function. + (flush_icache, flush_range): New functions. + (ffi_closure_helper_DARWIN): New function. + * src/powerpc/aix_closure.S: New file. + * src/powerpc/darwin_closure.S: New file. + +2002-02-24 Jeff Sturm + + * include/ffi.h.in: Add typedef for ffi_arg. + * src/ffitest.c (main): Declare rint with ffi_arg. + +2002-02-21 Andreas Tobler + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate + number of GPRs for floating-point arguments. + +2002-01-31 Anthony Green + + * configure: Rebuilt. + * configure.in: Replace CHECK_SIZEOF and endian tests with + cross-compiler friendly macros. + * aclocal.m4 (AC_COMPILE_CHECK_SIZEOF, AC_C_BIGENDIAN_CROSS): New + macros. + +2002-01-18 David Edelsohn + + * src/powerpc/darwin.S (_ffi_call_AIX): New. + * src/powerpc/aix.S (ffi_call_DARWIN): New. + +2002-01-17 David Edelsohn + + * Makefile.am (EXTRA_DIST): Add Darwin and AIX files. + (TARGET_SRC_POWERPC_AIX): New. + (POWERPC_AIX): New stanza. + * Makefile.in: Regenerate. + * configure.in: Add AIX case. + * configure: Regenerate. + * include/ffi.h.in (ffi_abi): Add FFI_AIX. + * src/powerpc/ffi_darwin.c (ffi_status): Use "long" to scale frame + size. Fix "long double" support. + (ffi_call): Add FFI_AIX case. + * src/powerpc/aix.S: New. + +2001-10-09 John Hornkvist + + Implement Darwin PowerPC ABI. + * configure.in: Handle powerpc-*-darwin*. + * Makefile.am: Set source files for POWERPC_DARWIN. + * configure: Rebuilt. + * Makefile.in: Rebuilt. + * include/ffi.h.in: Define FFI_DARWIN and FFI_DEFAULT_ABI for + POWERPC_DARWIN. + * src/powerpc/darwin.S: New file. + * src/powerpc/ffi_darwin.c: New file. + +2001-10-07 Joseph S. Myers + + * src/x86/ffi.c: Fix spelling error of "separate" as "seperate". + +2001-07-16 Rainer Orth + + * src/x86/sysv.S: Avoid gas-only .balign directive. + Use C style comments. + +2001-07-16 Rainer Orth + + * src/alpha/ffi.c (ffi_prep_closure): Avoid gas-only mnemonic. + Fixes PR bootstrap/3563. + +2001-06-26 Rainer Orth + + * src/alpha/osf.S (ffi_closure_osf): Use .rdata for ECOFF. + +2001-06-25 Rainer Orth + + * configure.in: Recognize sparc*-sun-* host. + * configure: Regenerate. + +2001-06-06 Andrew Haley + + * src/alpha/osf.S (__FRAME_BEGIN__): Conditionalize for ELF. + +2001-06-03 Andrew Haley + + * src/alpha/osf.S: Add unwind info. + * src/powerpc/sysv.S: Add unwind info. + * src/powerpc/ppc_closure.S: Likewise. + +2000-05-31 Jeff Sturm + + * configure.in: Fix AC_ARG_ENABLE usage. + * configure: Rebuilt. + +2001-05-06 Bryce McKinlay + + * configure.in: Remove warning about beta code. + * configure: Rebuilt. + +2001-04-25 Hans Boehm + + * src/ia64/unix.S: Restore stack pointer when returning from + ffi_closure_UNIX. + * src/ia64/ffi.c: Fix typo in comment. + +2001-04-18 Jim Wilson + + * src/ia64/unix.S: Delete unnecessary increment and decrement of loc2 + to eliminate RAW DV. + +2001-04-12 Bryce McKinlay + + * Makefile.am: Make a libtool convenience library. + * Makefile.in: Rebuilt. + +2001-03-29 Bryce McKinlay + + * configure.in: Use different syntax for subdirectory creation. + * configure: Rebuilt. + +2001-03-27 Jon Beniston + + * configure.in: Added X86_WIN32 target (Win32, CygWin, MingW). + * configure: Rebuilt. + * Makefile.am: Added X86_WIN32 target support. + * Makefile.in: Rebuilt. + + * include/ffi.h.in: Added X86_WIN32 target support. + + * src/ffitest.c: Doesn't run structure tests for X86_WIN32 targets. + * src/types.c: Added X86_WIN32 target support. + + * src/x86/win32.S: New file. Based on sysv.S, but with EH + stuff removed and made to work with CygWin's gas. + +2001-03-26 Bryce McKinlay + + * configure.in: Make target subdirectory in build dir. + * Makefile.am: Override suffix based rules to specify correct output + subdirectory. + * Makefile.in: Rebuilt. + * configure: Rebuilt. + +2001-03-23 Kevin B Hendricks + + * src/powerpc/ppc_closure.S: New file. + * src/powerpc/ffi.c (ffi_prep_args): Fixed ABI compatibility bug + involving long long and register pairs. + (ffi_prep_closure): New function. + (flush_icache): Likewise. + (ffi_closure_helper_SYSV): Likewise. + * include/ffi.h.in (FFI_CLOSURES): Define on PPC. + (FFI_TRAMPOLINE_SIZE): Likewise. + (FFI_NATIVE_RAW_API): Likewise. + * Makefile.in: Rebuilt. + * Makefile.am (EXTRA_DIST): Added src/powerpc/ppc_closure.S. + (TARGET_SRC_POWERPC): Likewise. + +2001-03-19 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (ffitest_LDFLAGS): New macro. + +2001-03-02 Nick Clifton + + * include/ffi.h.in: Remove RCS ident string. + * include/ffi_mips.h: Remove RCS ident string. + * src/debug.c: Remove RCS ident string. + * src/ffitest.c: Remove RCS ident string. + * src/prep_cif.c: Remove RCS ident string. + * src/types.c: Remove RCS ident string. + * src/alpha/ffi.c: Remove RCS ident string. + * src/alpha/osf.S: Remove RCS ident string. + * src/arm/ffi.c: Remove RCS ident string. + * src/arm/sysv.S: Remove RCS ident string. + * src/mips/ffi.c: Remove RCS ident string. + * src/mips/n32.S: Remove RCS ident string. + * src/mips/o32.S: Remove RCS ident string. + * src/sparc/ffi.c: Remove RCS ident string. + * src/sparc/v8.S: Remove RCS ident string. + * src/sparc/v9.S: Remove RCS ident string. + * src/x86/ffi.c: Remove RCS ident string. + * src/x86/sysv.S: Remove RCS ident string. + +2001-02-08 Joseph S. Myers + + * include/ffi.h.in: Change sourceware.cygnus.com references to + gcc.gnu.org. + +2000-12-09 Richard Henderson + + * src/alpha/ffi.c (ffi_call): Simplify struct return test. + (ffi_closure_osf_inner): Index rather than increment avalue + and arg_types. Give ffi_closure_osf the raw return value type. + * src/alpha/osf.S (ffi_closure_osf): Handle return value type + promotion. + +2000-12-07 Richard Henderson + + * src/raw_api.c (ffi_translate_args): Fix typo. + (ffi_prep_closure): Likewise. + + * include/ffi.h.in [ALPHA]: Define FFI_CLOSURES and + FFI_TRAMPOLINE_SIZE. + * src/alpha/ffi.c (ffi_prep_cif_machdep): Adjust minimal + cif->bytes for new ffi_call_osf implementation. + (ffi_prep_args): Absorb into ... + (ffi_call): ... here. Do all stack allocation here and + avoid a callback function. + (ffi_prep_closure, ffi_closure_osf_inner): New. + * src/alpha/osf.S (ffi_call_osf): Reimplement with no callback. + (ffi_closure_osf): New. + +2000-09-10 Alexandre Oliva + + * config.guess, config.sub, install-sh: Removed. + * ltconfig, ltmain.sh, missing, mkinstalldirs: Likewise. + * Makefile.in: Rebuilt. + + * acinclude.m4: Include libtool macros from the top level. + * aclocal.m4, configure: Rebuilt. + +2000-08-22 Alexandre Oliva + + * configure.in [i*86-*-freebsd*] (TARGET, TARGETDIR): Set. + * configure: Rebuilt. + +2000-05-11 Scott Bambrough + + * libffi/src/arm/sysv.S (ffi_call_SYSV): Doubles are not saved to + memory correctly. Use conditional instructions, not branches where + possible. + +2000-05-04 Tom Tromey + + * configure: Rebuilt. + * configure.in: Match `arm*-*-linux-*'. + From Chris Dornan . + +2000-04-28 Jakub Jelinek + + * Makefile.am (SUBDIRS): Define. + (AM_MAKEFLAGS): Likewise. + (Multilib support.): Add section. + * Makefile.in: Rebuilt. + * ltconfig (extra_compiler_flags, extra_compiler_flags_value): + New variables. Set for gcc using -print-multi-lib. Export them + to libtool. + (sparc64-*-linux-gnu*): Use libsuff 64 for search paths. + * ltmain.sh (B|b|V): Don't throw away gcc's -B, -b and -V options + for -shared links. + (extra_compiler_flags_value, extra_compiler_flags): Check these + for extra compiler options which need to be passed down in + compiler_flags. + +2000-04-16 Anthony Green + + * configure: Rebuilt. + * configure.in: Change i*86-pc-linux* to i*86-*-linux*. + +2000-04-14 Jakub Jelinek + + * include/ffi.h.in (SPARC64): Define for 64bit SPARC builds. + Set SPARC FFI_DEFAULT_ABI based on SPARC64 define. + * src/sparc/ffi.c (ffi_prep_args_v8): Renamed from ffi_prep_args. + Replace all void * sizeofs with sizeof(int). + Only compare type with FFI_TYPE_LONGDOUBLE if LONGDOUBLE is + different than DOUBLE. + Remove FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases (handled elsewhere). + (ffi_prep_args_v9): New function. + (ffi_prep_cif_machdep): Handle V9 ABI and long long on V8. + (ffi_V9_return_struct): New function. + (ffi_call): Handle FFI_V9 ABI from 64bit code and FFI_V8 ABI from + 32bit code (not yet cross-arch calls). + * src/sparc/v8.S: Add struct return delay nop. + Handle long long. + * src/sparc/v9.S: New file. + * src/prep_cif.c (ffi_prep_cif): Return structure pointer + is used on sparc64 only for structures larger than 32 bytes. + Pass by reference for structures is done for structure arguments + larger than 16 bytes. + * src/ffitest.c (main): Use 64bit rint on sparc64. + Run long long tests on sparc. + * src/types.c (FFI_TYPE_POINTER): Pointer is 64bit on alpha and + sparc64. + (FFI_TYPE_LONGDOUBLE): long double is 128 bit aligned to 128 bits + on sparc64. + * configure.in (sparc-*-linux*): New supported target. + (sparc64-*-linux*): Likewise. + * configure: Rebuilt. + * Makefile.am: Add v9.S to SPARC files. + * Makefile.in: Likewise. + (LINK): Surround $(CCLD) into double quotes, so that multilib + compiles work correctly. + +2000-04-04 Alexandre Petit-Bianco + + * configure: Rebuilt. + * configure.in: (i*86-*-solaris*): New libffi target. Patch + proposed by Bryce McKinlay. + +2000-03-20 Tom Tromey + + * Makefile.in: Hand edit for java_raw_api.lo. + +2000-03-08 Bryce McKinlay + + * config.guess, config.sub: Update from the gcc tree. + Fix for PR libgcj/168. + +2000-03-03 Tom Tromey + + * Makefile.in: Fixed ia64 by hand. + + * configure: Rebuilt. + * configure.in (--enable-multilib): New option. + (libffi_basedir): New subst. + (AC_OUTPUT): Added multilib code. + +2000-03-02 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (TARGET_SRC_IA64): Use `ia64', not `alpha', as + directory name. + +2000-02-25 Hans Boehm + + * src/ia64/ffi.c, src/ia64/ia64_flags.h, src/ia64/unix.S: New + files. + * src/raw_api.c (ffi_translate_args): Fixed typo in argument + list. + (ffi_prep_raw_closure): Use ffi_translate_args, not + ffi_closure_translate. + * src/java_raw_api.c: New file. + * src/ffitest.c (closure_test_fn): New function. + (main): Define `rint' as long long on IA64. Added new test when + FFI_CLOSURES is defined. + * include/ffi.h.in (ALIGN): Use size_t, not unsigned. + (ffi_abi): Recognize IA64. + (ffi_raw): Added `flt' field. + Added "Java raw API" code. + * configure.in: Recognize ia64. + * Makefile.am (TARGET_SRC_IA64): New macro. + (libffi_la_common_SOURCES): Added java_raw_api.c. + (libffi_la_SOURCES): Define in IA64 case. + +2000-01-04 Tom Tromey + + * Makefile.in: Rebuilt with newer automake. + +1999-12-31 Tom Tromey + + * Makefile.am (INCLUDES): Added -I$(top_srcdir)/src. + +1999-09-01 Tom Tromey + + * include/ffi.h.in: Removed PACKAGE and VERSION defines and + undefs. + * fficonfig.h.in: Rebuilt. + * configure: Rebuilt. + * configure.in: Pass 3rd argument to AM_INIT_AUTOMAKE. + Use AM_PROG_LIBTOOL (automake 1.4 compatibility). + * acconfig.h: Don't #undef PACKAGE or VERSION. + +1999-08-09 Anthony Green + + * include/ffi.h.in: Try to work around messy header problem + with PACKAGE and VERSION. + + * configure: Rebuilt. + * configure.in: Change version to 2.00-beta. + + * fficonfig.h.in: Rebuilt. + * acconfig.h (FFI_NO_STRUCTS, FFI_NO_RAW_API): Define. + + * src/x86/ffi.c (ffi_raw_call): Rename. + +1999-08-02 Kresten Krab Thorup + + * src/x86/ffi.c (ffi_closure_SYSV): New function. + (ffi_prep_incoming_args_SYSV): Ditto. + (ffi_prep_closure): Ditto. + (ffi_closure_raw_SYSV): Ditto. + (ffi_prep_raw_closure): More ditto. + (ffi_call_raw): Final ditto. + + * include/ffi.h.in: Add definitions for closure and raw API. + + * src/x86/ffi.c (ffi_prep_cif_machdep): Added case for + FFI_TYPE_UINT64. + + * Makefile.am (libffi_la_common_SOURCES): Added raw_api.c + + * src/raw_api.c: New file. + + * include/ffi.h.in (ffi_raw): New type. + (UINT_ARG, SINT_ARG): New defines. + (ffi_closure, ffi_raw_closure): New types. + (ffi_prep_closure, ffi_prep_raw_closure): New declarations. + + * configure.in: Add check for endianness and sizeof void*. + + * src/x86/sysv.S (ffi_call_SYSV): Call fixup routine via argument, + instead of directly. + + * configure: Rebuilt. + +Thu Jul 8 14:28:42 1999 Anthony Green + + * configure.in: Add x86 and powerpc BeOS configurations. + From Makoto Kato . + +1999-05-09 Anthony Green + + * configure.in: Add warning about this being beta code. + Remove src/Makefile.am from the picture. + * configure: Rebuilt. + + * Makefile.am: Move logic from src/Makefile.am. Add changes + to support libffi as a target library. + * Makefile.in: Rebuilt. + + * aclocal.m4, config.guess, config.sub, ltconfig, ltmain.sh: + Upgraded to new autoconf, automake, libtool. + + * README: Tweaks. + + * LICENSE: Update copyright date. + + * src/Makefile.am, src/Makefile.in: Removed. + +1998-11-29 Anthony Green + + * include/ChangeLog: Removed. + * src/ChangeLog: Removed. + * src/mips/ChangeLog: Removed. + * src/sparc/ChangeLog: Remboved. + * src/x86/ChangeLog: Removed. + + * ChangeLog.v1: Created. diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libffi b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libffi new file mode 100644 index 0000000..f3ee8b0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libffi @@ -0,0 +1,584 @@ +2011-02-08 Andreas Tobler + + * testsuite/lib/libffi.exp: Tweak for stand-alone mode. + +2009-12-25 Samuli Suominen + + * configure.ac: Undefine _AC_ARG_VAR_PRECIOUS for autoconf 2.64. + * configure: Rebuilt. + * fficonfig.h.in: Rebuilt. + +2009-06-16 Andrew Haley + + * testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_medium2.c: Fix printf format + specifiers. + * testsuite/libffi.call/huge_struct.c: Ad x86 XFAILs. + * testsuite/libffi.call/float2.c: Fix dg-excess-errors. + * testsuite/libffi.call/ffitest.h, + testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. + +2009-06-12 Andrew Haley + + * testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_medium2.c: Fix printf format + specifiers. + testsuite/libffi.special/unwindtest.cc: include stdint.h. + +2009-06-11 Timothy Wall + + * Makefile.am, + configure.ac, + include/ffi.h.in, + include/ffi_common.h, + src/closures.c, + src/dlmalloc.c, + src/x86/ffi.c, + src/x86/ffitarget.h, + src/x86/win64.S (new), + README: Added win64 support (mingw or MSVC) + * Makefile.in, + include/Makefile.in, + man/Makefile.in, + testsuite/Makefile.in, + configure, + aclocal.m4: Regenerated + * ltcf-c.sh: properly escape cygwin/w32 path + * man/ffi_call.3: Clarify size requirements for return value. + * src/x86/ffi64.c: Fix filename in comment. + * src/x86/win32.S: Remove unused extern. + + * testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/closure_stdcall.c, + testsuite/libffi.call/cls_12byte.c, + testsuite/libffi.call/cls_16byte.c, + testsuite/libffi.call/cls_18byte.c, + testsuite/libffi.call/cls_19byte.c, + testsuite/libffi.call/cls_1_1byte.c, + testsuite/libffi.call/cls_20byte.c, + testsuite/libffi.call/cls_20byte1.c, + testsuite/libffi.call/cls_24byte.c, + testsuite/libffi.call/cls_2byte.c, + testsuite/libffi.call/cls_3_1byte.c, + testsuite/libffi.call/cls_3byte1.c, + testsuite/libffi.call/cls_3byte2.c, + testsuite/libffi.call/cls_4_1byte.c, + testsuite/libffi.call/cls_4byte.c, + testsuite/libffi.call/cls_5_1_byte.c, + testsuite/libffi.call/cls_5byte.c, + testsuite/libffi.call/cls_64byte.c, + testsuite/libffi.call/cls_6_1_byte.c, + testsuite/libffi.call/cls_6byte.c, + testsuite/libffi.call/cls_7_1_byte.c, + testsuite/libffi.call/cls_7byte.c, + testsuite/libffi.call/cls_8byte.c, + testsuite/libffi.call/cls_9byte1.c, + testsuite/libffi.call/cls_9byte2.c, + testsuite/libffi.call/cls_align_double.c, + testsuite/libffi.call/cls_align_float.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_align_longdouble_split.c, + testsuite/libffi.call/cls_align_longdouble_split2.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_align_sint16.c, + testsuite/libffi.call/cls_align_sint32.c, + testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint16.c, + testsuite/libffi.call/cls_align_uint32.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_dbls_struct.c, + testsuite/libffi.call/cls_double.c, + testsuite/libffi.call/cls_double_va.c, + testsuite/libffi.call/cls_float.c, + testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_multi_schar.c, + testsuite/libffi.call/cls_multi_sshort.c, + testsuite/libffi.call/cls_multi_sshortchar.c, + testsuite/libffi.call/cls_multi_uchar.c, + testsuite/libffi.call/cls_multi_ushort.c, + testsuite/libffi.call/cls_multi_ushortchar.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c, + testsuite/libffi.call/cls_schar.c, + testsuite/libffi.call/cls_sint.c, + testsuite/libffi.call/cls_sshort.c, + testsuite/libffi.call/cls_uchar.c, + testsuite/libffi.call/cls_uint.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/cls_ushort.c, + testsuite/libffi.call/err_bad_abi.c, + testsuite/libffi.call/err_bad_typedef.c, + testsuite/libffi.call/float2.c, + testsuite/libffi.call/huge_struct.c, + testsuite/libffi.call/nested_struct.c, + testsuite/libffi.call/nested_struct1.c, + testsuite/libffi.call/nested_struct10.c, + testsuite/libffi.call/nested_struct2.c, + testsuite/libffi.call/nested_struct3.c, + testsuite/libffi.call/nested_struct4.c, + testsuite/libffi.call/nested_struct5.c, + testsuite/libffi.call/nested_struct6.c, + testsuite/libffi.call/nested_struct7.c, + testsuite/libffi.call/nested_struct8.c, + testsuite/libffi.call/nested_struct9.c, + testsuite/libffi.call/problem1.c, + testsuite/libffi.call/return_ldl.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_large.c, + testsuite/libffi.call/stret_large2.c, + testsuite/libffi.call/stret_medium.c, + testsuite/libffi.call/stret_medium2.c, + testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead + of checking for MMAP. Use intptr_t instead of long casts. + +2009-06-04 Andrew Haley + + * src/powerpc/ffitarget.h: Fix misapplied merge from gcc. + +2009-06-04 Andrew Haley + + * src/mips/o32.S, + src/mips/n32.S: Fix licence formatting. + +2009-06-04 Andrew Haley + + * src/x86/darwin.S: Fix licence formatting. + src/x86/win32.S: Likewise. + src/sh64/sysv.S: Likewise. + src/sh/sysv.S: Likewise. + +2009-06-04 Andrew Haley + + * src/sh64/ffi.c: Remove lint directives. Was missing from merge + of Andreas Tobler's patch from 2006-04-22. + +2009-06-04 Andrew Haley + + * src/sh/ffi.c: Apply missing hunk from Alexandre Oliva's patch of + 2007-03-07. + +2008-12-26 Timothy Wall + + * testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_align_longdouble_split.c, + testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected + failures on x86_64 cygwin/mingw. + +2008-12-22 Timothy Wall + + * testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/closure_loc_fn0.c, + testsuite/libffi.call/closure_stdcall.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c: use portable cast from + pointer to integer (intptr_t). + * testsuite/libffi.call/cls_longdouble.c: disable for win64. + +2008-12-19 Anthony Green + + * configure.ac: Bump version to 3.0.8. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-11-11 Anthony Green + + * configure.ac: Bump version to 3.0.7. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-08-25 Andreas Tobler + + * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and + FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. + Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. + Adjust copyright notice. + * src/powerpc/ffi.c: Add two new flags to indicate if we have one + register or two register to use for FFI_SYSV structs. + (ffi_prep_cif_machdep): Pass the right register flag introduced above. + (ffi_closure_helper_SYSV): Fix the return type for + FFI_SYSV_TYPE_SMALL_STRUCT. Comment. + Adjust copyright notice. + +2008-07-24 Anthony Green + + * testsuite/libffi.call/cls_dbls_struct.c, + testsuite/libffi.call/cls_double_va.c, + testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c, + testsuite/libffi.call/err_bad_abi.c: Clean up failures from + compiler warnings. + +2008-07-17 Anthony Green + + * configure.ac: Bump version to 3.0.6. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. Add documentation. + * README: Update for new release. + +2008-07-16 Kaz Kojima + + * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned + int. + +2008-07-16 Kaz Kojima + + * src/sh/sysv.S: Add .note.GNU-stack on Linux. + * src/sh64/sysv.S: Likewise. + +2008-04-03 Anthony Green + + * libffi.pc.in (Libs): Add -L${libdir}. + * configure.ac: Bump version to 3.0.5. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-04-03 Anthony Green + Xerces Ranby + + * include/ffi.h.in: Wrap definition of target architecture to + protect from double definitions. + +2008-03-22 Moriyoshi Koizumi + + * src/x86/ffi.c (ffi_prep_closure_loc): Fix for bug revealed in + closure_loc_fn0.c. + * testsuite/libffi.call/closure_loc_fn0.c (closure_loc_test_fn0): + New test. + +2008-03-04 Anthony Green + Blake Chaffin + hos@tamanegi.org + + * testsuite/libffi.call/cls_align_longdouble_split2.c + testsuite/libffi.call/cls_align_longdouble_split.c + testsuite/libffi.call/cls_dbls_struct.c + testsuite/libffi.call/cls_double_va.c + testsuite/libffi.call/cls_longdouble.c + testsuite/libffi.call/cls_longdouble_va.c + testsuite/libffi.call/cls_pointer.c + testsuite/libffi.call/cls_pointer_stack.c + testsuite/libffi.call/err_bad_abi.c + testsuite/libffi.call/err_bad_typedef.c + testsuite/libffi.call/huge_struct.c + testsuite/libffi.call/stret_large2.c + testsuite/libffi.call/stret_large.c + testsuite/libffi.call/stret_medium2.c + testsuite/libffi.call/stret_medium.c: New tests from Apple. + +2008-02-26 Jakub Jelinek + Anthony Green + + * src/alpha/osf.S: Add .note.GNU-stack on Linux. + * src/s390/sysv.S: Likewise. + * src/powerpc/linux64.S: Likewise. + * src/powerpc/linux64_closure.S: Likewise. + * src/powerpc/ppc_closure.S: Likewise. + * src/powerpc/sysv.S: Likewise. + * src/x86/unix64.S: Likewise. + * src/x86/sysv.S: Likewise. + * src/sparc/v8.S: Likewise. + * src/sparc/v9.S: Likewise. + * src/m68k/sysv.S: Likewise. + * src/ia64/unix.S: Likewise. + * src/arm/sysv.S: Likewise. + +2008-02-26 Anthony Green + Thomas Heller + + * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C + comment. + +2008-02-26 Anthony Green + Thomas Heller + + * include/ffi.h.in: Change void (*)() to void (*)(void). + +2008-02-26 Anthony Green + Thomas Heller + + * src/alpha/ffi.c: Change void (*)() to void (*)(void). + src/alpha/osf.S, src/arm/ffi.c, src/frv/ffi.c, src/ia64/ffi.c, + src/ia64/unix.S, src/java_raw_api.c, src/m32r/ffi.c, + src/mips/ffi.c, src/pa/ffi.c, src/pa/hpux32.S, src/pa/linux.S, + src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/raw_api.c, + src/s390/ffi.c, src/sh/ffi.c, src/sh64/ffi.c, src/sparc/ffi.c, + src/x86/ffi.c, src/x86/unix64.S, src/x86/darwin64.S, + src/x86/ffi64.c: Ditto. + +2008-02-24 Anthony Green + + * configure.ac: Accept openbsd*, not just openbsd. + Bump version to 3.0.4. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-02-22 Anthony Green + + * README: Clean up list of tested platforms. + +2008-02-22 Anthony Green + + * configure.ac: Bump version to 3.0.3. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. Clean up test docs. + +2008-02-22 Bjoern Koenig + Andreas Tobler + + * configure.ac: Add amd64-*-freebsd* target. + * configure: Regenerate. + +2008-02-22 Thomas Heller + + * configure.ac: Add x86 OpenBSD support. + * configure: Rebuilt. + +2008-02-21 Thomas Heller + + * README: Change "make test" to "make check". + +2008-02-21 Anthony Green + + * configure.ac: Bump version to 3.0.2. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-02-21 Björn König + + * src/x86/freebsd.S: New file. + * configure.ac: Add x86 FreeBSD support. + * Makefile.am: Ditto. + +2008-02-15 Anthony Green + + * configure.ac: Bump version to 3.0.1. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-02-15 David Daney + + * src/mips/ffi.c: Remove extra '>' from include directive. + (ffi_prep_closure_loc): Use clear_location instead of tramp. + +2008-02-15 Anthony Green + + * configure.ac: Bump version to 3.0.0. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + +2008-02-15 David Daney + + * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): + Define (conditionally), and use it to include cachectl.h. + (ffi_prep_closure_loc): Fix cache flushing. + * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. + +2008-02-15 Anthony Green + + * man/ffi_call.3, man/ffi_prep_cif.3, man/ffi.3: + Update dates and remove all references to ffi_prep_closure. + * configure.ac: Bump version to 2.99.9. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + +2008-02-15 Anthony Green + + * man/ffi_prep_closure.3: Delete. + * man/Makefile.am (EXTRA_DIST): Remove ffi_prep_closure.3. + (man_MANS): Ditto. + * man/Makefile.in: Rebuilt. + * configure.ac: Bump version to 2.99.8. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + +2008-02-14 Anthony Green + + * configure.ac: Bump version to 2.99.7. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * include/ffi.h.in LICENSE src/debug.c src/closures.c + src/ffitest.c src/s390/sysv.S src/s390/ffitarget.h + src/types.c src/m68k/ffitarget.h src/raw_api.c src/frv/ffi.c + src/frv/ffitarget.h src/sh/ffi.c src/sh/sysv.S + src/sh/ffitarget.h src/powerpc/ffitarget.h src/pa/ffi.c + src/pa/ffitarget.h src/pa/linux.S src/java_raw_api.c + src/cris/ffitarget.h src/x86/ffi.c src/x86/sysv.S + src/x86/unix64.S src/x86/win32.S src/x86/ffitarget.h + src/x86/ffi64.c src/x86/darwin.S src/ia64/ffi.c + src/ia64/ffitarget.h src/ia64/ia64_flags.h src/ia64/unix.S + src/sparc/ffi.c src/sparc/v9.S src/sparc/ffitarget.h + src/sparc/v8.S src/alpha/ffi.c src/alpha/ffitarget.h + src/alpha/osf.S src/sh64/ffi.c src/sh64/sysv.S + src/sh64/ffitarget.h src/mips/ffi.c src/mips/ffitarget.h + src/mips/n32.S src/mips/o32.S src/arm/ffi.c src/arm/sysv.S + src/arm/ffitarget.h src/prep_cif.c: Update license text. + +2008-02-14 Anthony Green + + * README: Update tested platforms. + * configure.ac: Bump version to 2.99.6. + * configure: Rebuilt. + +2008-02-14 Anthony Green + + * configure.ac: Bump version to 2.99.5. + * configure: Rebuilt. + * Makefile.am (EXTRA_DIST): Add darwin64.S + * Makefile.in: Rebuilt. + * testsuite/lib/libffi-dg.exp: Remove libstdc++ bits from GCC tree. + * LICENSE: Update WARRANTY. + +2008-02-14 Anthony Green + + * libffi.pc.in (libdir): Fix libdir definition. + * configure.ac: Bump version to 2.99.4. + * configure: Rebuilt. + +2008-02-14 Anthony Green + + * README: Update. + * libffi.info: New file. + * doc/stamp-vti: New file. + * configure.ac: Bump version to 2.99.3. + * configure: Rebuilt. + +2008-02-14 Anthony Green + + * Makefile.am (SUBDIRS): Add man dir. + * Makefile.in: Rebuilt. + * configure.ac: Create Makefile. + * configure: Rebuilt. + * man/ffi_call.3 man/ffi_prep_cif.3 man/ffi_prep_closure.3 + man/Makefile.am man/Makefile.in: New files. + +2008-02-14 Tom Tromey + + * aclocal.m4, Makefile.in, configure, fficonfig.h.in: Rebuilt. + * mdate-sh, texinfo.tex: New files. + * Makefile.am (info_TEXINFOS): New variable. + * doc/libffi.texi: New file. + * doc/version.texi: Likewise. + +2008-02-14 Anthony Green + + * Makefile.am (AM_CFLAGS): Don't compile with -D$(TARGET). + (lib_LTLIBRARIES): Define. + (toolexeclib_LIBRARIES): Undefine. + * Makefile.in: Rebuilt. + * configure.ac: Reset version to 2.99.1. + * configure.in: Rebuilt. + +2008-02-14 Anthony Green + + * libffi.pc.in: Use @PACKAGE_NAME@ and @PACKAGE_VERSION@. + * configure.ac: Reset version to 2.99.1. + * configure.in: Rebuilt. + * Makefile.am (EXTRA_DIST): Add ChangeLog.libffi. + * Makefile.in: Rebuilt. + * LICENSE: Update copyright notice. + +2008-02-14 Anthony Green + + * include/Makefile.am (nodist_includes_HEADERS): Define. Don't + distribute ffitarget.h or ffi.h from the build include dir. + * Makefile.in: Rebuilt. + +2008-02-14 Anthony Green + + * include/Makefile.am (includesdir): Install headers under libdir. + (pkgconfigdir): Define. Install libffi.pc. + * include/Makefile.in: Rebuilt. + * libffi.pc.in: Create. + * libtool-version: Increment CURRENT + * configure.ac: Add libffi.pc.in + * configure: Rebuilt. + +2008-02-03 Anthony Green + + * include/Makefile.am (includesdir): Fix header install with + DESTDIR. + * include/Makefile.in: Rebuilt. + +2008-02-03 Timothy Wall + + * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return + offset based on code pointer, not data pointer. + +2008-02-01 Anthony Green + + * include/Makefile.am: Fix header installs. + * Makefile.am: Ditto. + * include/Makefile.in: Rebuilt. + * Makefile.in: Ditto. + +2008-02-01 Anthony Green + + * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL, + FFI_INIT_TRAMPOLINE): Revert my broken changes to twall's last + patch. + +2008-01-31 Anthony Green + + * Makefile.am (EXTRA_DIST): Add missing files. + * testsuite/Makefile.am: Ditto. + * Makefile.in, testsuite/Makefile.in: Rebuilt. + +2008-01-31 Timothy Wall + + * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall + closures. + * src/x86/ffitarget.h: Increase size of trampoline for stdcall + closures. + * src/x86/win32.S: Add assembly for stdcall closure. + * src/x86/ffi.c: Initialize stdcall closure trampoline. + +2008-01-30 H.J. Lu + + PR libffi/34612 + * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when + returning struct. + + * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" + tests. + +2008-01-30 Anthony Green + + * Makefile.am, include/Makefile.am: Move headers to + libffi_la_SOURCES for new automake. + * Makefile.in, include/Makefile.in: Rebuilt. + + * testsuite/lib/wrapper.exp: Copied from gcc tree to allow for + execution outside of gcc tree. + * testsuite/lib/target-libpath.exp: Ditto. + + * testsuite/lib/libffi-dg.exp: Many changes to allow for execution + outside of gcc tree. + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libgcj b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libgcj new file mode 100644 index 0000000..ea5d02f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libgcj @@ -0,0 +1,40 @@ +2004-01-14 Kelley Cook + + * configure.in: Add in AC_PREREQ(2.13) + +2003-02-20 Alexandre Oliva + + * configure.in: Propagate ORIGINAL_LD_FOR_MULTILIBS to + config.status. + * configure: Rebuilt. + +2002-01-27 Alexandre Oliva + + * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. + Remove USE_LIBDIR conditional. + * Makefile.am (toolexecdir, toolexeclibdir): Don't override. + * Makefile.in, configure: Rebuilt. + +Mon Aug 9 18:33:38 1999 Rainer Orth + + * include/Makefile.in: Rebuilt. + * Makefile.in: Rebuilt + * Makefile.am (toolexeclibdir): Add $(MULTISUBDIR) even for native + builds. + Use USE_LIBDIR. + + * configure: Rebuilt. + * configure.in (USE_LIBDIR): Define for native builds. + Use lowercase in configure --help explanations. + +1999-08-08 Anthony Green + + * include/ffi.h.in (FFI_FN): Remove `...'. + +1999-08-08 Anthony Green + + * Makefile.in: Rebuilt. + * Makefile.am (AM_CFLAGS): Compile with -fexceptions. + + * src/x86/sysv.S: Add exception handling metadata. + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.v1 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.v1 new file mode 100644 index 0000000..369820c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.v1 @@ -0,0 +1,764 @@ +The libffi version 1 ChangeLog archive. + +Version 1 of libffi had per-directory ChangeLogs. Current and future +versions have a single ChangeLog file in the root directory. The +version 1 ChangeLogs have all been concatonated into this file for +future reference only. + +--- libffi ---------------------------------------------------------------- + +Mon Oct 5 02:17:50 1998 Anthony Green + + * configure.in: Boosted rev. + * configure, Makefile.in, aclocal.m4: Rebuilt. + * README: Boosted rev and updated release notes. + +Mon Oct 5 01:03:03 1998 Anthony Green + + * configure.in: Boosted rev. + * configure, Makefile.in, aclocal.m4: Rebuilt. + * README: Boosted rev and updated release notes. + +1998-07-25 Andreas Schwab + + * m68k/ffi.c (ffi_prep_cif_machdep): Use bitmask for cif->flags. + Correctly handle small structures. + (ffi_prep_args): Also handle small structures. + (ffi_call): Pass size of return type to ffi_call_SYSV. + * m68k/sysv.S: Adjust for above changes. Correctly align small + structures in the return value. + + * types.c (uint64, sint64) [M68K]: Change alignment to 4. + +Fri Apr 17 17:26:58 1998 Anthony Green + + * configure.in: Boosted rev. + * configure,Makefile.in,aclocal.m4: Rebuilt. + * README: Boosted rev and added release notes. + +Sun Feb 22 00:50:41 1998 Geoff Keating + + * configure.in: Add PowerPC config bits. + +1998-02-14 Andreas Schwab + + * configure.in: Add m68k config bits. Change AC_CANONICAL_SYSTEM + to AC_CANONICAL_HOST, this is not a compiler. Use $host instead + of $target. Remove AC_CHECK_SIZEOF(char), we already know the + result. Fix argument of AC_ARG_ENABLE. + * configure, fficonfig.h.in: Rebuilt. + +Tue Feb 10 20:53:40 1998 Richard Henderson + + * configure.in: Add Alpha config bits. + +Tue May 13 13:39:20 1997 Anthony Green + + * README: Updated dates and reworded Irix comments. + + * configure.in: Removed AC_PROG_RANLIB. + + * Makefile.in, aclocal.m4, config.guess, config.sub, configure, + ltmain.sh, */Makefile.in: libtoolized again and rebuilt with + automake and autoconf. + +Sat May 10 18:44:50 1997 Tom Tromey + + * configure, aclocal.m4: Rebuilt. + * configure.in: Don't compute EXTRADIST; now handled in + src/Makefile.in. Removed macros implied by AM_INIT_AUTOMAKE. + Don't run AM_MAINTAINER_MODE. + +Thu May 8 14:34:05 1997 Anthony Green + + * missing, ltmain.sh, ltconfig.sh: Created. These are new files + required by automake and libtool. + + * README: Boosted rev to 1.14. Added notes. + + * acconfig.h: Moved PACKAGE and VERSION for new automake. + + * configure.in: Changes for libtool. + + * Makefile.am (check): make test now make check. Uses libtool now. + + * Makefile.in, configure.in, aclocal.h, fficonfig.h.in: Rebuilt. + +Thu May 1 16:27:07 1997 Anthony Green + + * missing: Added file required by new automake. + +Tue Nov 26 14:10:42 1996 Anthony Green + + * acconfig.h: Added USING_PURIFY flag. This is defined when + --enable-purify-safety was used at configure time. + + * configure.in (allsources): Added --enable-purify-safety switch. + (VERSION): Boosted rev to 1.13. + * configure: Rebuilt. + +Fri Nov 22 06:46:12 1996 Anthony Green + + * configure.in (VERSION): Boosted rev to 1.12. + Removed special CFLAGS hack for gcc. + * configure: Rebuilt. + + * README: Boosted rev to 1.12. Added notes. + + * Many files: Cygnus Support changed to Cygnus Solutions. + +Wed Oct 30 11:15:25 1996 Anthony Green + + * configure.in (VERSION): Boosted rev to 1.11. + * configure: Rebuilt. + + * README: Boosted rev to 1.11. Added notes about GNU make. + +Tue Oct 29 12:25:12 1996 Anthony Green + + * configure.in: Fixed -Wall trick. + (VERSION): Boosted rev. + * configure: Rebuilt + + * acconfig.h: Needed for --enable-debug configure switch. + + * README: Boosted rev to 1.09. Added more notes on building + libffi, and LCLint. + + * configure.in: Added --enable-debug switch. Boosted rev to + 1.09. + * configure: Rebuilt + +Tue Oct 15 13:11:28 1996 Anthony Green + + * configure.in (VERSION): Boosted rev to 1.08 + * configure: Rebuilt. + + * README: Added n32 bug fix notes. + + * Makefile.am: Added "make lint" production. + * Makefile.in: Rebuilt. + +Mon Oct 14 10:54:46 1996 Anthony Green + + * README: Added web page reference. + + * configure.in, README: Boosted rev to 1.05 + * configure: Rebuilt. + + * README: Fixed n32 sample code. + +Fri Oct 11 17:09:28 1996 Anthony Green + + * README: Added sparc notes. + + * configure.in, README: Boosted rev to 1.04. + * configure: Rebuilt. + +Thu Oct 10 10:31:03 1996 Anthony Green + + * configure.in, README: Boosted rev to 1.03. + * configure: Rebuilt. + + * README: Added struct notes. + + * Makefile.am (EXTRA_DIST): Added LICENSE to distribution. + * Makefile.in: Rebuilt. + + * README: Removed Linux section. No special notes now + because aggregates arg/return types work. + +Wed Oct 9 16:16:42 1996 Anthony Green + + * README, configure.in (VERSION): Boosted rev to 1.02 + * configure: Rebuilt. + +Tue Oct 8 11:56:33 1996 Anthony Green + + * README (NOTE): Added n32 notes. + + * Makefile.am: Added test production. + * Makefile: Rebuilt + + * README: spell checked! + + * configure.in (VERSION): Boosted rev to 1.01 + * configure: Rebuilt. + +Mon Oct 7 15:50:22 1996 Anthony Green + + * configure.in: Added nasty bit to support SGI tools. + * configure: Rebuilt. + + * README: Added SGI notes. Added note about automake bug. + +Mon Oct 7 11:00:28 1996 Anthony Green + + * README: Rewrote intro, and fixed examples. + +Fri Oct 4 10:19:55 1996 Anthony Green + + * configure.in: -D$TARGET is no longer used as a compiler switch. + It is now inserted into ffi.h at configure time. + * configure: Rebuilt. + + * FFI_ABI and FFI_STATUS are now ffi_abi and ffi_status. + +Thu Oct 3 13:47:34 1996 Anthony Green + + * README, LICENSE: Created. Wrote some docs. + + * configure.in: Don't barf on i586-unknown-linuxaout. + Added EXTRADIST code for "make dist". + * configure: Rebuilt. + + * */Makefile.in: Rebuilt with patched automake. + +Tue Oct 1 17:12:25 1996 Anthony Green + + * Makefile.am, aclocal.m4, config.guess, config.sub, + configure.in, fficonfig.h.in, install-sh, mkinstalldirs, + stamp-h.in: Created + * Makefile.in, configure: Generated + +--- libffi/include -------------------------------------------------------- + +Tue Feb 24 13:09:36 1998 Anthony Green + + * ffi_mips.h: Updated FFI_TYPE_STRUCT_* values based on + ffi.h.in changes. This is a work-around for SGI's "simple" + assembler. + +Sun Feb 22 00:51:55 1998 Geoff Keating + + * ffi.h.in: PowerPC support. + +1998-02-14 Andreas Schwab + + * ffi.h.in: Add m68k support. + (FFI_TYPE_LONGDOUBLE): Make it a separate value. + +Tue Feb 10 20:55:16 1998 Richard Henderson + + * ffi.h.in (SIZEOF_ARG): Use a pointer type by default. + + * ffi.h.in: Alpha support. + +Fri Nov 22 06:48:45 1996 Anthony Green + + * ffi.h.in, ffi_common.h: Cygnus Support -> Cygnus Solutions. + +Wed Nov 20 22:31:01 1996 Anthony Green + + * ffi.h.in: Added ffi_type_void definition. + +Tue Oct 29 12:22:40 1996 Anthony Green + + * Makefile.am (hack_DATA): Always install ffi_mips.h. + + * ffi.h.in: Removed FFI_DEBUG. It's now in the correct + place (acconfig.h). + Added #include for size_t definition. + +Tue Oct 15 17:23:35 1996 Anthony Green + + * ffi.h.in, ffi_common.h, ffi_mips.h: More clean up. + Commented out #define of FFI_DEBUG. + +Tue Oct 15 13:01:06 1996 Anthony Green + + * ffi_common.h: Added bool definition. + + * ffi.h.in, ffi_common.h: Clean up based on LCLint output. + Added funny /*@...@*/ comments to annotate source. + +Mon Oct 14 12:29:23 1996 Anthony Green + + * ffi.h.in: Interface changes based on feedback from Jim + Blandy. + +Fri Oct 11 16:49:35 1996 Anthony Green + + * ffi.h.in: Small change for sparc support. + +Thu Oct 10 14:53:37 1996 Anthony Green + + * ffi_mips.h: Added FFI_TYPE_STRUCT_* definitions for + special structure return types. + +Wed Oct 9 13:55:57 1996 Anthony Green + + * ffi.h.in: Added SIZEOF_ARG definition for X86 + +Tue Oct 8 11:40:36 1996 Anthony Green + + * ffi.h.in (FFI_FN): Added macro for eliminating compiler warnings. + Use it to case your function pointers to the proper type. + + * ffi_mips.h (SIZEOF_ARG): Added magic to fix type promotion bug. + + * Makefile.am (EXTRA_DIST): Added ffi_mips.h to EXTRA_DIST. + * Makefile: Rebuilt. + + * ffi_mips.h: Created. Moved all common mips definitions here. + +Mon Oct 7 10:58:12 1996 Anthony Green + + * ffi.h.in: The SGI assember is very picky about parens. Redefined + some macros to avoid problems. + + * ffi.h.in: Added FFI_DEFAULT_ABI definitions. Also added + externs for pointer, and 64bit integral ffi_types. + +Fri Oct 4 09:51:37 1996 Anthony Green + + * ffi.h.in: Added FFI_ABI member to ffi_cif and changed + function prototypes accordingly. + Added #define @TARGET@. Now programs including ffi.h don't + have to specify this themselves. + +Thu Oct 3 15:36:44 1996 Anthony Green + + * ffi.h.in: Changed ffi_prep_cif's values from void* to void** + + * Makefile.am (EXTRA_DIST): Added EXTRA_DIST for "make dist" + to work. + * Makefile.in: Regenerated. + +Wed Oct 2 10:16:59 1996 Anthony Green + + * Makefile.am: Created + * Makefile.in: Generated + + * ffi_common.h: Added rcsid comment + +Tue Oct 1 17:13:51 1996 Anthony Green + + * ffi.h.in, ffi_common.h: Created + +--- libffi/src ------------------------------------------------------------ + +Mon Oct 5 02:17:50 1998 Anthony Green + + * arm/ffi.c, arm/sysv.S: Created. + + * Makefile.am: Added arm files. + * Makefile.in: Rebuilt. + +Mon Oct 5 01:41:38 1998 Anthony Green + + * Makefile.am (libffi_la_LDFLAGS): Incremented revision. + +Sun Oct 4 16:27:17 1998 Anthony Green + + * alpha/osf.S (ffi_call_osf): Patch for DU assembler. + + * ffitest.c (main): long long and long double return values work + for x86. + +Fri Apr 17 11:50:58 1998 Anthony Green + + * Makefile.in: Rebuilt. + + * ffitest.c (main): Floating point tests not executed for systems + with broken lond double (SunOS 4 w/ GCC). + + * types.c: Fixed x86 alignment info for long long types. + +Thu Apr 16 07:15:28 1998 Anthony Green + + * ffitest.c: Added more notes about GCC bugs under Irix 6. + +Wed Apr 15 08:42:22 1998 Anthony Green + + * ffitest.c (struct5): New test function. + (main): New test with struct5. + +Thu Mar 5 10:48:11 1998 Anthony Green + + * prep_cif.c (initialize_aggregate): Fix assertion for + nested structures. + +Tue Feb 24 16:33:41 1998 Anthony Green + + * prep_cif.c (ffi_prep_cif): Added long double support for sparc. + +Sun Feb 22 00:52:18 1998 Geoff Keating + + * powerpc/asm.h: New file. + * powerpc/ffi.c: New file. + * powerpc/sysv.S: New file. + * Makefile.am: PowerPC port. + * ffitest.c (main): Allow all tests to run even in presence of gcc + bug on PowerPC. + +1998-02-17 Anthony Green + + * mips/ffi.c: Fixed comment typo. + + * x86/ffi.c (ffi_prep_cif_machdep), x86/sysv.S (retfloat): + Fixed x86 long double return handling. + + * types.c: Fixed x86 long double alignment info. + +1998-02-14 Andreas Schwab + + * types.c: Add m68k support. + + * ffitest.c (floating): Add long double parameter. + (return_ll, ldblit): New functions to test long long and long + double return value. + (main): Fix type error in assignment of ts[1-4]_type.elements. + Add tests for long long and long double arguments and return + values. + + * prep_cif.c (ffi_prep_cif) [M68K]: Don't allocate argument for + struct value pointer. + + * m68k/ffi.c, m68k/sysv.S: New files. + * Makefile.am: Add bits for m68k port. Add kludge to work around + automake deficiency. + (test): Don't require "." in $PATH. + * Makefile.in: Rebuilt. + +Wed Feb 11 07:36:50 1998 Anthony Green + + * Makefile.in: Rebuilt. + +Tue Feb 10 20:56:00 1998 Richard Henderson + + * alpha/ffi.c, alpha/osf.S: New files. + * Makefile.am: Alpha port. + +Tue Nov 18 14:12:07 1997 Anthony Green + + * mips/ffi.c (ffi_prep_cif_machdep): Initialize rstruct_flag + for n32. + +Tue Jun 3 17:18:20 1997 Anthony Green + + * ffitest.c (main): Added hack to get structure tests working + correctly. + +Sat May 10 19:06:42 1997 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (EXTRA_DIST): Explicitly list all distributable + files in subdirs. + (VERSION, CC): Removed. + +Thu May 8 17:19:01 1997 Anthony Green + + * Makefile.am: Many changes for new automake and libtool. + * Makefile.in: Rebuilt. + +Fri Nov 22 06:57:56 1996 Anthony Green + + * ffitest.c (main): Fixed test case for non mips machines. + +Wed Nov 20 22:31:59 1996 Anthony Green + + * types.c: Added ffi_type_void declaration. + +Tue Oct 29 13:07:19 1996 Anthony Green + + * ffitest.c (main): Fixed character constants. + (main): Emit warning for structure test 3 failure on Sun. + + * Makefile.am (VPATH): Fixed VPATH def'n so automake won't + strip it out. + Moved distdir hack from libffi to automake. + (ffitest): Added missing -c for $(COMPILE) (change in automake). + * Makefile.in: Rebuilt. + +Tue Oct 15 13:08:20 1996 Anthony Green + + * Makefile.am: Added "make lint" production. + * Makefile.in: Rebuilt. + + * prep_cif.c (STACK_ARG_SIZE): Improved STACK_ARG_SIZE macro. + Clean up based on LCLint output. Added funny /*@...@*/ comments to + annotate source. + + * ffitest.c, debug.c: Cleaned up code. + +Mon Oct 14 12:26:56 1996 Anthony Green + + * ffitest.c: Changes based on interface changes. + + * prep_cif.c (ffi_prep_cif): Cleaned up interface based on + feedback from Jim Blandy. + +Fri Oct 11 15:53:18 1996 Anthony Green + + * ffitest.c: Reordered tests while porting to sparc. + Made changes to handle lame structure passing for sparc. + Removed calls to fflush(). + + * prep_cif.c (ffi_prep_cif): Added special case for sparc + aggregate type arguments. + +Thu Oct 10 09:56:51 1996 Anthony Green + + * ffitest.c (main): Added structure passing/returning tests. + + * prep_cif.c (ffi_prep_cif): Perform proper initialization + of structure return types if needed. + (initialize_aggregate): Bug fix + +Wed Oct 9 16:04:20 1996 Anthony Green + + * types.c: Added special definitions for x86 (double doesn't + need double word alignment). + + * ffitest.c: Added many tests + +Tue Oct 8 09:19:22 1996 Anthony Green + + * prep_cif.c (ffi_prep_cif): Fixed assertion. + + * debug.c (ffi_assert): Must return a non void now. + + * Makefile.am: Added test production. + * Makefile: Rebuilt. + + * ffitest.c (main): Created. + + * types.c: Created. Stripped common code out of */ffi.c. + + * prep_cif.c: Added missing stdlib.h include. + + * debug.c (ffi_type_test): Used "a" to eliminate compiler + warnings in non-debug builds. Included ffi_common.h. + +Mon Oct 7 15:36:42 1996 Anthony Green + + * Makefile.am: Added a rule for .s -> .o + This is required by the SGI compiler. + * Makefile: Rebuilt. + +Fri Oct 4 09:51:08 1996 Anthony Green + + * prep_cif.c (initialize_aggregate): Moved abi specification + to ffi_prep_cif(). + +Thu Oct 3 15:37:37 1996 Anthony Green + + * prep_cif.c (ffi_prep_cif): Changed values from void* to void**. + (initialize_aggregate): Fixed aggregate type initialization. + + * Makefile.am (EXTRA_DIST): Added support code for "make dist". + * Makefile.in: Regenerated. + +Wed Oct 2 11:41:57 1996 Anthony Green + + * debug.c, prep_cif: Created. + + * Makefile.am: Added debug.o and prep_cif.o to OBJ. + * Makefile.in: Regenerated. + + * Makefile.am (INCLUDES): Added missing -I../include + * Makefile.in: Regenerated. + +Tue Oct 1 17:11:51 1996 Anthony Green + + * error.c, Makefile.am: Created. + * Makefile.in: Generated. + +--- libffi/src/x86 -------------------------------------------------------- + +Sun Oct 4 16:27:17 1998 Anthony Green + + * sysv.S (retlongdouble): Fixed long long return value support. + * ffi.c (ffi_prep_cif_machdep): Ditto. + +Wed May 13 04:30:33 1998 Anthony Green + + * ffi.c (ffi_prep_cif_machdep): Fixed long double return value + support. + +Wed Apr 15 08:43:20 1998 Anthony Green + + * ffi.c (ffi_prep_args): small struct support was missing. + +Thu May 8 16:53:58 1997 Anthony Green + + * objects.mak: Removed. + +Mon Dec 2 15:12:58 1996 Tom Tromey + + * sysv.S: Use .balign, for a.out Linux boxes. + +Tue Oct 15 13:06:50 1996 Anthony Green + + * ffi.c: Clean up based on LCLint output. + Added funny /*@...@*/ comments to annotate source. + +Fri Oct 11 16:43:38 1996 Anthony Green + + * ffi.c (ffi_call): Added assertion for bad ABIs. + +Wed Oct 9 13:57:27 1996 Anthony Green + + * sysv.S (retdouble): Fixed double return problems. + + * ffi.c (ffi_call): Corrected fn arg definition. + (ffi_prep_cif_machdep): Fixed double return problems + +Tue Oct 8 12:12:49 1996 Anthony Green + + * ffi.c: Moved ffi_type definitions to types.c. + (ffi_prep_args): Fixed type promotion bug. + +Mon Oct 7 15:53:06 1996 Anthony Green + + * ffi.c (FFI_*_TYPEDEF): Removed redundant ';' + +Fri Oct 4 09:54:53 1996 Anthony Green + + * ffi.c (ffi_call): Removed FFI_ABI arg, and swapped + remaining args. + +Wed Oct 2 10:07:05 1996 Anthony Green + + * ffi.c, sysv.S, objects.mak: Created. + (ffi_prep_cif): cif->rvalue no longer initialized to NULL. + (ffi_prep_cif_machdep): Moved machine independent cif processing + to src/prep_cif.c. Introduced ffi_prep_cif_machdep(). + +--- libffi/src/mips ------------------------------------------------------- + +Tue Feb 17 17:18:07 1998 Anthony Green + + * o32.S: Fixed typo in comment. + + * ffi.c (ffi_prep_cif_machdep): Fixed argument processing. + +Thu May 8 16:53:58 1997 Anthony Green + + * o32.s, n32.s: Wrappers for SGI tool support. + + * objects.mak: Removed. + +Tue Oct 29 14:37:45 1996 Anthony Green + + * ffi.c (ffi_prep_args): Changed int z to size_t z. + +Tue Oct 15 13:17:25 1996 Anthony Green + + * n32.S: Fixed bad stack munging. + + * ffi.c: Moved prototypes for ffi_call_?32() to here from + ffi_mips.h because extended_cif is not defined in ffi_mips.h. + +Mon Oct 14 12:42:02 1996 Anthony Green + + * ffi.c: Interface changes based on feedback from Jim Blandy. + +Thu Oct 10 11:22:16 1996 Anthony Green + + * n32.S, ffi.c: Lots of changes to support passing and + returning structures with the n32 calling convention. + + * n32.S: Fixed fn pointer bug. + + * ffi.c (ffi_prep_cif_machdep): Fix for o32 structure + return values. + (ffi_prep_args): Fixed n32 structure passing when structures + partially fit in registers. + +Wed Oct 9 13:49:25 1996 Anthony Green + + * objects.mak: Added n32.o. + + * n32.S: Created. + + * ffi.c (ffi_prep_args): Added magic to support proper + n32 processing. + +Tue Oct 8 10:37:35 1996 Anthony Green + + * ffi.c: Moved ffi_type definitions to types.c. + (ffi_prep_args): Fixed type promotion bug. + + * o32.S: This code is only built for o32 compiles. + A lot of the #define cruft has moved to ffi_mips.h. + + * ffi.c (ffi_prep_cif_machdep): Fixed arg flags. Second arg + is only processed if the first is either a float or double. + +Mon Oct 7 15:33:59 1996 Anthony Green + + * o32.S: Modified to compile under each of o32, n32 and n64. + + * ffi.c (FFI_*_TYPEDEF): Removed redundant ';' + +Fri Oct 4 09:53:25 1996 Anthony Green + + * ffi.c (ffi_call): Removed FFI_ABI arg, and swapped + remaining args. + +Wed Oct 2 17:41:22 1996 Anthony Green + + * o32.S: Removed crufty definitions. + +Wed Oct 2 12:53:42 1996 Anthony Green + + * ffi.c (ffi_prep_cif): cif->rvalue no longer initialized to NULL. + (ffi_prep_cif_machdep): Moved all machine independent cif processing + to src/prep_cif.c. Introduced ffi_prep_cif_machdep. Return types + of FFI_TYPE_STRUCT are no different than FFI_TYPE_INT. + +Tue Oct 1 17:11:02 1996 Anthony Green + + * ffi.c, o32.S, object.mak: Created + +--- libffi/src/sparc ------------------------------------------------------ + +Tue Feb 24 16:33:18 1998 Anthony Green + + * ffi.c (ffi_prep_args): Added long double support. + +Thu May 8 16:53:58 1997 Anthony Green + + * objects.mak: Removed. + +Thu May 1 16:07:56 1997 Anthony Green + + * v8.S: Fixed minor portability problem reported by + Russ McManus . + +Tue Nov 26 14:12:43 1996 Anthony Green + + * v8.S: Used STACKFRAME define elsewhere. + + * ffi.c (ffi_prep_args): Zero out space when USING_PURIFY + is set. + (ffi_prep_cif_machdep): Allocate the correct stack frame + space for functions with < 6 args. + +Tue Oct 29 15:08:55 1996 Anthony Green + + * ffi.c (ffi_prep_args): int z is now size_t z. + +Mon Oct 14 13:31:24 1996 Anthony Green + + * v8.S (ffi_call_V8): Gordon rewrites this again. It looks + great now. + + * ffi.c (ffi_call): The comment about hijacked registers + is no longer valid after gordoni hacked v8.S. + + * v8.S (ffi_call_V8): Rewrote with gordoni. Much simpler. + + * v8.S, ffi.c: ffi_call() had changed to accept more than + two args, so v8.S had to change (because it hijacks incoming + arg registers). + + * ffi.c: Interface changes based on feedback from Jim Blandy. + +Thu Oct 10 17:48:16 1996 Anthony Green + + * ffi.c, v8.S, objects.mak: Created. + + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/LICENSE b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/LICENSE new file mode 100644 index 0000000..7d12666 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/LICENSE @@ -0,0 +1,21 @@ +libffi - Copyright (c) 1996-2011 Anthony Green, Red Hat, Inc and others. +See source files for details. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.am b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.am new file mode 100644 index 0000000..86119d8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.am @@ -0,0 +1,196 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS = foreign subdir-objects + +SUBDIRS = include testsuite man + +EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ + src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \ + src/arm/ffi.c src/arm/sysv.S src/arm/trampoline.S \ + src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \ + src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \ + src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \ + src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \ + src/mips/n32.S src/mips/o32.S src/mips/ffitarget.h \ + src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ + src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ + src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/linux64.S \ + src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ + src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S \ + src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ + src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ + src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ + src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c \ + src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S \ + src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c \ + src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S \ + src/x86/win32.S src/x86/win64.S src/x86/darwin.S \ + src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S \ + src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c \ + src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/frv/eabi.S \ + src/frv/ffitarget.h src/dlmalloc.c src/moxie/ffi.c \ + src/moxie/eabi.S libtool-version ChangeLog.libffi \ + m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 \ + m4/ltversion.m4 build-ios.sh src/arm/gentramp.sh src/debug.c \ + msvcc.sh + + +info_TEXINFOS = doc/libffi.texi + +## ################################################################ + +## +## This section is for make and multilib madness. +## + +# Work around what appears to be a GNU make bug handling MAKEFLAGS +# values defined in terms of make variables, as is the case for CC and +# friends when we are called from the top level Makefile. +AM_MAKEFLAGS = \ + "AR_FLAGS=$(AR_FLAGS)" \ + "CC_FOR_BUILD=$(CC_FOR_BUILD)" \ + "CFLAGS=$(CFLAGS)" \ + "CXXFLAGS=$(CXXFLAGS)" \ + "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \ + "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \ + "INSTALL=$(INSTALL)" \ + "INSTALL_DATA=$(INSTALL_DATA)" \ + "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ + "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \ + "JC1FLAGS=$(JC1FLAGS)" \ + "LDFLAGS=$(LDFLAGS)" \ + "LIBCFLAGS=$(LIBCFLAGS)" \ + "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \ + "MAKE=$(MAKE)" \ + "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \ + "PICFLAG=$(PICFLAG)" \ + "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \ + "RUNTESTFLAGS=$(RUNTESTFLAGS)" \ + "SHELL=$(SHELL)" \ + "exec_prefix=$(exec_prefix)" \ + "infodir=$(infodir)" \ + "libdir=$(libdir)" \ + "mandir=$(mandir)" \ + "prefix=$(prefix)" \ + "AR=$(AR)" \ + "AS=$(AS)" \ + "CC=$(CC)" \ + "CXX=$(CXX)" \ + "LD=$(LD)" \ + "NM=$(NM)" \ + "RANLIB=$(RANLIB)" \ + "DESTDIR=$(DESTDIR)" + +MAKEOVERRIDES= + +ACLOCAL_AMFLAGS=$(ACLOCAL_AMFLAGS) -I m4 + +lib_LTLIBRARIES = libffi.la +noinst_LTLIBRARIES = libffi_convenience.la + +libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \ + src/raw_api.c src/java_raw_api.c src/closures.c + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libffi.pc + +nodist_libffi_la_SOURCES = + +if MIPS +nodist_libffi_la_SOURCES += src/mips/ffi.c src/mips/o32.S src/mips/n32.S +endif +if X86 +nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/sysv.S +endif +if X86_FREEBSD +nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/freebsd.S +endif +if X86_WIN32 +nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win32.S +endif +if X86_WIN64 +nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win64.S +endif +if X86_DARWIN +nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S +endif +if SPARC +nodist_libffi_la_SOURCES += src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S +endif +if ALPHA +nodist_libffi_la_SOURCES += src/alpha/ffi.c src/alpha/osf.S +endif +if IA64 +nodist_libffi_la_SOURCES += src/ia64/ffi.c src/ia64/unix.S +endif +if M32R +nodist_libffi_la_SOURCES += src/m32r/sysv.S src/m32r/ffi.c +endif +if M68K +nodist_libffi_la_SOURCES += src/m68k/ffi.c src/m68k/sysv.S +endif +if POWERPC +nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S +endif +if POWERPC_AIX +nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S +endif +if POWERPC_DARWIN +nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S +endif +if POWERPC_FREEBSD +nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S +endif +if ARM +nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c +if FFI_EXEC_TRAMPOLINE_TABLE +nodist_libffi_la_SOURCES += src/arm/trampoline.S +endif +endif +if AVR32 +nodist_libffi_la_SOURCES += src/avr32/sysv.S src/avr32/ffi.c +endif +if LIBFFI_CRIS +nodist_libffi_la_SOURCES += src/cris/sysv.S src/cris/ffi.c +endif +if FRV +nodist_libffi_la_SOURCES += src/frv/eabi.S src/frv/ffi.c +endif +if S390 +nodist_libffi_la_SOURCES += src/s390/sysv.S src/s390/ffi.c +endif +if X86_64 +nodist_libffi_la_SOURCES += src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S +endif +if SH +nodist_libffi_la_SOURCES += src/sh/sysv.S src/sh/ffi.c +endif +if SH64 +nodist_libffi_la_SOURCES += src/sh64/sysv.S src/sh64/ffi.c +endif +if PA_LINUX +nodist_libffi_la_SOURCES += src/pa/linux.S src/pa/ffi.c +endif +if PA_HPUX +nodist_libffi_la_SOURCES += src/pa/hpux32.S src/pa/ffi.c +endif + +libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) +nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) + +AM_CFLAGS = -g +if FFI_DEBUG +# Build debug. Define FFI_DEBUG on the commandline so that, when building with +# MSVC, it can link against the debug CRT. +AM_CFLAGS += -DFFI_DEBUG +endif + +libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) + +AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src +AM_CCASFLAGS = $(AM_CPPFLAGS) + +# No install-html or install-pdf support in automake yet +.PHONY: install-html install-pdf +install-html: +install-pdf: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.in b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.in new file mode 100644 index 0000000..cbe1589 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.in @@ -0,0 +1,1820 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@MIPS_TRUE@am__append_1 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S +@X86_TRUE@am__append_2 = src/x86/ffi.c src/x86/sysv.S +@X86_FREEBSD_TRUE@am__append_3 = src/x86/ffi.c src/x86/freebsd.S +@X86_WIN32_TRUE@am__append_4 = src/x86/ffi.c src/x86/win32.S +@X86_WIN64_TRUE@am__append_5 = src/x86/ffi.c src/x86/win64.S +@X86_DARWIN_TRUE@am__append_6 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S +@SPARC_TRUE@am__append_7 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S +@ALPHA_TRUE@am__append_8 = src/alpha/ffi.c src/alpha/osf.S +@IA64_TRUE@am__append_9 = src/ia64/ffi.c src/ia64/unix.S +@M32R_TRUE@am__append_10 = src/m32r/sysv.S src/m32r/ffi.c +@M68K_TRUE@am__append_11 = src/m68k/ffi.c src/m68k/sysv.S +@POWERPC_TRUE@am__append_12 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S +@POWERPC_AIX_TRUE@am__append_13 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S +@POWERPC_DARWIN_TRUE@am__append_14 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S +@POWERPC_FREEBSD_TRUE@am__append_15 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S +@ARM_TRUE@am__append_16 = src/arm/sysv.S src/arm/ffi.c +@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_17 = src/arm/trampoline.S +@AVR32_TRUE@am__append_18 = src/avr32/sysv.S src/avr32/ffi.c +@LIBFFI_CRIS_TRUE@am__append_19 = src/cris/sysv.S src/cris/ffi.c +@FRV_TRUE@am__append_20 = src/frv/eabi.S src/frv/ffi.c +@S390_TRUE@am__append_21 = src/s390/sysv.S src/s390/ffi.c +@X86_64_TRUE@am__append_22 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S +@SH_TRUE@am__append_23 = src/sh/sysv.S src/sh/ffi.c +@SH64_TRUE@am__append_24 = src/sh64/sysv.S src/sh64/ffi.c +@PA_LINUX_TRUE@am__append_25 = src/pa/linux.S src/pa/ffi.c +@PA_HPUX_TRUE@am__append_26 = src/pa/hpux32.S src/pa/ffi.c +# Build debug. Define FFI_DEBUG on the commandline so that, when building with +# MSVC, it can link against the debug CRT. +@FFI_DEBUG_TRUE@am__append_27 = -DFFI_DEBUG +subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \ + $(srcdir)/doc/version.texi $(srcdir)/fficonfig.h.in \ + $(srcdir)/libffi.pc.in $(top_srcdir)/configure ChangeLog \ + compile config.guess config.sub depcomp install-sh ltmain.sh \ + mdate-sh missing texinfo.tex +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = fficonfig.h +CONFIG_CLEAN_FILES = libffi.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(infodir)" \ + "$(DESTDIR)$(pkgconfigdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +libffi_la_LIBADD = +am__dirstamp = $(am__leading_dot)dirstamp +am_libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ + src/raw_api.lo src/java_raw_api.lo src/closures.lo +@MIPS_TRUE@am__objects_1 = src/mips/ffi.lo src/mips/o32.lo \ +@MIPS_TRUE@ src/mips/n32.lo +@X86_TRUE@am__objects_2 = src/x86/ffi.lo src/x86/sysv.lo +@X86_FREEBSD_TRUE@am__objects_3 = src/x86/ffi.lo src/x86/freebsd.lo +@X86_WIN32_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/win32.lo +@X86_WIN64_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/win64.lo +@X86_DARWIN_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/darwin.lo \ +@X86_DARWIN_TRUE@ src/x86/ffi64.lo src/x86/darwin64.lo +@SPARC_TRUE@am__objects_7 = src/sparc/ffi.lo src/sparc/v8.lo \ +@SPARC_TRUE@ src/sparc/v9.lo +@ALPHA_TRUE@am__objects_8 = src/alpha/ffi.lo src/alpha/osf.lo +@IA64_TRUE@am__objects_9 = src/ia64/ffi.lo src/ia64/unix.lo +@M32R_TRUE@am__objects_10 = src/m32r/sysv.lo src/m32r/ffi.lo +@M68K_TRUE@am__objects_11 = src/m68k/ffi.lo src/m68k/sysv.lo +@POWERPC_TRUE@am__objects_12 = src/powerpc/ffi.lo src/powerpc/sysv.lo \ +@POWERPC_TRUE@ src/powerpc/ppc_closure.lo \ +@POWERPC_TRUE@ src/powerpc/linux64.lo \ +@POWERPC_TRUE@ src/powerpc/linux64_closure.lo +@POWERPC_AIX_TRUE@am__objects_13 = src/powerpc/ffi_darwin.lo \ +@POWERPC_AIX_TRUE@ src/powerpc/aix.lo \ +@POWERPC_AIX_TRUE@ src/powerpc/aix_closure.lo +@POWERPC_DARWIN_TRUE@am__objects_14 = src/powerpc/ffi_darwin.lo \ +@POWERPC_DARWIN_TRUE@ src/powerpc/darwin.lo \ +@POWERPC_DARWIN_TRUE@ src/powerpc/darwin_closure.lo +@POWERPC_FREEBSD_TRUE@am__objects_15 = src/powerpc/ffi.lo \ +@POWERPC_FREEBSD_TRUE@ src/powerpc/sysv.lo \ +@POWERPC_FREEBSD_TRUE@ src/powerpc/ppc_closure.lo +@ARM_TRUE@am__objects_16 = src/arm/sysv.lo src/arm/ffi.lo +@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_17 = src/arm/trampoline.lo +@AVR32_TRUE@am__objects_18 = src/avr32/sysv.lo src/avr32/ffi.lo +@LIBFFI_CRIS_TRUE@am__objects_19 = src/cris/sysv.lo src/cris/ffi.lo +@FRV_TRUE@am__objects_20 = src/frv/eabi.lo src/frv/ffi.lo +@S390_TRUE@am__objects_21 = src/s390/sysv.lo src/s390/ffi.lo +@X86_64_TRUE@am__objects_22 = src/x86/ffi64.lo src/x86/unix64.lo \ +@X86_64_TRUE@ src/x86/ffi.lo src/x86/sysv.lo +@SH_TRUE@am__objects_23 = src/sh/sysv.lo src/sh/ffi.lo +@SH64_TRUE@am__objects_24 = src/sh64/sysv.lo src/sh64/ffi.lo +@PA_LINUX_TRUE@am__objects_25 = src/pa/linux.lo src/pa/ffi.lo +@PA_HPUX_TRUE@am__objects_26 = src/pa/hpux32.lo src/pa/ffi.lo +nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) \ + $(am__objects_6) $(am__objects_7) $(am__objects_8) \ + $(am__objects_9) $(am__objects_10) $(am__objects_11) \ + $(am__objects_12) $(am__objects_13) $(am__objects_14) \ + $(am__objects_15) $(am__objects_16) $(am__objects_17) \ + $(am__objects_18) $(am__objects_19) $(am__objects_20) \ + $(am__objects_21) $(am__objects_22) $(am__objects_23) \ + $(am__objects_24) $(am__objects_25) $(am__objects_26) +libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \ + $(nodist_libffi_la_OBJECTS) +libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ +libffi_convenience_la_LIBADD = +am__objects_27 = src/debug.lo src/prep_cif.lo src/types.lo \ + src/raw_api.lo src/java_raw_api.lo src/closures.lo +am_libffi_convenience_la_OBJECTS = $(am__objects_27) +am__objects_28 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) $(am__objects_18) \ + $(am__objects_19) $(am__objects_20) $(am__objects_21) \ + $(am__objects_22) $(am__objects_23) $(am__objects_24) \ + $(am__objects_25) $(am__objects_26) +nodist_libffi_convenience_la_OBJECTS = $(am__objects_28) +libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ + $(nodist_libffi_convenience_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) +LTCPPASCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libffi_la_SOURCES) $(nodist_libffi_la_SOURCES) \ + $(libffi_convenience_la_SOURCES) \ + $(nodist_libffi_convenience_la_SOURCES) +DIST_SOURCES = $(libffi_la_SOURCES) $(libffi_convenience_la_SOURCES) +INFO_DEPS = $(srcdir)/doc/libffi.info +am__TEXINFO_TEX_DIR = $(srcdir) +DVIS = doc/libffi.dvi +PDFS = doc/libffi.pdf +PSS = doc/libffi.ps +HTMLS = doc/libffi.html +TEXINFOS = doc/libffi.texi +TEXI2DVI = texi2dvi +TEXI2PDF = $(TEXI2DVI) --pdf --batch +MAKEINFOHTML = $(MAKEINFO) --html +AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) +DVIPS = dvips +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +DATA = $(pkgconfig_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_LTLDFLAGS = @AM_LTLDFLAGS@ +AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PRTDIAG = @PRTDIAG@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TARGET = @TARGET@ +TARGETDIR = @TARGETDIR@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +ax_enable_builddir_sed = @ax_enable_builddir_sed@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sys_symbol_underscore = @sys_symbol_underscore@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +toolexecdir = @toolexecdir@ +toolexeclibdir = @toolexeclibdir@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign subdir-objects +SUBDIRS = include testsuite man +EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ + src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \ + src/arm/ffi.c src/arm/sysv.S src/arm/trampoline.S \ + src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \ + src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \ + src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \ + src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \ + src/mips/n32.S src/mips/o32.S src/mips/ffitarget.h \ + src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ + src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ + src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/linux64.S \ + src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ + src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S \ + src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ + src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ + src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ + src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c \ + src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S \ + src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c \ + src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S \ + src/x86/win32.S src/x86/win64.S src/x86/darwin.S \ + src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S \ + src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c \ + src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/frv/eabi.S \ + src/frv/ffitarget.h src/dlmalloc.c src/moxie/ffi.c \ + src/moxie/eabi.S libtool-version ChangeLog.libffi \ + m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 \ + m4/ltversion.m4 build-ios.sh src/arm/gentramp.sh src/debug.c \ + msvcc.sh + +info_TEXINFOS = doc/libffi.texi + +# Work around what appears to be a GNU make bug handling MAKEFLAGS +# values defined in terms of make variables, as is the case for CC and +# friends when we are called from the top level Makefile. +AM_MAKEFLAGS = \ + "AR_FLAGS=$(AR_FLAGS)" \ + "CC_FOR_BUILD=$(CC_FOR_BUILD)" \ + "CFLAGS=$(CFLAGS)" \ + "CXXFLAGS=$(CXXFLAGS)" \ + "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \ + "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \ + "INSTALL=$(INSTALL)" \ + "INSTALL_DATA=$(INSTALL_DATA)" \ + "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ + "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \ + "JC1FLAGS=$(JC1FLAGS)" \ + "LDFLAGS=$(LDFLAGS)" \ + "LIBCFLAGS=$(LIBCFLAGS)" \ + "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \ + "MAKE=$(MAKE)" \ + "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \ + "PICFLAG=$(PICFLAG)" \ + "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \ + "RUNTESTFLAGS=$(RUNTESTFLAGS)" \ + "SHELL=$(SHELL)" \ + "exec_prefix=$(exec_prefix)" \ + "infodir=$(infodir)" \ + "libdir=$(libdir)" \ + "mandir=$(mandir)" \ + "prefix=$(prefix)" \ + "AR=$(AR)" \ + "AS=$(AS)" \ + "CC=$(CC)" \ + "CXX=$(CXX)" \ + "LD=$(LD)" \ + "NM=$(NM)" \ + "RANLIB=$(RANLIB)" \ + "DESTDIR=$(DESTDIR)" + +MAKEOVERRIDES = +ACLOCAL_AMFLAGS = $(ACLOCAL_AMFLAGS) -I m4 +lib_LTLIBRARIES = libffi.la +noinst_LTLIBRARIES = libffi_convenience.la +libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \ + src/raw_api.c src/java_raw_api.c src/closures.c + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libffi.pc +nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \ + $(am__append_3) $(am__append_4) $(am__append_5) \ + $(am__append_6) $(am__append_7) $(am__append_8) \ + $(am__append_9) $(am__append_10) $(am__append_11) \ + $(am__append_12) $(am__append_13) $(am__append_14) \ + $(am__append_15) $(am__append_16) $(am__append_17) \ + $(am__append_18) $(am__append_19) $(am__append_20) \ + $(am__append_21) $(am__append_22) $(am__append_23) \ + $(am__append_24) $(am__append_25) $(am__append_26) +libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) +nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) +AM_CFLAGS = -g $(am__append_27) +libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) +AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src +AM_CCASFLAGS = $(AM_CPPFLAGS) +all: fficonfig.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .S .c .dvi .lo .o .obj .ps +am--refresh: + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +fficonfig.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status fficonfig.h +$(srcdir)/fficonfig.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f fficonfig.h stamp-h1 +libffi.pc: $(top_builddir)/config.status $(srcdir)/libffi.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) +src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/$(DEPDIR) + @: > src/$(DEPDIR)/$(am__dirstamp) +src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/prep_cif.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/types.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/java_raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/closures.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/mips/$(am__dirstamp): + @$(MKDIR_P) src/mips + @: > src/mips/$(am__dirstamp) +src/mips/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/mips/$(DEPDIR) + @: > src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/ffi.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/o32.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/n32.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/x86/$(am__dirstamp): + @$(MKDIR_P) src/x86 + @: > src/x86/$(am__dirstamp) +src/x86/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/x86/$(DEPDIR) + @: > src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/ffi.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/sysv.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/freebsd.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/win32.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/win64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/darwin.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/ffi64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/darwin64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/sparc/$(am__dirstamp): + @$(MKDIR_P) src/sparc + @: > src/sparc/$(am__dirstamp) +src/sparc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sparc/$(DEPDIR) + @: > src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/ffi.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/v8.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/v9.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/alpha/$(am__dirstamp): + @$(MKDIR_P) src/alpha + @: > src/alpha/$(am__dirstamp) +src/alpha/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/alpha/$(DEPDIR) + @: > src/alpha/$(DEPDIR)/$(am__dirstamp) +src/alpha/ffi.lo: src/alpha/$(am__dirstamp) \ + src/alpha/$(DEPDIR)/$(am__dirstamp) +src/alpha/osf.lo: src/alpha/$(am__dirstamp) \ + src/alpha/$(DEPDIR)/$(am__dirstamp) +src/ia64/$(am__dirstamp): + @$(MKDIR_P) src/ia64 + @: > src/ia64/$(am__dirstamp) +src/ia64/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/ia64/$(DEPDIR) + @: > src/ia64/$(DEPDIR)/$(am__dirstamp) +src/ia64/ffi.lo: src/ia64/$(am__dirstamp) \ + src/ia64/$(DEPDIR)/$(am__dirstamp) +src/ia64/unix.lo: src/ia64/$(am__dirstamp) \ + src/ia64/$(DEPDIR)/$(am__dirstamp) +src/m32r/$(am__dirstamp): + @$(MKDIR_P) src/m32r + @: > src/m32r/$(am__dirstamp) +src/m32r/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/m32r/$(DEPDIR) + @: > src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m32r/sysv.lo: src/m32r/$(am__dirstamp) \ + src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m32r/ffi.lo: src/m32r/$(am__dirstamp) \ + src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m68k/$(am__dirstamp): + @$(MKDIR_P) src/m68k + @: > src/m68k/$(am__dirstamp) +src/m68k/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/m68k/$(DEPDIR) + @: > src/m68k/$(DEPDIR)/$(am__dirstamp) +src/m68k/ffi.lo: src/m68k/$(am__dirstamp) \ + src/m68k/$(DEPDIR)/$(am__dirstamp) +src/m68k/sysv.lo: src/m68k/$(am__dirstamp) \ + src/m68k/$(DEPDIR)/$(am__dirstamp) +src/powerpc/$(am__dirstamp): + @$(MKDIR_P) src/powerpc + @: > src/powerpc/$(am__dirstamp) +src/powerpc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/powerpc/$(DEPDIR) + @: > src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ffi.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/sysv.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ppc_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/linux64.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/linux64_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ffi_darwin.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/aix.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/aix_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/darwin.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/darwin_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/arm/$(am__dirstamp): + @$(MKDIR_P) src/arm + @: > src/arm/$(am__dirstamp) +src/arm/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/arm/$(DEPDIR) + @: > src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/sysv.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/ffi.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/trampoline.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/avr32/$(am__dirstamp): + @$(MKDIR_P) src/avr32 + @: > src/avr32/$(am__dirstamp) +src/avr32/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/avr32/$(DEPDIR) + @: > src/avr32/$(DEPDIR)/$(am__dirstamp) +src/avr32/sysv.lo: src/avr32/$(am__dirstamp) \ + src/avr32/$(DEPDIR)/$(am__dirstamp) +src/avr32/ffi.lo: src/avr32/$(am__dirstamp) \ + src/avr32/$(DEPDIR)/$(am__dirstamp) +src/cris/$(am__dirstamp): + @$(MKDIR_P) src/cris + @: > src/cris/$(am__dirstamp) +src/cris/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/cris/$(DEPDIR) + @: > src/cris/$(DEPDIR)/$(am__dirstamp) +src/cris/sysv.lo: src/cris/$(am__dirstamp) \ + src/cris/$(DEPDIR)/$(am__dirstamp) +src/cris/ffi.lo: src/cris/$(am__dirstamp) \ + src/cris/$(DEPDIR)/$(am__dirstamp) +src/frv/$(am__dirstamp): + @$(MKDIR_P) src/frv + @: > src/frv/$(am__dirstamp) +src/frv/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/frv/$(DEPDIR) + @: > src/frv/$(DEPDIR)/$(am__dirstamp) +src/frv/eabi.lo: src/frv/$(am__dirstamp) \ + src/frv/$(DEPDIR)/$(am__dirstamp) +src/frv/ffi.lo: src/frv/$(am__dirstamp) \ + src/frv/$(DEPDIR)/$(am__dirstamp) +src/s390/$(am__dirstamp): + @$(MKDIR_P) src/s390 + @: > src/s390/$(am__dirstamp) +src/s390/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/s390/$(DEPDIR) + @: > src/s390/$(DEPDIR)/$(am__dirstamp) +src/s390/sysv.lo: src/s390/$(am__dirstamp) \ + src/s390/$(DEPDIR)/$(am__dirstamp) +src/s390/ffi.lo: src/s390/$(am__dirstamp) \ + src/s390/$(DEPDIR)/$(am__dirstamp) +src/x86/unix64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/sh/$(am__dirstamp): + @$(MKDIR_P) src/sh + @: > src/sh/$(am__dirstamp) +src/sh/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sh/$(DEPDIR) + @: > src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh/sysv.lo: src/sh/$(am__dirstamp) \ + src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh/ffi.lo: src/sh/$(am__dirstamp) src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh64/$(am__dirstamp): + @$(MKDIR_P) src/sh64 + @: > src/sh64/$(am__dirstamp) +src/sh64/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sh64/$(DEPDIR) + @: > src/sh64/$(DEPDIR)/$(am__dirstamp) +src/sh64/sysv.lo: src/sh64/$(am__dirstamp) \ + src/sh64/$(DEPDIR)/$(am__dirstamp) +src/sh64/ffi.lo: src/sh64/$(am__dirstamp) \ + src/sh64/$(DEPDIR)/$(am__dirstamp) +src/pa/$(am__dirstamp): + @$(MKDIR_P) src/pa + @: > src/pa/$(am__dirstamp) +src/pa/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/pa/$(DEPDIR) + @: > src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/linux.lo: src/pa/$(am__dirstamp) \ + src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/hpux32.lo: src/pa/$(am__dirstamp) \ + src/pa/$(DEPDIR)/$(am__dirstamp) +libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) + $(libffi_la_LINK) -rpath $(libdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) +libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) + $(LINK) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f src/alpha/ffi.$(OBJEXT) + -rm -f src/alpha/ffi.lo + -rm -f src/alpha/osf.$(OBJEXT) + -rm -f src/alpha/osf.lo + -rm -f src/arm/ffi.$(OBJEXT) + -rm -f src/arm/ffi.lo + -rm -f src/arm/sysv.$(OBJEXT) + -rm -f src/arm/sysv.lo + -rm -f src/arm/trampoline.$(OBJEXT) + -rm -f src/arm/trampoline.lo + -rm -f src/avr32/ffi.$(OBJEXT) + -rm -f src/avr32/ffi.lo + -rm -f src/avr32/sysv.$(OBJEXT) + -rm -f src/avr32/sysv.lo + -rm -f src/closures.$(OBJEXT) + -rm -f src/closures.lo + -rm -f src/cris/ffi.$(OBJEXT) + -rm -f src/cris/ffi.lo + -rm -f src/cris/sysv.$(OBJEXT) + -rm -f src/cris/sysv.lo + -rm -f src/debug.$(OBJEXT) + -rm -f src/debug.lo + -rm -f src/frv/eabi.$(OBJEXT) + -rm -f src/frv/eabi.lo + -rm -f src/frv/ffi.$(OBJEXT) + -rm -f src/frv/ffi.lo + -rm -f src/ia64/ffi.$(OBJEXT) + -rm -f src/ia64/ffi.lo + -rm -f src/ia64/unix.$(OBJEXT) + -rm -f src/ia64/unix.lo + -rm -f src/java_raw_api.$(OBJEXT) + -rm -f src/java_raw_api.lo + -rm -f src/m32r/ffi.$(OBJEXT) + -rm -f src/m32r/ffi.lo + -rm -f src/m32r/sysv.$(OBJEXT) + -rm -f src/m32r/sysv.lo + -rm -f src/m68k/ffi.$(OBJEXT) + -rm -f src/m68k/ffi.lo + -rm -f src/m68k/sysv.$(OBJEXT) + -rm -f src/m68k/sysv.lo + -rm -f src/mips/ffi.$(OBJEXT) + -rm -f src/mips/ffi.lo + -rm -f src/mips/n32.$(OBJEXT) + -rm -f src/mips/n32.lo + -rm -f src/mips/o32.$(OBJEXT) + -rm -f src/mips/o32.lo + -rm -f src/pa/ffi.$(OBJEXT) + -rm -f src/pa/ffi.lo + -rm -f src/pa/hpux32.$(OBJEXT) + -rm -f src/pa/hpux32.lo + -rm -f src/pa/linux.$(OBJEXT) + -rm -f src/pa/linux.lo + -rm -f src/powerpc/aix.$(OBJEXT) + -rm -f src/powerpc/aix.lo + -rm -f src/powerpc/aix_closure.$(OBJEXT) + -rm -f src/powerpc/aix_closure.lo + -rm -f src/powerpc/darwin.$(OBJEXT) + -rm -f src/powerpc/darwin.lo + -rm -f src/powerpc/darwin_closure.$(OBJEXT) + -rm -f src/powerpc/darwin_closure.lo + -rm -f src/powerpc/ffi.$(OBJEXT) + -rm -f src/powerpc/ffi.lo + -rm -f src/powerpc/ffi_darwin.$(OBJEXT) + -rm -f src/powerpc/ffi_darwin.lo + -rm -f src/powerpc/linux64.$(OBJEXT) + -rm -f src/powerpc/linux64.lo + -rm -f src/powerpc/linux64_closure.$(OBJEXT) + -rm -f src/powerpc/linux64_closure.lo + -rm -f src/powerpc/ppc_closure.$(OBJEXT) + -rm -f src/powerpc/ppc_closure.lo + -rm -f src/powerpc/sysv.$(OBJEXT) + -rm -f src/powerpc/sysv.lo + -rm -f src/prep_cif.$(OBJEXT) + -rm -f src/prep_cif.lo + -rm -f src/raw_api.$(OBJEXT) + -rm -f src/raw_api.lo + -rm -f src/s390/ffi.$(OBJEXT) + -rm -f src/s390/ffi.lo + -rm -f src/s390/sysv.$(OBJEXT) + -rm -f src/s390/sysv.lo + -rm -f src/sh/ffi.$(OBJEXT) + -rm -f src/sh/ffi.lo + -rm -f src/sh/sysv.$(OBJEXT) + -rm -f src/sh/sysv.lo + -rm -f src/sh64/ffi.$(OBJEXT) + -rm -f src/sh64/ffi.lo + -rm -f src/sh64/sysv.$(OBJEXT) + -rm -f src/sh64/sysv.lo + -rm -f src/sparc/ffi.$(OBJEXT) + -rm -f src/sparc/ffi.lo + -rm -f src/sparc/v8.$(OBJEXT) + -rm -f src/sparc/v8.lo + -rm -f src/sparc/v9.$(OBJEXT) + -rm -f src/sparc/v9.lo + -rm -f src/types.$(OBJEXT) + -rm -f src/types.lo + -rm -f src/x86/darwin.$(OBJEXT) + -rm -f src/x86/darwin.lo + -rm -f src/x86/darwin64.$(OBJEXT) + -rm -f src/x86/darwin64.lo + -rm -f src/x86/ffi.$(OBJEXT) + -rm -f src/x86/ffi.lo + -rm -f src/x86/ffi64.$(OBJEXT) + -rm -f src/x86/ffi64.lo + -rm -f src/x86/freebsd.$(OBJEXT) + -rm -f src/x86/freebsd.lo + -rm -f src/x86/sysv.$(OBJEXT) + -rm -f src/x86/sysv.lo + -rm -f src/x86/unix64.$(OBJEXT) + -rm -f src/x86/unix64.lo + -rm -f src/x86/win32.$(OBJEXT) + -rm -f src/x86/win32.lo + -rm -f src/x86/win64.$(OBJEXT) + -rm -f src/x86/win64.lo + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/closures.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/debug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/java_raw_api.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/prep_cif.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/raw_api.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/types.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/osf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/sysv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/trampoline.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/sysv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/sysv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/eabi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/unix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/sysv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/sysv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/n32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/o32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/hpux32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/linux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix_closure.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin_closure.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_darwin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64_closure.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ppc_closure.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/sysv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/sysv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/sysv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/sysv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/freebsd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/sysv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/unix64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win64.Plo@am__quote@ + +.S.o: +@am__fastdepCCAS_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCCAS_FALSE@ $(CPPASCOMPILE) -c -o $@ $< + +.S.obj: +@am__fastdepCCAS_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCCAS_FALSE@ $(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.S.lo: +@am__fastdepCCAS_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCCAS_TRUE@ $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCCAS_FALSE@ $(LTCPPASCOMPILE) -c -o $@ $< + +.c.o: +@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf src/.libs src/_libs + -rm -rf src/alpha/.libs src/alpha/_libs + -rm -rf src/arm/.libs src/arm/_libs + -rm -rf src/avr32/.libs src/avr32/_libs + -rm -rf src/cris/.libs src/cris/_libs + -rm -rf src/frv/.libs src/frv/_libs + -rm -rf src/ia64/.libs src/ia64/_libs + -rm -rf src/m32r/.libs src/m32r/_libs + -rm -rf src/m68k/.libs src/m68k/_libs + -rm -rf src/mips/.libs src/mips/_libs + -rm -rf src/pa/.libs src/pa/_libs + -rm -rf src/powerpc/.libs src/powerpc/_libs + -rm -rf src/s390/.libs src/s390/_libs + -rm -rf src/sh/.libs src/sh/_libs + -rm -rf src/sh64/.libs src/sh64/_libs + -rm -rf src/sparc/.libs src/sparc/_libs + -rm -rf src/x86/.libs src/x86/_libs + +distclean-libtool: + -rm -f libtool config.lt +doc/$(am__dirstamp): + @$(MKDIR_P) doc + @: > doc/$(am__dirstamp) + +$(srcdir)/doc/libffi.info: doc/libffi.texi $(srcdir)/doc/version.texi + restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + am__cwd=`pwd` && $(am__cd) $(srcdir) && \ + rm -rf $$backupdir && mkdir $$backupdir && \ + if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ + done; \ + else :; fi && \ + cd "$$am__cwd"; \ + if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \ + -o $@ $(srcdir)/doc/libffi.texi; \ + then \ + rc=0; \ + $(am__cd) $(srcdir); \ + else \ + rc=$$?; \ + $(am__cd) $(srcdir) && \ + $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ + fi; \ + rm -rf $$backupdir; exit $$rc + +doc/libffi.dvi: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \ + $(TEXI2DVI) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi + +doc/libffi.pdf: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \ + $(TEXI2PDF) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi + +doc/libffi.html: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp) + rm -rf $(@:.html=.htp) + if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \ + -o $(@:.html=.htp) `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi; \ + then \ + rm -rf $@; \ + if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ + mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ + else \ + if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ + rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ + exit 1; \ + fi +$(srcdir)/doc/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/doc/stamp-vti +$(srcdir)/doc/stamp-vti: doc/libffi.texi $(top_srcdir)/configure + test -f doc/$(am__dirstamp) || $(MAKE) $(AM_MAKEFLAGS) doc/$(am__dirstamp) + @(dir=.; test -f ./doc/libffi.texi || dir=$(srcdir); \ + set `$(SHELL) $(srcdir)/mdate-sh $$dir/doc/libffi.texi`; \ + echo "@set UPDATED $$1 $$2 $$3"; \ + echo "@set UPDATED-MONTH $$2 $$3"; \ + echo "@set EDITION $(VERSION)"; \ + echo "@set VERSION $(VERSION)") > vti.tmp + @cmp -s vti.tmp $(srcdir)/doc/version.texi \ + || (echo "Updating $(srcdir)/doc/version.texi"; \ + cp vti.tmp $(srcdir)/doc/version.texi) + -@rm -f vti.tmp + @cp $(srcdir)/doc/version.texi $@ + +mostlyclean-vti: + -rm -f vti.tmp + +maintainer-clean-vti: +@MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/doc/stamp-vti $(srcdir)/doc/version.texi +.dvi.ps: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(DVIPS) -o $@ $< + +uninstall-dvi-am: + @$(NORMAL_UNINSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ + rm -f "$(DESTDIR)$(dvidir)/$$f"; \ + done + +uninstall-html-am: + @$(NORMAL_UNINSTALL) + @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ + rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ + done + +uninstall-info-am: + @$(PRE_UNINSTALL) + @if test -d '$(DESTDIR)$(infodir)' && \ + (install-info --version && \ + install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ + if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ + then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ + done; \ + else :; fi + @$(NORMAL_UNINSTALL) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ + (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ + echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ + rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ + else :; fi); \ + done + +uninstall-pdf-am: + @$(NORMAL_UNINSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ + done + +uninstall-ps-am: + @$(NORMAL_UNINSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ + rm -f "$(DESTDIR)$(psdir)/$$f"; \ + done + +dist-info: $(INFO_DEPS) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; \ + for base in $$list; do \ + case $$base in \ + $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$base; then d=.; else d=$(srcdir); fi; \ + base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ + for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ + if test -f $$file; then \ + relfile=`expr "$$file" : "$$d/\(.*\)"`; \ + test -f "$(distdir)/$$relfile" || \ + cp -p $$file "$(distdir)/$$relfile"; \ + else :; fi; \ + done; \ + done + +mostlyclean-aminfo: + -rm -rf libffi.aux libffi.cp libffi.cps libffi.fn libffi.ky libffi.log \ + libffi.pg libffi.tmp libffi.toc libffi.tp libffi.vr + +clean-aminfo: + -test -z "doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html" \ + || rm -rf doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html + +maintainer-clean-aminfo: + @list='$(INFO_DEPS)'; for i in $$list; do \ + i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ + echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ + rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ + done +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-info + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(INFO_DEPS) $(LTLIBRARIES) $(DATA) fficonfig.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f doc/$(am__dirstamp) + -rm -f src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/$(am__dirstamp) + -rm -f src/alpha/$(DEPDIR)/$(am__dirstamp) + -rm -f src/alpha/$(am__dirstamp) + -rm -f src/arm/$(DEPDIR)/$(am__dirstamp) + -rm -f src/arm/$(am__dirstamp) + -rm -f src/avr32/$(DEPDIR)/$(am__dirstamp) + -rm -f src/avr32/$(am__dirstamp) + -rm -f src/cris/$(DEPDIR)/$(am__dirstamp) + -rm -f src/cris/$(am__dirstamp) + -rm -f src/frv/$(DEPDIR)/$(am__dirstamp) + -rm -f src/frv/$(am__dirstamp) + -rm -f src/ia64/$(DEPDIR)/$(am__dirstamp) + -rm -f src/ia64/$(am__dirstamp) + -rm -f src/m32r/$(DEPDIR)/$(am__dirstamp) + -rm -f src/m32r/$(am__dirstamp) + -rm -f src/m68k/$(DEPDIR)/$(am__dirstamp) + -rm -f src/m68k/$(am__dirstamp) + -rm -f src/mips/$(DEPDIR)/$(am__dirstamp) + -rm -f src/mips/$(am__dirstamp) + -rm -f src/pa/$(DEPDIR)/$(am__dirstamp) + -rm -f src/pa/$(am__dirstamp) + -rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/powerpc/$(am__dirstamp) + -rm -f src/s390/$(DEPDIR)/$(am__dirstamp) + -rm -f src/s390/$(am__dirstamp) + -rm -f src/sh/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sh/$(am__dirstamp) + -rm -f src/sh64/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sh64/$(am__dirstamp) + -rm -f src/sparc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sparc/$(am__dirstamp) + -rm -f src/x86/$(DEPDIR)/$(am__dirstamp) + -rm -f src/x86/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-aminfo clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: $(DVIS) + +html: html-recursive + +html-am: $(HTMLS) + +info: info-recursive + +info-am: $(INFO_DEPS) + +install-data-am: install-info-am install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: $(DVIS) + @$(NORMAL_INSTALL) + test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)" + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ + done +install-exec-am: install-libLTLIBRARIES + +install-html-am: $(HTMLS) + @$(NORMAL_INSTALL) + test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)" + @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__strip_dir) \ + if test -d "$$d$$p"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ + echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ + $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ + else \ + list2="$$list2 $$d$$p"; \ + fi; \ + done; \ + test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done; } +install-info: install-info-recursive + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ + for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ + $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ + if test -f $$ifile; then \ + echo "$$ifile"; \ + else : ; fi; \ + done; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done + @$(POST_INSTALL) + @if (install-info --version && \ + install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ + install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ + done; \ + else : ; fi +install-man: + +install-pdf-am: $(PDFS) + @$(NORMAL_INSTALL) + test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)" + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done +install-ps: install-ps-recursive + +install-ps-am: $(PSS) + @$(NORMAL_INSTALL) + test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)" + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-aminfo mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool mostlyclean-vti + +pdf: pdf-recursive + +pdf-am: $(PDFS) + +ps: ps-recursive + +ps-am: $(PSS) + +uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ + uninstall-libLTLIBRARIES uninstall-pdf-am \ + uninstall-pkgconfigDATA uninstall-ps-am + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-aminfo \ + clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstLTLIBRARIES ctags ctags-recursive dist dist-all \ + dist-bzip2 dist-gzip dist-info dist-lzma dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-pdf install-pdf-am install-pkgconfigDATA \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-aminfo maintainer-clean-generic \ + maintainer-clean-vti mostlyclean mostlyclean-aminfo \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + mostlyclean-vti pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-dvi-am uninstall-html-am \ + uninstall-info-am uninstall-libLTLIBRARIES uninstall-pdf-am \ + uninstall-pkgconfigDATA uninstall-ps-am + + +# No install-html or install-pdf support in automake yet +.PHONY: install-html install-pdf +install-html: +install-pdf: + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc new file mode 100644 index 0000000..c22c895 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc @@ -0,0 +1,141 @@ +# +# ==================================================================== +# +# libffi Windows Makefile +# +# +# ==================================================================== +# + +NAME=ffi-3 +VERSION=3.0.10 +TARGET=X86_WIN32 +CC=cl.exe +AS=ml.exe +RC=rc.exe +MT=mt.exe +AR="link.exe" +SO=.dll +OBJ=.obj +EXE=.exe +LA=.lib +LINK="link.exe" +PREFIX= +TOPDIR=. +CPP=cl.exe -EP +CFLAGS=-nologo -Zi -D_MD -W3 -DWIN32 -DWINNT -D_WIN32 -D_WINDOWS -D_WINNT -D_WIN32_WINNT=0x0501 -D_WIN32_IE=0x0600 -D_X86_=1 -DNDEBUG -MD -O2 -Ob2 -Oy- +LDFLAGS=/NOLOGO /MACHINE:X86 +SHFLAGS=/DLL /INCREMENTAL:NO /DEBUG /SUBSYSTEM:WINDOWS /OPT:REF +ARFLAGS=/LIB +ASFLAGS=-coff -W3 -Cx -Zm -Di386 -DQUIET -D?QUIET +RCFLAGS=/l 0x409 -DNDEBUG +INCLUDES=-I . -I .\include -I .\src\x86 +LIBS=kernel32.lib advapi32.lib shell32.lib user32.lib gdi32.lib + +VERSION_MAJOR=3 +VERSION_MINOR=1 +VERSION_PATCH=10rc + +DESTDIR=$(PREFIX) +DESTBIN=$(PREFIX)\bin +DESTLIB=$(PREFIX)\lib +DESTINC=$(PREFIX)\include +SRCDIR=$(TOPDIR)\src + +WORKDIR=$(TOPDIR)\.libs +SOLIBNAME=lib$(NAME) +LALIBNAME=libffi_convenience +STATICLIB=$(WORKDIR)\$(LALIBNAME)$(LA) + +BUILDPDB = $(WORKDIR)\$(SOLIBNAME).pdb + +HEADERS = \ + $(TOPDIR)\fficonfig.h + +FFI_HEADERS = \ + $(TOPDIR)\include\ffi.h + +OBJECTS = \ + $(SRCDIR)\closures.obj \ + $(SRCDIR)\debug.obj \ + $(SRCDIR)\java_raw_api.obj \ + $(SRCDIR)\prep_cif.obj \ + $(SRCDIR)\raw_api.obj \ + $(SRCDIR)\types.obj \ + $(SRCDIR)\x86\ffi.obj + +!IF "$(TARGET)" == "X86_WIN32" +OBJECTS = $(OBJECTS) \ + $(SRCDIR)\x86\win32.obj +ASMSRCS = \ + $(SRCDIR)\x86\win32.asm + +!ENDIF +!IF "$(TARGET)" == "X86_WIN64" +OBJECTS = $(OBJECTS) \ + $(SRCDIR)\x86\win64.obj +ASMSRCS = \ + $(SRCDIR)\x86\win64.asm + +!ENDIF + +.SUFFIXES : .S .asm + +all: $(WORKDIR) $(STATICLIB) + +.c$(OBJ): + $(CC) -c $(CFLAGS) $(INCLUDES) -Fo$@ -Fd$(WORKDIR)\$(NAME)-src $< + +.asm$(OBJ): + $(AS) -c $(ASFLAGS) /Fo $@ $< + +.S.asm: + $(CPP) $(CFLAGS) $(INCLUDES) $< >$@ + +.rc.res: + $(RC) $(RCFLAGS) /fo $@ $< + +$(WORKDIR) : + -@if not exist "$(WORKDIR)\$(NULL)" mkdir $(WORKDIR) + +$(HEADERS) : + -@if not exist $(HEADERS) copy $(HEADERS)w $(HEADERS) + +$(FFI_HEADERS) : + -@if not exist $(FFI_HEADERS) copy $(FFI_HEADERS).vc $(FFI_HEADERS) + +$(STATICLIB): $(WORKDIR) $(FFI_HEADERS) $(HEADERS) $(ASMSRCS) $(OBJECTS) + $(AR) $(ARFLAGS) $(LDFLAGS) /out:$(STATICLIB) @<< + $(OBJECTS) +<< + + +!IF !DEFINED(PREFIX) || "$(PREFIX)" == "" + +install: + @echo ERROR: You must define installation PREFIX=destination + +!ELSE + +install: all + -@xcopy "$(TOPDIR)\include\*.h" "$(DESTINC)\" /Y /Q + -@xcopy "$(SRCDIR)\x86\ffitarget.h" "$(DESTINC)\" /Y /Q + -@xcopy "$(WORKDIR)\$(LALIBNAME)$(LA)" "$(DESTLIB)\" /Y /Q + -@xcopy "$(WORKDIR)\$(SOLIBNAME)$(LA)" "$(DESTLIB)\" /Y /Q + -@xcopy "$(WORKDIR)\$(SOLIBNAME)$(SO)" "$(DESTBIN)\" /Y /Q + -@xcopy "$(WORKDIR)\$(SOLIBNAME).pdb" "$(DESTLIB)\" /Y /Q + +!ENDIF + +clean: + -@del /Q $(OBJECTS) 2>NUL + -@del /Q $(RESOURCES) 2>NUL + -@del /Q $(ASMSRCS) 2>NUL + -@del /Q /S $(WORKDIR) 2>NUL + +distclean: clean + -@del /Q $(HEADERS) 2>NUL + -@del /Q $(TOPDIR)\include\ffi.h 2>NUL + -@del /Q $(TOPDIR)\fficonfig.h 2>NUL + -@del /Q $(TOPDIR)\Makefile.vc 2>NUL + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc64 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc64 new file mode 100644 index 0000000..3e99baa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc64 @@ -0,0 +1,141 @@ +# +# ==================================================================== +# +# libffi Windows Makefile +# +# +# ==================================================================== +# + +NAME=ffi-3 +VERSION=3.0.10 +TARGET=X86_WIN64 +CC=cl.exe +AS=ml64.exe +RC=rc.exe +MT=mt.exe +AR="link.exe" +SO=.dll +OBJ=.obj +EXE=.exe +LA=.lib +LINK="link.exe" +PREFIX= +TOPDIR=. +CPP=cl.exe -EP +CFLAGS=-nologo -Zi -D_MD -W3 -DWIN64 -DWINNT -D_WIN32 -D_WINDOWS -D_WINNT -D_WIN32_WINNT=0x0501 -D_WIN32_IE=0x0600 -D_AMD64_=1 -DNDEBUG -MD -O2 -Ob2 -Oy- +LDFLAGS=/NOLOGO /MACHINE:X64 +SHFLAGS=/DLL /INCREMENTAL:NO /DEBUG /SUBSYSTEM:WINDOWS /OPT:REF +ARFLAGS=/LIB +ASFLAGS=-coff -W3 -Cx -Zm -Di386 -DQUIET -D?QUIET +RCFLAGS=/l 0x409 -DNDEBUG +INCLUDES=-I . -I .\include -I .\src\x86 +LIBS=kernel32.lib advapi32.lib shell32.lib user32.lib gdi32.lib + +VERSION_MAJOR=3 +VERSION_MINOR=1 +VERSION_PATCH=10rc + +DESTDIR=$(PREFIX) +DESTBIN=$(PREFIX)\bin +DESTLIB=$(PREFIX)\lib +DESTINC=$(PREFIX)\include +SRCDIR=$(TOPDIR)\src + +WORKDIR=$(TOPDIR)\.libs +SOLIBNAME=lib$(NAME) +LALIBNAME=libffi_convenience +STATICLIB=$(WORKDIR)\$(LALIBNAME)$(LA) + +BUILDPDB = $(WORKDIR)\$(SOLIBNAME).pdb + +HEADERS = \ + $(TOPDIR)\fficonfig.h + +FFI_HEADERS = \ + $(TOPDIR)\include\ffi.h + +OBJECTS = \ + $(SRCDIR)\closures.obj \ + $(SRCDIR)\debug.obj \ + $(SRCDIR)\java_raw_api.obj \ + $(SRCDIR)\prep_cif.obj \ + $(SRCDIR)\raw_api.obj \ + $(SRCDIR)\types.obj \ + $(SRCDIR)\x86\ffi.obj + +!IF "$(TARGET)" == "X86_WIN32" +OBJECTS = $(OBJECTS) \ + $(SRCDIR)\x86\win32.obj +ASMSRCS = \ + $(SRCDIR)\x86\win32.asm + +!ENDIF +!IF "$(TARGET)" == "X86_WIN64" +OBJECTS = $(OBJECTS) \ + $(SRCDIR)\x86\win64.obj +ASMSRCS = \ + $(SRCDIR)\x86\win64.asm + +!ENDIF + +.SUFFIXES : .S .asm + +all: $(WORKDIR) $(STATICLIB) + +.c$(OBJ): + $(CC) -c $(CFLAGS) $(INCLUDES) -Fo$@ -Fd$(WORKDIR)\$(NAME)-src $< + +.asm$(OBJ): + $(AS) -c $(ASFLAGS) /Fo $@ $< + +.S.asm: + $(CPP) $(CFLAGS) $(INCLUDES) $< >$@ + +.rc.res: + $(RC) $(RCFLAGS) /fo $@ $< + +$(WORKDIR) : + -@if not exist "$(WORKDIR)\$(NULL)" mkdir $(WORKDIR) + +$(HEADERS) : + -@if not exist $(HEADERS) copy $(HEADERS)w $(HEADERS) + +$(FFI_HEADERS) : + -@if not exist $(FFI_HEADERS) copy $(FFI_HEADERS).vc64 $(FFI_HEADERS) + +$(STATICLIB): $(WORKDIR) $(FFI_HEADERS) $(HEADERS) $(ASMSRCS) $(OBJECTS) + $(AR) $(ARFLAGS) $(LDFLAGS) /out:$(STATICLIB) @<< + $(OBJECTS) +<< + + +!IF !DEFINED(PREFIX) || "$(PREFIX)" == "" + +install: + @echo ERROR: You must define installation PREFIX=destination + +!ELSE + +install: all + -@xcopy "$(TOPDIR)\include\*.h" "$(DESTINC)\" /Y /Q + -@xcopy "$(SRCDIR)\x86\ffitarget.h" "$(DESTINC)\" /Y /Q + -@xcopy "$(WORKDIR)\$(LALIBNAME)$(LA)" "$(DESTLIB)\" /Y /Q + -@xcopy "$(WORKDIR)\$(SOLIBNAME)$(LA)" "$(DESTLIB)\" /Y /Q + -@xcopy "$(WORKDIR)\$(SOLIBNAME)$(SO)" "$(DESTBIN)\" /Y /Q + -@xcopy "$(WORKDIR)\$(SOLIBNAME).pdb" "$(DESTLIB)\" /Y /Q + +!ENDIF + +clean: + -@del /Q $(OBJECTS) 2>NUL + -@del /Q $(RESOURCES) 2>NUL + -@del /Q $(ASMSRCS) 2>NUL + -@del /Q /S $(WORKDIR) 2>NUL + +distclean: clean + -@del /Q $(HEADERS) 2>NUL + -@del /Q $(TOPDIR)\include\ffi.h 2>NUL + -@del /Q $(TOPDIR)\fficonfig.h 2>NUL + -@del /Q $(TOPDIR)\Makefile.vc 2>NUL + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/README b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/README new file mode 100644 index 0000000..297c044 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/README @@ -0,0 +1,342 @@ +Status +====== + +libffi-3.0.10 was released on August 23, 2011. Check the libffi web +page for updates: . + + +What is libffi? +=============== + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the "calling +convention". The "calling convention" is essentially a set of +assumptions made by the compiler about where function arguments will +be found on entry to a function. A "calling convention" also specifies +where the return value for a function is found. + +Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call +a given function. Libffi can be used in such programs to provide a +bridge from the interpreter program to compiled code. + +The libffi library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run +time. + +FFI stands for Foreign Function Interface. A foreign function +interface is the popular name for the interface that allows code +written in one language to call code written in another language. The +libffi library really only provides the lowest, machine dependent +layer of a fully featured foreign function interface. A layer must +exist above libffi that handles type conversions for values passed +between the two languages. + + +Supported Platforms +=================== + +Libffi has been ported to many different platforms. +For specific configuration details and testing status, please +refer to the wiki page here: + + http://www.moxielogic.org/wiki/index.php?title=Libffi_3.0.10 + +At the time of release, the following basic configurations have been +tested: + +|--------------+------------------| +| Architecture | Operating System | +|--------------+------------------| +| Alpha | Linux | +| Alpha | Tru64 | +| ARM | Linux | +| ARM | iOS | +| AVR32 | Linux | +| HPPA | HPUX | +| IA-64 | Linux | +| M68K | RTEMS | +| MIPS | IRIX | +| MIPS | Linux | +| MIPS | RTEMS | +| MIPS64 | Linux | +| PowerPC | Linux | +| PowerPC | Mac OSX | +| PowerPC | FreeBSD | +| PowerPC64 | Linux | +| S390 | Linux | +| S390X | Linux | +| SPARC | Linux | +| SPARC | Solaris | +| SPARC64 | Linux | +| SPARC64 | FreeBSD | +| X86 | FreeBSD | +| X86 | Interix | +| X86 | kFreeBSD | +| X86 | Linux | +| X86 | Mac OSX | +| X86 | OpenBSD | +| X86 | OS/2 | +| X86 | Solaris | +| X86 | Windows/Cygwin | +| X86 | Windows/MingW | +| X86-64 | FreeBSD | +| X86-64 | Linux | +| X86-64 | OpenBSD | +| X86-64 | Windows/MingW | +|--------------+------------------| + +Please send additional platform test results to +libffi-discuss@sourceware.org and feel free to update the wiki page +above. + +Installing libffi +================= + +First you must configure the distribution for your particular +system. Go to the directory you wish to build libffi in and run the +"configure" program found in the root directory of the libffi source +distribution. + +You may want to tell configure where to install the libffi library and +header files. To do that, use the --prefix configure switch. Libffi +will install under /usr/local by default. + +If you want to enable extra run-time debugging checks use the the +--enable-debug configure switch. This is useful when your program dies +mysteriously while using libffi. + +Another useful configure switch is --enable-purify-safety. Using this +will add some extra code which will suppress certain warnings when you +are using Purify with libffi. Only use this switch when using +Purify, as it will slow down the library. + +It's also possible to build libffi on Windows platforms with +Microsoft's Visual C++ compiler. In this case, use the msvcc.sh +wrapper script during configuration like so: + +path/to/configure CC=path/to/msvcc.sh LD=link CPP=\"cl -nologo -EP\" + +For 64-bit Windows builds, use CC="path/to/msvcc.sh -m64". +You may also need to specify --build appropriately. When building with MSVC +under a MingW environment, you may need to remove the line in configure +that sets 'fix_srcfile_path' to a 'cygpath' command. ('cygpath' is not +present in MingW, and is not required when using MingW-style paths.) + +For iOS builds, refer to the build-ios.sh script for guidance. + +Configure has many other options. Use "configure --help" to see them all. + +Once configure has finished, type "make". Note that you must be using +GNU make. You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. + +To ensure that libffi is working as advertised, type "make check". +This will require that you have DejaGNU installed. + +To install the library and header files, type "make install". + + +History +======= + +See the ChangeLog files for details. + +3.0.10 Aug-23-11 + Add support for Apple's iOS. + Add support for ARM VFP ABI. + Add RTEMS support for MIPS and M68K. + Fix instruction cache clearing problems on + ARM and SPARC. + Fix the N64 build on mips-sgi-irix6.5. + Enable builds with Microsoft's compiler. + Enable x86 builds with Oracle's Solaris compiler. + Fix support for calling code compiled with Oracle's Sparc + Solaris compiler. + Testsuite fixes for Tru64 Unix. + Additional platform support. + +3.0.9 Dec-31-09 + Add AVR32 and win64 ports. Add ARM softfp support. + Many fixes for AIX, Solaris, HP-UX, *BSD. + Several PowerPC and x86-64 bug fixes. + Build DLL for windows. + +3.0.8 Dec-19-08 + Add *BSD, BeOS, and PA-Linux support. + +3.0.7 Nov-11-08 + Fix for ppc FreeBSD. + (thanks to Andreas Tobler) + +3.0.6 Jul-17-08 + Fix for closures on sh. + Mark the sh/sh64 stack as non-executable. + (both thanks to Kaz Kojima) + +3.0.5 Apr-3-08 + Fix libffi.pc file. + Fix #define ARM for IcedTea users. + Fix x86 closure bug. + +3.0.4 Feb-24-08 + Fix x86 OpenBSD configury. + +3.0.3 Feb-22-08 + Enable x86 OpenBSD thanks to Thomas Heller, and + x86-64 FreeBSD thanks to Björn König and Andreas Tobler. + Clean up test instruction in README. + +3.0.2 Feb-21-08 + Improved x86 FreeBSD support. + Thanks to Björn König. + +3.0.1 Feb-15-08 + Fix instruction cache flushing bug on MIPS. + Thanks to David Daney. + +3.0.0 Feb-15-08 + Many changes, mostly thanks to the GCC project. + Cygnus Solutions is now Red Hat. + + [10 years go by...] + +1.20 Oct-5-98 + Raffaele Sena produces ARM port. + +1.19 Oct-5-98 + Fixed x86 long double and long long return support. + m68k bug fixes from Andreas Schwab. + Patch for DU assembler compatibility for the Alpha from Richard + Henderson. + +1.18 Apr-17-98 + Bug fixes and MIPS configuration changes. + +1.17 Feb-24-98 + Bug fixes and m68k port from Andreas Schwab. PowerPC port from + Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. + +1.16 Feb-11-98 + Richard Henderson produces Alpha port. + +1.15 Dec-4-97 + Fixed an n32 ABI bug. New libtool, auto* support. + +1.14 May-13-97 + libtool is now used to generate shared and static libraries. + Fixed a minor portability problem reported by Russ McManus + . + +1.13 Dec-2-96 + Added --enable-purify-safety to keep Purify from complaining + about certain low level code. + Sparc fix for calling functions with < 6 args. + Linux x86 a.out fix. + +1.12 Nov-22-96 + Added missing ffi_type_void, needed for supporting void return + types. Fixed test case for non MIPS machines. Cygnus Support + is now Cygnus Solutions. + +1.11 Oct-30-96 + Added notes about GNU make. + +1.10 Oct-29-96 + Added configuration fix for non GNU compilers. + +1.09 Oct-29-96 + Added --enable-debug configure switch. Clean-ups based on LCLint + feedback. ffi_mips.h is always installed. Many configuration + fixes. Fixed ffitest.c for sparc builds. + +1.08 Oct-15-96 + Fixed n32 problem. Many clean-ups. + +1.07 Oct-14-96 + Gordon Irlam rewrites v8.S again. Bug fixes. + +1.06 Oct-14-96 + Gordon Irlam improved the sparc port. + +1.05 Oct-14-96 + Interface changes based on feedback. + +1.04 Oct-11-96 + Sparc port complete (modulo struct passing bug). + +1.03 Oct-10-96 + Passing struct args, and returning struct values works for + all architectures/calling conventions. Expanded tests. + +1.02 Oct-9-96 + Added SGI n32 support. Fixed bugs in both o32 and Linux support. + Added "make test". + +1.01 Oct-8-96 + Fixed float passing bug in mips version. Restructured some + of the code. Builds cleanly with SGI tools. + +1.00 Oct-7-96 + First release. No public announcement. + + +Authors & Credits +================= + +libffi was originally written by Anthony Green . + +The developers of the GNU Compiler Collection project have made +innumerable valuable contributions. See the ChangeLog file for +details. + +Some of the ideas behind libffi were inspired by Gianni Mariani's free +gencall library for Silicon Graphics machines. + +The closure mechanism was designed and implemented by Kresten Krab +Thorup. + +Major processor architecture ports were contributed by the following +developers: + +alpha Richard Henderson +arm Raffaele Sena +cris Simon Posnjak, Hans-Peter Nilsson +frv Anthony Green +ia64 Hans Boehm +m32r Kazuhiro Inaoka +m68k Andreas Schwab +mips Anthony Green, Casey Marshall +mips64 David Daney +pa Randolph Chung, Dave Anglin, Andreas Tobler +powerpc Geoffrey Keating, Andreas Tobler, + David Edelsohn, John Hornkvist +powerpc64 Jakub Jelinek +s390 Gerhard Tonn, Ulrich Weigand +sh Kaz Kojima +sh64 Kaz Kojima +sparc Anthony Green, Gordon Irlam +x86 Anthony Green, Jon Beniston +x86-64 Bo Thorsen + +Jesper Skov and Andrew Haley both did more than their fair share of +stepping through the code and tracking down bugs. + +Thanks also to Tom Tromey for bug fixes, documentation and +configuration help. + +Thanks to Jim Blandy, who provided some useful feedback on the libffi +interface. + +Andreas Tobler has done a tremendous amount of work on the testsuite. + +Alex Oliva solved the executable page problem for SElinux. + +The list above is almost certainly incomplete and inaccurate. I'm +happy to make corrections or additions upon request. + +If you have a problem, or have found a bug, please send a note to the +author at green@moxielogic.com, or the project mailing list at +libffi-discuss@sourceware.org. diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/acinclude.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/acinclude.m4 new file mode 100644 index 0000000..3e8f8ba --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/acinclude.m4 @@ -0,0 +1,92 @@ +# mmap(2) blacklisting. Some platforms provide the mmap library routine +# but don't support all of the features we need from it. +AC_DEFUN([AC_FUNC_MMAP_BLACKLIST], +[ +AC_CHECK_HEADER([sys/mman.h], + [libffi_header_sys_mman_h=yes], [libffi_header_sys_mman_h=no]) +AC_CHECK_FUNC([mmap], [libffi_func_mmap=yes], [libffi_func_mmap=no]) +if test "$libffi_header_sys_mman_h" != yes \ + || test "$libffi_func_mmap" != yes; then + ac_cv_func_mmap_file=no + ac_cv_func_mmap_dev_zero=no + ac_cv_func_mmap_anon=no +else + AC_CACHE_CHECK([whether read-only mmap of a plain file works], + ac_cv_func_mmap_file, + [# Add a system to this blacklist if + # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a + # memory area containing the same data that you'd get if you applied + # read() to the same fd. The only system known to have a problem here + # is VMS, where text files have record structure. + case "$host_os" in + vms* | ultrix*) + ac_cv_func_mmap_file=no ;; + *) + ac_cv_func_mmap_file=yes;; + esac]) + AC_CACHE_CHECK([whether mmap from /dev/zero works], + ac_cv_func_mmap_dev_zero, + [# Add a system to this blacklist if it has mmap() but /dev/zero + # does not exist, or if mmapping /dev/zero does not give anonymous + # zeroed pages with both the following properties: + # 1. If you map N consecutive pages in with one call, and then + # unmap any subset of those pages, the pages that were not + # explicitly unmapped remain accessible. + # 2. If you map two adjacent blocks of memory and then unmap them + # both at once, they must both go away. + # Systems known to be in this category are Windows (all variants), + # VMS, and Darwin. + case "$host_os" in + vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00) + ac_cv_func_mmap_dev_zero=no ;; + *) + ac_cv_func_mmap_dev_zero=yes;; + esac]) + + # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for. + AC_CACHE_CHECK([for MAP_ANON(YMOUS)], ac_cv_decl_map_anon, + [AC_TRY_COMPILE( +[#include +#include +#include + +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif +], +[int n = MAP_ANONYMOUS;], + ac_cv_decl_map_anon=yes, + ac_cv_decl_map_anon=no)]) + + if test $ac_cv_decl_map_anon = no; then + ac_cv_func_mmap_anon=no + else + AC_CACHE_CHECK([whether mmap with MAP_ANON(YMOUS) works], + ac_cv_func_mmap_anon, + [# Add a system to this blacklist if it has mmap() and MAP_ANON or + # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) + # doesn't give anonymous zeroed pages with the same properties listed + # above for use of /dev/zero. + # Systems known to be in this category are Windows, VMS, and SCO Unix. + case "$host_os" in + vms* | cygwin* | pe | mingw* | sco* | udk* ) + ac_cv_func_mmap_anon=no ;; + *) + ac_cv_func_mmap_anon=yes;; + esac]) + fi +fi + +if test $ac_cv_func_mmap_file = yes; then + AC_DEFINE(HAVE_MMAP_FILE, 1, + [Define if read-only mmap of a plain file works.]) +fi +if test $ac_cv_func_mmap_dev_zero = yes; then + AC_DEFINE(HAVE_MMAP_DEV_ZERO, 1, + [Define if mmap of /dev/zero works.]) +fi +if test $ac_cv_func_mmap_anon = yes; then + AC_DEFINE(HAVE_MMAP_ANON, 1, + [Define if mmap with MAP_ANON(YMOUS) works.]) +fi +]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/aclocal.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/aclocal.m4 new file mode 100644 index 0000000..6132c39 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/aclocal.m4 @@ -0,0 +1,1873 @@ +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, +[m4_warning([this file was generated for autoconf 2.68. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*- +# +# Copyright (C) 1999-2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Thomas Tanner, 1999 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 18 LTDL_INIT + +# LT_CONFIG_LTDL_DIR(DIRECTORY, [LTDL-MODE]) +# ------------------------------------------ +# DIRECTORY contains the libltdl sources. It is okay to call this +# function multiple times, as long as the same DIRECTORY is always given. +AC_DEFUN([LT_CONFIG_LTDL_DIR], +[AC_BEFORE([$0], [LTDL_INIT]) +_$0($*) +])# LT_CONFIG_LTDL_DIR + +# We break this out into a separate macro, so that we can call it safely +# internally without being caught accidentally by the sed scan in libtoolize. +m4_defun([_LT_CONFIG_LTDL_DIR], +[dnl remove trailing slashes +m4_pushdef([_ARG_DIR], m4_bpatsubst([$1], [/*$])) +m4_case(_LTDL_DIR, + [], [dnl only set lt_ltdl_dir if _ARG_DIR is not simply `.' + m4_if(_ARG_DIR, [.], + [], + [m4_define([_LTDL_DIR], _ARG_DIR) + _LT_SHELL_INIT([lt_ltdl_dir=']_ARG_DIR['])])], + [m4_if(_ARG_DIR, _LTDL_DIR, + [], + [m4_fatal([multiple libltdl directories: `]_LTDL_DIR[', `]_ARG_DIR['])])]) +m4_popdef([_ARG_DIR]) +])# _LT_CONFIG_LTDL_DIR + +# Initialise: +m4_define([_LTDL_DIR], []) + + +# _LT_BUILD_PREFIX +# ---------------- +# If Autoconf is new enough, expand to `${top_build_prefix}', otherwise +# to `${top_builddir}/'. +m4_define([_LT_BUILD_PREFIX], +[m4_ifdef([AC_AUTOCONF_VERSION], + [m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.62]), + [-1], [m4_ifdef([_AC_HAVE_TOP_BUILD_PREFIX], + [${top_build_prefix}], + [${top_builddir}/])], + [${top_build_prefix}])], + [${top_builddir}/])[]dnl +]) + + +# LTDL_CONVENIENCE +# ---------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. LIBLTDL will be prefixed with +# '${top_build_prefix}' if available, otherwise with '${top_builddir}/', +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_build_prefix, top_builddir, and top_srcdir appropriately +# in your Makefiles. +AC_DEFUN([LTDL_CONVENIENCE], +[AC_BEFORE([$0], [LTDL_INIT])dnl +dnl Although the argument is deprecated and no longer documented, +dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one +dnl here make sure it is the same as any other declaration of libltdl's +dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +_$0() +])# LTDL_CONVENIENCE + +# AC_LIBLTDL_CONVENIENCE accepted a directory argument in older libtools, +# now we have LT_CONFIG_LTDL_DIR: +AU_DEFUN([AC_LIBLTDL_CONVENIENCE], +[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_CONVENIENCE]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBLTDL_CONVENIENCE], []) + + +# _LTDL_CONVENIENCE +# ----------------- +# Code shared by LTDL_CONVENIENCE and LTDL_INIT([convenience]). +m4_defun([_LTDL_CONVENIENCE], +[case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; +esac +LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdlc.la" +LTDLDEPS=$LIBLTDL +LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}" + +AC_SUBST([LIBLTDL]) +AC_SUBST([LTDLDEPS]) +AC_SUBST([LTDLINCL]) + +# For backwards non-gettext consistent compatibility... +INCLTDL="$LTDLINCL" +AC_SUBST([INCLTDL]) +])# _LTDL_CONVENIENCE + + +# LTDL_INSTALLABLE +# ---------------- +# sets LIBLTDL to the link flags for the libltdl installable library +# and LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called from here. If an installed libltdl +# is not found, LIBLTDL will be prefixed with '${top_build_prefix}' if +# available, otherwise with '${top_builddir}/', and LTDLINCL will be +# prefixed with '${top_srcdir}/' (note the single quotes!). If your +# package is not flat and you're not using automake, define top_build_prefix, +# top_builddir, and top_srcdir appropriately in your Makefiles. +# In the future, this macro may have to be called after LT_INIT. +AC_DEFUN([LTDL_INSTALLABLE], +[AC_BEFORE([$0], [LTDL_INIT])dnl +dnl Although the argument is deprecated and no longer documented, +dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one +dnl here make sure it is the same as any other declaration of libltdl's +dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +_$0() +])# LTDL_INSTALLABLE + +# AC_LIBLTDL_INSTALLABLE accepted a directory argument in older libtools, +# now we have LT_CONFIG_LTDL_DIR: +AU_DEFUN([AC_LIBLTDL_INSTALLABLE], +[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_INSTALLABLE]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBLTDL_INSTALLABLE], []) + + +# _LTDL_INSTALLABLE +# ----------------- +# Code shared by LTDL_INSTALLABLE and LTDL_INIT([installable]). +m4_defun([_LTDL_INSTALLABLE], +[if test -f $prefix/lib/libltdl.la; then + lt_save_LDFLAGS="$LDFLAGS" + LDFLAGS="-L$prefix/lib $LDFLAGS" + AC_CHECK_LIB([ltdl], [lt_dlinit], [lt_lib_ltdl=yes]) + LDFLAGS="$lt_save_LDFLAGS" + if test x"${lt_lib_ltdl-no}" = xyes; then + if test x"$enable_ltdl_install" != xyes; then + # Don't overwrite $prefix/lib/libltdl.la without --enable-ltdl-install + AC_MSG_WARN([not overwriting libltdl at $prefix, force with `--enable-ltdl-install']) + enable_ltdl_install=no + fi + elif test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + fi +fi + +# If configure.ac declared an installable ltdl, and the user didn't override +# with --disable-ltdl-install, we will install the shipped libltdl. +case $enable_ltdl_install in + no) ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLDEPS= + LTDLINCL= + ;; + *) enable_ltdl_install=yes + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdl.la" + LTDLDEPS=$LIBLTDL + LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}" + ;; +esac + +AC_SUBST([LIBLTDL]) +AC_SUBST([LTDLDEPS]) +AC_SUBST([LTDLINCL]) + +# For backwards non-gettext consistent compatibility... +INCLTDL="$LTDLINCL" +AC_SUBST([INCLTDL]) +])# LTDL_INSTALLABLE + + +# _LTDL_MODE_DISPATCH +# ------------------- +m4_define([_LTDL_MODE_DISPATCH], +[dnl If _LTDL_DIR is `.', then we are configuring libltdl itself: +m4_if(_LTDL_DIR, [], + [], + dnl if _LTDL_MODE was not set already, the default value is `subproject': + [m4_case(m4_default(_LTDL_MODE, [subproject]), + [subproject], [AC_CONFIG_SUBDIRS(_LTDL_DIR) + _LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"])], + [nonrecursive], [_LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"; lt_libobj_prefix="$lt_ltdl_dir/"])], + [recursive], [], + [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])dnl +dnl Be careful not to expand twice: +m4_define([$0], []) +])# _LTDL_MODE_DISPATCH + + +# _LT_LIBOBJ(MODULE_NAME) +# ----------------------- +# Like AC_LIBOBJ, except that MODULE_NAME goes into _LT_LIBOBJS instead +# of into LIBOBJS. +AC_DEFUN([_LT_LIBOBJ], [ + m4_pattern_allow([^_LT_LIBOBJS$]) + _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" +])# _LT_LIBOBJS + + +# LTDL_INIT([OPTIONS]) +# -------------------- +# Clients of libltdl can use this macro to allow the installer to +# choose between a shipped copy of the ltdl sources or a preinstalled +# version of the library. If the shipped ltdl sources are not in a +# subdirectory named libltdl, the directory name must be given by +# LT_CONFIG_LTDL_DIR. +AC_DEFUN([LTDL_INIT], +[dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +dnl We need to keep our own list of libobjs separate from our parent project, +dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while +dnl we look for our own LIBOBJs. +m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) +m4_pushdef([AC_LIBSOURCES]) + +dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: +m4_if(_LTDL_MODE, [], + [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) + m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], + [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) + +AC_ARG_WITH([included_ltdl], + [AS_HELP_STRING([--with-included-ltdl], + [use the GNU ltdl sources included here])]) + +if test "x$with_included_ltdl" != xyes; then + # We are not being forced to use the included libltdl sources, so + # decide whether there is a useful installed version we can use. + AC_CHECK_HEADER([ltdl.h], + [AC_CHECK_DECL([lt_dlinterface_register], + [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], + [with_included_ltdl=no], + [with_included_ltdl=yes])], + [with_included_ltdl=yes], + [AC_INCLUDES_DEFAULT + #include ])], + [with_included_ltdl=yes], + [AC_INCLUDES_DEFAULT] + ) +fi + +dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE +dnl was called yet, then for old times' sake, we assume libltdl is in an +dnl eponymous directory: +AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) + +AC_ARG_WITH([ltdl_include], + [AS_HELP_STRING([--with-ltdl-include=DIR], + [use the ltdl headers installed in DIR])]) + +if test -n "$with_ltdl_include"; then + if test -f "$with_ltdl_include/ltdl.h"; then : + else + AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) + fi +else + with_ltdl_include=no +fi + +AC_ARG_WITH([ltdl_lib], + [AS_HELP_STRING([--with-ltdl-lib=DIR], + [use the libltdl.la installed in DIR])]) + +if test -n "$with_ltdl_lib"; then + if test -f "$with_ltdl_lib/libltdl.la"; then : + else + AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) + fi +else + with_ltdl_lib=no +fi + +case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in + ,yes,no,no,) + m4_case(m4_default(_LTDL_TYPE, [convenience]), + [convenience], [_LTDL_CONVENIENCE], + [installable], [_LTDL_INSTALLABLE], + [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) + ;; + ,no,no,no,) + # If the included ltdl is not to be used, then use the + # preinstalled libltdl we found. + AC_DEFINE([HAVE_LTDL], [1], + [Define this if a modern libltdl is already installed]) + LIBLTDL=-lltdl + LTDLDEPS= + LTDLINCL= + ;; + ,no*,no,*) + AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) + ;; + *) with_included_ltdl=no + LIBLTDL="-L$with_ltdl_lib -lltdl" + LTDLDEPS= + LTDLINCL="-I$with_ltdl_include" + ;; +esac +INCLTDL="$LTDLINCL" + +# Report our decision... +AC_MSG_CHECKING([where to find libltdl headers]) +AC_MSG_RESULT([$LTDLINCL]) +AC_MSG_CHECKING([where to find libltdl library]) +AC_MSG_RESULT([$LIBLTDL]) + +_LTDL_SETUP + +dnl restore autoconf definition. +m4_popdef([AC_LIBOBJ]) +m4_popdef([AC_LIBSOURCES]) + +AC_CONFIG_COMMANDS_PRE([ + _ltdl_libobjs= + _ltdl_ltlibobjs= + if test -n "$_LT_LIBOBJS"; then + # Remove the extension. + _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do + _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" + _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" + done + fi + AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) + AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) +]) + +# Only expand once: +m4_define([LTDL_INIT]) +])# LTDL_INIT + +# Old names: +AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) +AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) +AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIB_LTDL], []) +dnl AC_DEFUN([AC_WITH_LTDL], []) +dnl AC_DEFUN([LT_WITH_LTDL], []) + + +# _LTDL_SETUP +# ----------- +# Perform all the checks necessary for compilation of the ltdl objects +# -- including compiler checks and header checks. This is a public +# interface mainly for the benefit of libltdl's own configure.ac, most +# other users should call LTDL_INIT instead. +AC_DEFUN([_LTDL_SETUP], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_SYS_MODULE_EXT])dnl +AC_REQUIRE([LT_SYS_MODULE_PATH])dnl +AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl +AC_REQUIRE([LT_LIB_DLLOAD])dnl +AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl +AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl +AC_REQUIRE([gl_FUNC_ARGZ])dnl + +m4_require([_LT_CHECK_OBJDIR])dnl +m4_require([_LT_HEADER_DLFCN])dnl +m4_require([_LT_CHECK_DLPREOPEN])dnl +m4_require([_LT_DECL_SED])dnl + +dnl Don't require this, or it will be expanded earlier than the code +dnl that sets the variables it relies on: +_LT_ENABLE_INSTALL + +dnl _LTDL_MODE specific code must be called at least once: +_LTDL_MODE_DISPATCH + +# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS +# the user used. This is so that ltdl.h can pick up the parent projects +# config.h file, The first file in AC_CONFIG_HEADERS must contain the +# definitions required by ltdl.c. +# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). +AC_CONFIG_COMMANDS_PRE([dnl +m4_pattern_allow([^LT_CONFIG_H$])dnl +m4_ifset([AH_HEADER], + [LT_CONFIG_H=AH_HEADER], + [m4_ifset([AC_LIST_HEADERS], + [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], + [])])]) +AC_SUBST([LT_CONFIG_H]) + +AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], + [], [], [AC_INCLUDES_DEFAULT]) + +AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) +AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) + +m4_pattern_allow([LT_LIBEXT])dnl +AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) + +name= +eval "lt_libprefix=\"$libname_spec\"" +m4_pattern_allow([LT_LIBPREFIX])dnl +AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) + +name=ltdl +eval "LTDLOPEN=\"$libname_spec\"" +AC_SUBST([LTDLOPEN]) +])# _LTDL_SETUP + + +# _LT_ENABLE_INSTALL +# ------------------ +m4_define([_LT_ENABLE_INSTALL], +[AC_ARG_ENABLE([ltdl-install], + [AS_HELP_STRING([--enable-ltdl-install], [install libltdl])]) + +case ,${enable_ltdl_install},${enable_ltdl_convenience} in + *yes*) ;; + *) enable_ltdl_convenience=yes ;; +esac + +m4_ifdef([AM_CONDITIONAL], +[AM_CONDITIONAL(INSTALL_LTDL, test x"${enable_ltdl_install-no}" != xno) + AM_CONDITIONAL(CONVENIENCE_LTDL, test x"${enable_ltdl_convenience-no}" != xno)]) +])# _LT_ENABLE_INSTALL + + +# LT_SYS_DLOPEN_DEPLIBS +# --------------------- +AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_CACHE_CHECK([whether deplibs are loaded by dlopen], + [lt_cv_sys_dlopen_deplibs], + [# PORTME does your system automatically load deplibs for dlopen? + # or its logical equivalent (e.g. shl_load for HP-UX < 11) + # For now, we just catch OSes we know something about -- in the + # future, we'll try test this programmatically. + lt_cv_sys_dlopen_deplibs=unknown + case $host_os in + aix3*|aix4.1.*|aix4.2.*) + # Unknown whether this is true for these versions of AIX, but + # we want this `case' here to explicitly catch those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + aix[[4-9]]*) + lt_cv_sys_dlopen_deplibs=yes + ;; + amigaos*) + case $host_cpu in + powerpc) + lt_cv_sys_dlopen_deplibs=no + ;; + esac + ;; + darwin*) + # Assuming the user has installed a libdl from somewhere, this is true + # If you are looking for one http://www.opendarwin.org/projects/dlcompat + lt_cv_sys_dlopen_deplibs=yes + ;; + freebsd* | dragonfly*) + lt_cv_sys_dlopen_deplibs=yes + ;; + gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) + # GNU and its variants, using gnu ld.so (Glibc) + lt_cv_sys_dlopen_deplibs=yes + ;; + hpux10*|hpux11*) + lt_cv_sys_dlopen_deplibs=yes + ;; + interix*) + lt_cv_sys_dlopen_deplibs=yes + ;; + irix[[12345]]*|irix6.[[01]]*) + # Catch all versions of IRIX before 6.2, and indicate that we don't + # know how it worked for any of those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + irix*) + # The case above catches anything before 6.2, and it's known that + # at 6.2 and later dlopen does load deplibs. + lt_cv_sys_dlopen_deplibs=yes + ;; + netbsd*) + lt_cv_sys_dlopen_deplibs=yes + ;; + openbsd*) + lt_cv_sys_dlopen_deplibs=yes + ;; + osf[[1234]]*) + # dlopen did load deplibs (at least at 4.x), but until the 5.x series, + # it did *not* use an RPATH in a shared library to find objects the + # library depends on, so we explicitly say `no'. + lt_cv_sys_dlopen_deplibs=no + ;; + osf5.0|osf5.0a|osf5.1) + # dlopen *does* load deplibs and with the right loader patch applied + # it even uses RPATH in a shared library to search for shared objects + # that the library depends on, but there's no easy way to know if that + # patch is installed. Since this is the case, all we can really + # say is unknown -- it depends on the patch being installed. If + # it is, this changes to `yes'. Without it, it would be `no'. + lt_cv_sys_dlopen_deplibs=unknown + ;; + osf*) + # the two cases above should catch all versions of osf <= 5.1. Read + # the comments above for what we know about them. + # At > 5.1, deplibs are loaded *and* any RPATH in a shared library + # is used to find them so we can finally say `yes'. + lt_cv_sys_dlopen_deplibs=yes + ;; + qnx*) + lt_cv_sys_dlopen_deplibs=yes + ;; + solaris*) + lt_cv_sys_dlopen_deplibs=yes + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + esac + ]) +if test "$lt_cv_sys_dlopen_deplibs" != yes; then + AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], + [Define if the OS needs help to load dependent libraries for dlopen().]) +fi +])# LT_SYS_DLOPEN_DEPLIBS + +# Old name: +AU_ALIAS([AC_LTDL_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], []) + + +# LT_SYS_MODULE_EXT +# ----------------- +AC_DEFUN([LT_SYS_MODULE_EXT], +[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([which extension is used for runtime loadable modules], + [libltdl_cv_shlibext], +[ +module=yes +eval libltdl_cv_shlibext=$shrext_cmds + ]) +if test -n "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_MODULE_EXT])dnl + AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], + [Define to the extension used for runtime loadable modules, say, ".so".]) +fi +])# LT_SYS_MODULE_EXT + +# Old name: +AU_ALIAS([AC_LTDL_SHLIBEXT], [LT_SYS_MODULE_EXT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_SHLIBEXT], []) + + +# LT_SYS_MODULE_PATH +# ------------------ +AC_DEFUN([LT_SYS_MODULE_PATH], +[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([which variable specifies run-time module search path], + [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) +if test -n "$lt_cv_module_path_var"; then + m4_pattern_allow([LT_MODULE_PATH_VAR])dnl + AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], + [Define to the name of the environment variable that determines the run-time module search path.]) +fi +])# LT_SYS_MODULE_PATH + +# Old name: +AU_ALIAS([AC_LTDL_SHLIBPATH], [LT_SYS_MODULE_PATH]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_SHLIBPATH], []) + + +# LT_SYS_DLSEARCH_PATH +# -------------------- +AC_DEFUN([LT_SYS_DLSEARCH_PATH], +[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([for the default library search path], + [lt_cv_sys_dlsearch_path], + [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) +if test -n "$lt_cv_sys_dlsearch_path"; then + sys_dlsearch_path= + for dir in $lt_cv_sys_dlsearch_path; do + if test -z "$sys_dlsearch_path"; then + sys_dlsearch_path="$dir" + else + sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" + fi + done + m4_pattern_allow([LT_DLSEARCH_PATH])dnl + AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], + [Define to the system default library search path.]) +fi +])# LT_SYS_DLSEARCH_PATH + +# Old name: +AU_ALIAS([AC_LTDL_SYSSEARCHPATH], [LT_SYS_DLSEARCH_PATH]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_SYSSEARCHPATH], []) + + +# _LT_CHECK_DLPREOPEN +# ------------------- +m4_defun([_LT_CHECK_DLPREOPEN], +[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen], + [libltdl_cv_preloaded_symbols], + [if test -n "$lt_cv_sys_global_symbol_pipe"; then + libltdl_cv_preloaded_symbols=yes + else + libltdl_cv_preloaded_symbols=no + fi + ]) +if test x"$libltdl_cv_preloaded_symbols" = xyes; then + AC_DEFINE([HAVE_PRELOADED_SYMBOLS], [1], + [Define if libtool can extract symbol lists from object files.]) +fi +])# _LT_CHECK_DLPREOPEN + + +# LT_LIB_DLLOAD +# ------------- +AC_DEFUN([LT_LIB_DLLOAD], +[m4_pattern_allow([^LT_DLLOADERS$]) +LT_DLLOADERS= +AC_SUBST([LT_DLLOADERS]) + +AC_LANG_PUSH([C]) + +LIBADD_DLOPEN= +AC_SEARCH_LIBS([dlopen], [dl], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + if test "$ac_cv_search_dlopen" != "none required" ; then + LIBADD_DLOPEN="-ldl" + fi + libltdl_cv_lib_dl_dlopen="yes" + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H +# include +#endif + ]], [[dlopen(0, 0);]])], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + libltdl_cv_func_dlopen="yes" + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], + [AC_CHECK_LIB([svld], [dlopen], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) +if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes +then + lt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBADD_DLOPEN" + AC_CHECK_FUNCS([dlerror]) + LIBS="$lt_save_LIBS" +fi +AC_SUBST([LIBADD_DLOPEN]) + +LIBADD_SHL_LOAD= +AC_CHECK_FUNC([shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], + [AC_CHECK_LIB([dld], [shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" + LIBADD_SHL_LOAD="-ldld"])]) +AC_SUBST([LIBADD_SHL_LOAD]) + +case $host_os in +darwin[[1567]].*) +# We only want this for pre-Mac OS X 10.4. + AC_CHECK_FUNC([_dyld_func_lookup], + [AC_DEFINE([HAVE_DYLD], [1], + [Define if you have the _dyld_func_lookup function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) + ;; +beos*) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" + ;; +cygwin* | mingw* | os2* | pw32*) + AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" + ;; +esac + +AC_CHECK_LIB([dld], [dld_link], + [AC_DEFINE([HAVE_DLD], [1], + [Define if you have the GNU dld library.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) +AC_SUBST([LIBADD_DLD_LINK]) + +m4_pattern_allow([^LT_DLPREOPEN$]) +LT_DLPREOPEN= +if test -n "$LT_DLLOADERS" +then + for lt_loader in $LT_DLLOADERS; do + LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " + done + AC_DEFINE([HAVE_LIBDLLOADER], [1], + [Define if libdlloader will be built on this platform]) +fi +AC_SUBST([LT_DLPREOPEN]) + +dnl This isn't used anymore, but set it for backwards compatibility +LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" +AC_SUBST([LIBADD_DL]) + +AC_LANG_POP +])# LT_LIB_DLLOAD + +# Old name: +AU_ALIAS([AC_LTDL_DLLIB], [LT_LIB_DLLOAD]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_DLLIB], []) + + +# LT_SYS_SYMBOL_USCORE +# -------------------- +# does the compiler prefix global symbols with an underscore? +AC_DEFUN([LT_SYS_SYMBOL_USCORE], +[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +AC_CACHE_CHECK([for _ prefix in compiled symbols], + [lt_cv_sys_symbol_underscore], + [lt_cv_sys_symbol_underscore=no + cat > conftest.$ac_ext <<_LT_EOF +void nm_test_func(){} +int main(){nm_test_func;return 0;} +_LT_EOF + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + ac_nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then + # See whether the symbols have a leading underscore. + if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then + lt_cv_sys_symbol_underscore=yes + else + if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then + : + else + echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD + fi + fi + else + echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.c >&AS_MESSAGE_LOG_FD + fi + rm -rf conftest* + ]) + sys_symbol_underscore=$lt_cv_sys_symbol_underscore + AC_SUBST([sys_symbol_underscore]) +])# LT_SYS_SYMBOL_USCORE + +# Old name: +AU_ALIAS([AC_LTDL_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_SYMBOL_USCORE], []) + + +# LT_FUNC_DLSYM_USCORE +# -------------------- +AC_DEFUN([LT_FUNC_DLSYM_USCORE], +[AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +if test x"$lt_cv_sys_symbol_underscore" = xyes; then + if test x"$libltdl_cv_func_dlopen" = xyes || + test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then + AC_CACHE_CHECK([whether we have to add an underscore for dlsym], + [libltdl_cv_need_uscore], + [libltdl_cv_need_uscore=unknown + save_LIBS="$LIBS" + LIBS="$LIBS $LIBADD_DLOPEN" + _LT_TRY_DLOPEN_SELF( + [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], + [], [libltdl_cv_need_uscore=cross]) + LIBS="$save_LIBS" + ]) + fi +fi + +if test x"$libltdl_cv_need_uscore" = xyes; then + AC_DEFINE([NEED_USCORE], [1], + [Define if dlsym() requires a leading underscore in symbol names.]) +fi +])# LT_FUNC_DLSYM_USCORE + +# Old name: +AU_ALIAS([AC_LTDL_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_DLSYM_USCORE], []) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Figure out how to run the assembler. -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_PROG_AS +# ---------- +AC_DEFUN([AM_PROG_AS], +[# By default we simply use the C compiler to build assembly code. +AC_REQUIRE([AC_PROG_CC]) +test "${CCAS+set}" = set || CCAS=$CC +test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS +AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) +AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) +_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 10 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless `enable' is passed literally. +# For symmetry, `disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], +[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_PROG_CC_C_O +# -------------- +# Like AC_PROG_CC_C_O, but changed for automake. +AC_DEFUN([AM_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/ax_cc_maxopt.m4]) +m4_include([m4/ax_cflags_warn_all.m4]) +m4_include([m4/ax_check_compiler_flags.m4]) +m4_include([m4/ax_compiler_vendor.m4]) +m4_include([m4/ax_configure_args.m4]) +m4_include([m4/ax_enable_builddir.m4]) +m4_include([m4/ax_gcc_archflag.m4]) +m4_include([m4/ax_gcc_x86_cpuid.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) +m4_include([acinclude.m4]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/build-ios.sh b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/build-ios.sh new file mode 100755 index 0000000..3dea242 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/build-ios.sh @@ -0,0 +1,67 @@ +#!/bin/sh + +PLATFORM_IOS=/Developer/Platforms/iPhoneOS.platform/ +PLATFORM_IOS_SIM=/Developer/Platforms/iPhoneSimulator.platform/ +SDK_IOS_VERSION="4.2" +MIN_IOS_VERSION="3.0" +OUTPUT_DIR="universal-ios" + +build_target () { + local platform=$1 + local sdk=$2 + local arch=$3 + local triple=$4 + local builddir=$5 + + mkdir -p "${builddir}" + pushd "${builddir}" + export CC="${platform}"/Developer/usr/bin/gcc-4.2 + export CFLAGS="-arch ${arch} -isysroot ${sdk} -miphoneos-version-min=${MIN_IOS_VERSION}" + ../configure --host=${triple} && make + popd +} + +# Build all targets +build_target "${PLATFORM_IOS}" "${PLATFORM_IOS}/Developer/SDKs/iPhoneOS${SDK_IOS_VERSION}.sdk/" armv6 arm-apple-darwin10 armv6-ios +build_target "${PLATFORM_IOS}" "${PLATFORM_IOS}/Developer/SDKs/iPhoneOS${SDK_IOS_VERSION}.sdk/" armv7 arm-apple-darwin10 armv7-ios +build_target "${PLATFORM_IOS_SIM}" "${PLATFORM_IOS_SIM}/Developer/SDKs/iPhoneSimulator${SDK_IOS_VERSION}.sdk/" i386 i386-apple-darwin10 i386-ios-sim + +# Create universal output directories +mkdir -p "${OUTPUT_DIR}" +mkdir -p "${OUTPUT_DIR}/include" +mkdir -p "${OUTPUT_DIR}/include/armv6" +mkdir -p "${OUTPUT_DIR}/include/armv7" +mkdir -p "${OUTPUT_DIR}/include/i386" + +# Create the universal binary +lipo -create armv6-ios/.libs/libffi.a armv7-ios/.libs/libffi.a i386-ios-sim/.libs/libffi.a -output "${OUTPUT_DIR}/libffi.a" + +# Copy in the headers +copy_headers () { + local src=$1 + local dest=$2 + + # Fix non-relative header reference + sed 's//"ffitarget.h"/' < "${src}/include/ffi.h" > "${dest}/ffi.h" + cp "${src}/include/ffitarget.h" "${dest}" +} + +copy_headers armv6-ios "${OUTPUT_DIR}/include/armv6" +copy_headers armv7-ios "${OUTPUT_DIR}/include/armv7" +copy_headers i386-ios-sim "${OUTPUT_DIR}/include/i386" + +# Create top-level header +( +cat << EOF +#ifdef __arm__ + #include + #ifdef _ARM_ARCH_6 + #include "include/armv6/ffi.h" + #elif _ARM_ARCH_7 + #include "include/armv7/ffi.h" + #endif +#elif defined(__i386__) + #include "include/i386/ffi.h" +#endif +EOF +) > "${OUTPUT_DIR}/ffi.h" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/compile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/compile new file mode 100755 index 0000000..c0096a7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/compile @@ -0,0 +1,143 @@ +#! /bin/sh +# Wrapper for compilers which do not understand `-c -o'. + +scriptversion=2009-10-06.20; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software +# Foundation, Inc. +# Written by Tom Tromey . +# +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand `-c -o'. +Remove `-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file `INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; +esac + +ofile= +cfile= +eat= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as `compile cc -o foo foo.c'. + # So we strip `-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no `-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # `.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use `[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.guess b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.guess new file mode 100755 index 0000000..dc84c68 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.guess @@ -0,0 +1,1501 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file 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 of the License, 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 to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.sub b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.sub new file mode 100755 index 0000000..2a55a50 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.sub @@ -0,0 +1,1705 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file 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 of the License, 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 to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure new file mode 100755 index 0000000..231c83a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure @@ -0,0 +1,17191 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.68 for libffi 3.0.10. +# +# Report bugs to . +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: http://sourceware.org/libffi.html about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='libffi' +PACKAGE_TARNAME='libffi' +PACKAGE_VERSION='3.0.10' +PACKAGE_STRING='libffi 3.0.10' +PACKAGE_BUGREPORT='http://sourceware.org/libffi.html' +PACKAGE_URL='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +toolexeclibdir +toolexecdir +FFI_DEBUG_FALSE +FFI_DEBUG_TRUE +TARGETDIR +TARGET +FFI_EXEC_TRAMPOLINE_TABLE +FFI_EXEC_TRAMPOLINE_TABLE_FALSE +FFI_EXEC_TRAMPOLINE_TABLE_TRUE +sys_symbol_underscore +HAVE_LONG_DOUBLE +ALLOCA +PA64_HPUX_FALSE +PA64_HPUX_TRUE +PA_HPUX_FALSE +PA_HPUX_TRUE +PA_LINUX_FALSE +PA_LINUX_TRUE +SH64_FALSE +SH64_TRUE +SH_FALSE +SH_TRUE +X86_64_FALSE +X86_64_TRUE +S390_FALSE +S390_TRUE +FRV_FALSE +FRV_TRUE +LIBFFI_CRIS_FALSE +LIBFFI_CRIS_TRUE +AVR32_FALSE +AVR32_TRUE +ARM_FALSE +ARM_TRUE +POWERPC_FREEBSD_FALSE +POWERPC_FREEBSD_TRUE +POWERPC_DARWIN_FALSE +POWERPC_DARWIN_TRUE +POWERPC_AIX_FALSE +POWERPC_AIX_TRUE +POWERPC_FALSE +POWERPC_TRUE +MOXIE_FALSE +MOXIE_TRUE +M68K_FALSE +M68K_TRUE +M32R_FALSE +M32R_TRUE +IA64_FALSE +IA64_TRUE +ALPHA_FALSE +ALPHA_TRUE +X86_DARWIN_FALSE +X86_DARWIN_TRUE +X86_WIN64_FALSE +X86_WIN64_TRUE +X86_WIN32_FALSE +X86_WIN32_TRUE +X86_FREEBSD_FALSE +X86_FREEBSD_TRUE +X86_FALSE +X86_TRUE +SPARC_FALSE +SPARC_TRUE +MIPS_FALSE +MIPS_TRUE +AM_LTLDFLAGS +AM_RUNTESTFLAGS +TESTSUBDIR_FALSE +TESTSUBDIR_TRUE +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +PRTDIAG +CPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +LIBTOOL +am__fastdepCCAS_FALSE +am__fastdepCCAS_TRUE +CCASDEPMODE +CCASFLAGS +CCAS +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +ax_enable_builddir_sed +target_os +target_vendor +target_cpu +target +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_builddir +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_portable_binary +with_gcc_arch +enable_maintainer_mode +enable_debug +enable_structs +enable_raw_api +enable_purify_safety +' + ac_precious_vars='build_alias +host_alias +target_alias +CCAS +CCASFLAGS +CPP +CPPFLAGS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures libffi 3.0.10 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/libffi] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of libffi 3.0.10:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-builddir disable automatic build in subdir of sources + + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-portable-binary + disable compiler optimizations that would produce + unportable binaries + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer + --enable-debug debugging mode + --disable-structs omit code for struct support + --disable-raw-api make the raw api unavailable + --enable-purify-safety purify-safe mode + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + --with-gcc-arch= use architecture for gcc -march/-mtune, + instead of guessing + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CCAS assembler compiler command (defaults to CC) + CCASFLAGS assembler compiler flags (defaults to CFLAGS) + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +libffi configure 3.0.10 +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ------------------------------------------------ ## +## Report this to http://sourceware.org/libffi.html ## +## ------------------------------------------------ ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by libffi $as_me 3.0.10, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_config_headers="$ac_config_headers fficonfig.h" + + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if ${ac_cv_target+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; +esac +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + +target_alias=${target_alias-$host_alias} + +. ${srcdir}/configure.host + + + # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args + if test "${ac_configure_args+set}" != "set" ; then + ac_configure_args= + for ac_arg in ${1+"$@"}; do + ac_configure_args="$ac_configure_args '$ac_arg'" + done + fi + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + + +ax_enable_builddir="." +# Check whether --enable-builddir was given. +if test "${enable_builddir+set}" = set; then : + enableval=$enable_builddir; ax_enable_builddir="$enableval" +else + ax_enable_builddir="auto" +fi + +if test ".$ac_srcdir_defaulted" != ".no" ; then +if test ".$srcdir" = ".." ; then + if test -f config.status ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: toplevel srcdir already configured... skipping subdir build" >&5 +$as_echo "$as_me: toplevel srcdir already configured... skipping subdir build" >&6;} + else + test ".$ax_enable_builddir" = "." && ax_enable_builddir="." + test ".$ax_enable_builddir" = ".no" && ax_enable_builddir="." + test ".$TARGET" = "." && TARGET="$target" + test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="$TARGET" + if test ".$ax_enable_builddir" != ".." ; then # we know where to go and + as_dir=$ax_enable_builddir; as_fn_mkdir_p + echo __.$ax_enable_builddir.__ > $ax_enable_builddir/conftest.tmp + cd $ax_enable_builddir + if grep __.$ax_enable_builddir.__ conftest.tmp >/dev/null 2>/dev/null ; then + rm conftest.tmp + { $as_echo "$as_me:${as_lineno-$LINENO}: result: continue configure in default builddir \"./$ax_enable_builddir\"" >&5 +$as_echo "continue configure in default builddir \"./$ax_enable_builddir\"" >&6; } + else + as_fn_error $? "could not change to default builddir \"./$ax_enable_builddir\"" "$LINENO" 5 + fi + srcdir=`echo "$ax_enable_builddir" | + sed -e 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g;s,[/]$,,;'` + # going to restart from subdirectory location + test -f $srcdir/config.log && mv $srcdir/config.log . + test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h . + test -f $srcdir/conftest.log && mv $srcdir/conftest.log . + test -f $srcdir/$cache_file && mv $srcdir/$cache_file . + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&5 +$as_echo "....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&6; } + case "$0" in # restart + /\\*) eval $SHELL "'$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;; + *) eval $SHELL "'$srcdir/$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;; + esac ; exit $? + fi + fi +fi fi +test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="." +# Extract the first word of "gsed sed", so it can be a program name with args. +set dummy gsed sed; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ax_enable_builddir_sed+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ax_enable_builddir_sed in + [\\/]* | ?:[\\/]*) + ac_cv_path_ax_enable_builddir_sed="$ax_enable_builddir_sed" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ax_enable_builddir_sed="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_ax_enable_builddir_sed" && ac_cv_path_ax_enable_builddir_sed="sed" + ;; +esac +fi +ax_enable_builddir_sed=$ac_cv_path_ax_enable_builddir_sed +if test -n "$ax_enable_builddir_sed"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_enable_builddir_sed" >&5 +$as_echo "$ax_enable_builddir_sed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +ax_enable_builddir_auxdir="$am_aux_dir" +ac_config_commands="$ac_config_commands buildir" + + +am__api_version='1.11' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='libffi' + VERSION='3.0.10' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + +# The same as in boehm-gc and libstdc++. Have to borrow it from there. +# We must force CC to /not/ be precious variables; otherwise +# the wrong, non-multilib-adjusted value will be used in multilibs. +# As a side effect, we have to subst CFLAGS ourselves. +# Also save and restore CFLAGS, since AC_PROG_CC will come up with +# defaults of its own if none are provided. + + + +save_CFLAGS=$CFLAGS +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +CFLAGS=$save_CFLAGS + + + + + +# By default we simply use the C compiler to build assembly code. + +test "${CCAS+set}" = set || CCAS=$CC +test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS + + + +depcc="$CCAS" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CCAS_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CCAS_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CCAS_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CCAS_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; } +CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then + am__fastdepCCAS_TRUE= + am__fastdepCCAS_FALSE='#' +else + am__fastdepCCAS_TRUE='#' + am__fastdepCCAS_FALSE= +fi + + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4' +macro_revision='1.3293' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + lt_prog_compiler_pic='-Xcompiler -fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ F* | *Sun*Fortran*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld='-rpath $libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 +$as_echo_n "checking for C compiler vendor... " >&6; } +if ${ax_cv_c_compiler_vendor+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_c_compiler_vendor=unknown + # note: don't check for gcc first since some other compilers define __GNUC__ + for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do + vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#if !($vencpp) + thisisanerror; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_compiler_vendor=`echo $ventest | cut -d: -f1`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5 +$as_echo "$ax_cv_c_compiler_vendor" >&6; } + + + + + + +# Check whether --enable-portable-binary was given. +if test "${enable_portable_binary+set}" = set; then : + enableval=$enable_portable_binary; acx_maxopt_portable=$withval +else + acx_maxopt_portable=no +fi + + +# Try to determine "good" native compiler flags if none specified via CFLAGS +if test "$ac_test_CFLAGS" != "set"; then + CFLAGS="" + case $ax_cv_c_compiler_vendor in + dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" + if test "x$acx_maxopt_portable" = xno; then + CFLAGS="$CFLAGS -arch host" + fi;; + + sun) CFLAGS="-native -fast -xO5 -dalign" + if test "x$acx_maxopt_portable" = xyes; then + CFLAGS="$CFLAGS -xarch=generic" + fi;; + + hp) CFLAGS="+Oall +Optrs_ansi +DSnative" + if test "x$acx_maxopt_portable" = xyes; then + CFLAGS="$CFLAGS +DAportable" + fi;; + + ibm) if test "x$acx_maxopt_portable" = xno; then + xlc_opt="-qarch=auto -qtune=auto" + else + xlc_opt="-qtune=auto" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $xlc_opt" >&5 +$as_echo_n "checking whether C compiler accepts $xlc_opt... " >&6; } +ax_save_FLAGS=$CFLAGS + CFLAGS="$xlc_opt" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=yes +else + eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="-O3 -qansialias -w $xlc_opt" +else + CFLAGS="-O3 -qansialias -w" + echo "******************************************************" + echo "* You seem to have the IBM C compiler. It is *" + echo "* recommended for best performance that you use: *" + echo "* *" + echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" + echo "* ^^^ ^^^ *" + echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" + echo "* CPU you have. (Set the CFLAGS environment var. *" + echo "* and re-run configure.) For more info, man cc. *" + echo "******************************************************" +fi + + ;; + + intel) CFLAGS="-O3 -ansi_alias" + if test "x$acx_maxopt_portable" = xno; then + icc_archflag=unknown + icc_flags="" + case $host_cpu in + i686*|x86_64*) + # icc accepts gcc assembly syntax, so these should work: + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5 +$as_echo_n "checking for x86 cpuid 0 output... " >&6; } +if ${ax_cv_gcc_x86_cpuid_0+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_cpuid_0=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = 0, eax, ebx, ecx, edx; + FILE *f; + __asm__("cpuid" + : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op)); + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid +else + ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5 +$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; } +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5 +$as_echo_n "checking for x86 cpuid 1 output... " >&6; } +if ${ax_cv_gcc_x86_cpuid_1+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_cpuid_1=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = 1, eax, ebx, ecx, edx; + FILE *f; + __asm__("cpuid" + : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op)); + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid +else + ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5 +$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; } +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG + *:756e6547:*:*) # Intel + case $ax_cv_gcc_x86_cpuid_1 in + *6a?:*[234]:*:*|*6[789b]?:*:*:*) icc_flags="-xK";; + *f3[347]:*:*:*|*f41347:*:*:*) icc_flags="-xP -xN -xW -xK";; + *f??:*:*:*) icc_flags="-xN -xW -xK";; + esac ;; + esac ;; + esac + if test "x$icc_flags" != x; then + for flag in $icc_flags; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +$as_echo_n "checking whether C compiler accepts $flag... " >&6; } +ax_save_FLAGS=$CFLAGS + CFLAGS="$flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes +else + eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + icc_archflag=$flag; break +else + : +fi + + done + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc architecture flag" >&5 +$as_echo_n "checking for icc architecture flag... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $icc_archflag" >&5 +$as_echo "$icc_archflag" >&6; } + if test "x$icc_archflag" != xunknown; then + CFLAGS="$CFLAGS $icc_archflag" + fi + fi + ;; + + gnu) + # default optimization flags for gcc on all systems + CFLAGS="-O3 -fomit-frame-pointer" + + # -fstrict-aliasing for gcc-2.95+ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5 +$as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; } +if ${ax_cv_c_flags__fstrict_aliasing+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-fstrict-aliasing" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__fstrict_aliasing=yes +else + ax_cv_c_flags__fstrict_aliasing=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__fstrict_aliasing +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -fstrict-aliasing" +else + : +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -ffast-math" >&5 +$as_echo_n "checking whether C compiler accepts -ffast-math... " >&6; } +if ${ax_cv_c_flags__ffast_math+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-ffast-math" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__ffast_math=yes +else + ax_cv_c_flags__ffast_math=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__ffast_math +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -ffast-math" +else + : +fi + + + + + + +# Check whether --with-gcc-arch was given. +if test "${with_gcc_arch+set}" = set; then : + withval=$with_gcc_arch; ax_gcc_arch=$withval +else + ax_gcc_arch=yes +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5 +$as_echo_n "checking for gcc architecture flag... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +if ${ax_cv_gcc_archflag+:} false; then : + $as_echo_n "(cached) " >&6 +else + +ax_cv_gcc_archflag="unknown" + +if test "$GCC" = yes; then + +if test "x$ax_gcc_arch" = xyes; then +ax_gcc_arch="" +if test "$cross_compiling" = no; then +case $host_cpu in + i[3456]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5 +$as_echo_n "checking for x86 cpuid 0 output... " >&6; } +if ${ax_cv_gcc_x86_cpuid_0+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_cpuid_0=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = 0, eax, ebx, ecx, edx; + FILE *f; + __asm__("cpuid" + : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op)); + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid +else + ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5 +$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; } +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5 +$as_echo_n "checking for x86 cpuid 1 output... " >&6; } +if ${ax_cv_gcc_x86_cpuid_1+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_cpuid_1=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = 1, eax, ebx, ecx, edx; + FILE *f; + __asm__("cpuid" + : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op)); + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid +else + ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5 +$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; } +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + case $ax_cv_gcc_x86_cpuid_0 in + *:756e6547:*:*) # Intel + case $ax_cv_gcc_x86_cpuid_1 in + *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; + *5??:*:*:*) ax_gcc_arch=pentium ;; + *6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; + *6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; + *6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; + *6[9d]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; + *6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; + *6??:*:*:*) ax_gcc_arch=pentiumpro ;; + *f3[347]:*:*:*|*f41347:*:*:*) + case $host_cpu in + x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;; + *) ax_gcc_arch="prescott pentium4 pentiumpro" ;; + esac ;; + *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";; + esac ;; + *:68747541:*:*) # AMD + case $ax_cv_gcc_x86_cpuid_1 in + *5[67]?:*:*:*) ax_gcc_arch=k6 ;; + *5[8d]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; + *5[9]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; + *60?:*:*:*) ax_gcc_arch=k7 ;; + *6[12]?:*:*:*) ax_gcc_arch="athlon k7" ;; + *6[34]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; + *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;; + *6[68a]?:*:*:*) + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x80000006 output" >&5 +$as_echo_n "checking for x86 cpuid 0x80000006 output... " >&6; } +if ${ax_cv_gcc_x86_cpuid_0x80000006+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_cpuid_0x80000006=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = 0x80000006, eax, ebx, ecx, edx; + FILE *f; + __asm__("cpuid" + : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op)); + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_cpuid_0x80000006=`cat conftest_cpuid`; rm -f conftest_cpuid +else + ax_cv_gcc_x86_cpuid_0x80000006=unknown; rm -f conftest_cpuid +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x80000006" >&5 +$as_echo "$ax_cv_gcc_x86_cpuid_0x80000006" >&6; } +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + # L2 cache size + case $ax_cv_gcc_x86_cpuid_0x80000006 in + *:*:*[1-9a-f]??????:*) # (L2 = ecx >> 16) >= 256 + ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; + *) ax_gcc_arch="athlon-4 athlon k7" ;; + esac ;; + *f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; + *f5?:*:*:*) ax_gcc_arch="opteron k8" ;; + *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;; + *f??:*:*:*) ax_gcc_arch="k8" ;; + esac ;; + *:746e6543:*:*) # IDT + case $ax_cv_gcc_x86_cpuid_1 in + *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; + *58?:*:*:*) ax_gcc_arch=winchip2 ;; + *6[78]?:*:*:*) ax_gcc_arch=c3 ;; + *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;; + esac ;; + esac + if test x"$ax_gcc_arch" = x; then # fallback + case $host_cpu in + i586*) ax_gcc_arch=pentium ;; + i686*) ax_gcc_arch=pentiumpro ;; + esac + fi + ;; + + sparc*) + # Extract the first word of "prtdiag", so it can be a program name with args. +set dummy prtdiag; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PRTDIAG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PRTDIAG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PRTDIAG="$PRTDIAG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PRTDIAG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_PRTDIAG" && ac_cv_path_PRTDIAG="prtdiag" + ;; +esac +fi +PRTDIAG=$ac_cv_path_PRTDIAG +if test -n "$PRTDIAG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRTDIAG" >&5 +$as_echo "$PRTDIAG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` + cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters` + case $cputype in + *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; + *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; + *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; + *supersparc*|*tms390z5[05]*) ax_gcc_arch="supersparc v8" ;; + *hypersparc*|*rt62[056]*) ax_gcc_arch="hypersparc v8" ;; + *cypress*) ax_gcc_arch=cypress ;; + esac ;; + + alphaev5) ax_gcc_arch=ev5 ;; + alphaev56) ax_gcc_arch=ev56 ;; + alphapca56) ax_gcc_arch="pca56 ev56" ;; + alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; + alphaev6) ax_gcc_arch=ev6 ;; + alphaev67) ax_gcc_arch=ev67 ;; + alphaev68) ax_gcc_arch="ev68 ev67" ;; + alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; + alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; + alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; + + powerpc*) + cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` + cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'` + case $cputype in + *750*) ax_gcc_arch="750 G3" ;; + *740[0-9]*) ax_gcc_arch="$cputype 7400 G4" ;; + *74[4-5][0-9]*) ax_gcc_arch="$cputype 7450 G4" ;; + *74[0-9][0-9]*) ax_gcc_arch="$cputype G4" ;; + *970*) ax_gcc_arch="970 G5 power4";; + *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; + *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; + 603ev|8240) ax_gcc_arch="$cputype 603e 603";; + *) ax_gcc_arch=$cputype ;; + esac + ax_gcc_arch="$ax_gcc_arch powerpc" + ;; +esac +fi # not cross-compiling +fi # guess arch + +if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then +for arch in $ax_gcc_arch; do + if test "x$acx_maxopt_portable" = xyes; then # if we require portable code + flags="-mtune=$arch" + # -mcpu=$arch and m$arch generate nonportable code on every arch except + # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. + case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac + else + flags="-march=$arch -mcpu=$arch -m$arch" + fi + for flag in $flags; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +$as_echo_n "checking whether C compiler accepts $flag... " >&6; } +ax_save_FLAGS=$CFLAGS + CFLAGS="$flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes +else + eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + ax_cv_gcc_archflag=$flag; break +else + : +fi + + done + test "x$ax_cv_gcc_archflag" = xunknown || break +done +fi + +fi # $GCC=yes + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5 +$as_echo_n "checking for gcc architecture flag... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_archflag" >&5 +$as_echo "$ax_cv_gcc_archflag" >&6; } +if test "x$ax_cv_gcc_archflag" = xunknown; then + : +else + CFLAGS="$CFLAGS $ax_cv_gcc_archflag" +fi + + ;; + esac + + if test -z "$CFLAGS"; then + echo "" + echo "********************************************************" + echo "* WARNING: Don't know the best CFLAGS for this system *" + echo "* Use ./configure CFLAGS=... to specify your own flags *" + echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" + echo "********************************************************" + echo "" + CFLAGS="-O3" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CFLAGS" >&5 +$as_echo_n "checking whether C compiler accepts $CFLAGS... " >&6; } +ax_save_FLAGS=$CFLAGS + CFLAGS="$CFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=yes +else + eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + : +else + + echo "" + echo "********************************************************" + echo "* WARNING: The guessed CFLAGS don't seem to work with *" + echo "* your compiler. *" + echo "* Use ./configure CFLAGS=... to specify your own flags *" + echo "********************************************************" + echo "" + CFLAGS="" + +fi + + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for maximum warnings" >&5 +$as_echo_n "checking CFLAGS for maximum warnings... " >&6; } +if ${ac_cv_cflags_warn_all+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_cflags_warn_all="no, unknown" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic % -Wall" "-xstrconst % -v" "-std1 % -verbose -w0 -warnprotos" "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" "-ansi -ansiE % -fullwarn" "+ESlit % +w1" "-Xc % -pvctl,fullmsg" "-h conform % -h msglevel 2" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_cflags_warn_all=`echo $ac_arg | sed -e 's,.*% *,,'` ; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_warn_all" >&5 +$as_echo "$ac_cv_cflags_warn_all" >&6; } +case ".$ac_cv_cflags_warn_all" in + .ok|.ok,*) ;; + .|.no|.no,*) + ;; + *) + if echo " $CFLAGS " | grep " $ac_cv_cflags_warn_all " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$ac_cv_cflags_warn_all"; } >&5 + (: CFLAGS does contain $ac_cv_cflags_warn_all) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$ac_cv_cflags_warn_all\""; } >&5 + (: CFLAGS="$CFLAGS $ac_cv_cflags_warn_all") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $ac_cv_cflags_warn_all" + fi + ;; +esac + +if test "x$GCC" = "xyes"; then + CFLAGS="$CFLAGS -fexceptions" +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +for ac_header in sys/mman.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mman_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_MMAN_H 1 +_ACEOF + +fi + +done + +for ac_func in mmap +do : + ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" +if test "x$ac_cv_func_mmap" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MMAP 1 +_ACEOF + +fi +done + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mman_h" = xyes; then : + libffi_header_sys_mman_h=yes +else + libffi_header_sys_mman_h=no +fi + + +ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" +if test "x$ac_cv_func_mmap" = xyes; then : + libffi_func_mmap=yes +else + libffi_func_mmap=no +fi + +if test "$libffi_header_sys_mman_h" != yes \ + || test "$libffi_func_mmap" != yes; then + ac_cv_func_mmap_file=no + ac_cv_func_mmap_dev_zero=no + ac_cv_func_mmap_anon=no +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether read-only mmap of a plain file works" >&5 +$as_echo_n "checking whether read-only mmap of a plain file works... " >&6; } +if ${ac_cv_func_mmap_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Add a system to this blacklist if + # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a + # memory area containing the same data that you'd get if you applied + # read() to the same fd. The only system known to have a problem here + # is VMS, where text files have record structure. + case "$host_os" in + vms* | ultrix*) + ac_cv_func_mmap_file=no ;; + *) + ac_cv_func_mmap_file=yes;; + esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_file" >&5 +$as_echo "$ac_cv_func_mmap_file" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap from /dev/zero works" >&5 +$as_echo_n "checking whether mmap from /dev/zero works... " >&6; } +if ${ac_cv_func_mmap_dev_zero+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Add a system to this blacklist if it has mmap() but /dev/zero + # does not exist, or if mmapping /dev/zero does not give anonymous + # zeroed pages with both the following properties: + # 1. If you map N consecutive pages in with one call, and then + # unmap any subset of those pages, the pages that were not + # explicitly unmapped remain accessible. + # 2. If you map two adjacent blocks of memory and then unmap them + # both at once, they must both go away. + # Systems known to be in this category are Windows (all variants), + # VMS, and Darwin. + case "$host_os" in + vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00) + ac_cv_func_mmap_dev_zero=no ;; + *) + ac_cv_func_mmap_dev_zero=yes;; + esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_dev_zero" >&5 +$as_echo "$ac_cv_func_mmap_dev_zero" >&6; } + + # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANON(YMOUS)" >&5 +$as_echo_n "checking for MAP_ANON(YMOUS)... " >&6; } +if ${ac_cv_decl_map_anon+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif + +int +main () +{ +int n = MAP_ANONYMOUS; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_decl_map_anon=yes +else + ac_cv_decl_map_anon=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_map_anon" >&5 +$as_echo "$ac_cv_decl_map_anon" >&6; } + + if test $ac_cv_decl_map_anon = no; then + ac_cv_func_mmap_anon=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap with MAP_ANON(YMOUS) works" >&5 +$as_echo_n "checking whether mmap with MAP_ANON(YMOUS) works... " >&6; } +if ${ac_cv_func_mmap_anon+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Add a system to this blacklist if it has mmap() and MAP_ANON or + # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) + # doesn't give anonymous zeroed pages with the same properties listed + # above for use of /dev/zero. + # Systems known to be in this category are Windows, VMS, and SCO Unix. + case "$host_os" in + vms* | cygwin* | pe | mingw* | sco* | udk* ) + ac_cv_func_mmap_anon=no ;; + *) + ac_cv_func_mmap_anon=yes;; + esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_anon" >&5 +$as_echo "$ac_cv_func_mmap_anon" >&6; } + fi +fi + +if test $ac_cv_func_mmap_file = yes; then + +$as_echo "#define HAVE_MMAP_FILE 1" >>confdefs.h + +fi +if test $ac_cv_func_mmap_dev_zero = yes; then + +$as_echo "#define HAVE_MMAP_DEV_ZERO 1" >>confdefs.h + +fi +if test $ac_cv_func_mmap_anon = yes; then + +$as_echo "#define HAVE_MMAP_ANON 1" >>confdefs.h + +fi + + + if test -d $srcdir/testsuite; then + TESTSUBDIR_TRUE= + TESTSUBDIR_FALSE='#' +else + TESTSUBDIR_TRUE='#' + TESTSUBDIR_FALSE= +fi + + +TARGETDIR="unknown" +case "$host" in + alpha*-*-*) + TARGET=ALPHA; TARGETDIR=alpha; + # Support 128-bit long double, changeable via command-line switch. + HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)' + ;; + + arm*-*-*) + TARGET=ARM; TARGETDIR=arm + ;; + + amd64-*-freebsd* | amd64-*-openbsd*) + TARGET=X86_64; TARGETDIR=x86 + ;; + + amd64-*-freebsd*) + TARGET=X86_64; TARGETDIR=x86 + ;; + + avr32*-*-*) + TARGET=AVR32; TARGETDIR=avr32 + ;; + + cris-*-*) + TARGET=LIBFFI_CRIS; TARGETDIR=cris + ;; + + frv-*-*) + TARGET=FRV; TARGETDIR=frv + ;; + + hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*) + TARGET=PA_LINUX; TARGETDIR=pa + ;; + hppa*64-*-hpux*) + TARGET=PA64_HPUX; TARGETDIR=pa + ;; + hppa*-*-hpux*) + TARGET=PA_HPUX; TARGETDIR=pa + ;; + + i?86-*-freebsd* | i?86-*-openbsd*) + TARGET=X86_FREEBSD; TARGETDIR=x86 + ;; + i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix*) + TARGET=X86_WIN32; TARGETDIR=x86 + # All mingw/cygwin/win32 builds require -no-undefined for sharedlib. + # We must also check with_cross_host to decide if this is a native + # or cross-build and select where to install dlls appropriately. + if test -n "$with_cross_host" && + test x"$with_cross_host" != x"no"; then + AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"'; + else + AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"'; + fi + ;; + i?86-*-darwin*) + TARGET=X86_DARWIN; TARGETDIR=x86 + ;; + i?86-*-solaris2.1[0-9]*) + TARGET=X86_64; TARGETDIR=x86 + ;; + i?86-*-*) + TARGET=X86; TARGETDIR=x86 + ;; + + ia64*-*-*) + TARGET=IA64; TARGETDIR=ia64 + ;; + + m32r*-*-*) + TARGET=M32R; TARGETDIR=m32r + ;; + + m68k-*-*) + TARGET=M68K; TARGETDIR=m68k + ;; + + mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*) + TARGET=MIPS; TARGETDIR=mips + ;; + mips*-*-linux* | mips*-*-openbsd*) + # Support 128-bit long double for NewABI. + HAVE_LONG_DOUBLE='defined(__mips64)' + TARGET=MIPS; TARGETDIR=mips + ;; + + powerpc*-*-linux* | powerpc-*-sysv*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc-*-beos*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc-*-darwin* | powerpc64-*-darwin*) + TARGET=POWERPC_DARWIN; TARGETDIR=powerpc + ;; + powerpc-*-aix* | rs6000-*-aix*) + TARGET=POWERPC_AIX; TARGETDIR=powerpc + ;; + powerpc-*-freebsd* | powerpc-*-openbsd*) + TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc + ;; + powerpc64-*-freebsd*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc*-*-rtems*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + + s390-*-* | s390x-*-*) + TARGET=S390; TARGETDIR=s390 + ;; + + sh-*-* | sh[34]*-*-*) + TARGET=SH; TARGETDIR=sh + ;; + sh64-*-* | sh5*-*-*) + TARGET=SH64; TARGETDIR=sh64 + ;; + + sparc*-*-*) + TARGET=SPARC; TARGETDIR=sparc + ;; + + x86_64-*-darwin*) + TARGET=X86_DARWIN; TARGETDIR=x86 + ;; + + x86_64-*-cygwin* | x86_64-*-mingw*) + TARGET=X86_WIN64; TARGETDIR=x86 + ;; + + x86_64-*-*) + TARGET=X86_64; TARGETDIR=x86 + ;; +esac + + + + +if test $TARGETDIR = unknown; then + as_fn_error $? "\"libffi has not been ported to $host.\"" "$LINENO" 5 +fi + + if test x$TARGET = xMIPS; then + MIPS_TRUE= + MIPS_FALSE='#' +else + MIPS_TRUE='#' + MIPS_FALSE= +fi + + if test x$TARGET = xSPARC; then + SPARC_TRUE= + SPARC_FALSE='#' +else + SPARC_TRUE='#' + SPARC_FALSE= +fi + + if test x$TARGET = xX86; then + X86_TRUE= + X86_FALSE='#' +else + X86_TRUE='#' + X86_FALSE= +fi + + if test x$TARGET = xX86_FREEBSD; then + X86_FREEBSD_TRUE= + X86_FREEBSD_FALSE='#' +else + X86_FREEBSD_TRUE='#' + X86_FREEBSD_FALSE= +fi + + if test x$TARGET = xX86_WIN32; then + X86_WIN32_TRUE= + X86_WIN32_FALSE='#' +else + X86_WIN32_TRUE='#' + X86_WIN32_FALSE= +fi + + if test x$TARGET = xX86_WIN64; then + X86_WIN64_TRUE= + X86_WIN64_FALSE='#' +else + X86_WIN64_TRUE='#' + X86_WIN64_FALSE= +fi + + if test x$TARGET = xX86_DARWIN; then + X86_DARWIN_TRUE= + X86_DARWIN_FALSE='#' +else + X86_DARWIN_TRUE='#' + X86_DARWIN_FALSE= +fi + + if test x$TARGET = xALPHA; then + ALPHA_TRUE= + ALPHA_FALSE='#' +else + ALPHA_TRUE='#' + ALPHA_FALSE= +fi + + if test x$TARGET = xIA64; then + IA64_TRUE= + IA64_FALSE='#' +else + IA64_TRUE='#' + IA64_FALSE= +fi + + if test x$TARGET = xM32R; then + M32R_TRUE= + M32R_FALSE='#' +else + M32R_TRUE='#' + M32R_FALSE= +fi + + if test x$TARGET = xM68K; then + M68K_TRUE= + M68K_FALSE='#' +else + M68K_TRUE='#' + M68K_FALSE= +fi + + if test x$TARGET = xMOXIE; then + MOXIE_TRUE= + MOXIE_FALSE='#' +else + MOXIE_TRUE='#' + MOXIE_FALSE= +fi + + if test x$TARGET = xPOWERPC; then + POWERPC_TRUE= + POWERPC_FALSE='#' +else + POWERPC_TRUE='#' + POWERPC_FALSE= +fi + + if test x$TARGET = xPOWERPC_AIX; then + POWERPC_AIX_TRUE= + POWERPC_AIX_FALSE='#' +else + POWERPC_AIX_TRUE='#' + POWERPC_AIX_FALSE= +fi + + if test x$TARGET = xPOWERPC_DARWIN; then + POWERPC_DARWIN_TRUE= + POWERPC_DARWIN_FALSE='#' +else + POWERPC_DARWIN_TRUE='#' + POWERPC_DARWIN_FALSE= +fi + + if test x$TARGET = xPOWERPC_FREEBSD; then + POWERPC_FREEBSD_TRUE= + POWERPC_FREEBSD_FALSE='#' +else + POWERPC_FREEBSD_TRUE='#' + POWERPC_FREEBSD_FALSE= +fi + + if test x$TARGET = xARM; then + ARM_TRUE= + ARM_FALSE='#' +else + ARM_TRUE='#' + ARM_FALSE= +fi + + if test x$TARGET = xAVR32; then + AVR32_TRUE= + AVR32_FALSE='#' +else + AVR32_TRUE='#' + AVR32_FALSE= +fi + + if test x$TARGET = xLIBFFI_CRIS; then + LIBFFI_CRIS_TRUE= + LIBFFI_CRIS_FALSE='#' +else + LIBFFI_CRIS_TRUE='#' + LIBFFI_CRIS_FALSE= +fi + + if test x$TARGET = xFRV; then + FRV_TRUE= + FRV_FALSE='#' +else + FRV_TRUE='#' + FRV_FALSE= +fi + + if test x$TARGET = xS390; then + S390_TRUE= + S390_FALSE='#' +else + S390_TRUE='#' + S390_FALSE= +fi + + if test x$TARGET = xX86_64; then + X86_64_TRUE= + X86_64_FALSE='#' +else + X86_64_TRUE='#' + X86_64_FALSE= +fi + + if test x$TARGET = xSH; then + SH_TRUE= + SH_FALSE='#' +else + SH_TRUE='#' + SH_FALSE= +fi + + if test x$TARGET = xSH64; then + SH64_TRUE= + SH64_FALSE='#' +else + SH64_TRUE='#' + SH64_FALSE= +fi + + if test x$TARGET = xPA_LINUX; then + PA_LINUX_TRUE= + PA_LINUX_FALSE='#' +else + PA_LINUX_TRUE='#' + PA_LINUX_FALSE= +fi + + if test x$TARGET = xPA_HPUX; then + PA_HPUX_TRUE= + PA_HPUX_FALSE='#' +else + PA_HPUX_TRUE='#' + PA_HPUX_FALSE= +fi + + if test x$TARGET = xPA64_HPUX; then + PA64_HPUX_TRUE= + PA64_HPUX_FALSE='#' +else + PA64_HPUX_TRUE='#' + PA64_HPUX_FALSE= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +for ac_func in memcpy +do : + ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy" +if test "x$ac_cv_func_memcpy" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MEMCPY 1 +_ACEOF + +fi +done + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +$as_echo_n "checking for working alloca.h... " >&6; } +if ${ac_cv_working_alloca_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_working_alloca_h=yes +else + ac_cv_working_alloca_h=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 +$as_echo "$ac_cv_working_alloca_h" >&6; } +if test $ac_cv_working_alloca_h = yes; then + +$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 +$as_echo_n "checking for alloca... " >&6; } +if ${ac_cv_func_alloca_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# ifdef HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +void *alloca (size_t); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_func_alloca_works=yes +else + ac_cv_func_alloca_works=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 +$as_echo "$ac_cv_func_alloca_works" >&6; } + +if test $ac_cv_func_alloca_works = yes; then + +$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=\${LIBOBJDIR}alloca.$ac_objext + +$as_echo "#define C_ALLOCA 1" >>confdefs.h + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 +$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } +if ${ac_cv_os_cray+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined CRAY && ! defined CRAY2 +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then : + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 +$as_echo "$ac_cv_os_cray" >&6; } +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 +$as_echo_n "checking stack direction for C alloca... " >&6; } +if ${ac_cv_c_stack_direction+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_c_stack_direction=0 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + return find_stack_direction () < 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_stack_direction=1 +else + ac_cv_c_stack_direction=-1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 +$as_echo "$ac_cv_c_stack_direction" >&6; } +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 +$as_echo_n "checking size of double... " >&6; } +if ${ac_cv_sizeof_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_double" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (double) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_double=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 +$as_echo "$ac_cv_sizeof_double" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_DOUBLE $ac_cv_sizeof_double +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5 +$as_echo_n "checking size of long double... " >&6; } +if ${ac_cv_sizeof_long_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long_double" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long double) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_double=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5 +$as_echo "$ac_cv_sizeof_long_double" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double +_ACEOF + + + +# Also AC_SUBST this variable for ffi.h. +if test -z "$HAVE_LONG_DOUBLE"; then + HAVE_LONG_DOUBLE=0 + if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then + if test $ac_cv_sizeof_long_double != 0; then + HAVE_LONG_DOUBLE=1 + +$as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h + + fi + fi +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .cfi pseudo-op support" >&5 +$as_echo_n "checking assembler .cfi pseudo-op support... " >&6; } +if ${libffi_cv_as_cfi_pseudo_op+:} false; then : + $as_echo_n "(cached) " >&6 +else + + libffi_cv_as_cfi_pseudo_op=unknown + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +asm (".cfi_startproc\n\t.cfi_endproc"); +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + libffi_cv_as_cfi_pseudo_op=yes +else + libffi_cv_as_cfi_pseudo_op=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_cfi_pseudo_op" >&5 +$as_echo "$libffi_cv_as_cfi_pseudo_op" >&6; } +if test "x$libffi_cv_as_cfi_pseudo_op" = xyes; then + +$as_echo "#define HAVE_AS_CFI_PSEUDO_OP 1" >>confdefs.h + +fi + +if test x$TARGET = xSPARC; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler and linker support unaligned pc related relocs" >&5 +$as_echo_n "checking assembler and linker support unaligned pc related relocs... " >&6; } +if ${libffi_cv_as_sparc_ua_pcrel+:} false; then : + $as_echo_n "(cached) " >&6 +else + + save_CFLAGS="$CFLAGS" + save_LDFLAGS="$LDFLAGS" + CFLAGS="$CFLAGS -fpic" + LDFLAGS="$LDFLAGS -shared" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text"); +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + libffi_cv_as_sparc_ua_pcrel=yes +else + libffi_cv_as_sparc_ua_pcrel=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_sparc_ua_pcrel" >&5 +$as_echo "$libffi_cv_as_sparc_ua_pcrel" >&6; } + if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then + +$as_echo "#define HAVE_AS_SPARC_UA_PCREL 1" >>confdefs.h + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .register pseudo-op support" >&5 +$as_echo_n "checking assembler .register pseudo-op support... " >&6; } +if ${libffi_cv_as_register_pseudo_op+:} false; then : + $as_echo_n "(cached) " >&6 +else + + libffi_cv_as_register_pseudo_op=unknown + # Check if we have .register + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +asm (".register %g2, #scratch"); +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + libffi_cv_as_register_pseudo_op=yes +else + libffi_cv_as_register_pseudo_op=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_register_pseudo_op" >&5 +$as_echo "$libffi_cv_as_register_pseudo_op" >&6; } + if test "x$libffi_cv_as_register_pseudo_op" = xyes; then + +$as_echo "#define HAVE_AS_REGISTER_PSEUDO_OP 1" >>confdefs.h + + fi +fi + +if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports pc related relocs" >&5 +$as_echo_n "checking assembler supports pc related relocs... " >&6; } +if ${libffi_cv_as_x86_pcrel+:} false; then : + $as_echo_n "(cached) " >&6 +else + + libffi_cv_as_x86_pcrel=no + echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s + if $CC $CFLAGS -c conftest.s > /dev/null; then + libffi_cv_as_x86_pcrel=yes + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_pcrel" >&5 +$as_echo "$libffi_cv_as_x86_pcrel" >&6; } + if test "x$libffi_cv_as_x86_pcrel" = xyes; then + +$as_echo "#define HAVE_AS_X86_PCREL 1" >>confdefs.h + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .ascii pseudo-op support" >&5 +$as_echo_n "checking assembler .ascii pseudo-op support... " >&6; } +if ${libffi_cv_as_ascii_pseudo_op+:} false; then : + $as_echo_n "(cached) " >&6 +else + + libffi_cv_as_ascii_pseudo_op=unknown + # Check if we have .ascii + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +asm (".ascii \\"string\\""); +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + libffi_cv_as_ascii_pseudo_op=yes +else + libffi_cv_as_ascii_pseudo_op=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_ascii_pseudo_op" >&5 +$as_echo "$libffi_cv_as_ascii_pseudo_op" >&6; } + if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then + +$as_echo "#define HAVE_AS_ASCII_PSEUDO_OP 1" >>confdefs.h + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .string pseudo-op support" >&5 +$as_echo_n "checking assembler .string pseudo-op support... " >&6; } +if ${libffi_cv_as_string_pseudo_op+:} false; then : + $as_echo_n "(cached) " >&6 +else + + libffi_cv_as_string_pseudo_op=unknown + # Check if we have .string + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +asm (".string \\"string\\""); +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + libffi_cv_as_string_pseudo_op=yes +else + libffi_cv_as_string_pseudo_op=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_string_pseudo_op" >&5 +$as_echo "$libffi_cv_as_string_pseudo_op" >&6; } + if test "x$libffi_cv_as_string_pseudo_op" = xyes; then + +$as_echo "#define HAVE_AS_STRING_PSEUDO_OP 1" >>confdefs.h + + fi +fi + +if test x$TARGET = xX86_WIN64; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ prefix in compiled symbols" >&5 +$as_echo_n "checking for _ prefix in compiled symbols... " >&6; } +if ${lt_cv_sys_symbol_underscore+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_symbol_underscore=no + cat > conftest.$ac_ext <<_LT_EOF +void nm_test_func(){} +int main(){nm_test_func;return 0;} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + ac_nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$ac_nlist"; then + # See whether the symbols have a leading underscore. + if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then + lt_cv_sys_symbol_underscore=yes + else + if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then + : + else + echo "configure: cannot find nm_test_func in $ac_nlist" >&5 + fi + fi + else + echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + fi + rm -rf conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_symbol_underscore" >&5 +$as_echo "$lt_cv_sys_symbol_underscore" >&6; } + sys_symbol_underscore=$lt_cv_sys_symbol_underscore + + + if test "x$sys_symbol_underscore" = xyes; then + +$as_echo "#define SYMBOL_UNDERSCORE 1" >>confdefs.h + + fi +fi + + +FFI_EXEC_TRAMPOLINE_TABLE=0 +case "$target" in + *arm*-apple-darwin*) + FFI_EXEC_TRAMPOLINE_TABLE=1 + +$as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h + + ;; + *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) + +$as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h + + ;; +esac + if test x$FFI_EXEC_TRAMPOLINE_TABLE = x1; then + FFI_EXEC_TRAMPOLINE_TABLE_TRUE= + FFI_EXEC_TRAMPOLINE_TABLE_FALSE='#' +else + FFI_EXEC_TRAMPOLINE_TABLE_TRUE='#' + FFI_EXEC_TRAMPOLINE_TABLE_FALSE= +fi + + + +if test x$TARGET = xX86_64; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports unwind section type" >&5 +$as_echo_n "checking assembler supports unwind section type... " >&6; } +if ${libffi_cv_as_x86_64_unwind_section_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + + libffi_cv_as_x86_64_unwind_section_type=yes + echo '.section .eh_frame,"a",@unwind' > conftest.s + if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then + libffi_cv_as_x86_64_unwind_section_type=no + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_64_unwind_section_type" >&5 +$as_echo "$libffi_cv_as_x86_64_unwind_section_type" >&6; } + if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then + +$as_echo "#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1" >>confdefs.h + + fi +fi + +if test "x$GCC" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .eh_frame section should be read-only" >&5 +$as_echo_n "checking whether .eh_frame section should be read-only... " >&6; } +if ${libffi_cv_ro_eh_frame+:} false; then : + $as_echo_n "(cached) " >&6 +else + + libffi_cv_ro_eh_frame=no + echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c + if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then + if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then + libffi_cv_ro_eh_frame=yes + elif grep '.section.*eh_frame.*#alloc' conftest.c \ + | grep -v '#write' > /dev/null; then + libffi_cv_ro_eh_frame=yes + fi + fi + rm -f conftest.* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_ro_eh_frame" >&5 +$as_echo "$libffi_cv_ro_eh_frame" >&6; } + if test "x$libffi_cv_ro_eh_frame" = xyes; then + +$as_echo "#define HAVE_RO_EH_FRAME 1" >>confdefs.h + + +$as_echo "#define EH_FRAME_FLAGS \"a\"" >>confdefs.h + + else + +$as_echo "#define EH_FRAME_FLAGS \"aw\"" >>confdefs.h + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((visibility(\"hidden\")))" >&5 +$as_echo_n "checking for __attribute__((visibility(\"hidden\")))... " >&6; } +if ${libffi_cv_hidden_visibility_attribute+:} false; then : + $as_echo_n "(cached) " >&6 +else + + echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c + libffi_cv_hidden_visibility_attribute=no + if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + if grep '\.hidden.*foo' conftest.s >/dev/null; then + libffi_cv_hidden_visibility_attribute=yes + fi + fi + rm -f conftest.* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_hidden_visibility_attribute" >&5 +$as_echo "$libffi_cv_hidden_visibility_attribute" >&6; } + if test $libffi_cv_hidden_visibility_attribute = yes; then + +$as_echo "#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1" >>confdefs.h + + fi +fi + + + + + + + + +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; if test "$enable_debug" = "yes"; then + +$as_echo "#define FFI_DEBUG 1" >>confdefs.h + + fi +fi + + if test "$enable_debug" = "yes"; then + FFI_DEBUG_TRUE= + FFI_DEBUG_FALSE='#' +else + FFI_DEBUG_TRUE='#' + FFI_DEBUG_FALSE= +fi + + +# Check whether --enable-structs was given. +if test "${enable_structs+set}" = set; then : + enableval=$enable_structs; if test "$enable_structs" = "no"; then + +$as_echo "#define FFI_NO_STRUCTS 1" >>confdefs.h + + fi +fi + + +# Check whether --enable-raw-api was given. +if test "${enable_raw_api+set}" = set; then : + enableval=$enable_raw_api; if test "$enable_raw_api" = "no"; then + +$as_echo "#define FFI_NO_RAW_API 1" >>confdefs.h + + fi +fi + + +# Check whether --enable-purify-safety was given. +if test "${enable_purify_safety+set}" = set; then : + enableval=$enable_purify_safety; if test "$enable_purify_safety" = "yes"; then + +$as_echo "#define USING_PURIFY 1" >>confdefs.h + + fi +fi + + +# These variables are only ever used when we cross-build to X86_WIN32. +# And we only support this with GCC, so... +if test x"$GCC" != x"no"; then + if test -n "$with_cross_host" && + test x"$with_cross_host" != x"no"; then + toolexecdir='$(exec_prefix)/$(target_alias)' + toolexeclibdir='$(toolexecdir)/lib' + else + toolexecdir='$(libdir)/gcc-lib/$(target_alias)' + toolexeclibdir='$(libdir)' + fi + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. + *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; + esac + + +fi + +if test "${multilib}" = "yes"; then + multilib_arg="--enable-multilib" +else + multilib_arg= +fi + +ac_config_commands="$ac_config_commands include" + +ac_config_commands="$ac_config_commands src" + + +ac_config_links="$ac_config_links include/ffitarget.h:src/$TARGETDIR/ffitarget.h" + + +ac_config_files="$ac_config_files include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc" + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${TESTSUBDIR_TRUE}" && test -z "${TESTSUBDIR_FALSE}"; then + as_fn_error $? "conditional \"TESTSUBDIR\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MIPS_TRUE}" && test -z "${MIPS_FALSE}"; then + as_fn_error $? "conditional \"MIPS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SPARC_TRUE}" && test -z "${SPARC_FALSE}"; then + as_fn_error $? "conditional \"SPARC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${X86_TRUE}" && test -z "${X86_FALSE}"; then + as_fn_error $? "conditional \"X86\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${X86_FREEBSD_TRUE}" && test -z "${X86_FREEBSD_FALSE}"; then + as_fn_error $? "conditional \"X86_FREEBSD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${X86_WIN32_TRUE}" && test -z "${X86_WIN32_FALSE}"; then + as_fn_error $? "conditional \"X86_WIN32\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${X86_WIN64_TRUE}" && test -z "${X86_WIN64_FALSE}"; then + as_fn_error $? "conditional \"X86_WIN64\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${X86_DARWIN_TRUE}" && test -z "${X86_DARWIN_FALSE}"; then + as_fn_error $? "conditional \"X86_DARWIN\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ALPHA_TRUE}" && test -z "${ALPHA_FALSE}"; then + as_fn_error $? "conditional \"ALPHA\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${IA64_TRUE}" && test -z "${IA64_FALSE}"; then + as_fn_error $? "conditional \"IA64\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${M32R_TRUE}" && test -z "${M32R_FALSE}"; then + as_fn_error $? "conditional \"M32R\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${M68K_TRUE}" && test -z "${M68K_FALSE}"; then + as_fn_error $? "conditional \"M68K\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MOXIE_TRUE}" && test -z "${MOXIE_FALSE}"; then + as_fn_error $? "conditional \"MOXIE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${POWERPC_TRUE}" && test -z "${POWERPC_FALSE}"; then + as_fn_error $? "conditional \"POWERPC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${POWERPC_AIX_TRUE}" && test -z "${POWERPC_AIX_FALSE}"; then + as_fn_error $? "conditional \"POWERPC_AIX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${POWERPC_DARWIN_TRUE}" && test -z "${POWERPC_DARWIN_FALSE}"; then + as_fn_error $? "conditional \"POWERPC_DARWIN\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${POWERPC_FREEBSD_TRUE}" && test -z "${POWERPC_FREEBSD_FALSE}"; then + as_fn_error $? "conditional \"POWERPC_FREEBSD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ARM_TRUE}" && test -z "${ARM_FALSE}"; then + as_fn_error $? "conditional \"ARM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AVR32_TRUE}" && test -z "${AVR32_FALSE}"; then + as_fn_error $? "conditional \"AVR32\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${LIBFFI_CRIS_TRUE}" && test -z "${LIBFFI_CRIS_FALSE}"; then + as_fn_error $? "conditional \"LIBFFI_CRIS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${FRV_TRUE}" && test -z "${FRV_FALSE}"; then + as_fn_error $? "conditional \"FRV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${S390_TRUE}" && test -z "${S390_FALSE}"; then + as_fn_error $? "conditional \"S390\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${X86_64_TRUE}" && test -z "${X86_64_FALSE}"; then + as_fn_error $? "conditional \"X86_64\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SH_TRUE}" && test -z "${SH_FALSE}"; then + as_fn_error $? "conditional \"SH\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SH64_TRUE}" && test -z "${SH64_FALSE}"; then + as_fn_error $? "conditional \"SH64\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${PA_LINUX_TRUE}" && test -z "${PA_LINUX_FALSE}"; then + as_fn_error $? "conditional \"PA_LINUX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${PA_HPUX_TRUE}" && test -z "${PA_HPUX_FALSE}"; then + as_fn_error $? "conditional \"PA_HPUX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${PA64_HPUX_TRUE}" && test -z "${PA64_HPUX_FALSE}"; then + as_fn_error $? "conditional \"PA64_HPUX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +if test -z "${FFI_EXEC_TRAMPOLINE_TABLE_TRUE}" && test -z "${FFI_EXEC_TRAMPOLINE_TABLE_FALSE}"; then + as_fn_error $? "conditional \"FFI_EXEC_TRAMPOLINE_TABLE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then + as_fn_error $? "conditional \"FFI_DEBUG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by libffi $as_me 3.0.10, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_links="$ac_config_links" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration links: +$config_links + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +libffi config.status 3.0.10 +configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +ax_enable_builddir_srcdir="$srcdir" # $srcdir +ax_enable_builddir_host="$HOST" # $HOST / $host +ax_enable_builddir_version="$VERSION" # $VERSION +ax_enable_builddir_package="$PACKAGE" # $PACKAGE +ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX +ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED +ax_enable_builddir="$ax_enable_builddir" # $SUB + +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_flag_spec_ld \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + +TARGETDIR="$TARGETDIR" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "fficonfig.h") CONFIG_HEADERS="$CONFIG_HEADERS fficonfig.h" ;; + "buildir") CONFIG_COMMANDS="$CONFIG_COMMANDS buildir" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "include") CONFIG_COMMANDS="$CONFIG_COMMANDS include" ;; + "src") CONFIG_COMMANDS="$CONFIG_COMMANDS src" ;; + "include/ffitarget.h") CONFIG_LINKS="$CONFIG_LINKS include/ffitarget.h:src/$TARGETDIR/ffitarget.h" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "include/ffi.h") CONFIG_FILES="$CONFIG_FILES include/ffi.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;; + "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; + "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + :L) + # + # CONFIG_LINK + # + + if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then + : + else + # Prefer the file from the source tree if names are identical. + if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then + ac_source=$srcdir/$ac_source + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 +$as_echo "$as_me: linking $ac_source to $ac_file" >&6;} + + if test ! -r "$ac_source"; then + as_fn_error $? "$ac_source: file not found" "$LINENO" 5 + fi + rm -f "$ac_file" + + # Try a relative symlink, then a hard link, then a copy. + case $ac_source in + [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; + *) ac_rel_source=$ac_top_build_prefix$ac_source ;; + esac + ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || + ln "$ac_source" "$ac_file" 2>/dev/null || + cp -p "$ac_source" "$ac_file" || + as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 + fi + ;; + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "buildir":C) ac_top_srcdir="$ax_enable_builddir_srcdir" + if test ".$ax_enable_builddir" = ".." ; then + if test -f "$top_srcdir/Makefile" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - left untouched" >&5 +$as_echo "$as_me: skipping top_srcdir/Makefile - left untouched" >&6;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - not created" >&5 +$as_echo "$as_me: skipping top_srcdir/Makefile - not created" >&6;} + fi + else + if test -f "$ac_top_srcdir/Makefile" ; then + a=`grep "^VERSION " "$ac_top_srcdir/Makefile"` ; b=`grep "^VERSION " Makefile` + test "$a" != "$b" && rm "$ac_top_srcdir/Makefile" + fi + if test -f "$ac_top_srcdir/Makefile" ; then + echo "$ac_top_srcdir/Makefile : $ac_top_srcdir/Makefile.in" > $tmp/conftemp.mk + echo " @ echo 'REMOVED,,,' >\$@" >> $tmp/conftemp.mk + eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" + if grep '^REMOVED,,,' "$ac_top_srcdir/Makefile" >/dev/null + then rm $ac_top_srcdir/Makefile ; fi + cp $tmp/conftemp.mk $ac_top_srcdir/makefiles.mk~ ## DEBUGGING + fi + if test ! -f "$ac_top_srcdir/Makefile" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: create top_srcdir/Makefile guessed from local Makefile" >&5 +$as_echo "$as_me: create top_srcdir/Makefile guessed from local Makefile" >&6;} + x='`' ; cat >$tmp/conftemp.sed <<_EOF +/^\$/n +x +/^\$/bS +x +/\\\\\$/{H;d;} +{H;s/.*//;x;} +bM +:S +x +/\\\\\$/{h;d;} +{h;s/.*//;x;} +:M +s/\\(\\n\\) /\\1 /g +/^ /d +/^[ ]*[\\#]/d +/^VPATH *=/d +s/^srcdir *=.*/srcdir = ./ +s/^top_srcdir *=.*/top_srcdir = ./ +/[:=]/!d +/^\\./d +/ = /b +/ .= /b +/:/!b +s/:.*/:/ +s/ / /g +s/ \\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/ \\1 \\1-all\\2/g +s/^\\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/\\1 \\1-all\\2/ +s/ / /g +/^all all-all[ :]/i\\ +all-configured : all-all +s/ [a-zA-Z0-9-]*-all [a-zA-Z0-9-]*-all-all//g +/-all-all/d +a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done +/dist-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ + ; if test "\$\$found" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +/dist-[a-zA-Z0-9]*-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ + ; if test "\$\$found" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +/distclean-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ + ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ + ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile +_EOF + cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefile.sed~" ## DEBUGGING + $ax_enable_builddir_sed -f $tmp/conftemp.sed Makefile >$ac_top_srcdir/Makefile + if test -f "$ac_top_srcdir/Makefile.mk" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&5 +$as_echo "$as_me: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&6;} + cat $ac_top_srcdir/Makefile.mk >>$ac_top_srcdir/Makefile + fi ; xxxx="####" + echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$ac_top_srcdir/Makefile + # sanity check + if grep '^; echo "MAKE ' $ac_top_srcdir/Makefile >/dev/null ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: buggy sed found - it deletes tab in \"a\" text parts" >&5 +$as_echo "$as_me: buggy sed found - it deletes tab in \"a\" text parts" >&6;} + $ax_enable_builddir_sed -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $ac_top_srcdir/Makefile \ + >$ac_top_srcdir/Makefile~ + (test -s $ac_top_srcdir/Makefile~ && mv $ac_top_srcdir/Makefile~ $ac_top_srcdir/Makefile) 2>/dev/null + fi + else + xxxx="\\#\\#\\#\\#" + # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed + echo "s!^$xxxx [^|]* | *$ax_enable_builddir *\$!$xxxx ...... $ax_enable_builddir!" >$tmp/conftemp.sed + $ax_enable_builddir_sed -f "$tmp/conftemp.sed" "$ac_top_srcdir/Makefile" >$tmp/mkfile.tmp + cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefiles.sed~" ## DEBUGGING + cp "$tmp/mkfile.tmp" "$ac_top_srcdir/makefiles.out~" ## DEBUGGING + if cmp -s "$ac_top_srcdir/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: keeping top_srcdir/Makefile from earlier configure" >&5 +$as_echo "$as_me: keeping top_srcdir/Makefile from earlier configure" >&6;} + rm "$tmp/mkfile.tmp" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: reusing top_srcdir/Makefile from earlier configure" >&5 +$as_echo "$as_me: reusing top_srcdir/Makefile from earlier configure" >&6;} + mv "$tmp/mkfile.tmp" "$ac_top_srcdir/Makefile" + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&5 +$as_echo "$as_me: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&6;} + xxxx="####" + echo "$xxxx" "$ax_enable_builddir_host" "|$ax_enable_builddir" >>$ac_top_srcdir/Makefile + fi + ;; + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="" + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + "include":C) test -d include || mkdir include ;; + "src":C) +test -d src || mkdir src +test -d src/$TARGETDIR || mkdir src/$TARGETDIR + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.ac b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.ac new file mode 100644 index 0000000..2d92d33 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.ac @@ -0,0 +1,496 @@ +dnl Process this with autoconf to create configure + +AC_PREREQ(2.63) + +AC_INIT([libffi], [3.0.10], [http://sourceware.org/libffi.html]) +AC_CONFIG_HEADERS([fficonfig.h]) + +AC_CANONICAL_SYSTEM +target_alias=${target_alias-$host_alias} + +. ${srcdir}/configure.host + +AX_ENABLE_BUILDDIR + +AM_INIT_AUTOMAKE + +# The same as in boehm-gc and libstdc++. Have to borrow it from there. +# We must force CC to /not/ be precious variables; otherwise +# the wrong, non-multilib-adjusted value will be used in multilibs. +# As a side effect, we have to subst CFLAGS ourselves. +# Also save and restore CFLAGS, since AC_PROG_CC will come up with +# defaults of its own if none are provided. + +m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS]) +m4_define([_AC_ARG_VAR_PRECIOUS],[]) +save_CFLAGS=$CFLAGS +AC_PROG_CC +CFLAGS=$save_CFLAGS +m4_undefine([_AC_ARG_VAR_PRECIOUS]) +m4_rename([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS]) + +AC_SUBST(CFLAGS) + +AM_PROG_AS +AM_PROG_CC_C_O +AC_PROG_LIBTOOL +AC_CONFIG_MACRO_DIR([m4]) + +AX_CC_MAXOPT +AX_CFLAGS_WARN_ALL +if test "x$GCC" = "xyes"; then + CFLAGS="$CFLAGS -fexceptions" +fi + +AM_MAINTAINER_MODE + +AC_CHECK_HEADERS(sys/mman.h) +AC_CHECK_FUNCS(mmap) +AC_FUNC_MMAP_BLACKLIST + +dnl The -no-testsuite modules omit the test subdir. +AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite) + +TARGETDIR="unknown" +case "$host" in + alpha*-*-*) + TARGET=ALPHA; TARGETDIR=alpha; + # Support 128-bit long double, changeable via command-line switch. + HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)' + ;; + + arm*-*-*) + TARGET=ARM; TARGETDIR=arm + ;; + + amd64-*-freebsd* | amd64-*-openbsd*) + TARGET=X86_64; TARGETDIR=x86 + ;; + + amd64-*-freebsd*) + TARGET=X86_64; TARGETDIR=x86 + ;; + + avr32*-*-*) + TARGET=AVR32; TARGETDIR=avr32 + ;; + + cris-*-*) + TARGET=LIBFFI_CRIS; TARGETDIR=cris + ;; + + frv-*-*) + TARGET=FRV; TARGETDIR=frv + ;; + + hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*) + TARGET=PA_LINUX; TARGETDIR=pa + ;; + hppa*64-*-hpux*) + TARGET=PA64_HPUX; TARGETDIR=pa + ;; + hppa*-*-hpux*) + TARGET=PA_HPUX; TARGETDIR=pa + ;; + + i?86-*-freebsd* | i?86-*-openbsd*) + TARGET=X86_FREEBSD; TARGETDIR=x86 + ;; + i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix*) + TARGET=X86_WIN32; TARGETDIR=x86 + # All mingw/cygwin/win32 builds require -no-undefined for sharedlib. + # We must also check with_cross_host to decide if this is a native + # or cross-build and select where to install dlls appropriately. + if test -n "$with_cross_host" && + test x"$with_cross_host" != x"no"; then + AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"'; + else + AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"'; + fi + ;; + i?86-*-darwin*) + TARGET=X86_DARWIN; TARGETDIR=x86 + ;; + i?86-*-solaris2.1[[0-9]]*) + TARGET=X86_64; TARGETDIR=x86 + ;; + i?86-*-*) + TARGET=X86; TARGETDIR=x86 + ;; + + ia64*-*-*) + TARGET=IA64; TARGETDIR=ia64 + ;; + + m32r*-*-*) + TARGET=M32R; TARGETDIR=m32r + ;; + + m68k-*-*) + TARGET=M68K; TARGETDIR=m68k + ;; + + mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*) + TARGET=MIPS; TARGETDIR=mips + ;; + mips*-*-linux* | mips*-*-openbsd*) + # Support 128-bit long double for NewABI. + HAVE_LONG_DOUBLE='defined(__mips64)' + TARGET=MIPS; TARGETDIR=mips + ;; + + powerpc*-*-linux* | powerpc-*-sysv*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc-*-beos*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc-*-darwin* | powerpc64-*-darwin*) + TARGET=POWERPC_DARWIN; TARGETDIR=powerpc + ;; + powerpc-*-aix* | rs6000-*-aix*) + TARGET=POWERPC_AIX; TARGETDIR=powerpc + ;; + powerpc-*-freebsd* | powerpc-*-openbsd*) + TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc + ;; + powerpc64-*-freebsd*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc*-*-rtems*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + + s390-*-* | s390x-*-*) + TARGET=S390; TARGETDIR=s390 + ;; + + sh-*-* | sh[[34]]*-*-*) + TARGET=SH; TARGETDIR=sh + ;; + sh64-*-* | sh5*-*-*) + TARGET=SH64; TARGETDIR=sh64 + ;; + + sparc*-*-*) + TARGET=SPARC; TARGETDIR=sparc + ;; + + x86_64-*-darwin*) + TARGET=X86_DARWIN; TARGETDIR=x86 + ;; + + x86_64-*-cygwin* | x86_64-*-mingw*) + TARGET=X86_WIN64; TARGETDIR=x86 + ;; + + x86_64-*-*) + TARGET=X86_64; TARGETDIR=x86 + ;; +esac + +AC_SUBST(AM_RUNTESTFLAGS) +AC_SUBST(AM_LTLDFLAGS) + +if test $TARGETDIR = unknown; then + AC_MSG_ERROR(["libffi has not been ported to $host."]) +fi + +AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS) +AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC) +AM_CONDITIONAL(X86, test x$TARGET = xX86) +AM_CONDITIONAL(X86_FREEBSD, test x$TARGET = xX86_FREEBSD) +AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32) +AM_CONDITIONAL(X86_WIN64, test x$TARGET = xX86_WIN64) +AM_CONDITIONAL(X86_DARWIN, test x$TARGET = xX86_DARWIN) +AM_CONDITIONAL(ALPHA, test x$TARGET = xALPHA) +AM_CONDITIONAL(IA64, test x$TARGET = xIA64) +AM_CONDITIONAL(M32R, test x$TARGET = xM32R) +AM_CONDITIONAL(M68K, test x$TARGET = xM68K) +AM_CONDITIONAL(MOXIE, test x$TARGET = xMOXIE) +AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC) +AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX) +AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN) +AM_CONDITIONAL(POWERPC_FREEBSD, test x$TARGET = xPOWERPC_FREEBSD) +AM_CONDITIONAL(ARM, test x$TARGET = xARM) +AM_CONDITIONAL(AVR32, test x$TARGET = xAVR32) +AM_CONDITIONAL(LIBFFI_CRIS, test x$TARGET = xLIBFFI_CRIS) +AM_CONDITIONAL(FRV, test x$TARGET = xFRV) +AM_CONDITIONAL(S390, test x$TARGET = xS390) +AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64) +AM_CONDITIONAL(SH, test x$TARGET = xSH) +AM_CONDITIONAL(SH64, test x$TARGET = xSH64) +AM_CONDITIONAL(PA_LINUX, test x$TARGET = xPA_LINUX) +AM_CONDITIONAL(PA_HPUX, test x$TARGET = xPA_HPUX) +AM_CONDITIONAL(PA64_HPUX, test x$TARGET = xPA64_HPUX) + +AC_HEADER_STDC +AC_CHECK_FUNCS(memcpy) +AC_FUNC_ALLOCA + +AC_CHECK_SIZEOF(double) +AC_CHECK_SIZEOF(long double) + +# Also AC_SUBST this variable for ffi.h. +if test -z "$HAVE_LONG_DOUBLE"; then + HAVE_LONG_DOUBLE=0 + if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then + if test $ac_cv_sizeof_long_double != 0; then + HAVE_LONG_DOUBLE=1 + AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the long double type and it is bigger than a double]) + fi + fi +fi +AC_SUBST(HAVE_LONG_DOUBLE) + +AC_C_BIGENDIAN + +AC_CACHE_CHECK([assembler .cfi pseudo-op support], + libffi_cv_as_cfi_pseudo_op, [ + libffi_cv_as_cfi_pseudo_op=unknown + AC_TRY_COMPILE([asm (".cfi_startproc\n\t.cfi_endproc");],, + [libffi_cv_as_cfi_pseudo_op=yes], + [libffi_cv_as_cfi_pseudo_op=no]) +]) +if test "x$libffi_cv_as_cfi_pseudo_op" = xyes; then + AC_DEFINE(HAVE_AS_CFI_PSEUDO_OP, 1, + [Define if your assembler supports .cfi_* directives.]) +fi + +if test x$TARGET = xSPARC; then + AC_CACHE_CHECK([assembler and linker support unaligned pc related relocs], + libffi_cv_as_sparc_ua_pcrel, [ + save_CFLAGS="$CFLAGS" + save_LDFLAGS="$LDFLAGS" + CFLAGS="$CFLAGS -fpic" + LDFLAGS="$LDFLAGS -shared" + AC_TRY_LINK([asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");],, + [libffi_cv_as_sparc_ua_pcrel=yes], + [libffi_cv_as_sparc_ua_pcrel=no]) + CFLAGS="$save_CFLAGS" + LDFLAGS="$save_LDFLAGS"]) + if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then + AC_DEFINE(HAVE_AS_SPARC_UA_PCREL, 1, + [Define if your assembler and linker support unaligned PC relative relocs.]) + fi + + AC_CACHE_CHECK([assembler .register pseudo-op support], + libffi_cv_as_register_pseudo_op, [ + libffi_cv_as_register_pseudo_op=unknown + # Check if we have .register + AC_TRY_COMPILE([asm (".register %g2, #scratch");],, + [libffi_cv_as_register_pseudo_op=yes], + [libffi_cv_as_register_pseudo_op=no]) + ]) + if test "x$libffi_cv_as_register_pseudo_op" = xyes; then + AC_DEFINE(HAVE_AS_REGISTER_PSEUDO_OP, 1, + [Define if your assembler supports .register.]) + fi +fi + +if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then + AC_CACHE_CHECK([assembler supports pc related relocs], + libffi_cv_as_x86_pcrel, [ + libffi_cv_as_x86_pcrel=no + echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s + if $CC $CFLAGS -c conftest.s > /dev/null; then + libffi_cv_as_x86_pcrel=yes + fi + ]) + if test "x$libffi_cv_as_x86_pcrel" = xyes; then + AC_DEFINE(HAVE_AS_X86_PCREL, 1, + [Define if your assembler supports PC relative relocs.]) + fi + + AC_CACHE_CHECK([assembler .ascii pseudo-op support], + libffi_cv_as_ascii_pseudo_op, [ + libffi_cv_as_ascii_pseudo_op=unknown + # Check if we have .ascii + AC_TRY_COMPILE([asm (".ascii \\"string\\"");],, + [libffi_cv_as_ascii_pseudo_op=yes], + [libffi_cv_as_ascii_pseudo_op=no]) + ]) + if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then + AC_DEFINE(HAVE_AS_ASCII_PSEUDO_OP, 1, + [Define if your assembler supports .ascii.]) + fi + + AC_CACHE_CHECK([assembler .string pseudo-op support], + libffi_cv_as_string_pseudo_op, [ + libffi_cv_as_string_pseudo_op=unknown + # Check if we have .string + AC_TRY_COMPILE([asm (".string \\"string\\"");],, + [libffi_cv_as_string_pseudo_op=yes], + [libffi_cv_as_string_pseudo_op=no]) + ]) + if test "x$libffi_cv_as_string_pseudo_op" = xyes; then + AC_DEFINE(HAVE_AS_STRING_PSEUDO_OP, 1, + [Define if your assembler supports .string.]) + fi +fi + +if test x$TARGET = xX86_WIN64; then + LT_SYS_SYMBOL_USCORE + if test "x$sys_symbol_underscore" = xyes; then + AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.]) + fi +fi + + +FFI_EXEC_TRAMPOLINE_TABLE=0 +case "$target" in + *arm*-apple-darwin*) + FFI_EXEC_TRAMPOLINE_TABLE=1 + AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1, + [Cannot use PROT_EXEC on this target, so, we revert to + alternative means]) + ;; + *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) + AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1, + [Cannot use malloc on this target, so, we revert to + alternative means]) + ;; +esac +AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1) +AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE) + +if test x$TARGET = xX86_64; then + AC_CACHE_CHECK([assembler supports unwind section type], + libffi_cv_as_x86_64_unwind_section_type, [ + libffi_cv_as_x86_64_unwind_section_type=yes + echo '.section .eh_frame,"a",@unwind' > conftest.s + if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then + libffi_cv_as_x86_64_unwind_section_type=no + fi + ]) + if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then + AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1, + [Define if your assembler supports unwind section type.]) + fi +fi + +if test "x$GCC" = "xyes"; then + AC_CACHE_CHECK([whether .eh_frame section should be read-only], + libffi_cv_ro_eh_frame, [ + libffi_cv_ro_eh_frame=no + echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c + if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then + if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then + libffi_cv_ro_eh_frame=yes + elif grep '.section.*eh_frame.*#alloc' conftest.c \ + | grep -v '#write' > /dev/null; then + libffi_cv_ro_eh_frame=yes + fi + fi + rm -f conftest.* + ]) + if test "x$libffi_cv_ro_eh_frame" = xyes; then + AC_DEFINE(HAVE_RO_EH_FRAME, 1, + [Define if .eh_frame sections should be read-only.]) + AC_DEFINE(EH_FRAME_FLAGS, "a", + [Define to the flags needed for the .section .eh_frame directive. ]) + else + AC_DEFINE(EH_FRAME_FLAGS, "aw", + [Define to the flags needed for the .section .eh_frame directive. ]) + fi + + AC_CACHE_CHECK([for __attribute__((visibility("hidden")))], + libffi_cv_hidden_visibility_attribute, [ + echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c + libffi_cv_hidden_visibility_attribute=no + if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then + if grep '\.hidden.*foo' conftest.s >/dev/null; then + libffi_cv_hidden_visibility_attribute=yes + fi + fi + rm -f conftest.* + ]) + if test $libffi_cv_hidden_visibility_attribute = yes; then + AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1, + [Define if __attribute__((visibility("hidden"))) is supported.]) + fi +fi + +AH_BOTTOM([ +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) .hidden name +#else +#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +#endif +#else +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) +#else +#define FFI_HIDDEN +#endif +#endif +]) + +AC_SUBST(TARGET) +AC_SUBST(TARGETDIR) + +AC_SUBST(SHELL) + +AC_ARG_ENABLE(debug, +[ --enable-debug debugging mode], + if test "$enable_debug" = "yes"; then + AC_DEFINE(FFI_DEBUG, 1, [Define this if you want extra debugging.]) + fi) +AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") + +AC_ARG_ENABLE(structs, +[ --disable-structs omit code for struct support], + if test "$enable_structs" = "no"; then + AC_DEFINE(FFI_NO_STRUCTS, 1, [Define this is you do not want support for aggregate types.]) + fi) + +AC_ARG_ENABLE(raw-api, +[ --disable-raw-api make the raw api unavailable], + if test "$enable_raw_api" = "no"; then + AC_DEFINE(FFI_NO_RAW_API, 1, [Define this is you do not want support for the raw API.]) + fi) + +AC_ARG_ENABLE(purify-safety, +[ --enable-purify-safety purify-safe mode], + if test "$enable_purify_safety" = "yes"; then + AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.]) + fi) + +# These variables are only ever used when we cross-build to X86_WIN32. +# And we only support this with GCC, so... +if test x"$GCC" != x"no"; then + if test -n "$with_cross_host" && + test x"$with_cross_host" != x"no"; then + toolexecdir='$(exec_prefix)/$(target_alias)' + toolexeclibdir='$(toolexecdir)/lib' + else + toolexecdir='$(libdir)/gcc-lib/$(target_alias)' + toolexeclibdir='$(libdir)' + fi + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. + *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; + esac + AC_SUBST(toolexecdir) + AC_SUBST(toolexeclibdir) +fi + +if test "${multilib}" = "yes"; then + multilib_arg="--enable-multilib" +else + multilib_arg= +fi + +AC_CONFIG_COMMANDS(include, [test -d include || mkdir include]) +AC_CONFIG_COMMANDS(src, [ +test -d src || mkdir src +test -d src/$TARGETDIR || mkdir src/$TARGETDIR +], [TARGETDIR="$TARGETDIR"]) + +AC_CONFIG_LINKS(include/ffitarget.h:src/$TARGETDIR/ffitarget.h) + +AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc) + +AC_OUTPUT diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.host b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.host new file mode 100644 index 0000000..f52457b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.host @@ -0,0 +1,11 @@ +# configure.host +# +# This shell script handles all host based configuration for libffi. +# + +# THIS TABLE IS SORTED. KEEP IT THAT WAY. +case "${host}" in + frv*-elf) + LDFLAGS=`echo $LDFLAGS | sed "s/\-B[^ ]*libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/ + ;; +esac diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/depcomp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/depcomp new file mode 100755 index 0000000..df8eea7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/depcomp @@ -0,0 +1,630 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u="sed s,\\\\\\\\,/,g" + depmode=msvisualcpp +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.info b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.info new file mode 100644 index 0000000..449320c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.info @@ -0,0 +1,593 @@ +This is ../libffi/doc/libffi.info, produced by makeinfo version 4.13 +from ../libffi/doc/libffi.texi. + +This manual is for Libffi, a portable foreign-function interface +library. + + Copyright (C) 2008, 2010 Red Hat, Inc. + + Permission is granted to copy, distribute and/or modify this + document 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. A copy of the license is + included in the section entitled "GNU General Public License". + + +INFO-DIR-SECTION Development +START-INFO-DIR-ENTRY +* libffi: (libffi). Portable foreign-function interface library. +END-INFO-DIR-ENTRY + + +File: libffi.info, Node: Top, Next: Introduction, Up: (dir) + +libffi +****** + +This manual is for Libffi, a portable foreign-function interface +library. + + Copyright (C) 2008, 2010 Red Hat, Inc. + + Permission is granted to copy, distribute and/or modify this + document 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. A copy of the license is + included in the section entitled "GNU General Public License". + + +* Menu: + +* Introduction:: What is libffi? +* Using libffi:: How to use libffi. +* Missing Features:: Things libffi can't do. +* Index:: Index. + + +File: libffi.info, Node: Introduction, Next: Using libffi, Prev: Top, Up: Top + +1 What is libffi? +***************** + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the "calling convention". +The calling convention is a set of assumptions made by the compiler +about where function arguments will be found on entry to a function. A +calling convention also specifies where the return value for a function +is found. The calling convention is also sometimes called the "ABI" or +"Application Binary Interface". + + Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call a +given function. `Libffi' can be used in such programs to provide a +bridge from the interpreter program to compiled code. + + The `libffi' library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run time. + + FFI stands for Foreign Function Interface. A foreign function +interface is the popular name for the interface that allows code +written in one language to call code written in another language. The +`libffi' library really only provides the lowest, machine dependent +layer of a fully featured foreign function interface. A layer must +exist above `libffi' that handles type conversions for values passed +between the two languages. + + +File: libffi.info, Node: Using libffi, Next: Missing Features, Prev: Introduction, Up: Top + +2 Using libffi +************** + +* Menu: + +* The Basics:: The basic libffi API. +* Simple Example:: A simple example. +* Types:: libffi type descriptions. +* Multiple ABIs:: Different passing styles on one platform. +* The Closure API:: Writing a generic function. +* Closure Example:: A closure example. + + +File: libffi.info, Node: The Basics, Next: Simple Example, Up: Using libffi + +2.1 The Basics +============== + +`Libffi' assumes that you have a pointer to the function you wish to +call and that you know the number and types of arguments to pass it, as +well as the return type of the function. + + The first thing you must do is create an `ffi_cif' object that +matches the signature of the function you wish to call. This is a +separate step because it is common to make multiple calls using a +single `ffi_cif'. The "cif" in `ffi_cif' stands for Call InterFace. +To prepare a call interface object, use the function `ffi_prep_cif'. + + -- Function: ffi_status ffi_prep_cif (ffi_cif *CIF, ffi_abi ABI, + unsigned int NARGS, ffi_type *RTYPE, ffi_type **ARGTYPES) + This initializes CIF according to the given parameters. + + ABI is the ABI to use; normally `FFI_DEFAULT_ABI' is what you + want. *note Multiple ABIs:: for more information. + + NARGS is the number of arguments that this function accepts. + `libffi' does not yet handle varargs functions; see *note Missing + Features:: for more information. + + RTYPE is a pointer to an `ffi_type' structure that describes the + return type of the function. *Note Types::. + + ARGTYPES is a vector of `ffi_type' pointers. ARGTYPES must have + NARGS elements. If NARGS is 0, this argument is ignored. + + `ffi_prep_cif' returns a `libffi' status code, of type + `ffi_status'. This will be either `FFI_OK' if everything worked + properly; `FFI_BAD_TYPEDEF' if one of the `ffi_type' objects is + incorrect; or `FFI_BAD_ABI' if the ABI parameter is invalid. + + To call a function using an initialized `ffi_cif', use the +`ffi_call' function: + + -- Function: void ffi_call (ffi_cif *CIF, void *FN, void *RVALUE, void + **AVALUES) + This calls the function FN according to the description given in + CIF. CIF must have already been prepared using `ffi_prep_cif'. + + RVALUE is a pointer to a chunk of memory that will hold the result + of the function call. This must be large enough to hold the + result and must be suitably aligned; it is the caller's + responsibility to ensure this. If CIF declares that the function + returns `void' (using `ffi_type_void'), then RVALUE is ignored. + If RVALUE is `NULL', then the return value is discarded. + + AVALUES is a vector of `void *' pointers that point to the memory + locations holding the argument values for a call. If CIF declares + that the function has no arguments (i.e., NARGS was 0), then + AVALUES is ignored. Note that argument values may be modified by + the callee (for instance, structs passed by value); the burden of + copying pass-by-value arguments is placed on the caller. + + +File: libffi.info, Node: Simple Example, Next: Types, Prev: The Basics, Up: Using libffi + +2.2 Simple Example +================== + +Here is a trivial example that calls `puts' a few times. + + #include + #include + + int main() + { + ffi_cif cif; + ffi_type *args[1]; + void *values[1]; + char *s; + int rc; + + /* Initialize the argument info vectors */ + args[0] = &ffi_type_pointer; + values[0] = &s; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, args) == FFI_OK) + { + s = "Hello World!"; + ffi_call(&cif, puts, &rc, values); + /* rc now holds the result of the call to puts */ + + /* values holds a pointer to the function's arg, so to + call puts() again all we need to do is change the + value of s */ + s = "This is cool!"; + ffi_call(&cif, puts, &rc, values); + } + + return 0; + } + + +File: libffi.info, Node: Types, Next: Multiple ABIs, Prev: Simple Example, Up: Using libffi + +2.3 Types +========= + +* Menu: + +* Primitive Types:: Built-in types. +* Structures:: Structure types. +* Type Example:: Structure type example. + + +File: libffi.info, Node: Primitive Types, Next: Structures, Up: Types + +2.3.1 Primitive Types +--------------------- + +`Libffi' provides a number of built-in type descriptors that can be +used to describe argument and return types: + +`ffi_type_void' + The type `void'. This cannot be used for argument types, only for + return values. + +`ffi_type_uint8' + An unsigned, 8-bit integer type. + +`ffi_type_sint8' + A signed, 8-bit integer type. + +`ffi_type_uint16' + An unsigned, 16-bit integer type. + +`ffi_type_sint16' + A signed, 16-bit integer type. + +`ffi_type_uint32' + An unsigned, 32-bit integer type. + +`ffi_type_sint32' + A signed, 32-bit integer type. + +`ffi_type_uint64' + An unsigned, 64-bit integer type. + +`ffi_type_sint64' + A signed, 64-bit integer type. + +`ffi_type_float' + The C `float' type. + +`ffi_type_double' + The C `double' type. + +`ffi_type_uchar' + The C `unsigned char' type. + +`ffi_type_schar' + The C `signed char' type. (Note that there is not an exact + equivalent to the C `char' type in `libffi'; ordinarily you should + either use `ffi_type_schar' or `ffi_type_uchar' depending on + whether `char' is signed.) + +`ffi_type_ushort' + The C `unsigned short' type. + +`ffi_type_sshort' + The C `short' type. + +`ffi_type_uint' + The C `unsigned int' type. + +`ffi_type_sint' + The C `int' type. + +`ffi_type_ulong' + The C `unsigned long' type. + +`ffi_type_slong' + The C `long' type. + +`ffi_type_longdouble' + On platforms that have a C `long double' type, this is defined. + On other platforms, it is not. + +`ffi_type_pointer' + A generic `void *' pointer. You should use this for all pointers, + regardless of their real type. + + Each of these is of type `ffi_type', so you must take the address +when passing to `ffi_prep_cif'. + + +File: libffi.info, Node: Structures, Next: Type Example, Prev: Primitive Types, Up: Types + +2.3.2 Structures +---------------- + +Although `libffi' has no special support for unions or bit-fields, it +is perfectly happy passing structures back and forth. You must first +describe the structure to `libffi' by creating a new `ffi_type' object +for it. + + -- ffi_type: + The `ffi_type' has the following members: + `size_t size' + This is set by `libffi'; you should initialize it to zero. + + `unsigned short alignment' + This is set by `libffi'; you should initialize it to zero. + + `unsigned short type' + For a structure, this should be set to `FFI_TYPE_STRUCT'. + + `ffi_type **elements' + This is a `NULL'-terminated array of pointers to `ffi_type' + objects. There is one element per field of the struct. + + +File: libffi.info, Node: Type Example, Prev: Structures, Up: Types + +2.3.3 Type Example +------------------ + +The following example initializes a `ffi_type' object representing the +`tm' struct from Linux's `time.h'. + + Here is how the struct is defined: + + struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + /* Those are for future use. */ + long int __tm_gmtoff__; + __const char *__tm_zone__; + }; + + Here is the corresponding code to describe this struct to `libffi': + + { + ffi_type tm_type; + ffi_type *tm_type_elements[12]; + int i; + + tm_type.size = tm_type.alignment = 0; + tm_type.elements = &tm_type_elements; + + for (i = 0; i < 9; i++) + tm_type_elements[i] = &ffi_type_sint; + + tm_type_elements[9] = &ffi_type_slong; + tm_type_elements[10] = &ffi_type_pointer; + tm_type_elements[11] = NULL; + + /* tm_type can now be used to represent tm argument types and + return types for ffi_prep_cif() */ + } + + +File: libffi.info, Node: Multiple ABIs, Next: The Closure API, Prev: Types, Up: Using libffi + +2.4 Multiple ABIs +================= + +A given platform may provide multiple different ABIs at once. For +instance, the x86 platform has both `stdcall' and `fastcall' functions. + + `libffi' provides some support for this. However, this is +necessarily platform-specific. + + +File: libffi.info, Node: The Closure API, Next: Closure Example, Prev: Multiple ABIs, Up: Using libffi + +2.5 The Closure API +=================== + +`libffi' also provides a way to write a generic function - a function +that can accept and decode any combination of arguments. This can be +useful when writing an interpreter, or to provide wrappers for +arbitrary functions. + + This facility is called the "closure API". Closures are not +supported on all platforms; you can check the `FFI_CLOSURES' define to +determine whether they are supported on the current platform. + + Because closures work by assembling a tiny function at runtime, they +require special allocation on platforms that have a non-executable +heap. Memory management for closures is handled by a pair of functions: + + -- Function: void *ffi_closure_alloc (size_t SIZE, void **CODE) + Allocate a chunk of memory holding SIZE bytes. This returns a + pointer to the writable address, and sets *CODE to the + corresponding executable address. + + SIZE should be sufficient to hold a `ffi_closure' object. + + -- Function: void ffi_closure_free (void *WRITABLE) + Free memory allocated using `ffi_closure_alloc'. The argument is + the writable address that was returned. + + Once you have allocated the memory for a closure, you must construct +a `ffi_cif' describing the function call. Finally you can prepare the +closure function: + + -- Function: ffi_status ffi_prep_closure_loc (ffi_closure *CLOSURE, + ffi_cif *CIF, void (*FUN) (ffi_cif *CIF, void *RET, void + **ARGS, void *USER_DATA), void *USER_DATA, void *CODELOC) + Prepare a closure function. + + CLOSURE is the address of a `ffi_closure' object; this is the + writable address returned by `ffi_closure_alloc'. + + CIF is the `ffi_cif' describing the function parameters. + + USER_DATA is an arbitrary datum that is passed, uninterpreted, to + your closure function. + + CODELOC is the executable address returned by `ffi_closure_alloc'. + + FUN is the function which will be called when the closure is + invoked. It is called with the arguments: + CIF + The `ffi_cif' passed to `ffi_prep_closure_loc'. + + RET + A pointer to the memory used for the function's return value. + FUN must fill this, unless the function is declared as + returning `void'. + + ARGS + A vector of pointers to memory holding the arguments to the + function. + + USER_DATA + The same USER_DATA that was passed to `ffi_prep_closure_loc'. + + `ffi_prep_closure_loc' will return `FFI_OK' if everything went ok, + and something else on error. + + After calling `ffi_prep_closure_loc', you can cast CODELOC to the + appropriate pointer-to-function type. + + You may see old code referring to `ffi_prep_closure'. This function +is deprecated, as it cannot handle the need for separate writable and +executable addresses. + + +File: libffi.info, Node: Closure Example, Prev: The Closure API, Up: Using libffi + +2.6 Closure Example +=================== + +A trivial example that creates a new `puts' by binding `fputs' with +`stdin'. + + #include + #include + + /* Acts like puts with the file given at time of enclosure. */ + void puts_binding(ffi_cif *cif, unsigned int *ret, void* args[], + FILE *stream) + { + *ret = fputs(*(char **)args[0], stream); + } + + int main() + { + ffi_cif cif; + ffi_type *args[1]; + ffi_closure *closure; + + int (*bound_puts)(char *); + int rc; + + /* Allocate closure and bound_puts */ + closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts); + + if (closure) + { + /* Initialize the argument info vectors */ + args[0] = &ffi_type_pointer; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, args) == FFI_OK) + { + /* Initialize the closure, setting stream to stdout */ + if (ffi_prep_closure_loc(closure, &cif, puts_binding, + stdout, bound_puts) == FFI_OK) + { + rc = bound_puts("Hello World!"); + /* rc now holds the result of the call to fputs */ + } + } + } + + /* Deallocate both closure, and bound_puts */ + ffi_closure_free(closure); + + return 0; + } + + +File: libffi.info, Node: Missing Features, Next: Index, Prev: Using libffi, Up: Top + +3 Missing Features +****************** + +`libffi' is missing a few features. We welcome patches to add support +for these. + + * There is no support for calling varargs functions. This may work + on some platforms, depending on how the ABI is defined, but it is + not reliable. + + * There is no support for bit fields in structures. + + * The closure API is + + * The "raw" API is undocumented. + + +File: libffi.info, Node: Index, Prev: Missing Features, Up: Top + +Index +***** + +[index] +* Menu: + +* : Structures. (line 12) +* ABI: Introduction. (line 13) +* Application Binary Interface: Introduction. (line 13) +* calling convention: Introduction. (line 13) +* cif: The Basics. (line 14) +* closure API: The Closure API. (line 13) +* closures: The Closure API. (line 13) +* FFI: Introduction. (line 31) +* ffi_call: The Basics. (line 41) +* ffi_closure_alloc: The Closure API. (line 19) +* ffi_closure_free: The Closure API. (line 26) +* FFI_CLOSURES: The Closure API. (line 13) +* ffi_prep_cif: The Basics. (line 16) +* ffi_prep_closure_loc: The Closure API. (line 34) +* ffi_status <1>: The Closure API. (line 37) +* ffi_status: The Basics. (line 18) +* ffi_type: Structures. (line 11) +* ffi_type_double: Primitive Types. (line 41) +* ffi_type_float: Primitive Types. (line 38) +* ffi_type_longdouble: Primitive Types. (line 71) +* ffi_type_pointer: Primitive Types. (line 75) +* ffi_type_schar: Primitive Types. (line 47) +* ffi_type_sint: Primitive Types. (line 62) +* ffi_type_sint16: Primitive Types. (line 23) +* ffi_type_sint32: Primitive Types. (line 29) +* ffi_type_sint64: Primitive Types. (line 35) +* ffi_type_sint8: Primitive Types. (line 17) +* ffi_type_slong: Primitive Types. (line 68) +* ffi_type_sshort: Primitive Types. (line 56) +* ffi_type_uchar: Primitive Types. (line 44) +* ffi_type_uint: Primitive Types. (line 59) +* ffi_type_uint16: Primitive Types. (line 20) +* ffi_type_uint32: Primitive Types. (line 26) +* ffi_type_uint64: Primitive Types. (line 32) +* ffi_type_uint8: Primitive Types. (line 14) +* ffi_type_ulong: Primitive Types. (line 65) +* ffi_type_ushort: Primitive Types. (line 53) +* ffi_type_void: Primitive Types. (line 10) +* Foreign Function Interface: Introduction. (line 31) +* void <1>: The Closure API. (line 20) +* void: The Basics. (line 43) + + + +Tag Table: +Node: Top706 +Node: Introduction1448 +Node: Using libffi3084 +Node: The Basics3570 +Node: Simple Example6356 +Node: Types7383 +Node: Primitive Types7666 +Node: Structures9486 +Node: Type Example10346 +Node: Multiple ABIs11569 +Node: The Closure API11940 +Node: Closure Example14884 +Node: Missing Features16443 +Node: Index16936 + +End Tag Table diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.texi b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.texi new file mode 100644 index 0000000..5cdd667 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.texi @@ -0,0 +1,600 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename libffi.info +@settitle libffi +@setchapternewpage off +@c %**end of header + +@c Merge the standard indexes into a single one. +@syncodeindex fn cp +@syncodeindex vr cp +@syncodeindex ky cp +@syncodeindex pg cp +@syncodeindex tp cp + +@include version.texi + +@copying + +This manual is for Libffi, a portable foreign-function interface +library. + +Copyright @copyright{} 2008, 2010 Red Hat, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +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. A copy of the license is included in the +section entitled ``GNU General Public License''. + +@end quotation +@end copying + +@dircategory Development +@direntry +* libffi: (libffi). Portable foreign-function interface library. +@end direntry + +@titlepage +@title Libffi +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + + +@ifnottex +@node Top +@top libffi + +@insertcopying + +@menu +* Introduction:: What is libffi? +* Using libffi:: How to use libffi. +* Missing Features:: Things libffi can't do. +* Index:: Index. +@end menu + +@end ifnottex + + +@node Introduction +@chapter What is libffi? + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the @dfn{calling +convention}. The calling convention is a set of assumptions made by +the compiler about where function arguments will be found on entry to +a function. A calling convention also specifies where the return +value for a function is found. The calling convention is also +sometimes called the @dfn{ABI} or @dfn{Application Binary Interface}. +@cindex calling convention +@cindex ABI +@cindex Application Binary Interface + +Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call +a given function. @samp{Libffi} can be used in such programs to +provide a bridge from the interpreter program to compiled code. + +The @samp{libffi} library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run +time. + +@acronym{FFI} stands for Foreign Function Interface. A foreign +function interface is the popular name for the interface that allows +code written in one language to call code written in another language. +The @samp{libffi} library really only provides the lowest, machine +dependent layer of a fully featured foreign function interface. A +layer must exist above @samp{libffi} that handles type conversions for +values passed between the two languages. +@cindex FFI +@cindex Foreign Function Interface + + +@node Using libffi +@chapter Using libffi + +@menu +* The Basics:: The basic libffi API. +* Simple Example:: A simple example. +* Types:: libffi type descriptions. +* Multiple ABIs:: Different passing styles on one platform. +* The Closure API:: Writing a generic function. +* Closure Example:: A closure example. +@end menu + + +@node The Basics +@section The Basics + +@samp{Libffi} assumes that you have a pointer to the function you wish +to call and that you know the number and types of arguments to pass +it, as well as the return type of the function. + +The first thing you must do is create an @code{ffi_cif} object that +matches the signature of the function you wish to call. This is a +separate step because it is common to make multiple calls using a +single @code{ffi_cif}. The @dfn{cif} in @code{ffi_cif} stands for +Call InterFace. To prepare a call interface object, use the function +@code{ffi_prep_cif}. +@cindex cif + +@findex ffi_prep_cif +@defun ffi_status ffi_prep_cif (ffi_cif *@var{cif}, ffi_abi @var{abi}, unsigned int @var{nargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes}) +This initializes @var{cif} according to the given parameters. + +@var{abi} is the ABI to use; normally @code{FFI_DEFAULT_ABI} is what +you want. @ref{Multiple ABIs} for more information. + +@var{nargs} is the number of arguments that this function accepts. +@samp{libffi} does not yet handle varargs functions; see @ref{Missing +Features} for more information. + +@var{rtype} is a pointer to an @code{ffi_type} structure that +describes the return type of the function. @xref{Types}. + +@var{argtypes} is a vector of @code{ffi_type} pointers. +@var{argtypes} must have @var{nargs} elements. If @var{nargs} is 0, +this argument is ignored. + +@code{ffi_prep_cif} returns a @code{libffi} status code, of type +@code{ffi_status}. This will be either @code{FFI_OK} if everything +worked properly; @code{FFI_BAD_TYPEDEF} if one of the @code{ffi_type} +objects is incorrect; or @code{FFI_BAD_ABI} if the @var{abi} parameter +is invalid. +@end defun + + +To call a function using an initialized @code{ffi_cif}, use the +@code{ffi_call} function: + +@findex ffi_call +@defun void ffi_call (ffi_cif *@var{cif}, void *@var{fn}, void *@var{rvalue}, void **@var{avalues}) +This calls the function @var{fn} according to the description given in +@var{cif}. @var{cif} must have already been prepared using +@code{ffi_prep_cif}. + +@var{rvalue} is a pointer to a chunk of memory that will hold the +result of the function call. This must be large enough to hold the +result and must be suitably aligned; it is the caller's responsibility +to ensure this. If @var{cif} declares that the function returns +@code{void} (using @code{ffi_type_void}), then @var{rvalue} is +ignored. If @var{rvalue} is @samp{NULL}, then the return value is +discarded. + +@var{avalues} is a vector of @code{void *} pointers that point to the +memory locations holding the argument values for a call. If @var{cif} +declares that the function has no arguments (i.e., @var{nargs} was 0), +then @var{avalues} is ignored. Note that argument values may be +modified by the callee (for instance, structs passed by value); the +burden of copying pass-by-value arguments is placed on the caller. +@end defun + + +@node Simple Example +@section Simple Example + +Here is a trivial example that calls @code{puts} a few times. + +@example +#include +#include + +int main() +@{ + ffi_cif cif; + ffi_type *args[1]; + void *values[1]; + char *s; + int rc; + + /* Initialize the argument info vectors */ + args[0] = &ffi_type_pointer; + values[0] = &s; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, args) == FFI_OK) + @{ + s = "Hello World!"; + ffi_call(&cif, puts, &rc, values); + /* rc now holds the result of the call to puts */ + + /* values holds a pointer to the function's arg, so to + call puts() again all we need to do is change the + value of s */ + s = "This is cool!"; + ffi_call(&cif, puts, &rc, values); + @} + + return 0; +@} +@end example + + +@node Types +@section Types + +@menu +* Primitive Types:: Built-in types. +* Structures:: Structure types. +* Type Example:: Structure type example. +@end menu + +@node Primitive Types +@subsection Primitive Types + +@code{Libffi} provides a number of built-in type descriptors that can +be used to describe argument and return types: + +@table @code +@item ffi_type_void +@tindex ffi_type_void +The type @code{void}. This cannot be used for argument types, only +for return values. + +@item ffi_type_uint8 +@tindex ffi_type_uint8 +An unsigned, 8-bit integer type. + +@item ffi_type_sint8 +@tindex ffi_type_sint8 +A signed, 8-bit integer type. + +@item ffi_type_uint16 +@tindex ffi_type_uint16 +An unsigned, 16-bit integer type. + +@item ffi_type_sint16 +@tindex ffi_type_sint16 +A signed, 16-bit integer type. + +@item ffi_type_uint32 +@tindex ffi_type_uint32 +An unsigned, 32-bit integer type. + +@item ffi_type_sint32 +@tindex ffi_type_sint32 +A signed, 32-bit integer type. + +@item ffi_type_uint64 +@tindex ffi_type_uint64 +An unsigned, 64-bit integer type. + +@item ffi_type_sint64 +@tindex ffi_type_sint64 +A signed, 64-bit integer type. + +@item ffi_type_float +@tindex ffi_type_float +The C @code{float} type. + +@item ffi_type_double +@tindex ffi_type_double +The C @code{double} type. + +@item ffi_type_uchar +@tindex ffi_type_uchar +The C @code{unsigned char} type. + +@item ffi_type_schar +@tindex ffi_type_schar +The C @code{signed char} type. (Note that there is not an exact +equivalent to the C @code{char} type in @code{libffi}; ordinarily you +should either use @code{ffi_type_schar} or @code{ffi_type_uchar} +depending on whether @code{char} is signed.) + +@item ffi_type_ushort +@tindex ffi_type_ushort +The C @code{unsigned short} type. + +@item ffi_type_sshort +@tindex ffi_type_sshort +The C @code{short} type. + +@item ffi_type_uint +@tindex ffi_type_uint +The C @code{unsigned int} type. + +@item ffi_type_sint +@tindex ffi_type_sint +The C @code{int} type. + +@item ffi_type_ulong +@tindex ffi_type_ulong +The C @code{unsigned long} type. + +@item ffi_type_slong +@tindex ffi_type_slong +The C @code{long} type. + +@item ffi_type_longdouble +@tindex ffi_type_longdouble +On platforms that have a C @code{long double} type, this is defined. +On other platforms, it is not. + +@item ffi_type_pointer +@tindex ffi_type_pointer +A generic @code{void *} pointer. You should use this for all +pointers, regardless of their real type. +@end table + +Each of these is of type @code{ffi_type}, so you must take the address +when passing to @code{ffi_prep_cif}. + + +@node Structures +@subsection Structures + +Although @samp{libffi} has no special support for unions or +bit-fields, it is perfectly happy passing structures back and forth. +You must first describe the structure to @samp{libffi} by creating a +new @code{ffi_type} object for it. + +@tindex ffi_type +@deftp ffi_type +The @code{ffi_type} has the following members: +@table @code +@item size_t size +This is set by @code{libffi}; you should initialize it to zero. + +@item unsigned short alignment +This is set by @code{libffi}; you should initialize it to zero. + +@item unsigned short type +For a structure, this should be set to @code{FFI_TYPE_STRUCT}. + +@item ffi_type **elements +This is a @samp{NULL}-terminated array of pointers to @code{ffi_type} +objects. There is one element per field of the struct. +@end table +@end deftp + + +@node Type Example +@subsection Type Example + +The following example initializes a @code{ffi_type} object +representing the @code{tm} struct from Linux's @file{time.h}. + +Here is how the struct is defined: + +@example +struct tm @{ + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + /* Those are for future use. */ + long int __tm_gmtoff__; + __const char *__tm_zone__; +@}; +@end example + +Here is the corresponding code to describe this struct to +@code{libffi}: + +@example + @{ + ffi_type tm_type; + ffi_type *tm_type_elements[12]; + int i; + + tm_type.size = tm_type.alignment = 0; + tm_type.elements = &tm_type_elements; + + for (i = 0; i < 9; i++) + tm_type_elements[i] = &ffi_type_sint; + + tm_type_elements[9] = &ffi_type_slong; + tm_type_elements[10] = &ffi_type_pointer; + tm_type_elements[11] = NULL; + + /* tm_type can now be used to represent tm argument types and + return types for ffi_prep_cif() */ + @} +@end example + + +@node Multiple ABIs +@section Multiple ABIs + +A given platform may provide multiple different ABIs at once. For +instance, the x86 platform has both @samp{stdcall} and @samp{fastcall} +functions. + +@code{libffi} provides some support for this. However, this is +necessarily platform-specific. + +@c FIXME: document the platforms + +@node The Closure API +@section The Closure API + +@code{libffi} also provides a way to write a generic function -- a +function that can accept and decode any combination of arguments. +This can be useful when writing an interpreter, or to provide wrappers +for arbitrary functions. + +This facility is called the @dfn{closure API}. Closures are not +supported on all platforms; you can check the @code{FFI_CLOSURES} +define to determine whether they are supported on the current +platform. +@cindex closures +@cindex closure API +@findex FFI_CLOSURES + +Because closures work by assembling a tiny function at runtime, they +require special allocation on platforms that have a non-executable +heap. Memory management for closures is handled by a pair of +functions: + +@findex ffi_closure_alloc +@defun void *ffi_closure_alloc (size_t @var{size}, void **@var{code}) +Allocate a chunk of memory holding @var{size} bytes. This returns a +pointer to the writable address, and sets *@var{code} to the +corresponding executable address. + +@var{size} should be sufficient to hold a @code{ffi_closure} object. +@end defun + +@findex ffi_closure_free +@defun void ffi_closure_free (void *@var{writable}) +Free memory allocated using @code{ffi_closure_alloc}. The argument is +the writable address that was returned. +@end defun + + +Once you have allocated the memory for a closure, you must construct a +@code{ffi_cif} describing the function call. Finally you can prepare +the closure function: + +@findex ffi_prep_closure_loc +@defun ffi_status ffi_prep_closure_loc (ffi_closure *@var{closure}, ffi_cif *@var{cif}, void (*@var{fun}) (ffi_cif *@var{cif}, void *@var{ret}, void **@var{args}, void *@var{user_data}), void *@var{user_data}, void *@var{codeloc}) +Prepare a closure function. + +@var{closure} is the address of a @code{ffi_closure} object; this is +the writable address returned by @code{ffi_closure_alloc}. + +@var{cif} is the @code{ffi_cif} describing the function parameters. + +@var{user_data} is an arbitrary datum that is passed, uninterpreted, +to your closure function. + +@var{codeloc} is the executable address returned by +@code{ffi_closure_alloc}. + +@var{fun} is the function which will be called when the closure is +invoked. It is called with the arguments: +@table @var +@item cif +The @code{ffi_cif} passed to @code{ffi_prep_closure_loc}. + +@item ret +A pointer to the memory used for the function's return value. +@var{fun} must fill this, unless the function is declared as returning +@code{void}. +@c FIXME: is this NULL for void-returning functions? + +@item args +A vector of pointers to memory holding the arguments to the function. + +@item user_data +The same @var{user_data} that was passed to +@code{ffi_prep_closure_loc}. +@end table + +@code{ffi_prep_closure_loc} will return @code{FFI_OK} if everything +went ok, and something else on error. +@c FIXME: what? + +After calling @code{ffi_prep_closure_loc}, you can cast @var{codeloc} +to the appropriate pointer-to-function type. +@end defun + +You may see old code referring to @code{ffi_prep_closure}. This +function is deprecated, as it cannot handle the need for separate +writable and executable addresses. + +@node Closure Example +@section Closure Example + +A trivial example that creates a new @code{puts} by binding +@code{fputs} with @code{stdin}. + +@example +#include +#include + +/* Acts like puts with the file given at time of enclosure. */ +void puts_binding(ffi_cif *cif, unsigned int *ret, void* args[], + FILE *stream) +@{ + *ret = fputs(*(char **)args[0], stream); +@} + +int main() +@{ + ffi_cif cif; + ffi_type *args[1]; + ffi_closure *closure; + + int (*bound_puts)(char *); + int rc; + + /* Allocate closure and bound_puts */ + closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts); + + if (closure) + @{ + /* Initialize the argument info vectors */ + args[0] = &ffi_type_pointer; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, args) == FFI_OK) + @{ + /* Initialize the closure, setting stream to stdout */ + if (ffi_prep_closure_loc(closure, &cif, puts_binding, + stdout, bound_puts) == FFI_OK) + @{ + rc = bound_puts("Hello World!"); + /* rc now holds the result of the call to fputs */ + @} + @} + @} + + /* Deallocate both closure, and bound_puts */ + ffi_closure_free(closure); + + return 0; +@} + +@end example + + +@node Missing Features +@chapter Missing Features + +@code{libffi} is missing a few features. We welcome patches to add +support for these. + +@itemize @bullet +@item +There is no support for calling varargs functions. This may work on +some platforms, depending on how the ABI is defined, but it is not +reliable. + +@item +There is no support for bit fields in structures. + +@item +The closure API is + +@c FIXME: ... + +@item +The ``raw'' API is undocumented. +@c argument promotion? +@c unions? +@c anything else? +@end itemize + + +@node Index +@unnumbered Index + +@printindex cp + +@bye diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/stamp-vti b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/stamp-vti new file mode 100644 index 0000000..5377bb8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/stamp-vti @@ -0,0 +1,4 @@ +@set UPDATED 23 August 2011 +@set UPDATED-MONTH August 2011 +@set EDITION 3.0.10 +@set VERSION 3.0.10 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/version.texi b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/version.texi new file mode 100644 index 0000000..5377bb8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/version.texi @@ -0,0 +1,4 @@ +@set UPDATED 23 August 2011 +@set UPDATED-MONTH August 2011 +@set EDITION 3.0.10 +@set VERSION 3.0.10 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.h.in b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.h.in new file mode 100644 index 0000000..6c92c56 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.h.in @@ -0,0 +1,199 @@ +/* fficonfig.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to the flags needed for the .section .eh_frame directive. */ +#undef EH_FRAME_FLAGS + +/* Define this if you want extra debugging. */ +#undef FFI_DEBUG + +/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ +#undef FFI_EXEC_TRAMPOLINE_TABLE + +/* Cannot use malloc on this target, so, we revert to alternative means */ +#undef FFI_MMAP_EXEC_WRIT + +/* Define this is you do not want support for the raw API. */ +#undef FFI_NO_RAW_API + +/* Define this is you do not want support for aggregate types. */ +#undef FFI_NO_STRUCTS + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define if your assembler supports .ascii. */ +#undef HAVE_AS_ASCII_PSEUDO_OP + +/* Define if your assembler supports .cfi_* directives. */ +#undef HAVE_AS_CFI_PSEUDO_OP + +/* Define if your assembler supports .register. */ +#undef HAVE_AS_REGISTER_PSEUDO_OP + +/* Define if your assembler and linker support unaligned PC relative relocs. + */ +#undef HAVE_AS_SPARC_UA_PCREL + +/* Define if your assembler supports .string. */ +#undef HAVE_AS_STRING_PSEUDO_OP + +/* Define if your assembler supports unwind section type. */ +#undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE + +/* Define if your assembler supports PC relative relocs. */ +#undef HAVE_AS_X86_PCREL + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define if __attribute__((visibility("hidden"))) is supported. */ +#undef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if you have the long double type and it is bigger than a double */ +#undef HAVE_LONG_DOUBLE + +/* Define to 1 if you have the `memcpy' function. */ +#undef HAVE_MEMCPY + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mmap' function. */ +#undef HAVE_MMAP + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#undef HAVE_MMAP_ANON + +/* Define if mmap of /dev/zero works. */ +#undef HAVE_MMAP_DEV_ZERO + +/* Define if read-only mmap of a plain file works. */ +#undef HAVE_MMAP_FILE + +/* Define if .eh_frame sections should be read-only. */ +#undef HAVE_RO_EH_FRAME + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MMAN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of `double', as computed by sizeof. */ +#undef SIZEOF_DOUBLE + +/* The size of `long double', as computed by sizeof. */ +#undef SIZEOF_LONG_DOUBLE + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define this if you are using Purify and want to suppress spurious messages. + */ +#undef USING_PURIFY + +/* Version number of package */ +#undef VERSION + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Define to `unsigned int' if does not define. */ +#undef size_t + + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) .hidden name +#else +#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +#endif +#else +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) +#else +#define FFI_HIDDEN +#endif +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.hw b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.hw new file mode 100644 index 0000000..4d7506a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.hw @@ -0,0 +1,57 @@ +/* -----------------------------------------------------------------*-C-*- + libffi - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + + -------------------------------------------------------------------- */ + +#ifndef LIBFFICONFIG_H +#define LIBFFICONFIG_H + +#define HAVE_ALLOCA 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_TYPES_H 1 +#define STDC_HEADERS 1 + +#if defined(X86_WIN64) +#define SIZEOF_DOUBLE 8 +#define SIZEOF_LONG_DOUBLE 0 +#else +#define SIZEOF_DOUBLE 8 +#define SIZEOF_LONG_DOUBLE 0 +#endif + +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) +#else +#define FFI_HIDDEN +#endif + +#endif /* LIBFFICONFIG_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.am b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.am new file mode 100644 index 0000000..fd28024 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.am @@ -0,0 +1,9 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS=foreign + +DISTCLEANFILES=ffitarget.h +EXTRA_DIST=ffi.h.in ffi_common.h + +includesdir = $(libdir)/@PACKAGE_NAME@-@PACKAGE_VERSION@/include +nodist_includes_HEADERS = ffi.h ffitarget.h diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.in b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.in new file mode 100644 index 0000000..f3d3ef2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.in @@ -0,0 +1,487 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = include +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/ffi.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = ffi.h ffitarget.h +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(includesdir)" +HEADERS = $(nodist_includes_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_LTLDFLAGS = @AM_LTLDFLAGS@ +AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PRTDIAG = @PRTDIAG@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TARGET = @TARGET@ +TARGETDIR = @TARGETDIR@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +ax_enable_builddir_sed = @ax_enable_builddir_sed@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sys_symbol_underscore = @sys_symbol_underscore@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +toolexecdir = @toolexecdir@ +toolexeclibdir = @toolexeclibdir@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign +DISTCLEANFILES = ffitarget.h +EXTRA_DIST = ffi.h.in ffi_common.h +includesdir = $(libdir)/@PACKAGE_NAME@-@PACKAGE_VERSION@/include +nodist_includes_HEADERS = ffi.h ffitarget.h +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +ffi.h: $(top_builddir)/config.status $(srcdir)/ffi.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-nodist_includesHEADERS: $(nodist_includes_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)" + @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \ + done + +uninstall-nodist_includesHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(includesdir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(includesdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-nodist_includesHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-nodist_includesHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool ctags distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-nodist_includesHEADERS \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-nodist_includesHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.in b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.in new file mode 100644 index 0000000..f5a29b0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.in @@ -0,0 +1,427 @@ +/* -----------------------------------------------------------------*-C-*- + libffi @VERSION@ - Copyright (c) 2011 Anthony Green + - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the ``Software''), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and cloure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifndef @TARGET@ +#define @TARGET@ +#endif + +/* ---- System configuration information --------------------------------- */ + +#include + +#ifndef LIBFFI_ASM + +#ifdef _MSC_VER +#define __attribute__(X) +#endif + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ + +#define FFI_64_BIT_MAX 9223372036854775807 + +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif /* _AIX52 or newer */ +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ +# ifndef __PPC64__ +# if defined (__IBMC__) || defined (__IBMCPP__) +# define FFI_LONG_LONG_MAX LONGLONG_MAX +# endif +# endif /* __PPC64__ */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif +# endif +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t */ +/* can hold a pointer. */ + +typedef struct _ffi_type +{ + size_t size; + unsigned short alignment; + unsigned short type; + struct _ffi_type **elements; +} ffi_type; + +#ifndef LIBFFI_HIDE_BASIC_TYPES +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else + #error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else + #error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else + #error "int size not supported" +#endif + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX + #error "no 64-bit data type supported" +# endif +#elif LONG_MAX != FFI_64_BIT_MAX + #error "long size not supported" +#endif + +#if LONG_MAX == 2147483647 +# define ffi_type_ulong ffi_type_uint32 +# define ffi_type_slong ffi_type_sint32 +#elif LONG_MAX == FFI_64_BIT_MAX +# define ffi_type_ulong ffi_type_uint64 +# define ffi_type_slong ffi_type_sint64 +#else + #error "long size not supported" +#endif + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_pointer; + +#if @HAVE_LONG_DOUBLE@ +extern ffi_type ffi_type_longdouble; +#else +#define ffi_type_longdouble ffi_type_double +#endif +#endif /* LIBFFI_HIDE_BASIC_TYPES */ + +typedef enum { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct { + ffi_abi abi; + unsigned nargs; + ffi_type **arg_types; + ffi_type *rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == FFI_64_BIT_MAX +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +#ifndef FFI_SIZEOF_JAVA_RAW +# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 +/* This is a special case for mips64/n32 ABI (and perhaps others) where + sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ +typedef union { + signed int sint; + unsigned int uint; + float flt; + char data[FFI_SIZEOF_JAVA_RAW]; + void* ptr; +} ffi_java_raw; +#else +typedef ffi_raw ffi_java_raw; +#endif + + +void ffi_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_raw *avalue); + +void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +size_t ffi_raw_size (ffi_cif *cif); + +/* This is analogous to the raw API, except it uses Java parameter */ +/* packing, even on 64-bit machines. I.e. on 64-bit machines */ +/* longs and doubles are followed by an empty 64-bit word. */ + +void ffi_java_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_java_raw *avalue); + +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); +size_t ffi_java_raw_size (ffi_cif *cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +#ifdef _MSC_VER +__declspec(align(8)) +#endif +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void *user_data; +#ifdef __GNUC__ +} ffi_closure __attribute__((aligned (8))); +#else +} ffi_closure; +# ifdef __sgi +# pragma pack 0 +# endif +#endif + +void *ffi_closure_alloc (size_t size, void **code); +void ffi_closure_free (void *); + +ffi_status +ffi_prep_closure (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data); + +ffi_status +ffi_prep_closure_loc (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void*codeloc); + +#ifdef __sgi +# pragma pack 8 +#endif +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void *user_data; + +} ffi_raw_closure; + +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); + void *user_data; + +} ffi_java_raw_closure; + +ffi_status +ffi_prep_raw_closure (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data); + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc); + +ffi_status +ffi_prep_java_raw_closure (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data); + +ffi_status +ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, + void *codeloc); + +#endif /* FFI_CLOSURES */ + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status ffi_prep_cif(ffi_cif *cif, + ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, + ffi_type **atypes); + +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +/* ---- Definitions shared with assembly code ---------------------------- */ + +#endif + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 +#if @HAVE_LONG_DOUBLE@ +#define FFI_TYPE_LONGDOUBLE 4 +#else +#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc new file mode 100644 index 0000000..7ba954c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc @@ -0,0 +1,427 @@ +/* -----------------------------------------------------------------*-C-*- + libffi 3.0.10 - Copyright (c) 2011 Anthony Green + - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the ``Software''), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and cloure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifndef X86_WIN32 +#define X86_WIN32 +#endif + +/* ---- System configuration information --------------------------------- */ + +#include + +#ifndef LIBFFI_ASM + +#ifdef _MSC_VER +#define __attribute__(X) +#endif + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ + +#define FFI_64_BIT_MAX 9223372036854775807 + +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif /* _AIX52 or newer */ +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ +# ifndef __PPC64__ +# if defined (__IBMC__) || defined (__IBMCPP__) +# define FFI_LONG_LONG_MAX LONGLONG_MAX +# endif +# endif /* __PPC64__ */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif +# endif +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t */ +/* can hold a pointer. */ + +typedef struct _ffi_type +{ + size_t size; + unsigned short alignment; + unsigned short type; + struct _ffi_type **elements; +} ffi_type; + +#ifndef LIBFFI_HIDE_BASIC_TYPES +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else + #error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else + #error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else + #error "int size not supported" +#endif + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX + #error "no 64-bit data type supported" +# endif +#elif LONG_MAX != FFI_64_BIT_MAX + #error "long size not supported" +#endif + +#if LONG_MAX == 2147483647 +# define ffi_type_ulong ffi_type_uint32 +# define ffi_type_slong ffi_type_sint32 +#elif LONG_MAX == FFI_64_BIT_MAX +# define ffi_type_ulong ffi_type_uint64 +# define ffi_type_slong ffi_type_sint64 +#else + #error "long size not supported" +#endif + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_pointer; + +#if 0 +extern ffi_type ffi_type_longdouble; +#else +#define ffi_type_longdouble ffi_type_double +#endif +#endif /* LIBFFI_HIDE_BASIC_TYPES */ + +typedef enum { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct { + ffi_abi abi; + unsigned nargs; + ffi_type **arg_types; + ffi_type *rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == FFI_64_BIT_MAX +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +#ifndef FFI_SIZEOF_JAVA_RAW +# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 +/* This is a special case for mips64/n32 ABI (and perhaps others) where + sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ +typedef union { + signed int sint; + unsigned int uint; + float flt; + char data[FFI_SIZEOF_JAVA_RAW]; + void* ptr; +} ffi_java_raw; +#else +typedef ffi_raw ffi_java_raw; +#endif + + +void ffi_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_raw *avalue); + +void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +size_t ffi_raw_size (ffi_cif *cif); + +/* This is analogous to the raw API, except it uses Java parameter */ +/* packing, even on 64-bit machines. I.e. on 64-bit machines */ +/* longs and doubles are followed by an empty 64-bit word. */ + +void ffi_java_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_java_raw *avalue); + +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); +size_t ffi_java_raw_size (ffi_cif *cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +#ifdef _MSC_VER +__declspec(align(8)) +#endif +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void *user_data; +#ifdef __GNUC__ +} ffi_closure __attribute__((aligned (8))); +#else +} ffi_closure; +# ifdef __sgi +# pragma pack 0 +# endif +#endif + +void *ffi_closure_alloc (size_t size, void **code); +void ffi_closure_free (void *); + +ffi_status +ffi_prep_closure (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data); + +ffi_status +ffi_prep_closure_loc (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void*codeloc); + +#ifdef __sgi +# pragma pack 8 +#endif +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void *user_data; + +} ffi_raw_closure; + +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); + void *user_data; + +} ffi_java_raw_closure; + +ffi_status +ffi_prep_raw_closure (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data); + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc); + +ffi_status +ffi_prep_java_raw_closure (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data); + +ffi_status +ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, + void *codeloc); + +#endif /* FFI_CLOSURES */ + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status ffi_prep_cif(ffi_cif *cif, + ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, + ffi_type **atypes); + +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +/* ---- Definitions shared with assembly code ---------------------------- */ + +#endif + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 +#if 0 +#define FFI_TYPE_LONGDOUBLE 4 +#else +#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc64 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc64 new file mode 100644 index 0000000..6489c9f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc64 @@ -0,0 +1,427 @@ +/* -----------------------------------------------------------------*-C-*- + libffi 3.0.10 - Copyright (c) 2011 Anthony Green + - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the ``Software''), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and cloure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifndef X86_WIN64 +#define X86_WIN64 +#endif + +/* ---- System configuration information --------------------------------- */ + +#include + +#ifndef LIBFFI_ASM + +#ifdef _MSC_VER +#define __attribute__(X) +#endif + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ + +#define FFI_64_BIT_MAX 9223372036854775807 + +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif /* _AIX52 or newer */ +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ +# ifndef __PPC64__ +# if defined (__IBMC__) || defined (__IBMCPP__) +# define FFI_LONG_LONG_MAX LONGLONG_MAX +# endif +# endif /* __PPC64__ */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif +# endif +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t */ +/* can hold a pointer. */ + +typedef struct _ffi_type +{ + size_t size; + unsigned short alignment; + unsigned short type; + struct _ffi_type **elements; +} ffi_type; + +#ifndef LIBFFI_HIDE_BASIC_TYPES +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else + #error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else + #error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else + #error "int size not supported" +#endif + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX + #error "no 64-bit data type supported" +# endif +#elif LONG_MAX != FFI_64_BIT_MAX + #error "long size not supported" +#endif + +#if LONG_MAX == 2147483647 +# define ffi_type_ulong ffi_type_uint32 +# define ffi_type_slong ffi_type_sint32 +#elif LONG_MAX == FFI_64_BIT_MAX +# define ffi_type_ulong ffi_type_uint64 +# define ffi_type_slong ffi_type_sint64 +#else + #error "long size not supported" +#endif + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_pointer; + +#if 0 +extern ffi_type ffi_type_longdouble; +#else +#define ffi_type_longdouble ffi_type_double +#endif +#endif /* LIBFFI_HIDE_BASIC_TYPES */ + +typedef enum { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct { + ffi_abi abi; + unsigned nargs; + ffi_type **arg_types; + ffi_type *rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == FFI_64_BIT_MAX +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +#ifndef FFI_SIZEOF_JAVA_RAW +# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 +/* This is a special case for mips64/n32 ABI (and perhaps others) where + sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ +typedef union { + signed int sint; + unsigned int uint; + float flt; + char data[FFI_SIZEOF_JAVA_RAW]; + void* ptr; +} ffi_java_raw; +#else +typedef ffi_raw ffi_java_raw; +#endif + + +void ffi_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_raw *avalue); + +void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +size_t ffi_raw_size (ffi_cif *cif); + +/* This is analogous to the raw API, except it uses Java parameter */ +/* packing, even on 64-bit machines. I.e. on 64-bit machines */ +/* longs and doubles are followed by an empty 64-bit word. */ + +void ffi_java_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_java_raw *avalue); + +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); +size_t ffi_java_raw_size (ffi_cif *cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +#ifdef _MSC_VER +__declspec(align(8)) +#endif +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void *user_data; +#ifdef __GNUC__ +} ffi_closure __attribute__((aligned (8))); +#else +} ffi_closure; +# ifdef __sgi +# pragma pack 0 +# endif +#endif + +void *ffi_closure_alloc (size_t size, void **code); +void ffi_closure_free (void *); + +ffi_status +ffi_prep_closure (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data); + +ffi_status +ffi_prep_closure_loc (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void*codeloc); + +#ifdef __sgi +# pragma pack 8 +#endif +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void *user_data; + +} ffi_raw_closure; + +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); + void *user_data; + +} ffi_java_raw_closure; + +ffi_status +ffi_prep_raw_closure (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data); + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc); + +ffi_status +ffi_prep_java_raw_closure (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data); + +ffi_status +ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, + void *codeloc); + +#endif /* FFI_CLOSURES */ + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status ffi_prep_cif(ffi_cif *cif, + ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, + ffi_type **atypes); + +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +/* ---- Definitions shared with assembly code ---------------------------- */ + +#endif + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 +#if 0 +#define FFI_TYPE_LONGDOUBLE 4 +#else +#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi_common.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi_common.h new file mode 100644 index 0000000..d953762 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi_common.h @@ -0,0 +1,126 @@ +/* ----------------------------------------------------------------------- + ffi_common.h - Copyright (C) 2011 Anthony Green + Copyright (C) 2007 Free Software Foundation, Inc + Copyright (c) 1996 Red Hat, Inc. + + Common internal definitions and macros. Only necessary for building + libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_COMMON_H +#define FFI_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Do not move this. Some versions of AIX are very picky about where + this is positioned. */ +#ifdef __GNUC__ +/* mingw64 defines this already in malloc.h. */ +#ifndef alloca +# define alloca __builtin_alloca +#endif +# define MAYBE_UNUSED __attribute__((__unused__)) +#else +# define MAYBE_UNUSED +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +# ifdef _MSC_VER +# define alloca _alloca +# else +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +/* Check for the existence of memcpy. */ +#if STDC_HEADERS +# include +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#if defined(FFI_DEBUG) +#include +#endif + +#ifdef FFI_DEBUG +void ffi_assert(char *expr, char *file, int line); +void ffi_stop_here(void); +void ffi_type_test(ffi_type *a, char *file, int line); + +#define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) +#define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) +#define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__) +#else +#define FFI_ASSERT(x) +#define FFI_ASSERT_AT(x, f, l) +#define FFI_ASSERT_VALID_TYPE(x) +#endif + +#define ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) +#define ALIGN_DOWN(v, a) (((size_t) (v)) & -a) + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif); + +/* Extended cif, used in callback from assembly routine */ +typedef struct +{ + ffi_cif *cif; + void *rvalue; + void **avalue; +} extended_cif; + +/* Terse sized type definitions. */ +#if defined(_MSC_VER) || defined(__sgi) +typedef unsigned char UINT8; +typedef signed char SINT8; +typedef unsigned short UINT16; +typedef signed short SINT16; +typedef unsigned int UINT32; +typedef signed int SINT32; +# ifdef _MSC_VER +typedef unsigned __int64 UINT64; +typedef signed __int64 SINT64; +# else +# include +typedef uint64_t UINT64; +typedef int64_t SINT64; +# endif +#else +typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); +typedef signed int SINT8 __attribute__((__mode__(__QI__))); +typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); +typedef signed int SINT16 __attribute__((__mode__(__HI__))); +typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); +typedef signed int SINT32 __attribute__((__mode__(__SI__))); +typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); +typedef signed int SINT64 __attribute__((__mode__(__DI__))); +#endif + +typedef float FLOAT32; + +#ifndef __GNUC__ +#define __builtin_expect(x, expected_value) (x) +#endif +#define LIKELY(x) __builtin_expect((x),1) +#define UNLIKELY(x) __builtin_expect((x),1) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh new file mode 100755 index 0000000..6781b98 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libffi.pc.in b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libffi.pc.in new file mode 100644 index 0000000..c2e1c7b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libffi.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=${libdir}/@PACKAGE_NAME@-@PACKAGE_VERSION@/include + +Name: @PACKAGE_NAME@ +Description: Library supporting Foreign Function Interfaces +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lffi +Cflags: -I${includedir} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libtool-version b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libtool-version new file mode 100644 index 0000000..b8b80e0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libtool-version @@ -0,0 +1,29 @@ +# This file is used to maintain libtool version info for libffi. See +# the libtool manual to understand the meaning of the fields. This is +# a separate file so that version updates don't involve re-running +# automake. +# +# Here are a set of rules to help you update your library version +# information: +# +# 1. Start with version information of `0:0:0' for each libtool library. +# +# 2. Update the version information only immediately before a public +# release of your software. More frequent updates are unnecessary, +# and only guarantee that the current interface number gets larger +# faster. +# +# 3. If the library source code has changed at all since the last +# update, then increment revision (`c:r:a' becomes `c:r+1:a'). +# +# 4. If any interfaces have been added, removed, or changed since the +# last update, increment current, and set revision to 0. +# +# 5. If any interfaces have been added since the last public release, +# then increment age. +# +# 6. If any interfaces have been removed since the last public +# release, then set age to 0. +# +# CURRENT:REVISION:AGE +5:10:0 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ltmain.sh b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ltmain.sh new file mode 100755 index 0000000..aa5624c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ltmain.sh @@ -0,0 +1,9636 @@ + +# libtool (GNU libtool) 2.4 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool 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 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4 +TIMESTAMP="" +package_revision=1.3293 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${EGREP="/bin/grep -E"} +: ${FGREP="/bin/grep -F"} +: ${GREP="/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/bin/sed"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=: + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}=\$${1}\${2}" +} # func_append may be replaced by extended shell implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" +} # func_append_quoted may be replaced by extended shell implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "${@}"` +} # func_arith may be replaced by extended shell implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \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" +#define SHELL_SPACE_CHARS " \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" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' + + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_apped perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 new file mode 100644 index 0000000..2957da7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 @@ -0,0 +1,176 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_cc_maxopt.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CC_MAXOPT +# +# DESCRIPTION +# +# Try to turn on "good" C optimization flags for various compilers and +# architectures, for some definition of "good". (In our case, good for +# FFTW and hopefully for other scientific codes. Modify as needed.) +# +# The user can override the flags by setting the CFLAGS environment +# variable. The user can also specify --enable-portable-binary in order to +# disable any optimization flags that might result in a binary that only +# runs on the host architecture. +# +# Note also that the flags assume that ANSI C aliasing rules are followed +# by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point +# computations can be re-ordered as needed. +# +# Requires macros: AX_CHECK_COMPILER_FLAGS, AX_COMPILER_VENDOR, +# AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2008 Matteo Frigo +# +# 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 3 of the License, 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 11 + +AC_DEFUN([AX_CC_MAXOPT], +[ +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AX_COMPILER_VENDOR]) +AC_REQUIRE([AC_CANONICAL_HOST]) + +AC_ARG_ENABLE(portable-binary, [AS_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])], + acx_maxopt_portable=$withval, acx_maxopt_portable=no) + +# Try to determine "good" native compiler flags if none specified via CFLAGS +if test "$ac_test_CFLAGS" != "set"; then + CFLAGS="" + case $ax_cv_c_compiler_vendor in + dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" + if test "x$acx_maxopt_portable" = xno; then + CFLAGS="$CFLAGS -arch host" + fi;; + + sun) CFLAGS="-native -fast -xO5 -dalign" + if test "x$acx_maxopt_portable" = xyes; then + CFLAGS="$CFLAGS -xarch=generic" + fi;; + + hp) CFLAGS="+Oall +Optrs_ansi +DSnative" + if test "x$acx_maxopt_portable" = xyes; then + CFLAGS="$CFLAGS +DAportable" + fi;; + + ibm) if test "x$acx_maxopt_portable" = xno; then + xlc_opt="-qarch=auto -qtune=auto" + else + xlc_opt="-qtune=auto" + fi + AX_CHECK_COMPILER_FLAGS($xlc_opt, + CFLAGS="-O3 -qansialias -w $xlc_opt", + [CFLAGS="-O3 -qansialias -w" + echo "******************************************************" + echo "* You seem to have the IBM C compiler. It is *" + echo "* recommended for best performance that you use: *" + echo "* *" + echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" + echo "* ^^^ ^^^ *" + echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" + echo "* CPU you have. (Set the CFLAGS environment var. *" + echo "* and re-run configure.) For more info, man cc. *" + echo "******************************************************"]) + ;; + + intel) CFLAGS="-O3 -ansi_alias" + if test "x$acx_maxopt_portable" = xno; then + icc_archflag=unknown + icc_flags="" + case $host_cpu in + i686*|x86_64*) + # icc accepts gcc assembly syntax, so these should work: + AX_GCC_X86_CPUID(0) + AX_GCC_X86_CPUID(1) + case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG + *:756e6547:*:*) # Intel + case $ax_cv_gcc_x86_cpuid_1 in + *6a?:*[[234]]:*:*|*6[[789b]]?:*:*:*) icc_flags="-xK";; + *f3[[347]]:*:*:*|*f4[1347]:*:*:*) icc_flags="-xP -xN -xW -xK";; + *f??:*:*:*) icc_flags="-xN -xW -xK";; + esac ;; + esac ;; + esac + if test "x$icc_flags" != x; then + for flag in $icc_flags; do + AX_CHECK_COMPILER_FLAGS($flag, [icc_archflag=$flag; break]) + done + fi + AC_MSG_CHECKING([for icc architecture flag]) + AC_MSG_RESULT($icc_archflag) + if test "x$icc_archflag" != xunknown; then + CFLAGS="$CFLAGS $icc_archflag" + fi + fi + ;; + + gnu) + # default optimization flags for gcc on all systems + CFLAGS="-O3 -fomit-frame-pointer" + + # -fstrict-aliasing for gcc-2.95+ + AX_CHECK_COMPILER_FLAGS(-fstrict-aliasing, + CFLAGS="$CFLAGS -fstrict-aliasing") + + AX_CHECK_COMPILER_FLAGS(-ffast-math, CFLAGS="$CFLAGS -ffast-math") + + AX_GCC_ARCHFLAG($acx_maxopt_portable) + ;; + esac + + if test -z "$CFLAGS"; then + echo "" + echo "********************************************************" + echo "* WARNING: Don't know the best CFLAGS for this system *" + echo "* Use ./configure CFLAGS=... to specify your own flags *" + echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" + echo "********************************************************" + echo "" + CFLAGS="-O3" + fi + + AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [ + echo "" + echo "********************************************************" + echo "* WARNING: The guessed CFLAGS don't seem to work with *" + echo "* your compiler. *" + echo "* Use ./configure CFLAGS=... to specify your own flags *" + echo "********************************************************" + echo "" + CFLAGS="" + ]) + +fi +]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 new file mode 100644 index 0000000..7625580 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 @@ -0,0 +1,195 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] +# AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] +# AX_FCFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] +# +# DESCRIPTION +# +# Try to find a compiler option that enables most reasonable warnings. +# +# For the GNU compiler it will be -Wall (and -ansi -pedantic) The result +# is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default. +# +# Currently this macro knows about the GCC, Solaris, Digital Unix, AIX, +# HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and +# Intel compilers. For a given compiler, the Fortran flags are much more +# experimental than their C equivalents. +# +# - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS +# - $2 add-value-if-not-found : nothing +# - $3 action-if-found : add value to shellvariable +# - $4 action-if-not-found : nothing +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2010 Rhys Ulerich +# +# 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 3 of the License, 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 10 + +AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl +AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_warn_all])dnl +AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], +VAR,[VAR="no, unknown" + AC_LANG_PUSH([C]) + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic % -Wall" dnl GCC + "-xstrconst % -v" dnl Solaris C + "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix + "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX + "-ansi -ansiE % -fullwarn" dnl IRIX + "+ESlit % +w1" dnl HP-UX C + "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) + "-h conform % -h msglevel 2" dnl Cray C (Unicos) + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_POP([C]) +]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[ + AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) + else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + +dnl the only difference - the LANG selection... and the default FLAGS + +AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl +AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ax_cv_cxxflags_warn_all])dnl +AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], +VAR,[VAR="no, unknown" + AC_LANG_PUSH([C++]) + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic % -Wall" dnl GCC + "-xstrconst % -v" dnl Solaris C + "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix + "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX + "-ansi -ansiE % -fullwarn" dnl IRIX + "+ESlit % +w1" dnl HP-UX C + "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) + "-h conform % -h msglevel 2" dnl Cray C (Unicos) + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_POP([C++]) +]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[ + AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) + else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + +dnl the only difference - the LANG selection... and the default FLAGS + +AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl +AS_VAR_PUSHDEF([FLAGS],[FCFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ax_cv_fcflags_warn_all])dnl +AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], +VAR,[VAR="no, unknown" + AC_LANG_PUSH([Fortran]) + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-warn all % -warn all" dnl Intel + "-pedantic % -Wall" dnl GCC + "-xstrconst % -v" dnl Solaris C + "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix + "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX + "-ansi -ansiE % -fullwarn" dnl IRIX + "+ESlit % +w1" dnl HP-UX C + "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) + "-h conform % -h msglevel 2" dnl Cray C (Unicos) + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_POP([Fortran]) +]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[ + AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) + else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + +dnl implementation tactics: +dnl the for-argument contains a list of options. The first part of +dnl these does only exist to detect the compiler - usually it is +dnl a global option to enable -ansi or -extrawarnings. All other +dnl compilers will fail about it. That was needed since a lot of +dnl compilers will give false positives for some option-syntax +dnl like -Woption or -Xoption as they think of it is a pass-through +dnl to later compile stages or something. The "%" is used as a +dnl delimiter. A non-option comment can be given after "%%" marks +dnl which will be shown but not added to the respective C/CXXFLAGS. diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 new file mode 100644 index 0000000..35bfd2a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 @@ -0,0 +1,76 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_compiler_flags.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILER_FLAGS(FLAGS, [ACTION-SUCCESS], [ACTION-FAILURE]) +# +# DESCRIPTION +# +# Check whether the given compiler FLAGS work with the current language's +# compiler, or whether they give an error. (Warnings, however, are +# ignored.) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# LICENSE +# +# Copyright (c) 2009 Steven G. Johnson +# Copyright (c) 2009 Matteo Frigo +# +# 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 3 of the License, 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 9 + +AC_DEFUN([AX_CHECK_COMPILER_FLAGS], +[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX +AC_MSG_CHECKING([whether _AC_LANG compiler accepts $1]) +dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname: +AS_LITERAL_IF([$1], + [AC_CACHE_VAL(AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1]), [ + ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$1" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes, + AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no) + _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])], + [ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$1" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes, + eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no) + _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS]) +eval ax_check_compiler_flags=$AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1]) +AC_MSG_RESULT($ax_check_compiler_flags) +if test "x$ax_check_compiler_flags" = xyes; then + m4_default([$2], :) +else + m4_default([$3], :) +fi +])dnl AX_CHECK_COMPILER_FLAGS diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 new file mode 100644 index 0000000..3214706 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 @@ -0,0 +1,63 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_COMPILER_VENDOR +# +# DESCRIPTION +# +# Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun, +# hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft, +# watcom, etc. The vendor is returned in the cache variable +# $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2008 Matteo Frigo +# +# 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 3 of the License, 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 9 + +AC_DEFUN([AX_COMPILER_VENDOR], +[ +AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, + [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown + # note: don't check for gcc first since some other compilers define __GNUC__ + for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do + vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ +#if !($vencpp) + thisisanerror; +#endif +])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break]) + done + ]) +]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_configure_args.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_configure_args.m4 new file mode 100644 index 0000000..0726b1b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_configure_args.m4 @@ -0,0 +1,70 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_configure_args.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CONFIGURE_ARGS +# +# DESCRIPTION +# +# Helper macro for AX_ENABLE_BUILDDIR. +# +# The traditional way of starting a subdir-configure is running the script +# with ${1+"$@"} but since autoconf 2.60 this is broken. Instead we have +# to rely on eval'ing $ac_configure_args however some old autoconf +# versions do not provide that. To ensure maximum portability of autoconf +# extension macros this helper can be AC_REQUIRE'd so that +# $ac_configure_args will alsways be present. +# +# Sadly, the traditional "exec $SHELL" of the enable_builddir macros is +# spoiled now and must be replaced by "eval + exit $?". +# +# Example: +# +# AC_DEFUN([AX_ENABLE_SUBDIR],[dnl +# AC_REQUIRE([AX_CONFIGURE_ARGS])dnl +# eval $SHELL $ac_configure_args || exit $? +# ...]) +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# +# 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 3 of the License, 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 9 + +AC_DEFUN([AX_CONFIGURE_ARGS],[ + # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args + if test "${ac_configure_args+set}" != "set" ; then + ac_configure_args= + for ac_arg in ${1+"[$]@"}; do + ac_configure_args="$ac_configure_args '$ac_arg'" + done + fi +]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 new file mode 100644 index 0000000..959dec3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 @@ -0,0 +1,300 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_enable_builddir.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_ENABLE_BUILDDIR [(dirstring-or-command [,Makefile.mk [,-all]])] +# +# DESCRIPTION +# +# If the current configure was run within the srcdir then we move all +# configure-files into a subdir and let the configure steps continue +# there. We provide an option --disable-builddir to suppress the move into +# a separate builddir. +# +# Defaults: +# +# $1 = $host (overridden with $HOST) +# $2 = Makefile.mk +# $3 = -all +# +# This macro must be called before AM_INIT_AUTOMAKE. It creates a default +# toplevel srcdir Makefile from the information found in the created +# toplevel builddir Makefile. It just copies the variables and +# rule-targets, each extended with a default rule-execution that recurses +# into the build directory of the current "HOST". You can override the +# auto-dection through `config.guess` and build-time of course, as in +# +# make HOST=i386-mingw-cross +# +# which can of course set at configure time as well using +# +# configure --host=i386-mingw-cross +# +# After the default has been created, additional rules can be appended +# that will not just recurse into the subdirectories and only ever exist +# in the srcdir toplevel makefile - these parts are read from the $2 = +# Makefile.mk file +# +# The automatic rules are usually scanning the toplevel Makefile for lines +# like '#### $host |$builddir' to recognize the place where to recurse +# into. Usually, the last one is the only one used. However, almost all +# targets have an additional "*-all" rule which makes the script to +# recurse into _all_ variants of the current HOST (!!) setting. The "-all" +# suffix can be overriden for the macro as well. +# +# a special rule is only given for things like "dist" that will copy the +# tarball from the builddir to the sourcedir (or $(PUB)) for reason of +# convenience. +# +# LICENSE +# +# Copyright (c) 2009 Guido U. Draheim +# Copyright (c) 2009 Alan Jenkins +# +# 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 3 of the License, 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 22 + +AC_DEFUN([AX_ENABLE_BUILDDIR],[ +AC_REQUIRE([AC_CANONICAL_HOST])[]dnl +AC_REQUIRE([AX_CONFIGURE_ARGS])[]dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])[]dnl +AC_BEFORE([$0],[AM_INIT_AUTOMAKE])dnl +AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl +AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl +AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl +SUB="." +AC_ARG_ENABLE([builddir], AS_HELP_STRING( + [--disable-builddir],[disable automatic build in subdir of sources]) + ,[SUB="$enableval"], [SUB="auto"]) +if test ".$ac_srcdir_defaulted" != ".no" ; then +if test ".$srcdir" = ".." ; then + if test -f config.status ; then + AC_MSG_NOTICE(toplevel srcdir already configured... skipping subdir build) + else + test ".$SUB" = "." && SUB="." + test ".$SUB" = ".no" && SUB="." + test ".$TARGET" = "." && TARGET="$target" + test ".$SUB" = ".auto" && SUB="m4_ifval([$1], [$1],[$TARGET])" + if test ".$SUB" != ".." ; then # we know where to go and + AS_MKDIR_P([$SUB]) + echo __.$SUB.__ > $SUB/conftest.tmp + cd $SUB + if grep __.$SUB.__ conftest.tmp >/dev/null 2>/dev/null ; then + rm conftest.tmp + AC_MSG_RESULT([continue configure in default builddir "./$SUB"]) + else + AC_MSG_ERROR([could not change to default builddir "./$SUB"]) + fi + srcdir=`echo "$SUB" | + sed -e 's,^\./,,;s,[[^/]]$,&/,;s,[[^/]]*/,../,g;s,[[/]]$,,;'` + # going to restart from subdirectory location + test -f $srcdir/config.log && mv $srcdir/config.log . + test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h . + test -f $srcdir/conftest.log && mv $srcdir/conftest.log . + test -f $srcdir/$cache_file && mv $srcdir/$cache_file . + AC_MSG_RESULT(....exec $SHELL $srcdir/[$]0 "--srcdir=$srcdir" "--enable-builddir=$SUB" ${1+"[$]@"}) + case "[$]0" in # restart + [/\\]*) eval $SHELL "'[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; + *) eval $SHELL "'$srcdir/[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; + esac ; exit $? + fi + fi +fi fi +test ".$SUB" = ".auto" && SUB="." +dnl ac_path_prog uses "set dummy" to override $@ which would defeat the "exec" +AC_PATH_PROG(SED,gsed sed, sed) +AUX="$am_aux_dir" +AS_VAR_POPDEF([SED])dnl +AS_VAR_POPDEF([AUX])dnl +AS_VAR_POPDEF([SUB])dnl +AC_CONFIG_COMMANDS([buildir],[dnl .............. config.status .............. +AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl +AS_VAR_PUSHDEF([TOP],[top_srcdir])dnl +AS_VAR_PUSHDEF([SRC],[ac_top_srcdir])dnl +AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl +AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl +pushdef([END],[Makefile.mk])dnl +pushdef([_ALL],[ifelse([$3],,[-all],[$3])])dnl + SRC="$ax_enable_builddir_srcdir" + if test ".$SUB" = ".." ; then + if test -f "$TOP/Makefile" ; then + AC_MSG_NOTICE([skipping TOP/Makefile - left untouched]) + else + AC_MSG_NOTICE([skipping TOP/Makefile - not created]) + fi + else + if test -f "$SRC/Makefile" ; then + a=`grep "^VERSION " "$SRC/Makefile"` ; b=`grep "^VERSION " Makefile` + test "$a" != "$b" && rm "$SRC/Makefile" + fi + if test -f "$SRC/Makefile" ; then + echo "$SRC/Makefile : $SRC/Makefile.in" > $tmp/conftemp.mk + echo " []@ echo 'REMOVED,,,' >\$[]@" >> $tmp/conftemp.mk + eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" + if grep '^REMOVED,,,' "$SRC/Makefile" >/dev/null + then rm $SRC/Makefile ; fi + cp $tmp/conftemp.mk $SRC/makefiles.mk~ ## DEBUGGING + fi + if test ! -f "$SRC/Makefile" ; then + AC_MSG_NOTICE([create TOP/Makefile guessed from local Makefile]) + x='`' ; cat >$tmp/conftemp.sed <<_EOF +/^\$/n +x +/^\$/bS +x +/\\\\\$/{H;d;} +{H;s/.*//;x;} +bM +:S +x +/\\\\\$/{h;d;} +{h;s/.*//;x;} +:M +s/\\(\\n\\) /\\1 /g +/^ /d +/^[[ ]]*[[\\#]]/d +/^VPATH *=/d +s/^srcdir *=.*/srcdir = ./ +s/^top_srcdir *=.*/top_srcdir = ./ +/[[:=]]/!d +/^\\./d +dnl Now handle rules (i.e. lines containing ":" but not " = "). +/ = /b +/ .= /b +/:/!b +s/:.*/:/ +s/ / /g +s/ \\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/ \\1 \\1[]_ALL\\2/g +s/^\\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/\\1 \\1[]_ALL\\2/ +s/ / /g +/^all all[]_ALL[[ :]]/i\\ +all-configured : all[]_ALL +dnl dist-all exists... and would make for dist-all-all +s/ [[a-zA-Z0-9-]]*[]_ALL [[a-zA-Z0-9-]]*[]_ALL[]_ALL//g +/[]_ALL[]_ALL/d +a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done +dnl special rule add-on: "dist" copies the tarball to $(PUB). (source tree) +/dist[]_ALL *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ + ; if test "\$\$found" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +dnl special rule add-on: "dist-foo" copies all the archives to $(PUB). (source tree) +/dist-[[a-zA-Z0-9]]*[]_ALL *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ + ; if test "\$\$found" = "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +dnl special rule add-on: "distclean" removes all local builddirs completely +/distclean[]_ALL *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ + ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ + ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile +_EOF + cp "$tmp/conftemp.sed" "$SRC/makefile.sed~" ## DEBUGGING + $SED -f $tmp/conftemp.sed Makefile >$SRC/Makefile + if test -f "$SRC/m4_ifval([$2],[$2],[END])" ; then + AC_MSG_NOTICE([extend TOP/Makefile with TOP/m4_ifval([$2],[$2],[END])]) + cat $SRC/END >>$SRC/Makefile + fi ; xxxx="####" + echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$SRC/Makefile + # sanity check + if grep '^; echo "MAKE ' $SRC/Makefile >/dev/null ; then + AC_MSG_NOTICE([buggy sed found - it deletes tab in "a" text parts]) + $SED -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $SRC/Makefile \ + >$SRC/Makefile~ + (test -s $SRC/Makefile~ && mv $SRC/Makefile~ $SRC/Makefile) 2>/dev/null + fi + else + xxxx="\\#\\#\\#\\#" + # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed + echo "s!^$xxxx [[^|]]* | *$SUB *\$!$xxxx ...... $SUB!" >$tmp/conftemp.sed + $SED -f "$tmp/conftemp.sed" "$SRC/Makefile" >$tmp/mkfile.tmp + cp "$tmp/conftemp.sed" "$SRC/makefiles.sed~" ## DEBUGGING + cp "$tmp/mkfile.tmp" "$SRC/makefiles.out~" ## DEBUGGING + if cmp -s "$SRC/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then + AC_MSG_NOTICE([keeping TOP/Makefile from earlier configure]) + rm "$tmp/mkfile.tmp" + else + AC_MSG_NOTICE([reusing TOP/Makefile from earlier configure]) + mv "$tmp/mkfile.tmp" "$SRC/Makefile" + fi + fi + AC_MSG_NOTICE([build in $SUB (HOST=$ax_enable_builddir_host)]) + xxxx="####" + echo "$xxxx" "$ax_enable_builddir_host" "|$SUB" >>$SRC/Makefile + fi +popdef([END])dnl +AS_VAR_POPDEF([SED])dnl +AS_VAR_POPDEF([AUX])dnl +AS_VAR_POPDEF([SRC])dnl +AS_VAR_POPDEF([TOP])dnl +AS_VAR_POPDEF([SUB])dnl +],[dnl +ax_enable_builddir_srcdir="$srcdir" # $srcdir +ax_enable_builddir_host="$HOST" # $HOST / $host +ax_enable_builddir_version="$VERSION" # $VERSION +ax_enable_builddir_package="$PACKAGE" # $PACKAGE +ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX +ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED +ax_enable_builddir="$ax_enable_builddir" # $SUB +])dnl +]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 new file mode 100644 index 0000000..d37a913 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 @@ -0,0 +1,215 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_gcc_archflag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE]) +# +# DESCRIPTION +# +# This macro tries to guess the "native" arch corresponding to the target +# architecture for use with gcc's -march=arch or -mtune=arch flags. If +# found, the cache variable $ax_cv_gcc_archflag is set to this flag and +# ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is is set to +# "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is +# to add $ax_cv_gcc_archflag to the end of $CFLAGS. +# +# PORTABLE? should be either [yes] (default) or [no]. In the former case, +# the flag is set to -mtune (or equivalent) so that the architecture is +# only used for tuning, but the instruction set used is still portable. In +# the latter case, the flag is set to -march (or equivalent) so that +# architecture-specific instructions are enabled. +# +# The user can specify --with-gcc-arch= in order to override the +# macro's choice of architecture, or --without-gcc-arch to disable this. +# +# When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is +# called unless the user specified --with-gcc-arch manually. +# +# Requires macros: AX_CHECK_COMPILER_FLAGS, AX_GCC_X86_CPUID +# +# (The main emphasis here is on recent CPUs, on the principle that doing +# high-performance computing on old hardware is uncommon.) +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2008 Matteo Frigo +# +# 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 3 of the License, 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 8 + +AC_DEFUN([AX_GCC_ARCHFLAG], +[AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_CANONICAL_HOST]) + +AC_ARG_WITH(gcc-arch, [AS_HELP_STRING([--with-gcc-arch=], [use architecture for gcc -march/-mtune, instead of guessing])], + ax_gcc_arch=$withval, ax_gcc_arch=yes) + +AC_MSG_CHECKING([for gcc architecture flag]) +AC_MSG_RESULT([]) +AC_CACHE_VAL(ax_cv_gcc_archflag, +[ +ax_cv_gcc_archflag="unknown" + +if test "$GCC" = yes; then + +if test "x$ax_gcc_arch" = xyes; then +ax_gcc_arch="" +if test "$cross_compiling" = no; then +case $host_cpu in + i[[3456]]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones + AX_GCC_X86_CPUID(0) + AX_GCC_X86_CPUID(1) + case $ax_cv_gcc_x86_cpuid_0 in + *:756e6547:*:*) # Intel + case $ax_cv_gcc_x86_cpuid_1 in + *5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; + *5??:*:*:*) ax_gcc_arch=pentium ;; + *6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; + *6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; + *6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; + *6[[9d]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; + *6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; + *6??:*:*:*) ax_gcc_arch=pentiumpro ;; + *f3[[347]]:*:*:*|*f4[1347]:*:*:*) + case $host_cpu in + x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;; + *) ax_gcc_arch="prescott pentium4 pentiumpro" ;; + esac ;; + *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";; + esac ;; + *:68747541:*:*) # AMD + case $ax_cv_gcc_x86_cpuid_1 in + *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;; + *5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; + *5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; + *60?:*:*:*) ax_gcc_arch=k7 ;; + *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;; + *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; + *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;; + *6[[68a]]?:*:*:*) + AX_GCC_X86_CPUID(0x80000006) # L2 cache size + case $ax_cv_gcc_x86_cpuid_0x80000006 in + *:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256 + ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; + *) ax_gcc_arch="athlon-4 athlon k7" ;; + esac ;; + *f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; + *f5?:*:*:*) ax_gcc_arch="opteron k8" ;; + *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;; + *f??:*:*:*) ax_gcc_arch="k8" ;; + esac ;; + *:746e6543:*:*) # IDT + case $ax_cv_gcc_x86_cpuid_1 in + *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; + *58?:*:*:*) ax_gcc_arch=winchip2 ;; + *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;; + *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;; + esac ;; + esac + if test x"$ax_gcc_arch" = x; then # fallback + case $host_cpu in + i586*) ax_gcc_arch=pentium ;; + i686*) ax_gcc_arch=pentiumpro ;; + esac + fi + ;; + + sparc*) + AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/]) + cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` + cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters` + case $cputype in + *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; + *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; + *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; + *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;; + *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;; + *cypress*) ax_gcc_arch=cypress ;; + esac ;; + + alphaev5) ax_gcc_arch=ev5 ;; + alphaev56) ax_gcc_arch=ev56 ;; + alphapca56) ax_gcc_arch="pca56 ev56" ;; + alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; + alphaev6) ax_gcc_arch=ev6 ;; + alphaev67) ax_gcc_arch=ev67 ;; + alphaev68) ax_gcc_arch="ev68 ev67" ;; + alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; + alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; + alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; + + powerpc*) + cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` + cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'` + case $cputype in + *750*) ax_gcc_arch="750 G3" ;; + *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;; + *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;; + *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;; + *970*) ax_gcc_arch="970 G5 power4";; + *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; + *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; + 603ev|8240) ax_gcc_arch="$cputype 603e 603";; + *) ax_gcc_arch=$cputype ;; + esac + ax_gcc_arch="$ax_gcc_arch powerpc" + ;; +esac +fi # not cross-compiling +fi # guess arch + +if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then +for arch in $ax_gcc_arch; do + if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code + flags="-mtune=$arch" + # -mcpu=$arch and m$arch generate nonportable code on every arch except + # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. + case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac + else + flags="-march=$arch -mcpu=$arch -m$arch" + fi + for flag in $flags; do + AX_CHECK_COMPILER_FLAGS($flag, [ax_cv_gcc_archflag=$flag; break]) + done + test "x$ax_cv_gcc_archflag" = xunknown || break +done +fi + +fi # $GCC=yes +]) +AC_MSG_CHECKING([for gcc architecture flag]) +AC_MSG_RESULT($ax_cv_gcc_archflag) +if test "x$ax_cv_gcc_archflag" = xunknown; then + m4_default([$3],:) +else + m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"]) +fi +]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 new file mode 100644 index 0000000..7d46fee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 @@ -0,0 +1,79 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_gcc_x86_cpuid.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_GCC_X86_CPUID(OP) +# +# DESCRIPTION +# +# On Pentium and later x86 processors, with gcc or a compiler that has a +# compatible syntax for inline assembly instructions, run a small program +# that executes the cpuid instruction with input OP. This can be used to +# detect the CPU type. +# +# On output, the values of the eax, ebx, ecx, and edx registers are stored +# as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable +# ax_cv_gcc_x86_cpuid_OP. +# +# If the cpuid instruction fails (because you are running a +# cross-compiler, or because you are not using gcc, or because you are on +# a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP +# is set to the string "unknown". +# +# This macro mainly exists to be used in AX_GCC_ARCHFLAG. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2008 Matteo Frigo +# +# 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 3 of the License, 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 7 + +AC_DEFUN([AX_GCC_X86_CPUID], +[AC_REQUIRE([AC_PROG_CC]) +AC_LANG_PUSH([C]) +AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1, + [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include ], [ + int op = $1, eax, ebx, ecx, edx; + FILE *f; + __asm__("cpuid" + : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op)); + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; +])], + [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid], + [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid], + [ax_cv_gcc_x86_cpuid_$1=unknown])]) +AC_LANG_POP([C]) +]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/libtool.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/libtool.m4 new file mode 100644 index 0000000..d812584 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/libtool.m4 @@ -0,0 +1,7831 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ F* | *Sun*Fortran*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltoptions.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltoptions.m4 new file mode 100644 index 0000000..17cfd51 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltoptions.m4 @@ -0,0 +1,369 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 7 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltsugar.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltsugar.m4 new file mode 100644 index 0000000..9000a05 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltsugar.m4 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltversion.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltversion.m4 new file mode 100644 index 0000000..9c7b5d4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 3293 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4]) +m4_define([LT_PACKAGE_REVISION], [1.3293]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4' +macro_revision='1.3293' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/lt~obsolete.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c573da9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/lt~obsolete.m4 @@ -0,0 +1,98 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.am b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.am new file mode 100644 index 0000000..2519277 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.am @@ -0,0 +1,8 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS=foreign + +EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 + +man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.in b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.in new file mode 100644 index 0000000..2cb5ea8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.in @@ -0,0 +1,466 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = man +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man3dir = $(mandir)/man3 +am__installdirs = "$(DESTDIR)$(man3dir)" +NROFF = nroff +MANS = $(man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_LTLDFLAGS = @AM_LTLDFLAGS@ +AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PRTDIAG = @PRTDIAG@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TARGET = @TARGET@ +TARGETDIR = @TARGETDIR@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +ax_enable_builddir_sed = @ax_enable_builddir_sed@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sys_symbol_underscore = @sys_symbol_underscore@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +toolexecdir = @toolexecdir@ +toolexeclibdir = @toolexeclibdir@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign +EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 +man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign man/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man3: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" + @list=''; test -n "$(man3dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ + done; } + +uninstall-man3: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man3dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man3dir)" && rm -f $$files; } +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man3dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man3 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-man + +uninstall-man: uninstall-man3 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man3 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-man uninstall-man3 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi.3 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi.3 new file mode 100644 index 0000000..18b5d5d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi.3 @@ -0,0 +1,31 @@ +.Dd February 15, 2008 +.Dt FFI 3 +.Sh NAME +.Nm FFI +.Nd Foreign Function Interface +.Sh LIBRARY +libffi, -lffi +.Sh SYNOPSIS +.In ffi.h +.Ft ffi_status +.Fo ffi_prep_cif +.Fa "ffi_cif *cif" +.Fa "ffi_abi abi" +.Fa "unsigned int nargs" +.Fa "ffi_type *rtype" +.Fa "ffi_type **atypes" +.Fc +.Ft void +.Fo ffi_call +.Fa "ffi_cif *cif" +.Fa "void (*fn)(void)" +.Fa "void *rvalue" +.Fa "void **avalue" +.Fc +.Sh DESCRIPTION +The foreign function interface provides a mechanism by which a function can +generate a call to another function at runtime without requiring knowledge of +the called function's interface at compile time. +.Sh SEE ALSO +.Xr ffi_prep_cif 3 , +.Xr ffi_call 3 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_call.3 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_call.3 new file mode 100644 index 0000000..5351513 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_call.3 @@ -0,0 +1,103 @@ +.Dd February 15, 2008 +.Dt ffi_call 3 +.Sh NAME +.Nm ffi_call +.Nd Invoke a foreign function. +.Sh SYNOPSIS +.In ffi.h +.Ft void +.Fo ffi_call +.Fa "ffi_cif *cif" +.Fa "void (*fn)(void)" +.Fa "void *rvalue" +.Fa "void **avalue" +.Fc +.Sh DESCRIPTION +The +.Nm ffi_call +function provides a simple mechanism for invoking a function without +requiring knowledge of the function's interface at compile time. +.Fa fn +is called with the values retrieved from the pointers in the +.Fa avalue +array. The return value from +.Fa fn +is placed in storage pointed to by +.Fa rvalue . +.Fa cif +contains information describing the data types, sizes and alignments of the +arguments to and return value from +.Fa fn , +and must be initialized with +.Nm ffi_prep_cif +before it is used with +.Nm ffi_call . +.Pp +.Fa rvalue +must point to storage that is sizeof(ffi_arg) or larger for non-floating point +types. For smaller-sized return value types, the +.Nm ffi_arg +or +.Nm ffi_sarg +integral type must be used to hold +the return value. +.Sh EXAMPLES +.Bd -literal +#include +#include + +unsigned char +foo(unsigned int, float); + +int +main(int argc, const char **argv) +{ + ffi_cif cif; + ffi_type *arg_types[2]; + void *arg_values[2]; + ffi_status status; + + // Because the return value from foo() is smaller than sizeof(long), it + // must be passed as ffi_arg or ffi_sarg. + ffi_arg result; + + // Specify the data type of each argument. Available types are defined + // in . + arg_types[0] = &ffi_type_uint; + arg_types[1] = &ffi_type_float; + + // Prepare the ffi_cif structure. + if ((status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, + 2, &ffi_type_uint8, arg_types)) != FFI_OK) + { + // Handle the ffi_status error. + } + + // Specify the values of each argument. + unsigned int arg1 = 42; + float arg2 = 5.1; + + arg_values[0] = &arg1; + arg_values[1] = &arg2; + + // Invoke the function. + ffi_call(&cif, FFI_FN(foo), &result, arg_values); + + // The ffi_arg 'result' now contains the unsigned char returned from foo(), + // which can be accessed by a typecast. + printf("result is %hhu", (unsigned char)result); + + return 0; +} + +// The target function. +unsigned char +foo(unsigned int x, float y) +{ + unsigned char result = x - y; + return result; +} +.Ed +.Sh SEE ALSO +.Xr ffi 3 , +.Xr ffi_prep_cif 3 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_prep_cif.3 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_prep_cif.3 new file mode 100644 index 0000000..9436b31 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_prep_cif.3 @@ -0,0 +1,66 @@ +.Dd February 15, 2008 +.Dt ffi_prep_cif 3 +.Sh NAME +.Nm ffi_prep_cif +.Nd Prepare a +.Nm ffi_cif +structure for use with +.Nm ffi_call +. +.Sh SYNOPSIS +.In ffi.h +.Ft ffi_status +.Fo ffi_prep_cif +.Fa "ffi_cif *cif" +.Fa "ffi_abi abi" +.Fa "unsigned int nargs" +.Fa "ffi_type *rtype" +.Fa "ffi_type **atypes" +.Fc +.Sh DESCRIPTION +The +.Nm ffi_prep_cif +function prepares a +.Nm ffi_cif +structure for use with +.Nm ffi_call +. +.Fa abi +specifies a set of calling conventions to use. +.Fa atypes +is an array of +.Fa nargs +pointers to +.Nm ffi_type +structs that describe the data type, size and alignment of each argument. +.Fa rtype +points to an +.Nm ffi_type +that describes the data type, size and alignment of the +return value. +.Sh RETURN VALUES +Upon successful completion, +.Nm ffi_prep_cif +returns +.Nm FFI_OK . +It will return +.Nm FFI_BAD_TYPEDEF +if +.Fa cif +is +.Nm NULL +or +.Fa atypes +or +.Fa rtype +is malformed. If +.Fa abi +does not refer to a valid ABI, +.Nm FFI_BAD_ABI +will be returned. Available ABIs are +defined in +.Nm +. +.Sh SEE ALSO +.Xr ffi 3 , +.Xr ffi_call 3 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/mdate-sh b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/mdate-sh new file mode 100644 index 0000000..cd916c0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/mdate-sh @@ -0,0 +1,201 @@ +#!/bin/sh +# Get modification time of a file or directory and pretty-print it. + +scriptversion=2005-06-29.22 + +# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005 Free Software +# Foundation, Inc. +# written by Ulrich Drepper , June 1995 +# +# 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 to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case $1 in + '') + echo "$0: No file. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: mdate-sh [--help] [--version] FILE + +Pretty-print the modification time of FILE. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "mdate-sh $scriptversion" + exit $? + ;; +esac + +# Prevent date giving response in another language. +LANG=C +export LANG +LC_ALL=C +export LC_ALL +LC_TIME=C +export LC_TIME + +# GNU ls changes its time format in response to the TIME_STYLE +# variable. Since we cannot assume `unset' works, revert this +# variable to its documented default. +if test "${TIME_STYLE+set}" = set; then + TIME_STYLE=posix-long-iso + export TIME_STYLE +fi + +save_arg1=$1 + +# Find out how to get the extended ls output of a file or directory. +if ls -L /dev/null 1>/dev/null 2>&1; then + ls_command='ls -L -l -d' +else + ls_command='ls -l -d' +fi + +# A `ls -l' line looks as follows on OS/2. +# drwxrwx--- 0 Aug 11 2001 foo +# This differs from Unix, which adds ownership information. +# drwxrwx--- 2 root root 4096 Aug 11 2001 foo +# +# To find the date, we split the line on spaces and iterate on words +# until we find a month. This cannot work with files whose owner is a +# user named `Jan', or `Feb', etc. However, it's unlikely that `/' +# will be owned by a user whose name is a month. So we first look at +# the extended ls output of the root directory to decide how many +# words should be skipped to get the date. + +# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. +set x`ls -l -d /` + +# Find which argument is the month. +month= +command= +until test $month +do + shift + # Add another shift to the command. + command="$command shift;" + case $1 in + Jan) month=January; nummonth=1;; + Feb) month=February; nummonth=2;; + Mar) month=March; nummonth=3;; + Apr) month=April; nummonth=4;; + May) month=May; nummonth=5;; + Jun) month=June; nummonth=6;; + Jul) month=July; nummonth=7;; + Aug) month=August; nummonth=8;; + Sep) month=September; nummonth=9;; + Oct) month=October; nummonth=10;; + Nov) month=November; nummonth=11;; + Dec) month=December; nummonth=12;; + esac +done + +# Get the extended ls output of the file or directory. +set dummy x`eval "$ls_command \"\$save_arg1\""` + +# Remove all preceding arguments +eval $command + +# Because of the dummy argument above, month is in $2. +# +# On a POSIX system, we should have +# +# $# = 5 +# $1 = file size +# $2 = month +# $3 = day +# $4 = year or time +# $5 = filename +# +# On Darwin 7.7.0 and 7.6.0, we have +# +# $# = 4 +# $1 = day +# $2 = month +# $3 = year or time +# $4 = filename + +# Get the month. +case $2 in + Jan) month=January; nummonth=1;; + Feb) month=February; nummonth=2;; + Mar) month=March; nummonth=3;; + Apr) month=April; nummonth=4;; + May) month=May; nummonth=5;; + Jun) month=June; nummonth=6;; + Jul) month=July; nummonth=7;; + Aug) month=August; nummonth=8;; + Sep) month=September; nummonth=9;; + Oct) month=October; nummonth=10;; + Nov) month=November; nummonth=11;; + Dec) month=December; nummonth=12;; +esac + +case $3 in + ???*) day=$1;; + *) day=$3; shift;; +esac + +# Here we have to deal with the problem that the ls output gives either +# the time of day or the year. +case $3 in + *:*) set `date`; eval year=\$$# + case $2 in + Jan) nummonthtod=1;; + Feb) nummonthtod=2;; + Mar) nummonthtod=3;; + Apr) nummonthtod=4;; + May) nummonthtod=5;; + Jun) nummonthtod=6;; + Jul) nummonthtod=7;; + Aug) nummonthtod=8;; + Sep) nummonthtod=9;; + Oct) nummonthtod=10;; + Nov) nummonthtod=11;; + Dec) nummonthtod=12;; + esac + # For the first six month of the year the time notation can also + # be used for files modified in the last year. + if (expr $nummonth \> $nummonthtod) > /dev/null; + then + year=`expr $year - 1` + fi;; + *) year=$3;; +esac + +# The result. +echo $day $month $year + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing new file mode 100755 index 0000000..28055d2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing @@ -0,0 +1,376 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + tar*) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar*) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/msvcc.sh b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/msvcc.sh new file mode 100755 index 0000000..dcdbeab --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/msvcc.sh @@ -0,0 +1,197 @@ +#!/bin/sh + +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is the MSVC wrappificator. +# +# The Initial Developer of the Original Code is +# Timothy Wall . +# Portions created by the Initial Developer are Copyright (C) 2009 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Daniel Witte +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** + +# +# GCC-compatible wrapper for cl.exe and ml.exe. Arguments are given in GCC +# format and translated into something sensible for cl or ml. +# + +args="-nologo -W3" +md=-MD +cl="cl" +ml="ml" +safeseh="-safeseh" +output= + +while [ $# -gt 0 ] +do + case $1 + in + -fexceptions) + # Don't enable exceptions for now. + #args="$args -EHac" + shift 1 + ;; + -m32) + shift 1 + ;; + -m64) + cl="cl" # "$MSVC/x86_amd64/cl" + ml="ml64" # "$MSVC/x86_amd64/ml64" + safeseh= + shift 1 + ;; + -O0) + args="$args -Od" + shift 1 + ;; + -O*) + # If we're optimizing, make sure we explicitly turn on some optimizations + # that are implicitly disabled by debug symbols (-Zi). + args="$args $1 -OPT:REF -OPT:ICF -INCREMENTAL:NO" + shift 1 + ;; + -g) + # Enable debug symbol generation. + args="$args -Zi -DEBUG" + shift 1 + ;; + -DFFI_DEBUG) + # Link against debug CRT and enable runtime error checks. + args="$args -RTC1" + defines="$defines $1" + md=-MDd + shift 1 + ;; + -c) + args="$args -c" + args="$(echo $args | sed 's%/Fe%/Fo%g')" + single="-c" + shift 1 + ;; + -D*=*) + name="$(echo $1|sed 's/-D\([^=][^=]*\)=.*/\1/g')" + value="$(echo $1|sed 's/-D[^=][^=]*=//g')" + args="$args -D${name}='$value'" + defines="$defines -D${name}='$value'" + shift 1 + ;; + -D*) + args="$args $1" + defines="$defines $1" + shift 1 + ;; + -I) + args="$args -I$2" + includes="$includes -I$2" + shift 2 + ;; + -I*) + args="$args $1" + includes="$includes $1" + shift 1 + ;; + -W|-Wextra) + # TODO map extra warnings + shift 1 + ;; + -Wall) + # -Wall on MSVC is overzealous, and we already build with -W3. Nothing + # to do here. + shift 1 + ;; + -Werror) + args="$args -WX" + shift 1 + ;; + -W*) + # TODO map specific warnings + shift 1 + ;; + -S) + args="$args -FAs" + shift 1 + ;; + -o) + outdir="$(dirname $2)" + base="$(basename $2|sed 's/\.[^.]*//g')" + if [ -n "$single" ]; then + output="-Fo$2" + else + output="-Fe$2" + fi + if [ -n "$assembly" ]; then + args="$args $output" + else + args="$args $output -Fd$outdir/$base -Fp$outdir/$base -Fa$outdir/$base" + fi + shift 2 + ;; + *.S) + src=$1 + assembly="true" + shift 1 + ;; + *.c) + args="$args $1" + shift 1 + ;; + *) + # Assume it's an MSVC argument, and pass it through. + args="$args $1" + shift 1 + ;; + esac +done + +if [ -n "$assembly" ]; then + if [ -z "$outdir" ]; then + outdir="." + fi + ppsrc="$outdir/$(basename $src|sed 's/.S$/.asm/g')" + echo "$cl -nologo -EP $includes $defines $src > $ppsrc" + "$cl" -nologo -EP $includes $defines $src > $ppsrc || exit $? + output="$(echo $output | sed 's%/F[dpa][^ ]*%%g')" + args="-nologo $safeseh $single $output $ppsrc" + + echo "$ml $args" + eval "\"$ml\" $args" + result=$? + + # required to fix ml64 broken output? + #mv *.obj $outdir +else + args="$md $args" + echo "$cl $args" + eval "\"$cl\" $args" + result=$? +fi + +exit $result + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffi.c new file mode 100644 index 0000000..8d6b2ba --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffi.c @@ -0,0 +1,284 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc. + + Alpha Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include +#include + +/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; + all further uses in this file will refer to the 128-bit type. */ +#if defined(__LONG_DOUBLE_128__) +# if FFI_TYPE_LONGDOUBLE != 4 +# error FFI_TYPE_LONGDOUBLE out of date +# endif +#else +# undef FFI_TYPE_LONGDOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#endif + +extern void ffi_call_osf(void *, unsigned long, unsigned, void *, void (*)(void)) + FFI_HIDDEN; +extern void ffi_closure_osf(void) FFI_HIDDEN; + + +ffi_status +ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Adjust cif->bytes to represent a minimum 6 words for the temporary + register argument loading area. */ + if (cif->bytes < 6*FFI_SIZEOF_ARG) + cif->bytes = 6*FFI_SIZEOF_ARG; + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_STRUCT: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags = cif->rtype->type; + break; + + case FFI_TYPE_LONGDOUBLE: + /* 128-bit long double is returned in memory, like a struct. */ + cif->flags = FFI_TYPE_STRUCT; + break; + + default: + cif->flags = FFI_TYPE_INT; + break; + } + + return FFI_OK; +} + + +void +ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + unsigned long *stack, *argp; + long i, avn; + ffi_type **arg_types; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + if (rvalue == NULL && cif->flags == FFI_TYPE_STRUCT) + rvalue = alloca(cif->rtype->size); + + /* Allocate the space for the arguments, plus 4 words of temp + space for ffi_call_osf. */ + argp = stack = alloca(cif->bytes + 4*FFI_SIZEOF_ARG); + + if (cif->flags == FFI_TYPE_STRUCT) + *(void **) argp++ = rvalue; + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + while (i < avn) + { + size_t size = (*arg_types)->size; + + switch ((*arg_types)->type) + { + case FFI_TYPE_SINT8: + *(SINT64 *) argp = *(SINT8 *)(* avalue); + break; + + case FFI_TYPE_UINT8: + *(SINT64 *) argp = *(UINT8 *)(* avalue); + break; + + case FFI_TYPE_SINT16: + *(SINT64 *) argp = *(SINT16 *)(* avalue); + break; + + case FFI_TYPE_UINT16: + *(SINT64 *) argp = *(UINT16 *)(* avalue); + break; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + /* Note that unsigned 32-bit quantities are sign extended. */ + *(SINT64 *) argp = *(SINT32 *)(* avalue); + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_POINTER: + *(UINT64 *) argp = *(UINT64 *)(* avalue); + break; + + case FFI_TYPE_FLOAT: + if (argp - stack < 6) + { + /* Note the conversion -- all the fp regs are loaded as + doubles. The in-register format is the same. */ + *(double *) argp = *(float *)(* avalue); + } + else + *(float *) argp = *(float *)(* avalue); + break; + + case FFI_TYPE_DOUBLE: + *(double *) argp = *(double *)(* avalue); + break; + + case FFI_TYPE_LONGDOUBLE: + /* 128-bit long double is passed by reference. */ + *(long double **) argp = (long double *)(* avalue); + size = sizeof (long double *); + break; + + case FFI_TYPE_STRUCT: + memcpy(argp, *avalue, (*arg_types)->size); + break; + + default: + FFI_ASSERT(0); + } + + argp += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + i++, arg_types++, avalue++; + } + + ffi_call_osf(stack, cif->bytes, cif->flags, rvalue, fn); +} + + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp; + + tramp = (unsigned int *) &closure->tramp[0]; + tramp[0] = 0x47fb0401; /* mov $27,$1 */ + tramp[1] = 0xa77b0010; /* ldq $27,16($27) */ + tramp[2] = 0x6bfb0000; /* jmp $31,($27),0 */ + tramp[3] = 0x47ff041f; /* nop */ + *(void **) &tramp[4] = ffi_closure_osf; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + /* Flush the Icache. + + Tru64 UNIX as doesn't understand the imb mnemonic, so use call_pal + instead, since both Compaq as and gas can handle it. + + 0x86 is PAL_imb in Tru64 UNIX . */ + asm volatile ("call_pal 0x86" : : : "memory"); + + return FFI_OK; +} + + +long FFI_HIDDEN +ffi_closure_osf_inner(ffi_closure *closure, void *rvalue, unsigned long *argp) +{ + ffi_cif *cif; + void **avalue; + ffi_type **arg_types; + long i, avn, argn; + + cif = closure->cif; + avalue = alloca(cif->nargs * sizeof(void *)); + + argn = 0; + + /* Copy the caller's structure return address to that the closure + returns the data directly to the caller. */ + if (cif->flags == FFI_TYPE_STRUCT) + { + rvalue = (void *) argp[0]; + argn = 1; + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + /* Grab the addresses of the arguments from the stack frame. */ + while (i < avn) + { + size_t size = arg_types[i]->size; + + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_POINTER: + case FFI_TYPE_STRUCT: + avalue[i] = &argp[argn]; + break; + + case FFI_TYPE_FLOAT: + if (argn < 6) + { + /* Floats coming from registers need conversion from double + back to float format. */ + *(float *)&argp[argn - 6] = *(double *)&argp[argn - 6]; + avalue[i] = &argp[argn - 6]; + } + else + avalue[i] = &argp[argn]; + break; + + case FFI_TYPE_DOUBLE: + avalue[i] = &argp[argn - (argn < 6 ? 6 : 0)]; + break; + + case FFI_TYPE_LONGDOUBLE: + /* 128-bit long double is passed by reference. */ + avalue[i] = (long double *) argp[argn]; + size = sizeof (long double *); + break; + + default: + abort (); + } + + argn += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + i++; + } + + /* Invoke the closure. */ + closure->fun (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_osf how to perform return type promotions. */ + return cif->rtype->type; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffitarget.h new file mode 100644 index 0000000..7d06eb0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffitarget.h @@ -0,0 +1,48 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for Alpha. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_OSF, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_OSF +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 24 +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/osf.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/osf.S new file mode 100644 index 0000000..6b9f4df --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/osf.S @@ -0,0 +1,387 @@ +/* ----------------------------------------------------------------------- + osf.S - Copyright (c) 1998, 2001, 2007, 2008, 2011 Red Hat + + Alpha/OSF Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + + .arch ev6 + .text + +/* ffi_call_osf (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)(void)); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 3 + .globl ffi_call_osf + .ent ffi_call_osf + FFI_HIDDEN(ffi_call_osf) + +ffi_call_osf: + .frame $15, 32, $26, 0 + .mask 0x4008000, -32 +$LFB1: + addq $16,$17,$1 + mov $16, $30 + stq $26, 0($1) + stq $15, 8($1) + stq $18, 16($1) + mov $1, $15 +$LCFI1: + .prologue 0 + + stq $19, 24($1) + mov $20, $27 + + # Load up all of the (potential) argument registers. + ldq $16, 0($30) + ldt $f16, 0($30) + ldt $f17, 8($30) + ldq $17, 8($30) + ldt $f18, 16($30) + ldq $18, 16($30) + ldt $f19, 24($30) + ldq $19, 24($30) + ldt $f20, 32($30) + ldq $20, 32($30) + ldt $f21, 40($30) + ldq $21, 40($30) + + # Deallocate the register argument area. + lda $30, 48($30) + + jsr $26, ($27), 0 + ldgp $29, 0($26) + + # If the return value pointer is NULL, assume no return value. + ldq $19, 24($15) + ldq $18, 16($15) + ldq $26, 0($15) +$LCFI2: + beq $19, $noretval + + # Store the return value out in the proper type. + cmpeq $18, FFI_TYPE_INT, $1 + bne $1, $retint + cmpeq $18, FFI_TYPE_FLOAT, $2 + bne $2, $retfloat + cmpeq $18, FFI_TYPE_DOUBLE, $3 + bne $3, $retdouble + + .align 3 +$noretval: + ldq $15, 8($15) + ret + + .align 4 +$retint: + stq $0, 0($19) + nop + ldq $15, 8($15) + ret + + .align 4 +$retfloat: + sts $f0, 0($19) + nop + ldq $15, 8($15) + ret + + .align 4 +$retdouble: + stt $f0, 0($19) + nop + ldq $15, 8($15) + ret +$LFE1: + + .end ffi_call_osf + +/* ffi_closure_osf(...) + + Receives the closure argument in $1. */ + + .align 3 + .globl ffi_closure_osf + .ent ffi_closure_osf + FFI_HIDDEN(ffi_closure_osf) + +ffi_closure_osf: + .frame $30, 16*8, $26, 0 + .mask 0x4000000, -16*8 +$LFB2: + ldgp $29, 0($27) + subq $30, 16*8, $30 +$LCFI5: + stq $26, 0($30) +$LCFI6: + .prologue 1 + + # Store all of the potential argument registers in va_list format. + stt $f16, 4*8($30) + stt $f17, 5*8($30) + stt $f18, 6*8($30) + stt $f19, 7*8($30) + stt $f20, 8*8($30) + stt $f21, 9*8($30) + stq $16, 10*8($30) + stq $17, 11*8($30) + stq $18, 12*8($30) + stq $19, 13*8($30) + stq $20, 14*8($30) + stq $21, 15*8($30) + + # Call ffi_closure_osf_inner to do the bulk of the work. + mov $1, $16 + lda $17, 2*8($30) + lda $18, 10*8($30) + jsr $26, ffi_closure_osf_inner + ldgp $29, 0($26) + ldq $26, 0($30) + + # Load up the return value in the proper type. + lda $1, $load_table + s4addq $0, $1, $1 + ldl $1, 0($1) + addq $1, $29, $1 + jmp $31, ($1), $load_32 + + .align 4 +$load_none: + addq $30, 16*8, $30 + ret + + .align 4 +$load_float: + lds $f0, 16($30) + nop + addq $30, 16*8, $30 + ret + + .align 4 +$load_double: + ldt $f0, 16($30) + nop + addq $30, 16*8, $30 + ret + + .align 4 +$load_u8: +#ifdef __alpha_bwx__ + ldbu $0, 16($30) + nop +#else + ldq $0, 16($30) + and $0, 255, $0 +#endif + addq $30, 16*8, $30 + ret + + .align 4 +$load_s8: +#ifdef __alpha_bwx__ + ldbu $0, 16($30) + sextb $0, $0 +#else + ldq $0, 16($30) + sll $0, 56, $0 + sra $0, 56, $0 +#endif + addq $30, 16*8, $30 + ret + + .align 4 +$load_u16: +#ifdef __alpha_bwx__ + ldwu $0, 16($30) + nop +#else + ldq $0, 16($30) + zapnot $0, 3, $0 +#endif + addq $30, 16*8, $30 + ret + + .align 4 +$load_s16: +#ifdef __alpha_bwx__ + ldwu $0, 16($30) + sextw $0, $0 +#else + ldq $0, 16($30) + sll $0, 48, $0 + sra $0, 48, $0 +#endif + addq $30, 16*8, $30 + ret + + .align 4 +$load_32: + ldl $0, 16($30) + nop + addq $30, 16*8, $30 + ret + + .align 4 +$load_64: + ldq $0, 16($30) + nop + addq $30, 16*8, $30 + ret +$LFE2: + + .end ffi_closure_osf + +#ifdef __ELF__ +.section .rodata +#else +.rdata +#endif +$load_table: + .gprel32 $load_none # FFI_TYPE_VOID + .gprel32 $load_32 # FFI_TYPE_INT + .gprel32 $load_float # FFI_TYPE_FLOAT + .gprel32 $load_double # FFI_TYPE_DOUBLE + .gprel32 $load_none # FFI_TYPE_LONGDOUBLE + .gprel32 $load_u8 # FFI_TYPE_UINT8 + .gprel32 $load_s8 # FFI_TYPE_SINT8 + .gprel32 $load_u16 # FFI_TYPE_UINT16 + .gprel32 $load_s16 # FFI_TYPE_SINT16 + .gprel32 $load_32 # FFI_TYPE_UINT32 + .gprel32 $load_32 # FFI_TYPE_SINT32 + .gprel32 $load_64 # FFI_TYPE_UINT64 + .gprel32 $load_64 # FFI_TYPE_SINT64 + .gprel32 $load_none # FFI_TYPE_STRUCT + .gprel32 $load_64 # FFI_TYPE_POINTER + +/* Assert that the table above is in sync with ffi.h. */ + +#if FFI_TYPE_FLOAT != 2 \ + || FFI_TYPE_DOUBLE != 3 \ + || FFI_TYPE_UINT8 != 5 \ + || FFI_TYPE_SINT8 != 6 \ + || FFI_TYPE_UINT16 != 7 \ + || FFI_TYPE_SINT16 != 8 \ + || FFI_TYPE_UINT32 != 9 \ + || FFI_TYPE_SINT32 != 10 \ + || FFI_TYPE_UINT64 != 11 \ + || FFI_TYPE_SINT64 != 12 \ + || FFI_TYPE_STRUCT != 13 \ + || FFI_TYPE_POINTER != 14 \ + || FFI_TYPE_LAST != 14 +#error "osf.S out of sync with ffi.h" +#endif + +#ifdef __ELF__ +# define UA_SI .4byte +# define FDE_ENCODING 0x1b /* pcrel sdata4 */ +# define FDE_ENCODE(X) .4byte X-. +# define FDE_ARANGE(X) .4byte X +#elif defined __osf__ +# define UA_SI .align 0; .long +# define FDE_ENCODING 0x50 /* aligned absolute */ +# define FDE_ENCODE(X) .align 3; .quad X +# define FDE_ARANGE(X) .align 0; .quad X +#endif + +#ifdef __ELF__ + .section .eh_frame,EH_FRAME_FLAGS,@progbits +#elif defined __osf__ + .data + .align 3 + .globl _GLOBAL__F_ffi_call_osf +_GLOBAL__F_ffi_call_osf: +#endif +__FRAME_BEGIN__: + UA_SI $LECIE1-$LSCIE1 # Length of Common Information Entry +$LSCIE1: + UA_SI 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "zR\0" # CIE Augmentation + .byte 0x1 # uleb128 0x1; CIE Code Alignment Factor + .byte 0x78 # sleb128 -8; CIE Data Alignment Factor + .byte 26 # CIE RA Column + .byte 0x1 # uleb128 0x1; Augmentation size + .byte FDE_ENCODING # FDE Encoding + .byte 0xc # DW_CFA_def_cfa + .byte 30 # uleb128 column 30 + .byte 0 # uleb128 offset 0 + .align 3 +$LECIE1: +$LSFDE1: + UA_SI $LEFDE1-$LASFDE1 # FDE Length +$LASFDE1: + UA_SI $LASFDE1-__FRAME_BEGIN__ # FDE CIE offset + FDE_ENCODE($LFB1) # FDE initial location + FDE_ARANGE($LFE1-$LFB1) # FDE address range + .byte 0x0 # uleb128 0x0; Augmentation size + + .byte 0x4 # DW_CFA_advance_loc4 + UA_SI $LCFI1-$LFB1 + .byte 0x9a # DW_CFA_offset, column 26 + .byte 4 # uleb128 4*-8 + .byte 0x8f # DW_CFA_offset, column 15 + .byte 0x3 # uleb128 3*-8 + .byte 0xc # DW_CFA_def_cfa + .byte 15 # uleb128 column 15 + .byte 32 # uleb128 offset 32 + + .byte 0x4 # DW_CFA_advance_loc4 + UA_SI $LCFI2-$LCFI1 + .byte 0xda # DW_CFA_restore, column 26 + .align 3 +$LEFDE1: + +$LSFDE3: + UA_SI $LEFDE3-$LASFDE3 # FDE Length +$LASFDE3: + UA_SI $LASFDE3-__FRAME_BEGIN__ # FDE CIE offset + FDE_ENCODE($LFB2) # FDE initial location + FDE_ARANGE($LFE2-$LFB2) # FDE address range + .byte 0x0 # uleb128 0x0; Augmentation size + + .byte 0x4 # DW_CFA_advance_loc4 + UA_SI $LCFI5-$LFB2 + .byte 0xe # DW_CFA_def_cfa_offset + .byte 0x80,0x1 # uleb128 128 + + .byte 0x4 # DW_CFA_advance_loc4 + UA_SI $LCFI6-$LCFI5 + .byte 0x9a # DW_CFA_offset, column 26 + .byte 16 # uleb128 offset 16*-8 + .align 3 +$LEFDE3: +#if defined __osf__ + .align 0 + .long 0 # End of Table +#endif + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffi.c new file mode 100644 index 0000000..b2e7667 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffi.c @@ -0,0 +1,728 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2011 Plausible Labs Cooperative, Inc. + Copyright (c) 2011 Anthony Green + Copyright (c) 2011 Free Software Foundation + Copyright (c) 1998, 2008, 2011 Red Hat, Inc. + + ARM Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +/* Forward declares. */ +static int vfp_type_p (ffi_type *); +static void layout_vfp_args (ffi_cif *); + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments + + The vfp_space parameter is the load area for VFP regs, the return + value is cif->vfp_used (word bitset of VFP regs used for passing + arguments). These are only used for the VFP hard-float ABI. +*/ +int ffi_prep_args(char *stack, extended_cif *ecif, float *vfp_space) +{ + register unsigned int i, vi = 0; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); + i--, p_arg++) + { + size_t z; + + /* Allocated in VFP registers. */ + if (ecif->cif->abi == FFI_VFP + && vi < ecif->cif->vfp_nargs && vfp_type_p (*p_arg)) + { + float* vfp_slot = vfp_space + ecif->cif->vfp_args[vi++]; + if ((*p_arg)->type == FFI_TYPE_FLOAT) + *((float*)vfp_slot) = *((float*)*p_argv); + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) + *((double*)vfp_slot) = *((double*)*p_argv); + else + memcpy(vfp_slot, *p_argv, (*p_arg)->size); + p_argv++; + continue; + } + + /* Align if necessary */ + if (((*p_arg)->alignment - 1) & (unsigned) argp) { + argp = (char *) ALIGN(argp, (*p_arg)->alignment); + } + + if ((*p_arg)->type == FFI_TYPE_STRUCT) + argp = (char *) ALIGN(argp, 4); + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + memcpy(argp, *p_argv, (*p_arg)->size); + break; + + default: + FFI_ASSERT(0); + } + } + else if (z == sizeof(int)) + { + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + } + + /* Indicate the VFP registers used. */ + return ecif->cif->vfp_used; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + int type_code; + /* Round the stack up to a multiple of 8 bytes. This isn't needed + everywhere, but it is on some platforms, and it doesn't harm anything + when it isn't needed. */ + cif->bytes = (cif->bytes + 7) & ~7; + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = (unsigned) FFI_TYPE_SINT64; + break; + + case FFI_TYPE_STRUCT: + if (cif->abi == FFI_VFP + && (type_code = vfp_type_p (cif->rtype)) != 0) + { + /* A Composite Type passed in VFP registers, either + FFI_TYPE_STRUCT_VFP_FLOAT or FFI_TYPE_STRUCT_VFP_DOUBLE. */ + cif->flags = (unsigned) type_code; + } + else if (cif->rtype->size <= 4) + /* A Composite Type not larger than 4 bytes is returned in r0. */ + cif->flags = (unsigned)FFI_TYPE_INT; + else + /* A Composite Type larger than 4 bytes, or whose size cannot + be determined statically ... is stored in memory at an + address passed [in r0]. */ + cif->flags = (unsigned)FFI_TYPE_STRUCT; + break; + + default: + cif->flags = FFI_TYPE_INT; + break; + } + + /* Map out the register placements of VFP register args. + The VFP hard-float calling conventions are slightly more sophisticated than + the base calling conventions, so we do it here instead of in ffi_prep_args(). */ + if (cif->abi == FFI_VFP) + layout_vfp_args (cif); + + return FFI_OK; +} + +/* Prototypes for assembly functions, in sysv.S */ +extern void ffi_call_SYSV (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); +extern void ffi_call_VFP (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + int small_struct = (cif->flags == FFI_TYPE_INT + && cif->rtype->type == FFI_TYPE_STRUCT); + int vfp_struct = (cif->flags == FFI_TYPE_STRUCT_VFP_FLOAT + || cif->flags == FFI_TYPE_STRUCT_VFP_DOUBLE); + + ecif.cif = cif; + ecif.avalue = avalue; + + unsigned int temp; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->flags == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else if (small_struct) + ecif.rvalue = &temp; + else if (vfp_struct) + { + /* Largest case is double x 4. */ + ecif.rvalue = alloca(32); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); + break; + + case FFI_VFP: + ffi_call_VFP (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); + break; + + default: + FFI_ASSERT(0); + break; + } + if (small_struct) + memcpy (rvalue, &temp, cif->rtype->size); + else if (vfp_struct) + memcpy (rvalue, ecif.rvalue, cif->rtype->size); +} + +/** private members **/ + +static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif, float *vfp_stack); + +void ffi_closure_SYSV (ffi_closure *); + +void ffi_closure_VFP (ffi_closure *); + +/* This function is jumped to by the trampoline */ + +unsigned int +ffi_closure_SYSV_inner (closure, respp, args, vfp_args) + ffi_closure *closure; + void **respp; + void *args; + void *vfp_args; +{ + // our various things... + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will re-set RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args); + + (closure->fun) (cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} + +/*@-exportheader@*/ +static void +ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, + void **avalue, ffi_cif *cif, + /* Used only under VFP hard-float ABI. */ + float *vfp_stack) +/*@=exportheader@*/ +{ + register unsigned int i, vi = 0; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( cif->flags == FFI_TYPE_STRUCT ) { + *rvalue = *(void **) argp; + argp += 4; + } + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + size_t alignment; + + if (cif->abi == FFI_VFP + && vi < cif->vfp_nargs && vfp_type_p (*p_arg)) + { + *p_argv++ = (void*)(vfp_stack + cif->vfp_args[vi++]); + continue; + } + + alignment = (*p_arg)->alignment; + if (alignment < 4) + alignment = 4; + /* Align if necessary */ + if ((alignment - 1) & (unsigned) argp) { + argp = (char *) ALIGN(argp, alignment); + } + + z = (*p_arg)->size; + + /* because we're little endian, this is what it turns into. */ + + *p_argv = (void*) argp; + + p_argv++; + argp += z; + } + + return; +} + +/* How to make a trampoline. */ + +#if FFI_EXEC_TRAMPOLINE_TABLE + +#include +#include +#include +#include + +extern void *ffi_closure_trampoline_table_page; + +typedef struct ffi_trampoline_table ffi_trampoline_table; +typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry; + +struct ffi_trampoline_table { + /* contigious writable and executable pages */ + vm_address_t config_page; + vm_address_t trampoline_page; + + /* free list tracking */ + uint16_t free_count; + ffi_trampoline_table_entry *free_list; + ffi_trampoline_table_entry *free_list_pool; + + ffi_trampoline_table *prev; + ffi_trampoline_table *next; +}; + +struct ffi_trampoline_table_entry { + void *(*trampoline)(); + ffi_trampoline_table_entry *next; +}; + +/* Override the standard architecture trampoline size */ +// XXX TODO - Fix +#undef FFI_TRAMPOLINE_SIZE +#define FFI_TRAMPOLINE_SIZE 12 + +/* The trampoline configuration is placed at 4080 bytes prior to the trampoline's entry point */ +#define FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc) ((void **) (((uint8_t *) codeloc) - 4080)); + +/* The first 16 bytes of the config page are unused, as they are unaddressable from the trampoline page. */ +#define FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET 16 + +/* Total number of trampolines that fit in one trampoline table */ +#define FFI_TRAMPOLINE_COUNT ((PAGE_SIZE - FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) / FFI_TRAMPOLINE_SIZE) + +static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER; +static ffi_trampoline_table *ffi_trampoline_tables = NULL; + +static ffi_trampoline_table * +ffi_trampoline_table_alloc () +{ + ffi_trampoline_table *table = NULL; + + /* Loop until we can allocate two contigious pages */ + while (table == NULL) { + vm_address_t config_page = 0x0; + kern_return_t kt; + + /* Try to allocate two pages */ + kt = vm_allocate (mach_task_self (), &config_page, PAGE_SIZE*2, VM_FLAGS_ANYWHERE); + if (kt != KERN_SUCCESS) { + fprintf(stderr, "vm_allocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + break; + } + + /* Now drop the second half of the allocation to make room for the trampoline table */ + vm_address_t trampoline_page = config_page+PAGE_SIZE; + kt = vm_deallocate (mach_task_self (), trampoline_page, PAGE_SIZE); + if (kt != KERN_SUCCESS) { + fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + break; + } + + /* Remap the trampoline table to directly follow the config page */ + vm_prot_t cur_prot; + vm_prot_t max_prot; + + kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_SIZE, 0x0, FALSE, mach_task_self (), (vm_address_t) &ffi_closure_trampoline_table_page, FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); + + /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */ + if (kt != KERN_SUCCESS) { + /* Log unexpected failures */ + if (kt != KERN_NO_SPACE) { + fprintf(stderr, "vm_remap() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + } + + vm_deallocate (mach_task_self (), config_page, PAGE_SIZE); + continue; + } + + /* We have valid trampoline and config pages */ + table = calloc (1, sizeof(ffi_trampoline_table)); + table->free_count = FFI_TRAMPOLINE_COUNT; + table->config_page = config_page; + table->trampoline_page = trampoline_page; + + /* Create and initialize the free list */ + table->free_list_pool = calloc(FFI_TRAMPOLINE_COUNT, sizeof(ffi_trampoline_table_entry)); + + uint16_t i; + for (i = 0; i < table->free_count; i++) { + ffi_trampoline_table_entry *entry = &table->free_list_pool[i]; + entry->trampoline = (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE)); + + if (i < table->free_count - 1) + entry->next = &table->free_list_pool[i+1]; + } + + table->free_list = table->free_list_pool; + } + + return table; +} + +void * +ffi_closure_alloc (size_t size, void **code) +{ + /* Create the closure */ + ffi_closure *closure = malloc(size); + if (closure == NULL) + return NULL; + + pthread_mutex_lock(&ffi_trampoline_lock); + + /* Check for an active trampoline table with available entries. */ + ffi_trampoline_table *table = ffi_trampoline_tables; + if (table == NULL || table->free_list == NULL) { + table = ffi_trampoline_table_alloc (); + if (table == NULL) { + free(closure); + return NULL; + } + + /* Insert the new table at the top of the list */ + table->next = ffi_trampoline_tables; + if (table->next != NULL) + table->next->prev = table; + + ffi_trampoline_tables = table; + } + + /* Claim the free entry */ + ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list; + ffi_trampoline_tables->free_list = entry->next; + ffi_trampoline_tables->free_count--; + entry->next = NULL; + + pthread_mutex_unlock(&ffi_trampoline_lock); + + /* Initialize the return values */ + *code = entry->trampoline; + closure->trampoline_table = table; + closure->trampoline_table_entry = entry; + + return closure; +} + +void +ffi_closure_free (void *ptr) +{ + ffi_closure *closure = ptr; + + pthread_mutex_lock(&ffi_trampoline_lock); + + /* Fetch the table and entry references */ + ffi_trampoline_table *table = closure->trampoline_table; + ffi_trampoline_table_entry *entry = closure->trampoline_table_entry; + + /* Return the entry to the free list */ + entry->next = table->free_list; + table->free_list = entry; + table->free_count++; + + /* If all trampolines within this table are free, and at least one other table exists, deallocate + * the table */ + if (table->free_count == FFI_TRAMPOLINE_COUNT && ffi_trampoline_tables != table) { + /* Remove from the list */ + if (table->prev != NULL) + table->prev->next = table->next; + + if (table->next != NULL) + table->next->prev = table->prev; + + /* Deallocate pages */ + kern_return_t kt; + kt = vm_deallocate (mach_task_self (), table->config_page, PAGE_SIZE); + if (kt != KERN_SUCCESS) + fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + + kt = vm_deallocate (mach_task_self (), table->trampoline_page, PAGE_SIZE); + if (kt != KERN_SUCCESS) + fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + + /* Deallocate free list */ + free (table->free_list_pool); + free (table); + } else if (ffi_trampoline_tables != table) { + /* Otherwise, bump this table to the top of the list */ + table->prev = NULL; + table->next = ffi_trampoline_tables; + if (ffi_trampoline_tables != NULL) + ffi_trampoline_tables->prev = table; + + ffi_trampoline_tables = table; + } + + pthread_mutex_unlock (&ffi_trampoline_lock); + + /* Free the closure */ + free (closure); +} + +#else + +#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ +({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ + unsigned int __fun = (unsigned int)(FUN); \ + unsigned int __ctx = (unsigned int)(CTX); \ + unsigned char *insns = (unsigned char *)(CTX); \ + *(unsigned int*) &__tramp[0] = 0xe92d000f; /* stmfd sp!, {r0-r3} */ \ + *(unsigned int*) &__tramp[4] = 0xe59f0000; /* ldr r0, [pc] */ \ + *(unsigned int*) &__tramp[8] = 0xe59ff000; /* ldr pc, [pc] */ \ + *(unsigned int*) &__tramp[12] = __ctx; \ + *(unsigned int*) &__tramp[16] = __fun; \ + __clear_cache((&__tramp[0]), (&__tramp[19])); /* Clear data mapping. */ \ + __clear_cache(insns, insns + 3 * sizeof (unsigned int)); \ + /* Clear instruction \ + mapping. */ \ + }) + +#endif + +/* the cif must already be prep'ed */ + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + void (*closure_func)(ffi_closure*) = NULL; + + if (cif->abi == FFI_SYSV) + closure_func = &ffi_closure_SYSV; + else if (cif->abi == FFI_VFP) + closure_func = &ffi_closure_VFP; + else + return FFI_BAD_ABI; + +#if FFI_EXEC_TRAMPOLINE_TABLE + void **config = FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc); + config[0] = closure; + config[1] = closure_func; +#else + FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ + closure_func, \ + codeloc); +#endif + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +/* Below are routines for VFP hard-float support. */ + +static int rec_vfp_type_p (ffi_type *t, int *elt, int *elnum) +{ + switch (t->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + *elt = (int) t->type; + *elnum = 1; + return 1; + + case FFI_TYPE_STRUCT_VFP_FLOAT: + *elt = FFI_TYPE_FLOAT; + *elnum = t->size / sizeof (float); + return 1; + + case FFI_TYPE_STRUCT_VFP_DOUBLE: + *elt = FFI_TYPE_DOUBLE; + *elnum = t->size / sizeof (double); + return 1; + + case FFI_TYPE_STRUCT:; + { + int base_elt = 0, total_elnum = 0; + ffi_type **el = t->elements; + while (*el) + { + int el_elt = 0, el_elnum = 0; + if (! rec_vfp_type_p (*el, &el_elt, &el_elnum) + || (base_elt && base_elt != el_elt) + || total_elnum + el_elnum > 4) + return 0; + base_elt = el_elt; + total_elnum += el_elnum; + el++; + } + *elnum = total_elnum; + *elt = base_elt; + return 1; + } + default: ; + } + return 0; +} + +static int vfp_type_p (ffi_type *t) +{ + int elt, elnum; + if (rec_vfp_type_p (t, &elt, &elnum)) + { + if (t->type == FFI_TYPE_STRUCT) + { + if (elnum == 1) + t->type = elt; + else + t->type = (elt == FFI_TYPE_FLOAT + ? FFI_TYPE_STRUCT_VFP_FLOAT + : FFI_TYPE_STRUCT_VFP_DOUBLE); + } + return (int) t->type; + } + return 0; +} + +static void place_vfp_arg (ffi_cif *cif, ffi_type *t) +{ + int reg = cif->vfp_reg_free; + int nregs = t->size / sizeof (float); + int align = ((t->type == FFI_TYPE_STRUCT_VFP_FLOAT + || t->type == FFI_TYPE_FLOAT) ? 1 : 2); + /* Align register number. */ + if ((reg & 1) && align == 2) + reg++; + while (reg + nregs <= 16) + { + int s, new_used = 0; + for (s = reg; s < reg + nregs; s++) + { + new_used |= (1 << s); + if (cif->vfp_used & (1 << s)) + { + reg += align; + goto next_reg; + } + } + /* Found regs to allocate. */ + cif->vfp_used |= new_used; + cif->vfp_args[cif->vfp_nargs++] = reg; + + /* Update vfp_reg_free. */ + if (cif->vfp_used & (1 << cif->vfp_reg_free)) + { + reg += nregs; + while (cif->vfp_used & (1 << reg)) + reg += 1; + cif->vfp_reg_free = reg; + } + return; + next_reg: ; + } +} + +static void layout_vfp_args (ffi_cif *cif) +{ + int i; + /* Init VFP fields */ + cif->vfp_used = 0; + cif->vfp_nargs = 0; + cif->vfp_reg_free = 0; + memset (cif->vfp_args, -1, 16); /* Init to -1. */ + + for (i = 0; i < cif->nargs; i++) + { + ffi_type *t = cif->arg_types[i]; + if (vfp_type_p (t)) + place_vfp_arg (cif, t); + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffitarget.h new file mode 100644 index 0000000..ce25b23 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffitarget.h @@ -0,0 +1,65 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Copyright (c) 2010 CodeSourcery + + Target configuration macros for ARM. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_VFP, + FFI_LAST_ABI, +#ifdef __ARM_PCS_VFP + FFI_DEFAULT_ABI = FFI_VFP, +#else + FFI_DEFAULT_ABI = FFI_SYSV, +#endif +} ffi_abi; +#endif + +#define FFI_EXTRA_CIF_FIELDS \ + int vfp_used; \ + short vfp_reg_free, vfp_nargs; \ + signed char vfp_args[16] \ + +/* Internally used. */ +#define FFI_TYPE_STRUCT_VFP_FLOAT (FFI_TYPE_LAST + 1) +#define FFI_TYPE_STRUCT_VFP_DOUBLE (FFI_TYPE_LAST + 2) + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 20 +#define FFI_NATIVE_RAW_API 0 + +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/gentramp.sh b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/gentramp.sh new file mode 100755 index 0000000..74f0b86 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/gentramp.sh @@ -0,0 +1,118 @@ +#!/bin/sh + +# ----------------------------------------------------------------------- +# gentramp.sh - Copyright (c) 2010, Plausible Labs Cooperative, Inc. +# +# ARM Trampoline Page Generator +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# ``Software''), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# ----------------------------------------------------------------------- + +PROGNAME=$0 + +# Each trampoline is exactly 3 instructions, or 12 bytes. If any of these values change, +# the entire arm trampoline implementation must be updated to match, too. + +# Size of an individual trampoline, in bytes +TRAMPOLINE_SIZE=12 + +# Page size, in bytes +PAGE_SIZE=4096 + +# Compute the size of the reachable config page; The first 16 bytes of the config page +# are unreachable due to our maximum pc-relative ldr offset. +PAGE_AVAIL=`expr $PAGE_SIZE - 16` + +# Compute the number of of available trampolines. +TRAMPOLINE_COUNT=`expr $PAGE_AVAIL / $TRAMPOLINE_SIZE` + +header () { + echo "# GENERATED CODE - DO NOT EDIT" + echo "# This file was generated by $PROGNAME" + echo "" + + # Write out the license header +cat << EOF +# Copyright (c) 2010, Plausible Labs Cooperative, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# ``Software''), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# ----------------------------------------------------------------------- + +EOF + + # Write out the trampoline table, aligned to the page boundary + echo ".text" + echo ".align 12" + echo ".globl _ffi_closure_trampoline_table_page" + echo "_ffi_closure_trampoline_table_page:" +} + + +# WARNING - Don't modify the trampoline code size without also updating the relevent libffi code +trampoline () { + cat << END + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + +END +} + +main () { + # Write out the header + header + + # Write out the trampolines + local i=0 + while [ $i -lt ${TRAMPOLINE_COUNT} ]; do + trampoline + local i=`expr $i + 1` + done +} + +main diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/sysv.S new file mode 100644 index 0000000..14a7f03 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/sysv.S @@ -0,0 +1,497 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. + Copyright (c) 2011 Plausible Labs Cooperative, Inc. + + ARM Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include +#ifdef HAVE_MACHINE_ASM_H +#include +#else +#ifdef __USER_LABEL_PREFIX__ +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a ## b + +/* Use the right prefix for global labels. */ +#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) +#else +#define CNAME(x) x +#endif +#ifdef __APPLE__ +#define ENTRY(x) .globl CNAME(x); CNAME(x): +#else +#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): +#endif /* __APPLE__ */ +#endif + +#ifdef __ELF__ +#define LSYM(x) .x +#else +#define LSYM(x) x +#endif + +/* Use the SOFTFP return value ABI on Mac OS X, as per the iOS ABI + Function Call Guide */ +#ifdef __APPLE__ +#define __SOFTFP__ +#endif + +/* We need a better way of testing for this, but for now, this is all + we can do. */ +@ This selects the minimum architecture level required. +#define __ARM_ARCH__ 3 + +#if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) +# undef __ARM_ARCH__ +# define __ARM_ARCH__ 4 +#endif + +#if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ + || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ + || defined(__ARM_ARCH_5TEJ__) +# undef __ARM_ARCH__ +# define __ARM_ARCH__ 5 +#endif + +#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ + || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ + || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ + || defined(__ARM_ARCH_6M__) +# undef __ARM_ARCH__ +# define __ARM_ARCH__ 6 +#endif + +#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ + || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ + || defined(__ARM_ARCH_7EM__) +# undef __ARM_ARCH__ +# define __ARM_ARCH__ 7 +#endif + +#if __ARM_ARCH__ >= 5 +# define call_reg(x) blx x +#elif defined (__ARM_ARCH_4T__) +# define call_reg(x) mov lr, pc ; bx x +# if defined(__thumb__) || defined(__THUMB_INTERWORK__) +# define __INTERWORKING__ +# endif +#else +# define call_reg(x) mov lr, pc ; mov pc, x +#endif + +/* Conditionally compile unwinder directives. */ +#ifdef __ARM_EABI__ +#define UNWIND +#else +#define UNWIND @ +#endif + + +#if defined(__thumb__) && !defined(__THUMB_INTERWORK__) +.macro ARM_FUNC_START name + .text + .align 0 + .thumb + .thumb_func +#ifdef __APPLE__ + ENTRY($0) +#else + ENTRY(\name) +#endif + bx pc + nop + .arm + UNWIND .fnstart +/* A hook to tell gdb that we've switched to ARM mode. Also used to call + directly from other local arm routines. */ +#ifdef __APPLE__ +_L__$0: +#else +_L__\name: +#endif +.endm +#else +.macro ARM_FUNC_START name + .text + .align 0 + .arm +#ifdef __APPLE__ + ENTRY($0) +#else + ENTRY(\name) +#endif + UNWIND .fnstart +.endm +#endif + +.macro RETLDM regs=, cond=, dirn=ia +#if defined (__INTERWORKING__) + .ifc "\regs","" + ldr\cond lr, [sp], #4 + .else + ldm\cond\dirn sp!, {\regs, lr} + .endif + bx\cond lr +#else + .ifc "\regs","" + ldr\cond pc, [sp], #4 + .else + ldm\cond\dirn sp!, {\regs, pc} + .endif +#endif +.endm + + @ r0: ffi_prep_args + @ r1: &ecif + @ r2: cif->bytes + @ r3: fig->flags + @ sp+0: ecif.rvalue + + @ This assumes we are using gas. +ARM_FUNC_START ffi_call_SYSV + @ Save registers + stmfd sp!, {r0-r3, fp, lr} + UNWIND .save {r0-r3, fp, lr} + mov fp, sp + + UNWIND .setfp fp, sp + + @ Make room for all of the new args. + sub sp, fp, r2 + + @ Place all of the ffi_prep_args in position + mov r0, sp + @ r1 already set + + @ Call ffi_prep_args(stack, &ecif) + bl ffi_prep_args + + @ move first 4 parameters in registers + ldmia sp, {r0-r3} + + @ and adjust stack + sub lr, fp, sp @ cif->bytes == fp - sp + ldr ip, [fp] @ load fn() in advance + cmp lr, #16 + movhs lr, #16 + add sp, sp, lr + + @ call (fn) (...) + call_reg(ip) + + @ Remove the space we pushed for the args + mov sp, fp + + @ Load r2 with the pointer to storage for the return value + ldr r2, [sp, #24] + + @ Load r3 with the return type code + ldr r3, [sp, #12] + + @ If the return value pointer is NULL, assume no return value. + cmp r2, #0 + beq LSYM(Lepilogue) + +@ return INT + cmp r3, #FFI_TYPE_INT +#if defined(__SOFTFP__) || defined(__ARM_EABI__) + cmpne r3, #FFI_TYPE_FLOAT +#endif + streq r0, [r2] + beq LSYM(Lepilogue) + + @ return INT64 + cmp r3, #FFI_TYPE_SINT64 +#if defined(__SOFTFP__) || defined(__ARM_EABI__) + cmpne r3, #FFI_TYPE_DOUBLE +#endif + stmeqia r2, {r0, r1} + +#if !defined(__SOFTFP__) && !defined(__ARM_EABI__) + beq LSYM(Lepilogue) + +@ return FLOAT + cmp r3, #FFI_TYPE_FLOAT + stfeqs f0, [r2] + beq LSYM(Lepilogue) + +@ return DOUBLE or LONGDOUBLE + cmp r3, #FFI_TYPE_DOUBLE + stfeqd f0, [r2] +#endif + +LSYM(Lepilogue): +#if defined (__INTERWORKING__) + ldmia sp!, {r0-r3,fp, lr} + bx lr +#else + ldmia sp!, {r0-r3,fp, pc} +#endif + +.ffi_call_SYSV_end: + UNWIND .fnend +#ifdef __ELF__ + .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) +#endif + + +/* + unsigned int FFI_HIDDEN + ffi_closure_SYSV_inner (closure, respp, args) + ffi_closure *closure; + void **respp; + void *args; +*/ + +ARM_FUNC_START ffi_closure_SYSV + UNWIND .pad #16 + add ip, sp, #16 + stmfd sp!, {ip, lr} + UNWIND .save {r0, lr} + add r2, sp, #8 + UNWIND .pad #16 + sub sp, sp, #16 + str sp, [sp, #8] + add r1, sp, #8 + bl CNAME(ffi_closure_SYSV_inner) + cmp r0, #FFI_TYPE_INT + beq .Lretint + + cmp r0, #FFI_TYPE_FLOAT +#if defined(__SOFTFP__) || defined(__ARM_EABI__) + beq .Lretint +#else + beq .Lretfloat +#endif + + cmp r0, #FFI_TYPE_DOUBLE +#if defined(__SOFTFP__) || defined(__ARM_EABI__) + beq .Lretlonglong +#else + beq .Lretdouble +#endif + + cmp r0, #FFI_TYPE_LONGDOUBLE +#if defined(__SOFTFP__) || defined(__ARM_EABI__) + beq .Lretlonglong +#else + beq .Lretlongdouble +#endif + + cmp r0, #FFI_TYPE_SINT64 + beq .Lretlonglong +.Lclosure_epilogue: + add sp, sp, #16 + ldmfd sp, {sp, pc} +.Lretint: + ldr r0, [sp] + b .Lclosure_epilogue +.Lretlonglong: + ldr r0, [sp] + ldr r1, [sp, #4] + b .Lclosure_epilogue + +#if !defined(__SOFTFP__) && !defined(__ARM_EABI__) +.Lretfloat: + ldfs f0, [sp] + b .Lclosure_epilogue +.Lretdouble: + ldfd f0, [sp] + b .Lclosure_epilogue +.Lretlongdouble: + ldfd f0, [sp] + b .Lclosure_epilogue +#endif + +.ffi_closure_SYSV_end: + UNWIND .fnend +#ifdef __ELF__ + .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) +#endif + + +/* Below are VFP hard-float ABI call and closure implementations. + Add VFP FPU directive here. */ + .fpu vfp + + @ r0: fn + @ r1: &ecif + @ r2: cif->bytes + @ r3: fig->flags + @ sp+0: ecif.rvalue + +ARM_FUNC_START ffi_call_VFP + @ Save registers + stmfd sp!, {r0-r3, fp, lr} + UNWIND .save {r0-r3, fp, lr} + mov fp, sp + UNWIND .setfp fp, sp + + @ Make room for all of the new args. + sub sp, sp, r2 + + @ Make room for loading VFP args + sub sp, sp, #64 + + @ Place all of the ffi_prep_args in position + mov r0, sp + @ r1 already set + sub r2, fp, #64 @ VFP scratch space + + @ Call ffi_prep_args(stack, &ecif, vfp_space) + bl ffi_prep_args + + @ Load VFP register args if needed + cmp r0, #0 + beq LSYM(Lbase_args) + + @ Load only d0 if possible + cmp r0, #3 + sub ip, fp, #64 + flddle d0, [ip] + fldmiadgt ip, {d0-d7} + +LSYM(Lbase_args): + @ move first 4 parameters in registers + ldmia sp, {r0-r3} + + @ and adjust stack + sub lr, ip, sp @ cif->bytes == (fp - 64) - sp + ldr ip, [fp] @ load fn() in advance + cmp lr, #16 + movhs lr, #16 + add sp, sp, lr + + @ call (fn) (...) + call_reg(ip) + + @ Remove the space we pushed for the args + mov sp, fp + + @ Load r2 with the pointer to storage for + @ the return value + ldr r2, [sp, #24] + + @ Load r3 with the return type code + ldr r3, [sp, #12] + + @ If the return value pointer is NULL, + @ assume no return value. + cmp r2, #0 + beq LSYM(Lepilogue_vfp) + + cmp r3, #FFI_TYPE_INT + streq r0, [r2] + beq LSYM(Lepilogue_vfp) + + cmp r3, #FFI_TYPE_SINT64 + stmeqia r2, {r0, r1} + beq LSYM(Lepilogue_vfp) + + cmp r3, #FFI_TYPE_FLOAT + fstseq s0, [r2] + beq LSYM(Lepilogue_vfp) + + cmp r3, #FFI_TYPE_DOUBLE + fstdeq d0, [r2] + beq LSYM(Lepilogue_vfp) + + cmp r3, #FFI_TYPE_STRUCT_VFP_FLOAT + cmpne r3, #FFI_TYPE_STRUCT_VFP_DOUBLE + fstmiadeq r2, {d0-d3} + +LSYM(Lepilogue_vfp): + RETLDM "r0-r3,fp" + +.ffi_call_VFP_end: + UNWIND .fnend + .size CNAME(ffi_call_VFP),.ffi_call_VFP_end-CNAME(ffi_call_VFP) + + +ARM_FUNC_START ffi_closure_VFP + fstmfdd sp!, {d0-d7} + @ r0-r3, then d0-d7 + UNWIND .pad #80 + add ip, sp, #80 + stmfd sp!, {ip, lr} + UNWIND .save {r0, lr} + add r2, sp, #72 + add r3, sp, #8 + UNWIND .pad #72 + sub sp, sp, #72 + str sp, [sp, #64] + add r1, sp, #64 + bl ffi_closure_SYSV_inner + + cmp r0, #FFI_TYPE_INT + beq .Lretint_vfp + + cmp r0, #FFI_TYPE_FLOAT + beq .Lretfloat_vfp + + cmp r0, #FFI_TYPE_DOUBLE + cmpne r0, #FFI_TYPE_LONGDOUBLE + beq .Lretdouble_vfp + + cmp r0, #FFI_TYPE_SINT64 + beq .Lretlonglong_vfp + + cmp r0, #FFI_TYPE_STRUCT_VFP_FLOAT + beq .Lretfloat_struct_vfp + + cmp r0, #FFI_TYPE_STRUCT_VFP_DOUBLE + beq .Lretdouble_struct_vfp + +.Lclosure_epilogue_vfp: + add sp, sp, #72 + ldmfd sp, {sp, pc} + +.Lretfloat_vfp: + flds s0, [sp] + b .Lclosure_epilogue_vfp +.Lretdouble_vfp: + fldd d0, [sp] + b .Lclosure_epilogue_vfp +.Lretint_vfp: + ldr r0, [sp] + b .Lclosure_epilogue_vfp +.Lretlonglong_vfp: + ldmia sp, {r0, r1} + b .Lclosure_epilogue_vfp +.Lretfloat_struct_vfp: + fldmiad sp, {d0-d1} + b .Lclosure_epilogue_vfp +.Lretdouble_struct_vfp: + fldmiad sp, {d0-d3} + b .Lclosure_epilogue_vfp + +.ffi_closure_VFP_end: + UNWIND .fnend + .size CNAME(ffi_closure_VFP),.ffi_closure_VFP_end-CNAME(ffi_closure_VFP) + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",%progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/trampoline.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/trampoline.S new file mode 100644 index 0000000..7b47429 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/trampoline.S @@ -0,0 +1,4450 @@ +# GENERATED CODE - DO NOT EDIT +# This file was generated by ./gentramp.sh + +# Copyright (c) 2010, Plausible Labs Cooperative, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# Software''), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED AS IS'', WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# ----------------------------------------------------------------------- + +.text +.align 12 +.globl _ffi_closure_trampoline_table_page +_ffi_closure_trampoline_table_page: + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack + stmfd sp!, {r0-r3} + + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffi.c new file mode 100644 index 0000000..3d43397 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffi.c @@ -0,0 +1,423 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2011 Anthony Green + Copyright (c) 2009 Bradley Smith + + AVR32 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include +#include +#include + +/* #define DEBUG */ + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned int, unsigned int, unsigned int*, unsigned int, + void (*fn)(void)); +extern void ffi_closure_SYSV (ffi_closure *); + +unsigned int pass_struct_on_stack(ffi_type *type) +{ + if(type->type != FFI_TYPE_STRUCT) + return 0; + + if(type->alignment < type->size && + !(type->size == 4 || type->size == 8) && + !(type->size == 8 && type->alignment >= 4)) + return 1; + + if(type->size == 3 || type->size == 5 || type->size == 6 || + type->size == 7) + return 1; + + return 0; +} + +/* ffi_prep_args is called by the assembly routine once stack space + * has been allocated for the function's arguments + * + * This is annoyingly complex since we need to keep track of used + * registers. + */ + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + unsigned int i; + void **p_argv; + ffi_type **p_arg; + char *reg_base = stack; + char *stack_base = stack + 20; + unsigned int stack_offset = 0; + unsigned int reg_mask = 0; + + p_argv = ecif->avalue; + + /* If cif->flags is struct then we know it's not passed in registers */ + if(ecif->cif->flags == FFI_TYPE_STRUCT) + { + *(void**)reg_base = ecif->rvalue; + reg_mask |= 1; + } + + for(i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; + i++, p_arg++) + { + size_t z = (*p_arg)->size; + int alignment = (*p_arg)->alignment; + int type = (*p_arg)->type; + char *addr = 0; + + if(z % 4 != 0) + z += (4 - z % 4); + + if(reg_mask != 0x1f) + { + if(pass_struct_on_stack(*p_arg)) + { + addr = stack_base + stack_offset; + stack_offset += z; + } + else if(z == sizeof(int)) + { + char index = 0; + + while((reg_mask >> index) & 1) + index++; + + addr = reg_base + (index * 4); + reg_mask |= (1 << index); + } + else if(z == 2 * sizeof(int)) + { + if(!((reg_mask >> 1) & 1)) + { + addr = reg_base + 4; + reg_mask |= (3 << 1); + } + else if(!((reg_mask >> 3) & 1)) + { + addr = reg_base + 12; + reg_mask |= (3 << 3); + } + } + } + + if(!addr) + { + addr = stack_base + stack_offset; + stack_offset += z; + } + + if(type == FFI_TYPE_STRUCT && (*p_arg)->elements[1] == NULL) + type = (*p_arg)->elements[0]->type; + + switch(type) + { + case FFI_TYPE_UINT8: + *(unsigned int *)addr = (unsigned int)*(UINT8 *)(*p_argv); + break; + case FFI_TYPE_SINT8: + *(signed int *)addr = (signed int)*(SINT8 *)(*p_argv); + break; + case FFI_TYPE_UINT16: + *(unsigned int *)addr = (unsigned int)*(UINT16 *)(*p_argv); + break; + case FFI_TYPE_SINT16: + *(signed int *)addr = (signed int)*(SINT16 *)(*p_argv); + break; + default: + memcpy(addr, *p_argv, z); + } + + p_argv++; + } + +#ifdef DEBUG + /* Debugging */ + for(i = 0; i < 5; i++) + { + if((reg_mask & (1 << i)) == 0) + printf("r%d: (unused)\n", 12 - i); + else + printf("r%d: 0x%08x\n", 12 - i, ((unsigned int*)reg_base)[i]); + } + + for(i = 0; i < stack_offset / 4; i++) + { + printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack_base)[i]); + } +#endif +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Round the stack up to a multiple of 8 bytes. This isn't needed + * everywhere, but it is on some platforms, and it doesn't harm + * anything when it isn't needed. */ + cif->bytes = (cif->bytes + 7) & ~7; + + /* Flag to indicate that he return value is in fact a struct */ + cif->rstruct_flag = 0; + + /* Set the return type flag */ + switch(cif->rtype->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + cif->flags = (unsigned)FFI_TYPE_UINT8; + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + cif->flags = (unsigned)FFI_TYPE_UINT16; + break; + case FFI_TYPE_FLOAT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + cif->flags = (unsigned)FFI_TYPE_UINT32; + break; + case FFI_TYPE_DOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = (unsigned)FFI_TYPE_UINT64; + break; + case FFI_TYPE_STRUCT: + cif->rstruct_flag = 1; + if(!pass_struct_on_stack(cif->rtype)) + { + if(cif->rtype->size <= 1) + cif->flags = (unsigned)FFI_TYPE_UINT8; + else if(cif->rtype->size <= 2) + cif->flags = (unsigned)FFI_TYPE_UINT16; + else if(cif->rtype->size <= 4) + cif->flags = (unsigned)FFI_TYPE_UINT32; + else if(cif->rtype->size <= 8) + cif->flags = (unsigned)FFI_TYPE_UINT64; + else + cif->flags = (unsigned)cif->rtype->type; + } + else + cif->flags = (unsigned)cif->rtype->type; + break; + default: + cif->flags = (unsigned)cif->rtype->type; + break; + } + + return FFI_OK; +} + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + unsigned int size = 0, i = 0; + ffi_type **p_arg; + + ecif.cif = cif; + ecif.avalue = avalue; + + for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) + size += (*p_arg)->size + (4 - (*p_arg)->size % 4); + + /* If the return value is a struct and we don't have a return value + * address then we need to make one */ + + /* If cif->flags is struct then it's not suitable for registers */ + if((rvalue == NULL) && (cif->flags == FFI_TYPE_STRUCT)) + ecif.rvalue = alloca(cif->rtype->size); + else + ecif.rvalue = rvalue; + + switch(cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, size, cif->flags, + ecif.rvalue, cif->rstruct_flag, fn); + break; + default: + FFI_ASSERT(0); + break; + } +} + +static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, + void **avalue, ffi_cif *cif) +{ + register unsigned int i, reg_mask = 0; + register void **p_argv; + register ffi_type **p_arg; + register char *reg_base = stack; + register char *stack_base = stack + 20; + register unsigned int stack_offset = 0; + +#ifdef DEBUG + /* Debugging */ + for(i = 0; i < cif->nargs + 7; i++) + { + printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack)[i]); + } +#endif + + /* If cif->flags is struct then we know it's not passed in registers */ + if(cif->flags == FFI_TYPE_STRUCT) + { + *rvalue = *(void **)reg_base; + reg_mask |= 1; + } + + p_argv = avalue; + + for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) + { + size_t z = (*p_arg)->size; + int alignment = (*p_arg)->alignment; + + *p_argv = 0; + + if(z % 4 != 0) + z += (4 - z % 4); + + if(reg_mask != 0x1f) + { + if(pass_struct_on_stack(*p_arg)) + { + *p_argv = (void*)stack_base + stack_offset; + stack_offset += z; + } + else if(z <= sizeof(int)) + { + char index = 0; + + while((reg_mask >> index) & 1) + index++; + + *p_argv = (void*)reg_base + (index * 4); + reg_mask |= (1 << index); + } + else if(z == 2 * sizeof(int)) + { + if(!((reg_mask >> 1) & 1)) + { + *p_argv = (void*)reg_base + 4; + reg_mask |= (3 << 1); + } + else if(!((reg_mask >> 3) & 1)) + { + *p_argv = (void*)reg_base + 12; + reg_mask |= (3 << 3); + } + } + } + + if(!*p_argv) + { + *p_argv = (void*)stack_base + stack_offset; + stack_offset += z; + } + + if((*p_arg)->type != FFI_TYPE_STRUCT || + (*p_arg)->elements[1] == NULL) + { + if(alignment == 1) + **(unsigned int**)p_argv <<= 24; + else if(alignment == 2) + **(unsigned int**)p_argv <<= 16; + } + + p_argv++; + } + +#ifdef DEBUG + /* Debugging */ + for(i = 0; i < cif->nargs; i++) + { + printf("sp+%d: 0x%08x\n", i*4, *(((unsigned int**)avalue)[i])); + } +#endif +} + +/* This function is jumped to by the trampoline */ + +unsigned int ffi_closure_SYSV_inner(ffi_closure *closure, void **respp, + void *args) +{ + ffi_cif *cif; + void **arg_area; + unsigned int i, size = 0; + ffi_type **p_arg; + + cif = closure->cif; + + for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) + size += (*p_arg)->size + (4 - (*p_arg)->size % 4); + + arg_area = (void **)alloca(size); + + /* this call will initialize ARG_AREA, such that each element in that + * array points to the corresponding value on the stack; and if the + * function returns a structure, it will re-set RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); + + (closure->fun)(cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} + +ffi_status ffi_prep_closure_loc(ffi_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, + void *codeloc) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]); + unsigned int __fun = (unsigned int)(&ffi_closure_SYSV); + unsigned int __ctx = (unsigned int)(codeloc); + unsigned int __rstruct_flag = (unsigned int)(cif->rstruct_flag); + unsigned int __inner = (unsigned int)(&ffi_closure_SYSV_inner); + *(unsigned int*) &__tramp[0] = 0xebcd1f00; /* pushm r8-r12 */ + *(unsigned int*) &__tramp[4] = 0xfefc0010; /* ld.w r12, pc[16] */ + *(unsigned int*) &__tramp[8] = 0xfefb0010; /* ld.w r11, pc[16] */ + *(unsigned int*) &__tramp[12] = 0xfefa0010; /* ld.w r10, pc[16] */ + *(unsigned int*) &__tramp[16] = 0xfeff0010; /* ld.w pc, pc[16] */ + *(unsigned int*) &__tramp[20] = __ctx; + *(unsigned int*) &__tramp[24] = __rstruct_flag; + *(unsigned int*) &__tramp[28] = __inner; + *(unsigned int*) &__tramp[32] = __fun; + syscall(__NR_cacheflush, 0, (&__tramp[0]), 36); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffitarget.h new file mode 100644 index 0000000..b85d062 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffitarget.h @@ -0,0 +1,50 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2009 Bradley Smith + Target configuration macros for AVR32. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +#define FFI_EXTRA_CIF_FIELDS unsigned int rstruct_flag + +/* Definitions for closures */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 36 +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/sysv.S new file mode 100644 index 0000000..a984b3c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/sysv.S @@ -0,0 +1,208 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2009 Bradley Smith + + AVR32 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + --------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + + /* r12: ffi_prep_args + * r11: &ecif + * r10: size + * r9: cif->flags + * r8: ecif.rvalue + * sp+0: cif->rstruct_flag + * sp+4: fn */ + + .text + .align 1 + .globl ffi_call_SYSV + .type ffi_call_SYSV, @function +ffi_call_SYSV: + stm --sp, r0,r1,lr + stm --sp, r8-r12 + mov r0, sp + + /* Make room for all of the new args. */ + sub sp, r10 + /* Pad to make way for potential skipped registers */ + sub sp, 20 + + /* Call ffi_prep_args(stack, &ecif). */ + /* r11 already set */ + mov r1, r12 + mov r12, sp + icall r1 + + /* Save new argument size */ + mov r1, r12 + + /* Move first 5 parameters in registers. */ + ldm sp++, r8-r12 + + /* call (fn) (...). */ + ld.w r1, r0[36] + icall r1 + + /* Remove the space we pushed for the args. */ + mov sp, r0 + + /* Load r1 with the rstruct flag. */ + ld.w r1, sp[32] + + /* Load r9 with the return type code. */ + ld.w r9, sp[12] + + /* Load r8 with the return value pointer. */ + ld.w r8, sp[16] + + /* If the return value pointer is NULL, assume no return value. */ + cp.w r8, 0 + breq .Lend + + /* Check if return type is actually a struct */ + cp.w r1, 0 + breq 1f + + /* Return 8bit */ + cp.w r9, FFI_TYPE_UINT8 + breq .Lstore8 + + /* Return 16bit */ + cp.w r9, FFI_TYPE_UINT16 + breq .Lstore16 + +1: + /* Return 32bit */ + cp.w r9, FFI_TYPE_UINT32 + breq .Lstore32 + cp.w r9, FFI_TYPE_UINT16 + breq .Lstore32 + cp.w r9, FFI_TYPE_UINT8 + breq .Lstore32 + + /* Return 64bit */ + cp.w r9, FFI_TYPE_UINT64 + breq .Lstore64 + + /* Didn't match anything */ + bral .Lend + +.Lstore64: + st.w r8[0], r11 + st.w r8[4], r10 + bral .Lend + +.Lstore32: + st.w r8[0], r12 + bral .Lend + +.Lstore16: + st.h r8[0], r12 + bral .Lend + +.Lstore8: + st.b r8[0], r12 + bral .Lend + +.Lend: + sub sp, -20 + ldm sp++, r0,r1,pc + + .size ffi_call_SYSV, . - ffi_call_SYSV + + + /* r12: __ctx + * r11: __rstruct_flag + * r10: __inner */ + + .align 1 + .globl ffi_closure_SYSV + .type ffi_closure_SYSV, @function +ffi_closure_SYSV: + stm --sp, r0,lr + mov r0, r11 + mov r8, r10 + sub r10, sp, -8 + sub sp, 12 + st.w sp[8], sp + sub r11, sp, -8 + icall r8 + + /* Check if return type is actually a struct */ + cp.w r0, 0 + breq 1f + + /* Return 8bit */ + cp.w r12, FFI_TYPE_UINT8 + breq .Lget8 + + /* Return 16bit */ + cp.w r12, FFI_TYPE_UINT16 + breq .Lget16 + +1: + /* Return 32bit */ + cp.w r12, FFI_TYPE_UINT32 + breq .Lget32 + cp.w r12, FFI_TYPE_UINT16 + breq .Lget32 + cp.w r12, FFI_TYPE_UINT8 + breq .Lget32 + + /* Return 64bit */ + cp.w r12, FFI_TYPE_UINT64 + breq .Lget64 + + /* Didn't match anything */ + bral .Lclend + +.Lget64: + ld.w r11, sp[0] + ld.w r10, sp[4] + bral .Lclend + +.Lget32: + ld.w r12, sp[0] + bral .Lclend + +.Lget16: + ld.uh r12, sp[0] + bral .Lclend + +.Lget8: + ld.ub r12, sp[0] + bral .Lclend + +.Lclend: + sub sp, -12 + ldm sp++, r0,lr + sub sp, -20 + mov pc, lr + + .size ffi_closure_SYSV, . - ffi_closure_SYSV + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/closures.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/closures.c new file mode 100644 index 0000000..1b37827 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/closures.c @@ -0,0 +1,615 @@ +/* ----------------------------------------------------------------------- + closures.c - Copyright (c) 2007, 2009, 2010 Red Hat, Inc. + Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc + Copyright (c) 2011 Plausible Labs Cooperative, Inc. + + Code to allocate and deallocate memory for closures. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#if defined __linux__ && !defined _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif + +#include +#include + +#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE +# if __gnu_linux__ +/* This macro indicates it may be forbidden to map anonymous memory + with both write and execute permission. Code compiled when this + option is defined will attempt to map such pages once, but if it + fails, it falls back to creating a temporary file in a writable and + executable filesystem and mapping pages from it into separate + locations in the virtual memory space, one location writable and + another executable. */ +# define FFI_MMAP_EXEC_WRIT 1 +# define HAVE_MNTENT 1 +# endif +# if defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__) +/* Windows systems may have Data Execution Protection (DEP) enabled, + which requires the use of VirtualMalloc/VirtualFree to alloc/free + executable memory. */ +# define FFI_MMAP_EXEC_WRIT 1 +# endif +#endif + +#if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX +# ifdef __linux__ +/* When defined to 1 check for SELinux and if SELinux is active, + don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that + might cause audit messages. */ +# define FFI_MMAP_EXEC_SELINUX 1 +# endif +#endif + +#if FFI_CLOSURES + +# if FFI_EXEC_TRAMPOLINE_TABLE + +// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations. + +# elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */ + +#define USE_LOCKS 1 +#define USE_DL_PREFIX 1 +#ifdef __GNUC__ +#ifndef USE_BUILTIN_FFS +#define USE_BUILTIN_FFS 1 +#endif +#endif + +/* We need to use mmap, not sbrk. */ +#define HAVE_MORECORE 0 + +/* We could, in theory, support mremap, but it wouldn't buy us anything. */ +#define HAVE_MREMAP 0 + +/* We have no use for this, so save some code and data. */ +#define NO_MALLINFO 1 + +/* We need all allocations to be in regular segments, otherwise we + lose track of the corresponding code address. */ +#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T + +/* Don't allocate more than a page unless needed. */ +#define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize) + +#if FFI_CLOSURE_TEST +/* Don't release single pages, to avoid a worst-case scenario of + continuously allocating and releasing single pages, but release + pairs of pages, which should do just as well given that allocations + are likely to be small. */ +#define DEFAULT_TRIM_THRESHOLD ((size_t)malloc_getpagesize) +#endif + +#include +#include +#include +#include +#ifndef _MSC_VER +#include +#endif +#include +#include +#if !defined(X86_WIN32) && !defined(X86_WIN64) +#ifdef HAVE_MNTENT +#include +#endif /* HAVE_MNTENT */ +#include +#include + +/* We don't want sys/mman.h to be included after we redefine mmap and + dlmunmap. */ +#include +#define LACKS_SYS_MMAN_H 1 + +#if FFI_MMAP_EXEC_SELINUX +#include +#include + +static int selinux_enabled = -1; + +static int +selinux_enabled_check (void) +{ + struct statfs sfs; + FILE *f; + char *buf = NULL; + size_t len = 0; + + if (statfs ("/selinux", &sfs) >= 0 + && (unsigned int) sfs.f_type == 0xf97cff8cU) + return 1; + f = fopen ("/proc/mounts", "r"); + if (f == NULL) + return 0; + while (getline (&buf, &len, f) >= 0) + { + char *p = strchr (buf, ' '); + if (p == NULL) + break; + p = strchr (p + 1, ' '); + if (p == NULL) + break; + if (strncmp (p + 1, "selinuxfs ", 10) == 0) + { + free (buf); + fclose (f); + return 1; + } + } + free (buf); + fclose (f); + return 0; +} + +#define is_selinux_enabled() (selinux_enabled >= 0 ? selinux_enabled \ + : (selinux_enabled = selinux_enabled_check ())) + +#else + +#define is_selinux_enabled() 0 + +#endif /* !FFI_MMAP_EXEC_SELINUX */ + +#elif defined (__CYGWIN__) || defined(__INTERIX) + +#include + +/* Cygwin is Linux-like, but not quite that Linux-like. */ +#define is_selinux_enabled() 0 + +#endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */ + +/* Declare all functions defined in dlmalloc.c as static. */ +static void *dlmalloc(size_t); +static void dlfree(void*); +static void *dlcalloc(size_t, size_t) MAYBE_UNUSED; +static void *dlrealloc(void *, size_t) MAYBE_UNUSED; +static void *dlmemalign(size_t, size_t) MAYBE_UNUSED; +static void *dlvalloc(size_t) MAYBE_UNUSED; +static int dlmallopt(int, int) MAYBE_UNUSED; +static size_t dlmalloc_footprint(void) MAYBE_UNUSED; +static size_t dlmalloc_max_footprint(void) MAYBE_UNUSED; +static void** dlindependent_calloc(size_t, size_t, void**) MAYBE_UNUSED; +static void** dlindependent_comalloc(size_t, size_t*, void**) MAYBE_UNUSED; +static void *dlpvalloc(size_t) MAYBE_UNUSED; +static int dlmalloc_trim(size_t) MAYBE_UNUSED; +static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED; +static void dlmalloc_stats(void) MAYBE_UNUSED; + +#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) +/* Use these for mmap and munmap within dlmalloc.c. */ +static void *dlmmap(void *, size_t, int, int, int, off_t); +static int dlmunmap(void *, size_t); +#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ + +#define mmap dlmmap +#define munmap dlmunmap + +#include "dlmalloc.c" + +#undef mmap +#undef munmap + +#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) + +/* A mutex used to synchronize access to *exec* variables in this file. */ +static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER; + +/* A file descriptor of a temporary file from which we'll map + executable pages. */ +static int execfd = -1; + +/* The amount of space already allocated from the temporary file. */ +static size_t execsize = 0; + +/* Open a temporary file name, and immediately unlink it. */ +static int +open_temp_exec_file_name (char *name) +{ + int fd = mkstemp (name); + + if (fd != -1) + unlink (name); + + return fd; +} + +/* Open a temporary file in the named directory. */ +static int +open_temp_exec_file_dir (const char *dir) +{ + static const char suffix[] = "/ffiXXXXXX"; + int lendir = strlen (dir); + char *tempname = __builtin_alloca (lendir + sizeof (suffix)); + + if (!tempname) + return -1; + + memcpy (tempname, dir, lendir); + memcpy (tempname + lendir, suffix, sizeof (suffix)); + + return open_temp_exec_file_name (tempname); +} + +/* Open a temporary file in the directory in the named environment + variable. */ +static int +open_temp_exec_file_env (const char *envvar) +{ + const char *value = getenv (envvar); + + if (!value) + return -1; + + return open_temp_exec_file_dir (value); +} + +#ifdef HAVE_MNTENT +/* Open a temporary file in an executable and writable mount point + listed in the mounts file. Subsequent calls with the same mounts + keep searching for mount points in the same file. Providing NULL + as the mounts file closes the file. */ +static int +open_temp_exec_file_mnt (const char *mounts) +{ + static const char *last_mounts; + static FILE *last_mntent; + + if (mounts != last_mounts) + { + if (last_mntent) + endmntent (last_mntent); + + last_mounts = mounts; + + if (mounts) + last_mntent = setmntent (mounts, "r"); + else + last_mntent = NULL; + } + + if (!last_mntent) + return -1; + + for (;;) + { + int fd; + struct mntent mnt; + char buf[MAXPATHLEN * 3]; + + if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)) == NULL) + return -1; + + if (hasmntopt (&mnt, "ro") + || hasmntopt (&mnt, "noexec") + || access (mnt.mnt_dir, W_OK)) + continue; + + fd = open_temp_exec_file_dir (mnt.mnt_dir); + + if (fd != -1) + return fd; + } +} +#endif /* HAVE_MNTENT */ + +/* Instructions to look for a location to hold a temporary file that + can be mapped in for execution. */ +static struct +{ + int (*func)(const char *); + const char *arg; + int repeat; +} open_temp_exec_file_opts[] = { + { open_temp_exec_file_env, "TMPDIR", 0 }, + { open_temp_exec_file_dir, "/tmp", 0 }, + { open_temp_exec_file_dir, "/var/tmp", 0 }, + { open_temp_exec_file_dir, "/dev/shm", 0 }, + { open_temp_exec_file_env, "HOME", 0 }, +#ifdef HAVE_MNTENT + { open_temp_exec_file_mnt, "/etc/mtab", 1 }, + { open_temp_exec_file_mnt, "/proc/mounts", 1 }, +#endif /* HAVE_MNTENT */ +}; + +/* Current index into open_temp_exec_file_opts. */ +static int open_temp_exec_file_opts_idx = 0; + +/* Reset a current multi-call func, then advances to the next entry. + If we're at the last, go back to the first and return nonzero, + otherwise return zero. */ +static int +open_temp_exec_file_opts_next (void) +{ + if (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) + open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func (NULL); + + open_temp_exec_file_opts_idx++; + if (open_temp_exec_file_opts_idx + == (sizeof (open_temp_exec_file_opts) + / sizeof (*open_temp_exec_file_opts))) + { + open_temp_exec_file_opts_idx = 0; + return 1; + } + + return 0; +} + +/* Return a file descriptor of a temporary zero-sized file in a + writable and exexutable filesystem. */ +static int +open_temp_exec_file (void) +{ + int fd; + + do + { + fd = open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func + (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].arg); + + if (!open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat + || fd == -1) + { + if (open_temp_exec_file_opts_next ()) + break; + } + } + while (fd == -1); + + return fd; +} + +/* Map in a chunk of memory from the temporary exec file into separate + locations in the virtual memory address space, one writable and one + executable. Returns the address of the writable portion, after + storing an offset to the corresponding executable portion at the + last word of the requested chunk. */ +static void * +dlmmap_locked (void *start, size_t length, int prot, int flags, off_t offset) +{ + void *ptr; + + if (execfd == -1) + { + open_temp_exec_file_opts_idx = 0; + retry_open: + execfd = open_temp_exec_file (); + if (execfd == -1) + return MFAIL; + } + + offset = execsize; + + if (ftruncate (execfd, offset + length)) + return MFAIL; + + flags &= ~(MAP_PRIVATE | MAP_ANONYMOUS); + flags |= MAP_SHARED; + + ptr = mmap (NULL, length, (prot & ~PROT_WRITE) | PROT_EXEC, + flags, execfd, offset); + if (ptr == MFAIL) + { + if (!offset) + { + close (execfd); + goto retry_open; + } + ftruncate (execfd, offset); + return MFAIL; + } + else if (!offset + && open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) + open_temp_exec_file_opts_next (); + + start = mmap (start, length, prot, flags, execfd, offset); + + if (start == MFAIL) + { + munmap (ptr, length); + ftruncate (execfd, offset); + return start; + } + + mmap_exec_offset ((char *)start, length) = (char*)ptr - (char*)start; + + execsize += length; + + return start; +} + +/* Map in a writable and executable chunk of memory if possible. + Failing that, fall back to dlmmap_locked. */ +static void * +dlmmap (void *start, size_t length, int prot, + int flags, int fd, off_t offset) +{ + void *ptr; + + assert (start == NULL && length % malloc_getpagesize == 0 + && prot == (PROT_READ | PROT_WRITE) + && flags == (MAP_PRIVATE | MAP_ANONYMOUS) + && fd == -1 && offset == 0); + +#if FFI_CLOSURE_TEST + printf ("mapping in %zi\n", length); +#endif + + if (execfd == -1 && !is_selinux_enabled ()) + { + ptr = mmap (start, length, prot | PROT_EXEC, flags, fd, offset); + + if (ptr != MFAIL || (errno != EPERM && errno != EACCES)) + /* Cool, no need to mess with separate segments. */ + return ptr; + + /* If MREMAP_DUP is ever introduced and implemented, try mmap + with ((prot & ~PROT_WRITE) | PROT_EXEC) and mremap with + MREMAP_DUP and prot at this point. */ + } + + if (execsize == 0 || execfd == -1) + { + pthread_mutex_lock (&open_temp_exec_file_mutex); + ptr = dlmmap_locked (start, length, prot, flags, offset); + pthread_mutex_unlock (&open_temp_exec_file_mutex); + + return ptr; + } + + return dlmmap_locked (start, length, prot, flags, offset); +} + +/* Release memory at the given address, as well as the corresponding + executable page if it's separate. */ +static int +dlmunmap (void *start, size_t length) +{ + /* We don't bother decreasing execsize or truncating the file, since + we can't quite tell whether we're unmapping the end of the file. + We don't expect frequent deallocation anyway. If we did, we + could locate pages in the file by writing to the pages being + deallocated and checking that the file contents change. + Yuck. */ + msegmentptr seg = segment_holding (gm, start); + void *code; + +#if FFI_CLOSURE_TEST + printf ("unmapping %zi\n", length); +#endif + + if (seg && (code = add_segment_exec_offset (start, seg)) != start) + { + int ret = munmap (code, length); + if (ret) + return ret; + } + + return munmap (start, length); +} + +#if FFI_CLOSURE_FREE_CODE +/* Return segment holding given code address. */ +static msegmentptr +segment_holding_code (mstate m, char* addr) +{ + msegmentptr sp = &m->seg; + for (;;) { + if (addr >= add_segment_exec_offset (sp->base, sp) + && addr < add_segment_exec_offset (sp->base, sp) + sp->size) + return sp; + if ((sp = sp->next) == 0) + return 0; + } +} +#endif + +#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ + +/* Allocate a chunk of memory with the given size. Returns a pointer + to the writable address, and sets *CODE to the executable + corresponding virtual address. */ +void * +ffi_closure_alloc (size_t size, void **code) +{ + void *ptr; + + if (!code) + return NULL; + + ptr = dlmalloc (size); + + if (ptr) + { + msegmentptr seg = segment_holding (gm, ptr); + + *code = add_segment_exec_offset (ptr, seg); + } + + return ptr; +} + +/* Release a chunk of memory allocated with ffi_closure_alloc. If + FFI_CLOSURE_FREE_CODE is nonzero, the given address can be the + writable or the executable address given. Otherwise, only the + writable address can be provided here. */ +void +ffi_closure_free (void *ptr) +{ +#if FFI_CLOSURE_FREE_CODE + msegmentptr seg = segment_holding_code (gm, ptr); + + if (seg) + ptr = sub_segment_exec_offset (ptr, seg); +#endif + + dlfree (ptr); +} + + +#if FFI_CLOSURE_TEST +/* Do some internal sanity testing to make sure allocation and + deallocation of pages are working as intended. */ +int main () +{ + void *p[3]; +#define GET(idx, len) do { p[idx] = dlmalloc (len); printf ("allocated %zi for p[%i]\n", (len), (idx)); } while (0) +#define PUT(idx) do { printf ("freeing p[%i]\n", (idx)); dlfree (p[idx]); } while (0) + GET (0, malloc_getpagesize / 2); + GET (1, 2 * malloc_getpagesize - 64 * sizeof (void*)); + PUT (1); + GET (1, 2 * malloc_getpagesize); + GET (2, malloc_getpagesize / 2); + PUT (1); + PUT (0); + PUT (2); + return 0; +} +#endif /* FFI_CLOSURE_TEST */ +# else /* ! FFI_MMAP_EXEC_WRIT */ + +/* On many systems, memory returned by malloc is writable and + executable, so just use it. */ + +#include + +void * +ffi_closure_alloc (size_t size, void **code) +{ + if (!code) + return NULL; + + return *code = malloc (size); +} + +void +ffi_closure_free (void *ptr) +{ + free (ptr); +} + +# endif /* ! FFI_MMAP_EXEC_WRIT */ +#endif /* FFI_CLOSURES */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffi.c new file mode 100644 index 0000000..f25d7b4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffi.c @@ -0,0 +1,383 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998 Cygnus Solutions + Copyright (c) 2004 Simon Posnjak + Copyright (c) 2005 Axis Communications AB + Copyright (C) 2007 Free Software Foundation, Inc. + + CRIS Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) + +static ffi_status +initialize_aggregate_packed_struct (ffi_type * arg) +{ + ffi_type **ptr; + + FFI_ASSERT (arg != NULL); + + FFI_ASSERT (arg->elements != NULL); + FFI_ASSERT (arg->size == 0); + FFI_ASSERT (arg->alignment == 0); + + ptr = &(arg->elements[0]); + + while ((*ptr) != NULL) + { + if (((*ptr)->size == 0) + && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + FFI_ASSERT (ffi_type_test ((*ptr))); + + arg->size += (*ptr)->size; + + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; + + ptr++; + } + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + else + return FFI_OK; +} + +int +ffi_prep_args (char *stack, extended_cif * ecif) +{ + unsigned int i; + unsigned int struct_count = 0; + void **p_argv; + char *argp; + ffi_type **p_arg; + + argp = stack; + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); i--, p_arg++) + { + size_t z; + + switch ((*p_arg)->type) + { + case FFI_TYPE_STRUCT: + { + z = (*p_arg)->size; + if (z <= 4) + { + memcpy (argp, *p_argv, z); + z = 4; + } + else if (z <= 8) + { + memcpy (argp, *p_argv, z); + z = 8; + } + else + { + unsigned int uiLocOnStack; + z = sizeof (void *); + uiLocOnStack = 4 * ecif->cif->nargs + struct_count; + struct_count = struct_count + (*p_arg)->size; + *(unsigned int *) argp = + (unsigned int) (UINT32 *) (stack + uiLocOnStack); + memcpy ((stack + uiLocOnStack), *p_argv, (*p_arg)->size); + } + break; + } + default: + z = (*p_arg)->size; + if (z < sizeof (int)) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = + (unsigned int) *(UINT8 *) (*p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = + (unsigned int) *(UINT16 *) (*p_argv); + break; + + default: + FFI_ASSERT (0); + } + z = sizeof (int); + } + else if (z == sizeof (int)) + *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv); + else + memcpy (argp, *p_argv, z); + break; + } + p_argv++; + argp += z; + } + + return (struct_count); +} + +ffi_status +ffi_prep_cif (ffi_cif * cif, + ffi_abi abi, unsigned int nargs, + ffi_type * rtype, ffi_type ** atypes) +{ + unsigned bytes = 0; + unsigned int i; + ffi_type **ptr; + + FFI_ASSERT (cif != NULL); + FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI); + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = nargs; + cif->rtype = rtype; + + cif->flags = 0; + + if ((cif->rtype->size == 0) + && (initialize_aggregate_packed_struct (cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + FFI_ASSERT_VALID_TYPE (cif->rtype); + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + if (((*ptr)->size == 0) + && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + FFI_ASSERT_VALID_TYPE (*ptr); + + if (((*ptr)->alignment - 1) & bytes) + bytes = ALIGN (bytes, (*ptr)->alignment); + if ((*ptr)->type == FFI_TYPE_STRUCT) + { + if ((*ptr)->size > 8) + { + bytes += (*ptr)->size; + bytes += sizeof (void *); + } + else + { + if ((*ptr)->size > 4) + bytes += 8; + else + bytes += 4; + } + } + else + bytes += STACK_ARG_SIZE ((*ptr)->size); + } + + cif->bytes = bytes; + + return ffi_prep_cif_machdep (cif); +} + +ffi_status +ffi_prep_cif_machdep (ffi_cif * cif) +{ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + case FFI_TYPE_STRUCT: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = (unsigned) cif->rtype->type; + break; + + default: + cif->flags = FFI_TYPE_INT; + break; + } + + return FFI_OK; +} + +extern void ffi_call_SYSV (int (*)(char *, extended_cif *), + extended_cif *, + unsigned, unsigned, unsigned *, void (*fn) ()) + __attribute__ ((__visibility__ ("hidden"))); + +void +ffi_call (ffi_cif * cif, void (*fn) (), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca (cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV (ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; + default: + FFI_ASSERT (0); + break; + } +} + +/* Because the following variables are not exported outside libffi, we + mark them hidden. */ + +/* Assembly code for the jump stub. */ +extern const char ffi_cris_trampoline_template[] + __attribute__ ((__visibility__ ("hidden"))); + +/* Offset into ffi_cris_trampoline_template of where to put the + ffi_prep_closure_inner function. */ +extern const int ffi_cris_trampoline_fn_offset + __attribute__ ((__visibility__ ("hidden"))); + +/* Offset into ffi_cris_trampoline_template of where to put the + closure data. */ +extern const int ffi_cris_trampoline_closure_offset + __attribute__ ((__visibility__ ("hidden"))); + +/* This function is sibling-called (jumped to) by the closure + trampoline. We get R10..R13 at PARAMS[0..3] and a copy of [SP] at + PARAMS[4] to simplify handling of a straddling parameter. A copy + of R9 is at PARAMS[5] and SP at PARAMS[6]. These parameters are + put at the appropriate place in CLOSURE which is then executed and + the return value is passed back to the caller. */ + +static unsigned long long +ffi_prep_closure_inner (void **params, ffi_closure* closure) +{ + char *register_args = (char *) params; + void *struct_ret = params[5]; + char *stack_args = params[6]; + char *ptr = register_args; + ffi_cif *cif = closure->cif; + ffi_type **arg_types = cif->arg_types; + + /* Max room needed is number of arguments as 64-bit values. */ + void **avalue = alloca (closure->cif->nargs * sizeof(void *)); + int i; + int doing_regs; + long long llret = 0; + + /* Find the address of each argument. */ + for (i = 0, doing_regs = 1; i < cif->nargs; i++) + { + /* Types up to and including 8 bytes go by-value. */ + if (arg_types[i]->size <= 4) + { + avalue[i] = ptr; + ptr += 4; + } + else if (arg_types[i]->size <= 8) + { + avalue[i] = ptr; + ptr += 8; + } + else + { + FFI_ASSERT (arg_types[i]->type == FFI_TYPE_STRUCT); + + /* Passed by-reference, so copy the pointer. */ + avalue[i] = *(void **) ptr; + ptr += 4; + } + + /* If we've handled more arguments than fit in registers, start + looking at the those passed on the stack. Step over the + first one if we had a straddling parameter. */ + if (doing_regs && ptr >= register_args + 4*4) + { + ptr = stack_args + ((ptr > register_args + 4*4) ? 4 : 0); + doing_regs = 0; + } + } + + /* Invoke the closure. */ + (closure->fun) (cif, + + cif->rtype->type == FFI_TYPE_STRUCT + /* The caller allocated space for the return + structure, and passed a pointer to this space in + R9. */ + ? struct_ret + + /* We take advantage of being able to ignore that + the high part isn't set if the return value is + not in R10:R11, but in R10 only. */ + : (void *) &llret, + + avalue, closure->user_data); + + return llret; +} + +/* API function: Prepare the trampoline. */ + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif *, void *, void **, void*), + void *user_data, + void *codeloc) +{ + void *innerfn = ffi_prep_closure_inner; + FFI_ASSERT (cif->abi == FFI_SYSV); + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + memcpy (closure->tramp, ffi_cris_trampoline_template, + FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE); + memcpy (closure->tramp + ffi_cris_trampoline_fn_offset, + &innerfn, sizeof (void *)); + memcpy (closure->tramp + ffi_cris_trampoline_closure_offset, + &codeloc, sizeof (void *)); + + return FFI_OK; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffitarget.h new file mode 100644 index 0000000..0e3705d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffitarget.h @@ -0,0 +1,51 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for CRIS. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE 36 +#define FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE (7*4) +#define FFI_TRAMPOLINE_SIZE \ + (FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE + FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE) +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/sysv.S new file mode 100644 index 0000000..79abaee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/sysv.S @@ -0,0 +1,215 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2004 Simon Posnjak + Copyright (c) 2005 Axis Communications AB + + CRIS Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#define CONCAT(x,y) x ## y +#define XCONCAT(x,y) CONCAT (x, y) +#define L(x) XCONCAT (__USER_LABEL_PREFIX__, x) + + .text + + ;; OK, when we get called we should have this (according to + ;; AXIS ETRAX 100LX Programmer's Manual chapter 6.3). + ;; + ;; R10: ffi_prep_args (func. pointer) + ;; R11: &ecif + ;; R12: cif->bytes + ;; R13: fig->flags + ;; sp+0: ecif.rvalue + ;; sp+4: fn (function pointer to the function that we need to call) + + .globl L(ffi_call_SYSV) + .type L(ffi_call_SYSV),@function + .hidden L(ffi_call_SYSV) + +L(ffi_call_SYSV): + ;; Save the regs to the stack. + push $srp + ;; Used for stack pointer saving. + push $r6 + ;; Used for function address pointer. + push $r7 + ;; Used for stack pointer saving. + push $r8 + ;; We save fig->flags to stack we will need them after we + ;; call The Function. + push $r13 + + ;; Saving current stack pointer. + move.d $sp,$r8 + move.d $sp,$r6 + + ;; Move address of ffi_prep_args to r13. + move.d $r10,$r13 + + ;; Make room on the stack for the args of fn. + sub.d $r12,$sp + + ;; Function void ffi_prep_args(char *stack, extended_cif *ecif) parameters are: + ;; r10 <-- stack pointer + ;; r11 <-- &ecif (already there) + move.d $sp,$r10 + + ;; Call the function. + jsr $r13 + + ;; Save the size of the structures which are passed on stack. + move.d $r10,$r7 + + ;; Move first four args in to r10..r13. + move.d [$sp+0],$r10 + move.d [$sp+4],$r11 + move.d [$sp+8],$r12 + move.d [$sp+12],$r13 + + ;; Adjust the stack and check if any parameters are given on stack. + addq 16,$sp + sub.d $r7,$r6 + cmp.d $sp,$r6 + + bpl go_on + nop + +go_on_no_params_on_stack: + move.d $r6,$sp + +go_on: + ;; Discover if we need to put rval address in to r9. + move.d [$r8+0],$r7 + cmpq FFI_TYPE_STRUCT,$r7 + bne call_now + nop + + ;; Move rval address to $r9. + move.d [$r8+20],$r9 + +call_now: + ;; Move address of The Function in to r7. + move.d [$r8+24],$r7 + + ;; Call The Function. + jsr $r7 + + ;; Reset stack. + move.d $r8,$sp + + ;; Load rval type (fig->flags) in to r13. + pop $r13 + + ;; Detect rval type. + cmpq FFI_TYPE_VOID,$r13 + beq epilogue + + cmpq FFI_TYPE_STRUCT,$r13 + beq epilogue + + cmpq FFI_TYPE_DOUBLE,$r13 + beq return_double_or_longlong + + cmpq FFI_TYPE_UINT64,$r13 + beq return_double_or_longlong + + cmpq FFI_TYPE_SINT64,$r13 + beq return_double_or_longlong + nop + + ;; Just return the 32 bit value. + ba return + nop + +return_double_or_longlong: + ;; Load half of the rval to r10 and the other half to r11. + move.d [$sp+16],$r13 + move.d $r10,[$r13] + addq 4,$r13 + move.d $r11,[$r13] + ba epilogue + nop + +return: + ;; Load the rval to r10. + move.d [$sp+16],$r13 + move.d $r10,[$r13] + +epilogue: + pop $r8 + pop $r7 + pop $r6 + Jump [$sp+] + + .size ffi_call_SYSV,.-ffi_call_SYSV + +/* Save R10..R13 into an array, somewhat like varargs. Copy the next + argument too, to simplify handling of any straddling parameter. + Save R9 and SP after those. Jump to function handling the rest. + Since this is a template, copied and the main function filled in by + the user. */ + + .globl L(ffi_cris_trampoline_template) + .type L(ffi_cris_trampoline_template),@function + .hidden L(ffi_cris_trampoline_template) + +L(ffi_cris_trampoline_template): +0: + /* The value we get for "PC" is right after the prefix instruction, + two bytes from the beginning, i.e. 0b+2. */ + move.d $r10,[$pc+2f-(0b+2)] + move.d $pc,$r10 +1: + addq 2f-1b+4,$r10 + move.d $r11,[$r10+] + move.d $r12,[$r10+] + move.d $r13,[$r10+] + move.d [$sp],$r11 + move.d $r11,[$r10+] + move.d $r9,[$r10+] + move.d $sp,[$r10+] + subq FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE,$r10 + move.d 0,$r11 +3: + jump 0 +2: + .size ffi_cris_trampoline_template,.-0b + +/* This macro create a constant usable as "extern const int \name" in + C from within libffi, when \name has no prefix decoration. */ + + .macro const name,value + .globl \name + .type \name,@object + .hidden \name +\name: + .dword \value + .size \name,4 + .endm + +/* Constants for offsets within the trampoline. We could do this with + just symbols, avoiding memory contents and memory accesses, but the + C usage code would look a bit stranger. */ + + const L(ffi_cris_trampoline_fn_offset),2b-4-0b + const L(ffi_cris_trampoline_closure_offset),3b-4-0b diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/debug.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/debug.c new file mode 100644 index 0000000..51dcfcf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/debug.c @@ -0,0 +1,59 @@ +/* ----------------------------------------------------------------------- + debug.c - Copyright (c) 1996 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include +#include +#include + +/* General debugging routines */ + +void ffi_stop_here(void) +{ + /* This function is only useful for debugging purposes. + Place a breakpoint on ffi_stop_here to be notified of + significant events. */ +} + +/* This function should only be called via the FFI_ASSERT() macro */ + +void ffi_assert(char *expr, char *file, int line) +{ + fprintf(stderr, "ASSERTION FAILURE: %s at %s:%d\n", expr, file, line); + ffi_stop_here(); + abort(); +} + +/* Perform a sanity check on an ffi_type structure */ + +void ffi_type_test(ffi_type *a, char *file, int line) +{ + FFI_ASSERT_AT(a != NULL, file, line); + + FFI_ASSERT_AT(a->type <= FFI_TYPE_LAST, file, line); + FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->size > 0, file, line); + FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->alignment > 0, file, line); + FFI_ASSERT_AT(a->type != FFI_TYPE_STRUCT || a->elements != NULL, file, line); + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/dlmalloc.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/dlmalloc.c new file mode 100644 index 0000000..5c9f9c2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/dlmalloc.c @@ -0,0 +1,5161 @@ +/* + This is a version (aka dlmalloc) of malloc/free/realloc written by + Doug Lea and released to the public domain, as explained at + http://creativecommons.org/licenses/publicdomain. Send questions, + comments, complaints, performance data, etc to dl@cs.oswego.edu + +* Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) + + Note: There may be an updated version of this malloc obtainable at + ftp://gee.cs.oswego.edu/pub/misc/malloc.c + Check before installing! + +* Quickstart + + This library is all in one file to simplify the most common usage: + ftp it, compile it (-O3), and link it into another program. All of + the compile-time options default to reasonable values for use on + most platforms. You might later want to step through various + compile-time and dynamic tuning options. + + For convenience, an include file for code using this malloc is at: + ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h + You don't really need this .h file unless you call functions not + defined in your system include files. The .h file contains only the + excerpts from this file needed for using this malloc on ANSI C/C++ + systems, so long as you haven't changed compile-time options about + naming and tuning parameters. If you do, then you can create your + own malloc.h that does include all settings by cutting at the point + indicated below. Note that you may already by default be using a C + library containing a malloc that is based on some version of this + malloc (for example in linux). You might still want to use the one + in this file to customize settings or to avoid overheads associated + with library versions. + +* Vital statistics: + + Supported pointer/size_t representation: 4 or 8 bytes + size_t MUST be an unsigned type of the same width as + pointers. (If you are using an ancient system that declares + size_t as a signed type, or need it to be a different width + than pointers, you can use a previous release of this malloc + (e.g. 2.7.2) supporting these.) + + Alignment: 8 bytes (default) + This suffices for nearly all current machines and C compilers. + However, you can define MALLOC_ALIGNMENT to be wider than this + if necessary (up to 128bytes), at the expense of using more space. + + Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) + 8 or 16 bytes (if 8byte sizes) + Each malloced chunk has a hidden word of overhead holding size + and status information, and additional cross-check word + if FOOTERS is defined. + + Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) + 8-byte ptrs: 32 bytes (including overhead) + + Even a request for zero bytes (i.e., malloc(0)) returns a + pointer to something of the minimum allocatable size. + The maximum overhead wastage (i.e., number of extra bytes + allocated than were requested in malloc) is less than or equal + to the minimum size, except for requests >= mmap_threshold that + are serviced via mmap(), where the worst case wastage is about + 32 bytes plus the remainder from a system page (the minimal + mmap unit); typically 4096 or 8192 bytes. + + Security: static-safe; optionally more or less + The "security" of malloc refers to the ability of malicious + code to accentuate the effects of errors (for example, freeing + space that is not currently malloc'ed or overwriting past the + ends of chunks) in code that calls malloc. This malloc + guarantees not to modify any memory locations below the base of + heap, i.e., static variables, even in the presence of usage + errors. The routines additionally detect most improper frees + and reallocs. All this holds as long as the static bookkeeping + for malloc itself is not corrupted by some other means. This + is only one aspect of security -- these checks do not, and + cannot, detect all possible programming errors. + + If FOOTERS is defined nonzero, then each allocated chunk + carries an additional check word to verify that it was malloced + from its space. These check words are the same within each + execution of a program using malloc, but differ across + executions, so externally crafted fake chunks cannot be + freed. This improves security by rejecting frees/reallocs that + could corrupt heap memory, in addition to the checks preventing + writes to statics that are always on. This may further improve + security at the expense of time and space overhead. (Note that + FOOTERS may also be worth using with MSPACES.) + + By default detected errors cause the program to abort (calling + "abort()"). You can override this to instead proceed past + errors by defining PROCEED_ON_ERROR. In this case, a bad free + has no effect, and a malloc that encounters a bad address + caused by user overwrites will ignore the bad address by + dropping pointers and indices to all known memory. This may + be appropriate for programs that should continue if at all + possible in the face of programming errors, although they may + run out of memory because dropped memory is never reclaimed. + + If you don't like either of these options, you can define + CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything + else. And if if you are sure that your program using malloc has + no errors or vulnerabilities, you can define INSECURE to 1, + which might (or might not) provide a small performance improvement. + + Thread-safety: NOT thread-safe unless USE_LOCKS defined + When USE_LOCKS is defined, each public call to malloc, free, + etc is surrounded with either a pthread mutex or a win32 + spinlock (depending on WIN32). This is not especially fast, and + can be a major bottleneck. It is designed only to provide + minimal protection in concurrent environments, and to provide a + basis for extensions. If you are using malloc in a concurrent + program, consider instead using ptmalloc, which is derived from + a version of this malloc. (See http://www.malloc.de). + + System requirements: Any combination of MORECORE and/or MMAP/MUNMAP + This malloc can use unix sbrk or any emulation (invoked using + the CALL_MORECORE macro) and/or mmap/munmap or any emulation + (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system + memory. On most unix systems, it tends to work best if both + MORECORE and MMAP are enabled. On Win32, it uses emulations + based on VirtualAlloc. It also uses common C library functions + like memset. + + Compliance: I believe it is compliant with the Single Unix Specification + (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably + others as well. + +* Overview of algorithms + + This is not the fastest, most space-conserving, most portable, or + most tunable malloc ever written. However it is among the fastest + while also being among the most space-conserving, portable and + tunable. Consistent balance across these factors results in a good + general-purpose allocator for malloc-intensive programs. + + In most ways, this malloc is a best-fit allocator. Generally, it + chooses the best-fitting existing chunk for a request, with ties + broken in approximately least-recently-used order. (This strategy + normally maintains low fragmentation.) However, for requests less + than 256bytes, it deviates from best-fit when there is not an + exactly fitting available chunk by preferring to use space adjacent + to that used for the previous small request, as well as by breaking + ties in approximately most-recently-used order. (These enhance + locality of series of small allocations.) And for very large requests + (>= 256Kb by default), it relies on system memory mapping + facilities, if supported. (This helps avoid carrying around and + possibly fragmenting memory used only for large chunks.) + + All operations (except malloc_stats and mallinfo) have execution + times that are bounded by a constant factor of the number of bits in + a size_t, not counting any clearing in calloc or copying in realloc, + or actions surrounding MORECORE and MMAP that have times + proportional to the number of non-contiguous regions returned by + system allocation routines, which is often just 1. + + The implementation is not very modular and seriously overuses + macros. Perhaps someday all C compilers will do as good a job + inlining modular code as can now be done by brute-force expansion, + but now, enough of them seem not to. + + Some compilers issue a lot of warnings about code that is + dead/unreachable only on some platforms, and also about intentional + uses of negation on unsigned types. All known cases of each can be + ignored. + + For a longer but out of date high-level description, see + http://gee.cs.oswego.edu/dl/html/malloc.html + +* MSPACES + If MSPACES is defined, then in addition to malloc, free, etc., + this file also defines mspace_malloc, mspace_free, etc. These + are versions of malloc routines that take an "mspace" argument + obtained using create_mspace, to control all internal bookkeeping. + If ONLY_MSPACES is defined, only these versions are compiled. + So if you would like to use this allocator for only some allocations, + and your system malloc for others, you can compile with + ONLY_MSPACES and then do something like... + static mspace mymspace = create_mspace(0,0); // for example + #define mymalloc(bytes) mspace_malloc(mymspace, bytes) + + (Note: If you only need one instance of an mspace, you can instead + use "USE_DL_PREFIX" to relabel the global malloc.) + + You can similarly create thread-local allocators by storing + mspaces as thread-locals. For example: + static __thread mspace tlms = 0; + void* tlmalloc(size_t bytes) { + if (tlms == 0) tlms = create_mspace(0, 0); + return mspace_malloc(tlms, bytes); + } + void tlfree(void* mem) { mspace_free(tlms, mem); } + + Unless FOOTERS is defined, each mspace is completely independent. + You cannot allocate from one and free to another (although + conformance is only weakly checked, so usage errors are not always + caught). If FOOTERS is defined, then each chunk carries around a tag + indicating its originating mspace, and frees are directed to their + originating spaces. + + ------------------------- Compile-time options --------------------------- + +Be careful in setting #define values for numerical constants of type +size_t. On some systems, literal values are not automatically extended +to size_t precision unless they are explicitly casted. + +WIN32 default: defined if _WIN32 defined + Defining WIN32 sets up defaults for MS environment and compilers. + Otherwise defaults are for unix. + +MALLOC_ALIGNMENT default: (size_t)8 + Controls the minimum alignment for malloc'ed chunks. It must be a + power of two and at least 8, even on machines for which smaller + alignments would suffice. It may be defined as larger than this + though. Note however that code and data structures are optimized for + the case of 8-byte alignment. + +MSPACES default: 0 (false) + If true, compile in support for independent allocation spaces. + This is only supported if HAVE_MMAP is true. + +ONLY_MSPACES default: 0 (false) + If true, only compile in mspace versions, not regular versions. + +USE_LOCKS default: 0 (false) + Causes each call to each public routine to be surrounded with + pthread or WIN32 mutex lock/unlock. (If set true, this can be + overridden on a per-mspace basis for mspace versions.) + +FOOTERS default: 0 + If true, provide extra checking and dispatching by placing + information in the footers of allocated chunks. This adds + space and time overhead. + +INSECURE default: 0 + If true, omit checks for usage errors and heap space overwrites. + +USE_DL_PREFIX default: NOT defined + Causes compiler to prefix all public routines with the string 'dl'. + This can be useful when you only want to use this malloc in one part + of a program, using your regular system malloc elsewhere. + +ABORT default: defined as abort() + Defines how to abort on failed checks. On most systems, a failed + check cannot die with an "assert" or even print an informative + message, because the underlying print routines in turn call malloc, + which will fail again. Generally, the best policy is to simply call + abort(). It's not very useful to do more than this because many + errors due to overwriting will show up as address faults (null, odd + addresses etc) rather than malloc-triggered checks, so will also + abort. Also, most compilers know that abort() does not return, so + can better optimize code conditionally calling it. + +PROCEED_ON_ERROR default: defined as 0 (false) + Controls whether detected bad addresses cause them to bypassed + rather than aborting. If set, detected bad arguments to free and + realloc are ignored. And all bookkeeping information is zeroed out + upon a detected overwrite of freed heap space, thus losing the + ability to ever return it from malloc again, but enabling the + application to proceed. If PROCEED_ON_ERROR is defined, the + static variable malloc_corruption_error_count is compiled in + and can be examined to see if errors have occurred. This option + generates slower code than the default abort policy. + +DEBUG default: NOT defined + The DEBUG setting is mainly intended for people trying to modify + this code or diagnose problems when porting to new platforms. + However, it may also be able to better isolate user errors than just + using runtime checks. The assertions in the check routines spell + out in more detail the assumptions and invariants underlying the + algorithms. The checking is fairly extensive, and will slow down + execution noticeably. Calling malloc_stats or mallinfo with DEBUG + set will attempt to check every non-mmapped allocated and free chunk + in the course of computing the summaries. + +ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) + Debugging assertion failures can be nearly impossible if your + version of the assert macro causes malloc to be called, which will + lead to a cascade of further failures, blowing the runtime stack. + ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), + which will usually make debugging easier. + +MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 + The action to take before "return 0" when malloc fails to be able to + return memory because there is none available. + +HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES + True if this system supports sbrk or an emulation of it. + +MORECORE default: sbrk + The name of the sbrk-style system routine to call to obtain more + memory. See below for guidance on writing custom MORECORE + functions. The type of the argument to sbrk/MORECORE varies across + systems. It cannot be size_t, because it supports negative + arguments, so it is normally the signed type of the same width as + size_t (sometimes declared as "intptr_t"). It doesn't much matter + though. Internally, we only call it with arguments less than half + the max value of a size_t, which should work across all reasonable + possibilities, although sometimes generating compiler warnings. See + near the end of this file for guidelines for creating a custom + version of MORECORE. + +MORECORE_CONTIGUOUS default: 1 (true) + If true, take advantage of fact that consecutive calls to MORECORE + with positive arguments always return contiguous increasing + addresses. This is true of unix sbrk. It does not hurt too much to + set it true anyway, since malloc copes with non-contiguities. + Setting it false when definitely non-contiguous saves time + and possibly wasted space it would take to discover this though. + +MORECORE_CANNOT_TRIM default: NOT defined + True if MORECORE cannot release space back to the system when given + negative arguments. This is generally necessary only if you are + using a hand-crafted MORECORE function that cannot handle negative + arguments. + +HAVE_MMAP default: 1 (true) + True if this system supports mmap or an emulation of it. If so, and + HAVE_MORECORE is not true, MMAP is used for all system + allocation. If set and HAVE_MORECORE is true as well, MMAP is + primarily used to directly allocate very large blocks. It is also + used as a backup strategy in cases where MORECORE fails to provide + space from system. Note: A single call to MUNMAP is assumed to be + able to unmap memory that may have be allocated using multiple calls + to MMAP, so long as they are adjacent. + +HAVE_MREMAP default: 1 on linux, else 0 + If true realloc() uses mremap() to re-allocate large blocks and + extend or shrink allocation spaces. + +MMAP_CLEARS default: 1 on unix + True if mmap clears memory so calloc doesn't need to. This is true + for standard unix mmap using /dev/zero. + +USE_BUILTIN_FFS default: 0 (i.e., not used) + Causes malloc to use the builtin ffs() function to compute indices. + Some compilers may recognize and intrinsify ffs to be faster than the + supplied C version. Also, the case of x86 using gcc is special-cased + to an asm instruction, so is already as fast as it can be, and so + this setting has no effect. (On most x86s, the asm version is only + slightly faster than the C version.) + +malloc_getpagesize default: derive from system includes, or 4096. + The system page size. To the extent possible, this malloc manages + memory from the system in page-size units. This may be (and + usually is) a function rather than a constant. This is ignored + if WIN32, where page size is determined using getSystemInfo during + initialization. + +USE_DEV_RANDOM default: 0 (i.e., not used) + Causes malloc to use /dev/random to initialize secure magic seed for + stamping footers. Otherwise, the current time is used. + +NO_MALLINFO default: 0 + If defined, don't compile "mallinfo". This can be a simple way + of dealing with mismatches between system declarations and + those in this file. + +MALLINFO_FIELD_TYPE default: size_t + The type of the fields in the mallinfo struct. This was originally + defined as "int" in SVID etc, but is more usefully defined as + size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set + +REALLOC_ZERO_BYTES_FREES default: not defined + This should be set if a call to realloc with zero bytes should + be the same as a call to free. Some people think it should. Otherwise, + since this malloc returns a unique pointer for malloc(0), so does + realloc(p, 0). + +LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H +LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H +LACKS_STDLIB_H default: NOT defined unless on WIN32 + Define these if your system does not have these header files. + You might need to manually insert some of the declarations they provide. + +DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, + system_info.dwAllocationGranularity in WIN32, + otherwise 64K. + Also settable using mallopt(M_GRANULARITY, x) + The unit for allocating and deallocating memory from the system. On + most systems with contiguous MORECORE, there is no reason to + make this more than a page. However, systems with MMAP tend to + either require or encourage larger granularities. You can increase + this value to prevent system allocation functions to be called so + often, especially if they are slow. The value must be at least one + page and must be a power of two. Setting to 0 causes initialization + to either page size or win32 region size. (Note: In previous + versions of malloc, the equivalent of this option was called + "TOP_PAD") + +DEFAULT_TRIM_THRESHOLD default: 2MB + Also settable using mallopt(M_TRIM_THRESHOLD, x) + The maximum amount of unused top-most memory to keep before + releasing via malloc_trim in free(). Automatic trimming is mainly + useful in long-lived programs using contiguous MORECORE. Because + trimming via sbrk can be slow on some systems, and can sometimes be + wasteful (in cases where programs immediately afterward allocate + more large chunks) the value should be high enough so that your + overall system performance would improve by releasing this much + memory. As a rough guide, you might set to a value close to the + average size of a process (program) running on your system. + Releasing this much memory would allow such a process to run in + memory. Generally, it is worth tuning trim thresholds when a + program undergoes phases where several large chunks are allocated + and released in ways that can reuse each other's storage, perhaps + mixed with phases where there are no such chunks at all. The trim + value must be greater than page size to have any useful effect. To + disable trimming completely, you can set to MAX_SIZE_T. Note that the trick + some people use of mallocing a huge space and then freeing it at + program startup, in an attempt to reserve system memory, doesn't + have the intended effect under automatic trimming, since that memory + will immediately be returned to the system. + +DEFAULT_MMAP_THRESHOLD default: 256K + Also settable using mallopt(M_MMAP_THRESHOLD, x) + The request size threshold for using MMAP to directly service a + request. Requests of at least this size that cannot be allocated + using already-existing space will be serviced via mmap. (If enough + normal freed space already exists it is used instead.) Using mmap + segregates relatively large chunks of memory so that they can be + individually obtained and released from the host system. A request + serviced through mmap is never reused by any other request (at least + not directly; the system may just so happen to remap successive + requests to the same locations). Segregating space in this way has + the benefits that: Mmapped space can always be individually released + back to the system, which helps keep the system level memory demands + of a long-lived program low. Also, mapped memory doesn't become + `locked' between other chunks, as can happen with normally allocated + chunks, which means that even trimming via malloc_trim would not + release them. However, it has the disadvantage that the space + cannot be reclaimed, consolidated, and then used to service later + requests, as happens with normal chunks. The advantages of mmap + nearly always outweigh disadvantages for "large" chunks, but the + value of "large" may vary across systems. The default is an + empirically derived value that works well in most systems. You can + disable mmap by setting to MAX_SIZE_T. + +*/ + +#ifndef WIN32 +#ifdef _WIN32 +#define WIN32 1 +#endif /* _WIN32 */ +#endif /* WIN32 */ +#ifdef WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#define HAVE_MMAP 1 +#define HAVE_MORECORE 0 +#define LACKS_UNISTD_H +#define LACKS_SYS_PARAM_H +#define LACKS_SYS_MMAN_H +#define LACKS_STRING_H +#define LACKS_STRINGS_H +#define LACKS_SYS_TYPES_H +#define LACKS_ERRNO_H +#define MALLOC_FAILURE_ACTION +#define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */ +#endif /* WIN32 */ + +#ifdef __OS2__ +#define INCL_DOS +#include +#define HAVE_MMAP 1 +#define HAVE_MORECORE 0 +#define LACKS_SYS_MMAN_H +#endif /* __OS2__ */ + +#if defined(DARWIN) || defined(_DARWIN) +/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */ +#ifndef HAVE_MORECORE +#define HAVE_MORECORE 0 +#define HAVE_MMAP 1 +#endif /* HAVE_MORECORE */ +#endif /* DARWIN */ + +#ifndef LACKS_SYS_TYPES_H +#include /* For size_t */ +#endif /* LACKS_SYS_TYPES_H */ + +/* The maximum possible size_t value has all bits set */ +#define MAX_SIZE_T (~(size_t)0) + +#ifndef ONLY_MSPACES +#define ONLY_MSPACES 0 +#endif /* ONLY_MSPACES */ +#ifndef MSPACES +#if ONLY_MSPACES +#define MSPACES 1 +#else /* ONLY_MSPACES */ +#define MSPACES 0 +#endif /* ONLY_MSPACES */ +#endif /* MSPACES */ +#ifndef MALLOC_ALIGNMENT +#define MALLOC_ALIGNMENT ((size_t)8U) +#endif /* MALLOC_ALIGNMENT */ +#ifndef FOOTERS +#define FOOTERS 0 +#endif /* FOOTERS */ +#ifndef ABORT +#define ABORT abort() +#endif /* ABORT */ +#ifndef ABORT_ON_ASSERT_FAILURE +#define ABORT_ON_ASSERT_FAILURE 1 +#endif /* ABORT_ON_ASSERT_FAILURE */ +#ifndef PROCEED_ON_ERROR +#define PROCEED_ON_ERROR 0 +#endif /* PROCEED_ON_ERROR */ +#ifndef USE_LOCKS +#define USE_LOCKS 0 +#endif /* USE_LOCKS */ +#ifndef INSECURE +#define INSECURE 0 +#endif /* INSECURE */ +#ifndef HAVE_MMAP +#define HAVE_MMAP 1 +#endif /* HAVE_MMAP */ +#ifndef MMAP_CLEARS +#define MMAP_CLEARS 1 +#endif /* MMAP_CLEARS */ +#ifndef HAVE_MREMAP +#ifdef linux +#define HAVE_MREMAP 1 +#else /* linux */ +#define HAVE_MREMAP 0 +#endif /* linux */ +#endif /* HAVE_MREMAP */ +#ifndef MALLOC_FAILURE_ACTION +#define MALLOC_FAILURE_ACTION errno = ENOMEM; +#endif /* MALLOC_FAILURE_ACTION */ +#ifndef HAVE_MORECORE +#if ONLY_MSPACES +#define HAVE_MORECORE 0 +#else /* ONLY_MSPACES */ +#define HAVE_MORECORE 1 +#endif /* ONLY_MSPACES */ +#endif /* HAVE_MORECORE */ +#if !HAVE_MORECORE +#define MORECORE_CONTIGUOUS 0 +#else /* !HAVE_MORECORE */ +#ifndef MORECORE +#define MORECORE sbrk +#endif /* MORECORE */ +#ifndef MORECORE_CONTIGUOUS +#define MORECORE_CONTIGUOUS 1 +#endif /* MORECORE_CONTIGUOUS */ +#endif /* HAVE_MORECORE */ +#ifndef DEFAULT_GRANULARITY +#if MORECORE_CONTIGUOUS +#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ +#else /* MORECORE_CONTIGUOUS */ +#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U) +#endif /* MORECORE_CONTIGUOUS */ +#endif /* DEFAULT_GRANULARITY */ +#ifndef DEFAULT_TRIM_THRESHOLD +#ifndef MORECORE_CANNOT_TRIM +#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) +#else /* MORECORE_CANNOT_TRIM */ +#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T +#endif /* MORECORE_CANNOT_TRIM */ +#endif /* DEFAULT_TRIM_THRESHOLD */ +#ifndef DEFAULT_MMAP_THRESHOLD +#if HAVE_MMAP +#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) +#else /* HAVE_MMAP */ +#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T +#endif /* HAVE_MMAP */ +#endif /* DEFAULT_MMAP_THRESHOLD */ +#ifndef USE_BUILTIN_FFS +#define USE_BUILTIN_FFS 0 +#endif /* USE_BUILTIN_FFS */ +#ifndef USE_DEV_RANDOM +#define USE_DEV_RANDOM 0 +#endif /* USE_DEV_RANDOM */ +#ifndef NO_MALLINFO +#define NO_MALLINFO 0 +#endif /* NO_MALLINFO */ +#ifndef MALLINFO_FIELD_TYPE +#define MALLINFO_FIELD_TYPE size_t +#endif /* MALLINFO_FIELD_TYPE */ + +/* + mallopt tuning options. SVID/XPG defines four standard parameter + numbers for mallopt, normally defined in malloc.h. None of these + are used in this malloc, so setting them has no effect. But this + malloc does support the following options. +*/ + +#define M_TRIM_THRESHOLD (-1) +#define M_GRANULARITY (-2) +#define M_MMAP_THRESHOLD (-3) + +/* ------------------------ Mallinfo declarations ------------------------ */ + +#if !NO_MALLINFO +/* + This version of malloc supports the standard SVID/XPG mallinfo + routine that returns a struct containing usage properties and + statistics. It should work on any system that has a + /usr/include/malloc.h defining struct mallinfo. The main + declaration needed is the mallinfo struct that is returned (by-copy) + by mallinfo(). The malloinfo struct contains a bunch of fields that + are not even meaningful in this version of malloc. These fields are + are instead filled by mallinfo() with other numbers that might be of + interest. + + HAVE_USR_INCLUDE_MALLOC_H should be set if you have a + /usr/include/malloc.h file that includes a declaration of struct + mallinfo. If so, it is included; else a compliant version is + declared below. These must be precisely the same for mallinfo() to + work. The original SVID version of this struct, defined on most + systems with mallinfo, declares all fields as ints. But some others + define as unsigned long. If your system defines the fields using a + type of different width than listed here, you MUST #include your + system version and #define HAVE_USR_INCLUDE_MALLOC_H. +*/ + +/* #define HAVE_USR_INCLUDE_MALLOC_H */ + +#ifdef HAVE_USR_INCLUDE_MALLOC_H +#include "/usr/include/malloc.h" +#else /* HAVE_USR_INCLUDE_MALLOC_H */ + +/* HP-UX's stdlib.h redefines mallinfo unless _STRUCT_MALLINFO is defined */ +#define _STRUCT_MALLINFO + +struct mallinfo { + MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ + MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ + MALLINFO_FIELD_TYPE smblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ + MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ + MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ + MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ + MALLINFO_FIELD_TYPE fordblks; /* total free space */ + MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ +}; + +#endif /* HAVE_USR_INCLUDE_MALLOC_H */ +#endif /* NO_MALLINFO */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#if !ONLY_MSPACES + +/* ------------------- Declarations of public routines ------------------- */ + +#ifndef USE_DL_PREFIX +#define dlcalloc calloc +#define dlfree free +#define dlmalloc malloc +#define dlmemalign memalign +#define dlrealloc realloc +#define dlvalloc valloc +#define dlpvalloc pvalloc +#define dlmallinfo mallinfo +#define dlmallopt mallopt +#define dlmalloc_trim malloc_trim +#define dlmalloc_stats malloc_stats +#define dlmalloc_usable_size malloc_usable_size +#define dlmalloc_footprint malloc_footprint +#define dlmalloc_max_footprint malloc_max_footprint +#define dlindependent_calloc independent_calloc +#define dlindependent_comalloc independent_comalloc +#endif /* USE_DL_PREFIX */ + + +/* + malloc(size_t n) + Returns a pointer to a newly allocated chunk of at least n bytes, or + null if no space is available, in which case errno is set to ENOMEM + on ANSI C systems. + + If n is zero, malloc returns a minimum-sized chunk. (The minimum + size is 16 bytes on most 32bit systems, and 32 bytes on 64bit + systems.) Note that size_t is an unsigned type, so calls with + arguments that would be negative if signed are interpreted as + requests for huge amounts of space, which will often fail. The + maximum supported value of n differs across systems, but is in all + cases less than the maximum representable value of a size_t. +*/ +void* dlmalloc(size_t); + +/* + free(void* p) + Releases the chunk of memory pointed to by p, that had been previously + allocated using malloc or a related routine such as realloc. + It has no effect if p is null. If p was not malloced or already + freed, free(p) will by default cause the current program to abort. +*/ +void dlfree(void*); + +/* + calloc(size_t n_elements, size_t element_size); + Returns a pointer to n_elements * element_size bytes, with all locations + set to zero. +*/ +void* dlcalloc(size_t, size_t); + +/* + realloc(void* p, size_t n) + Returns a pointer to a chunk of size n that contains the same data + as does chunk p up to the minimum of (n, p's size) bytes, or null + if no space is available. + + The returned pointer may or may not be the same as p. The algorithm + prefers extending p in most cases when possible, otherwise it + employs the equivalent of a malloc-copy-free sequence. + + If p is null, realloc is equivalent to malloc. + + If space is not available, realloc returns null, errno is set (if on + ANSI) and p is NOT freed. + + if n is for fewer bytes than already held by p, the newly unused + space is lopped off and freed if possible. realloc with a size + argument of zero (re)allocates a minimum-sized chunk. + + The old unix realloc convention of allowing the last-free'd chunk + to be used as an argument to realloc is not supported. +*/ + +void* dlrealloc(void*, size_t); + +/* + memalign(size_t alignment, size_t n); + Returns a pointer to a newly allocated chunk of n bytes, aligned + in accord with the alignment argument. + + The alignment argument should be a power of two. If the argument is + not a power of two, the nearest greater power is used. + 8-byte alignment is guaranteed by normal malloc calls, so don't + bother calling memalign with an argument of 8 or less. + + Overreliance on memalign is a sure way to fragment space. +*/ +void* dlmemalign(size_t, size_t); + +/* + valloc(size_t n); + Equivalent to memalign(pagesize, n), where pagesize is the page + size of the system. If the pagesize is unknown, 4096 is used. +*/ +void* dlvalloc(size_t); + +/* + mallopt(int parameter_number, int parameter_value) + Sets tunable parameters The format is to provide a + (parameter-number, parameter-value) pair. mallopt then sets the + corresponding parameter to the argument value if it can (i.e., so + long as the value is meaningful), and returns 1 if successful else + 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, + normally defined in malloc.h. None of these are use in this malloc, + so setting them has no effect. But this malloc also supports other + options in mallopt. See below for details. Briefly, supported + parameters are as follows (listed defaults are for "typical" + configurations). + + Symbol param # default allowed param values + M_TRIM_THRESHOLD -1 2*1024*1024 any (MAX_SIZE_T disables) + M_GRANULARITY -2 page size any power of 2 >= page size + M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) +*/ +int dlmallopt(int, int); + +/* + malloc_footprint(); + Returns the number of bytes obtained from the system. The total + number of bytes allocated by malloc, realloc etc., is less than this + value. Unlike mallinfo, this function returns only a precomputed + result, so can be called frequently to monitor memory consumption. + Even if locks are otherwise defined, this function does not use them, + so results might not be up to date. +*/ +size_t dlmalloc_footprint(void); + +/* + malloc_max_footprint(); + Returns the maximum number of bytes obtained from the system. This + value will be greater than current footprint if deallocated space + has been reclaimed by the system. The peak number of bytes allocated + by malloc, realloc etc., is less than this value. Unlike mallinfo, + this function returns only a precomputed result, so can be called + frequently to monitor memory consumption. Even if locks are + otherwise defined, this function does not use them, so results might + not be up to date. +*/ +size_t dlmalloc_max_footprint(void); + +#if !NO_MALLINFO +/* + mallinfo() + Returns (by copy) a struct containing various summary statistics: + + arena: current total non-mmapped bytes allocated from system + ordblks: the number of free chunks + smblks: always zero. + hblks: current number of mmapped regions + hblkhd: total bytes held in mmapped regions + usmblks: the maximum total allocated space. This will be greater + than current total if trimming has occurred. + fsmblks: always zero + uordblks: current total allocated space (normal or mmapped) + fordblks: total free space + keepcost: the maximum number of bytes that could ideally be released + back to system via malloc_trim. ("ideally" means that + it ignores page restrictions etc.) + + Because these fields are ints, but internal bookkeeping may + be kept as longs, the reported values may wrap around zero and + thus be inaccurate. +*/ +struct mallinfo dlmallinfo(void); +#endif /* NO_MALLINFO */ + +/* + independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); + + independent_calloc is similar to calloc, but instead of returning a + single cleared space, it returns an array of pointers to n_elements + independent elements that can hold contents of size elem_size, each + of which starts out cleared, and can be independently freed, + realloc'ed etc. The elements are guaranteed to be adjacently + allocated (this is not guaranteed to occur with multiple callocs or + mallocs), which may also improve cache locality in some + applications. + + The "chunks" argument is optional (i.e., may be null, which is + probably the most typical usage). If it is null, the returned array + is itself dynamically allocated and should also be freed when it is + no longer needed. Otherwise, the chunks array must be of at least + n_elements in length. It is filled in with the pointers to the + chunks. + + In either case, independent_calloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and "chunks" + is null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use regular calloc and assign pointers into this + space to represent elements. (In this case though, you cannot + independently free elements.) + + independent_calloc simplifies and speeds up implementations of many + kinds of pools. It may also be useful when constructing large data + structures that initially have a fixed number of fixed-sized nodes, + but the number is not known at compile time, and some of the nodes + may later need to be freed. For example: + + struct Node { int item; struct Node* next; }; + + struct Node* build_list() { + struct Node** pool; + int n = read_number_of_nodes_needed(); + if (n <= 0) return 0; + pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); + if (pool == 0) die(); + // organize into a linked list... + struct Node* first = pool[0]; + for (i = 0; i < n-1; ++i) + pool[i]->next = pool[i+1]; + free(pool); // Can now free the array (or not, if it is needed later) + return first; + } +*/ +void** dlindependent_calloc(size_t, size_t, void**); + +/* + independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); + + independent_comalloc allocates, all at once, a set of n_elements + chunks with sizes indicated in the "sizes" array. It returns + an array of pointers to these elements, each of which can be + independently freed, realloc'ed etc. The elements are guaranteed to + be adjacently allocated (this is not guaranteed to occur with + multiple callocs or mallocs), which may also improve cache locality + in some applications. + + The "chunks" argument is optional (i.e., may be null). If it is null + the returned array is itself dynamically allocated and should also + be freed when it is no longer needed. Otherwise, the chunks array + must be of at least n_elements in length. It is filled in with the + pointers to the chunks. + + In either case, independent_comalloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and chunks is + null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use a single regular malloc, and assign pointers at + particular offsets in the aggregate space. (In this case though, you + cannot independently free elements.) + + independent_comallac differs from independent_calloc in that each + element may have a different size, and also that it does not + automatically clear elements. + + independent_comalloc can be used to speed up allocation in cases + where several structs or objects must always be allocated at the + same time. For example: + + struct Head { ... } + struct Foot { ... } + + void send_message(char* msg) { + int msglen = strlen(msg); + size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; + void* chunks[3]; + if (independent_comalloc(3, sizes, chunks) == 0) + die(); + struct Head* head = (struct Head*)(chunks[0]); + char* body = (char*)(chunks[1]); + struct Foot* foot = (struct Foot*)(chunks[2]); + // ... + } + + In general though, independent_comalloc is worth using only for + larger values of n_elements. For small values, you probably won't + detect enough difference from series of malloc calls to bother. + + Overuse of independent_comalloc can increase overall memory usage, + since it cannot reuse existing noncontiguous small chunks that + might be available for some of the elements. +*/ +void** dlindependent_comalloc(size_t, size_t*, void**); + + +/* + pvalloc(size_t n); + Equivalent to valloc(minimum-page-that-holds(n)), that is, + round up n to nearest pagesize. + */ +void* dlpvalloc(size_t); + +/* + malloc_trim(size_t pad); + + If possible, gives memory back to the system (via negative arguments + to sbrk) if there is unused memory at the `high' end of the malloc + pool or in unused MMAP segments. You can call this after freeing + large blocks of memory to potentially reduce the system-level memory + requirements of a program. However, it cannot guarantee to reduce + memory. Under some allocation patterns, some large free blocks of + memory will be locked between two used chunks, so they cannot be + given back to the system. + + The `pad' argument to malloc_trim represents the amount of free + trailing space to leave untrimmed. If this argument is zero, only + the minimum amount of memory to maintain internal data structures + will be left. Non-zero arguments can be supplied to maintain enough + trailing space to service future expected allocations without having + to re-obtain memory from the system. + + Malloc_trim returns 1 if it actually released any memory, else 0. +*/ +int dlmalloc_trim(size_t); + +/* + malloc_usable_size(void* p); + + Returns the number of bytes you can actually use in + an allocated chunk, which may be more than you requested (although + often not) due to alignment and minimum size constraints. + You can use this many bytes without worrying about + overwriting other allocated objects. This is not a particularly great + programming practice. malloc_usable_size can be more useful in + debugging and assertions, for example: + + p = malloc(n); + assert(malloc_usable_size(p) >= 256); +*/ +size_t dlmalloc_usable_size(void*); + +/* + malloc_stats(); + Prints on stderr the amount of space obtained from the system (both + via sbrk and mmap), the maximum amount (which may be more than + current if malloc_trim and/or munmap got called), and the current + number of bytes allocated via malloc (or realloc, etc) but not yet + freed. Note that this is the number of bytes allocated, not the + number requested. It will be larger than the number requested + because of alignment and bookkeeping overhead. Because it includes + alignment wastage as being in use, this figure may be greater than + zero even when no user-level chunks are allocated. + + The reported current and maximum system memory can be inaccurate if + a program makes other calls to system memory allocation functions + (normally sbrk) outside of malloc. + + malloc_stats prints only the most commonly interesting statistics. + More information can be obtained by calling mallinfo. +*/ +void dlmalloc_stats(void); + +#endif /* ONLY_MSPACES */ + +#if MSPACES + +/* + mspace is an opaque type representing an independent + region of space that supports mspace_malloc, etc. +*/ +typedef void* mspace; + +/* + create_mspace creates and returns a new independent space with the + given initial capacity, or, if 0, the default granularity size. It + returns null if there is no system memory available to create the + space. If argument locked is non-zero, the space uses a separate + lock to control access. The capacity of the space will grow + dynamically as needed to service mspace_malloc requests. You can + control the sizes of incremental increases of this space by + compiling with a different DEFAULT_GRANULARITY or dynamically + setting with mallopt(M_GRANULARITY, value). +*/ +mspace create_mspace(size_t capacity, int locked); + +/* + destroy_mspace destroys the given space, and attempts to return all + of its memory back to the system, returning the total number of + bytes freed. After destruction, the results of access to all memory + used by the space become undefined. +*/ +size_t destroy_mspace(mspace msp); + +/* + create_mspace_with_base uses the memory supplied as the initial base + of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this + space is used for bookkeeping, so the capacity must be at least this + large. (Otherwise 0 is returned.) When this initial space is + exhausted, additional memory will be obtained from the system. + Destroying this space will deallocate all additionally allocated + space (if possible) but not the initial base. +*/ +mspace create_mspace_with_base(void* base, size_t capacity, int locked); + +/* + mspace_malloc behaves as malloc, but operates within + the given space. +*/ +void* mspace_malloc(mspace msp, size_t bytes); + +/* + mspace_free behaves as free, but operates within + the given space. + + If compiled with FOOTERS==1, mspace_free is not actually needed. + free may be called instead of mspace_free because freed chunks from + any space are handled by their originating spaces. +*/ +void mspace_free(mspace msp, void* mem); + +/* + mspace_realloc behaves as realloc, but operates within + the given space. + + If compiled with FOOTERS==1, mspace_realloc is not actually + needed. realloc may be called instead of mspace_realloc because + realloced chunks from any space are handled by their originating + spaces. +*/ +void* mspace_realloc(mspace msp, void* mem, size_t newsize); + +/* + mspace_calloc behaves as calloc, but operates within + the given space. +*/ +void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); + +/* + mspace_memalign behaves as memalign, but operates within + the given space. +*/ +void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); + +/* + mspace_independent_calloc behaves as independent_calloc, but + operates within the given space. +*/ +void** mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]); + +/* + mspace_independent_comalloc behaves as independent_comalloc, but + operates within the given space. +*/ +void** mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]); + +/* + mspace_footprint() returns the number of bytes obtained from the + system for this space. +*/ +size_t mspace_footprint(mspace msp); + +/* + mspace_max_footprint() returns the peak number of bytes obtained from the + system for this space. +*/ +size_t mspace_max_footprint(mspace msp); + + +#if !NO_MALLINFO +/* + mspace_mallinfo behaves as mallinfo, but reports properties of + the given space. +*/ +struct mallinfo mspace_mallinfo(mspace msp); +#endif /* NO_MALLINFO */ + +/* + mspace_malloc_stats behaves as malloc_stats, but reports + properties of the given space. +*/ +void mspace_malloc_stats(mspace msp); + +/* + mspace_trim behaves as malloc_trim, but + operates within the given space. +*/ +int mspace_trim(mspace msp, size_t pad); + +/* + An alias for mallopt. +*/ +int mspace_mallopt(int, int); + +#endif /* MSPACES */ + +#ifdef __cplusplus +}; /* end of extern "C" */ +#endif /* __cplusplus */ + +/* + ======================================================================== + To make a fully customizable malloc.h header file, cut everything + above this line, put into file malloc.h, edit to suit, and #include it + on the next line, as well as in programs that use this malloc. + ======================================================================== +*/ + +/* #include "malloc.h" */ + +/*------------------------------ internal #includes ---------------------- */ + +#ifdef _MSC_VER +#pragma warning( disable : 4146 ) /* no "unsigned" warnings */ +#endif /* _MSC_VER */ + +#include /* for printing in malloc_stats */ + +#ifndef LACKS_ERRNO_H +#include /* for MALLOC_FAILURE_ACTION */ +#endif /* LACKS_ERRNO_H */ +#if FOOTERS +#include /* for magic initialization */ +#endif /* FOOTERS */ +#ifndef LACKS_STDLIB_H +#include /* for abort() */ +#endif /* LACKS_STDLIB_H */ +#ifdef DEBUG +#if ABORT_ON_ASSERT_FAILURE +#define assert(x) if(!(x)) ABORT +#else /* ABORT_ON_ASSERT_FAILURE */ +#include +#endif /* ABORT_ON_ASSERT_FAILURE */ +#else /* DEBUG */ +#define assert(x) +#endif /* DEBUG */ +#ifndef LACKS_STRING_H +#include /* for memset etc */ +#endif /* LACKS_STRING_H */ +#if USE_BUILTIN_FFS +#ifndef LACKS_STRINGS_H +#include /* for ffs */ +#endif /* LACKS_STRINGS_H */ +#endif /* USE_BUILTIN_FFS */ +#if HAVE_MMAP +#ifndef LACKS_SYS_MMAN_H +#include /* for mmap */ +#endif /* LACKS_SYS_MMAN_H */ +#ifndef LACKS_FCNTL_H +#include +#endif /* LACKS_FCNTL_H */ +#endif /* HAVE_MMAP */ +#if HAVE_MORECORE +#ifndef LACKS_UNISTD_H +#include /* for sbrk */ +#else /* LACKS_UNISTD_H */ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) +extern void* sbrk(ptrdiff_t); +#endif /* FreeBSD etc */ +#endif /* LACKS_UNISTD_H */ +#endif /* HAVE_MMAP */ + +#ifndef WIN32 +#ifndef malloc_getpagesize +# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ +# ifndef _SC_PAGE_SIZE +# define _SC_PAGE_SIZE _SC_PAGESIZE +# endif +# endif +# ifdef _SC_PAGE_SIZE +# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) +# else +# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) + extern size_t getpagesize(); +# define malloc_getpagesize getpagesize() +# else +# ifdef WIN32 /* use supplied emulation of getpagesize */ +# define malloc_getpagesize getpagesize() +# else +# ifndef LACKS_SYS_PARAM_H +# include +# endif +# ifdef EXEC_PAGESIZE +# define malloc_getpagesize EXEC_PAGESIZE +# else +# ifdef NBPG +# ifndef CLSIZE +# define malloc_getpagesize NBPG +# else +# define malloc_getpagesize (NBPG * CLSIZE) +# endif +# else +# ifdef NBPC +# define malloc_getpagesize NBPC +# else +# ifdef PAGESIZE +# define malloc_getpagesize PAGESIZE +# else /* just guess */ +# define malloc_getpagesize ((size_t)4096U) +# endif +# endif +# endif +# endif +# endif +# endif +# endif +#endif +#endif + +/* ------------------- size_t and alignment properties -------------------- */ + +/* The byte and bit size of a size_t */ +#define SIZE_T_SIZE (sizeof(size_t)) +#define SIZE_T_BITSIZE (sizeof(size_t) << 3) + +/* Some constants coerced to size_t */ +/* Annoying but necessary to avoid errors on some plaftorms */ +#define SIZE_T_ZERO ((size_t)0) +#define SIZE_T_ONE ((size_t)1) +#define SIZE_T_TWO ((size_t)2) +#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) +#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) +#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) +#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) + +/* The bit mask value corresponding to MALLOC_ALIGNMENT */ +#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) + +/* True if address a has acceptable alignment */ +#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) + +/* the number of bytes to offset an address to align it */ +#define align_offset(A)\ + ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ + ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) + +/* -------------------------- MMAP preliminaries ------------------------- */ + +/* + If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and + checks to fail so compiler optimizer can delete code rather than + using so many "#if"s. +*/ + + +/* MORECORE and MMAP must return MFAIL on failure */ +#define MFAIL ((void*)(MAX_SIZE_T)) +#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ + +#if !HAVE_MMAP +#define IS_MMAPPED_BIT (SIZE_T_ZERO) +#define USE_MMAP_BIT (SIZE_T_ZERO) +#define CALL_MMAP(s) MFAIL +#define CALL_MUNMAP(a, s) (-1) +#define DIRECT_MMAP(s) MFAIL + +#else /* HAVE_MMAP */ +#define IS_MMAPPED_BIT (SIZE_T_ONE) +#define USE_MMAP_BIT (SIZE_T_ONE) + +#if !defined(WIN32) && !defined (__OS2__) +#define CALL_MUNMAP(a, s) munmap((a), (s)) +#define MMAP_PROT (PROT_READ|PROT_WRITE) +#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) +#define MAP_ANONYMOUS MAP_ANON +#endif /* MAP_ANON */ +#ifdef MAP_ANONYMOUS +#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) +#define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) +#else /* MAP_ANONYMOUS */ +/* + Nearly all versions of mmap support MAP_ANONYMOUS, so the following + is unlikely to be needed, but is supplied just in case. +*/ +#define MMAP_FLAGS (MAP_PRIVATE) +static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ +#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ + (dev_zero_fd = open("/dev/zero", O_RDWR), \ + mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ + mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) +#endif /* MAP_ANONYMOUS */ + +#define DIRECT_MMAP(s) CALL_MMAP(s) + +#elif defined(__OS2__) + +/* OS/2 MMAP via DosAllocMem */ +static void* os2mmap(size_t size) { + void* ptr; + if (DosAllocMem(&ptr, size, OBJ_ANY|PAG_COMMIT|PAG_READ|PAG_WRITE) && + DosAllocMem(&ptr, size, PAG_COMMIT|PAG_READ|PAG_WRITE)) + return MFAIL; + return ptr; +} + +#define os2direct_mmap(n) os2mmap(n) + +/* This function supports releasing coalesed segments */ +static int os2munmap(void* ptr, size_t size) { + while (size) { + ULONG ulSize = size; + ULONG ulFlags = 0; + if (DosQueryMem(ptr, &ulSize, &ulFlags) != 0) + return -1; + if ((ulFlags & PAG_BASE) == 0 ||(ulFlags & PAG_COMMIT) == 0 || + ulSize > size) + return -1; + if (DosFreeMem(ptr) != 0) + return -1; + ptr = ( void * ) ( ( char * ) ptr + ulSize ); + size -= ulSize; + } + return 0; +} + +#define CALL_MMAP(s) os2mmap(s) +#define CALL_MUNMAP(a, s) os2munmap((a), (s)) +#define DIRECT_MMAP(s) os2direct_mmap(s) + +#else /* WIN32 */ + +/* Win32 MMAP via VirtualAlloc */ +static void* win32mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); + return (ptr != 0)? ptr: MFAIL; +} + +/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ +static void* win32direct_mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, + PAGE_EXECUTE_READWRITE); + return (ptr != 0)? ptr: MFAIL; +} + +/* This function supports releasing coalesed segments */ +static int win32munmap(void* ptr, size_t size) { + MEMORY_BASIC_INFORMATION minfo; + char* cptr = ptr; + while (size) { + if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) + return -1; + if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || + minfo.State != MEM_COMMIT || minfo.RegionSize > size) + return -1; + if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) + return -1; + cptr += minfo.RegionSize; + size -= minfo.RegionSize; + } + return 0; +} + +#define CALL_MMAP(s) win32mmap(s) +#define CALL_MUNMAP(a, s) win32munmap((a), (s)) +#define DIRECT_MMAP(s) win32direct_mmap(s) +#endif /* WIN32 */ +#endif /* HAVE_MMAP */ + +#if HAVE_MMAP && HAVE_MREMAP +#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) +#else /* HAVE_MMAP && HAVE_MREMAP */ +#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL +#endif /* HAVE_MMAP && HAVE_MREMAP */ + +#if HAVE_MORECORE +#define CALL_MORECORE(S) MORECORE(S) +#else /* HAVE_MORECORE */ +#define CALL_MORECORE(S) MFAIL +#endif /* HAVE_MORECORE */ + +/* mstate bit set if continguous morecore disabled or failed */ +#define USE_NONCONTIGUOUS_BIT (4U) + +/* segment bit set in create_mspace_with_base */ +#define EXTERN_BIT (8U) + + +/* --------------------------- Lock preliminaries ------------------------ */ + +#if USE_LOCKS + +/* + When locks are defined, there are up to two global locks: + + * If HAVE_MORECORE, morecore_mutex protects sequences of calls to + MORECORE. In many cases sys_alloc requires two calls, that should + not be interleaved with calls by other threads. This does not + protect against direct calls to MORECORE by other threads not + using this lock, so there is still code to cope the best we can on + interference. + + * magic_init_mutex ensures that mparams.magic and other + unique mparams values are initialized only once. +*/ + +#if !defined(WIN32) && !defined(__OS2__) +/* By default use posix locks */ +#include +#define MLOCK_T pthread_mutex_t +#define INITIAL_LOCK(l) pthread_mutex_init(l, NULL) +#define ACQUIRE_LOCK(l) pthread_mutex_lock(l) +#define RELEASE_LOCK(l) pthread_mutex_unlock(l) + +#if HAVE_MORECORE +static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif /* HAVE_MORECORE */ + +static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER; + +#elif defined(__OS2__) +#define MLOCK_T HMTX +#define INITIAL_LOCK(l) DosCreateMutexSem(0, l, 0, FALSE) +#define ACQUIRE_LOCK(l) DosRequestMutexSem(*l, SEM_INDEFINITE_WAIT) +#define RELEASE_LOCK(l) DosReleaseMutexSem(*l) +#if HAVE_MORECORE +static MLOCK_T morecore_mutex; +#endif /* HAVE_MORECORE */ +static MLOCK_T magic_init_mutex; + +#else /* WIN32 */ +/* + Because lock-protected regions have bounded times, and there + are no recursive lock calls, we can use simple spinlocks. +*/ + +#define MLOCK_T long +static int win32_acquire_lock (MLOCK_T *sl) { + for (;;) { +#ifdef InterlockedCompareExchangePointer + if (!InterlockedCompareExchange(sl, 1, 0)) + return 0; +#else /* Use older void* version */ + if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0)) + return 0; +#endif /* InterlockedCompareExchangePointer */ + Sleep (0); + } +} + +static void win32_release_lock (MLOCK_T *sl) { + InterlockedExchange (sl, 0); +} + +#define INITIAL_LOCK(l) *(l)=0 +#define ACQUIRE_LOCK(l) win32_acquire_lock(l) +#define RELEASE_LOCK(l) win32_release_lock(l) +#if HAVE_MORECORE +static MLOCK_T morecore_mutex; +#endif /* HAVE_MORECORE */ +static MLOCK_T magic_init_mutex; +#endif /* WIN32 */ + +#define USE_LOCK_BIT (2U) +#else /* USE_LOCKS */ +#define USE_LOCK_BIT (0U) +#define INITIAL_LOCK(l) +#endif /* USE_LOCKS */ + +#if USE_LOCKS && HAVE_MORECORE +#define ACQUIRE_MORECORE_LOCK() ACQUIRE_LOCK(&morecore_mutex); +#define RELEASE_MORECORE_LOCK() RELEASE_LOCK(&morecore_mutex); +#else /* USE_LOCKS && HAVE_MORECORE */ +#define ACQUIRE_MORECORE_LOCK() +#define RELEASE_MORECORE_LOCK() +#endif /* USE_LOCKS && HAVE_MORECORE */ + +#if USE_LOCKS +#define ACQUIRE_MAGIC_INIT_LOCK() ACQUIRE_LOCK(&magic_init_mutex); +#define RELEASE_MAGIC_INIT_LOCK() RELEASE_LOCK(&magic_init_mutex); +#else /* USE_LOCKS */ +#define ACQUIRE_MAGIC_INIT_LOCK() +#define RELEASE_MAGIC_INIT_LOCK() +#endif /* USE_LOCKS */ + + +/* ----------------------- Chunk representations ------------------------ */ + +/* + (The following includes lightly edited explanations by Colin Plumb.) + + The malloc_chunk declaration below is misleading (but accurate and + necessary). It declares a "view" into memory allowing access to + necessary fields at known offsets from a given base. + + Chunks of memory are maintained using a `boundary tag' method as + originally described by Knuth. (See the paper by Paul Wilson + ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such + techniques.) Sizes of free chunks are stored both in the front of + each chunk and at the end. This makes consolidating fragmented + chunks into bigger chunks fast. The head fields also hold bits + representing whether chunks are free or in use. + + Here are some pictures to make it clearer. They are "exploded" to + show that the state of a chunk can be thought of as extending from + the high 31 bits of the head field of its header through the + prev_foot and PINUSE_BIT bit of the following chunk header. + + A chunk that's in use looks like: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk (if P = 1) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| + | Size of this chunk 1| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + +- -+ + | | + +- -+ + | : + +- size - sizeof(size_t) available payload bytes -+ + : | + chunk-> +- -+ + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| + | Size of next chunk (may or may not be in use) | +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + And if it's free, it looks like this: + + chunk-> +- -+ + | User payload (must be in use, or we would have merged!) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| + | Size of this chunk 0| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next pointer | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Prev pointer | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | : + +- size - sizeof(struct chunk) unused bytes -+ + : | + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of this chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| + | Size of next chunk (must be in use, or we would have merged)| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | : + +- User payload -+ + : | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |0| + +-+ + Note that since we always merge adjacent free chunks, the chunks + adjacent to a free chunk must be in use. + + Given a pointer to a chunk (which can be derived trivially from the + payload pointer) we can, in O(1) time, find out whether the adjacent + chunks are free, and if so, unlink them from the lists that they + are on and merge them with the current chunk. + + Chunks always begin on even word boundaries, so the mem portion + (which is returned to the user) is also on an even word boundary, and + thus at least double-word aligned. + + The P (PINUSE_BIT) bit, stored in the unused low-order bit of the + chunk size (which is always a multiple of two words), is an in-use + bit for the *previous* chunk. If that bit is *clear*, then the + word before the current chunk size contains the previous chunk + size, and can be used to find the front of the previous chunk. + The very first chunk allocated always has this bit set, preventing + access to non-existent (or non-owned) memory. If pinuse is set for + any given chunk, then you CANNOT determine the size of the + previous chunk, and might even get a memory addressing fault when + trying to do so. + + The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of + the chunk size redundantly records whether the current chunk is + inuse. This redundancy enables usage checks within free and realloc, + and reduces indirection when freeing and consolidating chunks. + + Each freshly allocated chunk must have both cinuse and pinuse set. + That is, each allocated chunk borders either a previously allocated + and still in-use chunk, or the base of its memory arena. This is + ensured by making all allocations from the the `lowest' part of any + found chunk. Further, no free chunk physically borders another one, + so each free chunk is known to be preceded and followed by either + inuse chunks or the ends of memory. + + Note that the `foot' of the current chunk is actually represented + as the prev_foot of the NEXT chunk. This makes it easier to + deal with alignments etc but can be very confusing when trying + to extend or adapt this code. + + The exceptions to all this are + + 1. The special chunk `top' is the top-most available chunk (i.e., + the one bordering the end of available memory). It is treated + specially. Top is never included in any bin, is used only if + no other chunk is available, and is released back to the + system if it is very large (see M_TRIM_THRESHOLD). In effect, + the top chunk is treated as larger (and thus less well + fitting) than any other available chunk. The top chunk + doesn't update its trailing size field since there is no next + contiguous chunk that would have to index off it. However, + space is still allocated for it (TOP_FOOT_SIZE) to enable + separation or merging when space is extended. + + 3. Chunks allocated via mmap, which have the lowest-order bit + (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set + PINUSE_BIT in their head fields. Because they are allocated + one-by-one, each must carry its own prev_foot field, which is + also used to hold the offset this chunk has within its mmapped + region, which is needed to preserve alignment. Each mmapped + chunk is trailed by the first two fields of a fake next-chunk + for sake of usage checks. + +*/ + +struct malloc_chunk { + size_t prev_foot; /* Size of previous chunk (if free). */ + size_t head; /* Size and inuse bits. */ + struct malloc_chunk* fd; /* double links -- used only if free. */ + struct malloc_chunk* bk; +}; + +typedef struct malloc_chunk mchunk; +typedef struct malloc_chunk* mchunkptr; +typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ +typedef unsigned int bindex_t; /* Described below */ +typedef unsigned int binmap_t; /* Described below */ +typedef unsigned int flag_t; /* The type of various bit flag sets */ + +/* ------------------- Chunks sizes and alignments ----------------------- */ + +#define MCHUNK_SIZE (sizeof(mchunk)) + +#if FOOTERS +#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) +#else /* FOOTERS */ +#define CHUNK_OVERHEAD (SIZE_T_SIZE) +#endif /* FOOTERS */ + +/* MMapped chunks need a second word of overhead ... */ +#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) +/* ... and additional padding for fake next-chunk at foot */ +#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) + +/* The smallest size we can malloc is an aligned minimal chunk */ +#define MIN_CHUNK_SIZE\ + ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* conversion from malloc headers to user pointers, and back */ +#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) +#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) +/* chunk associated with aligned address A */ +#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) + +/* Bounds on request (not chunk) sizes. */ +#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) +#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) + +/* pad request bytes into a usable size */ +#define pad_request(req) \ + (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* pad request, checking for minimum (but not maximum) */ +#define request2size(req) \ + (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) + + +/* ------------------ Operations on head and foot fields ----------------- */ + +/* + The head field of a chunk is or'ed with PINUSE_BIT when previous + adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in + use. If the chunk was obtained with mmap, the prev_foot field has + IS_MMAPPED_BIT set, otherwise holding the offset of the base of the + mmapped region to the base of the chunk. +*/ + +#define PINUSE_BIT (SIZE_T_ONE) +#define CINUSE_BIT (SIZE_T_TWO) +#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) + +/* Head value for fenceposts */ +#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) + +/* extraction of fields from head words */ +#define cinuse(p) ((p)->head & CINUSE_BIT) +#define pinuse(p) ((p)->head & PINUSE_BIT) +#define chunksize(p) ((p)->head & ~(INUSE_BITS)) + +#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) +#define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) + +/* Treat space at ptr +/- offset as a chunk */ +#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) +#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) + +/* Ptr to next or previous physical malloc_chunk. */ +#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS))) +#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) + +/* extract next chunk's pinuse bit */ +#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) + +/* Get/set size at footer */ +#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) +#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) + +/* Set size, pinuse bit, and foot */ +#define set_size_and_pinuse_of_free_chunk(p, s)\ + ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) + +/* Set size, pinuse bit, foot, and clear next pinuse */ +#define set_free_with_pinuse(p, s, n)\ + (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) + +#define is_mmapped(p)\ + (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) + +/* Get the internal overhead associated with chunk p */ +#define overhead_for(p)\ + (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) + +/* Return true if malloced space is not necessarily cleared */ +#if MMAP_CLEARS +#define calloc_must_clear(p) (!is_mmapped(p)) +#else /* MMAP_CLEARS */ +#define calloc_must_clear(p) (1) +#endif /* MMAP_CLEARS */ + +/* ---------------------- Overlaid data structures ----------------------- */ + +/* + When chunks are not in use, they are treated as nodes of either + lists or trees. + + "Small" chunks are stored in circular doubly-linked lists, and look + like this: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `head:' | Size of chunk, in bytes |P| + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Forward pointer to next chunk in list | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Back pointer to previous chunk in list | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Unused space (may be 0 bytes long) . + . . + . | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `foot:' | Size of chunk, in bytes | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Larger chunks are kept in a form of bitwise digital trees (aka + tries) keyed on chunksizes. Because malloc_tree_chunks are only for + free chunks greater than 256 bytes, their size doesn't impose any + constraints on user chunk sizes. Each node looks like: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `head:' | Size of chunk, in bytes |P| + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Forward pointer to next chunk of same size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Back pointer to previous chunk of same size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to left child (child[0]) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to right child (child[1]) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to parent | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | bin index of this chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Unused space . + . | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `foot:' | Size of chunk, in bytes | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Each tree holding treenodes is a tree of unique chunk sizes. Chunks + of the same size are arranged in a circularly-linked list, with only + the oldest chunk (the next to be used, in our FIFO ordering) + actually in the tree. (Tree members are distinguished by a non-null + parent pointer.) If a chunk with the same size an an existing node + is inserted, it is linked off the existing node using pointers that + work in the same way as fd/bk pointers of small chunks. + + Each tree contains a power of 2 sized range of chunk sizes (the + smallest is 0x100 <= x < 0x180), which is is divided in half at each + tree level, with the chunks in the smaller half of the range (0x100 + <= x < 0x140 for the top nose) in the left subtree and the larger + half (0x140 <= x < 0x180) in the right subtree. This is, of course, + done by inspecting individual bits. + + Using these rules, each node's left subtree contains all smaller + sizes than its right subtree. However, the node at the root of each + subtree has no particular ordering relationship to either. (The + dividing line between the subtree sizes is based on trie relation.) + If we remove the last chunk of a given size from the interior of the + tree, we need to replace it with a leaf node. The tree ordering + rules permit a node to be replaced by any leaf below it. + + The smallest chunk in a tree (a common operation in a best-fit + allocator) can be found by walking a path to the leftmost leaf in + the tree. Unlike a usual binary tree, where we follow left child + pointers until we reach a null, here we follow the right child + pointer any time the left one is null, until we reach a leaf with + both child pointers null. The smallest chunk in the tree will be + somewhere along that path. + + The worst case number of steps to add, find, or remove a node is + bounded by the number of bits differentiating chunks within + bins. Under current bin calculations, this ranges from 6 up to 21 + (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case + is of course much better. +*/ + +struct malloc_tree_chunk { + /* The first four fields must be compatible with malloc_chunk */ + size_t prev_foot; + size_t head; + struct malloc_tree_chunk* fd; + struct malloc_tree_chunk* bk; + + struct malloc_tree_chunk* child[2]; + struct malloc_tree_chunk* parent; + bindex_t index; +}; + +typedef struct malloc_tree_chunk tchunk; +typedef struct malloc_tree_chunk* tchunkptr; +typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ + +/* A little helper macro for trees */ +#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) + +/* ----------------------------- Segments -------------------------------- */ + +/* + Each malloc space may include non-contiguous segments, held in a + list headed by an embedded malloc_segment record representing the + top-most space. Segments also include flags holding properties of + the space. Large chunks that are directly allocated by mmap are not + included in this list. They are instead independently created and + destroyed without otherwise keeping track of them. + + Segment management mainly comes into play for spaces allocated by + MMAP. Any call to MMAP might or might not return memory that is + adjacent to an existing segment. MORECORE normally contiguously + extends the current space, so this space is almost always adjacent, + which is simpler and faster to deal with. (This is why MORECORE is + used preferentially to MMAP when both are available -- see + sys_alloc.) When allocating using MMAP, we don't use any of the + hinting mechanisms (inconsistently) supported in various + implementations of unix mmap, or distinguish reserving from + committing memory. Instead, we just ask for space, and exploit + contiguity when we get it. It is probably possible to do + better than this on some systems, but no general scheme seems + to be significantly better. + + Management entails a simpler variant of the consolidation scheme + used for chunks to reduce fragmentation -- new adjacent memory is + normally prepended or appended to an existing segment. However, + there are limitations compared to chunk consolidation that mostly + reflect the fact that segment processing is relatively infrequent + (occurring only when getting memory from system) and that we + don't expect to have huge numbers of segments: + + * Segments are not indexed, so traversal requires linear scans. (It + would be possible to index these, but is not worth the extra + overhead and complexity for most programs on most platforms.) + * New segments are only appended to old ones when holding top-most + memory; if they cannot be prepended to others, they are held in + different segments. + + Except for the top-most segment of an mstate, each segment record + is kept at the tail of its segment. Segments are added by pushing + segment records onto the list headed by &mstate.seg for the + containing mstate. + + Segment flags control allocation/merge/deallocation policies: + * If EXTERN_BIT set, then we did not allocate this segment, + and so should not try to deallocate or merge with others. + (This currently holds only for the initial segment passed + into create_mspace_with_base.) + * If IS_MMAPPED_BIT set, the segment may be merged with + other surrounding mmapped segments and trimmed/de-allocated + using munmap. + * If neither bit is set, then the segment was obtained using + MORECORE so can be merged with surrounding MORECORE'd segments + and deallocated/trimmed using MORECORE with negative arguments. +*/ + +struct malloc_segment { + char* base; /* base address */ + size_t size; /* allocated size */ + struct malloc_segment* next; /* ptr to next segment */ +#if FFI_MMAP_EXEC_WRIT + /* The mmap magic is supposed to store the address of the executable + segment at the very end of the requested block. */ + +# define mmap_exec_offset(b,s) (*(ptrdiff_t*)((b)+(s)-sizeof(ptrdiff_t))) + + /* We can only merge segments if their corresponding executable + segments are at identical offsets. */ +# define check_segment_merge(S,b,s) \ + (mmap_exec_offset((b),(s)) == (S)->exec_offset) + +# define add_segment_exec_offset(p,S) ((char*)(p) + (S)->exec_offset) +# define sub_segment_exec_offset(p,S) ((char*)(p) - (S)->exec_offset) + + /* The removal of sflags only works with HAVE_MORECORE == 0. */ + +# define get_segment_flags(S) (IS_MMAPPED_BIT) +# define set_segment_flags(S,v) \ + (((v) != IS_MMAPPED_BIT) ? (ABORT, (v)) : \ + (((S)->exec_offset = \ + mmap_exec_offset((S)->base, (S)->size)), \ + (mmap_exec_offset((S)->base + (S)->exec_offset, (S)->size) != \ + (S)->exec_offset) ? (ABORT, (v)) : \ + (mmap_exec_offset((S)->base, (S)->size) = 0), (v))) + + /* We use an offset here, instead of a pointer, because then, when + base changes, we don't have to modify this. On architectures + with segmented addresses, this might not work. */ + ptrdiff_t exec_offset; +#else + +# define get_segment_flags(S) ((S)->sflags) +# define set_segment_flags(S,v) ((S)->sflags = (v)) +# define check_segment_merge(S,b,s) (1) + + flag_t sflags; /* mmap and extern flag */ +#endif +}; + +#define is_mmapped_segment(S) (get_segment_flags(S) & IS_MMAPPED_BIT) +#define is_extern_segment(S) (get_segment_flags(S) & EXTERN_BIT) + +typedef struct malloc_segment msegment; +typedef struct malloc_segment* msegmentptr; + +/* ---------------------------- malloc_state ----------------------------- */ + +/* + A malloc_state holds all of the bookkeeping for a space. + The main fields are: + + Top + The topmost chunk of the currently active segment. Its size is + cached in topsize. The actual size of topmost space is + topsize+TOP_FOOT_SIZE, which includes space reserved for adding + fenceposts and segment records if necessary when getting more + space from the system. The size at which to autotrim top is + cached from mparams in trim_check, except that it is disabled if + an autotrim fails. + + Designated victim (dv) + This is the preferred chunk for servicing small requests that + don't have exact fits. It is normally the chunk split off most + recently to service another small request. Its size is cached in + dvsize. The link fields of this chunk are not maintained since it + is not kept in a bin. + + SmallBins + An array of bin headers for free chunks. These bins hold chunks + with sizes less than MIN_LARGE_SIZE bytes. Each bin contains + chunks of all the same size, spaced 8 bytes apart. To simplify + use in double-linked lists, each bin header acts as a malloc_chunk + pointing to the real first node, if it exists (else pointing to + itself). This avoids special-casing for headers. But to avoid + waste, we allocate only the fd/bk pointers of bins, and then use + repositioning tricks to treat these as the fields of a chunk. + + TreeBins + Treebins are pointers to the roots of trees holding a range of + sizes. There are 2 equally spaced treebins for each power of two + from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything + larger. + + Bin maps + There is one bit map for small bins ("smallmap") and one for + treebins ("treemap). Each bin sets its bit when non-empty, and + clears the bit when empty. Bit operations are then used to avoid + bin-by-bin searching -- nearly all "search" is done without ever + looking at bins that won't be selected. The bit maps + conservatively use 32 bits per map word, even if on 64bit system. + For a good description of some of the bit-based techniques used + here, see Henry S. Warren Jr's book "Hacker's Delight" (and + supplement at http://hackersdelight.org/). Many of these are + intended to reduce the branchiness of paths through malloc etc, as + well as to reduce the number of memory locations read or written. + + Segments + A list of segments headed by an embedded malloc_segment record + representing the initial space. + + Address check support + The least_addr field is the least address ever obtained from + MORECORE or MMAP. Attempted frees and reallocs of any address less + than this are trapped (unless INSECURE is defined). + + Magic tag + A cross-check field that should always hold same value as mparams.magic. + + Flags + Bits recording whether to use MMAP, locks, or contiguous MORECORE + + Statistics + Each space keeps track of current and maximum system memory + obtained via MORECORE or MMAP. + + Locking + If USE_LOCKS is defined, the "mutex" lock is acquired and released + around every public call using this mspace. +*/ + +/* Bin types, widths and sizes */ +#define NSMALLBINS (32U) +#define NTREEBINS (32U) +#define SMALLBIN_SHIFT (3U) +#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) +#define TREEBIN_SHIFT (8U) +#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) +#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) +#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) + +struct malloc_state { + binmap_t smallmap; + binmap_t treemap; + size_t dvsize; + size_t topsize; + char* least_addr; + mchunkptr dv; + mchunkptr top; + size_t trim_check; + size_t magic; + mchunkptr smallbins[(NSMALLBINS+1)*2]; + tbinptr treebins[NTREEBINS]; + size_t footprint; + size_t max_footprint; + flag_t mflags; +#if USE_LOCKS + MLOCK_T mutex; /* locate lock among fields that rarely change */ +#endif /* USE_LOCKS */ + msegment seg; +}; + +typedef struct malloc_state* mstate; + +/* ------------- Global malloc_state and malloc_params ------------------- */ + +/* + malloc_params holds global properties, including those that can be + dynamically set using mallopt. There is a single instance, mparams, + initialized in init_mparams. +*/ + +struct malloc_params { + size_t magic; + size_t page_size; + size_t granularity; + size_t mmap_threshold; + size_t trim_threshold; + flag_t default_mflags; +}; + +static struct malloc_params mparams; + +/* The global malloc_state used for all non-"mspace" calls */ +static struct malloc_state _gm_; +#define gm (&_gm_) +#define is_global(M) ((M) == &_gm_) +#define is_initialized(M) ((M)->top != 0) + +/* -------------------------- system alloc setup ------------------------- */ + +/* Operations on mflags */ + +#define use_lock(M) ((M)->mflags & USE_LOCK_BIT) +#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) +#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) + +#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) +#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) +#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) + +#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) +#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) + +#define set_lock(M,L)\ + ((M)->mflags = (L)?\ + ((M)->mflags | USE_LOCK_BIT) :\ + ((M)->mflags & ~USE_LOCK_BIT)) + +/* page-align a size */ +#define page_align(S)\ + (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE)) + +/* granularity-align a size */ +#define granularity_align(S)\ + (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE)) + +#define is_page_aligned(S)\ + (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) +#define is_granularity_aligned(S)\ + (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) + +/* True if segment S holds address A */ +#define segment_holds(S, A)\ + ((char*)(A) >= S->base && (char*)(A) < S->base + S->size) + +/* Return segment holding given address */ +static msegmentptr segment_holding(mstate m, char* addr) { + msegmentptr sp = &m->seg; + for (;;) { + if (addr >= sp->base && addr < sp->base + sp->size) + return sp; + if ((sp = sp->next) == 0) + return 0; + } +} + +/* Return true if segment contains a segment link */ +static int has_segment_link(mstate m, msegmentptr ss) { + msegmentptr sp = &m->seg; + for (;;) { + if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) + return 1; + if ((sp = sp->next) == 0) + return 0; + } +} + +#ifndef MORECORE_CANNOT_TRIM +#define should_trim(M,s) ((s) > (M)->trim_check) +#else /* MORECORE_CANNOT_TRIM */ +#define should_trim(M,s) (0) +#endif /* MORECORE_CANNOT_TRIM */ + +/* + TOP_FOOT_SIZE is padding at the end of a segment, including space + that may be needed to place segment records and fenceposts when new + noncontiguous segments are added. +*/ +#define TOP_FOOT_SIZE\ + (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) + + +/* ------------------------------- Hooks -------------------------------- */ + +/* + PREACTION should be defined to return 0 on success, and nonzero on + failure. If you are not using locking, you can redefine these to do + anything you like. +*/ + +#if USE_LOCKS + +/* Ensure locks are initialized */ +#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams()) + +#define PREACTION(M) ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) +#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } +#else /* USE_LOCKS */ + +#ifndef PREACTION +#define PREACTION(M) (0) +#endif /* PREACTION */ + +#ifndef POSTACTION +#define POSTACTION(M) +#endif /* POSTACTION */ + +#endif /* USE_LOCKS */ + +/* + CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. + USAGE_ERROR_ACTION is triggered on detected bad frees and + reallocs. The argument p is an address that might have triggered the + fault. It is ignored by the two predefined actions, but might be + useful in custom actions that try to help diagnose errors. +*/ + +#if PROCEED_ON_ERROR + +/* A count of the number of corruption errors causing resets */ +int malloc_corruption_error_count; + +/* default corruption action */ +static void reset_on_error(mstate m); + +#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) +#define USAGE_ERROR_ACTION(m, p) + +#else /* PROCEED_ON_ERROR */ + +#ifndef CORRUPTION_ERROR_ACTION +#define CORRUPTION_ERROR_ACTION(m) ABORT +#endif /* CORRUPTION_ERROR_ACTION */ + +#ifndef USAGE_ERROR_ACTION +#define USAGE_ERROR_ACTION(m,p) ABORT +#endif /* USAGE_ERROR_ACTION */ + +#endif /* PROCEED_ON_ERROR */ + +/* -------------------------- Debugging setup ---------------------------- */ + +#if ! DEBUG + +#define check_free_chunk(M,P) +#define check_inuse_chunk(M,P) +#define check_malloced_chunk(M,P,N) +#define check_mmapped_chunk(M,P) +#define check_malloc_state(M) +#define check_top_chunk(M,P) + +#else /* DEBUG */ +#define check_free_chunk(M,P) do_check_free_chunk(M,P) +#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) +#define check_top_chunk(M,P) do_check_top_chunk(M,P) +#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) +#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) +#define check_malloc_state(M) do_check_malloc_state(M) + +static void do_check_any_chunk(mstate m, mchunkptr p); +static void do_check_top_chunk(mstate m, mchunkptr p); +static void do_check_mmapped_chunk(mstate m, mchunkptr p); +static void do_check_inuse_chunk(mstate m, mchunkptr p); +static void do_check_free_chunk(mstate m, mchunkptr p); +static void do_check_malloced_chunk(mstate m, void* mem, size_t s); +static void do_check_tree(mstate m, tchunkptr t); +static void do_check_treebin(mstate m, bindex_t i); +static void do_check_smallbin(mstate m, bindex_t i); +static void do_check_malloc_state(mstate m); +static int bin_find(mstate m, mchunkptr x); +static size_t traverse_and_check(mstate m); +#endif /* DEBUG */ + +/* ---------------------------- Indexing Bins ---------------------------- */ + +#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) +#define small_index(s) ((s) >> SMALLBIN_SHIFT) +#define small_index2size(i) ((i) << SMALLBIN_SHIFT) +#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) + +/* addressing by index. See above about smallbin repositioning */ +#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) +#define treebin_at(M,i) (&((M)->treebins[i])) + +/* assign tree index for size S to variable I */ +#if defined(__GNUC__) && defined(i386) +#define compute_tree_index(S, I)\ +{\ + size_t X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int K;\ + __asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm" (X));\ + I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ + }\ +} +#else /* GNUC */ +#define compute_tree_index(S, I)\ +{\ + size_t X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int Y = (unsigned int)X;\ + unsigned int N = ((Y - 0x100) >> 16) & 8;\ + unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ + N += K;\ + N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ + K = 14 - N + ((Y <<= K) >> 15);\ + I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ + }\ +} +#endif /* GNUC */ + +/* Bit representing maximum resolved size in a treebin at i */ +#define bit_for_tree_index(i) \ + (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) + +/* Shift placing maximum resolved bit in a treebin at i as sign bit */ +#define leftshift_for_tree_index(i) \ + ((i == NTREEBINS-1)? 0 : \ + ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) + +/* The size of the smallest chunk held in bin with index i */ +#define minsize_for_tree_index(i) \ + ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ + (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) + + +/* ------------------------ Operations on bin maps ----------------------- */ + +/* bit corresponding to given index */ +#define idx2bit(i) ((binmap_t)(1) << (i)) + +/* Mark/Clear bits with given index */ +#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) +#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) +#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) + +#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) +#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) +#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) + +/* index corresponding to given bit */ + +#if defined(__GNUC__) && defined(i386) +#define compute_bit2idx(X, I)\ +{\ + unsigned int J;\ + __asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\ + I = (bindex_t)J;\ +} + +#else /* GNUC */ +#if USE_BUILTIN_FFS +#define compute_bit2idx(X, I) I = ffs(X)-1 + +#else /* USE_BUILTIN_FFS */ +#define compute_bit2idx(X, I)\ +{\ + unsigned int Y = X - 1;\ + unsigned int K = Y >> (16-4) & 16;\ + unsigned int N = K; Y >>= K;\ + N += K = Y >> (8-3) & 8; Y >>= K;\ + N += K = Y >> (4-2) & 4; Y >>= K;\ + N += K = Y >> (2-1) & 2; Y >>= K;\ + N += K = Y >> (1-0) & 1; Y >>= K;\ + I = (bindex_t)(N + Y);\ +} +#endif /* USE_BUILTIN_FFS */ +#endif /* GNUC */ + +/* isolate the least set bit of a bitmap */ +#define least_bit(x) ((x) & -(x)) + +/* mask with all bits to left of least bit of x on */ +#define left_bits(x) ((x<<1) | -(x<<1)) + +/* mask with all bits to left of or equal to least bit of x on */ +#define same_or_left_bits(x) ((x) | -(x)) + + +/* ----------------------- Runtime Check Support ------------------------- */ + +/* + For security, the main invariant is that malloc/free/etc never + writes to a static address other than malloc_state, unless static + malloc_state itself has been corrupted, which cannot occur via + malloc (because of these checks). In essence this means that we + believe all pointers, sizes, maps etc held in malloc_state, but + check all of those linked or offsetted from other embedded data + structures. These checks are interspersed with main code in a way + that tends to minimize their run-time cost. + + When FOOTERS is defined, in addition to range checking, we also + verify footer fields of inuse chunks, which can be used guarantee + that the mstate controlling malloc/free is intact. This is a + streamlined version of the approach described by William Robertson + et al in "Run-time Detection of Heap-based Overflows" LISA'03 + http://www.usenix.org/events/lisa03/tech/robertson.html The footer + of an inuse chunk holds the xor of its mstate and a random seed, + that is checked upon calls to free() and realloc(). This is + (probablistically) unguessable from outside the program, but can be + computed by any code successfully malloc'ing any chunk, so does not + itself provide protection against code that has already broken + security through some other means. Unlike Robertson et al, we + always dynamically check addresses of all offset chunks (previous, + next, etc). This turns out to be cheaper than relying on hashes. +*/ + +#if !INSECURE +/* Check if address a is at least as high as any from MORECORE or MMAP */ +#define ok_address(M, a) ((char*)(a) >= (M)->least_addr) +/* Check if address of next chunk n is higher than base chunk p */ +#define ok_next(p, n) ((char*)(p) < (char*)(n)) +/* Check if p has its cinuse bit on */ +#define ok_cinuse(p) cinuse(p) +/* Check if p has its pinuse bit on */ +#define ok_pinuse(p) pinuse(p) + +#else /* !INSECURE */ +#define ok_address(M, a) (1) +#define ok_next(b, n) (1) +#define ok_cinuse(p) (1) +#define ok_pinuse(p) (1) +#endif /* !INSECURE */ + +#if (FOOTERS && !INSECURE) +/* Check if (alleged) mstate m has expected magic field */ +#define ok_magic(M) ((M)->magic == mparams.magic) +#else /* (FOOTERS && !INSECURE) */ +#define ok_magic(M) (1) +#endif /* (FOOTERS && !INSECURE) */ + + +/* In gcc, use __builtin_expect to minimize impact of checks */ +#if !INSECURE +#if defined(__GNUC__) && __GNUC__ >= 3 +#define RTCHECK(e) __builtin_expect(e, 1) +#else /* GNUC */ +#define RTCHECK(e) (e) +#endif /* GNUC */ +#else /* !INSECURE */ +#define RTCHECK(e) (1) +#endif /* !INSECURE */ + +/* macros to set up inuse chunks with or without footers */ + +#if !FOOTERS + +#define mark_inuse_foot(M,p,s) + +/* Set cinuse bit and pinuse bit of next chunk */ +#define set_inuse(M,p,s)\ + ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ + ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) + +/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ +#define set_inuse_and_pinuse(M,p,s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) + +/* Set size, cinuse and pinuse bit of this chunk */ +#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) + +#else /* FOOTERS */ + +/* Set foot of inuse chunk to be xor of mstate and seed */ +#define mark_inuse_foot(M,p,s)\ + (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) + +#define get_mstate_for(p)\ + ((mstate)(((mchunkptr)((char*)(p) +\ + (chunksize(p))))->prev_foot ^ mparams.magic)) + +#define set_inuse(M,p,s)\ + ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ + (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ + mark_inuse_foot(M,p,s)) + +#define set_inuse_and_pinuse(M,p,s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ + mark_inuse_foot(M,p,s)) + +#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + mark_inuse_foot(M, p, s)) + +#endif /* !FOOTERS */ + +/* ---------------------------- setting mparams -------------------------- */ + +/* Initialize mparams */ +static int init_mparams(void) { + if (mparams.page_size == 0) { + size_t s; + + mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; + mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; +#if MORECORE_CONTIGUOUS + mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; +#else /* MORECORE_CONTIGUOUS */ + mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; +#endif /* MORECORE_CONTIGUOUS */ + +#if (FOOTERS && !INSECURE) + { +#if USE_DEV_RANDOM + int fd; + unsigned char buf[sizeof(size_t)]; + /* Try to use /dev/urandom, else fall back on using time */ + if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && + read(fd, buf, sizeof(buf)) == sizeof(buf)) { + s = *((size_t *) buf); + close(fd); + } + else +#endif /* USE_DEV_RANDOM */ + s = (size_t)(time(0) ^ (size_t)0x55555555U); + + s |= (size_t)8U; /* ensure nonzero */ + s &= ~(size_t)7U; /* improve chances of fault for bad values */ + + } +#else /* (FOOTERS && !INSECURE) */ + s = (size_t)0x58585858U; +#endif /* (FOOTERS && !INSECURE) */ + ACQUIRE_MAGIC_INIT_LOCK(); + if (mparams.magic == 0) { + mparams.magic = s; + /* Set up lock for main malloc area */ + INITIAL_LOCK(&gm->mutex); + gm->mflags = mparams.default_mflags; + } + RELEASE_MAGIC_INIT_LOCK(); + +#if !defined(WIN32) && !defined(__OS2__) + mparams.page_size = malloc_getpagesize; + mparams.granularity = ((DEFAULT_GRANULARITY != 0)? + DEFAULT_GRANULARITY : mparams.page_size); +#elif defined (__OS2__) + /* if low-memory is used, os2munmap() would break + if it were anything other than 64k */ + mparams.page_size = 4096u; + mparams.granularity = 65536u; +#else /* WIN32 */ + { + SYSTEM_INFO system_info; + GetSystemInfo(&system_info); + mparams.page_size = system_info.dwPageSize; + mparams.granularity = system_info.dwAllocationGranularity; + } +#endif /* WIN32 */ + + /* Sanity-check configuration: + size_t must be unsigned and as wide as pointer type. + ints must be at least 4 bytes. + alignment must be at least 8. + Alignment, min chunk size, and page size must all be powers of 2. + */ + if ((sizeof(size_t) != sizeof(char*)) || + (MAX_SIZE_T < MIN_CHUNK_SIZE) || + (sizeof(int) < 4) || + (MALLOC_ALIGNMENT < (size_t)8U) || + ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || + ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || + ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) || + ((mparams.page_size & (mparams.page_size-SIZE_T_ONE)) != 0)) + ABORT; + } + return 0; +} + +/* support for mallopt */ +static int change_mparam(int param_number, int value) { + size_t val = (size_t)value; + init_mparams(); + switch(param_number) { + case M_TRIM_THRESHOLD: + mparams.trim_threshold = val; + return 1; + case M_GRANULARITY: + if (val >= mparams.page_size && ((val & (val-1)) == 0)) { + mparams.granularity = val; + return 1; + } + else + return 0; + case M_MMAP_THRESHOLD: + mparams.mmap_threshold = val; + return 1; + default: + return 0; + } +} + +#if DEBUG +/* ------------------------- Debugging Support --------------------------- */ + +/* Check properties of any chunk, whether free, inuse, mmapped etc */ +static void do_check_any_chunk(mstate m, mchunkptr p) { + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); +} + +/* Check properties of top chunk */ +static void do_check_top_chunk(mstate m, mchunkptr p) { + msegmentptr sp = segment_holding(m, (char*)p); + size_t sz = chunksize(p); + assert(sp != 0); + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); + assert(sz == m->topsize); + assert(sz > 0); + assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); + assert(pinuse(p)); + assert(!next_pinuse(p)); +} + +/* Check properties of (inuse) mmapped chunks */ +static void do_check_mmapped_chunk(mstate m, mchunkptr p) { + size_t sz = chunksize(p); + size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD); + assert(is_mmapped(p)); + assert(use_mmap(m)); + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); + assert(!is_small(sz)); + assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); + assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); + assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); +} + +/* Check properties of inuse chunks */ +static void do_check_inuse_chunk(mstate m, mchunkptr p) { + do_check_any_chunk(m, p); + assert(cinuse(p)); + assert(next_pinuse(p)); + /* If not pinuse and not mmapped, previous chunk has OK offset */ + assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); + if (is_mmapped(p)) + do_check_mmapped_chunk(m, p); +} + +/* Check properties of free chunks */ +static void do_check_free_chunk(mstate m, mchunkptr p) { + size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); + mchunkptr next = chunk_plus_offset(p, sz); + do_check_any_chunk(m, p); + assert(!cinuse(p)); + assert(!next_pinuse(p)); + assert (!is_mmapped(p)); + if (p != m->dv && p != m->top) { + if (sz >= MIN_CHUNK_SIZE) { + assert((sz & CHUNK_ALIGN_MASK) == 0); + assert(is_aligned(chunk2mem(p))); + assert(next->prev_foot == sz); + assert(pinuse(p)); + assert (next == m->top || cinuse(next)); + assert(p->fd->bk == p); + assert(p->bk->fd == p); + } + else /* markers are always of size SIZE_T_SIZE */ + assert(sz == SIZE_T_SIZE); + } +} + +/* Check properties of malloced chunks at the point they are malloced */ +static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); + do_check_inuse_chunk(m, p); + assert((sz & CHUNK_ALIGN_MASK) == 0); + assert(sz >= MIN_CHUNK_SIZE); + assert(sz >= s); + /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ + assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); + } +} + +/* Check a tree and its subtrees. */ +static void do_check_tree(mstate m, tchunkptr t) { + tchunkptr head = 0; + tchunkptr u = t; + bindex_t tindex = t->index; + size_t tsize = chunksize(t); + bindex_t idx; + compute_tree_index(tsize, idx); + assert(tindex == idx); + assert(tsize >= MIN_LARGE_SIZE); + assert(tsize >= minsize_for_tree_index(idx)); + assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); + + do { /* traverse through chain of same-sized nodes */ + do_check_any_chunk(m, ((mchunkptr)u)); + assert(u->index == tindex); + assert(chunksize(u) == tsize); + assert(!cinuse(u)); + assert(!next_pinuse(u)); + assert(u->fd->bk == u); + assert(u->bk->fd == u); + if (u->parent == 0) { + assert(u->child[0] == 0); + assert(u->child[1] == 0); + } + else { + assert(head == 0); /* only one node on chain has parent */ + head = u; + assert(u->parent != u); + assert (u->parent->child[0] == u || + u->parent->child[1] == u || + *((tbinptr*)(u->parent)) == u); + if (u->child[0] != 0) { + assert(u->child[0]->parent == u); + assert(u->child[0] != u); + do_check_tree(m, u->child[0]); + } + if (u->child[1] != 0) { + assert(u->child[1]->parent == u); + assert(u->child[1] != u); + do_check_tree(m, u->child[1]); + } + if (u->child[0] != 0 && u->child[1] != 0) { + assert(chunksize(u->child[0]) < chunksize(u->child[1])); + } + } + u = u->fd; + } while (u != t); + assert(head != 0); +} + +/* Check all the chunks in a treebin. */ +static void do_check_treebin(mstate m, bindex_t i) { + tbinptr* tb = treebin_at(m, i); + tchunkptr t = *tb; + int empty = (m->treemap & (1U << i)) == 0; + if (t == 0) + assert(empty); + if (!empty) + do_check_tree(m, t); +} + +/* Check all the chunks in a smallbin. */ +static void do_check_smallbin(mstate m, bindex_t i) { + sbinptr b = smallbin_at(m, i); + mchunkptr p = b->bk; + unsigned int empty = (m->smallmap & (1U << i)) == 0; + if (p == b) + assert(empty); + if (!empty) { + for (; p != b; p = p->bk) { + size_t size = chunksize(p); + mchunkptr q; + /* each chunk claims to be free */ + do_check_free_chunk(m, p); + /* chunk belongs in bin */ + assert(small_index(size) == i); + assert(p->bk == b || chunksize(p->bk) == chunksize(p)); + /* chunk is followed by an inuse chunk */ + q = next_chunk(p); + if (q->head != FENCEPOST_HEAD) + do_check_inuse_chunk(m, q); + } + } +} + +/* Find x in a bin. Used in other check functions. */ +static int bin_find(mstate m, mchunkptr x) { + size_t size = chunksize(x); + if (is_small(size)) { + bindex_t sidx = small_index(size); + sbinptr b = smallbin_at(m, sidx); + if (smallmap_is_marked(m, sidx)) { + mchunkptr p = b; + do { + if (p == x) + return 1; + } while ((p = p->fd) != b); + } + } + else { + bindex_t tidx; + compute_tree_index(size, tidx); + if (treemap_is_marked(m, tidx)) { + tchunkptr t = *treebin_at(m, tidx); + size_t sizebits = size << leftshift_for_tree_index(tidx); + while (t != 0 && chunksize(t) != size) { + t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; + sizebits <<= 1; + } + if (t != 0) { + tchunkptr u = t; + do { + if (u == (tchunkptr)x) + return 1; + } while ((u = u->fd) != t); + } + } + } + return 0; +} + +/* Traverse each chunk and check it; return total */ +static size_t traverse_and_check(mstate m) { + size_t sum = 0; + if (is_initialized(m)) { + msegmentptr s = &m->seg; + sum += m->topsize + TOP_FOOT_SIZE; + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + mchunkptr lastq = 0; + assert(pinuse(q)); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + sum += chunksize(q); + if (cinuse(q)) { + assert(!bin_find(m, q)); + do_check_inuse_chunk(m, q); + } + else { + assert(q == m->dv || bin_find(m, q)); + assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */ + do_check_free_chunk(m, q); + } + lastq = q; + q = next_chunk(q); + } + s = s->next; + } + } + return sum; +} + +/* Check all properties of malloc_state. */ +static void do_check_malloc_state(mstate m) { + bindex_t i; + size_t total; + /* check bins */ + for (i = 0; i < NSMALLBINS; ++i) + do_check_smallbin(m, i); + for (i = 0; i < NTREEBINS; ++i) + do_check_treebin(m, i); + + if (m->dvsize != 0) { /* check dv chunk */ + do_check_any_chunk(m, m->dv); + assert(m->dvsize == chunksize(m->dv)); + assert(m->dvsize >= MIN_CHUNK_SIZE); + assert(bin_find(m, m->dv) == 0); + } + + if (m->top != 0) { /* check top chunk */ + do_check_top_chunk(m, m->top); + assert(m->topsize == chunksize(m->top)); + assert(m->topsize > 0); + assert(bin_find(m, m->top) == 0); + } + + total = traverse_and_check(m); + assert(total <= m->footprint); + assert(m->footprint <= m->max_footprint); +} +#endif /* DEBUG */ + +/* ----------------------------- statistics ------------------------------ */ + +#if !NO_MALLINFO +static struct mallinfo internal_mallinfo(mstate m) { + struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + if (!PREACTION(m)) { + check_malloc_state(m); + if (is_initialized(m)) { + size_t nfree = SIZE_T_ONE; /* top always free */ + size_t mfree = m->topsize + TOP_FOOT_SIZE; + size_t sum = mfree; + msegmentptr s = &m->seg; + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + size_t sz = chunksize(q); + sum += sz; + if (!cinuse(q)) { + mfree += sz; + ++nfree; + } + q = next_chunk(q); + } + s = s->next; + } + + nm.arena = sum; + nm.ordblks = nfree; + nm.hblkhd = m->footprint - sum; + nm.usmblks = m->max_footprint; + nm.uordblks = m->footprint - mfree; + nm.fordblks = mfree; + nm.keepcost = m->topsize; + } + + POSTACTION(m); + } + return nm; +} +#endif /* !NO_MALLINFO */ + +static void internal_malloc_stats(mstate m) { + if (!PREACTION(m)) { + size_t maxfp = 0; + size_t fp = 0; + size_t used = 0; + check_malloc_state(m); + if (is_initialized(m)) { + msegmentptr s = &m->seg; + maxfp = m->max_footprint; + fp = m->footprint; + used = fp - (m->topsize + TOP_FOOT_SIZE); + + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + if (!cinuse(q)) + used -= chunksize(q); + q = next_chunk(q); + } + s = s->next; + } + } + + fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); + fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); + fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); + + POSTACTION(m); + } +} + +/* ----------------------- Operations on smallbins ----------------------- */ + +/* + Various forms of linking and unlinking are defined as macros. Even + the ones for trees, which are very long but have very short typical + paths. This is ugly but reduces reliance on inlining support of + compilers. +*/ + +/* Link a free chunk into a smallbin */ +#define insert_small_chunk(M, P, S) {\ + bindex_t I = small_index(S);\ + mchunkptr B = smallbin_at(M, I);\ + mchunkptr F = B;\ + assert(S >= MIN_CHUNK_SIZE);\ + if (!smallmap_is_marked(M, I))\ + mark_smallmap(M, I);\ + else if (RTCHECK(ok_address(M, B->fd)))\ + F = B->fd;\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + B->fd = P;\ + F->bk = P;\ + P->fd = F;\ + P->bk = B;\ +} + +/* Unlink a chunk from a smallbin */ +#define unlink_small_chunk(M, P, S) {\ + mchunkptr F = P->fd;\ + mchunkptr B = P->bk;\ + bindex_t I = small_index(S);\ + assert(P != B);\ + assert(P != F);\ + assert(chunksize(P) == small_index2size(I));\ + if (F == B)\ + clear_smallmap(M, I);\ + else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ + (B == smallbin_at(M,I) || ok_address(M, B)))) {\ + F->bk = B;\ + B->fd = F;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ +} + +/* Unlink the first chunk from a smallbin */ +#define unlink_first_small_chunk(M, B, P, I) {\ + mchunkptr F = P->fd;\ + assert(P != B);\ + assert(P != F);\ + assert(chunksize(P) == small_index2size(I));\ + if (B == F)\ + clear_smallmap(M, I);\ + else if (RTCHECK(ok_address(M, F))) {\ + B->fd = F;\ + F->bk = B;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ +} + +/* Replace dv node, binning the old one */ +/* Used only when dvsize known to be small */ +#define replace_dv(M, P, S) {\ + size_t DVS = M->dvsize;\ + if (DVS != 0) {\ + mchunkptr DV = M->dv;\ + assert(is_small(DVS));\ + insert_small_chunk(M, DV, DVS);\ + }\ + M->dvsize = S;\ + M->dv = P;\ +} + +/* ------------------------- Operations on trees ------------------------- */ + +/* Insert chunk into tree */ +#define insert_large_chunk(M, X, S) {\ + tbinptr* H;\ + bindex_t I;\ + compute_tree_index(S, I);\ + H = treebin_at(M, I);\ + X->index = I;\ + X->child[0] = X->child[1] = 0;\ + if (!treemap_is_marked(M, I)) {\ + mark_treemap(M, I);\ + *H = X;\ + X->parent = (tchunkptr)H;\ + X->fd = X->bk = X;\ + }\ + else {\ + tchunkptr T = *H;\ + size_t K = S << leftshift_for_tree_index(I);\ + for (;;) {\ + if (chunksize(T) != S) {\ + tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ + K <<= 1;\ + if (*C != 0)\ + T = *C;\ + else if (RTCHECK(ok_address(M, C))) {\ + *C = X;\ + X->parent = T;\ + X->fd = X->bk = X;\ + break;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + break;\ + }\ + }\ + else {\ + tchunkptr F = T->fd;\ + if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ + T->fd = F->bk = X;\ + X->fd = F;\ + X->bk = T;\ + X->parent = 0;\ + break;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + break;\ + }\ + }\ + }\ + }\ +} + +/* + Unlink steps: + + 1. If x is a chained node, unlink it from its same-sized fd/bk links + and choose its bk node as its replacement. + 2. If x was the last node of its size, but not a leaf node, it must + be replaced with a leaf node (not merely one with an open left or + right), to make sure that lefts and rights of descendents + correspond properly to bit masks. We use the rightmost descendent + of x. We could use any other leaf, but this is easy to locate and + tends to counteract removal of leftmosts elsewhere, and so keeps + paths shorter than minimally guaranteed. This doesn't loop much + because on average a node in a tree is near the bottom. + 3. If x is the base of a chain (i.e., has parent links) relink + x's parent and children to x's replacement (or null if none). +*/ + +#define unlink_large_chunk(M, X) {\ + tchunkptr XP = X->parent;\ + tchunkptr R;\ + if (X->bk != X) {\ + tchunkptr F = X->fd;\ + R = X->bk;\ + if (RTCHECK(ok_address(M, F))) {\ + F->bk = R;\ + R->fd = F;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + else {\ + tchunkptr* RP;\ + if (((R = *(RP = &(X->child[1]))) != 0) ||\ + ((R = *(RP = &(X->child[0]))) != 0)) {\ + tchunkptr* CP;\ + while ((*(CP = &(R->child[1])) != 0) ||\ + (*(CP = &(R->child[0])) != 0)) {\ + R = *(RP = CP);\ + }\ + if (RTCHECK(ok_address(M, RP)))\ + *RP = 0;\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + }\ + if (XP != 0) {\ + tbinptr* H = treebin_at(M, X->index);\ + if (X == *H) {\ + if ((*H = R) == 0) \ + clear_treemap(M, X->index);\ + }\ + else if (RTCHECK(ok_address(M, XP))) {\ + if (XP->child[0] == X) \ + XP->child[0] = R;\ + else \ + XP->child[1] = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + if (R != 0) {\ + if (RTCHECK(ok_address(M, R))) {\ + tchunkptr C0, C1;\ + R->parent = XP;\ + if ((C0 = X->child[0]) != 0) {\ + if (RTCHECK(ok_address(M, C0))) {\ + R->child[0] = C0;\ + C0->parent = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + if ((C1 = X->child[1]) != 0) {\ + if (RTCHECK(ok_address(M, C1))) {\ + R->child[1] = C1;\ + C1->parent = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ +} + +/* Relays to large vs small bin operations */ + +#define insert_chunk(M, P, S)\ + if (is_small(S)) insert_small_chunk(M, P, S)\ + else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } + +#define unlink_chunk(M, P, S)\ + if (is_small(S)) unlink_small_chunk(M, P, S)\ + else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } + + +/* Relays to internal calls to malloc/free from realloc, memalign etc */ + +#if ONLY_MSPACES +#define internal_malloc(m, b) mspace_malloc(m, b) +#define internal_free(m, mem) mspace_free(m,mem); +#else /* ONLY_MSPACES */ +#if MSPACES +#define internal_malloc(m, b)\ + (m == gm)? dlmalloc(b) : mspace_malloc(m, b) +#define internal_free(m, mem)\ + if (m == gm) dlfree(mem); else mspace_free(m,mem); +#else /* MSPACES */ +#define internal_malloc(m, b) dlmalloc(b) +#define internal_free(m, mem) dlfree(mem) +#endif /* MSPACES */ +#endif /* ONLY_MSPACES */ + +/* ----------------------- Direct-mmapping chunks ----------------------- */ + +/* + Directly mmapped chunks are set up with an offset to the start of + the mmapped region stored in the prev_foot field of the chunk. This + allows reconstruction of the required argument to MUNMAP when freed, + and also allows adjustment of the returned chunk to meet alignment + requirements (especially in memalign). There is also enough space + allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain + the PINUSE bit so frees can be checked. +*/ + +/* Malloc using mmap */ +static void* mmap_alloc(mstate m, size_t nb) { + size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + if (mmsize > nb) { /* Check for wrap around 0 */ + char* mm = (char*)(DIRECT_MMAP(mmsize)); + if (mm != CMFAIL) { + size_t offset = align_offset(chunk2mem(mm)); + size_t psize = mmsize - offset - MMAP_FOOT_PAD; + mchunkptr p = (mchunkptr)(mm + offset); + p->prev_foot = offset | IS_MMAPPED_BIT; + (p)->head = (psize|CINUSE_BIT); + mark_inuse_foot(m, p, psize); + chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; + chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; + + if (mm < m->least_addr) + m->least_addr = mm; + if ((m->footprint += mmsize) > m->max_footprint) + m->max_footprint = m->footprint; + assert(is_aligned(chunk2mem(p))); + check_mmapped_chunk(m, p); + return chunk2mem(p); + } + } + return 0; +} + +/* Realloc using mmap */ +static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { + size_t oldsize = chunksize(oldp); + if (is_small(nb)) /* Can't shrink mmap regions below small size */ + return 0; + /* Keep old chunk if big enough but not too big */ + if (oldsize >= nb + SIZE_T_SIZE && + (oldsize - nb) <= (mparams.granularity << 1)) + return oldp; + else { + size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT; + size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; + size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES + + CHUNK_ALIGN_MASK); + char* cp = (char*)CALL_MREMAP((char*)oldp - offset, + oldmmsize, newmmsize, 1); + if (cp != CMFAIL) { + mchunkptr newp = (mchunkptr)(cp + offset); + size_t psize = newmmsize - offset - MMAP_FOOT_PAD; + newp->head = (psize|CINUSE_BIT); + mark_inuse_foot(m, newp, psize); + chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; + chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; + + if (cp < m->least_addr) + m->least_addr = cp; + if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) + m->max_footprint = m->footprint; + check_mmapped_chunk(m, newp); + return newp; + } + } + return 0; +} + +/* -------------------------- mspace management -------------------------- */ + +/* Initialize top chunk and its size */ +static void init_top(mstate m, mchunkptr p, size_t psize) { + /* Ensure alignment */ + size_t offset = align_offset(chunk2mem(p)); + p = (mchunkptr)((char*)p + offset); + psize -= offset; + + m->top = p; + m->topsize = psize; + p->head = psize | PINUSE_BIT; + /* set size of fake trailing chunk holding overhead space only once */ + chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; + m->trim_check = mparams.trim_threshold; /* reset on each update */ +} + +/* Initialize bins for a new mstate that is otherwise zeroed out */ +static void init_bins(mstate m) { + /* Establish circular links for smallbins */ + bindex_t i; + for (i = 0; i < NSMALLBINS; ++i) { + sbinptr bin = smallbin_at(m,i); + bin->fd = bin->bk = bin; + } +} + +#if PROCEED_ON_ERROR + +/* default corruption action */ +static void reset_on_error(mstate m) { + int i; + ++malloc_corruption_error_count; + /* Reinitialize fields to forget about all memory */ + m->smallbins = m->treebins = 0; + m->dvsize = m->topsize = 0; + m->seg.base = 0; + m->seg.size = 0; + m->seg.next = 0; + m->top = m->dv = 0; + for (i = 0; i < NTREEBINS; ++i) + *treebin_at(m, i) = 0; + init_bins(m); +} +#endif /* PROCEED_ON_ERROR */ + +/* Allocate chunk and prepend remainder with chunk in successor base. */ +static void* prepend_alloc(mstate m, char* newbase, char* oldbase, + size_t nb) { + mchunkptr p = align_as_chunk(newbase); + mchunkptr oldfirst = align_as_chunk(oldbase); + size_t psize = (char*)oldfirst - (char*)p; + mchunkptr q = chunk_plus_offset(p, nb); + size_t qsize = psize - nb; + set_size_and_pinuse_of_inuse_chunk(m, p, nb); + + assert((char*)oldfirst > (char*)q); + assert(pinuse(oldfirst)); + assert(qsize >= MIN_CHUNK_SIZE); + + /* consolidate remainder with first chunk of old base */ + if (oldfirst == m->top) { + size_t tsize = m->topsize += qsize; + m->top = q; + q->head = tsize | PINUSE_BIT; + check_top_chunk(m, q); + } + else if (oldfirst == m->dv) { + size_t dsize = m->dvsize += qsize; + m->dv = q; + set_size_and_pinuse_of_free_chunk(q, dsize); + } + else { + if (!cinuse(oldfirst)) { + size_t nsize = chunksize(oldfirst); + unlink_chunk(m, oldfirst, nsize); + oldfirst = chunk_plus_offset(oldfirst, nsize); + qsize += nsize; + } + set_free_with_pinuse(q, qsize, oldfirst); + insert_chunk(m, q, qsize); + check_free_chunk(m, q); + } + + check_malloced_chunk(m, chunk2mem(p), nb); + return chunk2mem(p); +} + + +/* Add a segment to hold a new noncontiguous region */ +static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { + /* Determine locations and sizes of segment, fenceposts, old top */ + char* old_top = (char*)m->top; + msegmentptr oldsp = segment_holding(m, old_top); + char* old_end = oldsp->base + oldsp->size; + size_t ssize = pad_request(sizeof(struct malloc_segment)); + char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + size_t offset = align_offset(chunk2mem(rawsp)); + char* asp = rawsp + offset; + char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; + mchunkptr sp = (mchunkptr)csp; + msegmentptr ss = (msegmentptr)(chunk2mem(sp)); + mchunkptr tnext = chunk_plus_offset(sp, ssize); + mchunkptr p = tnext; + int nfences = 0; + + /* reset top to new space */ + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + + /* Set up segment record */ + assert(is_aligned(ss)); + set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); + *ss = m->seg; /* Push current record */ + m->seg.base = tbase; + m->seg.size = tsize; + set_segment_flags(&m->seg, mmapped); + m->seg.next = ss; + + /* Insert trailing fenceposts */ + for (;;) { + mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); + p->head = FENCEPOST_HEAD; + ++nfences; + if ((char*)(&(nextp->head)) < old_end) + p = nextp; + else + break; + } + assert(nfences >= 2); + + /* Insert the rest of old top into a bin as an ordinary free chunk */ + if (csp != old_top) { + mchunkptr q = (mchunkptr)old_top; + size_t psize = csp - old_top; + mchunkptr tn = chunk_plus_offset(q, psize); + set_free_with_pinuse(q, psize, tn); + insert_chunk(m, q, psize); + } + + check_top_chunk(m, m->top); +} + +/* -------------------------- System allocation -------------------------- */ + +/* Get memory from system using MORECORE or MMAP */ +static void* sys_alloc(mstate m, size_t nb) { + char* tbase = CMFAIL; + size_t tsize = 0; + flag_t mmap_flag = 0; + + init_mparams(); + + /* Directly map large chunks */ + if (use_mmap(m) && nb >= mparams.mmap_threshold) { + void* mem = mmap_alloc(m, nb); + if (mem != 0) + return mem; + } + + /* + Try getting memory in any of three ways (in most-preferred to + least-preferred order): + 1. A call to MORECORE that can normally contiguously extend memory. + (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or + or main space is mmapped or a previous contiguous call failed) + 2. A call to MMAP new space (disabled if not HAVE_MMAP). + Note that under the default settings, if MORECORE is unable to + fulfill a request, and HAVE_MMAP is true, then mmap is + used as a noncontiguous system allocator. This is a useful backup + strategy for systems with holes in address spaces -- in this case + sbrk cannot contiguously expand the heap, but mmap may be able to + find space. + 3. A call to MORECORE that cannot usually contiguously extend memory. + (disabled if not HAVE_MORECORE) + */ + + if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { + char* br = CMFAIL; + msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); + size_t asize = 0; + ACQUIRE_MORECORE_LOCK(); + + if (ss == 0) { /* First time through or recovery */ + char* base = (char*)CALL_MORECORE(0); + if (base != CMFAIL) { + asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); + /* Adjust to end on a page boundary */ + if (!is_page_aligned(base)) + asize += (page_align((size_t)base) - (size_t)base); + /* Can't call MORECORE if size is negative when treated as signed */ + if (asize < HALF_MAX_SIZE_T && + (br = (char*)(CALL_MORECORE(asize))) == base) { + tbase = base; + tsize = asize; + } + } + } + else { + /* Subtract out existing available top space from MORECORE request. */ + asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE); + /* Use mem here only if it did continuously extend old space */ + if (asize < HALF_MAX_SIZE_T && + (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { + tbase = br; + tsize = asize; + } + } + + if (tbase == CMFAIL) { /* Cope with partial failure */ + if (br != CMFAIL) { /* Try to use/extend the space we did get */ + if (asize < HALF_MAX_SIZE_T && + asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { + size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize); + if (esize < HALF_MAX_SIZE_T) { + char* end = (char*)CALL_MORECORE(esize); + if (end != CMFAIL) + asize += esize; + else { /* Can't use; try to release */ + (void)CALL_MORECORE(-asize); + br = CMFAIL; + } + } + } + } + if (br != CMFAIL) { /* Use the space we did get */ + tbase = br; + tsize = asize; + } + else + disable_contiguous(m); /* Don't try contiguous path in the future */ + } + + RELEASE_MORECORE_LOCK(); + } + + if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ + size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; + size_t rsize = granularity_align(req); + if (rsize > nb) { /* Fail if wraps around zero */ + char* mp = (char*)(CALL_MMAP(rsize)); + if (mp != CMFAIL) { + tbase = mp; + tsize = rsize; + mmap_flag = IS_MMAPPED_BIT; + } + } + } + + if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ + size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); + if (asize < HALF_MAX_SIZE_T) { + char* br = CMFAIL; + char* end = CMFAIL; + ACQUIRE_MORECORE_LOCK(); + br = (char*)(CALL_MORECORE(asize)); + end = (char*)(CALL_MORECORE(0)); + RELEASE_MORECORE_LOCK(); + if (br != CMFAIL && end != CMFAIL && br < end) { + size_t ssize = end - br; + if (ssize > nb + TOP_FOOT_SIZE) { + tbase = br; + tsize = ssize; + } + } + } + } + + if (tbase != CMFAIL) { + + if ((m->footprint += tsize) > m->max_footprint) + m->max_footprint = m->footprint; + + if (!is_initialized(m)) { /* first-time initialization */ + m->seg.base = m->least_addr = tbase; + m->seg.size = tsize; + set_segment_flags(&m->seg, mmap_flag); + m->magic = mparams.magic; + init_bins(m); + if (is_global(m)) + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + else { + /* Offset top by embedded malloc_state */ + mchunkptr mn = next_chunk(mem2chunk(m)); + init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); + } + } + + else { + /* Try to merge with an existing segment */ + msegmentptr sp = &m->seg; + while (sp != 0 && tbase != sp->base + sp->size) + sp = sp->next; + if (sp != 0 && + !is_extern_segment(sp) && + check_segment_merge(sp, tbase, tsize) && + (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag && + segment_holds(sp, m->top)) { /* append */ + sp->size += tsize; + init_top(m, m->top, m->topsize + tsize); + } + else { + if (tbase < m->least_addr) + m->least_addr = tbase; + sp = &m->seg; + while (sp != 0 && sp->base != tbase + tsize) + sp = sp->next; + if (sp != 0 && + !is_extern_segment(sp) && + check_segment_merge(sp, tbase, tsize) && + (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag) { + char* oldbase = sp->base; + sp->base = tbase; + sp->size += tsize; + return prepend_alloc(m, tbase, oldbase, nb); + } + else + add_segment(m, tbase, tsize, mmap_flag); + } + } + + if (nb < m->topsize) { /* Allocate from new or extended top space */ + size_t rsize = m->topsize -= nb; + mchunkptr p = m->top; + mchunkptr r = m->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(m, p, nb); + check_top_chunk(m, m->top); + check_malloced_chunk(m, chunk2mem(p), nb); + return chunk2mem(p); + } + } + + MALLOC_FAILURE_ACTION; + return 0; +} + +/* ----------------------- system deallocation -------------------------- */ + +/* Unmap and unlink any mmapped segments that don't contain used chunks */ +static size_t release_unused_segments(mstate m) { + size_t released = 0; + msegmentptr pred = &m->seg; + msegmentptr sp = pred->next; + while (sp != 0) { + char* base = sp->base; + size_t size = sp->size; + msegmentptr next = sp->next; + if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { + mchunkptr p = align_as_chunk(base); + size_t psize = chunksize(p); + /* Can unmap if first chunk holds entire segment and not pinned */ + if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { + tchunkptr tp = (tchunkptr)p; + assert(segment_holds(sp, (char*)sp)); + if (p == m->dv) { + m->dv = 0; + m->dvsize = 0; + } + else { + unlink_large_chunk(m, tp); + } + if (CALL_MUNMAP(base, size) == 0) { + released += size; + m->footprint -= size; + /* unlink obsoleted record */ + sp = pred; + sp->next = next; + } + else { /* back out if cannot unmap */ + insert_large_chunk(m, tp, psize); + } + } + } + pred = sp; + sp = next; + } + return released; +} + +static int sys_trim(mstate m, size_t pad) { + size_t released = 0; + if (pad < MAX_REQUEST && is_initialized(m)) { + pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ + + if (m->topsize > pad) { + /* Shrink top space in granularity-size units, keeping at least one */ + size_t unit = mparams.granularity; + size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - + SIZE_T_ONE) * unit; + msegmentptr sp = segment_holding(m, (char*)m->top); + + if (!is_extern_segment(sp)) { + if (is_mmapped_segment(sp)) { + if (HAVE_MMAP && + sp->size >= extra && + !has_segment_link(m, sp)) { /* can't shrink if pinned */ + size_t newsize = sp->size - extra; + /* Prefer mremap, fall back to munmap */ + if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || + (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { + released = extra; + } + } + } + else if (HAVE_MORECORE) { + if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ + extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; + ACQUIRE_MORECORE_LOCK(); + { + /* Make sure end of memory is where we last set it. */ + char* old_br = (char*)(CALL_MORECORE(0)); + if (old_br == sp->base + sp->size) { + char* rel_br = (char*)(CALL_MORECORE(-extra)); + char* new_br = (char*)(CALL_MORECORE(0)); + if (rel_br != CMFAIL && new_br < old_br) + released = old_br - new_br; + } + } + RELEASE_MORECORE_LOCK(); + } + } + + if (released != 0) { + sp->size -= released; + m->footprint -= released; + init_top(m, m->top, m->topsize - released); + check_top_chunk(m, m->top); + } + } + + /* Unmap any unused mmapped segments */ + if (HAVE_MMAP) + released += release_unused_segments(m); + + /* On failure, disable autotrim to avoid repeated failed future calls */ + if (released == 0) + m->trim_check = MAX_SIZE_T; + } + + return (released != 0)? 1 : 0; +} + +/* ---------------------------- malloc support --------------------------- */ + +/* allocate a large request from the best fitting chunk in a treebin */ +static void* tmalloc_large(mstate m, size_t nb) { + tchunkptr v = 0; + size_t rsize = -nb; /* Unsigned negation */ + tchunkptr t; + bindex_t idx; + compute_tree_index(nb, idx); + + if ((t = *treebin_at(m, idx)) != 0) { + /* Traverse tree for this bin looking for node with size == nb */ + size_t sizebits = nb << leftshift_for_tree_index(idx); + tchunkptr rst = 0; /* The deepest untaken right subtree */ + for (;;) { + tchunkptr rt; + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + v = t; + if ((rsize = trem) == 0) + break; + } + rt = t->child[1]; + t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; + if (rt != 0 && rt != t) + rst = rt; + if (t == 0) { + t = rst; /* set t to least subtree holding sizes > nb */ + break; + } + sizebits <<= 1; + } + } + + if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ + binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; + if (leftbits != 0) { + bindex_t i; + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + t = *treebin_at(m, i); + } + } + + while (t != 0) { /* find smallest of tree or subtree */ + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + rsize = trem; + v = t; + } + t = leftmost_child(t); + } + + /* If dv is a better fit, return 0 so malloc will use it */ + if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { + if (RTCHECK(ok_address(m, v))) { /* split */ + mchunkptr r = chunk_plus_offset(v, nb); + assert(chunksize(v) == rsize + nb); + if (RTCHECK(ok_next(v, r))) { + unlink_large_chunk(m, v); + if (rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(m, v, (rsize + nb)); + else { + set_size_and_pinuse_of_inuse_chunk(m, v, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + insert_chunk(m, r, rsize); + } + return chunk2mem(v); + } + } + CORRUPTION_ERROR_ACTION(m); + } + return 0; +} + +/* allocate a small request from the best fitting chunk in a treebin */ +static void* tmalloc_small(mstate m, size_t nb) { + tchunkptr t, v; + size_t rsize; + bindex_t i; + binmap_t leastbit = least_bit(m->treemap); + compute_bit2idx(leastbit, i); + + v = t = *treebin_at(m, i); + rsize = chunksize(t) - nb; + + while ((t = leftmost_child(t)) != 0) { + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + rsize = trem; + v = t; + } + } + + if (RTCHECK(ok_address(m, v))) { + mchunkptr r = chunk_plus_offset(v, nb); + assert(chunksize(v) == rsize + nb); + if (RTCHECK(ok_next(v, r))) { + unlink_large_chunk(m, v); + if (rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(m, v, (rsize + nb)); + else { + set_size_and_pinuse_of_inuse_chunk(m, v, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(m, r, rsize); + } + return chunk2mem(v); + } + } + + CORRUPTION_ERROR_ACTION(m); + return 0; +} + +/* --------------------------- realloc support --------------------------- */ + +static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { + if (bytes >= MAX_REQUEST) { + MALLOC_FAILURE_ACTION; + return 0; + } + if (!PREACTION(m)) { + mchunkptr oldp = mem2chunk(oldmem); + size_t oldsize = chunksize(oldp); + mchunkptr next = chunk_plus_offset(oldp, oldsize); + mchunkptr newp = 0; + void* extra = 0; + + /* Try to either shrink or extend into top. Else malloc-copy-free */ + + if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) && + ok_next(oldp, next) && ok_pinuse(next))) { + size_t nb = request2size(bytes); + if (is_mmapped(oldp)) + newp = mmap_resize(m, oldp, nb); + else if (oldsize >= nb) { /* already big enough */ + size_t rsize = oldsize - nb; + newp = oldp; + if (rsize >= MIN_CHUNK_SIZE) { + mchunkptr remainder = chunk_plus_offset(newp, nb); + set_inuse(m, newp, nb); + set_inuse(m, remainder, rsize); + extra = chunk2mem(remainder); + } + } + else if (next == m->top && oldsize + m->topsize > nb) { + /* Expand into top */ + size_t newsize = oldsize + m->topsize; + size_t newtopsize = newsize - nb; + mchunkptr newtop = chunk_plus_offset(oldp, nb); + set_inuse(m, oldp, nb); + newtop->head = newtopsize |PINUSE_BIT; + m->top = newtop; + m->topsize = newtopsize; + newp = oldp; + } + } + else { + USAGE_ERROR_ACTION(m, oldmem); + POSTACTION(m); + return 0; + } + + POSTACTION(m); + + if (newp != 0) { + if (extra != 0) { + internal_free(m, extra); + } + check_inuse_chunk(m, newp); + return chunk2mem(newp); + } + else { + void* newmem = internal_malloc(m, bytes); + if (newmem != 0) { + size_t oc = oldsize - overhead_for(oldp); + memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); + internal_free(m, oldmem); + } + return newmem; + } + } + return 0; +} + +/* --------------------------- memalign support -------------------------- */ + +static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { + if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ + return internal_malloc(m, bytes); + if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ + alignment = MIN_CHUNK_SIZE; + if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ + size_t a = MALLOC_ALIGNMENT << 1; + while (a < alignment) a <<= 1; + alignment = a; + } + + if (bytes >= MAX_REQUEST - alignment) { + if (m != 0) { /* Test isn't needed but avoids compiler warning */ + MALLOC_FAILURE_ACTION; + } + } + else { + size_t nb = request2size(bytes); + size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; + char* mem = (char*)internal_malloc(m, req); + if (mem != 0) { + void* leader = 0; + void* trailer = 0; + mchunkptr p = mem2chunk(mem); + + if (PREACTION(m)) return 0; + if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ + /* + Find an aligned spot inside chunk. Since we need to give + back leading space in a chunk of at least MIN_CHUNK_SIZE, if + the first calculation places us at a spot with less than + MIN_CHUNK_SIZE leader, we can move to the next aligned spot. + We've allocated enough total room so that this is always + possible. + */ + char* br = (char*)mem2chunk((size_t)(((size_t)(mem + + alignment - + SIZE_T_ONE)) & + -alignment)); + char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? + br : br+alignment; + mchunkptr newp = (mchunkptr)pos; + size_t leadsize = pos - (char*)(p); + size_t newsize = chunksize(p) - leadsize; + + if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ + newp->prev_foot = p->prev_foot + leadsize; + newp->head = (newsize|CINUSE_BIT); + } + else { /* Otherwise, give back leader, use the rest */ + set_inuse(m, newp, newsize); + set_inuse(m, p, leadsize); + leader = chunk2mem(p); + } + p = newp; + } + + /* Give back spare room at the end */ + if (!is_mmapped(p)) { + size_t size = chunksize(p); + if (size > nb + MIN_CHUNK_SIZE) { + size_t remainder_size = size - nb; + mchunkptr remainder = chunk_plus_offset(p, nb); + set_inuse(m, p, nb); + set_inuse(m, remainder, remainder_size); + trailer = chunk2mem(remainder); + } + } + + assert (chunksize(p) >= nb); + assert((((size_t)(chunk2mem(p))) % alignment) == 0); + check_inuse_chunk(m, p); + POSTACTION(m); + if (leader != 0) { + internal_free(m, leader); + } + if (trailer != 0) { + internal_free(m, trailer); + } + return chunk2mem(p); + } + } + return 0; +} + +/* ------------------------ comalloc/coalloc support --------------------- */ + +static void** ialloc(mstate m, + size_t n_elements, + size_t* sizes, + int opts, + void* chunks[]) { + /* + This provides common support for independent_X routines, handling + all of the combinations that can result. + + The opts arg has: + bit 0 set if all elements are same size (using sizes[0]) + bit 1 set if elements should be zeroed + */ + + size_t element_size; /* chunksize of each element, if all same */ + size_t contents_size; /* total size of elements */ + size_t array_size; /* request size of pointer array */ + void* mem; /* malloced aggregate space */ + mchunkptr p; /* corresponding chunk */ + size_t remainder_size; /* remaining bytes while splitting */ + void** marray; /* either "chunks" or malloced ptr array */ + mchunkptr array_chunk; /* chunk for malloced ptr array */ + flag_t was_enabled; /* to disable mmap */ + size_t size; + size_t i; + + /* compute array length, if needed */ + if (chunks != 0) { + if (n_elements == 0) + return chunks; /* nothing to do */ + marray = chunks; + array_size = 0; + } + else { + /* if empty req, must still return chunk representing empty array */ + if (n_elements == 0) + return (void**)internal_malloc(m, 0); + marray = 0; + array_size = request2size(n_elements * (sizeof(void*))); + } + + /* compute total element size */ + if (opts & 0x1) { /* all-same-size */ + element_size = request2size(*sizes); + contents_size = n_elements * element_size; + } + else { /* add up all the sizes */ + element_size = 0; + contents_size = 0; + for (i = 0; i != n_elements; ++i) + contents_size += request2size(sizes[i]); + } + + size = contents_size + array_size; + + /* + Allocate the aggregate chunk. First disable direct-mmapping so + malloc won't use it, since we would not be able to later + free/realloc space internal to a segregated mmap region. + */ + was_enabled = use_mmap(m); + disable_mmap(m); + mem = internal_malloc(m, size - CHUNK_OVERHEAD); + if (was_enabled) + enable_mmap(m); + if (mem == 0) + return 0; + + if (PREACTION(m)) return 0; + p = mem2chunk(mem); + remainder_size = chunksize(p); + + assert(!is_mmapped(p)); + + if (opts & 0x2) { /* optionally clear the elements */ + memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); + } + + /* If not provided, allocate the pointer array as final part of chunk */ + if (marray == 0) { + size_t array_chunk_size; + array_chunk = chunk_plus_offset(p, contents_size); + array_chunk_size = remainder_size - contents_size; + marray = (void**) (chunk2mem(array_chunk)); + set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); + remainder_size = contents_size; + } + + /* split out elements */ + for (i = 0; ; ++i) { + marray[i] = chunk2mem(p); + if (i != n_elements-1) { + if (element_size != 0) + size = element_size; + else + size = request2size(sizes[i]); + remainder_size -= size; + set_size_and_pinuse_of_inuse_chunk(m, p, size); + p = chunk_plus_offset(p, size); + } + else { /* the final element absorbs any overallocation slop */ + set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); + break; + } + } + +#if DEBUG + if (marray != chunks) { + /* final element must have exactly exhausted chunk */ + if (element_size != 0) { + assert(remainder_size == element_size); + } + else { + assert(remainder_size == request2size(sizes[i])); + } + check_inuse_chunk(m, mem2chunk(marray)); + } + for (i = 0; i != n_elements; ++i) + check_inuse_chunk(m, mem2chunk(marray[i])); + +#endif /* DEBUG */ + + POSTACTION(m); + return marray; +} + + +/* -------------------------- public routines ---------------------------- */ + +#if !ONLY_MSPACES + +void* dlmalloc(size_t bytes) { + /* + Basic algorithm: + If a small request (< 256 bytes minus per-chunk overhead): + 1. If one exists, use a remainderless chunk in associated smallbin. + (Remainderless means that there are too few excess bytes to + represent as a chunk.) + 2. If it is big enough, use the dv chunk, which is normally the + chunk adjacent to the one used for the most recent small request. + 3. If one exists, split the smallest available chunk in a bin, + saving remainder in dv. + 4. If it is big enough, use the top chunk. + 5. If available, get memory from system and use it + Otherwise, for a large request: + 1. Find the smallest available binned chunk that fits, and use it + if it is better fitting than dv chunk, splitting if necessary. + 2. If better fitting than any binned chunk, use the dv chunk. + 3. If it is big enough, use the top chunk. + 4. If request size >= mmap threshold, try to directly mmap this chunk. + 5. If available, get memory from system and use it + + The ugly goto's here ensure that postaction occurs along all paths. + */ + + if (!PREACTION(gm)) { + void* mem; + size_t nb; + if (bytes <= MAX_SMALL_REQUEST) { + bindex_t idx; + binmap_t smallbits; + nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); + idx = small_index(nb); + smallbits = gm->smallmap >> idx; + + if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ + mchunkptr b, p; + idx += ~smallbits & 1; /* Uses next bin if idx empty */ + b = smallbin_at(gm, idx); + p = b->fd; + assert(chunksize(p) == small_index2size(idx)); + unlink_first_small_chunk(gm, b, p, idx); + set_inuse_and_pinuse(gm, p, small_index2size(idx)); + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (nb > gm->dvsize) { + if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ + mchunkptr b, p, r; + size_t rsize; + bindex_t i; + binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + b = smallbin_at(gm, i); + p = b->fd; + assert(chunksize(p) == small_index2size(i)); + unlink_first_small_chunk(gm, b, p, i); + rsize = small_index2size(i) - nb; + /* Fit here cannot be remainderless if 4byte sizes */ + if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(gm, p, small_index2size(i)); + else { + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + r = chunk_plus_offset(p, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(gm, r, rsize); + } + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + } + } + else if (bytes >= MAX_REQUEST) + nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ + else { + nb = pad_request(bytes); + if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + } + + if (nb <= gm->dvsize) { + size_t rsize = gm->dvsize - nb; + mchunkptr p = gm->dv; + if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ + mchunkptr r = gm->dv = chunk_plus_offset(p, nb); + gm->dvsize = rsize; + set_size_and_pinuse_of_free_chunk(r, rsize); + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + } + else { /* exhaust dv */ + size_t dvs = gm->dvsize; + gm->dvsize = 0; + gm->dv = 0; + set_inuse_and_pinuse(gm, p, dvs); + } + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (nb < gm->topsize) { /* Split top */ + size_t rsize = gm->topsize -= nb; + mchunkptr p = gm->top; + mchunkptr r = gm->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + mem = chunk2mem(p); + check_top_chunk(gm, gm->top); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + mem = sys_alloc(gm, nb); + + postaction: + POSTACTION(gm); + return mem; + } + + return 0; +} + +void dlfree(void* mem) { + /* + Consolidate freed chunks with preceding or succeeding bordering + free chunks, if they exist, and then place in a bin. Intermixed + with special cases for top, dv, mmapped chunks, and usage errors. + */ + + if (mem != 0) { + mchunkptr p = mem2chunk(mem); +#if FOOTERS + mstate fm = get_mstate_for(p); + if (!ok_magic(fm)) { + USAGE_ERROR_ACTION(fm, p); + return; + } +#else /* FOOTERS */ +#define fm gm +#endif /* FOOTERS */ + if (!PREACTION(fm)) { + check_inuse_chunk(fm, p); + if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { + size_t psize = chunksize(p); + mchunkptr next = chunk_plus_offset(p, psize); + if (!pinuse(p)) { + size_t prevsize = p->prev_foot; + if ((prevsize & IS_MMAPPED_BIT) != 0) { + prevsize &= ~IS_MMAPPED_BIT; + psize += prevsize + MMAP_FOOT_PAD; + if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) + fm->footprint -= psize; + goto postaction; + } + else { + mchunkptr prev = chunk_minus_offset(p, prevsize); + psize += prevsize; + p = prev; + if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ + if (p != fm->dv) { + unlink_chunk(fm, p, prevsize); + } + else if ((next->head & INUSE_BITS) == INUSE_BITS) { + fm->dvsize = psize; + set_free_with_pinuse(p, psize, next); + goto postaction; + } + } + else + goto erroraction; + } + } + + if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { + if (!cinuse(next)) { /* consolidate forward */ + if (next == fm->top) { + size_t tsize = fm->topsize += psize; + fm->top = p; + p->head = tsize | PINUSE_BIT; + if (p == fm->dv) { + fm->dv = 0; + fm->dvsize = 0; + } + if (should_trim(fm, tsize)) + sys_trim(fm, 0); + goto postaction; + } + else if (next == fm->dv) { + size_t dsize = fm->dvsize += psize; + fm->dv = p; + set_size_and_pinuse_of_free_chunk(p, dsize); + goto postaction; + } + else { + size_t nsize = chunksize(next); + psize += nsize; + unlink_chunk(fm, next, nsize); + set_size_and_pinuse_of_free_chunk(p, psize); + if (p == fm->dv) { + fm->dvsize = psize; + goto postaction; + } + } + } + else + set_free_with_pinuse(p, psize, next); + insert_chunk(fm, p, psize); + check_free_chunk(fm, p); + goto postaction; + } + } + erroraction: + USAGE_ERROR_ACTION(fm, p); + postaction: + POSTACTION(fm); + } + } +#if !FOOTERS +#undef fm +#endif /* FOOTERS */ +} + +void* dlcalloc(size_t n_elements, size_t elem_size) { + void* mem; + size_t req = 0; + if (n_elements != 0) { + req = n_elements * elem_size; + if (((n_elements | elem_size) & ~(size_t)0xffff) && + (req / n_elements != elem_size)) + req = MAX_SIZE_T; /* force downstream failure on overflow */ + } + mem = dlmalloc(req); + if (mem != 0 && calloc_must_clear(mem2chunk(mem))) + memset(mem, 0, req); + return mem; +} + +void* dlrealloc(void* oldmem, size_t bytes) { + if (oldmem == 0) + return dlmalloc(bytes); +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { + dlfree(oldmem); + return 0; + } +#endif /* REALLOC_ZERO_BYTES_FREES */ + else { +#if ! FOOTERS + mstate m = gm; +#else /* FOOTERS */ + mstate m = get_mstate_for(mem2chunk(oldmem)); + if (!ok_magic(m)) { + USAGE_ERROR_ACTION(m, oldmem); + return 0; + } +#endif /* FOOTERS */ + return internal_realloc(m, oldmem, bytes); + } +} + +void* dlmemalign(size_t alignment, size_t bytes) { + return internal_memalign(gm, alignment, bytes); +} + +void** dlindependent_calloc(size_t n_elements, size_t elem_size, + void* chunks[]) { + size_t sz = elem_size; /* serves as 1-element array */ + return ialloc(gm, n_elements, &sz, 3, chunks); +} + +void** dlindependent_comalloc(size_t n_elements, size_t sizes[], + void* chunks[]) { + return ialloc(gm, n_elements, sizes, 0, chunks); +} + +void* dlvalloc(size_t bytes) { + size_t pagesz; + init_mparams(); + pagesz = mparams.page_size; + return dlmemalign(pagesz, bytes); +} + +void* dlpvalloc(size_t bytes) { + size_t pagesz; + init_mparams(); + pagesz = mparams.page_size; + return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); +} + +int dlmalloc_trim(size_t pad) { + int result = 0; + if (!PREACTION(gm)) { + result = sys_trim(gm, pad); + POSTACTION(gm); + } + return result; +} + +size_t dlmalloc_footprint(void) { + return gm->footprint; +} + +size_t dlmalloc_max_footprint(void) { + return gm->max_footprint; +} + +#if !NO_MALLINFO +struct mallinfo dlmallinfo(void) { + return internal_mallinfo(gm); +} +#endif /* NO_MALLINFO */ + +void dlmalloc_stats() { + internal_malloc_stats(gm); +} + +size_t dlmalloc_usable_size(void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + if (cinuse(p)) + return chunksize(p) - overhead_for(p); + } + return 0; +} + +int dlmallopt(int param_number, int value) { + return change_mparam(param_number, value); +} + +#endif /* !ONLY_MSPACES */ + +/* ----------------------------- user mspaces ---------------------------- */ + +#if MSPACES + +static mstate init_user_mstate(char* tbase, size_t tsize) { + size_t msize = pad_request(sizeof(struct malloc_state)); + mchunkptr mn; + mchunkptr msp = align_as_chunk(tbase); + mstate m = (mstate)(chunk2mem(msp)); + memset(m, 0, msize); + INITIAL_LOCK(&m->mutex); + msp->head = (msize|PINUSE_BIT|CINUSE_BIT); + m->seg.base = m->least_addr = tbase; + m->seg.size = m->footprint = m->max_footprint = tsize; + m->magic = mparams.magic; + m->mflags = mparams.default_mflags; + disable_contiguous(m); + init_bins(m); + mn = next_chunk(mem2chunk(m)); + init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); + check_top_chunk(m, m->top); + return m; +} + +mspace create_mspace(size_t capacity, int locked) { + mstate m = 0; + size_t msize = pad_request(sizeof(struct malloc_state)); + init_mparams(); /* Ensure pagesize etc initialized */ + + if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { + size_t rs = ((capacity == 0)? mparams.granularity : + (capacity + TOP_FOOT_SIZE + msize)); + size_t tsize = granularity_align(rs); + char* tbase = (char*)(CALL_MMAP(tsize)); + if (tbase != CMFAIL) { + m = init_user_mstate(tbase, tsize); + set_segment_flags(&m->seg, IS_MMAPPED_BIT); + set_lock(m, locked); + } + } + return (mspace)m; +} + +mspace create_mspace_with_base(void* base, size_t capacity, int locked) { + mstate m = 0; + size_t msize = pad_request(sizeof(struct malloc_state)); + init_mparams(); /* Ensure pagesize etc initialized */ + + if (capacity > msize + TOP_FOOT_SIZE && + capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { + m = init_user_mstate((char*)base, capacity); + set_segment_flags(&m->seg, EXTERN_BIT); + set_lock(m, locked); + } + return (mspace)m; +} + +size_t destroy_mspace(mspace msp) { + size_t freed = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + msegmentptr sp = &ms->seg; + while (sp != 0) { + char* base = sp->base; + size_t size = sp->size; + flag_t flag = get_segment_flags(sp); + sp = sp->next; + if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) && + CALL_MUNMAP(base, size) == 0) + freed += size; + } + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return freed; +} + +/* + mspace versions of routines are near-clones of the global + versions. This is not so nice but better than the alternatives. +*/ + + +void* mspace_malloc(mspace msp, size_t bytes) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + if (!PREACTION(ms)) { + void* mem; + size_t nb; + if (bytes <= MAX_SMALL_REQUEST) { + bindex_t idx; + binmap_t smallbits; + nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); + idx = small_index(nb); + smallbits = ms->smallmap >> idx; + + if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ + mchunkptr b, p; + idx += ~smallbits & 1; /* Uses next bin if idx empty */ + b = smallbin_at(ms, idx); + p = b->fd; + assert(chunksize(p) == small_index2size(idx)); + unlink_first_small_chunk(ms, b, p, idx); + set_inuse_and_pinuse(ms, p, small_index2size(idx)); + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (nb > ms->dvsize) { + if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ + mchunkptr b, p, r; + size_t rsize; + bindex_t i; + binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + b = smallbin_at(ms, i); + p = b->fd; + assert(chunksize(p) == small_index2size(i)); + unlink_first_small_chunk(ms, b, p, i); + rsize = small_index2size(i) - nb; + /* Fit here cannot be remainderless if 4byte sizes */ + if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(ms, p, small_index2size(i)); + else { + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + r = chunk_plus_offset(p, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(ms, r, rsize); + } + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + } + } + else if (bytes >= MAX_REQUEST) + nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ + else { + nb = pad_request(bytes); + if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + } + + if (nb <= ms->dvsize) { + size_t rsize = ms->dvsize - nb; + mchunkptr p = ms->dv; + if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ + mchunkptr r = ms->dv = chunk_plus_offset(p, nb); + ms->dvsize = rsize; + set_size_and_pinuse_of_free_chunk(r, rsize); + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + } + else { /* exhaust dv */ + size_t dvs = ms->dvsize; + ms->dvsize = 0; + ms->dv = 0; + set_inuse_and_pinuse(ms, p, dvs); + } + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (nb < ms->topsize) { /* Split top */ + size_t rsize = ms->topsize -= nb; + mchunkptr p = ms->top; + mchunkptr r = ms->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + mem = chunk2mem(p); + check_top_chunk(ms, ms->top); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + mem = sys_alloc(ms, nb); + + postaction: + POSTACTION(ms); + return mem; + } + + return 0; +} + +void mspace_free(mspace msp, void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); +#if FOOTERS + mstate fm = get_mstate_for(p); +#else /* FOOTERS */ + mstate fm = (mstate)msp; +#endif /* FOOTERS */ + if (!ok_magic(fm)) { + USAGE_ERROR_ACTION(fm, p); + return; + } + if (!PREACTION(fm)) { + check_inuse_chunk(fm, p); + if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { + size_t psize = chunksize(p); + mchunkptr next = chunk_plus_offset(p, psize); + if (!pinuse(p)) { + size_t prevsize = p->prev_foot; + if ((prevsize & IS_MMAPPED_BIT) != 0) { + prevsize &= ~IS_MMAPPED_BIT; + psize += prevsize + MMAP_FOOT_PAD; + if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) + fm->footprint -= psize; + goto postaction; + } + else { + mchunkptr prev = chunk_minus_offset(p, prevsize); + psize += prevsize; + p = prev; + if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ + if (p != fm->dv) { + unlink_chunk(fm, p, prevsize); + } + else if ((next->head & INUSE_BITS) == INUSE_BITS) { + fm->dvsize = psize; + set_free_with_pinuse(p, psize, next); + goto postaction; + } + } + else + goto erroraction; + } + } + + if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { + if (!cinuse(next)) { /* consolidate forward */ + if (next == fm->top) { + size_t tsize = fm->topsize += psize; + fm->top = p; + p->head = tsize | PINUSE_BIT; + if (p == fm->dv) { + fm->dv = 0; + fm->dvsize = 0; + } + if (should_trim(fm, tsize)) + sys_trim(fm, 0); + goto postaction; + } + else if (next == fm->dv) { + size_t dsize = fm->dvsize += psize; + fm->dv = p; + set_size_and_pinuse_of_free_chunk(p, dsize); + goto postaction; + } + else { + size_t nsize = chunksize(next); + psize += nsize; + unlink_chunk(fm, next, nsize); + set_size_and_pinuse_of_free_chunk(p, psize); + if (p == fm->dv) { + fm->dvsize = psize; + goto postaction; + } + } + } + else + set_free_with_pinuse(p, psize, next); + insert_chunk(fm, p, psize); + check_free_chunk(fm, p); + goto postaction; + } + } + erroraction: + USAGE_ERROR_ACTION(fm, p); + postaction: + POSTACTION(fm); + } + } +} + +void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { + void* mem; + size_t req = 0; + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + if (n_elements != 0) { + req = n_elements * elem_size; + if (((n_elements | elem_size) & ~(size_t)0xffff) && + (req / n_elements != elem_size)) + req = MAX_SIZE_T; /* force downstream failure on overflow */ + } + mem = internal_malloc(ms, req); + if (mem != 0 && calloc_must_clear(mem2chunk(mem))) + memset(mem, 0, req); + return mem; +} + +void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { + if (oldmem == 0) + return mspace_malloc(msp, bytes); +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { + mspace_free(msp, oldmem); + return 0; + } +#endif /* REALLOC_ZERO_BYTES_FREES */ + else { +#if FOOTERS + mchunkptr p = mem2chunk(oldmem); + mstate ms = get_mstate_for(p); +#else /* FOOTERS */ + mstate ms = (mstate)msp; +#endif /* FOOTERS */ + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return internal_realloc(ms, oldmem, bytes); + } +} + +void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return internal_memalign(ms, alignment, bytes); +} + +void** mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]) { + size_t sz = elem_size; /* serves as 1-element array */ + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return ialloc(ms, n_elements, &sz, 3, chunks); +} + +void** mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return ialloc(ms, n_elements, sizes, 0, chunks); +} + +int mspace_trim(mspace msp, size_t pad) { + int result = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + if (!PREACTION(ms)) { + result = sys_trim(ms, pad); + POSTACTION(ms); + } + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return result; +} + +void mspace_malloc_stats(mspace msp) { + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + internal_malloc_stats(ms); + } + else { + USAGE_ERROR_ACTION(ms,ms); + } +} + +size_t mspace_footprint(mspace msp) { + size_t result; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + result = ms->footprint; + } + USAGE_ERROR_ACTION(ms,ms); + return result; +} + + +size_t mspace_max_footprint(mspace msp) { + size_t result; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + result = ms->max_footprint; + } + USAGE_ERROR_ACTION(ms,ms); + return result; +} + + +#if !NO_MALLINFO +struct mallinfo mspace_mallinfo(mspace msp) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + } + return internal_mallinfo(ms); +} +#endif /* NO_MALLINFO */ + +int mspace_mallopt(int param_number, int value) { + return change_mparam(param_number, value); +} + +#endif /* MSPACES */ + +/* -------------------- Alternative MORECORE functions ------------------- */ + +/* + Guidelines for creating a custom version of MORECORE: + + * For best performance, MORECORE should allocate in multiples of pagesize. + * MORECORE may allocate more memory than requested. (Or even less, + but this will usually result in a malloc failure.) + * MORECORE must not allocate memory when given argument zero, but + instead return one past the end address of memory from previous + nonzero call. + * For best performance, consecutive calls to MORECORE with positive + arguments should return increasing addresses, indicating that + space has been contiguously extended. + * Even though consecutive calls to MORECORE need not return contiguous + addresses, it must be OK for malloc'ed chunks to span multiple + regions in those cases where they do happen to be contiguous. + * MORECORE need not handle negative arguments -- it may instead + just return MFAIL when given negative arguments. + Negative arguments are always multiples of pagesize. MORECORE + must not misinterpret negative args as large positive unsigned + args. You can suppress all such calls from even occurring by defining + MORECORE_CANNOT_TRIM, + + As an example alternative MORECORE, here is a custom allocator + kindly contributed for pre-OSX macOS. It uses virtually but not + necessarily physically contiguous non-paged memory (locked in, + present and won't get swapped out). You can use it by uncommenting + this section, adding some #includes, and setting up the appropriate + defines above: + + #define MORECORE osMoreCore + + There is also a shutdown routine that should somehow be called for + cleanup upon program exit. + + #define MAX_POOL_ENTRIES 100 + #define MINIMUM_MORECORE_SIZE (64 * 1024U) + static int next_os_pool; + void *our_os_pools[MAX_POOL_ENTRIES]; + + void *osMoreCore(int size) + { + void *ptr = 0; + static void *sbrk_top = 0; + + if (size > 0) + { + if (size < MINIMUM_MORECORE_SIZE) + size = MINIMUM_MORECORE_SIZE; + if (CurrentExecutionLevel() == kTaskLevel) + ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); + if (ptr == 0) + { + return (void *) MFAIL; + } + // save ptrs so they can be freed during cleanup + our_os_pools[next_os_pool] = ptr; + next_os_pool++; + ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); + sbrk_top = (char *) ptr + size; + return ptr; + } + else if (size < 0) + { + // we don't currently support shrink behavior + return (void *) MFAIL; + } + else + { + return sbrk_top; + } + } + + // cleanup any allocated memory pools + // called as last thing before shutting down driver + + void osCleanupMem(void) + { + void **ptr; + + for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) + if (*ptr) + { + PoolDeallocate(*ptr); + *ptr = 0; + } + } + +*/ + + +/* ----------------------------------------------------------------------- +History: + V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) + * Add max_footprint functions + * Ensure all appropriate literals are size_t + * Fix conditional compilation problem for some #define settings + * Avoid concatenating segments with the one provided + in create_mspace_with_base + * Rename some variables to avoid compiler shadowing warnings + * Use explicit lock initialization. + * Better handling of sbrk interference. + * Simplify and fix segment insertion, trimming and mspace_destroy + * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x + * Thanks especially to Dennis Flanagan for help on these. + + V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) + * Fix memalign brace error. + + V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) + * Fix improper #endif nesting in C++ + * Add explicit casts needed for C++ + + V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) + * Use trees for large bins + * Support mspaces + * Use segments to unify sbrk-based and mmap-based system allocation, + removing need for emulation on most platforms without sbrk. + * Default safety checks + * Optional footer checks. Thanks to William Robertson for the idea. + * Internal code refactoring + * Incorporate suggestions and platform-specific changes. + Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, + Aaron Bachmann, Emery Berger, and others. + * Speed up non-fastbin processing enough to remove fastbins. + * Remove useless cfree() to avoid conflicts with other apps. + * Remove internal memcpy, memset. Compilers handle builtins better. + * Remove some options that no one ever used and rename others. + + V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) + * Fix malloc_state bitmap array misdeclaration + + V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) + * Allow tuning of FIRST_SORTED_BIN_SIZE + * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. + * Better detection and support for non-contiguousness of MORECORE. + Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger + * Bypass most of malloc if no frees. Thanks To Emery Berger. + * Fix freeing of old top non-contiguous chunk im sysmalloc. + * Raised default trim and map thresholds to 256K. + * Fix mmap-related #defines. Thanks to Lubos Lunak. + * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. + * Branch-free bin calculation + * Default trim and mmap thresholds now 256K. + + V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) + * Introduce independent_comalloc and independent_calloc. + Thanks to Michael Pachos for motivation and help. + * Make optional .h file available + * Allow > 2GB requests on 32bit systems. + * new WIN32 sbrk, mmap, munmap, lock code from . + Thanks also to Andreas Mueller , + and Anonymous. + * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for + helping test this.) + * memalign: check alignment arg + * realloc: don't try to shift chunks backwards, since this + leads to more fragmentation in some programs and doesn't + seem to help in any others. + * Collect all cases in malloc requiring system memory into sysmalloc + * Use mmap as backup to sbrk + * Place all internal state in malloc_state + * Introduce fastbins (although similar to 2.5.1) + * Many minor tunings and cosmetic improvements + * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK + * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS + Thanks to Tony E. Bennett and others. + * Include errno.h to support default failure action. + + V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) + * return null for negative arguments + * Added Several WIN32 cleanups from Martin C. Fong + * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' + (e.g. WIN32 platforms) + * Cleanup header file inclusion for WIN32 platforms + * Cleanup code to avoid Microsoft Visual C++ compiler complaints + * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing + memory allocation routines + * Set 'malloc_getpagesize' for WIN32 platforms (needs more work) + * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to + usage of 'assert' in non-WIN32 code + * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to + avoid infinite loop + * Always call 'fREe()' rather than 'free()' + + V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) + * Fixed ordering problem with boundary-stamping + + V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) + * Added pvalloc, as recommended by H.J. Liu + * Added 64bit pointer support mainly from Wolfram Gloger + * Added anonymously donated WIN32 sbrk emulation + * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen + * malloc_extend_top: fix mask error that caused wastage after + foreign sbrks + * Add linux mremap support code from HJ Liu + + V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) + * Integrated most documentation with the code. + * Add support for mmap, with help from + Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Use last_remainder in more cases. + * Pack bins using idea from colin@nyx10.cs.du.edu + * Use ordered bins instead of best-fit threshhold + * Eliminate block-local decls to simplify tracing and debugging. + * Support another case of realloc via move into top + * Fix error occuring when initial sbrk_base not word-aligned. + * Rely on page size for units instead of SBRK_UNIT to + avoid surprises about sbrk alignment conventions. + * Add mallinfo, mallopt. Thanks to Raymond Nijssen + (raymond@es.ele.tue.nl) for the suggestion. + * Add `pad' argument to malloc_trim and top_pad mallopt parameter. + * More precautions for cases where other routines call sbrk, + courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Added macros etc., allowing use in linux libc from + H.J. Lu (hjl@gnu.ai.mit.edu) + * Inverted this history list + + V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) + * Re-tuned and fixed to behave more nicely with V2.6.0 changes. + * Removed all preallocation code since under current scheme + the work required to undo bad preallocations exceeds + the work saved in good cases for most test programs. + * No longer use return list or unconsolidated bins since + no scheme using them consistently outperforms those that don't + given above changes. + * Use best fit for very large chunks to prevent some worst-cases. + * Added some support for debugging + + V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) + * Removed footers when chunks are in use. Thanks to + Paul Wilson (wilson@cs.texas.edu) for the suggestion. + + V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) + * Added malloc_trim, with help from Wolfram Gloger + (wmglo@Dent.MED.Uni-Muenchen.DE). + + V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) + + V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) + * realloc: try to expand in both directions + * malloc: swap order of clean-bin strategy; + * realloc: only conditionally expand backwards + * Try not to scavenge used bins + * Use bin counts as a guide to preallocation + * Occasionally bin return list chunks in first scan + * Add a few optimizations from colin@nyx10.cs.du.edu + + V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) + * faster bin computation & slightly different binning + * merged all consolidations to one part of malloc proper + (eliminating old malloc_find_space & malloc_clean_bin) + * Scan 2 returns chunks (not just 1) + * Propagate failure in realloc if malloc returns 0 + * Add stuff to allow compilation on non-ANSI compilers + from kpv@research.att.com + + V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) + * removed potential for odd address access in prev_chunk + * removed dependency on getpagesize.h + * misc cosmetics and a bit more internal documentation + * anticosmetics: mangled names in macros to evade debugger strangeness + * tested on sparc, hp-700, dec-mips, rs6000 + with gcc & native cc (hp, dec only) allowing + Detlefs & Zorn comparison study (in SIGPLAN Notices.) + + Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) + * Based loosely on libg++-1.2X malloc. (It retains some of the overall + structure of old version, but most details differ.) + +*/ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/eabi.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/eabi.S new file mode 100644 index 0000000..379ea4b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/eabi.S @@ -0,0 +1,128 @@ +/* ----------------------------------------------------------------------- + eabi.S - Copyright (c) 2004 Anthony Green + + FR-V Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + + .globl ffi_prep_args_EABI + + .text + .p2align 4 + .globl ffi_call_EABI + .type ffi_call_EABI, @function + + # gr8 : ffi_prep_args + # gr9 : &ecif + # gr10: cif->bytes + # gr11: fig->flags + # gr12: ecif.rvalue + # gr13: fn + +ffi_call_EABI: + addi sp, #-80, sp + sti fp, @(sp, #24) + addi sp, #24, fp + movsg lr, gr5 + + /* Make room for the new arguments. */ + /* subi sp, fp, gr10 */ + + /* Store return address and incoming args on stack. */ + sti gr5, @(fp, #8) + sti gr8, @(fp, #-4) + sti gr9, @(fp, #-8) + sti gr10, @(fp, #-12) + sti gr11, @(fp, #-16) + sti gr12, @(fp, #-20) + sti gr13, @(fp, #-24) + + sub sp, gr10, sp + + /* Call ffi_prep_args. */ + ldi @(fp, #-4), gr4 + addi sp, #0, gr8 + ldi @(fp, #-8), gr9 +#ifdef __FRV_FDPIC__ + ldd @(gr4, gr0), gr14 + calll @(gr14, gr0) +#else + calll @(gr4, gr0) +#endif + + /* ffi_prep_args returns the new stack pointer. */ + mov gr8, gr4 + + ldi @(sp, #0), gr8 + ldi @(sp, #4), gr9 + ldi @(sp, #8), gr10 + ldi @(sp, #12), gr11 + ldi @(sp, #16), gr12 + ldi @(sp, #20), gr13 + + /* Always copy the return value pointer into the hidden + parameter register. This is only strictly necessary + when we're returning an aggregate type, but it doesn't + hurt to do this all the time, and it saves a branch. */ + ldi @(fp, #-20), gr3 + + /* Use the ffi_prep_args return value for the new sp. */ + mov gr4, sp + + /* Call the target function. */ + ldi @(fp, -24), gr4 +#ifdef __FRV_FDPIC__ + ldd @(gr4, gr0), gr14 + calll @(gr14, gr0) +#else + calll @(gr4, gr0) +#endif + + /* Store the result. */ + ldi @(fp, #-16), gr10 /* fig->flags */ + ldi @(fp, #-20), gr4 /* ecif.rvalue */ + + /* Is the return value stored in two registers? */ + cmpi gr10, #8, icc0 + bne icc0, 0, .L2 + /* Yes, save them. */ + sti gr8, @(gr4, #0) + sti gr9, @(gr4, #4) + bra .L3 +.L2: + /* Is the return value a structure? */ + cmpi gr10, #-1, icc0 + beq icc0, 0, .L3 + /* No, save a 4 byte return value. */ + sti gr8, @(gr4, #0) +.L3: + + /* Restore the stack, and return. */ + ldi @(fp, 8), gr5 + ld @(fp, gr0), fp + addi sp,#80,sp + jmpl @(gr5,gr0) + .size ffi_call_EABI, .-ffi_call_EABI + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffi.c new file mode 100644 index 0000000..5698c89 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffi.c @@ -0,0 +1,292 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (C) 2004 Anthony Green + Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2008 Red Hat, Inc. + + FR-V Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void *ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + register int count = 0; + + p_argv = ecif->avalue; + argp = stack; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); + i--, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + + if ((*p_arg)->type == FFI_TYPE_STRUCT) + { + z = sizeof(void*); + *(void **) argp = *p_argv; + } + /* if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (count > 24) + { + // This is going on the stack. Turn it into a double. + *(double *) argp = (double) *(float*)(* p_argv); + z = sizeof(double); + } + else + *(void **) argp = *(void **)(* p_argv); + } */ + else if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else if (z == sizeof(int)) + { + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + count += z; + } + + return (stack + ((count > 24) ? 24 : ALIGN_DOWN(count, 8))); +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + if (cif->rtype->type == FFI_TYPE_STRUCT) + cif->flags = -1; + else + cif->flags = cif->rtype->size; + + cif->bytes = ALIGN (cif->bytes, 8); + + return FFI_OK; +} + +extern void ffi_call_EABI(void *(*)(char *, extended_cif *), + extended_cif *, + unsigned, unsigned, + unsigned *, + void (*fn)(void)); + +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_EABI: + ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; + default: + FFI_ASSERT(0); + break; + } +} + +void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3, + unsigned arg4, unsigned arg5, unsigned arg6) +{ + /* This function is called by a trampoline. The trampoline stows a + pointer to the ffi_closure object in gr7. We must save this + pointer in a place that will persist while we do our work. */ + register ffi_closure *creg __asm__ ("gr7"); + ffi_closure *closure = creg; + + /* Arguments that don't fit in registers are found on the stack + at a fixed offset above the current frame pointer. */ + register char *frame_pointer __asm__ ("fp"); + char *stack_args = frame_pointer + 16; + + /* Lay the register arguments down in a continuous chunk of memory. */ + unsigned register_args[6] = + { arg1, arg2, arg3, arg4, arg5, arg6 }; + + ffi_cif *cif = closure->cif; + ffi_type **arg_types = cif->arg_types; + void **avalue = alloca (cif->nargs * sizeof(void *)); + char *ptr = (char *) register_args; + int i; + + /* Find the address of each argument. */ + for (i = 0; i < cif->nargs; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = ptr + 3; + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = ptr + 2; + break; + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_FLOAT: + avalue[i] = ptr; + break; + case FFI_TYPE_STRUCT: + avalue[i] = *(void**)ptr; + break; + default: + /* This is an 8-byte value. */ + avalue[i] = ptr; + ptr += 4; + break; + } + ptr += 4; + + /* If we've handled more arguments than fit in registers, + start looking at the those passed on the stack. */ + if (ptr == ((char *)register_args + (6*4))) + ptr = stack_args; + } + + /* Invoke the closure. */ + if (cif->rtype->type == FFI_TYPE_STRUCT) + { + /* The caller allocates space for the return structure, and + passes a pointer to this space in gr3. Use this value directly + as the return value. */ + register void *return_struct_ptr __asm__("gr3"); + (closure->fun) (cif, return_struct_ptr, avalue, closure->user_data); + } + else + { + /* Allocate space for the return value and call the function. */ + long long rvalue; + (closure->fun) (cif, &rvalue, avalue, closure->user_data); + + /* Functions return 4-byte or smaller results in gr8. 8-byte + values also use gr9. We fill the both, even for small return + values, just to avoid a branch. */ + asm ("ldi @(%0, #0), gr8" : : "r" (&rvalue)); + asm ("ldi @(%0, #0), gr9" : : "r" (&((int *) &rvalue)[1])); + } +} + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + unsigned long fn = (long) ffi_closure_eabi; + unsigned long cls = (long) codeloc; +#ifdef __FRV_FDPIC__ + register void *got __asm__("gr15"); +#endif + int i; + + fn = (unsigned long) ffi_closure_eabi; + +#ifdef __FRV_FDPIC__ + tramp[0] = &((unsigned int *)codeloc)[2]; + tramp[1] = got; + tramp[2] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ + tramp[3] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ + tramp[4] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ + tramp[5] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ + tramp[6] = 0x9cc86000; /* ldi @(gr6, #0), gr14 */ + tramp[7] = 0x8030e000; /* jmpl @(gr14, gr0) */ +#else + tramp[0] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ + tramp[1] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ + tramp[2] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ + tramp[3] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ + tramp[4] = 0x80300006; /* jmpl @(gr0, gr6) */ +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + /* Cache flushing. */ + for (i = 0; i < FFI_TRAMPOLINE_SIZE; i++) + __asm__ volatile ("dcf @(%0,%1)\n\tici @(%2,%1)" :: "r" (tramp), "r" (i), + "r" (codeloc)); + + return FFI_OK; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffitarget.h new file mode 100644 index 0000000..4839069 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffitarget.h @@ -0,0 +1,57 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2004 Red Hat, Inc. + Target configuration macros for FR-V + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_EABI, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_EABI +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +#ifdef __FRV_FDPIC__ +/* Trampolines are 8 4-byte instructions long. */ +#define FFI_TRAMPOLINE_SIZE (8*4) +#else +/* Trampolines are 5 4-byte instructions long. */ +#define FFI_TRAMPOLINE_SIZE (5*4) +#endif + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffi.c new file mode 100644 index 0000000..60120ed --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffi.c @@ -0,0 +1,582 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2011 Anthony Green + Copyright (c) 2000 Hewlett Packard Company + Copyright (c) 1998, 2007, 2008 Red Hat, Inc. + + IA64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include +#include + +#include "ia64_flags.h" + +/* A 64-bit pointer value. In LP64 mode, this is effectively a plain + pointer. In ILP32 mode, it's a pointer that's been extended to + 64 bits by "addp4". */ +typedef void *PTR64 __attribute__((mode(DI))); + +/* Memory image of fp register contents. This is the implementation + specific format used by ldf.fill/stf.spill. All we care about is + that it wants a 16 byte aligned slot. */ +typedef struct +{ + UINT64 x[2] __attribute__((aligned(16))); +} fpreg; + + +/* The stack layout given to ffi_call_unix and ffi_closure_unix_inner. */ + +struct ia64_args +{ + fpreg fp_regs[8]; /* Contents of 8 fp arg registers. */ + UINT64 gp_regs[8]; /* Contents of 8 gp arg registers. */ + UINT64 other_args[]; /* Arguments passed on stack, variable size. */ +}; + + +/* Adjust ADDR, a pointer to an 8 byte slot, to point to the low LEN bytes. */ + +static inline void * +endian_adjust (void *addr, size_t len) +{ +#ifdef __BIG_ENDIAN__ + return addr + (8 - len); +#else + return addr; +#endif +} + +/* Store VALUE to ADDR in the current cpu implementation's fp spill format. + This is a macro instead of a function, so that it works for all 3 floating + point types without type conversions. Type conversion to long double breaks + the denorm support. */ + +#define stf_spill(addr, value) \ + asm ("stf.spill %0 = %1%P0" : "=m" (*addr) : "f"(value)); + +/* Load a value from ADDR, which is in the current cpu implementation's + fp spill format. As above, this must also be a macro. */ + +#define ldf_fill(result, addr) \ + asm ("ldf.fill %0 = %1%P1" : "=f"(result) : "m"(*addr)); + +/* Return the size of the C type associated with with TYPE. Which will + be one of the FFI_IA64_TYPE_HFA_* values. */ + +static size_t +hfa_type_size (int type) +{ + switch (type) + { + case FFI_IA64_TYPE_HFA_FLOAT: + return sizeof(float); + case FFI_IA64_TYPE_HFA_DOUBLE: + return sizeof(double); + case FFI_IA64_TYPE_HFA_LDOUBLE: + return sizeof(__float80); + default: + abort (); + } +} + +/* Load from ADDR a value indicated by TYPE. Which will be one of + the FFI_IA64_TYPE_HFA_* values. */ + +static void +hfa_type_load (fpreg *fpaddr, int type, void *addr) +{ + switch (type) + { + case FFI_IA64_TYPE_HFA_FLOAT: + stf_spill (fpaddr, *(float *) addr); + return; + case FFI_IA64_TYPE_HFA_DOUBLE: + stf_spill (fpaddr, *(double *) addr); + return; + case FFI_IA64_TYPE_HFA_LDOUBLE: + stf_spill (fpaddr, *(__float80 *) addr); + return; + default: + abort (); + } +} + +/* Load VALUE into ADDR as indicated by TYPE. Which will be one of + the FFI_IA64_TYPE_HFA_* values. */ + +static void +hfa_type_store (int type, void *addr, fpreg *fpaddr) +{ + switch (type) + { + case FFI_IA64_TYPE_HFA_FLOAT: + { + float result; + ldf_fill (result, fpaddr); + *(float *) addr = result; + break; + } + case FFI_IA64_TYPE_HFA_DOUBLE: + { + double result; + ldf_fill (result, fpaddr); + *(double *) addr = result; + break; + } + case FFI_IA64_TYPE_HFA_LDOUBLE: + { + __float80 result; + ldf_fill (result, fpaddr); + *(__float80 *) addr = result; + break; + } + default: + abort (); + } +} + +/* Is TYPE a struct containing floats, doubles, or extended doubles, + all of the same fp type? If so, return the element type. Return + FFI_TYPE_VOID if not. */ + +static int +hfa_element_type (ffi_type *type, int nested) +{ + int element = FFI_TYPE_VOID; + + switch (type->type) + { + case FFI_TYPE_FLOAT: + /* We want to return VOID for raw floating-point types, but the + synthetic HFA type if we're nested within an aggregate. */ + if (nested) + element = FFI_IA64_TYPE_HFA_FLOAT; + break; + + case FFI_TYPE_DOUBLE: + /* Similarly. */ + if (nested) + element = FFI_IA64_TYPE_HFA_DOUBLE; + break; + + case FFI_TYPE_LONGDOUBLE: + /* Similarly, except that that HFA is true for double extended, + but not quad precision. Both have sizeof == 16, so tell the + difference based on the precision. */ + if (LDBL_MANT_DIG == 64 && nested) + element = FFI_IA64_TYPE_HFA_LDOUBLE; + break; + + case FFI_TYPE_STRUCT: + { + ffi_type **ptr = &type->elements[0]; + + for (ptr = &type->elements[0]; *ptr ; ptr++) + { + int sub_element = hfa_element_type (*ptr, 1); + if (sub_element == FFI_TYPE_VOID) + return FFI_TYPE_VOID; + + if (element == FFI_TYPE_VOID) + element = sub_element; + else if (element != sub_element) + return FFI_TYPE_VOID; + } + } + break; + + default: + return FFI_TYPE_VOID; + } + + return element; +} + + +/* Perform machine dependent cif processing. */ + +ffi_status +ffi_prep_cif_machdep(ffi_cif *cif) +{ + int flags; + + /* Adjust cif->bytes to include space for the bits of the ia64_args frame + that precedes the integer register portion. The estimate that the + generic bits did for the argument space required is good enough for the + integer component. */ + cif->bytes += offsetof(struct ia64_args, gp_regs[0]); + if (cif->bytes < sizeof(struct ia64_args)) + cif->bytes = sizeof(struct ia64_args); + + /* Set the return type flag. */ + flags = cif->rtype->type; + switch (cif->rtype->type) + { + case FFI_TYPE_LONGDOUBLE: + /* Leave FFI_TYPE_LONGDOUBLE as meaning double extended precision, + and encode quad precision as a two-word integer structure. */ + if (LDBL_MANT_DIG != 64) + flags = FFI_IA64_TYPE_SMALL_STRUCT | (16 << 8); + break; + + case FFI_TYPE_STRUCT: + { + size_t size = cif->rtype->size; + int hfa_type = hfa_element_type (cif->rtype, 0); + + if (hfa_type != FFI_TYPE_VOID) + { + size_t nelts = size / hfa_type_size (hfa_type); + if (nelts <= 8) + flags = hfa_type | (size << 8); + } + else + { + if (size <= 32) + flags = FFI_IA64_TYPE_SMALL_STRUCT | (size << 8); + } + } + break; + + default: + break; + } + cif->flags = flags; + + return FFI_OK; +} + +extern int ffi_call_unix (struct ia64_args *, PTR64, void (*)(void), UINT64); + +void +ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + struct ia64_args *stack; + long i, avn, gpcount, fpcount; + ffi_type **p_arg; + + FFI_ASSERT (cif->abi == FFI_UNIX); + + /* If we have no spot for a return value, make one. */ + if (rvalue == NULL && cif->rtype->type != FFI_TYPE_VOID) + rvalue = alloca (cif->rtype->size); + + /* Allocate the stack frame. */ + stack = alloca (cif->bytes); + + gpcount = fpcount = 0; + avn = cif->nargs; + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + stack->gp_regs[gpcount++] = *(SINT8 *)avalue[i]; + break; + case FFI_TYPE_UINT8: + stack->gp_regs[gpcount++] = *(UINT8 *)avalue[i]; + break; + case FFI_TYPE_SINT16: + stack->gp_regs[gpcount++] = *(SINT16 *)avalue[i]; + break; + case FFI_TYPE_UINT16: + stack->gp_regs[gpcount++] = *(UINT16 *)avalue[i]; + break; + case FFI_TYPE_SINT32: + stack->gp_regs[gpcount++] = *(SINT32 *)avalue[i]; + break; + case FFI_TYPE_UINT32: + stack->gp_regs[gpcount++] = *(UINT32 *)avalue[i]; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + stack->gp_regs[gpcount++] = *(UINT64 *)avalue[i]; + break; + + case FFI_TYPE_POINTER: + stack->gp_regs[gpcount++] = (UINT64)(PTR64) *(void **)avalue[i]; + break; + + case FFI_TYPE_FLOAT: + if (gpcount < 8 && fpcount < 8) + stf_spill (&stack->fp_regs[fpcount++], *(float *)avalue[i]); + stack->gp_regs[gpcount++] = *(UINT32 *)avalue[i]; + break; + + case FFI_TYPE_DOUBLE: + if (gpcount < 8 && fpcount < 8) + stf_spill (&stack->fp_regs[fpcount++], *(double *)avalue[i]); + stack->gp_regs[gpcount++] = *(UINT64 *)avalue[i]; + break; + + case FFI_TYPE_LONGDOUBLE: + if (gpcount & 1) + gpcount++; + if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8) + stf_spill (&stack->fp_regs[fpcount++], *(__float80 *)avalue[i]); + memcpy (&stack->gp_regs[gpcount], avalue[i], 16); + gpcount += 2; + break; + + case FFI_TYPE_STRUCT: + { + size_t size = (*p_arg)->size; + size_t align = (*p_arg)->alignment; + int hfa_type = hfa_element_type (*p_arg, 0); + + FFI_ASSERT (align <= 16); + if (align == 16 && (gpcount & 1)) + gpcount++; + + if (hfa_type != FFI_TYPE_VOID) + { + size_t hfa_size = hfa_type_size (hfa_type); + size_t offset = 0; + size_t gp_offset = gpcount * 8; + + while (fpcount < 8 + && offset < size + && gp_offset < 8 * 8) + { + hfa_type_load (&stack->fp_regs[fpcount], hfa_type, + avalue[i] + offset); + offset += hfa_size; + gp_offset += hfa_size; + fpcount += 1; + } + } + + memcpy (&stack->gp_regs[gpcount], avalue[i], size); + gpcount += (size + 7) / 8; + } + break; + + default: + abort (); + } + } + + ffi_call_unix (stack, rvalue, fn, cif->flags); +} + +/* Closures represent a pair consisting of a function pointer, and + some user data. A closure is invoked by reinterpreting the closure + as a function pointer, and branching to it. Thus we can make an + interpreted function callable as a C function: We turn the + interpreter itself, together with a pointer specifying the + interpreted procedure, into a closure. + + For IA64, function pointer are already pairs consisting of a code + pointer, and a gp pointer. The latter is needed to access global + variables. Here we set up such a pair as the first two words of + the closure (in the "trampoline" area), but we replace the gp + pointer with a pointer to the closure itself. We also add the real + gp pointer to the closure. This allows the function entry code to + both retrieve the user data, and to restire the correct gp pointer. */ + +extern void ffi_closure_unix (); + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + /* The layout of a function descriptor. A C function pointer really + points to one of these. */ + struct ia64_fd + { + UINT64 code_pointer; + UINT64 gp; + }; + + struct ffi_ia64_trampoline_struct + { + UINT64 code_pointer; /* Pointer to ffi_closure_unix. */ + UINT64 fake_gp; /* Pointer to closure, installed as gp. */ + UINT64 real_gp; /* Real gp value. */ + }; + + struct ffi_ia64_trampoline_struct *tramp; + struct ia64_fd *fd; + + if (cif->abi != FFI_UNIX) + return FFI_BAD_ABI; + + tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp; + fd = (struct ia64_fd *)(void *)ffi_closure_unix; + + tramp->code_pointer = fd->code_pointer; + tramp->real_gp = fd->gp; + tramp->fake_gp = (UINT64)(PTR64)codeloc; + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + + +UINT64 +ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack, + void *rvalue, void *r8) +{ + ffi_cif *cif; + void **avalue; + ffi_type **p_arg; + long i, avn, gpcount, fpcount; + + cif = closure->cif; + avn = cif->nargs; + avalue = alloca (avn * sizeof (void *)); + + /* If the structure return value is passed in memory get that location + from r8 so as to pass the value directly back to the caller. */ + if (cif->flags == FFI_TYPE_STRUCT) + rvalue = r8; + + gpcount = fpcount = 0; + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 1); + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 2); + break; + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 4); + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + avalue[i] = &stack->gp_regs[gpcount++]; + break; + case FFI_TYPE_POINTER: + avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], sizeof(void*)); + break; + + case FFI_TYPE_FLOAT: + if (gpcount < 8 && fpcount < 8) + { + fpreg *addr = &stack->fp_regs[fpcount++]; + float result; + avalue[i] = addr; + ldf_fill (result, addr); + *(float *)addr = result; + } + else + avalue[i] = endian_adjust(&stack->gp_regs[gpcount], 4); + gpcount++; + break; + + case FFI_TYPE_DOUBLE: + if (gpcount < 8 && fpcount < 8) + { + fpreg *addr = &stack->fp_regs[fpcount++]; + double result; + avalue[i] = addr; + ldf_fill (result, addr); + *(double *)addr = result; + } + else + avalue[i] = &stack->gp_regs[gpcount]; + gpcount++; + break; + + case FFI_TYPE_LONGDOUBLE: + if (gpcount & 1) + gpcount++; + if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8) + { + fpreg *addr = &stack->fp_regs[fpcount++]; + __float80 result; + avalue[i] = addr; + ldf_fill (result, addr); + *(__float80 *)addr = result; + } + else + avalue[i] = &stack->gp_regs[gpcount]; + gpcount += 2; + break; + + case FFI_TYPE_STRUCT: + { + size_t size = (*p_arg)->size; + size_t align = (*p_arg)->alignment; + int hfa_type = hfa_element_type (*p_arg, 0); + + FFI_ASSERT (align <= 16); + if (align == 16 && (gpcount & 1)) + gpcount++; + + if (hfa_type != FFI_TYPE_VOID) + { + size_t hfa_size = hfa_type_size (hfa_type); + size_t offset = 0; + size_t gp_offset = gpcount * 8; + void *addr = alloca (size); + + avalue[i] = addr; + + while (fpcount < 8 + && offset < size + && gp_offset < 8 * 8) + { + hfa_type_store (hfa_type, addr + offset, + &stack->fp_regs[fpcount]); + offset += hfa_size; + gp_offset += hfa_size; + fpcount += 1; + } + + if (offset < size) + memcpy (addr + offset, (char *)stack->gp_regs + gp_offset, + size - offset); + } + else + avalue[i] = &stack->gp_regs[gpcount]; + + gpcount += (size + 7) / 8; + } + break; + + default: + abort (); + } + } + + closure->fun (cif, rvalue, avalue, closure->user_data); + + return cif->flags; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffitarget.h new file mode 100644 index 0000000..0d2001d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffitarget.h @@ -0,0 +1,50 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for IA-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_ASM +typedef unsigned long long ffi_arg; +typedef signed long long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_UNIX, /* Linux and all Unix variants use the same conventions */ + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_UNIX +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 24 /* Really the following struct, which */ + /* can be interpreted as a C function */ + /* descriptor: */ + +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ia64_flags.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ia64_flags.h new file mode 100644 index 0000000..9d652ce --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ia64_flags.h @@ -0,0 +1,40 @@ +/* ----------------------------------------------------------------------- + ia64_flags.h - Copyright (c) 2000 Hewlett Packard Company + + IA64/unix Foreign Function Interface + + Original author: Hans Boehm, HP Labs + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* "Type" codes used between assembly and C. When used as a part of + a cfi->flags value, the low byte will be these extra type codes, + and bits 8-31 will be the actual size of the type. */ + +/* Small structures containing N words in integer registers. */ +#define FFI_IA64_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 1) + +/* Homogeneous Floating Point Aggregates (HFAs) which are returned + in FP registers. */ +#define FFI_IA64_TYPE_HFA_FLOAT (FFI_TYPE_LAST + 2) +#define FFI_IA64_TYPE_HFA_DOUBLE (FFI_TYPE_LAST + 3) +#define FFI_IA64_TYPE_HFA_LDOUBLE (FFI_TYPE_LAST + 4) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/unix.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/unix.S new file mode 100644 index 0000000..4d2a86d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/unix.S @@ -0,0 +1,560 @@ +/* ----------------------------------------------------------------------- + unix.S - Copyright (c) 1998, 2008 Red Hat, Inc. + Copyright (c) 2000 Hewlett Packard Company + + IA64/unix Foreign Function Interface + + Primary author: Hans Boehm, HP Labs + + Loosely modeled on Cygnus code for other platforms. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include +#include "ia64_flags.h" + + .pred.safe_across_calls p1-p5,p16-p63 +.text + +/* int ffi_call_unix (struct ia64_args *stack, PTR64 rvalue, + void (*fn)(void), int flags); + */ + + .align 16 + .global ffi_call_unix + .proc ffi_call_unix +ffi_call_unix: + .prologue + /* Bit o trickiness. We actually share a stack frame with ffi_call. + Rely on the fact that ffi_call uses a vframe and don't bother + tracking one here at all. */ + .fframe 0 + .save ar.pfs, r36 // loc0 + alloc loc0 = ar.pfs, 4, 3, 8, 0 + .save rp, loc1 + mov loc1 = b0 + .body + add r16 = 16, in0 + mov loc2 = gp + mov r8 = in1 + ;; + + /* Load up all of the argument registers. */ + ldf.fill f8 = [in0], 32 + ldf.fill f9 = [r16], 32 + ;; + ldf.fill f10 = [in0], 32 + ldf.fill f11 = [r16], 32 + ;; + ldf.fill f12 = [in0], 32 + ldf.fill f13 = [r16], 32 + ;; + ldf.fill f14 = [in0], 32 + ldf.fill f15 = [r16], 24 + ;; + ld8 out0 = [in0], 16 + ld8 out1 = [r16], 16 + ;; + ld8 out2 = [in0], 16 + ld8 out3 = [r16], 16 + ;; + ld8 out4 = [in0], 16 + ld8 out5 = [r16], 16 + ;; + ld8 out6 = [in0] + ld8 out7 = [r16] + ;; + + /* Deallocate the register save area from the stack frame. */ + mov sp = in0 + + /* Call the target function. */ + ld8 r16 = [in2], 8 + ;; + ld8 gp = [in2] + mov b6 = r16 + br.call.sptk.many b0 = b6 + ;; + + /* Dispatch to handle return value. */ + mov gp = loc2 + zxt1 r16 = in3 + ;; + mov ar.pfs = loc0 + addl r18 = @ltoffx(.Lst_table), gp + ;; + ld8.mov r18 = [r18], .Lst_table + mov b0 = loc1 + ;; + shladd r18 = r16, 3, r18 + ;; + ld8 r17 = [r18] + shr in3 = in3, 8 + ;; + add r17 = r17, r18 + ;; + mov b6 = r17 + br b6 + ;; + +.Lst_void: + br.ret.sptk.many b0 + ;; +.Lst_uint8: + zxt1 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_sint8: + sxt1 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_uint16: + zxt2 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_sint16: + sxt2 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_uint32: + zxt4 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_sint32: + sxt4 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_int64: + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_float: + stfs [in1] = f8 + br.ret.sptk.many b0 + ;; +.Lst_double: + stfd [in1] = f8 + br.ret.sptk.many b0 + ;; +.Lst_ldouble: + stfe [in1] = f8 + br.ret.sptk.many b0 + ;; + +.Lst_small_struct: + add sp = -16, sp + cmp.lt p6, p0 = 8, in3 + cmp.lt p7, p0 = 16, in3 + cmp.lt p8, p0 = 24, in3 + ;; + add r16 = 8, sp + add r17 = 16, sp + add r18 = 24, sp + ;; + st8 [sp] = r8 +(p6) st8 [r16] = r9 + mov out0 = in1 +(p7) st8 [r17] = r10 +(p8) st8 [r18] = r11 + mov out1 = sp + mov out2 = in3 + br.call.sptk.many b0 = memcpy# + ;; + mov ar.pfs = loc0 + mov b0 = loc1 + mov gp = loc2 + br.ret.sptk.many b0 + +.Lst_hfa_float: + add r16 = 4, in1 + cmp.lt p6, p0 = 4, in3 + ;; + stfs [in1] = f8, 8 +(p6) stfs [r16] = f9, 8 + cmp.lt p7, p0 = 8, in3 + cmp.lt p8, p0 = 12, in3 + ;; +(p7) stfs [in1] = f10, 8 +(p8) stfs [r16] = f11, 8 + cmp.lt p9, p0 = 16, in3 + cmp.lt p10, p0 = 20, in3 + ;; +(p9) stfs [in1] = f12, 8 +(p10) stfs [r16] = f13, 8 + cmp.lt p6, p0 = 24, in3 + cmp.lt p7, p0 = 28, in3 + ;; +(p6) stfs [in1] = f14 +(p7) stfs [r16] = f15 + br.ret.sptk.many b0 + ;; + +.Lst_hfa_double: + add r16 = 8, in1 + cmp.lt p6, p0 = 8, in3 + ;; + stfd [in1] = f8, 16 +(p6) stfd [r16] = f9, 16 + cmp.lt p7, p0 = 16, in3 + cmp.lt p8, p0 = 24, in3 + ;; +(p7) stfd [in1] = f10, 16 +(p8) stfd [r16] = f11, 16 + cmp.lt p9, p0 = 32, in3 + cmp.lt p10, p0 = 40, in3 + ;; +(p9) stfd [in1] = f12, 16 +(p10) stfd [r16] = f13, 16 + cmp.lt p6, p0 = 48, in3 + cmp.lt p7, p0 = 56, in3 + ;; +(p6) stfd [in1] = f14 +(p7) stfd [r16] = f15 + br.ret.sptk.many b0 + ;; + +.Lst_hfa_ldouble: + add r16 = 16, in1 + cmp.lt p6, p0 = 16, in3 + ;; + stfe [in1] = f8, 32 +(p6) stfe [r16] = f9, 32 + cmp.lt p7, p0 = 32, in3 + cmp.lt p8, p0 = 48, in3 + ;; +(p7) stfe [in1] = f10, 32 +(p8) stfe [r16] = f11, 32 + cmp.lt p9, p0 = 64, in3 + cmp.lt p10, p0 = 80, in3 + ;; +(p9) stfe [in1] = f12, 32 +(p10) stfe [r16] = f13, 32 + cmp.lt p6, p0 = 96, in3 + cmp.lt p7, p0 = 112, in3 + ;; +(p6) stfe [in1] = f14 +(p7) stfe [r16] = f15 + br.ret.sptk.many b0 + ;; + + .endp ffi_call_unix + + .align 16 + .global ffi_closure_unix + .proc ffi_closure_unix + +#define FRAME_SIZE (8*16 + 8*8 + 8*16) + +ffi_closure_unix: + .prologue + .save ar.pfs, r40 // loc0 + alloc loc0 = ar.pfs, 8, 4, 4, 0 + .fframe FRAME_SIZE + add r12 = -FRAME_SIZE, r12 + .save rp, loc1 + mov loc1 = b0 + .save ar.unat, loc2 + mov loc2 = ar.unat + .body + + /* Retrieve closure pointer and real gp. */ +#ifdef _ILP32 + addp4 out0 = 0, gp + addp4 gp = 16, gp +#else + mov out0 = gp + add gp = 16, gp +#endif + ;; + ld8 gp = [gp] + + /* Spill all of the possible argument registers. */ + add r16 = 16 + 8*16, sp + add r17 = 16 + 8*16 + 16, sp + ;; + stf.spill [r16] = f8, 32 + stf.spill [r17] = f9, 32 + mov loc3 = gp + ;; + stf.spill [r16] = f10, 32 + stf.spill [r17] = f11, 32 + ;; + stf.spill [r16] = f12, 32 + stf.spill [r17] = f13, 32 + ;; + stf.spill [r16] = f14, 32 + stf.spill [r17] = f15, 24 + ;; + .mem.offset 0, 0 + st8.spill [r16] = in0, 16 + .mem.offset 8, 0 + st8.spill [r17] = in1, 16 + add out1 = 16 + 8*16, sp + ;; + .mem.offset 0, 0 + st8.spill [r16] = in2, 16 + .mem.offset 8, 0 + st8.spill [r17] = in3, 16 + add out2 = 16, sp + ;; + .mem.offset 0, 0 + st8.spill [r16] = in4, 16 + .mem.offset 8, 0 + st8.spill [r17] = in5, 16 + mov out3 = r8 + ;; + .mem.offset 0, 0 + st8.spill [r16] = in6 + .mem.offset 8, 0 + st8.spill [r17] = in7 + + /* Invoke ffi_closure_unix_inner for the hard work. */ + br.call.sptk.many b0 = ffi_closure_unix_inner + ;; + + /* Dispatch to handle return value. */ + mov gp = loc3 + zxt1 r16 = r8 + ;; + addl r18 = @ltoffx(.Lld_table), gp + mov ar.pfs = loc0 + ;; + ld8.mov r18 = [r18], .Lld_table + mov b0 = loc1 + ;; + shladd r18 = r16, 3, r18 + mov ar.unat = loc2 + ;; + ld8 r17 = [r18] + shr r8 = r8, 8 + ;; + add r17 = r17, r18 + add r16 = 16, sp + ;; + mov b6 = r17 + br b6 + ;; + .label_state 1 + +.Lld_void: + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; +.Lld_int: + .body + .copy_state 1 + ld8 r8 = [r16] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; +.Lld_float: + .body + .copy_state 1 + ldfs f8 = [r16] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; +.Lld_double: + .body + .copy_state 1 + ldfd f8 = [r16] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; +.Lld_ldouble: + .body + .copy_state 1 + ldfe f8 = [r16] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; + +.Lld_small_struct: + .body + .copy_state 1 + add r17 = 8, r16 + cmp.lt p6, p0 = 8, r8 + cmp.lt p7, p0 = 16, r8 + cmp.lt p8, p0 = 24, r8 + ;; + ld8 r8 = [r16], 16 +(p6) ld8 r9 = [r17], 16 + ;; +(p7) ld8 r10 = [r16] +(p8) ld8 r11 = [r17] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; + +.Lld_hfa_float: + .body + .copy_state 1 + add r17 = 4, r16 + cmp.lt p6, p0 = 4, r8 + ;; + ldfs f8 = [r16], 8 +(p6) ldfs f9 = [r17], 8 + cmp.lt p7, p0 = 8, r8 + cmp.lt p8, p0 = 12, r8 + ;; +(p7) ldfs f10 = [r16], 8 +(p8) ldfs f11 = [r17], 8 + cmp.lt p9, p0 = 16, r8 + cmp.lt p10, p0 = 20, r8 + ;; +(p9) ldfs f12 = [r16], 8 +(p10) ldfs f13 = [r17], 8 + cmp.lt p6, p0 = 24, r8 + cmp.lt p7, p0 = 28, r8 + ;; +(p6) ldfs f14 = [r16] +(p7) ldfs f15 = [r17] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; + +.Lld_hfa_double: + .body + .copy_state 1 + add r17 = 8, r16 + cmp.lt p6, p0 = 8, r8 + ;; + ldfd f8 = [r16], 16 +(p6) ldfd f9 = [r17], 16 + cmp.lt p7, p0 = 16, r8 + cmp.lt p8, p0 = 24, r8 + ;; +(p7) ldfd f10 = [r16], 16 +(p8) ldfd f11 = [r17], 16 + cmp.lt p9, p0 = 32, r8 + cmp.lt p10, p0 = 40, r8 + ;; +(p9) ldfd f12 = [r16], 16 +(p10) ldfd f13 = [r17], 16 + cmp.lt p6, p0 = 48, r8 + cmp.lt p7, p0 = 56, r8 + ;; +(p6) ldfd f14 = [r16] +(p7) ldfd f15 = [r17] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; + +.Lld_hfa_ldouble: + .body + .copy_state 1 + add r17 = 16, r16 + cmp.lt p6, p0 = 16, r8 + ;; + ldfe f8 = [r16], 32 +(p6) ldfe f9 = [r17], 32 + cmp.lt p7, p0 = 32, r8 + cmp.lt p8, p0 = 48, r8 + ;; +(p7) ldfe f10 = [r16], 32 +(p8) ldfe f11 = [r17], 32 + cmp.lt p9, p0 = 64, r8 + cmp.lt p10, p0 = 80, r8 + ;; +(p9) ldfe f12 = [r16], 32 +(p10) ldfe f13 = [r17], 32 + cmp.lt p6, p0 = 96, r8 + cmp.lt p7, p0 = 112, r8 + ;; +(p6) ldfe f14 = [r16] +(p7) ldfe f15 = [r17] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; + + .endp ffi_closure_unix + + .section .rodata + .align 8 +.Lst_table: + data8 @pcrel(.Lst_void) // FFI_TYPE_VOID + data8 @pcrel(.Lst_sint32) // FFI_TYPE_INT + data8 @pcrel(.Lst_float) // FFI_TYPE_FLOAT + data8 @pcrel(.Lst_double) // FFI_TYPE_DOUBLE + data8 @pcrel(.Lst_ldouble) // FFI_TYPE_LONGDOUBLE + data8 @pcrel(.Lst_uint8) // FFI_TYPE_UINT8 + data8 @pcrel(.Lst_sint8) // FFI_TYPE_SINT8 + data8 @pcrel(.Lst_uint16) // FFI_TYPE_UINT16 + data8 @pcrel(.Lst_sint16) // FFI_TYPE_SINT16 + data8 @pcrel(.Lst_uint32) // FFI_TYPE_UINT32 + data8 @pcrel(.Lst_sint32) // FFI_TYPE_SINT32 + data8 @pcrel(.Lst_int64) // FFI_TYPE_UINT64 + data8 @pcrel(.Lst_int64) // FFI_TYPE_SINT64 + data8 @pcrel(.Lst_void) // FFI_TYPE_STRUCT + data8 @pcrel(.Lst_int64) // FFI_TYPE_POINTER + data8 @pcrel(.Lst_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT + data8 @pcrel(.Lst_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT + data8 @pcrel(.Lst_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE + data8 @pcrel(.Lst_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE + +.Lld_table: + data8 @pcrel(.Lld_void) // FFI_TYPE_VOID + data8 @pcrel(.Lld_int) // FFI_TYPE_INT + data8 @pcrel(.Lld_float) // FFI_TYPE_FLOAT + data8 @pcrel(.Lld_double) // FFI_TYPE_DOUBLE + data8 @pcrel(.Lld_ldouble) // FFI_TYPE_LONGDOUBLE + data8 @pcrel(.Lld_int) // FFI_TYPE_UINT8 + data8 @pcrel(.Lld_int) // FFI_TYPE_SINT8 + data8 @pcrel(.Lld_int) // FFI_TYPE_UINT16 + data8 @pcrel(.Lld_int) // FFI_TYPE_SINT16 + data8 @pcrel(.Lld_int) // FFI_TYPE_UINT32 + data8 @pcrel(.Lld_int) // FFI_TYPE_SINT32 + data8 @pcrel(.Lld_int) // FFI_TYPE_UINT64 + data8 @pcrel(.Lld_int) // FFI_TYPE_SINT64 + data8 @pcrel(.Lld_void) // FFI_TYPE_STRUCT + data8 @pcrel(.Lld_int) // FFI_TYPE_POINTER + data8 @pcrel(.Lld_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT + data8 @pcrel(.Lld_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT + data8 @pcrel(.Lld_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE + data8 @pcrel(.Lld_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/java_raw_api.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/java_raw_api.c new file mode 100644 index 0000000..522c8bf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/java_raw_api.c @@ -0,0 +1,356 @@ +/* ----------------------------------------------------------------------- + java_raw_api.c - Copyright (c) 1999, 2007, 2008 Red Hat, Inc. + + Cloned from raw_api.c + + Raw_api.c author: Kresten Krab Thorup + Java_raw_api.c author: Hans-J. Boehm + + $Id $ + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* This defines a Java- and 64-bit specific variant of the raw API. */ +/* It assumes that "raw" argument blocks look like Java stacks on a */ +/* 64-bit machine. Arguments that can be stored in a single stack */ +/* stack slots (longs, doubles) occupy 128 bits, but only the first */ +/* 64 bits are actually used. */ + +#include +#include +#include + +#if !defined(NO_JAVA_RAW_API) && !defined(FFI_NO_RAW_API) + +size_t +ffi_java_raw_size (ffi_cif *cif) +{ + size_t result = 0; + int i; + + ffi_type **at = cif->arg_types; + + for (i = cif->nargs-1; i >= 0; i--, at++) + { + switch((*at) -> type) { + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + result += 2 * FFI_SIZEOF_JAVA_RAW; + break; + case FFI_TYPE_STRUCT: + /* No structure parameters in Java. */ + abort(); + default: + result += FFI_SIZEOF_JAVA_RAW; + } + } + + return result; +} + + +void +ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + +#if WORDS_BIGENDIAN + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + *args = (void*) ((char*)(raw++) + 3); + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + *args = (void*) ((char*)(raw++) + 2); + break; + +#if FFI_SIZEOF_JAVA_RAW == 8 + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + *args = (void *)raw; + raw += 2; + break; +#endif + + case FFI_TYPE_POINTER: + *args = (void*) &(raw++)->ptr; + break; + + default: + *args = raw; + raw += + ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); + } + } + +#else /* WORDS_BIGENDIAN */ + +#if !PDP + + /* then assume little endian */ + for (i = 0; i < cif->nargs; i++, tp++, args++) + { +#if FFI_SIZEOF_JAVA_RAW == 8 + switch((*tp)->type) { + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + *args = (void*) raw; + raw += 2; + break; + default: + *args = (void*) raw++; + } +#else /* FFI_SIZEOF_JAVA_RAW != 8 */ + *args = (void*) raw; + raw += + ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); +#endif /* FFI_SIZEOF_JAVA_RAW == 8 */ + } + +#else +#error "pdp endian not supported" +#endif /* ! PDP */ + +#endif /* WORDS_BIGENDIAN */ +} + +void +ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: +#if WORDS_BIGENDIAN + *(UINT32*)(raw++) = *(UINT8*) (*args); +#else + (raw++)->uint = *(UINT8*) (*args); +#endif + break; + + case FFI_TYPE_SINT8: +#if WORDS_BIGENDIAN + *(SINT32*)(raw++) = *(SINT8*) (*args); +#else + (raw++)->sint = *(SINT8*) (*args); +#endif + break; + + case FFI_TYPE_UINT16: +#if WORDS_BIGENDIAN + *(UINT32*)(raw++) = *(UINT16*) (*args); +#else + (raw++)->uint = *(UINT16*) (*args); +#endif + break; + + case FFI_TYPE_SINT16: +#if WORDS_BIGENDIAN + *(SINT32*)(raw++) = *(SINT16*) (*args); +#else + (raw++)->sint = *(SINT16*) (*args); +#endif + break; + + case FFI_TYPE_UINT32: +#if WORDS_BIGENDIAN + *(UINT32*)(raw++) = *(UINT32*) (*args); +#else + (raw++)->uint = *(UINT32*) (*args); +#endif + break; + + case FFI_TYPE_SINT32: +#if WORDS_BIGENDIAN + *(SINT32*)(raw++) = *(SINT32*) (*args); +#else + (raw++)->sint = *(SINT32*) (*args); +#endif + break; + + case FFI_TYPE_FLOAT: + (raw++)->flt = *(FLOAT32*) (*args); + break; + +#if FFI_SIZEOF_JAVA_RAW == 8 + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + raw->uint = *(UINT64*) (*args); + raw += 2; + break; +#endif + + case FFI_TYPE_POINTER: + (raw++)->ptr = **(void***) args; + break; + + default: +#if FFI_SIZEOF_JAVA_RAW == 8 + FFI_ASSERT(0); /* Should have covered all cases */ +#else + memcpy ((void*) raw->data, (void*)*args, (*tp)->size); + raw += + ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); +#endif + } + } +} + +#if !FFI_NATIVE_RAW_API + +static void +ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue) +{ +#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 + switch (cif->rtype->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_UINT32: + *(UINT64 *)rvalue <<= 32; + break; + + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_INT: +#if FFI_SIZEOF_JAVA_RAW == 4 + case FFI_TYPE_POINTER: +#endif + *(SINT64 *)rvalue <<= 32; + break; + + default: + break; + } +#endif +} + +static void +ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue) +{ +#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 + switch (cif->rtype->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_UINT32: + *(UINT64 *)rvalue >>= 32; + break; + + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_INT: + *(SINT64 *)rvalue >>= 32; + break; + + default: + break; + } +#endif +} + +/* This is a generic definition of ffi_raw_call, to be used if the + * native system does not provide a machine-specific implementation. + * Having this, allows code to be written for the raw API, without + * the need for system-specific code to handle input in that format; + * these following couple of functions will handle the translation forth + * and back automatically. */ + +void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, + ffi_java_raw *raw) +{ + void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); + ffi_java_raw_to_ptrarray (cif, raw, avalue); + ffi_call (cif, fn, rvalue, avalue); + ffi_java_rvalue_to_raw (cif, rvalue); +} + +#if FFI_CLOSURES /* base system provides closures */ + +static void +ffi_java_translate_args (ffi_cif *cif, void *rvalue, + void **avalue, void *user_data) +{ + ffi_java_raw *raw = (ffi_java_raw*)alloca (ffi_java_raw_size (cif)); + ffi_raw_closure *cl = (ffi_raw_closure*)user_data; + + ffi_java_ptrarray_to_raw (cif, avalue, raw); + (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data); + ffi_java_raw_to_rvalue (cif, rvalue); +} + +ffi_status +ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, + void *codeloc) +{ + ffi_status status; + + status = ffi_prep_closure_loc ((ffi_closure*) cl, + cif, + &ffi_java_translate_args, + codeloc, + codeloc); + if (status == FFI_OK) + { + cl->fun = fun; + cl->user_data = user_data; + } + + return status; +} + +/* Again, here is the generic version of ffi_prep_raw_closure, which + * will install an intermediate "hub" for translation of arguments from + * the pointer-array format, to the raw format */ + +ffi_status +ffi_prep_java_raw_closure (ffi_java_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data) +{ + return ffi_prep_java_raw_closure_loc (cl, cif, fun, user_data, cl); +} + +#endif /* FFI_CLOSURES */ +#endif /* !FFI_NATIVE_RAW_API */ +#endif /* !FFI_NO_RAW_API */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffi.c new file mode 100644 index 0000000..3000063 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffi.c @@ -0,0 +1,232 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2004 Renesas Technology + Copyright (c) 2008 Red Hat, Inc. + + M32R Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +/* ffi_prep_args is called by the assembly routine once stack + space has been allocated for the function's arguments. */ + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + unsigned int i; + int tmp; + unsigned int avn; + void **p_argv; + char *argp; + ffi_type **p_arg; + + tmp = 0; + argp = stack; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 8) + { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + avn = ecif->cif->nargs; + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0) && (avn != 0); + i--, p_arg++) + { + size_t z; + + /* Align if necessary. */ + if (((*p_arg)->alignment - 1) & (unsigned) argp) + argp = (char *) ALIGN (argp, (*p_arg)->alignment); + + if (avn != 0) + { + avn--; + z = (*p_arg)->size; + if (z < sizeof (int)) + { + z = sizeof (int); + + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + z = (*p_arg)->size; + if ((*p_arg)->alignment != 1) + memcpy (argp, *p_argv, z); + else + memcpy (argp + 4 - z, *p_argv, z); + z = sizeof (int); + break; + + default: + FFI_ASSERT(0); + } + } + else if (z == sizeof (int)) + { + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + } + else + { + if ((*p_arg)->type == FFI_TYPE_STRUCT) + { + if (z > 8) + { + *(unsigned int *) argp = (unsigned int)(void *)(* p_argv); + z = sizeof(void *); + } + else + { + memcpy(argp, *p_argv, z); + z = 8; + } + } + else + { + /* Double or long long 64bit. */ + memcpy (argp, *p_argv, z); + } + } + p_argv++; + argp += z; + } + } + + return; +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Set the return type flag. */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_STRUCT: + if (cif->rtype->size <= 4) + cif->flags = FFI_TYPE_INT; + + else if (cif->rtype->size <= 8) + cif->flags = FFI_TYPE_DOUBLE; + + else + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_DOUBLE: + cif->flags = FFI_TYPE_DOUBLE; + break; + + case FFI_TYPE_FLOAT: + default: + cif->flags = FFI_TYPE_INT; + break; + } + + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)(void)); + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have + a return value address then we need to make one. */ + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca (cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + if (cif->rtype->type == FFI_TYPE_STRUCT) + { + int size = cif->rtype->size; + int align = cif->rtype->alignment; + + if (size < 4) + { + if (align == 1) + *(unsigned long *)(ecif.rvalue) <<= (4 - size) * 8; + } + else if (4 < size && size < 8) + { + if (align == 1) + { + memcpy (ecif.rvalue, ecif.rvalue + 8-size, size); + } + else if (align == 2) + { + if (size & 1) + size += 1; + + if (size != 8) + memcpy (ecif.rvalue, ecif.rvalue + 8-size, size); + } + } + } + break; + + default: + FFI_ASSERT(0); + break; + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffitarget.h new file mode 100644 index 0000000..2e2ea48 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffitarget.h @@ -0,0 +1,48 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2004 Renesas Technology. + Target configuration macros for M32R. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi + { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV + } ffi_abi; +#endif + +#define FFI_CLOSURES 0 +#define FFI_TRAMPOLINE_SIZE 24 +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/sysv.S new file mode 100644 index 0000000..06b75c2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/sysv.S @@ -0,0 +1,121 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2004 Renesas Technology + + M32R Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include +#ifdef HAVE_MACHINE_ASM_H +#include +#else +/* XXX these lose for some platforms, I'm sure. */ +#define CNAME(x) x +#define ENTRY(x) .globl CNAME(x)! .type CNAME(x),%function! CNAME(x): +#endif + +.text + + /* R0: ffi_prep_args */ + /* R1: &ecif */ + /* R2: cif->bytes */ + /* R3: fig->flags */ + /* sp+0: ecif.rvalue */ + /* sp+4: fn */ + + /* This assumes we are using gas. */ +ENTRY(ffi_call_SYSV) + /* Save registers. */ + push fp + push lr + push r3 + push r2 + push r1 + push r0 + mv fp, sp + + /* Make room for all of the new args. */ + sub sp, r2 + + /* Place all of the ffi_prep_args in position. */ + mv lr, r0 + mv r0, sp + /* R1 already set. */ + + /* And call. */ + jl lr + + /* Move first 4 parameters in registers... */ + ld r0, @(0,sp) + ld r1, @(4,sp) + ld r2, @(8,sp) + ld r3, @(12,sp) + + /* ...and adjust the stack. */ + ld lr, @(8,fp) + cmpi lr, #16 + bc adjust_stack + ldi lr, #16 +adjust_stack: + add sp, lr + + /* Call the function. */ + ld lr, @(28,fp) + jl lr + + /* Remove the space we pushed for the args. */ + mv sp, fp + + /* Load R2 with the pointer to storage for the return value. */ + ld r2, @(24,sp) + + /* Load R3 with the return type code. */ + ld r3, @(12,sp) + + /* If the return value pointer is NULL, assume no return value. */ + beqz r2, epilogue + + /* Return INT. */ + ldi r4, #FFI_TYPE_INT + bne r3, r4, return_double + st r0, @r2 + bra epilogue + +return_double: + /* Return DOUBLE or LONGDOUBLE. */ + ldi r4, #FFI_TYPE_DOUBLE + bne r3, r4, epilogue + st r0, @r2 + st r1, @(4,r2) + +epilogue: + pop r0 + pop r1 + pop r2 + pop r3 + pop lr + pop fp + jmp lr + +.ffi_call_SYSV_end: + .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffi.c new file mode 100644 index 0000000..0d4df1e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffi.c @@ -0,0 +1,288 @@ +/* ----------------------------------------------------------------------- + ffi.c + + m68k Foreign Function Interface + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include +#ifdef __rtems__ +void rtems_cache_flush_multiple_data_lines( const void *, size_t ); +#else +#include +#include +#endif + +void ffi_call_SYSV (extended_cif *, + unsigned, unsigned, + void *, void (*fn) ()); +void *ffi_prep_args (void *stack, extended_cif *ecif); +void ffi_closure_SYSV (ffi_closure *); +void ffi_closure_struct_SYSV (ffi_closure *); +unsigned int ffi_closure_SYSV_inner (ffi_closure *closure, + void *resp, void *args); + +/* ffi_prep_args is called by the assembly routine once stack space has + been allocated for the function's arguments. */ + +void * +ffi_prep_args (void *stack, extended_cif *ecif) +{ + unsigned int i; + void **p_argv; + char *argp; + ffi_type **p_arg; + void *struct_value_ptr; + + argp = stack; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT + && !ecif->cif->flags) + struct_value_ptr = ecif->rvalue; + else + struct_value_ptr = NULL; + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + if (z < sizeof (int)) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; + break; + + case FFI_TYPE_STRUCT: + memcpy (argp + sizeof (int) - z, *p_argv, z); + break; + + default: + FFI_ASSERT (0); + } + z = sizeof (int); + } + else + { + memcpy (argp, *p_argv, z); + + /* Align if necessary. */ + if ((sizeof(int) - 1) & z) + z = ALIGN(z, sizeof(int)); + } + + p_argv++; + argp += z; + } + + return struct_value_ptr; +} + +#define CIF_FLAGS_INT 1 +#define CIF_FLAGS_DINT 2 +#define CIF_FLAGS_FLOAT 4 +#define CIF_FLAGS_DOUBLE 8 +#define CIF_FLAGS_LDOUBLE 16 +#define CIF_FLAGS_POINTER 32 +#define CIF_FLAGS_STRUCT1 64 +#define CIF_FLAGS_STRUCT2 128 + +/* Perform machine dependent cif processing */ +ffi_status +ffi_prep_cif_machdep (ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + cif->flags = 0; + break; + + case FFI_TYPE_STRUCT: + switch (cif->rtype->size) + { + case 1: + cif->flags = CIF_FLAGS_STRUCT1; + break; + case 2: + cif->flags = CIF_FLAGS_STRUCT2; + break; + case 4: + cif->flags = CIF_FLAGS_INT; + break; + case 8: + cif->flags = CIF_FLAGS_DINT; + break; + default: + cif->flags = 0; + break; + } + break; + + case FFI_TYPE_FLOAT: + cif->flags = CIF_FLAGS_FLOAT; + break; + + case FFI_TYPE_DOUBLE: + cif->flags = CIF_FLAGS_DOUBLE; + break; + +#if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE) + case FFI_TYPE_LONGDOUBLE: + cif->flags = CIF_FLAGS_LDOUBLE; + break; +#endif + + case FFI_TYPE_POINTER: + cif->flags = CIF_FLAGS_POINTER; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = CIF_FLAGS_DINT; + break; + + default: + cif->flags = CIF_FLAGS_INT; + break; + } + + return FFI_OK; +} + +void +ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return value + address then we need to make one. */ + + if (rvalue == NULL + && cif->rtype->type == FFI_TYPE_STRUCT + && cif->rtype->size > 8) + ecif.rvalue = alloca (cif->rtype->size); + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV (&ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; + + default: + FFI_ASSERT (0); + break; + } +} + +static void +ffi_prep_incoming_args_SYSV (char *stack, void **avalue, ffi_cif *cif) +{ + unsigned int i; + void **p_argv; + char *argp; + ffi_type **p_arg; + + argp = stack; + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + if (z <= 4) + { + *p_argv = (void *) (argp + 4 - z); + + z = 4; + } + else + { + *p_argv = (void *) argp; + + /* Align if necessary */ + if ((sizeof(int) - 1) & z) + z = ALIGN(z, sizeof(int)); + } + + p_argv++; + argp += z; + } +} + +unsigned int +ffi_closure_SYSV_inner (ffi_closure *closure, void *resp, void *args) +{ + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void *)); + + ffi_prep_incoming_args_SYSV(args, arg_area, cif); + + (closure->fun) (cif, resp, arg_area, closure->user_data); + + return cif->flags; +} + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + FFI_ASSERT (cif->abi == FFI_SYSV); + + *(unsigned short *)closure->tramp = 0x207c; + *(void **)(closure->tramp + 2) = codeloc; + *(unsigned short *)(closure->tramp + 6) = 0x4ef9; + if (cif->rtype->type == FFI_TYPE_STRUCT + && !cif->flags) + *(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV; + else + *(void **)(closure->tramp + 8) = ffi_closure_SYSV; + +#ifdef __rtems__ + rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE ); +#else + syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE, + FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE); +#endif + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffitarget.h new file mode 100644 index 0000000..3b777ed --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffitarget.h @@ -0,0 +1,49 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for Motorola 68K. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 16 +#define FFI_NATIVE_RAW_API 0 + +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/sysv.S new file mode 100644 index 0000000..c782f51 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/sysv.S @@ -0,0 +1,270 @@ +/* ----------------------------------------------------------------------- + + sysv.S - Copyright (c) 1998 Andreas Schwab + Copyright (c) 2008 Red Hat, Inc. + + m68k Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + +#ifdef HAVE_AS_CFI_PSEUDO_OP +#define CFI_STARTPROC() .cfi_startproc +#define CFI_OFFSET(reg,off) .cfi_offset reg,off +#define CFI_DEF_CFA(reg,off) .cfi_def_cfa reg,off +#define CFI_ENDPROC() .cfi_endproc +#else +#define CFI_STARTPROC() +#define CFI_OFFSET(reg,off) +#define CFI_DEF_CFA(reg,off) +#define CFI_ENDPROC() +#endif + + .text + + .globl ffi_call_SYSV + .type ffi_call_SYSV,@function + .align 4 + +ffi_call_SYSV: + CFI_STARTPROC() + link %fp,#0 + CFI_OFFSET(14,-8) + CFI_DEF_CFA(14,8) + move.l %d2,-(%sp) + CFI_OFFSET(2,-12) + + | Make room for all of the new args. + sub.l 12(%fp),%sp + + | Call ffi_prep_args + move.l 8(%fp),-(%sp) + pea 4(%sp) +#if !defined __PIC__ + jsr ffi_prep_args +#else + bsr.l ffi_prep_args@PLTPC +#endif + addq.l #8,%sp + + | Pass pointer to struct value, if any + move.l %a0,%a1 + + | Call the function + move.l 24(%fp),%a0 + jsr (%a0) + + | Remove the space we pushed for the args + add.l 12(%fp),%sp + + | Load the pointer to storage for the return value + move.l 20(%fp),%a1 + + | Load the return type code + move.l 16(%fp),%d2 + + | If the return value pointer is NULL, assume no return value. + | NOTE: On the mc68000, tst on an address register is not supported. +#if defined(__mc68000__) && !defined(__mcoldfire__) + cmp.w #0, %a1 +#else + tst.l %a1 +#endif + jbeq noretval + + btst #0,%d2 + jbeq retlongint + move.l %d0,(%a1) + jbra epilogue + +retlongint: + btst #1,%d2 + jbeq retfloat + move.l %d0,(%a1) + move.l %d1,4(%a1) + jbra epilogue + +retfloat: + btst #2,%d2 + jbeq retdouble +#if defined(__MC68881__) + fmove.s %fp0,(%a1) +#else + move.l %d0,(%a1) +#endif + jbra epilogue + +retdouble: + btst #3,%d2 + jbeq retlongdouble +#if defined(__MC68881__) + fmove.d %fp0,(%a1) +#else + move.l %d0,(%a1)+ + move.l %d1,(%a1) +#endif + jbra epilogue + +retlongdouble: + btst #4,%d2 + jbeq retpointer +#if defined(__MC68881__) + fmove.x %fp0,(%a1) +#else + move.l %d0,(%a1)+ + move.l %d1,(%a1)+ + move.l %d2,(%a1) +#endif + jbra epilogue + +retpointer: + btst #5,%d2 + jbeq retstruct1 + move.l %a0,(%a1) + jbra epilogue + +retstruct1: + btst #6,%d2 + jbeq retstruct2 + move.b %d0,(%a1) + jbra epilogue + +retstruct2: + btst #7,%d2 + jbeq noretval + move.w %d0,(%a1) + +noretval: +epilogue: + move.l (%sp)+,%d2 + unlk %fp + rts + CFI_ENDPROC() + .size ffi_call_SYSV,.-ffi_call_SYSV + + .globl ffi_closure_SYSV + .type ffi_closure_SYSV, @function + .align 4 + +ffi_closure_SYSV: + CFI_STARTPROC() + link %fp,#-12 + CFI_OFFSET(14,-8) + CFI_DEF_CFA(14,8) + move.l %sp,-12(%fp) + pea 8(%fp) + pea -12(%fp) + move.l %a0,-(%sp) +#if !defined __PIC__ + jsr ffi_closure_SYSV_inner +#else + bsr.l ffi_closure_SYSV_inner@PLTPC +#endif + + lsr.l #1,%d0 + jne 1f + jcc .Lcls_epilogue + move.l -12(%fp),%d0 +.Lcls_epilogue: + unlk %fp + rts +1: + lea -12(%fp),%a0 + lsr.l #2,%d0 + jne 1f + jcs .Lcls_ret_float + move.l (%a0)+,%d0 + move.l (%a0),%d1 + jra .Lcls_epilogue +.Lcls_ret_float: +#if defined(__MC68881__) + fmove.s (%a0),%fp0 +#else + move.l (%a0),%d0 +#endif + jra .Lcls_epilogue +1: + lsr.l #2,%d0 + jne 1f + jcs .Lcls_ret_ldouble +#if defined(__MC68881__) + fmove.d (%a0),%fp0 +#else + move.l (%a0)+,%d0 + move.l (%a0),%d1 +#endif + jra .Lcls_epilogue +.Lcls_ret_ldouble: +#if defined(__MC68881__) + fmove.x (%a0),%fp0 +#else + move.l (%a0)+,%d0 + move.l (%a0)+,%d1 + move.l (%a0),%d2 +#endif + jra .Lcls_epilogue +1: + lsr.l #2,%d0 + jne .Lcls_ret_struct2 + jcs .Lcls_ret_struct1 + move.l (%a0),%a0 + move.l %a0,%d0 + jra .Lcls_epilogue +.Lcls_ret_struct1: + move.b (%a0),%d0 + jra .Lcls_epilogue +.Lcls_ret_struct2: + move.w (%a0),%d0 + jra .Lcls_epilogue + CFI_ENDPROC() + + .size ffi_closure_SYSV,.-ffi_closure_SYSV + + .globl ffi_closure_struct_SYSV + .type ffi_closure_struct_SYSV, @function + .align 4 + +ffi_closure_struct_SYSV: + CFI_STARTPROC() + link %fp,#0 + CFI_OFFSET(14,-8) + CFI_DEF_CFA(14,8) + move.l %sp,-12(%fp) + pea 8(%fp) + move.l %a1,-(%sp) + move.l %a0,-(%sp) +#if !defined __PIC__ + jsr ffi_closure_SYSV_inner +#else + bsr.l ffi_closure_SYSV_inner@PLTPC +#endif + unlk %fp + rts + CFI_ENDPROC() + .size ffi_closure_struct_SYSV,.-ffi_closure_struct_SYSV + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffi.c new file mode 100644 index 0000000..a7acb8a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffi.c @@ -0,0 +1,1038 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2011 Anthony Green + Copyright (c) 2008 David Daney + Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc. + + MIPS Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +#ifdef __GNUC__ +# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) +# define USE__BUILTIN___CLEAR_CACHE 1 +# endif +#endif + +#ifndef USE__BUILTIN___CLEAR_CACHE +# if defined(__OpenBSD__) +# include +# else +# include +# endif +#endif + +#ifdef FFI_DEBUG +# define FFI_MIPS_STOP_HERE() ffi_stop_here() +#else +# define FFI_MIPS_STOP_HERE() do {} while(0) +#endif + +#ifdef FFI_MIPS_N32 +#define FIX_ARGP \ +FFI_ASSERT(argp <= &stack[bytes]); \ +if (argp == &stack[bytes]) \ +{ \ + argp = stack; \ + FFI_MIPS_STOP_HERE(); \ +} +#else +#define FIX_ARGP +#endif + + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +static void ffi_prep_args(char *stack, + extended_cif *ecif, + int bytes, + int flags) +{ + int i; + void **p_argv; + char *argp; + ffi_type **p_arg; + int ecif_test; + +#ifdef FFI_MIPS_N32 + /* If more than 8 double words are used, the remainder go + on the stack. We reorder stuff on the stack here to + support this easily. */ + if (bytes > 8 * sizeof(ffi_arg)) + argp = &stack[bytes - (8 * sizeof(ffi_arg))]; + else + argp = stack; +#else + argp = stack; +#endif + + memset(stack, 0, bytes); + +#ifdef FFI_MIPS_N32 + ecif_test = ecif->cif->rstruct_flag != 0; +#else + ecif_test = ecif->cif->rtype->type == FFI_TYPE_STRUCT; +#endif + if (ecif_test) + { + *(ffi_arg *) argp = (ffi_arg) ecif->rvalue; + argp += sizeof(ffi_arg); + FIX_ARGP; + } + + p_argv = ecif->avalue; + + for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; i++, p_arg++) + { + size_t z; + unsigned int a; + + /* Align if necessary. */ + a = (*p_arg)->alignment; + if (a < sizeof(ffi_arg)) + a = sizeof(ffi_arg); + + if ((a - 1) & (unsigned long) argp) + { + argp = (char *) ALIGN(argp, a); + FIX_ARGP; + } + + z = (*p_arg)->size; + if (z <= sizeof(ffi_arg)) + { + int type = (*p_arg)->type; + z = sizeof(ffi_arg); + + /* The size of a pointer depends on the ABI */ + if (type == FFI_TYPE_POINTER) + type = (ecif->cif->abi == FFI_N64 + || ecif->cif->abi == FFI_N64_SOFT_FLOAT) + ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32; + + if (i < 8 && (ecif->cif->abi == FFI_N32_SOFT_FLOAT + || ecif->cif->abi == FFI_N64_SOFT_FLOAT)) + { + switch (type) + { + case FFI_TYPE_FLOAT: + type = FFI_TYPE_UINT32; + break; + case FFI_TYPE_DOUBLE: + type = FFI_TYPE_UINT64; + break; + default: + break; + } + } + switch (type) + { + case FFI_TYPE_SINT8: + *(ffi_arg *)argp = *(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(ffi_arg *)argp = *(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(ffi_arg *)argp = *(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(ffi_arg *)argp = *(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(ffi_arg *)argp = *(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: + *(ffi_arg *)argp = *(UINT32 *)(* p_argv); + break; + + /* This can only happen with 64bit slots. */ + case FFI_TYPE_FLOAT: + *(float *) argp = *(float *)(* p_argv); + break; + + /* Handle structures. */ + default: + memcpy(argp, *p_argv, (*p_arg)->size); + break; + } + } + else + { +#ifdef FFI_MIPS_O32 + memcpy(argp, *p_argv, z); +#else + { + unsigned long end = (unsigned long) argp + z; + unsigned long cap = (unsigned long) stack + bytes; + + /* Check if the data will fit within the register space. + Handle it if it doesn't. */ + + if (end <= cap) + memcpy(argp, *p_argv, z); + else + { + unsigned long portion = cap - (unsigned long)argp; + + memcpy(argp, *p_argv, portion); + argp = stack; + z -= portion; + memcpy(argp, (void*)((unsigned long)(*p_argv) + portion), + z); + } + } +#endif + } + p_argv++; + argp += z; + FIX_ARGP; + } +} + +#ifdef FFI_MIPS_N32 + +/* The n32 spec says that if "a chunk consists solely of a double + float field (but not a double, which is part of a union), it + is passed in a floating point register. Any other chunk is + passed in an integer register". This code traverses structure + definitions and generates the appropriate flags. */ + +static unsigned +calc_n32_struct_flags(int soft_float, ffi_type *arg, + unsigned *loc, unsigned *arg_reg) +{ + unsigned flags = 0; + unsigned index = 0; + + ffi_type *e; + + if (soft_float) + return 0; + + while ((e = arg->elements[index])) + { + /* Align this object. */ + *loc = ALIGN(*loc, e->alignment); + if (e->type == FFI_TYPE_DOUBLE) + { + /* Already aligned to FFI_SIZEOF_ARG. */ + *arg_reg = *loc / FFI_SIZEOF_ARG; + if (*arg_reg > 7) + break; + flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS)); + *loc += e->size; + } + else + *loc += e->size; + index++; + } + /* Next Argument register at alignment of FFI_SIZEOF_ARG. */ + *arg_reg = ALIGN(*loc, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + + return flags; +} + +static unsigned +calc_n32_return_struct_flags(int soft_float, ffi_type *arg) +{ + unsigned flags = 0; + unsigned small = FFI_TYPE_SMALLSTRUCT; + ffi_type *e; + + /* Returning structures under n32 is a tricky thing. + A struct with only one or two floating point fields + is returned in $f0 (and $f2 if necessary). Any other + struct results at most 128 bits are returned in $2 + (the first 64 bits) and $3 (remainder, if necessary). + Larger structs are handled normally. */ + + if (arg->size > 16) + return 0; + + if (arg->size > 8) + small = FFI_TYPE_SMALLSTRUCT2; + + e = arg->elements[0]; + + if (e->type == FFI_TYPE_DOUBLE) + flags = FFI_TYPE_DOUBLE; + else if (e->type == FFI_TYPE_FLOAT) + flags = FFI_TYPE_FLOAT; + + if (flags && (e = arg->elements[1])) + { + if (e->type == FFI_TYPE_DOUBLE) + flags += FFI_TYPE_DOUBLE << FFI_FLAG_BITS; + else if (e->type == FFI_TYPE_FLOAT) + flags += FFI_TYPE_FLOAT << FFI_FLAG_BITS; + else + return small; + + if (flags && (arg->elements[2])) + { + /* There are three arguments and the first two are + floats! This must be passed the old way. */ + return small; + } + if (soft_float) + flags += FFI_TYPE_STRUCT_SOFT; + } + else + if (!flags) + return small; + + return flags; +} + +#endif + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + cif->flags = 0; + +#ifdef FFI_MIPS_O32 + /* Set the flags necessary for O32 processing. FFI_O32_SOFT_FLOAT + * does not have special handling for floating point args. + */ + + if (cif->rtype->type != FFI_TYPE_STRUCT && cif->abi == FFI_O32) + { + if (cif->nargs > 0) + { + switch ((cif->arg_types)[0]->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags += (cif->arg_types)[0]->type; + break; + + default: + break; + } + + if (cif->nargs > 1) + { + /* Only handle the second argument if the first + is a float or double. */ + if (cif->flags) + { + switch ((cif->arg_types)[1]->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags += (cif->arg_types)[1]->type << FFI_FLAG_BITS; + break; + + default: + break; + } + } + } + } + } + + /* Set the return type flag */ + + if (cif->abi == FFI_O32_SOFT_FLOAT) + { + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + case FFI_TYPE_STRUCT: + cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2); + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_DOUBLE: + cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2); + break; + + case FFI_TYPE_FLOAT: + default: + cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2); + break; + } + } + else + { + /* FFI_O32 */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + case FFI_TYPE_STRUCT: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2); + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2); + break; + + default: + cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2); + break; + } + } +#endif + +#ifdef FFI_MIPS_N32 + /* Set the flags necessary for N32 processing */ + { + int type; + unsigned arg_reg = 0; + unsigned loc = 0; + unsigned count = (cif->nargs < 8) ? cif->nargs : 8; + unsigned index = 0; + + unsigned struct_flags = 0; + int soft_float = (cif->abi == FFI_N32_SOFT_FLOAT + || cif->abi == FFI_N64_SOFT_FLOAT); + + if (cif->rtype->type == FFI_TYPE_STRUCT) + { + struct_flags = calc_n32_return_struct_flags(soft_float, cif->rtype); + + if (struct_flags == 0) + { + /* This means that the structure is being passed as + a hidden argument */ + + arg_reg = 1; + count = (cif->nargs < 7) ? cif->nargs : 7; + + cif->rstruct_flag = !0; + } + else + cif->rstruct_flag = 0; + } + else + cif->rstruct_flag = 0; + + while (count-- > 0 && arg_reg < 8) + { + type = (cif->arg_types)[index]->type; + if (soft_float) + { + switch (type) + { + case FFI_TYPE_FLOAT: + type = FFI_TYPE_UINT32; + break; + case FFI_TYPE_DOUBLE: + type = FFI_TYPE_UINT64; + break; + default: + break; + } + } + switch (type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags += + ((cif->arg_types)[index]->type << (arg_reg * FFI_FLAG_BITS)); + arg_reg++; + break; + case FFI_TYPE_LONGDOUBLE: + /* Align it. */ + arg_reg = ALIGN(arg_reg, 2); + /* Treat it as two adjacent doubles. */ + if (soft_float) + { + arg_reg += 2; + } + else + { + cif->flags += + (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS)); + arg_reg++; + cif->flags += + (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS)); + arg_reg++; + } + break; + + case FFI_TYPE_STRUCT: + loc = arg_reg * FFI_SIZEOF_ARG; + cif->flags += calc_n32_struct_flags(soft_float, + (cif->arg_types)[index], + &loc, &arg_reg); + break; + + default: + arg_reg++; + break; + } + + index++; + } + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_STRUCT: + { + if (struct_flags == 0) + { + /* The structure is returned through a hidden + first argument. Do nothing, 'cause FFI_TYPE_VOID + is 0 */ + } + else + { + /* The structure is returned via some tricky + mechanism */ + cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); + cif->flags += struct_flags << (4 + (FFI_FLAG_BITS * 8)); + } + break; + } + + case FFI_TYPE_VOID: + /* Do nothing, 'cause FFI_TYPE_VOID is 0 */ + break; + + case FFI_TYPE_POINTER: + if (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N32) + cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8); + else + cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); + break; + + case FFI_TYPE_FLOAT: + if (soft_float) + { + cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8); + break; + } + /* else fall through */ + case FFI_TYPE_DOUBLE: + if (soft_float) + cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); + else + cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8); + break; + + case FFI_TYPE_LONGDOUBLE: + /* Long double is returned as if it were a struct containing + two doubles. */ + if (soft_float) + { + cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); + cif->flags += FFI_TYPE_SMALLSTRUCT2 << (4 + (FFI_FLAG_BITS * 8)); + } + else + { + cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); + cif->flags += (FFI_TYPE_DOUBLE + + (FFI_TYPE_DOUBLE << FFI_FLAG_BITS)) + << (4 + (FFI_FLAG_BITS * 8)); + } + break; + default: + cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); + break; + } + } +#endif + + return FFI_OK; +} + +/* Low level routine for calling O32 functions */ +extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int), + extended_cif *, unsigned, + unsigned, unsigned *, void (*)(void)); + +/* Low level routine for calling N32 functions */ +extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int), + extended_cif *, unsigned, + unsigned, void *, void (*)(void)); + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + ecif.rvalue = alloca(cif->rtype->size); + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { +#ifdef FFI_MIPS_O32 + case FFI_O32: + case FFI_O32_SOFT_FLOAT: + ffi_call_O32(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; +#endif + +#ifdef FFI_MIPS_N32 + case FFI_N32: + case FFI_N32_SOFT_FLOAT: + case FFI_N64: + case FFI_N64_SOFT_FLOAT: + { + int copy_rvalue = 0; + int copy_offset = 0; + char *rvalue_copy = ecif.rvalue; + if (cif->rtype->type == FFI_TYPE_STRUCT && cif->rtype->size < 16) + { + /* For structures smaller than 16 bytes we clobber memory + in 8 byte increments. Make a copy so we don't clobber + the callers memory outside of the struct bounds. */ + rvalue_copy = alloca(16); + copy_rvalue = 1; + } + else if (cif->rtype->type == FFI_TYPE_FLOAT + && (cif->abi == FFI_N64_SOFT_FLOAT + || cif->abi == FFI_N32_SOFT_FLOAT)) + { + rvalue_copy = alloca (8); + copy_rvalue = 1; +#if defined(__MIPSEB__) || defined(_MIPSEB) + copy_offset = 4; +#endif + } + ffi_call_N32(ffi_prep_args, &ecif, cif->bytes, + cif->flags, rvalue_copy, fn); + if (copy_rvalue) + memcpy(ecif.rvalue, rvalue_copy + copy_offset, cif->rtype->size); + } + break; +#endif + + default: + FFI_ASSERT(0); + break; + } +} + +#if FFI_CLOSURES +#if defined(FFI_MIPS_O32) +extern void ffi_closure_O32(void); +#else +extern void ffi_closure_N32(void); +#endif /* FFI_MIPS_O32 */ + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + void * fn; + char *clear_location = (char *) codeloc; + +#if defined(FFI_MIPS_O32) + if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT) + return FFI_BAD_ABI; + fn = ffi_closure_O32; +#else /* FFI_MIPS_N32 */ + if (cif->abi != FFI_N32 && cif->abi != FFI_N64) + return FFI_BAD_ABI; + fn = ffi_closure_N32; +#endif /* FFI_MIPS_O32 */ + +#if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32) + /* lui $25,high(fn) */ + tramp[0] = 0x3c190000 | ((unsigned)fn >> 16); + /* ori $25,low(fn) */ + tramp[1] = 0x37390000 | ((unsigned)fn & 0xffff); + /* lui $12,high(codeloc) */ + tramp[2] = 0x3c0c0000 | ((unsigned)codeloc >> 16); + /* jr $25 */ + tramp[3] = 0x03200008; + /* ori $12,low(codeloc) */ + tramp[4] = 0x358c0000 | ((unsigned)codeloc & 0xffff); +#else + /* N64 has a somewhat larger trampoline. */ + /* lui $25,high(fn) */ + tramp[0] = 0x3c190000 | ((unsigned long)fn >> 48); + /* lui $12,high(codeloc) */ + tramp[1] = 0x3c0c0000 | ((unsigned long)codeloc >> 48); + /* ori $25,mid-high(fn) */ + tramp[2] = 0x37390000 | (((unsigned long)fn >> 32 ) & 0xffff); + /* ori $12,mid-high(codeloc) */ + tramp[3] = 0x358c0000 | (((unsigned long)codeloc >> 32) & 0xffff); + /* dsll $25,$25,16 */ + tramp[4] = 0x0019cc38; + /* dsll $12,$12,16 */ + tramp[5] = 0x000c6438; + /* ori $25,mid-low(fn) */ + tramp[6] = 0x37390000 | (((unsigned long)fn >> 16 ) & 0xffff); + /* ori $12,mid-low(codeloc) */ + tramp[7] = 0x358c0000 | (((unsigned long)codeloc >> 16) & 0xffff); + /* dsll $25,$25,16 */ + tramp[8] = 0x0019cc38; + /* dsll $12,$12,16 */ + tramp[9] = 0x000c6438; + /* ori $25,low(fn) */ + tramp[10] = 0x37390000 | ((unsigned long)fn & 0xffff); + /* jr $25 */ + tramp[11] = 0x03200008; + /* ori $12,low(codeloc) */ + tramp[12] = 0x358c0000 | ((unsigned long)codeloc & 0xffff); + +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + +#ifdef USE__BUILTIN___CLEAR_CACHE + __builtin___clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE); +#else + cacheflush (clear_location, FFI_TRAMPOLINE_SIZE, ICACHE); +#endif + return FFI_OK; +} + +/* + * Decodes the arguments to a function, which will be stored on the + * stack. AR is the pointer to the beginning of the integer arguments + * (and, depending upon the arguments, some floating-point arguments + * as well). FPR is a pointer to the area where floating point + * registers have been saved, if any. + * + * RVALUE is the location where the function return value will be + * stored. CLOSURE is the prepared closure to invoke. + * + * This function should only be called from assembly, which is in + * turn called from a trampoline. + * + * Returns the function return type. + * + * Based on the similar routine for sparc. + */ +int +ffi_closure_mips_inner_O32 (ffi_closure *closure, + void *rvalue, ffi_arg *ar, + double *fpr) +{ + ffi_cif *cif; + void **avaluep; + ffi_arg *avalue; + ffi_type **arg_types; + int i, avn, argn, seen_int; + + cif = closure->cif; + avalue = alloca (cif->nargs * sizeof (ffi_arg)); + avaluep = alloca (cif->nargs * sizeof (ffi_arg)); + + seen_int = (cif->abi == FFI_O32_SOFT_FLOAT); + argn = 0; + + if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_STRUCT) + { + rvalue = (void *)(UINT32)ar[0]; + argn = 1; + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + while (i < avn) + { + if (i < 2 && !seen_int && + (arg_types[i]->type == FFI_TYPE_FLOAT || + arg_types[i]->type == FFI_TYPE_DOUBLE || + arg_types[i]->type == FFI_TYPE_LONGDOUBLE)) + { +#if defined(__MIPSEB__) || defined(_MIPSEB) + if (arg_types[i]->type == FFI_TYPE_FLOAT) + avaluep[i] = ((char *) &fpr[i]) + sizeof (float); + else +#endif + avaluep[i] = (char *) &fpr[i]; + } + else + { + if (arg_types[i]->alignment == 8 && (argn & 0x1)) + argn++; + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + avaluep[i] = &avalue[i]; + *(SINT8 *) &avalue[i] = (SINT8) ar[argn]; + break; + + case FFI_TYPE_UINT8: + avaluep[i] = &avalue[i]; + *(UINT8 *) &avalue[i] = (UINT8) ar[argn]; + break; + + case FFI_TYPE_SINT16: + avaluep[i] = &avalue[i]; + *(SINT16 *) &avalue[i] = (SINT16) ar[argn]; + break; + + case FFI_TYPE_UINT16: + avaluep[i] = &avalue[i]; + *(UINT16 *) &avalue[i] = (UINT16) ar[argn]; + break; + + default: + avaluep[i] = (char *) &ar[argn]; + break; + } + seen_int = 1; + } + argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + i++; + } + + /* Invoke the closure. */ + (closure->fun) (cif, rvalue, avaluep, closure->user_data); + + if (cif->abi == FFI_O32_SOFT_FLOAT) + { + switch (cif->rtype->type) + { + case FFI_TYPE_FLOAT: + return FFI_TYPE_INT; + case FFI_TYPE_DOUBLE: + return FFI_TYPE_UINT64; + default: + return cif->rtype->type; + } + } + else + { + return cif->rtype->type; + } +} + +#if defined(FFI_MIPS_N32) + +static void +copy_struct_N32(char *target, unsigned offset, ffi_abi abi, ffi_type *type, + int argn, unsigned arg_offset, ffi_arg *ar, + ffi_arg *fpr, int soft_float) +{ + ffi_type **elt_typep = type->elements; + while(*elt_typep) + { + ffi_type *elt_type = *elt_typep; + unsigned o; + char *tp; + char *argp; + char *fpp; + + o = ALIGN(offset, elt_type->alignment); + arg_offset += o - offset; + offset = o; + argn += arg_offset / sizeof(ffi_arg); + arg_offset = arg_offset % sizeof(ffi_arg); + + argp = (char *)(ar + argn); + fpp = (char *)(argn >= 8 ? ar + argn : fpr + argn); + + tp = target + offset; + + if (elt_type->type == FFI_TYPE_DOUBLE && !soft_float) + *(double *)tp = *(double *)fpp; + else + memcpy(tp, argp + arg_offset, elt_type->size); + + offset += elt_type->size; + arg_offset += elt_type->size; + elt_typep++; + argn += arg_offset / sizeof(ffi_arg); + arg_offset = arg_offset % sizeof(ffi_arg); + } +} + +/* + * Decodes the arguments to a function, which will be stored on the + * stack. AR is the pointer to the beginning of the integer + * arguments. FPR is a pointer to the area where floating point + * registers have been saved. + * + * RVALUE is the location where the function return value will be + * stored. CLOSURE is the prepared closure to invoke. + * + * This function should only be called from assembly, which is in + * turn called from a trampoline. + * + * Returns the function return flags. + * + */ +int +ffi_closure_mips_inner_N32 (ffi_closure *closure, + void *rvalue, ffi_arg *ar, + ffi_arg *fpr) +{ + ffi_cif *cif; + void **avaluep; + ffi_arg *avalue; + ffi_type **arg_types; + int i, avn, argn; + int soft_float; + ffi_arg *argp; + + cif = closure->cif; + soft_float = cif->abi == FFI_N64_SOFT_FLOAT + || cif->abi == FFI_N32_SOFT_FLOAT; + avalue = alloca (cif->nargs * sizeof (ffi_arg)); + avaluep = alloca (cif->nargs * sizeof (ffi_arg)); + + argn = 0; + + if (cif->rstruct_flag) + { +#if _MIPS_SIM==_ABIN32 + rvalue = (void *)(UINT32)ar[0]; +#else /* N64 */ + rvalue = (void *)ar[0]; +#endif + argn = 1; + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + while (i < avn) + { + if (arg_types[i]->type == FFI_TYPE_FLOAT + || arg_types[i]->type == FFI_TYPE_DOUBLE + || arg_types[i]->type == FFI_TYPE_LONGDOUBLE) + { + argp = (argn >= 8 || soft_float) ? ar + argn : fpr + argn; + if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((unsigned)argp & (arg_types[i]->alignment-1))) + { + argp=(ffi_arg*)ALIGN(argp,arg_types[i]->alignment); + argn++; + } +#if defined(__MIPSEB__) || defined(_MIPSEB) + if (arg_types[i]->type == FFI_TYPE_FLOAT && argn < 8) + avaluep[i] = ((char *) argp) + sizeof (float); + else +#endif + avaluep[i] = (char *) argp; + } + else + { + unsigned type = arg_types[i]->type; + + if (arg_types[i]->alignment > sizeof(ffi_arg)) + argn = ALIGN(argn, arg_types[i]->alignment / sizeof(ffi_arg)); + + argp = ar + argn; + + /* The size of a pointer depends on the ABI */ + if (type == FFI_TYPE_POINTER) + type = (cif->abi == FFI_N64 || cif->abi == FFI_N64_SOFT_FLOAT) + ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32; + + if (soft_float && type == FFI_TYPE_FLOAT) + type = FFI_TYPE_UINT32; + + switch (type) + { + case FFI_TYPE_SINT8: + avaluep[i] = &avalue[i]; + *(SINT8 *) &avalue[i] = (SINT8) *argp; + break; + + case FFI_TYPE_UINT8: + avaluep[i] = &avalue[i]; + *(UINT8 *) &avalue[i] = (UINT8) *argp; + break; + + case FFI_TYPE_SINT16: + avaluep[i] = &avalue[i]; + *(SINT16 *) &avalue[i] = (SINT16) *argp; + break; + + case FFI_TYPE_UINT16: + avaluep[i] = &avalue[i]; + *(UINT16 *) &avalue[i] = (UINT16) *argp; + break; + + case FFI_TYPE_SINT32: + avaluep[i] = &avalue[i]; + *(SINT32 *) &avalue[i] = (SINT32) *argp; + break; + + case FFI_TYPE_UINT32: + avaluep[i] = &avalue[i]; + *(UINT32 *) &avalue[i] = (UINT32) *argp; + break; + + case FFI_TYPE_STRUCT: + if (argn < 8) + { + /* Allocate space for the struct as at least part of + it was passed in registers. */ + avaluep[i] = alloca(arg_types[i]->size); + copy_struct_N32(avaluep[i], 0, cif->abi, arg_types[i], + argn, 0, ar, fpr, soft_float); + + break; + } + /* Else fall through. */ + default: + avaluep[i] = (char *) argp; + break; + } + } + argn += ALIGN(arg_types[i]->size, sizeof(ffi_arg)) / sizeof(ffi_arg); + i++; + } + + /* Invoke the closure. */ + (closure->fun) (cif, rvalue, avaluep, closure->user_data); + + return cif->flags >> (FFI_FLAG_BITS * 8); +} + +#endif /* FFI_MIPS_N32 */ + +#endif /* FFI_CLOSURES */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffitarget.h new file mode 100644 index 0000000..637adbf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffitarget.h @@ -0,0 +1,242 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for MIPS. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifdef linux +# include +#elif defined(__rtems__) +/* + * Subprogram calling convention - copied from sgidefs.h + */ +#define _MIPS_SIM_ABI32 1 +#define _MIPS_SIM_NABI32 2 +#define _MIPS_SIM_ABI64 3 +#elif !defined(__OpenBSD__) +# include +#endif + +# ifndef _ABIN32 +# define _ABIN32 _MIPS_SIM_NABI32 +# endif +# ifndef _ABI64 +# define _ABI64 _MIPS_SIM_ABI64 +# endif +# ifndef _ABIO32 +# define _ABIO32 _MIPS_SIM_ABI32 +# endif + +#if !defined(_MIPS_SIM) +# error -- something is very wrong -- +#else +# if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64)) +# define FFI_MIPS_N32 +# else +# if (_MIPS_SIM==_ABIO32 && defined(_ABIO32)) +# define FFI_MIPS_O32 +# else +# error -- this is an unsupported platform -- +# endif +# endif +#endif + +#ifdef FFI_MIPS_O32 +/* O32 stack frames have 32bit integer args */ +# define FFI_SIZEOF_ARG 4 +#else +/* N32 and N64 frames have 64bit integer args */ +# define FFI_SIZEOF_ARG 8 +# if _MIPS_SIM == _ABIN32 +# define FFI_SIZEOF_JAVA_RAW 4 +# endif +#endif + +#define FFI_FLAG_BITS 2 + +/* SGI's strange assembler requires that we multiply by 4 rather + than shift left by FFI_FLAG_BITS */ + +#define FFI_ARGS_D FFI_TYPE_DOUBLE +#define FFI_ARGS_F FFI_TYPE_FLOAT +#define FFI_ARGS_DD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_DOUBLE +#define FFI_ARGS_FF FFI_TYPE_FLOAT * 4 + FFI_TYPE_FLOAT +#define FFI_ARGS_FD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_FLOAT +#define FFI_ARGS_DF FFI_TYPE_FLOAT * 4 + FFI_TYPE_DOUBLE + +/* Needed for N32 structure returns */ +#define FFI_TYPE_SMALLSTRUCT FFI_TYPE_UINT8 +#define FFI_TYPE_SMALLSTRUCT2 FFI_TYPE_SINT8 + +#if 0 +/* The SGI assembler can't handle this.. */ +#define FFI_TYPE_STRUCT_DD (( FFI_ARGS_DD ) << 4) + FFI_TYPE_STRUCT +/* (and so on) */ +#else +/* ...so we calculate these by hand! */ +#define FFI_TYPE_STRUCT_D 61 +#define FFI_TYPE_STRUCT_F 45 +#define FFI_TYPE_STRUCT_DD 253 +#define FFI_TYPE_STRUCT_FF 173 +#define FFI_TYPE_STRUCT_FD 237 +#define FFI_TYPE_STRUCT_DF 189 +#define FFI_TYPE_STRUCT_SMALL 93 +#define FFI_TYPE_STRUCT_SMALL2 109 + +/* and for n32 soft float, add 16 * 2^4 */ +#define FFI_TYPE_STRUCT_D_SOFT 317 +#define FFI_TYPE_STRUCT_F_SOFT 301 +#define FFI_TYPE_STRUCT_DD_SOFT 509 +#define FFI_TYPE_STRUCT_FF_SOFT 429 +#define FFI_TYPE_STRUCT_FD_SOFT 493 +#define FFI_TYPE_STRUCT_DF_SOFT 445 +#define FFI_TYPE_STRUCT_SOFT 16 +#endif + +#ifdef LIBFFI_ASM +#define v0 $2 +#define v1 $3 +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +#define a4 $8 +#define a5 $9 +#define a6 $10 +#define a7 $11 +#define t0 $8 +#define t1 $9 +#define t2 $10 +#define t3 $11 +#define t4 $12 +#define t5 $13 +#define t6 $14 +#define t7 $15 +#define t8 $24 +#define t9 $25 +#define ra $31 + +#ifdef FFI_MIPS_O32 +# define REG_L lw +# define REG_S sw +# define SUBU subu +# define ADDU addu +# define SRL srl +# define LI li +#else /* !FFI_MIPS_O32 */ +# define REG_L ld +# define REG_S sd +# define SUBU dsubu +# define ADDU daddu +# define SRL dsrl +# define LI dli +# if (_MIPS_SIM==_ABI64) +# define LA dla +# define EH_FRAME_ALIGN 3 +# define FDE_ADDR_BYTES .8byte +# else +# define LA la +# define EH_FRAME_ALIGN 2 +# define FDE_ADDR_BYTES .4byte +# endif /* _MIPS_SIM==_ABI64 */ +#endif /* !FFI_MIPS_O32 */ +#else /* !LIBFFI_ASM */ +# ifdef __GNUC__ +# ifdef FFI_MIPS_O32 +/* O32 stack frames have 32bit integer args */ +typedef unsigned int ffi_arg __attribute__((__mode__(__SI__))); +typedef signed int ffi_sarg __attribute__((__mode__(__SI__))); +#else +/* N32 and N64 frames have 64bit integer args */ +typedef unsigned int ffi_arg __attribute__((__mode__(__DI__))); +typedef signed int ffi_sarg __attribute__((__mode__(__DI__))); +# endif +# else +# ifdef FFI_MIPS_O32 +/* O32 stack frames have 32bit integer args */ +typedef __uint32_t ffi_arg; +typedef __int32_t ffi_sarg; +# else +/* N32 and N64 frames have 64bit integer args */ +typedef __uint64_t ffi_arg; +typedef __int64_t ffi_sarg; +# endif +# endif /* __GNUC__ */ + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_O32, + FFI_N32, + FFI_N64, + FFI_O32_SOFT_FLOAT, + FFI_N32_SOFT_FLOAT, + FFI_N64_SOFT_FLOAT, + FFI_LAST_ABI, + +#ifdef FFI_MIPS_O32 +#ifdef __mips_soft_float + FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT +#else + FFI_DEFAULT_ABI = FFI_O32 +#endif +#else +# if _MIPS_SIM==_ABI64 +# ifdef __mips_soft_float + FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT +# else + FFI_DEFAULT_ABI = FFI_N64 +# endif +# else +# ifdef __mips_soft_float + FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT +# else + FFI_DEFAULT_ABI = FFI_N32 +# endif +# endif +#endif +} ffi_abi; + +#define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag +#endif /* !LIBFFI_ASM */ + +/* ---- Definitions for closures ----------------------------------------- */ + +#if defined(FFI_MIPS_O32) +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 20 +#else +/* N32/N64. */ +# define FFI_CLOSURES 1 +#if _MIPS_SIM==_ABI64 +#define FFI_TRAMPOLINE_SIZE 52 +#else +#define FFI_TRAMPOLINE_SIZE 20 +#endif +#endif /* FFI_MIPS_O32 */ +#define FFI_NATIVE_RAW_API 0 + +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/n32.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/n32.S new file mode 100644 index 0000000..ae23094 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/n32.S @@ -0,0 +1,591 @@ +/* ----------------------------------------------------------------------- + n32.S - Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010 Red Hat, Inc. + + MIPS Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + +/* Only build this code if we are compiling for n32 */ + +#if defined(FFI_MIPS_N32) + +#define callback a0 +#define bytes a2 +#define flags a3 +#define raddr a4 +#define fn a5 + +#define SIZEOF_FRAME ( 8 * FFI_SIZEOF_ARG ) + +#ifdef __GNUC__ + .abicalls +#endif + .text + .align 2 + .globl ffi_call_N32 + .ent ffi_call_N32 +ffi_call_N32: +.LFB3: + .frame $fp, SIZEOF_FRAME, ra + .mask 0xc0000000,-FFI_SIZEOF_ARG + .fmask 0x00000000,0 + + # Prologue + SUBU $sp, SIZEOF_FRAME # Frame size +.LCFI0: + REG_S $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Save frame pointer + REG_S ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Save return address +.LCFI1: + move $fp, $sp +.LCFI3: + move t9, callback # callback function pointer + REG_S bytes, 2*FFI_SIZEOF_ARG($fp) # bytes + REG_S flags, 3*FFI_SIZEOF_ARG($fp) # flags + REG_S raddr, 4*FFI_SIZEOF_ARG($fp) # raddr + REG_S fn, 5*FFI_SIZEOF_ARG($fp) # fn + + # Allocate at least 4 words in the argstack + move v0, bytes + bge bytes, 4 * FFI_SIZEOF_ARG, bigger + LI v0, 4 * FFI_SIZEOF_ARG + b sixteen + + bigger: + ADDU t4, v0, 2 * FFI_SIZEOF_ARG -1 # make sure it is aligned + and v0, t4, -2 * FFI_SIZEOF_ARG # to a proper boundry. + +sixteen: + SUBU $sp, $sp, v0 # move the stack pointer to reflect the + # arg space + + move a0, $sp # 4 * FFI_SIZEOF_ARG + ADDU a3, $fp, 3 * FFI_SIZEOF_ARG + + # Call ffi_prep_args + jal t9 + + # Copy the stack pointer to t9 + move t9, $sp + + # Fix the stack if there are more than 8 64bit slots worth + # of arguments. + + # Load the number of bytes + REG_L t6, 2*FFI_SIZEOF_ARG($fp) + + # Is it bigger than 8 * FFI_SIZEOF_ARG? + daddiu t8, t6, -(8 * FFI_SIZEOF_ARG) + bltz t8, loadregs + + ADDU t9, t9, t8 + +loadregs: + + REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6. + + and t4, t6, ((1< +#include + +/* Only build this code if we are compiling for o32 */ + +#if defined(FFI_MIPS_O32) + +#define callback a0 +#define bytes a2 +#define flags a3 + +#define SIZEOF_FRAME (4 * FFI_SIZEOF_ARG + 2 * FFI_SIZEOF_ARG) +#define A3_OFF (SIZEOF_FRAME + 3 * FFI_SIZEOF_ARG) +#define FP_OFF (SIZEOF_FRAME - 2 * FFI_SIZEOF_ARG) +#define RA_OFF (SIZEOF_FRAME - 1 * FFI_SIZEOF_ARG) + + .abicalls + .text + .align 2 + .globl ffi_call_O32 + .ent ffi_call_O32 +ffi_call_O32: +$LFB0: + # Prologue + SUBU $sp, SIZEOF_FRAME # Frame size +$LCFI0: + REG_S $fp, FP_OFF($sp) # Save frame pointer +$LCFI1: + REG_S ra, RA_OFF($sp) # Save return address +$LCFI2: + move $fp, $sp + +$LCFI3: + move t9, callback # callback function pointer + REG_S flags, A3_OFF($fp) # flags + + # Allocate at least 4 words in the argstack + LI v0, 4 * FFI_SIZEOF_ARG + blt bytes, v0, sixteen + + ADDU v0, bytes, 7 # make sure it is aligned + and v0, -8 # to an 8 byte boundry + +sixteen: + SUBU $sp, v0 # move the stack pointer to reflect the + # arg space + + ADDU a0, $sp, 4 * FFI_SIZEOF_ARG + + jalr t9 + + REG_L t0, A3_OFF($fp) # load the flags word + SRL t2, t0, 4 # shift our arg info + and t0, ((1<<4)-1) # mask out the return type + + ADDU $sp, 4 * FFI_SIZEOF_ARG # adjust $sp to new args + + bnez t0, pass_d # make it quick for int + REG_L a0, 0*FFI_SIZEOF_ARG($sp) # just go ahead and load the + REG_L a1, 1*FFI_SIZEOF_ARG($sp) # four regs. + REG_L a2, 2*FFI_SIZEOF_ARG($sp) + REG_L a3, 3*FFI_SIZEOF_ARG($sp) + b call_it + +pass_d: + bne t0, FFI_ARGS_D, pass_f + l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + REG_L a2, 2*FFI_SIZEOF_ARG($sp) # passing a double + REG_L a3, 3*FFI_SIZEOF_ARG($sp) + b call_it + +pass_f: + bne t0, FFI_ARGS_F, pass_d_d + l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + REG_L a1, 1*FFI_SIZEOF_ARG($sp) # passing a float + REG_L a2, 2*FFI_SIZEOF_ARG($sp) + REG_L a3, 3*FFI_SIZEOF_ARG($sp) + b call_it + +pass_d_d: + bne t0, FFI_ARGS_DD, pass_f_f + l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing two doubles + b call_it + +pass_f_f: + bne t0, FFI_ARGS_FF, pass_d_f + l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + l.s $f14, 1*FFI_SIZEOF_ARG($sp) # passing two floats + REG_L a2, 2*FFI_SIZEOF_ARG($sp) + REG_L a3, 3*FFI_SIZEOF_ARG($sp) + b call_it + +pass_d_f: + bne t0, FFI_ARGS_DF, pass_f_d + l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + l.s $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float + REG_L a3, 3*FFI_SIZEOF_ARG($sp) + b call_it + +pass_f_d: + # assume that the only other combination must be float then double + # bne t0, FFI_ARGS_F_D, call_it + l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float + +call_it: + # Load the function pointer + REG_L t9, SIZEOF_FRAME + 5*FFI_SIZEOF_ARG($fp) + + # If the return value pointer is NULL, assume no return value. + REG_L t1, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) + beqz t1, noretval + + bne t2, FFI_TYPE_INT, retlonglong + jalr t9 + REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) + REG_S v0, 0(t0) + b epilogue + +retlonglong: + # Really any 64-bit int, signed or not. + bne t2, FFI_TYPE_UINT64, retfloat + jalr t9 + REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) + REG_S v1, 4(t0) + REG_S v0, 0(t0) + b epilogue + +retfloat: + bne t2, FFI_TYPE_FLOAT, retdouble + jalr t9 + REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) + s.s $f0, 0(t0) + b epilogue + +retdouble: + bne t2, FFI_TYPE_DOUBLE, noretval + jalr t9 + REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) + s.d $f0, 0(t0) + b epilogue + +noretval: + jalr t9 + + # Epilogue +epilogue: + move $sp, $fp + REG_L $fp, FP_OFF($sp) # Restore frame pointer + REG_L ra, RA_OFF($sp) # Restore return address + ADDU $sp, SIZEOF_FRAME # Fix stack pointer + j ra + +$LFE0: + .end ffi_call_O32 + + +/* ffi_closure_O32. Expects address of the passed-in ffi_closure + in t4 ($12). Stores any arguments passed in registers onto the + stack, then calls ffi_closure_mips_inner_O32, which + then decodes them. + + Stack layout: + + 3 - a3 save + 2 - a2 save + 1 - a1 save + 0 - a0 save, original sp + -1 - ra save + -2 - fp save + -3 - $16 (s0) save + -4 - cprestore + -5 - return value high (v1) + -6 - return value low (v0) + -7 - f14 (le high, be low) + -8 - f14 (le low, be high) + -9 - f12 (le high, be low) + -10 - f12 (le low, be high) + -11 - Called function a3 save + -12 - Called function a2 save + -13 - Called function a1 save + -14 - Called function a0 save, our sp and fp point here + */ + +#define SIZEOF_FRAME2 (14 * FFI_SIZEOF_ARG) +#define A3_OFF2 (SIZEOF_FRAME2 + 3 * FFI_SIZEOF_ARG) +#define A2_OFF2 (SIZEOF_FRAME2 + 2 * FFI_SIZEOF_ARG) +#define A1_OFF2 (SIZEOF_FRAME2 + 1 * FFI_SIZEOF_ARG) +#define A0_OFF2 (SIZEOF_FRAME2 + 0 * FFI_SIZEOF_ARG) +#define RA_OFF2 (SIZEOF_FRAME2 - 1 * FFI_SIZEOF_ARG) +#define FP_OFF2 (SIZEOF_FRAME2 - 2 * FFI_SIZEOF_ARG) +#define S0_OFF2 (SIZEOF_FRAME2 - 3 * FFI_SIZEOF_ARG) +#define GP_OFF2 (SIZEOF_FRAME2 - 4 * FFI_SIZEOF_ARG) +#define V1_OFF2 (SIZEOF_FRAME2 - 5 * FFI_SIZEOF_ARG) +#define V0_OFF2 (SIZEOF_FRAME2 - 6 * FFI_SIZEOF_ARG) +#define FA_1_1_OFF2 (SIZEOF_FRAME2 - 7 * FFI_SIZEOF_ARG) +#define FA_1_0_OFF2 (SIZEOF_FRAME2 - 8 * FFI_SIZEOF_ARG) +#define FA_0_1_OFF2 (SIZEOF_FRAME2 - 9 * FFI_SIZEOF_ARG) +#define FA_0_0_OFF2 (SIZEOF_FRAME2 - 10 * FFI_SIZEOF_ARG) + + .text + .align 2 + .globl ffi_closure_O32 + .ent ffi_closure_O32 +ffi_closure_O32: +$LFB1: + # Prologue + .frame $fp, SIZEOF_FRAME2, ra + .set noreorder + .cpload t9 + .set reorder + SUBU $sp, SIZEOF_FRAME2 + .cprestore GP_OFF2 +$LCFI4: + REG_S $16, S0_OFF2($sp) # Save s0 + REG_S $fp, FP_OFF2($sp) # Save frame pointer + REG_S ra, RA_OFF2($sp) # Save return address +$LCFI6: + move $fp, $sp + +$LCFI7: + # Store all possible argument registers. If there are more than + # four arguments, then they are stored above where we put a3. + REG_S a0, A0_OFF2($fp) + REG_S a1, A1_OFF2($fp) + REG_S a2, A2_OFF2($fp) + REG_S a3, A3_OFF2($fp) + + # Load ABI enum to s0 + REG_L $16, 20($12) # cif pointer follows tramp. + REG_L $16, 0($16) # abi is first member. + + li $13, 1 # FFI_O32 + bne $16, $13, 1f # Skip fp save if FFI_O32_SOFT_FLOAT + + # Store all possible float/double registers. + s.d $f12, FA_0_0_OFF2($fp) + s.d $f14, FA_1_0_OFF2($fp) +1: + # Call ffi_closure_mips_inner_O32 to do the work. + la t9, ffi_closure_mips_inner_O32 + move a0, $12 # Pointer to the ffi_closure + addu a1, $fp, V0_OFF2 + addu a2, $fp, A0_OFF2 + addu a3, $fp, FA_0_0_OFF2 + jalr t9 + + # Load the return value into the appropriate register. + move $8, $2 + li $9, FFI_TYPE_VOID + beq $8, $9, closure_done + + li $13, 1 # FFI_O32 + bne $16, $13, 1f # Skip fp restore if FFI_O32_SOFT_FLOAT + + li $9, FFI_TYPE_FLOAT + l.s $f0, V0_OFF2($fp) + beq $8, $9, closure_done + + li $9, FFI_TYPE_DOUBLE + l.d $f0, V0_OFF2($fp) + beq $8, $9, closure_done +1: + REG_L $3, V1_OFF2($fp) + REG_L $2, V0_OFF2($fp) + +closure_done: + # Epilogue + move $sp, $fp + REG_L $16, S0_OFF2($sp) # Restore s0 + REG_L $fp, FP_OFF2($sp) # Restore frame pointer + REG_L ra, RA_OFF2($sp) # Restore return address + ADDU $sp, SIZEOF_FRAME2 + j ra +$LFE1: + .end ffi_closure_O32 + +/* DWARF-2 unwind info. */ + + .section .eh_frame,"a",@progbits +$Lframe0: + .4byte $LECIE0-$LSCIE0 # Length of Common Information Entry +$LSCIE0: + .4byte 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "zR\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 4 # CIE Data Alignment Factor + .byte 0x1f # CIE RA Column + .uleb128 0x1 # Augmentation size + .byte 0x00 # FDE Encoding (absptr) + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x1d + .uleb128 0x0 + .align 2 +$LECIE0: +$LSFDE0: + .4byte $LEFDE0-$LASFDE0 # FDE Length +$LASFDE0: + .4byte $LASFDE0-$Lframe0 # FDE CIE offset + .4byte $LFB0 # FDE initial location + .4byte $LFE0-$LFB0 # FDE address range + .uleb128 0x0 # Augmentation size + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI0-$LFB0 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x18 + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI2-$LCFI0 + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x1e # $fp + .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x1f # $ra + .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI3-$LCFI2 + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x1e + .uleb128 0x18 + .align 2 +$LEFDE0: +$LSFDE1: + .4byte $LEFDE1-$LASFDE1 # FDE Length +$LASFDE1: + .4byte $LASFDE1-$Lframe0 # FDE CIE offset + .4byte $LFB1 # FDE initial location + .4byte $LFE1-$LFB1 # FDE address range + .uleb128 0x0 # Augmentation size + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI4-$LFB1 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x38 + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI6-$LCFI4 + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x10 # $16 + .sleb128 -3 # SIZEOF_FRAME2 - 3*FFI_SIZEOF_ARG($sp) + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x1e # $fp + .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x1f # $ra + .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI7-$LCFI6 + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x1e + .uleb128 0x38 + .align 2 +$LEFDE1: + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/eabi.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/eabi.S new file mode 100644 index 0000000..379ea4b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/eabi.S @@ -0,0 +1,128 @@ +/* ----------------------------------------------------------------------- + eabi.S - Copyright (c) 2004 Anthony Green + + FR-V Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + + .globl ffi_prep_args_EABI + + .text + .p2align 4 + .globl ffi_call_EABI + .type ffi_call_EABI, @function + + # gr8 : ffi_prep_args + # gr9 : &ecif + # gr10: cif->bytes + # gr11: fig->flags + # gr12: ecif.rvalue + # gr13: fn + +ffi_call_EABI: + addi sp, #-80, sp + sti fp, @(sp, #24) + addi sp, #24, fp + movsg lr, gr5 + + /* Make room for the new arguments. */ + /* subi sp, fp, gr10 */ + + /* Store return address and incoming args on stack. */ + sti gr5, @(fp, #8) + sti gr8, @(fp, #-4) + sti gr9, @(fp, #-8) + sti gr10, @(fp, #-12) + sti gr11, @(fp, #-16) + sti gr12, @(fp, #-20) + sti gr13, @(fp, #-24) + + sub sp, gr10, sp + + /* Call ffi_prep_args. */ + ldi @(fp, #-4), gr4 + addi sp, #0, gr8 + ldi @(fp, #-8), gr9 +#ifdef __FRV_FDPIC__ + ldd @(gr4, gr0), gr14 + calll @(gr14, gr0) +#else + calll @(gr4, gr0) +#endif + + /* ffi_prep_args returns the new stack pointer. */ + mov gr8, gr4 + + ldi @(sp, #0), gr8 + ldi @(sp, #4), gr9 + ldi @(sp, #8), gr10 + ldi @(sp, #12), gr11 + ldi @(sp, #16), gr12 + ldi @(sp, #20), gr13 + + /* Always copy the return value pointer into the hidden + parameter register. This is only strictly necessary + when we're returning an aggregate type, but it doesn't + hurt to do this all the time, and it saves a branch. */ + ldi @(fp, #-20), gr3 + + /* Use the ffi_prep_args return value for the new sp. */ + mov gr4, sp + + /* Call the target function. */ + ldi @(fp, -24), gr4 +#ifdef __FRV_FDPIC__ + ldd @(gr4, gr0), gr14 + calll @(gr14, gr0) +#else + calll @(gr4, gr0) +#endif + + /* Store the result. */ + ldi @(fp, #-16), gr10 /* fig->flags */ + ldi @(fp, #-20), gr4 /* ecif.rvalue */ + + /* Is the return value stored in two registers? */ + cmpi gr10, #8, icc0 + bne icc0, 0, .L2 + /* Yes, save them. */ + sti gr8, @(gr4, #0) + sti gr9, @(gr4, #4) + bra .L3 +.L2: + /* Is the return value a structure? */ + cmpi gr10, #-1, icc0 + beq icc0, 0, .L3 + /* No, save a 4 byte return value. */ + sti gr8, @(gr4, #0) +.L3: + + /* Restore the stack, and return. */ + ldi @(fp, 8), gr5 + ld @(fp, gr0), fp + addi sp,#80,sp + jmpl @(gr5,gr0) + .size ffi_call_EABI, .-ffi_call_EABI + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/ffi.c new file mode 100644 index 0000000..54cbbb9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/ffi.c @@ -0,0 +1,276 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (C) 2009 Anthony Green + + Moxie Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void *ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + register int count = 0; + + p_argv = ecif->avalue; + argp = stack; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); + i--, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + + if ((*p_arg)->type == FFI_TYPE_STRUCT) + { + z = sizeof(void*); + *(void **) argp = *p_argv; + } + /* if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (count > 24) + { + // This is going on the stack. Turn it into a double. + *(double *) argp = (double) *(float*)(* p_argv); + z = sizeof(double); + } + else + *(void **) argp = *(void **)(* p_argv); + } */ + else if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else if (z == sizeof(int)) + { + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + count += z; + } + + return (stack + ((count > 24) ? 24 : ALIGN_DOWN(count, 8))); +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + if (cif->rtype->type == FFI_TYPE_STRUCT) + cif->flags = -1; + else + cif->flags = cif->rtype->size; + + cif->bytes = ALIGN (cif->bytes, 8); + + return FFI_OK; +} + +extern void ffi_call_EABI(void *(*)(char *, extended_cif *), + extended_cif *, + unsigned, unsigned, + unsigned *, + void (*fn)(void)); + +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_EABI: + ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; + default: + FFI_ASSERT(0); + break; + } +} + +void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3, + unsigned arg4, unsigned arg5, unsigned arg6) +{ + /* This function is called by a trampoline. The trampoline stows a + pointer to the ffi_closure object in gr7. We must save this + pointer in a place that will persist while we do our work. */ + register ffi_closure *creg __asm__ ("gr7"); + ffi_closure *closure = creg; + + /* Arguments that don't fit in registers are found on the stack + at a fixed offset above the current frame pointer. */ + register char *frame_pointer __asm__ ("fp"); + char *stack_args = frame_pointer + 16; + + /* Lay the register arguments down in a continuous chunk of memory. */ + unsigned register_args[6] = + { arg1, arg2, arg3, arg4, arg5, arg6 }; + + ffi_cif *cif = closure->cif; + ffi_type **arg_types = cif->arg_types; + void **avalue = alloca (cif->nargs * sizeof(void *)); + char *ptr = (char *) register_args; + int i; + + /* Find the address of each argument. */ + for (i = 0; i < cif->nargs; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = ptr + 3; + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = ptr + 2; + break; + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_FLOAT: + avalue[i] = ptr; + break; + case FFI_TYPE_STRUCT: + avalue[i] = *(void**)ptr; + break; + default: + /* This is an 8-byte value. */ + avalue[i] = ptr; + ptr += 4; + break; + } + ptr += 4; + + /* If we've handled more arguments than fit in registers, + start looking at the those passed on the stack. */ + if (ptr == ((char *)register_args + (6*4))) + ptr = stack_args; + } + + /* Invoke the closure. */ + if (cif->rtype->type == FFI_TYPE_STRUCT) + { + /* The caller allocates space for the return structure, and + passes a pointer to this space in gr3. Use this value directly + as the return value. */ + register void *return_struct_ptr __asm__("gr3"); + (closure->fun) (cif, return_struct_ptr, avalue, closure->user_data); + } + else + { + /* Allocate space for the return value and call the function. */ + long long rvalue; + (closure->fun) (cif, &rvalue, avalue, closure->user_data); + + /* Functions return 4-byte or smaller results in gr8. 8-byte + values also use gr9. We fill the both, even for small return + values, just to avoid a branch. */ + asm ("ldi @(%0, #0), gr8" : : "r" (&rvalue)); + asm ("ldi @(%0, #0), gr9" : : "r" (&((int *) &rvalue)[1])); + } +} + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + unsigned long fn = (long) ffi_closure_eabi; + unsigned long cls = (long) codeloc; + int i; + + fn = (unsigned long) ffi_closure_eabi; + + tramp[0] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ + tramp[1] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ + tramp[2] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ + tramp[3] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ + tramp[4] = 0x80300006; /* jmpl @(gr0, gr6) */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + /* Cache flushing. */ + for (i = 0; i < FFI_TRAMPOLINE_SIZE; i++) + __asm__ volatile ("dcf @(%0,%1)\n\tici @(%2,%1)" :: "r" (tramp), "r" (i), + "r" (codeloc)); + + return FFI_OK; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffi.c new file mode 100644 index 0000000..4ce2bc6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffi.c @@ -0,0 +1,719 @@ +/* ----------------------------------------------------------------------- + ffi.c - (c) 2011 Anthony Green + (c) 2008 Red Hat, Inc. + (c) 2006 Free Software Foundation, Inc. + (c) 2003-2004 Randolph Chung + + HPPA Foreign Function Interface + HP-UX PA ABI support + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +#define ROUND_UP(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) + +#define MIN_STACK_SIZE 64 +#define FIRST_ARG_SLOT 9 +#define DEBUG_LEVEL 0 + +#define fldw(addr, fpreg) \ + __asm__ volatile ("fldw 0(%0), %%" #fpreg "L" : : "r"(addr) : #fpreg) +#define fstw(fpreg, addr) \ + __asm__ volatile ("fstw %%" #fpreg "L, 0(%0)" : : "r"(addr)) +#define fldd(addr, fpreg) \ + __asm__ volatile ("fldd 0(%0), %%" #fpreg : : "r"(addr) : #fpreg) +#define fstd(fpreg, addr) \ + __asm__ volatile ("fstd %%" #fpreg "L, 0(%0)" : : "r"(addr)) + +#define debug(lvl, x...) do { if (lvl <= DEBUG_LEVEL) { printf(x); } } while (0) + +static inline int ffi_struct_type(ffi_type *t) +{ + size_t sz = t->size; + + /* Small structure results are passed in registers, + larger ones are passed by pointer. Note that + small structures of size 2, 4 and 8 differ from + the corresponding integer types in that they have + different alignment requirements. */ + + if (sz <= 1) + return FFI_TYPE_UINT8; + else if (sz == 2) + return FFI_TYPE_SMALL_STRUCT2; + else if (sz == 3) + return FFI_TYPE_SMALL_STRUCT3; + else if (sz == 4) + return FFI_TYPE_SMALL_STRUCT4; + else if (sz == 5) + return FFI_TYPE_SMALL_STRUCT5; + else if (sz == 6) + return FFI_TYPE_SMALL_STRUCT6; + else if (sz == 7) + return FFI_TYPE_SMALL_STRUCT7; + else if (sz <= 8) + return FFI_TYPE_SMALL_STRUCT8; + else + return FFI_TYPE_STRUCT; /* else, we pass it by pointer. */ +} + +/* PA has a downward growing stack, which looks like this: + + Offset + [ Variable args ] + SP = (4*(n+9)) arg word N + ... + SP-52 arg word 4 + [ Fixed args ] + SP-48 arg word 3 + SP-44 arg word 2 + SP-40 arg word 1 + SP-36 arg word 0 + [ Frame marker ] + ... + SP-20 RP + SP-4 previous SP + + The first four argument words on the stack are reserved for use by + the callee. Instead, the general and floating registers replace + the first four argument slots. Non FP arguments are passed solely + in the general registers. FP arguments are passed in both general + and floating registers when using libffi. + + Non-FP 32-bit args are passed in gr26, gr25, gr24 and gr23. + Non-FP 64-bit args are passed in register pairs, starting + on an odd numbered register (i.e. r25+r26 and r23+r24). + FP 32-bit arguments are passed in fr4L, fr5L, fr6L and fr7L. + FP 64-bit arguments are passed in fr5 and fr7. + + The registers are allocated in the same manner as stack slots. + This allows the callee to save its arguments on the stack if + necessary: + + arg word 3 -> gr23 or fr7L + arg word 2 -> gr24 or fr6L or fr7R + arg word 1 -> gr25 or fr5L + arg word 0 -> gr26 or fr4L or fr5R + + Note that fr4R and fr6R are never used for arguments (i.e., + doubles are not passed in fr4 or fr6). + + The rest of the arguments are passed on the stack starting at SP-52, + but 64-bit arguments need to be aligned to an 8-byte boundary + + This means we can have holes either in the register allocation, + or in the stack. */ + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments + + The following code will put everything into the stack frame + (which was allocated by the asm routine), and on return + the asm routine will load the arguments that should be + passed by register into the appropriate registers + + NOTE: We load floating point args in this function... that means we + assume gcc will not mess with fp regs in here. */ + +void ffi_prep_args_pa32(UINT32 *stack, extended_cif *ecif, unsigned bytes) +{ + register unsigned int i; + register ffi_type **p_arg; + register void **p_argv; + unsigned int slot = FIRST_ARG_SLOT; + char *dest_cpy; + size_t len; + + debug(1, "%s: stack = %p, ecif = %p, bytes = %u\n", __FUNCTION__, stack, + ecif, bytes); + + p_arg = ecif->cif->arg_types; + p_argv = ecif->avalue; + + for (i = 0; i < ecif->cif->nargs; i++) + { + int type = (*p_arg)->type; + + switch (type) + { + case FFI_TYPE_SINT8: + *(SINT32 *)(stack - slot) = *(SINT8 *)(*p_argv); + break; + + case FFI_TYPE_UINT8: + *(UINT32 *)(stack - slot) = *(UINT8 *)(*p_argv); + break; + + case FFI_TYPE_SINT16: + *(SINT32 *)(stack - slot) = *(SINT16 *)(*p_argv); + break; + + case FFI_TYPE_UINT16: + *(UINT32 *)(stack - slot) = *(UINT16 *)(*p_argv); + break; + + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + debug(3, "Storing UINT32 %u in slot %u\n", *(UINT32 *)(*p_argv), + slot); + *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + /* Align slot for 64-bit type. */ + slot += (slot & 1) ? 1 : 2; + *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv); + break; + + case FFI_TYPE_FLOAT: + /* First 4 args go in fr4L - fr7L. */ + debug(3, "Storing UINT32(float) in slot %u\n", slot); + *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); + switch (slot - FIRST_ARG_SLOT) + { + /* First 4 args go in fr4L - fr7L. */ + case 0: fldw(stack - slot, fr4); break; + case 1: fldw(stack - slot, fr5); break; + case 2: fldw(stack - slot, fr6); break; + case 3: fldw(stack - slot, fr7); break; + } + break; + + case FFI_TYPE_DOUBLE: + /* Align slot for 64-bit type. */ + slot += (slot & 1) ? 1 : 2; + debug(3, "Storing UINT64(double) at slot %u\n", slot); + *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv); + switch (slot - FIRST_ARG_SLOT) + { + /* First 2 args go in fr5, fr7. */ + case 1: fldd(stack - slot, fr5); break; + case 3: fldd(stack - slot, fr7); break; + } + break; + +#ifdef PA_HPUX + case FFI_TYPE_LONGDOUBLE: + /* Long doubles are passed in the same manner as structures + larger than 8 bytes. */ + *(UINT32 *)(stack - slot) = (UINT32)(*p_argv); + break; +#endif + + case FFI_TYPE_STRUCT: + + /* Structs smaller or equal than 4 bytes are passed in one + register. Structs smaller or equal 8 bytes are passed in two + registers. Larger structures are passed by pointer. */ + + len = (*p_arg)->size; + if (len <= 4) + { + dest_cpy = (char *)(stack - slot) + 4 - len; + memcpy(dest_cpy, (char *)*p_argv, len); + } + else if (len <= 8) + { + slot += (slot & 1) ? 1 : 2; + dest_cpy = (char *)(stack - slot) + 8 - len; + memcpy(dest_cpy, (char *)*p_argv, len); + } + else + *(UINT32 *)(stack - slot) = (UINT32)(*p_argv); + break; + + default: + FFI_ASSERT(0); + } + + slot++; + p_arg++; + p_argv++; + } + + /* Make sure we didn't mess up and scribble on the stack. */ + { + unsigned int n; + + debug(5, "Stack setup:\n"); + for (n = 0; n < (bytes + 3) / 4; n++) + { + if ((n%4) == 0) { debug(5, "\n%08x: ", (unsigned int)(stack - n)); } + debug(5, "%08x ", *(stack - n)); + } + debug(5, "\n"); + } + + FFI_ASSERT(slot * 4 <= bytes); + + return; +} + +static void ffi_size_stack_pa32(ffi_cif *cif) +{ + ffi_type **ptr; + int i; + int z = 0; /* # stack slots */ + + for (ptr = cif->arg_types, i = 0; i < cif->nargs; ptr++, i++) + { + int type = (*ptr)->type; + + switch (type) + { + case FFI_TYPE_DOUBLE: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + z += 2 + (z & 1); /* must start on even regs, so we may waste one */ + break; + +#ifdef PA_HPUX + case FFI_TYPE_LONGDOUBLE: +#endif + case FFI_TYPE_STRUCT: + z += 1; /* pass by ptr, callee will copy */ + break; + + default: /* <= 32-bit values */ + z++; + } + } + + /* We can fit up to 6 args in the default 64-byte stack frame, + if we need more, we need more stack. */ + if (z <= 6) + cif->bytes = MIN_STACK_SIZE; /* min stack size */ + else + cif->bytes = 64 + ROUND_UP((z - 6) * sizeof(UINT32), MIN_STACK_SIZE); + + debug(3, "Calculated stack size is %u bytes\n", cif->bytes); +} + +/* Perform machine dependent cif processing. */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags = (unsigned) cif->rtype->type; + break; + +#ifdef PA_HPUX + case FFI_TYPE_LONGDOUBLE: + /* Long doubles are treated like a structure. */ + cif->flags = FFI_TYPE_STRUCT; + break; +#endif + + case FFI_TYPE_STRUCT: + /* For the return type we have to check the size of the structures. + If the size is smaller or equal 4 bytes, the result is given back + in one register. If the size is smaller or equal 8 bytes than we + return the result in two registers. But if the size is bigger than + 8 bytes, we work with pointers. */ + cif->flags = ffi_struct_type(cif->rtype); + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + cif->flags = FFI_TYPE_UINT64; + break; + + default: + cif->flags = FFI_TYPE_INT; + break; + } + + /* Lucky us, because of the unique PA ABI we get to do our + own stack sizing. */ + switch (cif->abi) + { + case FFI_PA32: + ffi_size_stack_pa32(cif); + break; + + default: + FFI_ASSERT(0); + break; + } + + return FFI_OK; +} + +extern void ffi_call_pa32(void (*)(UINT32 *, extended_cif *, unsigned), + extended_cif *, unsigned, unsigned, unsigned *, + void (*fn)(void)); + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + + if (rvalue == NULL +#ifdef PA_HPUX + && (cif->rtype->type == FFI_TYPE_STRUCT + || cif->rtype->type == FFI_TYPE_LONGDOUBLE)) +#else + && cif->rtype->type == FFI_TYPE_STRUCT) +#endif + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_PA32: + debug(3, "Calling ffi_call_pa32: ecif=%p, bytes=%u, flags=%u, rvalue=%p, fn=%p\n", &ecif, cif->bytes, cif->flags, ecif.rvalue, (void *)fn); + ffi_call_pa32(ffi_prep_args_pa32, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; + + default: + FFI_ASSERT(0); + break; + } +} + +#if FFI_CLOSURES +/* This is more-or-less an inverse of ffi_call -- we have arguments on + the stack, and we need to fill them into a cif structure and invoke + the user function. This really ought to be in asm to make sure + the compiler doesn't do things we don't expect. */ +ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack) +{ + ffi_cif *cif; + void **avalue; + void *rvalue; + UINT32 ret[2]; /* function can return up to 64-bits in registers */ + ffi_type **p_arg; + char *tmp; + int i, avn; + unsigned int slot = FIRST_ARG_SLOT; + register UINT32 r28 asm("r28"); + + cif = closure->cif; + + /* If returning via structure, callee will write to our pointer. */ + if (cif->flags == FFI_TYPE_STRUCT) + rvalue = (void *)r28; + else + rvalue = &ret[0]; + + avalue = (void **)alloca(cif->nargs * FFI_SIZEOF_ARG); + avn = cif->nargs; + p_arg = cif->arg_types; + + for (i = 0; i < avn; i++) + { + int type = (*p_arg)->type; + + switch (type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + avalue[i] = (char *)(stack - slot) + sizeof(UINT32) - (*p_arg)->size; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + slot += (slot & 1) ? 1 : 2; + avalue[i] = (void *)(stack - slot); + break; + + case FFI_TYPE_FLOAT: +#ifdef PA_LINUX + /* The closure call is indirect. In Linux, floating point + arguments in indirect calls with a prototype are passed + in the floating point registers instead of the general + registers. So, we need to replace what was previously + stored in the current slot with the value in the + corresponding floating point register. */ + switch (slot - FIRST_ARG_SLOT) + { + case 0: fstw(fr4, (void *)(stack - slot)); break; + case 1: fstw(fr5, (void *)(stack - slot)); break; + case 2: fstw(fr6, (void *)(stack - slot)); break; + case 3: fstw(fr7, (void *)(stack - slot)); break; + } +#endif + avalue[i] = (void *)(stack - slot); + break; + + case FFI_TYPE_DOUBLE: + slot += (slot & 1) ? 1 : 2; +#ifdef PA_LINUX + /* See previous comment for FFI_TYPE_FLOAT. */ + switch (slot - FIRST_ARG_SLOT) + { + case 1: fstd(fr5, (void *)(stack - slot)); break; + case 3: fstd(fr7, (void *)(stack - slot)); break; + } +#endif + avalue[i] = (void *)(stack - slot); + break; + +#ifdef PA_HPUX + case FFI_TYPE_LONGDOUBLE: + /* Long doubles are treated like a big structure. */ + avalue[i] = (void *) *(stack - slot); + break; +#endif + + case FFI_TYPE_STRUCT: + /* Structs smaller or equal than 4 bytes are passed in one + register. Structs smaller or equal 8 bytes are passed in two + registers. Larger structures are passed by pointer. */ + if((*p_arg)->size <= 4) + { + avalue[i] = (void *)(stack - slot) + sizeof(UINT32) - + (*p_arg)->size; + } + else if ((*p_arg)->size <= 8) + { + slot += (slot & 1) ? 1 : 2; + avalue[i] = (void *)(stack - slot) + sizeof(UINT64) - + (*p_arg)->size; + } + else + avalue[i] = (void *) *(stack - slot); + break; + + default: + FFI_ASSERT(0); + } + + slot++; + p_arg++; + } + + /* Invoke the closure. */ + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + debug(3, "after calling function, ret[0] = %08x, ret[1] = %08x\n", ret[0], + ret[1]); + + /* Store the result using the lower 2 bytes of the flags. */ + switch (cif->flags) + { + case FFI_TYPE_UINT8: + *(stack - FIRST_ARG_SLOT) = (UINT8)(ret[0] >> 24); + break; + case FFI_TYPE_SINT8: + *(stack - FIRST_ARG_SLOT) = (SINT8)(ret[0] >> 24); + break; + case FFI_TYPE_UINT16: + *(stack - FIRST_ARG_SLOT) = (UINT16)(ret[0] >> 16); + break; + case FFI_TYPE_SINT16: + *(stack - FIRST_ARG_SLOT) = (SINT16)(ret[0] >> 16); + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + *(stack - FIRST_ARG_SLOT) = ret[0]; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + *(stack - FIRST_ARG_SLOT) = ret[0]; + *(stack - FIRST_ARG_SLOT - 1) = ret[1]; + break; + + case FFI_TYPE_DOUBLE: + fldd(rvalue, fr4); + break; + + case FFI_TYPE_FLOAT: + fldw(rvalue, fr4); + break; + + case FFI_TYPE_STRUCT: + /* Don't need a return value, done by caller. */ + break; + + case FFI_TYPE_SMALL_STRUCT2: + case FFI_TYPE_SMALL_STRUCT3: + case FFI_TYPE_SMALL_STRUCT4: + tmp = (void*)(stack - FIRST_ARG_SLOT); + tmp += 4 - cif->rtype->size; + memcpy((void*)tmp, &ret[0], cif->rtype->size); + break; + + case FFI_TYPE_SMALL_STRUCT5: + case FFI_TYPE_SMALL_STRUCT6: + case FFI_TYPE_SMALL_STRUCT7: + case FFI_TYPE_SMALL_STRUCT8: + { + unsigned int ret2[2]; + int off; + + /* Right justify ret[0] and ret[1] */ + switch (cif->flags) + { + case FFI_TYPE_SMALL_STRUCT5: off = 3; break; + case FFI_TYPE_SMALL_STRUCT6: off = 2; break; + case FFI_TYPE_SMALL_STRUCT7: off = 1; break; + default: off = 0; break; + } + + memset (ret2, 0, sizeof (ret2)); + memcpy ((char *)ret2 + off, ret, 8 - off); + + *(stack - FIRST_ARG_SLOT) = ret2[0]; + *(stack - FIRST_ARG_SLOT - 1) = ret2[1]; + } + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_VOID: + break; + + default: + debug(0, "assert with cif->flags: %d\n",cif->flags); + FFI_ASSERT(0); + break; + } + return FFI_OK; +} + +/* Fill in a closure to refer to the specified fun and user_data. + cif specifies the argument and result types for fun. + The cif must already be prep'ed. */ + +extern void ffi_closure_pa32(void); + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + UINT32 *tramp = (UINT32 *)(closure->tramp); +#ifdef PA_HPUX + UINT32 *tmp; +#endif + + if (cif->abi != FFI_PA32) + return FFI_BAD_ABI; + + /* Make a small trampoline that will branch to our + handler function. Use PC-relative addressing. */ + +#ifdef PA_LINUX + tramp[0] = 0xeaa00000; /* b,l .+8,%r21 ; %r21 <- pc+8 */ + tramp[1] = 0xd6a01c1e; /* depi 0,31,2,%r21 ; mask priv bits */ + tramp[2] = 0x4aa10028; /* ldw 20(%r21),%r1 ; load plabel */ + tramp[3] = 0x36b53ff1; /* ldo -8(%r21),%r21 ; get closure addr */ + tramp[4] = 0x0c201096; /* ldw 0(%r1),%r22 ; address of handler */ + tramp[5] = 0xeac0c000; /* bv%r0(%r22) ; branch to handler */ + tramp[6] = 0x0c281093; /* ldw 4(%r1),%r19 ; GP of handler */ + tramp[7] = ((UINT32)(ffi_closure_pa32) & ~2); + + /* Flush d/icache -- have to flush up 2 two lines because of + alignment. */ + __asm__ volatile( + "fdc 0(%0)\n\t" + "fdc %1(%0)\n\t" + "fic 0(%%sr4, %0)\n\t" + "fic %1(%%sr4, %0)\n\t" + "sync\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n" + : + : "r"((unsigned long)tramp & ~31), + "r"(32 /* stride */) + : "memory"); +#endif + +#ifdef PA_HPUX + tramp[0] = 0xeaa00000; /* b,l .+8,%r21 ; %r21 <- pc+8 */ + tramp[1] = 0xd6a01c1e; /* depi 0,31,2,%r21 ; mask priv bits */ + tramp[2] = 0x4aa10038; /* ldw 28(%r21),%r1 ; load plabel */ + tramp[3] = 0x36b53ff1; /* ldo -8(%r21),%r21 ; get closure addr */ + tramp[4] = 0x0c201096; /* ldw 0(%r1),%r22 ; address of handler */ + tramp[5] = 0x02c010b4; /* ldsid (%r22),%r20 ; load space id */ + tramp[6] = 0x00141820; /* mtsp %r20,%sr0 ; into %sr0 */ + tramp[7] = 0xe2c00000; /* be 0(%sr0,%r22) ; branch to handler */ + tramp[8] = 0x0c281093; /* ldw 4(%r1),%r19 ; GP of handler */ + tramp[9] = ((UINT32)(ffi_closure_pa32) & ~2); + + /* Flush d/icache -- have to flush three lines because of alignment. */ + __asm__ volatile( + "copy %1,%0\n\t" + "fdc,m %2(%0)\n\t" + "fdc,m %2(%0)\n\t" + "fdc,m %2(%0)\n\t" + "ldsid (%1),%0\n\t" + "mtsp %0,%%sr0\n\t" + "copy %1,%0\n\t" + "fic,m %2(%%sr0,%0)\n\t" + "fic,m %2(%%sr0,%0)\n\t" + "fic,m %2(%%sr0,%0)\n\t" + "sync\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n" + : "=&r" ((unsigned long)tmp) + : "r" ((unsigned long)tramp & ~31), + "r" (32/* stride */) + : "memory"); +#endif + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffitarget.h new file mode 100644 index 0000000..efa2f4e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffitarget.h @@ -0,0 +1,78 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for hppa. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +#ifdef PA_LINUX + FFI_PA32, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_PA32 +#endif + +#ifdef PA_HPUX + FFI_PA32, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_PA32 +#endif + +#ifdef PA64_HPUX +#error "PA64_HPUX FFI is not yet implemented" + FFI_PA64, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_PA64 +#endif +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +#ifdef PA_LINUX +#define FFI_TRAMPOLINE_SIZE 32 +#else +#define FFI_TRAMPOLINE_SIZE 40 +#endif + +#define FFI_TYPE_SMALL_STRUCT2 -1 +#define FFI_TYPE_SMALL_STRUCT3 -2 +#define FFI_TYPE_SMALL_STRUCT4 -3 +#define FFI_TYPE_SMALL_STRUCT5 -4 +#define FFI_TYPE_SMALL_STRUCT6 -5 +#define FFI_TYPE_SMALL_STRUCT7 -6 +#define FFI_TYPE_SMALL_STRUCT8 -7 +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/hpux32.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/hpux32.S new file mode 100644 index 0000000..40528ba --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/hpux32.S @@ -0,0 +1,368 @@ +/* ----------------------------------------------------------------------- + hpux32.S - Copyright (c) 2006 Free Software Foundation, Inc. + (c) 2008 Red Hat, Inc. + based on src/pa/linux.S + + HP-UX PA Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + + .LEVEL 1.1 + .SPACE $PRIVATE$ + .IMPORT $global$,DATA + .IMPORT $$dyncall,MILLICODE + .SUBSPA $DATA$ + .align 4 + + /* void ffi_call_pa32(void (*)(char *, extended_cif *), + extended_cif *ecif, + unsigned bytes, + unsigned flags, + unsigned *rvalue, + void (*fn)(void)); + */ + + .export ffi_call_pa32,ENTRY,PRIV_LEV=3 + .import ffi_prep_args_pa32,CODE + + .SPACE $TEXT$ + .SUBSPA $CODE$ + .align 4 + +L$FB1 +ffi_call_pa32 + .proc + .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 + .entry + stw %rp, -20(%sp) + copy %r3, %r1 +L$CFI11 + copy %sp, %r3 +L$CFI12 + + /* Setup the stack for calling prep_args... + We want the stack to look like this: + + [ Previous stack ] <- %r3 + + [ 64-bytes register save area ] <- %r4 + + [ Stack space for actual call, passed as ] <- %arg0 + [ arg0 to ffi_prep_args_pa32 ] + + [ Stack for calling prep_args ] <- %sp + */ + + stwm %r1, 64(%sp) + stw %r4, 12(%r3) +L$CFI13 + copy %sp, %r4 + + addl %arg2, %r4, %arg0 ; arg stack + stw %arg3, -48(%r3) ; save flags we need it later + + /* Call prep_args: + %arg0(stack) -- set up above + %arg1(ecif) -- same as incoming param + %arg2(bytes) -- same as incoming param */ + bl ffi_prep_args_pa32,%r2 + ldo 64(%arg0), %sp + ldo -64(%sp), %sp + + /* now %sp should point where %arg0 was pointing. */ + + /* Load the arguments that should be passed in registers + The fp args are loaded by the prep_args function. */ + ldw -36(%sp), %arg0 + ldw -40(%sp), %arg1 + ldw -44(%sp), %arg2 + ldw -48(%sp), %arg3 + + /* in case the function is going to return a structure + we need to give it a place to put the result. */ + ldw -52(%r3), %ret0 ; %ret0 <- rvalue + ldw -56(%r3), %r22 ; %r22 <- function to call + bl $$dyncall, %r31 ; Call the user function + copy %r31, %rp + + /* Prepare to store the result; we need to recover flags and rvalue. */ + ldw -48(%r3), %r21 ; r21 <- flags + ldw -52(%r3), %r20 ; r20 <- rvalue + + /* Store the result according to the return type. The most + likely types should come first. */ + +L$checkint + comib,<>,n FFI_TYPE_INT, %r21, L$checkint8 + b L$done + stw %ret0, 0(%r20) + +L$checkint8 + comib,<>,n FFI_TYPE_UINT8, %r21, L$checkint16 + b L$done + stb %ret0, 0(%r20) + +L$checkint16 + comib,<>,n FFI_TYPE_UINT16, %r21, L$checkdbl + b L$done + sth %ret0, 0(%r20) + +L$checkdbl + comib,<>,n FFI_TYPE_DOUBLE, %r21, L$checkfloat + b L$done + fstd %fr4,0(%r20) + +L$checkfloat + comib,<>,n FFI_TYPE_FLOAT, %r21, L$checkll + b L$done + fstw %fr4L,0(%r20) + +L$checkll + comib,<>,n FFI_TYPE_UINT64, %r21, L$checksmst2 + stw %ret0, 0(%r20) + b L$done + stw %ret1, 4(%r20) + +L$checksmst2 + comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, L$checksmst3 + /* 2-byte structs are returned in ret0 as ????xxyy. */ + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret0, 0(%r20) + +L$checksmst3 + comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, L$checksmst4 + /* 3-byte structs are returned in ret0 as ??xxyyzz. */ + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret0, 0(%r20) + +L$checksmst4 + comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, L$checksmst5 + /* 4-byte structs are returned in ret0 as wwxxyyzz. */ + extru %ret0, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret0, 0(%r20) + +L$checksmst5 + comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, L$checksmst6 + /* 5 byte values are returned right justified: + ret0 ret1 + 5: ??????aa bbccddee */ + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret1, 0(%r20) + +L$checksmst6 + comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, L$checksmst7 + /* 6 byte values are returned right justified: + ret0 ret1 + 6: ????aabb ccddeeff */ + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret1, 0(%r20) + +L$checksmst7 + comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, L$checksmst8 + /* 7 byte values are returned right justified: + ret0 ret1 + 7: ??aabbcc ddeeffgg */ + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret1, 0(%r20) + +L$checksmst8 + comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, L$done + /* 8 byte values are returned right justified: + ret0 ret1 + 8: aabbccdd eeffgghh */ + extru %ret0, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stb %ret1, 0(%r20) + +L$done + /* all done, return */ + copy %r4, %sp ; pop arg stack + ldw 12(%r3), %r4 + ldwm -64(%sp), %r3 ; .. and pop stack + ldw -20(%sp), %rp + bv %r0(%rp) + nop + .exit + .procend +L$FE1 + + /* void ffi_closure_pa32(void); + Called with closure argument in %r21 */ + + .SPACE $TEXT$ + .SUBSPA $CODE$ + .export ffi_closure_pa32,ENTRY,PRIV_LEV=3,RTNVAL=GR + .import ffi_closure_inner_pa32,CODE + .align 4 +L$FB2 +ffi_closure_pa32 + .proc + .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 + .entry + + stw %rp, -20(%sp) + copy %r3, %r1 +L$CFI21 + copy %sp, %r3 +L$CFI22 + stwm %r1, 64(%sp) + + /* Put arguments onto the stack and call ffi_closure_inner. */ + stw %arg0, -36(%r3) + stw %arg1, -40(%r3) + stw %arg2, -44(%r3) + stw %arg3, -48(%r3) + + copy %r21, %arg0 + bl ffi_closure_inner_pa32, %r2 + copy %r3, %arg1 + ldwm -64(%sp), %r3 + ldw -20(%sp), %rp + ldw -36(%sp), %ret0 + bv %r0(%rp) + ldw -40(%sp), %ret1 + .exit + .procend +L$FE2: + + .SPACE $PRIVATE$ + .SUBSPA $DATA$ + + .align 4 + .EXPORT _GLOBAL__F_ffi_call_pa32,DATA +_GLOBAL__F_ffi_call_pa32 +L$frame1: + .word L$ECIE1-L$SCIE1 ;# Length of Common Information Entry +L$SCIE1: + .word 0x0 ;# CIE Identifier Tag + .byte 0x1 ;# CIE Version + .ascii "\0" ;# CIE Augmentation + .uleb128 0x1 ;# CIE Code Alignment Factor + .sleb128 4 ;# CIE Data Alignment Factor + .byte 0x2 ;# CIE RA Column + .byte 0xc ;# DW_CFA_def_cfa + .uleb128 0x1e + .uleb128 0x0 + .align 4 +L$ECIE1: +L$SFDE1: + .word L$EFDE1-L$ASFDE1 ;# FDE Length +L$ASFDE1: + .word L$ASFDE1-L$frame1 ;# FDE CIE offset + .word L$FB1 ;# FDE initial location + .word L$FE1-L$FB1 ;# FDE address range + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word L$CFI11-L$FB1 + .byte 0x83 ;# DW_CFA_offset, column 0x3 + .uleb128 0x0 + .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] + .uleb128 0x2 + .sleb128 -5 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word L$CFI12-L$CFI11 + .byte 0xd ;# DW_CFA_def_cfa_register = r3 + .uleb128 0x3 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word L$CFI13-L$CFI12 + .byte 0x84 ;# DW_CFA_offset, column 0x4 + .uleb128 0x3 + + .align 4 +L$EFDE1: + +L$SFDE2: + .word L$EFDE2-L$ASFDE2 ;# FDE Length +L$ASFDE2: + .word L$ASFDE2-L$frame1 ;# FDE CIE offset + .word L$FB2 ;# FDE initial location + .word L$FE2-L$FB2 ;# FDE address range + .byte 0x4 ;# DW_CFA_advance_loc4 + .word L$CFI21-L$FB2 + .byte 0x83 ;# DW_CFA_offset, column 0x3 + .uleb128 0x0 + .byte 0x11 ;# DW_CFA_offset_extended_sf + .uleb128 0x2 + .sleb128 -5 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word L$CFI22-L$CFI21 + .byte 0xd ;# DW_CFA_def_cfa_register = r3 + .uleb128 0x3 + + .align 4 +L$EFDE2: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/linux.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/linux.S new file mode 100644 index 0000000..f11ae76 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/linux.S @@ -0,0 +1,357 @@ +/* ----------------------------------------------------------------------- + linux.S - (c) 2003-2004 Randolph Chung + (c) 2008 Red Hat, Inc. + + HPPA Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + + .text + .level 1.1 + .align 4 + + /* void ffi_call_pa32(void (*)(char *, extended_cif *), + extended_cif *ecif, + unsigned bytes, + unsigned flags, + unsigned *rvalue, + void (*fn)(void)); + */ + + .export ffi_call_pa32,code + .import ffi_prep_args_pa32,code + + .type ffi_call_pa32, @function +.LFB1: +ffi_call_pa32: + .proc + .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 + .entry + stw %rp, -20(%sp) + copy %r3, %r1 +.LCFI11: + + copy %sp, %r3 +.LCFI12: + + /* Setup the stack for calling prep_args... + We want the stack to look like this: + + [ Previous stack ] <- %r3 + + [ 64-bytes register save area ] <- %r4 + + [ Stack space for actual call, passed as ] <- %arg0 + [ arg0 to ffi_prep_args_pa32 ] + + [ Stack for calling prep_args ] <- %sp + */ + + stwm %r1, 64(%sp) + stw %r4, 12(%r3) +.LCFI13: + copy %sp, %r4 + + addl %arg2, %r4, %arg0 /* arg stack */ + stw %arg3, -48(%r3) /* save flags; we need it later */ + + /* Call prep_args: + %arg0(stack) -- set up above + %arg1(ecif) -- same as incoming param + %arg2(bytes) -- same as incoming param */ + bl ffi_prep_args_pa32,%r2 + ldo 64(%arg0), %sp + ldo -64(%sp), %sp + + /* now %sp should point where %arg0 was pointing. */ + + /* Load the arguments that should be passed in registers + The fp args were loaded by the prep_args function. */ + ldw -36(%sp), %arg0 + ldw -40(%sp), %arg1 + ldw -44(%sp), %arg2 + ldw -48(%sp), %arg3 + + /* in case the function is going to return a structure + we need to give it a place to put the result. */ + ldw -52(%r3), %ret0 /* %ret0 <- rvalue */ + ldw -56(%r3), %r22 /* %r22 <- function to call */ + bl $$dyncall, %r31 /* Call the user function */ + copy %r31, %rp + + /* Prepare to store the result; we need to recover flags and rvalue. */ + ldw -48(%r3), %r21 /* r21 <- flags */ + ldw -52(%r3), %r20 /* r20 <- rvalue */ + + /* Store the result according to the return type. */ + +.Lcheckint: + comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8 + b .Ldone + stw %ret0, 0(%r20) + +.Lcheckint8: + comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16 + b .Ldone + stb %ret0, 0(%r20) + +.Lcheckint16: + comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl + b .Ldone + sth %ret0, 0(%r20) + +.Lcheckdbl: + comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat + b .Ldone + fstd %fr4,0(%r20) + +.Lcheckfloat: + comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll + b .Ldone + fstw %fr4L,0(%r20) + +.Lcheckll: + comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2 + stw %ret0, 0(%r20) + b .Ldone + stw %ret1, 4(%r20) + +.Lchecksmst2: + comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3 + /* 2-byte structs are returned in ret0 as ????xxyy. */ + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret0, 0(%r20) + +.Lchecksmst3: + comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4 + /* 3-byte structs are returned in ret0 as ??xxyyzz. */ + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret0, 0(%r20) + +.Lchecksmst4: + comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5 + /* 4-byte structs are returned in ret0 as wwxxyyzz. */ + extru %ret0, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret0, 0(%r20) + +.Lchecksmst5: + comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6 + /* 5 byte values are returned right justified: + ret0 ret1 + 5: ??????aa bbccddee */ + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret1, 0(%r20) + +.Lchecksmst6: + comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7 + /* 6 byte values are returned right justified: + ret0 ret1 + 6: ????aabb ccddeeff */ + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret1, 0(%r20) + +.Lchecksmst7: + comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8 + /* 7 byte values are returned right justified: + ret0 ret1 + 7: ??aabbcc ddeeffgg */ + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret1, 0(%r20) + +.Lchecksmst8: + comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone + /* 8 byte values are returned right justified: + ret0 ret1 + 8: aabbccdd eeffgghh */ + extru %ret0, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stb %ret1, 0(%r20) + +.Ldone: + /* all done, return */ + copy %r4, %sp /* pop arg stack */ + ldw 12(%r3), %r4 + ldwm -64(%sp), %r3 /* .. and pop stack */ + ldw -20(%sp), %rp + bv %r0(%rp) + nop + .exit + .procend +.LFE1: + + /* void ffi_closure_pa32(void); + Called with closure argument in %r21 */ + .export ffi_closure_pa32,code + .import ffi_closure_inner_pa32,code + + .type ffi_closure_pa32, @function +.LFB2: +ffi_closure_pa32: + .proc + .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 + .entry + + stw %rp, -20(%sp) +.LCFI20: + copy %r3, %r1 +.LCFI21: + copy %sp, %r3 +.LCFI22: + stwm %r1, 64(%sp) + + /* Put arguments onto the stack and call ffi_closure_inner. */ + stw %arg0, -36(%r3) + stw %arg1, -40(%r3) + stw %arg2, -44(%r3) + stw %arg3, -48(%r3) + + copy %r21, %arg0 + bl ffi_closure_inner_pa32, %r2 + copy %r3, %arg1 + + ldwm -64(%sp), %r3 + ldw -20(%sp), %rp + ldw -36(%sp), %ret0 + bv %r0(%r2) + ldw -40(%sp), %ret1 + + .exit + .procend +.LFE2: + + .section ".eh_frame",EH_FRAME_FLAGS,@progbits +.Lframe1: + .word .LECIE1-.LSCIE1 ;# Length of Common Information Entry +.LSCIE1: + .word 0x0 ;# CIE Identifier Tag + .byte 0x1 ;# CIE Version + .ascii "\0" ;# CIE Augmentation + .uleb128 0x1 ;# CIE Code Alignment Factor + .sleb128 4 ;# CIE Data Alignment Factor + .byte 0x2 ;# CIE RA Column + .byte 0xc ;# DW_CFA_def_cfa + .uleb128 0x1e + .uleb128 0x0 + .align 4 +.LECIE1: +.LSFDE1: + .word .LEFDE1-.LASFDE1 ;# FDE Length +.LASFDE1: + .word .LASFDE1-.Lframe1 ;# FDE CIE offset + .word .LFB1 ;# FDE initial location + .word .LFE1-.LFB1 ;# FDE address range + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word .LCFI11-.LFB1 + .byte 0x83 ;# DW_CFA_offset, column 0x3 + .uleb128 0x0 + .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] + .uleb128 0x2 + .sleb128 -5 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word .LCFI12-.LCFI11 + .byte 0xd ;# DW_CFA_def_cfa_register = r3 + .uleb128 0x3 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word .LCFI13-.LCFI12 + .byte 0x84 ;# DW_CFA_offset, column 0x4 + .uleb128 0x3 + + .align 4 +.LEFDE1: + +.LSFDE2: + .word .LEFDE2-.LASFDE2 ;# FDE Length +.LASFDE2: + .word .LASFDE2-.Lframe1 ;# FDE CIE offset + .word .LFB2 ;# FDE initial location + .word .LFE2-.LFB2 ;# FDE address range + .byte 0x4 ;# DW_CFA_advance_loc4 + .word .LCFI21-.LFB2 + .byte 0x83 ;# DW_CFA_offset, column 0x3 + .uleb128 0x0 + .byte 0x11 ;# DW_CFA_offset_extended_sf + .uleb128 0x2 + .sleb128 -5 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word .LCFI22-.LCFI21 + .byte 0xd ;# DW_CFA_def_cfa_register = r3 + .uleb128 0x3 + + .align 4 +.LEFDE2: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix.S new file mode 100644 index 0000000..213f2db --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix.S @@ -0,0 +1,328 @@ +/* ----------------------------------------------------------------------- + aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc. + based on darwin.S by John Hornkvist + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + + .set r0,0 + .set r1,1 + .set r2,2 + .set r3,3 + .set r4,4 + .set r5,5 + .set r6,6 + .set r7,7 + .set r8,8 + .set r9,9 + .set r10,10 + .set r11,11 + .set r12,12 + .set r13,13 + .set r14,14 + .set r15,15 + .set r16,16 + .set r17,17 + .set r18,18 + .set r19,19 + .set r20,20 + .set r21,21 + .set r22,22 + .set r23,23 + .set r24,24 + .set r25,25 + .set r26,26 + .set r27,27 + .set r28,28 + .set r29,29 + .set r30,30 + .set r31,31 + .set f0,0 + .set f1,1 + .set f2,2 + .set f3,3 + .set f4,4 + .set f5,5 + .set f6,6 + .set f7,7 + .set f8,8 + .set f9,9 + .set f10,10 + .set f11,11 + .set f12,12 + .set f13,13 + .set f14,14 + .set f15,15 + .set f16,16 + .set f17,17 + .set f18,18 + .set f19,19 + .set f20,20 + .set f21,21 + + .extern .ffi_prep_args + +#define LIBFFI_ASM +#include +#include +#define JUMPTARGET(name) name +#define L(x) x + .file "aix.S" + .toc + + /* void ffi_call_AIX(extended_cif *ecif, unsigned long bytes, + * unsigned int flags, unsigned int *rvalue, + * void (*fn)(), + * void (*prep_args)(extended_cif*, unsigned *const)); + * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args + */ + +.csect .text[PR] + .align 2 + .globl ffi_call_AIX + .globl .ffi_call_AIX +.csect ffi_call_AIX[DS] +ffi_call_AIX: +#ifdef __64BIT__ + .llong .ffi_call_AIX, TOC[tc0], 0 + .csect .text[PR] +.ffi_call_AIX: + /* Save registers we use. */ + mflr r0 + + std r28,-32(r1) + std r29,-24(r1) + std r30,-16(r1) + std r31, -8(r1) + + std r0, 16(r1) + mr r28, r1 /* our AP. */ + stdux r1, r1, r4 + + /* Save arguments over call... */ + mr r31, r5 /* flags, */ + mr r30, r6 /* rvalue, */ + mr r29, r7 /* function address. */ + std r2, 40(r1) + + /* Call ffi_prep_args. */ + mr r4, r1 + bl .ffi_prep_args + nop + + /* Now do the call. */ + ld r0, 0(r29) + ld r2, 8(r29) + ld r11, 16(r29) + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, r31 + mtctr r0 + /* Load all those argument registers. */ + // We have set up a nice stack frame, just load it into registers. + ld r3, 40+(1*8)(r1) + ld r4, 40+(2*8)(r1) + ld r5, 40+(3*8)(r1) + ld r6, 40+(4*8)(r1) + nop + ld r7, 40+(5*8)(r1) + ld r8, 40+(6*8)(r1) + ld r9, 40+(7*8)(r1) + ld r10,40+(8*8)(r1) + +L1: + /* Load all the FP registers. */ + bf 6,L2 // 2f + 0x18 + lfd f1,-32-(13*8)(r28) + lfd f2,-32-(12*8)(r28) + lfd f3,-32-(11*8)(r28) + lfd f4,-32-(10*8)(r28) + nop + lfd f5,-32-(9*8)(r28) + lfd f6,-32-(8*8)(r28) + lfd f7,-32-(7*8)(r28) + lfd f8,-32-(6*8)(r28) + nop + lfd f9,-32-(5*8)(r28) + lfd f10,-32-(4*8)(r28) + lfd f11,-32-(3*8)(r28) + lfd f12,-32-(2*8)(r28) + nop + lfd f13,-32-(1*8)(r28) + +L2: + /* Make the call. */ + bctrl + ld r2, 40(r1) + + /* Now, deal with the return value. */ + mtcrf 0x01, r31 + + bt 30, L(done_return_value) + bt 29, L(fp_return_value) + std r3, 0(r30) + + /* Fall through... */ + +L(done_return_value): + /* Restore the registers we used and return. */ + mr r1, r28 + ld r0, 16(r28) + ld r28, -32(r1) + mtlr r0 + ld r29, -24(r1) + ld r30, -16(r1) + ld r31, -8(r1) + blr + +L(fp_return_value): + bf 28, L(float_return_value) + stfd f1, 0(r30) + bf 31, L(done_return_value) + stfd f2, 8(r30) + b L(done_return_value) +L(float_return_value): + stfs f1, 0(r30) + b L(done_return_value) + +#else /* ! __64BIT__ */ + + .long .ffi_call_AIX, TOC[tc0], 0 + .csect .text[PR] +.ffi_call_AIX: + /* Save registers we use. */ + mflr r0 + + stw r28,-16(r1) + stw r29,-12(r1) + stw r30, -8(r1) + stw r31, -4(r1) + + stw r0, 8(r1) + mr r28, r1 /* out AP. */ + stwux r1, r1, r4 + + /* Save arguments over call... */ + mr r31, r5 /* flags, */ + mr r30, r6 /* rvalue, */ + mr r29, r7 /* function address, */ + stw r2, 20(r1) + + /* Call ffi_prep_args. */ + mr r4, r1 + bl .ffi_prep_args + nop + + /* Now do the call. */ + lwz r0, 0(r29) + lwz r2, 4(r29) + lwz r11, 8(r29) + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, r31 + mtctr r0 + /* Load all those argument registers. */ + // We have set up a nice stack frame, just load it into registers. + lwz r3, 20+(1*4)(r1) + lwz r4, 20+(2*4)(r1) + lwz r5, 20+(3*4)(r1) + lwz r6, 20+(4*4)(r1) + nop + lwz r7, 20+(5*4)(r1) + lwz r8, 20+(6*4)(r1) + lwz r9, 20+(7*4)(r1) + lwz r10,20+(8*4)(r1) + +L1: + /* Load all the FP registers. */ + bf 6,L2 // 2f + 0x18 + lfd f1,-16-(13*8)(r28) + lfd f2,-16-(12*8)(r28) + lfd f3,-16-(11*8)(r28) + lfd f4,-16-(10*8)(r28) + nop + lfd f5,-16-(9*8)(r28) + lfd f6,-16-(8*8)(r28) + lfd f7,-16-(7*8)(r28) + lfd f8,-16-(6*8)(r28) + nop + lfd f9,-16-(5*8)(r28) + lfd f10,-16-(4*8)(r28) + lfd f11,-16-(3*8)(r28) + lfd f12,-16-(2*8)(r28) + nop + lfd f13,-16-(1*8)(r28) + +L2: + /* Make the call. */ + bctrl + lwz r2, 20(r1) + + /* Now, deal with the return value. */ + mtcrf 0x01, r31 + + bt 30, L(done_return_value) + bt 29, L(fp_return_value) + stw r3, 0(r30) + bf 28, L(done_return_value) + stw r4, 4(r30) + + /* Fall through... */ + +L(done_return_value): + /* Restore the registers we used and return. */ + mr r1, r28 + lwz r0, 8(r28) + lwz r28,-16(r1) + mtlr r0 + lwz r29,-12(r1) + lwz r30, -8(r1) + lwz r31, -4(r1) + blr + +L(fp_return_value): + bf 28, L(float_return_value) + stfd f1, 0(r30) + b L(done_return_value) +L(float_return_value): + stfs f1, 0(r30) + b L(done_return_value) +#endif + .long 0 + .byte 0,0,0,1,128,4,0,0 +//END(ffi_call_AIX) + +.csect .text[PR] + .align 2 + .globl ffi_call_DARWIN + .globl .ffi_call_DARWIN +.csect ffi_call_DARWIN[DS] +ffi_call_DARWIN: +#ifdef __64BIT__ + .llong .ffi_call_DARWIN, TOC[tc0], 0 +#else + .long .ffi_call_DARWIN, TOC[tc0], 0 +#endif + .csect .text[PR] +.ffi_call_DARWIN: + blr + .long 0 + .byte 0,0,0,0,0,0,0,0 +//END(ffi_call_DARWIN) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix_closure.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix_closure.S new file mode 100644 index 0000000..c906017 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix_closure.S @@ -0,0 +1,445 @@ +/* ----------------------------------------------------------------------- + aix_closure.S - Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc. + based on darwin_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + + .set r0,0 + .set r1,1 + .set r2,2 + .set r3,3 + .set r4,4 + .set r5,5 + .set r6,6 + .set r7,7 + .set r8,8 + .set r9,9 + .set r10,10 + .set r11,11 + .set r12,12 + .set r13,13 + .set r14,14 + .set r15,15 + .set r16,16 + .set r17,17 + .set r18,18 + .set r19,19 + .set r20,20 + .set r21,21 + .set r22,22 + .set r23,23 + .set r24,24 + .set r25,25 + .set r26,26 + .set r27,27 + .set r28,28 + .set r29,29 + .set r30,30 + .set r31,31 + .set f0,0 + .set f1,1 + .set f2,2 + .set f3,3 + .set f4,4 + .set f5,5 + .set f6,6 + .set f7,7 + .set f8,8 + .set f9,9 + .set f10,10 + .set f11,11 + .set f12,12 + .set f13,13 + .set f14,14 + .set f15,15 + .set f16,16 + .set f17,17 + .set f18,18 + .set f19,19 + .set f20,20 + .set f21,21 + + .extern .ffi_closure_helper_DARWIN + +#define LIBFFI_ASM +#define JUMPTARGET(name) name +#define L(x) x + .file "aix_closure.S" + .toc +LC..60: + .tc L..60[TC],L..60 + .csect .text[PR] + .align 2 + +.csect .text[PR] + .align 2 + .globl ffi_closure_ASM + .globl .ffi_closure_ASM +.csect ffi_closure_ASM[DS] +ffi_closure_ASM: +#ifdef __64BIT__ + .llong .ffi_closure_ASM, TOC[tc0], 0 + .csect .text[PR] +.ffi_closure_ASM: +/* we want to build up an area for the parameters passed */ +/* in registers (both floating point and integer) */ + + /* we store gpr 3 to gpr 10 (aligned to 4) + in the parents outgoing area */ + std r3, 48+(0*8)(r1) + std r4, 48+(1*8)(r1) + std r5, 48+(2*8)(r1) + std r6, 48+(3*8)(r1) + mflr r0 + + std r7, 48+(4*8)(r1) + std r8, 48+(5*8)(r1) + std r9, 48+(6*8)(r1) + std r10, 48+(7*8)(r1) + std r0, 16(r1) /* save the return address */ + + + /* 48 Bytes (Linkage Area) */ + /* 64 Bytes (params) */ + /* 16 Bytes (result) */ + /* 104 Bytes (13*8 from FPR) */ + /* 8 Bytes (alignment) */ + /* 240 Bytes */ + + stdu r1, -240(r1) /* skip over caller save area + keep stack aligned to 16 */ + + /* next save fpr 1 to fpr 13 (aligned to 8) */ + stfd f1, 128+(0*8)(r1) + stfd f2, 128+(1*8)(r1) + stfd f3, 128+(2*8)(r1) + stfd f4, 128+(3*8)(r1) + stfd f5, 128+(4*8)(r1) + stfd f6, 128+(5*8)(r1) + stfd f7, 128+(6*8)(r1) + stfd f8, 128+(7*8)(r1) + stfd f9, 128+(8*8)(r1) + stfd f10, 128+(9*8)(r1) + stfd f11, 128+(10*8)(r1) + stfd f12, 128+(11*8)(r1) + stfd f13, 128+(12*8)(r1) + + /* set up registers for the routine that actually does the work */ + /* get the context pointer from the trampoline */ + mr r3, r11 + + /* now load up the pointer to the result storage */ + addi r4, r1, 112 + + /* now load up the pointer to the saved gpr registers */ + addi r5, r1, 288 + + /* now load up the pointer to the saved fpr registers */ + addi r6, r1, 128 + + /* make the call */ + bl .ffi_closure_helper_DARWIN + nop + + /* now r3 contains the return type */ + /* so use it to look up in a table */ + /* so we know how to deal with each type */ + + /* look up the proper starting point in table */ + /* by using return type as offset */ + ld r4, LC..60(2) /* get address of jump table */ + sldi r3, r3, 4 /* now multiply return type by 16 */ + ld r0, 240+16(r1) /* load return address */ + add r3, r3, r4 /* add contents of table to table address */ + mtctr r3 + bctr /* jump to it */ + +/* Each fragment must be exactly 16 bytes long (4 instructions). + Align to 16 byte boundary for cache and dispatch efficiency. */ + .align 4 + +L..60: +/* case FFI_TYPE_VOID */ + mtlr r0 + addi r1, r1, 240 + blr + nop + +/* case FFI_TYPE_INT */ + lwa r3, 112+4(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_FLOAT */ + lfs f1, 112+0(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_DOUBLE */ + lfd f1, 112+0(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_LONGDOUBLE */ + lfd f1, 112+0(r1) + mtlr r0 + lfd f2, 112+8(r1) + b L..finish + +/* case FFI_TYPE_UINT8 */ + lbz r3, 112+7(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_SINT8 */ + lbz r3, 112+7(r1) + mtlr r0 + extsb r3, r3 + b L..finish + +/* case FFI_TYPE_UINT16 */ + lhz r3, 112+6(r1) + mtlr r0 +L..finish: + addi r1, r1, 240 + blr + +/* case FFI_TYPE_SINT16 */ + lha r3, 112+6(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_UINT32 */ + lwz r3, 112+4(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_SINT32 */ + lwa r3, 112+4(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_UINT64 */ + ld r3, 112+0(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_SINT64 */ + ld r3, 112+0(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_STRUCT */ + mtlr r0 + addi r1, r1, 240 + blr + nop + +/* case FFI_TYPE_POINTER */ + ld r3, 112+0(r1) + mtlr r0 + addi r1, r1, 240 + blr + +#else /* ! __64BIT__ */ + + .long .ffi_closure_ASM, TOC[tc0], 0 + .csect .text[PR] +.ffi_closure_ASM: +/* we want to build up an area for the parameters passed */ +/* in registers (both floating point and integer) */ + + /* we store gpr 3 to gpr 10 (aligned to 4) + in the parents outgoing area */ + stw r3, 24+(0*4)(r1) + stw r4, 24+(1*4)(r1) + stw r5, 24+(2*4)(r1) + stw r6, 24+(3*4)(r1) + mflr r0 + + stw r7, 24+(4*4)(r1) + stw r8, 24+(5*4)(r1) + stw r9, 24+(6*4)(r1) + stw r10, 24+(7*4)(r1) + stw r0, 8(r1) + + /* 24 Bytes (Linkage Area) */ + /* 32 Bytes (params) */ + /* 16 Bytes (result) */ + /* 104 Bytes (13*8 from FPR) */ + /* 176 Bytes */ + + stwu r1, -176(r1) /* skip over caller save area + keep stack aligned to 16 */ + + /* next save fpr 1 to fpr 13 (aligned to 8) */ + stfd f1, 72+(0*8)(r1) + stfd f2, 72+(1*8)(r1) + stfd f3, 72+(2*8)(r1) + stfd f4, 72+(3*8)(r1) + stfd f5, 72+(4*8)(r1) + stfd f6, 72+(5*8)(r1) + stfd f7, 72+(6*8)(r1) + stfd f8, 72+(7*8)(r1) + stfd f9, 72+(8*8)(r1) + stfd f10, 72+(9*8)(r1) + stfd f11, 72+(10*8)(r1) + stfd f12, 72+(11*8)(r1) + stfd f13, 72+(12*8)(r1) + + /* set up registers for the routine that actually does the work */ + /* get the context pointer from the trampoline */ + mr r3, r11 + + /* now load up the pointer to the result storage */ + addi r4, r1, 56 + + /* now load up the pointer to the saved gpr registers */ + addi r5, r1, 200 + + /* now load up the pointer to the saved fpr registers */ + addi r6, r1, 72 + + /* make the call */ + bl .ffi_closure_helper_DARWIN + nop + + /* now r3 contains the return type */ + /* so use it to look up in a table */ + /* so we know how to deal with each type */ + + /* look up the proper starting point in table */ + /* by using return type as offset */ + lwz r4, LC..60(2) /* get address of jump table */ + slwi r3, r3, 4 /* now multiply return type by 4 */ + lwz r0, 176+8(r1) /* load return address */ + add r3, r3, r4 /* add contents of table to table address */ + mtctr r3 + bctr /* jump to it */ + +/* Each fragment must be exactly 16 bytes long (4 instructions). + Align to 16 byte boundary for cache and dispatch efficiency. */ + .align 4 + +L..60: +/* case FFI_TYPE_VOID */ + mtlr r0 + addi r1, r1, 176 + blr + nop + +/* case FFI_TYPE_INT */ + lwz r3, 56+0(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_FLOAT */ + lfs f1, 56+0(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_DOUBLE */ + lfd f1, 56+0(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_LONGDOUBLE */ + lfd f1, 56+0(r1) + mtlr r0 + lfd f2, 56+8(r1) + b L..finish + +/* case FFI_TYPE_UINT8 */ + lbz r3, 56+3(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_SINT8 */ + lbz r3, 56+3(r1) + mtlr r0 + extsb r3, r3 + b L..finish + +/* case FFI_TYPE_UINT16 */ + lhz r3, 56+2(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_SINT16 */ + lha r3, 56+2(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_UINT32 */ + lwz r3, 56+0(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_SINT32 */ + lwz r3, 56+0(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_UINT64 */ + lwz r3, 56+0(r1) + mtlr r0 + lwz r4, 56+4(r1) + b L..finish + +/* case FFI_TYPE_SINT64 */ + lwz r3, 56+0(r1) + mtlr r0 + lwz r4, 56+4(r1) + b L..finish + +/* case FFI_TYPE_STRUCT */ + mtlr r0 + addi r1, r1, 176 + blr + nop + +/* case FFI_TYPE_POINTER */ + lwz r3, 56+0(r1) + mtlr r0 +L..finish: + addi r1, r1, 176 + blr +#endif +/* END(ffi_closure_ASM) */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/asm.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/asm.h new file mode 100644 index 0000000..994f62d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/asm.h @@ -0,0 +1,125 @@ +/* ----------------------------------------------------------------------- + asm.h - Copyright (c) 1998 Geoffrey Keating + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define ASM_GLOBAL_DIRECTIVE .globl + + +#define C_SYMBOL_NAME(name) name +/* Macro for a label. */ +#ifdef __STDC__ +#define C_LABEL(name) name##: +#else +#define C_LABEL(name) name/**/: +#endif + +/* This seems to always be the case on PPC. */ +#define ALIGNARG(log2) log2 +/* For ELF we need the `.type' directive to make shared libs work right. */ +#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg; +#define ASM_SIZE_DIRECTIVE(name) .size name,.-name + +/* If compiled for profiling, call `_mcount' at the start of each function. */ +#ifdef PROF +/* The mcount code relies on the return address being on the stack + to locate our caller and so it can restore it; so store one just + for its benefit. */ +#ifdef PIC +#define CALL_MCOUNT \ + .pushsection; \ + .section ".data"; \ + .align ALIGNARG(2); \ +0:.long 0; \ + .previous; \ + mflr %r0; \ + stw %r0,4(%r1); \ + bl _GLOBAL_OFFSET_TABLE_@local-4; \ + mflr %r11; \ + lwz %r0,0b@got(%r11); \ + bl JUMPTARGET(_mcount); +#else /* PIC */ +#define CALL_MCOUNT \ + .section ".data"; \ + .align ALIGNARG(2); \ +0:.long 0; \ + .previous; \ + mflr %r0; \ + lis %r11,0b@ha; \ + stw %r0,4(%r1); \ + addi %r0,%r11,0b@l; \ + bl JUMPTARGET(_mcount); +#endif /* PIC */ +#else /* PROF */ +#define CALL_MCOUNT /* Do nothing. */ +#endif /* PROF */ + +#define ENTRY(name) \ + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ + ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ + .align ALIGNARG(2); \ + C_LABEL(name) \ + CALL_MCOUNT + +#define EALIGN_W_0 /* No words to insert. */ +#define EALIGN_W_1 nop +#define EALIGN_W_2 nop;nop +#define EALIGN_W_3 nop;nop;nop +#define EALIGN_W_4 EALIGN_W_3;nop +#define EALIGN_W_5 EALIGN_W_4;nop +#define EALIGN_W_6 EALIGN_W_5;nop +#define EALIGN_W_7 EALIGN_W_6;nop + +/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes + past a 2^align boundary. */ +#ifdef PROF +#define EALIGN(name, alignt, words) \ + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ + ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ + .align ALIGNARG(2); \ + C_LABEL(name) \ + CALL_MCOUNT \ + b 0f; \ + .align ALIGNARG(alignt); \ + EALIGN_W_##words; \ + 0: +#else /* PROF */ +#define EALIGN(name, alignt, words) \ + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ + ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ + .align ALIGNARG(alignt); \ + EALIGN_W_##words; \ + C_LABEL(name) +#endif + +#define END(name) \ + ASM_SIZE_DIRECTIVE(name) + +#ifdef PIC +#define JUMPTARGET(name) name##@plt +#else +#define JUMPTARGET(name) name +#endif + +/* Local labels stripped out by the linker. */ +#define L(x) .L##x diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin.S new file mode 100644 index 0000000..4f987dc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin.S @@ -0,0 +1,383 @@ +/* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 2000 John Hornkvist + Copyright (c) 2004, 2010 Free Software Foundation, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#if defined(__ppc64__) +#define MODE_CHOICE(x, y) y +#else +#define MODE_CHOICE(x, y) x +#endif + +#define machine_choice MODE_CHOICE(ppc7400,ppc64) + +; Define some pseudo-opcodes for size-independent load & store of GPRs ... +#define lgu MODE_CHOICE(lwzu, ldu) +#define lg MODE_CHOICE(lwz,ld) +#define sg MODE_CHOICE(stw,std) +#define sgu MODE_CHOICE(stwu,stdu) +#define sgux MODE_CHOICE(stwux,stdux) + +; ... and the size of GPRs and their storage indicator. +#define GPR_BYTES MODE_CHOICE(4,8) +#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ +#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ + +; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. +#define LINKAGE_SIZE MODE_CHOICE(24,48) +#define PARAM_AREA MODE_CHOICE(32,64) +#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ + +/* If there is any FP stuff we make space for all of the regs. */ +#define SAVED_FPR_COUNT 13 +#define FPR_SIZE 8 +#define RESULT_BYTES 16 + +/* This should be kept in step with the same value in ffi_darwin.c. */ +#define ASM_NEEDS_REGISTERS 4 +#define SAVE_REGS_SIZE (ASM_NEEDS_REGISTERS * GPR_BYTES) + +#include +#include + +#define JUMPTARGET(name) name +#define L(x) x + + .text + .align 2 + .globl _ffi_prep_args + + .align 2 + .globl _ffi_call_DARWIN + + /* We arrive here with: + r3 = ptr to extended cif. + r4 = -bytes. + r5 = cif flags. + r6 = ptr to return value. + r7 = fn pointer (user func). + r8 = fn pointer (ffi_prep_args). + r9 = ffi_type* for the ret val. */ + +_ffi_call_DARWIN: +Lstartcode: + mr r12,r8 /* We only need r12 until the call, + so it does not have to be saved. */ +LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 +LCFI0: + + /* Save the retval type in parents frame. */ + sg r9,(LINKAGE_SIZE+6*GPR_BYTES)(r8) + + /* Allocate the stack space we need. */ + sgux r1,r1,r4 + + /* Save registers we use. */ + mflr r9 + sg r9,SAVED_LR_OFFSET(r8) + + sg r28,-(4 * GPR_BYTES)(r8) + sg r29,-(3 * GPR_BYTES)(r8) + sg r30,-(2 * GPR_BYTES)(r8) + sg r31,-( GPR_BYTES)(r8) + +#if !defined(POWERPC_DARWIN) + /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ + sg r2,(5 * GPR_BYTES)(r1) +#endif + +LCFI1: + + /* Save arguments over call. */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ +LCFI2: + /* Call ffi_prep_args. r3 = extended cif, r4 = stack ptr copy. */ + mr r4,r1 + li r9,0 + + mtctr r12 /* r12 holds address of _ffi_prep_args. */ + bctrl + +#if !defined(POWERPC_DARWIN) + /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ + lg r2,(5 * GPR_BYTES)(r1) +#endif + /* Now do the call. + Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + /* Get the address to call into CTR. */ + mtctr r29 + /* Load all those argument registers. + We have set up a nice stack frame, just load it into registers. */ + lg r3, (LINKAGE_SIZE )(r1) + lg r4, (LINKAGE_SIZE + GPR_BYTES)(r1) + lg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r1) + lg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r1) + nop + lg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r1) + lg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r1) + lg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r1) + lg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r1) + +L1: + /* ... Load all the FP registers. */ + bf 6,L2 /* No floats to load. */ + lfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) + lfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) + lfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) + lfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) + nop + lfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) + lfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) + lfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) + lfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) + nop + lfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) + lfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) + lfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) + lfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) + nop + lfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) + +L2: + mr r12,r29 /* Put the target address in r12 as specified. */ + mtctr r12 + nop + nop + + /* Make the call. */ + bctrl + + /* Now, deal with the return value. */ + + /* m64 structure returns can occupy the same set of registers as + would be used to pass such a structure as arg0 - so take care + not to step on any possibly hot regs. */ + + /* Get the flags.. */ + mtcrf 0x03,r31 ; we need c6 & cr7 now. + ; FLAG_RETURNS_NOTHING also covers struct ret-by-ref. + bt 30,L(done_return_value) ; FLAG_RETURNS_NOTHING + bf 27,L(scalar_return_value) ; not FLAG_RETURNS_STRUCT + + /* OK, so we have a struct. */ +#if defined(__ppc64__) + bt 31,L(maybe_return_128) ; FLAG_RETURNS_128BITS, special case + + /* OK, we have to map the return back to a mem struct. + We are about to trample the parents param area, so recover the + return type. r29 is free, since the call is done. */ + lg r29,(LINKAGE_SIZE + 6 * GPR_BYTES)(r28) + + sg r3, (LINKAGE_SIZE )(r28) + sg r4, (LINKAGE_SIZE + GPR_BYTES)(r28) + sg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r28) + sg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r28) + nop + sg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r28) + sg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r28) + sg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r28) + sg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) + /* OK, so do the block move - we trust that memcpy will not trample + the fprs... */ + mr r3,r30 ; dest + addi r4,r28,LINKAGE_SIZE ; source + /* The size is a size_t, should be long. */ + lg r5,0(r29) + /* Figure out small structs */ + cmpi 0,r5,4 + bgt L3 ; 1, 2 and 4 bytes have special rules. + cmpi 0,r5,3 + beq L3 ; not 3 + addi r4,r4,8 + subf r4,r5,r4 +L3: + bl _memcpy + + /* ... do we need the FP registers? - recover the flags.. */ + mtcrf 0x03,r31 ; we need c6 & cr7 now. + bf 29,L(done_return_value) /* No floats in the struct. */ + stfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) + stfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) + stfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) + stfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) + nop + stfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) + stfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) + stfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) + stfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) + nop + stfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) + stfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) + stfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) + stfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) + nop + stfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) + + mr r3,r29 ; ffi_type * + mr r4,r30 ; dest + addi r5,r28,-SAVE_REGS_SIZE-(13*FPR_SIZE) ; fprs + xor r6,r6,r6 + sg r6,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) + addi r6,r28,(LINKAGE_SIZE + 7 * GPR_BYTES) ; point to a zeroed counter. + bl _darwin64_struct_floats_to_mem + + b L(done_return_value) +#else + stw r3,0(r30) ; m32 the only struct return in reg is 4 bytes. +#endif + b L(done_return_value) + +L(fp_return_value): + /* Do we have long double to store? */ + bf 31,L(fd_return_value) ; FLAG_RETURNS_128BITS + stfd f1,0(r30) + stfd f2,FPR_SIZE(r30) + b L(done_return_value) + +L(fd_return_value): + /* Do we have double to store? */ + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + +L(float_return_value): + /* We only have a float to store. */ + stfs f1,0(r30) + b L(done_return_value) + +L(scalar_return_value): + bt 29,L(fp_return_value) ; FLAG_RETURNS_FP + ; ffi_arg is defined as unsigned long. + sg r3,0(r30) ; Save the reg. + bf 28,L(done_return_value) ; not FLAG_RETURNS_64BITS + +#if defined(__ppc64__) +L(maybe_return_128): + std r3,0(r30) + bf 31,L(done_return_value) ; not FLAG_RETURNS_128BITS + std r4,8(r30) +#else + stw r4,4(r30) +#endif + + /* Fall through. */ + /* We want this at the end to simplify eh epilog computation. */ + +L(done_return_value): + /* Restore the registers we used and return. */ + lg r29,SAVED_LR_OFFSET(r28) + ; epilog + lg r31,-(1 * GPR_BYTES)(r28) + mtlr r29 + lg r30,-(2 * GPR_BYTES)(r28) + lg r29,-(3 * GPR_BYTES)(r28) + lg r28,-(4 * GPR_BYTES)(r28) + lg r1,0(r1) + blr +LFE1: + .align 1 +/* END(_ffi_call_DARWIN) */ + +/* Provide a null definition of _ffi_call_AIX. */ + .text + .globl _ffi_call_AIX + .align 2 +_ffi_call_AIX: + blr +/* END(_ffi_call_AIX) */ + +/* EH stuff. */ + +#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) + + .static_data + .align LOG2_GPR_BYTES +LLFB0$non_lazy_ptr: + .g_long Lstartcode + + .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (indirect pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: + + .globl _ffi_call_DARWIN.eh +_ffi_call_DARWIN.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LLFB0$non_lazy_ptr-. ; FDE initial location + .set L$set$3,LFE1-Lstartcode + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-Lstartcode + .long L$set$4 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x08 ; uleb128 0x08 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$5,LCFI1-LCFI0 + .long L$set$5 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .byte 0x9f ; DW_CFA_offset, column 0x1f + .byte 0x1 ; uleb128 0x1 + .byte 0x9e ; DW_CFA_offset, column 0x1e + .byte 0x2 ; uleb128 0x2 + .byte 0x9d ; DW_CFA_offset, column 0x1d + .byte 0x3 ; uleb128 0x3 + .byte 0x9c ; DW_CFA_offset, column 0x1c + .byte 0x4 ; uleb128 0x4 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$6,LCFI2-LCFI1 + .long L$set$6 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x1c ; uleb128 0x1c + .align LOG2_GPR_BYTES +LEFDE1: + .align 1 + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin_closure.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin_closure.S new file mode 100644 index 0000000..db20cf6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin_closure.S @@ -0,0 +1,575 @@ +/* ----------------------------------------------------------------------- + darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010, + Free Software Foundation, Inc. + based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#define L(x) x + +#if defined(__ppc64__) +#define MODE_CHOICE(x, y) y +#else +#define MODE_CHOICE(x, y) x +#endif + +#define machine_choice MODE_CHOICE(ppc7400,ppc64) + +; Define some pseudo-opcodes for size-independent load & store of GPRs ... +#define lgu MODE_CHOICE(lwzu, ldu) +#define lg MODE_CHOICE(lwz,ld) +#define sg MODE_CHOICE(stw,std) +#define sgu MODE_CHOICE(stwu,stdu) + +; ... and the size of GPRs and their storage indicator. +#define GPR_BYTES MODE_CHOICE(4,8) +#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ +#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ + +; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. +#define LINKAGE_SIZE MODE_CHOICE(24,48) +#define PARAM_AREA MODE_CHOICE(32,64) + +#define SAVED_CR_OFFSET MODE_CHOICE(4,8) /* save position for CR */ +#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ + +/* WARNING: if ffi_type is changed... here be monsters. + Offsets of items within the result type. */ +#define FFI_TYPE_TYPE MODE_CHOICE(6,10) +#define FFI_TYPE_ELEM MODE_CHOICE(8,16) + +#define SAVED_FPR_COUNT 13 +#define FPR_SIZE 8 +/* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */ +#define RESULT_BYTES MODE_CHOICE(16,176) + +; The whole stack frame **MUST** be 16byte-aligned. +#define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL) +#define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)) + +#define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE) +#define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA) + +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 +; We no longer need the pic symbol stub for Darwin >= 9. +#define BLCLS_HELP _ffi_closure_helper_DARWIN +#define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p +#define PASS_STR_FLOATS _darwin64_pass_struct_floats +#undef WANT_STUB +#else +#define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub +#define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub +#define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub +#define WANT_STUB +#endif + +/* m32/m64 + + The stack layout looks like this: + + | Additional params... | | Higher address + ~ ~ ~ + | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS + |--------------------------------------------| | + | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | + |--------------------------------------------| | + | Reserved 2*4/8 | | + |--------------------------------------------| | + | Space for callee`s LR 4/8 | | + |--------------------------------------------| | + | Saved CR [low word for m64] 4/8 | | + |--------------------------------------------| | + | Current backchain pointer 4/8 |-/ Parent`s frame. + |--------------------------------------------| <+ <<< on entry to + | Result Bytes 16/176 | | + |--------------------------------------------| | + ~ padding to 16-byte alignment ~ ~ + |--------------------------------------------| | + | NUM_FPR_ARG_REGISTERS slots | | + | here fp13 .. fp1 13*8 | | + |--------------------------------------------| | + | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS + |--------------------------------------------| | + | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | + |--------------------------------------------| | stack | + | Reserved [compiler,binder] 2*4/8 | | grows | + |--------------------------------------------| | down V + | Space for callees LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR [low word for m64] 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 |-/ during + |--------------------------------------------| <<< call. + +*/ + + .file "darwin_closure.S" + + .machine machine_choice + + .text + .globl _ffi_closure_ASM + .align LOG2_GPR_BYTES +_ffi_closure_ASM: +LFB1: +Lstartcode: + mflr r0 /* extract return address */ + sg r0,SAVED_LR_OFFSET(r1) /* save the return address */ +LCFI0: + sgu r1,-SAVE_SIZE(r1) /* skip over caller save area + keep stack aligned to 16. */ +LCFI1: + /* We want to build up an area for the parameters passed + in registers. (both floating point and integer) */ + + /* Put gpr 3 to gpr 10 in the parents outgoing area... + ... the remainder of any params that overflowed the regs will + follow here. */ + sg r3, (PARENT_PARM_BASE )(r1) + sg r4, (PARENT_PARM_BASE + GPR_BYTES )(r1) + sg r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1) + sg r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1) + sg r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1) + sg r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1) + sg r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1) + sg r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1) + + /* We save fpr 1 to fpr 14 in our own save frame. */ + stfd f1, (FP_SAVE_BASE )(r1) + stfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) + stfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) + stfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) + stfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) + stfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) + stfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) + stfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) + stfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) + stfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) + stfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) + stfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) + stfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) + + /* Set up registers for the routine that actually does the work + get the context pointer from the trampoline. */ + mr r3,r11 + + /* Now load up the pointer to the result storage. */ + addi r4,r1,(SAVE_SIZE-RESULT_BYTES) + + /* Now load up the pointer to the saved gpr registers. */ + addi r5,r1,PARENT_PARM_BASE + + /* Now load up the pointer to the saved fpr registers. */ + addi r6,r1,FP_SAVE_BASE + + /* Make the call. */ + bl BLCLS_HELP + + /* r3 contains the rtype pointer... save it since we will need + it later. */ + sg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type + lg r0,0(r3) ; size => r0 + lhz r3,FFI_TYPE_TYPE(r3) ; type => r3 + + /* The helper will have intercepted struture returns and inserted + the caller`s destination address for structs returned by ref. */ + + /* r3 contains the return type so use it to look up in a table + so we know how to deal with each type. */ + + addi r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here. */ + bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */ + mflr r4 /* Move to r4. */ + slwi r3,r3,4 /* Now multiply return type by 16. */ + add r3,r3,r4 /* Add contents of table to table address. */ + mtctr r3 + bctr /* Jump to it. */ +LFE1: +/* Each of the ret_typeX code fragments has to be exactly 16 bytes long + (4 instructions). For cache effectiveness we align to a 16 byte boundary + first. */ + + .align 4 + + nop + nop + nop +Lget_ret_type0_addr: + blrl + +/* case FFI_TYPE_VOID */ +Lret_type0: + b Lfinish + nop + nop + nop + +/* case FFI_TYPE_INT */ +Lret_type1: + lg r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_FLOAT */ +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_DOUBLE */ +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_LONGDOUBLE */ +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +/* case FFI_TYPE_UINT8 */ +Lret_type5: +#if defined(__ppc64__) + lbz r3,7(r5) +#else + lbz r3,3(r5) +#endif + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT8 */ +Lret_type6: +#if defined(__ppc64__) + lbz r3,7(r5) +#else + lbz r3,3(r5) +#endif + extsb r3,r3 + b Lfinish + nop + +/* case FFI_TYPE_UINT16 */ +Lret_type7: +#if defined(__ppc64__) + lhz r3,6(r5) +#else + lhz r3,2(r5) +#endif + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT16 */ +Lret_type8: +#if defined(__ppc64__) + lha r3,6(r5) +#else + lha r3,2(r5) +#endif + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT32 */ +Lret_type9: +#if defined(__ppc64__) + lwz r3,4(r5) +#else + lwz r3,0(r5) +#endif + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT32 */ +Lret_type10: +#if defined(__ppc64__) + lwz r3,4(r5) +#else + lwz r3,0(r5) +#endif + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT64 */ +Lret_type11: +#if defined(__ppc64__) + lg r3,0(r5) + b Lfinish + nop +#else + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish +#endif + nop + +/* case FFI_TYPE_SINT64 */ +Lret_type12: +#if defined(__ppc64__) + lg r3,0(r5) + b Lfinish + nop +#else + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish +#endif + nop + +/* case FFI_TYPE_STRUCT */ +Lret_type13: +#if defined(__ppc64__) + lg r3,0(r5) ; we need at least this... + cmpi 0,r0,4 + bgt Lstructend ; not a special small case + b Lsmallstruct ; see if we need more. +#else + cmpi 0,r0,4 + bgt Lfinish ; not by value + lg r3,0(r5) + b Lfinish +#endif +/* case FFI_TYPE_POINTER */ +Lret_type14: + lg r3,0(r5) + b Lfinish + nop + nop + +#if defined(__ppc64__) +Lsmallstruct: + beq Lfour ; continuation of Lret13. + cmpi 0,r0,3 + beq Lfinish ; don`t adjust this - can`t be any floats here... + srdi r3,r3,48 + cmpi 0,r0,2 + beq Lfinish ; .. or here .. + srdi r3,r3,8 + b Lfinish ; .. or here. + +Lfour: + lg r6,LINKAGE_SIZE(r1) ; get the result type + lg r6,FFI_TYPE_ELEM(r6) ; elements array pointer + lg r6,0(r6) ; first element + lhz r0,FFI_TYPE_TYPE(r6) ; OK go the type + cmpi 0,r0,2 ; FFI_TYPE_FLOAT + bne Lfourint + lfs f1,0(r5) ; just one float in the struct. + b Lfinish + +Lfourint: + srdi r3,r3,32 ; four bytes. + b Lfinish + +Lstructend: + lg r3,LINKAGE_SIZE(r1) ; get the result type + bl STRUCT_RETVALUE_P + cmpi 0,r3,0 + beq Lfinish ; nope. + /* Recover a pointer to the results. */ + addi r11,r1,(SAVE_SIZE-RESULT_BYTES) + lg r3,0(r11) ; we need at least this... + lg r4,8(r11) + cmpi 0,r0,16 + beq Lfinish ; special case 16 bytes we don't consider floats. + + /* OK, frustratingly, the process of saving the struct to mem might have + messed with the FPRs, so we have to re-load them :(. + We`ll use our FPRs space again - calling: + void darwin64_pass_struct_floats (ffi_type *s, char *src, + unsigned *nfpr, double **fprs) + We`ll temporarily pinch the first two slots of the param area for local + vars used by the routine. */ + xor r6,r6,r6 + addi r5,r1,PARENT_PARM_BASE ; some space + sg r6,0(r5) ; *nfpr zeroed. + addi r6,r5,8 ; **fprs + addi r3,r1,FP_SAVE_BASE ; pointer to FPRs space + sg r3,0(r6) + mr r4,r11 ; the struct is here... + lg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type. + bl PASS_STR_FLOATS ; get struct floats into FPR save space. + /* See if we used any floats */ + lwz r0,(SAVE_SIZE-RESULT_BYTES)(r1) + cmpi 0,r0,0 + beq Lstructints ; nope. + /* OK load `em up... */ + lfd f1, (FP_SAVE_BASE )(r1) + lfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) + lfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) + lfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) + lfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) + lfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) + lfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) + lfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) + lfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) + lfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) + lfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) + lfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) + lfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) + + /* point back at our saved struct. */ +Lstructints: + addi r11,r1,(SAVE_SIZE-RESULT_BYTES) + lg r3,0(r11) ; we end up picking the + lg r4,8(r11) ; first two again. + lg r5,16(r11) + lg r6,24(r11) + lg r7,32(r11) + lg r8,40(r11) + lg r9,48(r11) + lg r10,56(r11) +#endif + +/* case done */ +Lfinish: + addi r1,r1,SAVE_SIZE /* Restore stack pointer. */ + lg r0,SAVED_LR_OFFSET(r1) /* Get return address. */ + mtlr r0 /* Reset link register. */ + blr +Lendcode: + .align 1 + +/* END(ffi_closure_ASM) */ + +/* EH frame stuff. */ +#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) +/* 176, 400 */ +#define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90) +#define EH_FRAME_OFFSETB MODE_CHOICE(1,3) + + .static_data + .align LOG2_GPR_BYTES +LLFB1$non_lazy_ptr: + .g_long Lstartcode + + .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (indirect pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: + .globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LLFB1$non_lazy_ptr-. ; FDE initial location + .set L$set$3,LFE1-Lstartcode + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte EH_FRAME_OFFSETA,EH_FRAME_OFFSETB ; uleb128 176,1/190,3 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-Lstartcode + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES +LEFDE1: + .align 1 + +#ifdef WANT_STUB + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_ffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,"L00000000001$spb" +"L00000000001$spb": + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L00000000001$spb") + mtlr r0 + lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L00000000001$spb")(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .long dyld_stub_binding_helper + +#if defined(__ppc64__) + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_darwin64_struct_ret_by_value_p$stub: + .indirect_symbol _darwin64_struct_ret_by_value_p + mflr r0 + bcl 20,31,"L00000000002$spb" +"L00000000002$spb": + mflr r11 + addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L00000000002$spb") + mtlr r0 + lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L00000000002$spb")(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_darwin64_struct_ret_by_value_p$lazy_ptr: + .indirect_symbol _darwin64_struct_ret_by_value_p + .long dyld_stub_binding_helper + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_darwin64_pass_struct_floats$stub: + .indirect_symbol _darwin64_pass_struct_floats + mflr r0 + bcl 20,31,"L00000000003$spb" +"L00000000003$spb": + mflr r11 + addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L00000000003$spb") + mtlr r0 + lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L00000000003$spb")(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_darwin64_pass_struct_floats$lazy_ptr: + .indirect_symbol _darwin64_pass_struct_floats + .long dyld_stub_binding_helper +# endif +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi.c new file mode 100644 index 0000000..fb2a39f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi.c @@ -0,0 +1,1448 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (C) 2011 Anthony Green + Copyright (C) 2008 Red Hat, Inc + Copyright (C) 2007, 2008 Free Software Foundation, Inc + Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + + +extern void ffi_closure_SYSV (void); +extern void FFI_HIDDEN ffi_closure_LINUX64 (void); + +enum { + /* The assembly depends on these exact flags. */ + FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */ + FLAG_RETURNS_NOTHING = 1 << (31-30), /* These go in cr7 */ + FLAG_RETURNS_FP = 1 << (31-29), + FLAG_RETURNS_64BITS = 1 << (31-28), + + FLAG_RETURNS_128BITS = 1 << (31-27), /* cr6 */ + FLAG_SYSV_SMST_R4 = 1 << (31-26), /* use r4 for FFI_SYSV 8 byte + structs. */ + FLAG_SYSV_SMST_R3 = 1 << (31-25), /* use r3 for FFI_SYSV 4 byte + structs. */ + /* Bits (31-24) through (31-19) store shift value for SMST */ + + FLAG_ARG_NEEDS_COPY = 1 << (31- 7), + FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ + FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), + FLAG_RETVAL_REFERENCE = 1 << (31- 4) +}; + +/* About the SYSV ABI. */ +unsigned int NUM_GPR_ARG_REGISTERS = 8; +#ifndef __NO_FPRS__ +unsigned int NUM_FPR_ARG_REGISTERS = 8; +#else +unsigned int NUM_FPR_ARG_REGISTERS = 0; +#endif + +enum { ASM_NEEDS_REGISTERS = 4 }; + +/* ffi_prep_args_SYSV is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Return address from ffi_call_SYSV 4bytes | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4 | stack pointer here + |--------------------------------------------|<+ <<< on entry to + | Saved r28-r31 4*4 | | ffi_call_SYSV + |--------------------------------------------| | + | GPR registers r3-r10 8*4 | | ffi_call_SYSV + |--------------------------------------------| | + | FPR registers f1-f8 (optional) 8*8 | | + |--------------------------------------------| | stack | + | Space for copied structures | | grows | + |--------------------------------------------| | down V + | Parameters that didn't fit in registers | | + |--------------------------------------------| | lower addresses + | Space for callee's LR 4 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4 |-/ during + |--------------------------------------------| <<< ffi_call_SYSV + +*/ + +void +ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack) +{ + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + + typedef union { + char *c; + unsigned *u; + long long *ll; + float *f; + double *d; + } valp; + + /* 'stacktop' points at the previous backchain pointer. */ + valp stacktop; + + /* 'gpr_base' points at the space for gpr3, and grows upwards as + we use GPR registers. */ + valp gpr_base; + int intarg_count; + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + valp fpr_base; + int fparg_count; + + /* 'copy_space' grows down as we put structures in it. It should + stay 16-byte aligned. */ + valp copy_space; + + /* 'next_arg' grows up as we put parameters in it. */ + valp next_arg; + + int i, ii MAYBE_UNUSED; + ffi_type **ptr; + double double_tmp; + union { + void **v; + char **c; + signed char **sc; + unsigned char **uc; + signed short **ss; + unsigned short **us; + unsigned int **ui; + long long **ll; + float **f; + double **d; + } p_argv; + size_t struct_copy_size; + unsigned gprvalue; + + if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT) + NUM_FPR_ARG_REGISTERS = 0; + + stacktop.c = (char *) stack + bytes; + gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS; + intarg_count = 0; + fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS; + fparg_count = 0; + copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c); + next_arg.u = stack + 2; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT (((unsigned) (char *) stack & 0xF) == 0); + FFI_ASSERT (((unsigned) copy_space.c & 0xF) == 0); + FFI_ASSERT (((unsigned) stacktop.c & 0xF) == 0); + FFI_ASSERT ((bytes & 0xF) == 0); + FFI_ASSERT (copy_space.c >= next_arg.c); + + /* Deal with return values that are actually pass-by-reference. */ + if (flags & FLAG_RETVAL_REFERENCE) + { + *gpr_base.u++ = (unsigned long) (char *) ecif->rvalue; + intarg_count++; + } + + /* Now for the arguments. */ + p_argv.v = ecif->avalue; + for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; + i > 0; + i--, ptr++, p_argv.v++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32. */ + if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT) + goto soft_float_prep; + double_tmp = **p_argv.f; + if (fparg_count >= NUM_FPR_ARG_REGISTERS) + { + *next_arg.f = (float) double_tmp; + next_arg.u += 1; + intarg_count++; + } + else + *fpr_base.d++ = double_tmp; + fparg_count++; + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; + + case FFI_TYPE_DOUBLE: + /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64. */ + if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT) + goto soft_double_prep; + double_tmp = **p_argv.d; + + if (fparg_count >= NUM_FPR_ARG_REGISTERS) + { + if (intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0) + { + intarg_count++; + next_arg.u++; + } + *next_arg.d = double_tmp; + next_arg.u += 2; + } + else + *fpr_base.d++ = double_tmp; + fparg_count++; + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if ((ecif->cif->abi != FFI_LINUX) + && (ecif->cif->abi != FFI_LINUX_SOFT_FLOAT)) + goto do_struct; + /* The soft float ABI for long doubles works like this, + a long double is passed in four consecutive gprs if available. + A maximum of 2 long doubles can be passed in gprs. + If we do not have 4 gprs left, the long double is passed on the + stack, 4-byte aligned. */ + if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT) + { + unsigned int int_tmp = (*p_argv.ui)[0]; + if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3) + { + if (intarg_count < NUM_GPR_ARG_REGISTERS) + intarg_count += NUM_GPR_ARG_REGISTERS - intarg_count; + *next_arg.u = int_tmp; + next_arg.u++; + for (ii = 1; ii < 4; ii++) + { + int_tmp = (*p_argv.ui)[ii]; + *next_arg.u = int_tmp; + next_arg.u++; + } + } + else + { + *gpr_base.u++ = int_tmp; + for (ii = 1; ii < 4; ii++) + { + int_tmp = (*p_argv.ui)[ii]; + *gpr_base.u++ = int_tmp; + } + } + intarg_count +=4; + } + else + { + double_tmp = (*p_argv.d)[0]; + + if (fparg_count >= NUM_FPR_ARG_REGISTERS - 1) + { + if (intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0) + { + intarg_count++; + next_arg.u++; + } + *next_arg.d = double_tmp; + next_arg.u += 2; + double_tmp = (*p_argv.d)[1]; + *next_arg.d = double_tmp; + next_arg.u += 2; + } + else + { + *fpr_base.d++ = double_tmp; + double_tmp = (*p_argv.d)[1]; + *fpr_base.d++ = double_tmp; + } + + fparg_count += 2; + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + } + break; +#endif + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + soft_double_prep: + if (intarg_count == NUM_GPR_ARG_REGISTERS-1) + intarg_count++; + if (intarg_count >= NUM_GPR_ARG_REGISTERS) + { + if (intarg_count % 2 != 0) + { + intarg_count++; + next_arg.u++; + } + *next_arg.ll = **p_argv.ll; + next_arg.u += 2; + } + else + { + /* whoops: abi states only certain register pairs + * can be used for passing long long int + * specifically (r3,r4), (r5,r6), (r7,r8), + * (r9,r10) and if next arg is long long but + * not correct starting register of pair then skip + * until the proper starting register + */ + if (intarg_count % 2 != 0) + { + intarg_count ++; + gpr_base.u++; + } + *gpr_base.ll++ = **p_argv.ll; + } + intarg_count += 2; + break; + + case FFI_TYPE_STRUCT: +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + do_struct: +#endif + struct_copy_size = ((*ptr)->size + 15) & ~0xF; + copy_space.c -= struct_copy_size; + memcpy (copy_space.c, *p_argv.c, (*ptr)->size); + + gprvalue = (unsigned long) copy_space.c; + + FFI_ASSERT (copy_space.c > next_arg.c); + FFI_ASSERT (flags & FLAG_ARG_NEEDS_COPY); + goto putgpr; + + case FFI_TYPE_UINT8: + gprvalue = **p_argv.uc; + goto putgpr; + case FFI_TYPE_SINT8: + gprvalue = **p_argv.sc; + goto putgpr; + case FFI_TYPE_UINT16: + gprvalue = **p_argv.us; + goto putgpr; + case FFI_TYPE_SINT16: + gprvalue = **p_argv.ss; + goto putgpr; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + soft_float_prep: + + gprvalue = **p_argv.ui; + + putgpr: + if (intarg_count >= NUM_GPR_ARG_REGISTERS) + *next_arg.u++ = gprvalue; + else + *gpr_base.u++ = gprvalue; + intarg_count++; + break; + } + } + + /* Check that we didn't overrun the stack... */ + FFI_ASSERT (copy_space.c >= next_arg.c); + FFI_ASSERT (gpr_base.u <= stacktop.u - ASM_NEEDS_REGISTERS); + FFI_ASSERT (fpr_base.u + <= stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); + FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); +} + +/* About the LINUX64 ABI. */ +enum { + NUM_GPR_ARG_REGISTERS64 = 8, + NUM_FPR_ARG_REGISTERS64 = 13 +}; +enum { ASM_NEEDS_REGISTERS64 = 4 }; + +/* ffi_prep_args64 is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Ret addr from ffi_call_LINUX64 8bytes | higher addresses + |--------------------------------------------| + | CR save area 8bytes | + |--------------------------------------------| + | Previous backchain pointer 8 | stack pointer here + |--------------------------------------------|<+ <<< on entry to + | Saved r28-r31 4*8 | | ffi_call_LINUX64 + |--------------------------------------------| | + | GPR registers r3-r10 8*8 | | + |--------------------------------------------| | + | FPR registers f1-f13 (optional) 13*8 | | + |--------------------------------------------| | + | Parameter save area | | + |--------------------------------------------| | + | TOC save area 8 | | + |--------------------------------------------| | stack | + | Linker doubleword 8 | | grows | + |--------------------------------------------| | down V + | Compiler doubleword 8 | | + |--------------------------------------------| | lower addresses + | Space for callee's LR 8 | | + |--------------------------------------------| | + | CR save area 8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 8 |-/ during + |--------------------------------------------| <<< ffi_call_LINUX64 + +*/ + +void FFI_HIDDEN +ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack) +{ + const unsigned long bytes = ecif->cif->bytes; + const unsigned long flags = ecif->cif->flags; + + typedef union { + char *c; + unsigned long *ul; + float *f; + double *d; + } valp; + + /* 'stacktop' points at the previous backchain pointer. */ + valp stacktop; + + /* 'next_arg' points at the space for gpr3, and grows upwards as + we use GPR registers, then continues at rest. */ + valp gpr_base; + valp gpr_end; + valp rest; + valp next_arg; + + /* 'fpr_base' points at the space for fpr3, and grows upwards as + we use FPR registers. */ + valp fpr_base; + int fparg_count; + + int i, words; + ffi_type **ptr; + double double_tmp; + union { + void **v; + char **c; + signed char **sc; + unsigned char **uc; + signed short **ss; + unsigned short **us; + signed int **si; + unsigned int **ui; + unsigned long **ul; + float **f; + double **d; + } p_argv; + unsigned long gprvalue; + + stacktop.c = (char *) stack + bytes; + gpr_base.ul = stacktop.ul - ASM_NEEDS_REGISTERS64 - NUM_GPR_ARG_REGISTERS64; + gpr_end.ul = gpr_base.ul + NUM_GPR_ARG_REGISTERS64; + rest.ul = stack + 6 + NUM_GPR_ARG_REGISTERS64; + fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64; + fparg_count = 0; + next_arg.ul = gpr_base.ul; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); + FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); + FFI_ASSERT ((bytes & 0xF) == 0); + + /* Deal with return values that are actually pass-by-reference. */ + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg.ul++ = (unsigned long) (char *) ecif->rvalue; + + /* Now for the arguments. */ + p_argv.v = ecif->avalue; + for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; + i > 0; + i--, ptr++, p_argv.v++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + double_tmp = **p_argv.f; + *next_arg.f = (float) double_tmp; + if (++next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + if (fparg_count < NUM_FPR_ARG_REGISTERS64) + *fpr_base.d++ = double_tmp; + fparg_count++; + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; + + case FFI_TYPE_DOUBLE: + double_tmp = **p_argv.d; + *next_arg.d = double_tmp; + if (++next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + if (fparg_count < NUM_FPR_ARG_REGISTERS64) + *fpr_base.d++ = double_tmp; + fparg_count++; + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + double_tmp = (*p_argv.d)[0]; + *next_arg.d = double_tmp; + if (++next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + if (fparg_count < NUM_FPR_ARG_REGISTERS64) + *fpr_base.d++ = double_tmp; + fparg_count++; + double_tmp = (*p_argv.d)[1]; + *next_arg.d = double_tmp; + if (++next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + if (fparg_count < NUM_FPR_ARG_REGISTERS64) + *fpr_base.d++ = double_tmp; + fparg_count++; + FFI_ASSERT (__LDBL_MANT_DIG__ == 106); + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; +#endif + + case FFI_TYPE_STRUCT: + words = ((*ptr)->size + 7) / 8; + if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul) + { + size_t first = gpr_end.c - next_arg.c; + memcpy (next_arg.c, *p_argv.c, first); + memcpy (rest.c, *p_argv.c + first, (*ptr)->size - first); + next_arg.c = rest.c + words * 8 - first; + } + else + { + char *where = next_arg.c; + + /* Structures with size less than eight bytes are passed + left-padded. */ + if ((*ptr)->size < 8) + where += 8 - (*ptr)->size; + + memcpy (where, *p_argv.c, (*ptr)->size); + next_arg.ul += words; + if (next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + } + break; + + case FFI_TYPE_UINT8: + gprvalue = **p_argv.uc; + goto putgpr; + case FFI_TYPE_SINT8: + gprvalue = **p_argv.sc; + goto putgpr; + case FFI_TYPE_UINT16: + gprvalue = **p_argv.us; + goto putgpr; + case FFI_TYPE_SINT16: + gprvalue = **p_argv.ss; + goto putgpr; + case FFI_TYPE_UINT32: + gprvalue = **p_argv.ui; + goto putgpr; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + gprvalue = **p_argv.si; + goto putgpr; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + gprvalue = **p_argv.ul; + putgpr: + *next_arg.ul++ = gprvalue; + if (next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + break; + } + } + + FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS + || (next_arg.ul >= gpr_base.ul + && next_arg.ul <= gpr_base.ul + 4)); +} + + + +/* Perform machine dependent cif processing */ +ffi_status +ffi_prep_cif_machdep (ffi_cif *cif) +{ + /* All this is for the SYSV and LINUX64 ABI. */ + int i; + ffi_type **ptr; + unsigned bytes; + int fparg_count = 0, intarg_count = 0; + unsigned flags = 0; + unsigned struct_copy_size = 0; + unsigned type = cif->rtype->type; + unsigned size = cif->rtype->size; + + if (cif->abi == FFI_LINUX_SOFT_FLOAT) + NUM_FPR_ARG_REGISTERS = 0; + + if (cif->abi != FFI_LINUX64) + { + /* All the machine-independent calculation of cif->bytes will be wrong. + Redo the calculation for SYSV. */ + + /* Space for the frame pointer, callee's LR, and the asm's temp regs. */ + bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int); + + /* Space for the GPR registers. */ + bytes += NUM_GPR_ARG_REGISTERS * sizeof (int); + } + else + { + /* 64-bit ABI. */ + + /* Space for backchain, CR, LR, cc/ld doubleword, TOC and the asm's temp + regs. */ + bytes = (6 + ASM_NEEDS_REGISTERS64) * sizeof (long); + + /* Space for the mandatory parm save area and general registers. */ + bytes += 2 * NUM_GPR_ARG_REGISTERS64 * sizeof (long); + } + + /* Return value handling. The rules for SYSV are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - Structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values and structures between 5 and 8 bytes are returned + in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Larger structures are allocated space and a pointer is passed as + the first argument. + - long doubles (if not equivalent to double) are returned in + fpr1,fpr2 for Linux and as for large structs for SysV. + For LINUX64: + - integer values in gpr3; + - Structures/Unions by reference; + - Single/double FP values in fpr1, long double in fpr1,fpr2. + - soft-float float/doubles are treated as UINT32/UINT64 respectivley. + - soft-float long doubles are returned in gpr3-gpr6. */ + switch (type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64 + && cif->abi != FFI_LINUX_SOFT_FLOAT) + goto byref; + flags |= FLAG_RETURNS_128BITS; + /* Fall through. */ +#endif + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + /* With FFI_LINUX_SOFT_FLOAT no fp registers are used. */ + if (cif->abi != FFI_LINUX_SOFT_FLOAT) + flags |= FLAG_RETURNS_FP; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: + if (cif->abi == FFI_SYSV) + { + /* The final SYSV ABI says that structures smaller or equal 8 bytes + are returned in r3/r4. The FFI_GCC_SYSV ABI instead returns them + in memory. */ + + /* Treat structs with size <= 8 bytes. */ + if (size <= 8) + { + flags |= FLAG_RETURNS_SMST; + /* These structs are returned in r3. We pack the type and the + precalculated shift value (needed in the sysv.S) into flags. + The same applies for the structs returned in r3/r4. */ + if (size <= 4) + { + flags |= FLAG_SYSV_SMST_R3; + flags |= 8 * (4 - size) << 8; + break; + } + /* These structs are returned in r3 and r4. See above. */ + if (size <= 8) + { + flags |= FLAG_SYSV_SMST_R3 | FLAG_SYSV_SMST_R4; + flags |= 8 * (8 - size) << 8; + break; + } + } + } +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + byref: +#endif + intarg_count++; + flags |= FLAG_RETVAL_REFERENCE; + /* Fall through. */ + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + if (cif->abi != FFI_LINUX64) + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. Structures and long doubles (if not equivalent + to double) are passed as a pointer to a copy of the structure. + Stuff on the stack needs to keep proper alignment. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32. */ + if (cif->abi == FFI_LINUX_SOFT_FLOAT) + goto soft_float_cif; + fparg_count++; + /* floating singles are not 8-aligned on stack */ + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT) + goto do_struct; + if (cif->abi == FFI_LINUX_SOFT_FLOAT) + { + if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3 + || intarg_count < NUM_GPR_ARG_REGISTERS) + /* A long double in FFI_LINUX_SOFT_FLOAT can use only + a set of four consecutive gprs. If we have not enough, + we have to adjust the intarg_count value. */ + intarg_count += NUM_GPR_ARG_REGISTERS - intarg_count; + intarg_count += 4; + break; + } + else + fparg_count++; + /* Fall thru */ +#endif + case FFI_TYPE_DOUBLE: + /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64. */ + if (cif->abi == FFI_LINUX_SOFT_FLOAT) + goto soft_double_cif; + fparg_count++; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS + && intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0) + intarg_count++; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + soft_double_cif: + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. + + Also, only certain register pairs can be used for + passing long long int -- specifically (r3,r4), (r5,r6), + (r7,r8), (r9,r10). + */ + if (intarg_count == NUM_GPR_ARG_REGISTERS-1 + || intarg_count % 2 != 0) + intarg_count++; + intarg_count += 2; + break; + + case FFI_TYPE_STRUCT: +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + do_struct: +#endif + /* We must allocate space for a copy of these to enforce + pass-by-value. Pad the space up to a multiple of 16 + bytes (the maximum alignment required for anything under + the SYSV ABI). */ + struct_copy_size += ((*ptr)->size + 15) & ~0xF; + /* Fall through (allocate space for the pointer). */ + + default: + soft_float_cif: + /* Everything else is passed as a 4-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + else + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + switch ((*ptr)->type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if (cif->abi == FFI_LINUX_SOFT_FLOAT) + intarg_count += 4; + else + { + fparg_count += 2; + intarg_count += 2; + } + break; +#endif + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; + intarg_count++; + break; + + case FFI_TYPE_STRUCT: + intarg_count += ((*ptr)->size + 7) / 8; + break; + + default: + /* Everything else is passed as a 8-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + if (fparg_count != 0) + flags |= FLAG_FP_ARGUMENTS; + if (intarg_count > 4) + flags |= FLAG_4_GPR_ARGUMENTS; + if (struct_copy_size != 0) + flags |= FLAG_ARG_NEEDS_COPY; + + if (cif->abi != FFI_LINUX64) + { + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + bytes += NUM_FPR_ARG_REGISTERS * sizeof (double); + + /* Stack space. */ + if (intarg_count > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count - NUM_GPR_ARG_REGISTERS) * sizeof (int); + if (fparg_count > NUM_FPR_ARG_REGISTERS) + bytes += (fparg_count - NUM_FPR_ARG_REGISTERS) * sizeof (double); + } + else + { + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double); + + /* Stack space. */ + if (intarg_count > NUM_GPR_ARG_REGISTERS64) + bytes += (intarg_count - NUM_GPR_ARG_REGISTERS64) * sizeof (long); + } + + /* The stack space allocated needs to be a multiple of 16 bytes. */ + bytes = (bytes + 15) & ~0xF; + + /* Add in the space for the copied structures. */ + bytes += struct_copy_size; + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +extern void ffi_call_SYSV(extended_cif *, unsigned, unsigned, unsigned *, + void (*fn)(void)); +extern void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, unsigned long, + unsigned long, unsigned long *, + void (*fn)(void)); + +void +ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { +#ifndef POWERPC64 + case FFI_SYSV: + case FFI_GCC_SYSV: + case FFI_LINUX: + case FFI_LINUX_SOFT_FLOAT: + ffi_call_SYSV (&ecif, -cif->bytes, cif->flags, ecif.rvalue, fn); + break; +#else + case FFI_LINUX64: + ffi_call_LINUX64 (&ecif, -(long) cif->bytes, cif->flags, ecif.rvalue, fn); + break; +#endif + default: + FFI_ASSERT (0); + break; + } +} + + +#ifndef POWERPC64 +#define MIN_CACHE_LINE_SIZE 8 + +static void +flush_icache (char *wraddr, char *xaddr, int size) +{ + int i; + for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) + __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" + : : "r" (xaddr + i), "r" (wraddr + i) : "memory"); + __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;" + : : "r"(xaddr + size - 1), "r"(wraddr + size - 1) + : "memory"); +} +#endif + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + void *codeloc) +{ +#ifdef POWERPC64 + void **tramp = (void **) &closure->tramp[0]; + + if (cif->abi != FFI_LINUX64) + return FFI_BAD_ABI; + /* Copy function address and TOC from ffi_closure_LINUX64. */ + memcpy (tramp, (char *) ffi_closure_LINUX64, 16); + tramp[2] = codeloc; +#else + unsigned int *tramp; + + if (! (cif->abi == FFI_GCC_SYSV + || cif->abi == FFI_SYSV + || cif->abi == FFI_LINUX + || cif->abi == FFI_LINUX_SOFT_FLOAT)) + return FFI_BAD_ABI; + + tramp = (unsigned int *) &closure->tramp[0]; + tramp[0] = 0x7c0802a6; /* mflr r0 */ + tramp[1] = 0x4800000d; /* bl 10 */ + tramp[4] = 0x7d6802a6; /* mflr r11 */ + tramp[5] = 0x7c0803a6; /* mtlr r0 */ + tramp[6] = 0x800b0000; /* lwz r0,0(r11) */ + tramp[7] = 0x816b0004; /* lwz r11,4(r11) */ + tramp[8] = 0x7c0903a6; /* mtctr r0 */ + tramp[9] = 0x4e800420; /* bctr */ + *(void **) &tramp[2] = (void *) ffi_closure_SYSV; /* function */ + *(void **) &tramp[3] = codeloc; /* context */ + + /* Flush the icache. */ + flush_icache ((char *)tramp, (char *)codeloc, FFI_TRAMPOLINE_SIZE); +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +typedef union +{ + float f; + double d; +} ffi_dblfl; + +int ffi_closure_helper_SYSV (ffi_closure *, void *, unsigned long *, + ffi_dblfl *, unsigned long *); + +/* Basically the trampoline invokes ffi_closure_SYSV, and on + * entry, r11 holds the address of the closure. + * After storing the registers that could possibly contain + * parameters to be passed into the stack frame and setting + * up space for a return value, ffi_closure_SYSV invokes the + * following helper function to do most of the work + */ + +int +ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, + unsigned long *pgr, ffi_dblfl *pfr, + unsigned long *pst) +{ + /* rvalue is the pointer to space for return value in closure assembly */ + /* pgr is the pointer to where r3-r10 are stored in ffi_closure_SYSV */ + /* pfr is the pointer to where f1-f8 are stored in ffi_closure_SYSV */ + /* pst is the pointer to outgoing parameter stack in original caller */ + + void ** avalue; + ffi_type ** arg_types; + long i, avn; + long nf; /* number of floating registers already used */ + long ng; /* number of general registers already used */ + ffi_cif * cif; + double temp; + unsigned size; + + cif = closure->cif; + avalue = alloca (cif->nargs * sizeof (void *)); + size = cif->rtype->size; + + nf = 0; + ng = 0; + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. + For FFI_SYSV the result is passed in r3/r4 if the struct size is less + or equal 8 bytes. */ + + if ((cif->rtype->type == FFI_TYPE_STRUCT + && !((cif->abi == FFI_SYSV) && (size <= 8))) +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + || (cif->rtype->type == FFI_TYPE_LONGDOUBLE + && cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT) +#endif + ) + { + rvalue = (void *) *pgr; + ng++; + pgr++; + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + /* Grab the addresses of the arguments from the stack frame. */ + while (i < avn) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + /* there are 8 gpr registers used to pass values */ + if (ng < 8) + { + avalue[i] = (char *) pgr + 3; + ng++; + pgr++; + } + else + { + avalue[i] = (char *) pst + 3; + pst++; + } + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + /* there are 8 gpr registers used to pass values */ + if (ng < 8) + { + avalue[i] = (char *) pgr + 2; + ng++; + pgr++; + } + else + { + avalue[i] = (char *) pst + 2; + pst++; + } + break; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + soft_float_closure: + /* there are 8 gpr registers used to pass values */ + if (ng < 8) + { + avalue[i] = pgr; + ng++; + pgr++; + } + else + { + avalue[i] = pst; + pst++; + } + break; + + case FFI_TYPE_STRUCT: +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + do_struct: +#endif + /* Structs are passed by reference. The address will appear in a + gpr if it is one of the first 8 arguments. */ + if (ng < 8) + { + avalue[i] = (void *) *pgr; + ng++; + pgr++; + } + else + { + avalue[i] = (void *) *pst; + pst++; + } + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + soft_double_closure: + /* passing long long ints are complex, they must + * be passed in suitable register pairs such as + * (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10) + * and if the entire pair aren't available then the outgoing + * parameter stack is used for both but an alignment of 8 + * must will be kept. So we must either look in pgr + * or pst to find the correct address for this type + * of parameter. + */ + if (ng < 7) + { + if (ng & 0x01) + { + /* skip r4, r6, r8 as starting points */ + ng++; + pgr++; + } + avalue[i] = pgr; + ng += 2; + pgr += 2; + } + else + { + if (((long) pst) & 4) + pst++; + avalue[i] = pst; + pst += 2; + ng = 8; + } + break; + + case FFI_TYPE_FLOAT: + /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32. */ + if (cif->abi == FFI_LINUX_SOFT_FLOAT) + goto soft_float_closure; + /* unfortunately float values are stored as doubles + * in the ffi_closure_SYSV code (since we don't check + * the type in that routine). + */ + + /* there are 8 64bit floating point registers */ + + if (nf < 8) + { + temp = pfr->d; + pfr->f = (float) temp; + avalue[i] = pfr; + nf++; + pfr++; + } + else + { + /* FIXME? here we are really changing the values + * stored in the original calling routines outgoing + * parameter stack. This is probably a really + * naughty thing to do but... + */ + avalue[i] = pst; + pst += 1; + } + break; + + case FFI_TYPE_DOUBLE: + /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64. */ + if (cif->abi == FFI_LINUX_SOFT_FLOAT) + goto soft_double_closure; + /* On the outgoing stack all values are aligned to 8 */ + /* there are 8 64bit floating point registers */ + + if (nf < 8) + { + avalue[i] = pfr; + nf++; + pfr++; + } + else + { + if (((long) pst) & 4) + pst++; + avalue[i] = pst; + pst += 2; + } + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT) + goto do_struct; + if (cif->abi == FFI_LINUX_SOFT_FLOAT) + { /* Test if for the whole long double, 4 gprs are available. + otherwise the stuff ends up on the stack. */ + if (ng < 5) + { + avalue[i] = pgr; + pgr += 4; + ng += 4; + } + else + { + avalue[i] = pst; + pst += 4; + ng = 8; + } + break; + } + if (nf < 7) + { + avalue[i] = pfr; + pfr += 2; + nf += 2; + } + else + { + if (((long) pst) & 4) + pst++; + avalue[i] = pst; + pst += 4; + nf = 8; + } + break; +#endif + + default: + FFI_ASSERT (0); + } + + i++; + } + + + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_SYSV how to perform return type promotions. + Because the FFI_SYSV ABI returns the structures <= 8 bytes in r3/r4 + we have to tell ffi_closure_SYSV how to treat them. We combine the base + type FFI_SYSV_TYPE_SMALL_STRUCT - 1 with the size of the struct. + So a one byte struct gets the return type 16. Return type 1 to 15 are + already used and we never have a struct with size zero. That is the reason + for the subtraction of 1. See the comment in ffitarget.h about ordering. + */ + if (cif->abi == FFI_SYSV && cif->rtype->type == FFI_TYPE_STRUCT + && size <= 8) + return (FFI_SYSV_TYPE_SMALL_STRUCT - 1) + size; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + else if (cif->rtype->type == FFI_TYPE_LONGDOUBLE + && cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT) + return FFI_TYPE_STRUCT; +#endif + /* With FFI_LINUX_SOFT_FLOAT floats and doubles are handled like UINT32 + respectivley UINT64. */ + if (cif->abi == FFI_LINUX_SOFT_FLOAT) + { + switch (cif->rtype->type) + { + case FFI_TYPE_FLOAT: + return FFI_TYPE_UINT32; + break; + case FFI_TYPE_DOUBLE: + return FFI_TYPE_UINT64; + break; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + return FFI_TYPE_UINT128; + break; +#endif + default: + return cif->rtype->type; + } + } + else + { + return cif->rtype->type; + } +} + +int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_closure *, void *, + unsigned long *, ffi_dblfl *); + +int FFI_HIDDEN +ffi_closure_helper_LINUX64 (ffi_closure *closure, void *rvalue, + unsigned long *pst, ffi_dblfl *pfr) +{ + /* rvalue is the pointer to space for return value in closure assembly */ + /* pst is the pointer to parameter save area + (r3-r10 are stored into its first 8 slots by ffi_closure_LINUX64) */ + /* pfr is the pointer to where f1-f13 are stored in ffi_closure_LINUX64 */ + + void **avalue; + ffi_type **arg_types; + long i, avn; + ffi_cif *cif; + ffi_dblfl *end_pfr = pfr + NUM_FPR_ARG_REGISTERS64; + + cif = closure->cif; + avalue = alloca (cif->nargs * sizeof (void *)); + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ + if (cif->rtype->type == FFI_TYPE_STRUCT) + { + rvalue = (void *) *pst; + pst++; + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + /* Grab the addresses of the arguments from the stack frame. */ + while (i < avn) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (char *) pst + 7; + pst++; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (char *) pst + 6; + pst++; + break; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + avalue[i] = (char *) pst + 4; + pst++; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_POINTER: + avalue[i] = pst; + pst++; + break; + + case FFI_TYPE_STRUCT: + /* Structures with size less than eight bytes are passed + left-padded. */ + if (arg_types[i]->size < 8) + avalue[i] = (char *) pst + 8 - arg_types[i]->size; + else + avalue[i] = pst; + pst += (arg_types[i]->size + 7) / 8; + break; + + case FFI_TYPE_FLOAT: + /* unfortunately float values are stored as doubles + * in the ffi_closure_LINUX64 code (since we don't check + * the type in that routine). + */ + + /* there are 13 64bit floating point registers */ + + if (pfr < end_pfr) + { + double temp = pfr->d; + pfr->f = (float) temp; + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pst; + pst++; + break; + + case FFI_TYPE_DOUBLE: + /* On the outgoing stack all values are aligned to 8 */ + /* there are 13 64bit floating point registers */ + + if (pfr < end_pfr) + { + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pst; + pst++; + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if (pfr + 1 < end_pfr) + { + avalue[i] = pfr; + pfr += 2; + } + else + { + if (pfr < end_pfr) + { + /* Passed partly in f13 and partly on the stack. + Move it all to the stack. */ + *pst = *(unsigned long *) pfr; + pfr++; + } + avalue[i] = pst; + } + pst += 2; + break; +#endif + + default: + FFI_ASSERT (0); + } + + i++; + } + + + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_LINUX64 how to perform return type promotions. */ + return cif->rtype->type; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c new file mode 100644 index 0000000..ee03dab --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c @@ -0,0 +1,1359 @@ +/* ----------------------------------------------------------------------- + ffi_darwin.c + + Copyright (C) 1998 Geoffrey Keating + Copyright (C) 2001 John Hornkvist + Copyright (C) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. + + FFI support for Darwin and AIX. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +extern void ffi_closure_ASM (void); + +enum { + /* The assembly depends on these exact flags. + For Darwin64 (when FLAG_RETURNS_STRUCT is set): + FLAG_RETURNS_FP indicates that the structure embeds FP data. + FLAG_RETURNS_128BITS signals a special struct size that is not + expanded for float content. */ + FLAG_RETURNS_128BITS = 1 << (31-31), /* These go in cr7 */ + FLAG_RETURNS_NOTHING = 1 << (31-30), + FLAG_RETURNS_FP = 1 << (31-29), + FLAG_RETURNS_64BITS = 1 << (31-28), + + FLAG_RETURNS_STRUCT = 1 << (31-27), /* This goes in cr6 */ + + FLAG_ARG_NEEDS_COPY = 1 << (31- 7), + FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ + FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), + FLAG_RETVAL_REFERENCE = 1 << (31- 4) +}; + +/* About the DARWIN ABI. */ +enum { + NUM_GPR_ARG_REGISTERS = 8, + NUM_FPR_ARG_REGISTERS = 13, + LINKAGE_AREA_GPRS = 6 +}; + +enum { ASM_NEEDS_REGISTERS = 4 }; /* r28-r31 */ + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments. + + m32/m64 + + The stack layout we want looks like this: + + | Return address from ffi_call_DARWIN | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4/8 | stack pointer here + |--------------------------------------------|<+ <<< on entry to + | ASM_NEEDS_REGISTERS=r28-r31 4*(4/8) | | ffi_call_DARWIN + |--------------------------------------------| | + | When we have any FP activity... the | | + | FPRs occupy NUM_FPR_ARG_REGISTERS slots | | + | here fp13 .. fp1 from high to low addr. | | + ~ ~ ~ + | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS + |--------------------------------------------| | + | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | + |--------------------------------------------| | stack | + | Reserved 2*4/8 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR [low word for m64] 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 |-/ during + |--------------------------------------------| <<< ffi_call_DARWIN + + */ + +#if defined(POWERPC_DARWIN64) +static void +darwin64_pass_struct_by_value + (ffi_type *, char *, unsigned, unsigned *, double **, unsigned long **); +#endif + +/* This depends on GPR_SIZE = sizeof (unsigned long) */ + +void +ffi_prep_args (extended_cif *ecif, unsigned long *const stack) +{ + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + const unsigned nargs = ecif->cif->nargs; +#if !defined(POWERPC_DARWIN64) + const ffi_abi abi = ecif->cif->abi; +#endif + + /* 'stacktop' points at the previous backchain pointer. */ + unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long)); + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS; + int gp_count = 0, fparg_count = 0; + + /* 'next_arg' grows up as we put parameters in it. */ + unsigned long *next_arg = stack + LINKAGE_AREA_GPRS; /* 6 reserved positions. */ + + int i; + double double_tmp; + void **p_argv = ecif->avalue; + unsigned long gprvalue; + ffi_type** ptr = ecif->cif->arg_types; +#if !defined(POWERPC_DARWIN64) + char *dest_cpy; +#endif + unsigned size_al = 0; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT(((unsigned) (char *) stack & 0xF) == 0); + FFI_ASSERT(((unsigned) (char *) stacktop & 0xF) == 0); + FFI_ASSERT((bytes & 0xF) == 0); + + /* Deal with return values that are actually pass-by-reference. + Rule: + Return values are referenced by r3, so r4 is the first parameter. */ + + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg++ = (unsigned long) (char *) ecif->rvalue; + + /* Now for the arguments. */ + for (i = nargs; i > 0; i--, ptr++, p_argv++) + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match + the size of the floating-point parameter are skipped. */ + case FFI_TYPE_FLOAT: + double_tmp = *(float *) *p_argv; + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; +#if defined(POWERPC_DARWIN) + *(float *)next_arg = *(float *) *p_argv; +#else + *(double *)next_arg = double_tmp; +#endif + next_arg++; + gp_count++; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + break; + + case FFI_TYPE_DOUBLE: + double_tmp = *(double *) *p_argv; + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + *(double *)next_arg = double_tmp; +#ifdef POWERPC64 + next_arg++; + gp_count++; +#else + next_arg += 2; + gp_count += 2; +#endif + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +# if defined(POWERPC64) && !defined(POWERPC_DARWIN64) + /* ??? This will exceed the regs count when the value starts at fp13 + and it will not put the extra bit on the stack. */ + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *(long double *) fpr_base++ = *(long double *) *p_argv; + else + *(long double *) next_arg = *(long double *) *p_argv; + next_arg += 2; + fparg_count += 2; +# else + double_tmp = ((double *) *p_argv)[0]; + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + *(double *) next_arg = double_tmp; +# if defined(POWERPC_DARWIN64) + next_arg++; + gp_count++; +# else + next_arg += 2; + gp_count += 2; +# endif + fparg_count++; + double_tmp = ((double *) *p_argv)[1]; + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + *(double *) next_arg = double_tmp; +# if defined(POWERPC_DARWIN64) + next_arg++; + gp_count++; +# else + next_arg += 2; + gp_count += 2; +# endif + fparg_count++; +# endif + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + break; +#endif + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#ifdef POWERPC64 + gprvalue = *(long long *) *p_argv; + goto putgpr; +#else + *(long long *) next_arg = *(long long *) *p_argv; + next_arg += 2; + gp_count += 2; +#endif + break; + case FFI_TYPE_POINTER: + gprvalue = *(unsigned long *) *p_argv; + goto putgpr; + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char *) *p_argv; + goto putgpr; + case FFI_TYPE_SINT8: + gprvalue = *(signed char *) *p_argv; + goto putgpr; + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short *) *p_argv; + goto putgpr; + case FFI_TYPE_SINT16: + gprvalue = *(signed short *) *p_argv; + goto putgpr; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; +#if defined(POWERPC_DARWIN64) + next_arg = (unsigned long *)ALIGN((char *)next_arg, (*ptr)->alignment); + darwin64_pass_struct_by_value (*ptr, (char *) *p_argv, + (unsigned) size_al, + (unsigned int *) &fparg_count, + &fpr_base, &next_arg); +#else + dest_cpy = (char *) next_arg; + + /* If the first member of the struct is a double, then include enough + padding in the struct size to align it to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + +# if defined(POWERPC64) + FFI_ASSERT (abi != FFI_DARWIN); + memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); + next_arg += (size_al + 7) / 8; +# else + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. + Structures with 3 byte in size are padded upwards. */ + if (size_al < 3 && abi == FFI_DARWIN) + dest_cpy += 4 - size_al; + + memcpy((char *) dest_cpy, (char *) *p_argv, size_al); + next_arg += (size_al + 3) / 4; +# endif +#endif + break; + + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + gprvalue = *(signed int *) *p_argv; + goto putgpr; + + case FFI_TYPE_UINT32: + gprvalue = *(unsigned int *) *p_argv; + putgpr: + *next_arg++ = gprvalue; + gp_count++; + break; + default: + break; + } + } + + /* Check that we didn't overrun the stack... */ + //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); + //FFI_ASSERT((unsigned *)fpr_base + // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); + //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); +} + +#if defined(POWERPC_DARWIN64) + +/* See if we can put some of the struct into fprs. + This should not be called for structures of size 16 bytes, since these are not + broken out this way. */ +static void +darwin64_scan_struct_for_floats (ffi_type *s, unsigned *nfpr) +{ + int i; + + FFI_ASSERT (s->type == FFI_TYPE_STRUCT) + + for (i = 0; s->elements[i] != NULL; i++) + { + ffi_type *p = s->elements[i]; + switch (p->type) + { + case FFI_TYPE_STRUCT: + darwin64_scan_struct_for_floats (p, nfpr); + break; + case FFI_TYPE_LONGDOUBLE: + (*nfpr) += 2; + break; + case FFI_TYPE_DOUBLE: + case FFI_TYPE_FLOAT: + (*nfpr) += 1; + break; + default: + break; + } + } +} + +static int +darwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr) +{ + unsigned struct_offset=0, i; + + for (i = 0; s->elements[i] != NULL; i++) + { + char *item_base; + ffi_type *p = s->elements[i]; + /* Find the start of this item (0 for the first one). */ + if (i > 0) + struct_offset = ALIGN(struct_offset, p->alignment); + + item_base = src + struct_offset; + + switch (p->type) + { + case FFI_TYPE_STRUCT: + if (darwin64_struct_size_exceeds_gprs_p (p, item_base, nfpr)) + return 1; + break; + case FFI_TYPE_LONGDOUBLE: + if (*nfpr >= NUM_FPR_ARG_REGISTERS) + return 1; + (*nfpr) += 1; + item_base += 8; + /* FALL THROUGH */ + case FFI_TYPE_DOUBLE: + if (*nfpr >= NUM_FPR_ARG_REGISTERS) + return 1; + (*nfpr) += 1; + break; + case FFI_TYPE_FLOAT: + if (*nfpr >= NUM_FPR_ARG_REGISTERS) + return 1; + (*nfpr) += 1; + break; + default: + /* If we try and place any item, that is non-float, once we've + exceeded the 8 GPR mark, then we can't fit the struct. */ + if ((unsigned long)item_base >= 8*8) + return 1; + break; + } + /* now count the size of what we just used. */ + struct_offset += p->size; + } + return 0; +} + +/* Can this struct be returned by value? */ +int +darwin64_struct_ret_by_value_p (ffi_type *s) +{ + unsigned nfp = 0; + + FFI_ASSERT (s && s->type == FFI_TYPE_STRUCT); + + /* The largest structure we can return is 8long + 13 doubles. */ + if (s->size > 168) + return 0; + + /* We can't pass more than 13 floats. */ + darwin64_scan_struct_for_floats (s, &nfp); + if (nfp > 13) + return 0; + + /* If there are not too many floats, and the struct is + small enough to accommodate in the GPRs, then it must be OK. */ + if (s->size <= 64) + return 1; + + /* Well, we have to look harder. */ + nfp = 0; + if (darwin64_struct_size_exceeds_gprs_p (s, NULL, &nfp)) + return 0; + + return 1; +} + +void +darwin64_pass_struct_floats (ffi_type *s, char *src, + unsigned *nfpr, double **fprs) +{ + int i; + double *fpr_base = *fprs; + unsigned struct_offset = 0; + + /* We don't assume anything about the alignment of the source. */ + for (i = 0; s->elements[i] != NULL; i++) + { + char *item_base; + ffi_type *p = s->elements[i]; + /* Find the start of this item (0 for the first one). */ + if (i > 0) + struct_offset = ALIGN(struct_offset, p->alignment); + item_base = src + struct_offset; + + switch (p->type) + { + case FFI_TYPE_STRUCT: + darwin64_pass_struct_floats (p, item_base, nfpr, + &fpr_base); + break; + case FFI_TYPE_LONGDOUBLE: + if (*nfpr < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = *(double *)item_base; + (*nfpr) += 1; + item_base += 8; + /* FALL THROUGH */ + case FFI_TYPE_DOUBLE: + if (*nfpr < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = *(double *)item_base; + (*nfpr) += 1; + break; + case FFI_TYPE_FLOAT: + if (*nfpr < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = (double) *(float *)item_base; + (*nfpr) += 1; + break; + default: + break; + } + /* now count the size of what we just used. */ + struct_offset += p->size; + } + /* Update the scores. */ + *fprs = fpr_base; +} + +/* Darwin64 special rules. + Break out a struct into params and float registers. */ +static void +darwin64_pass_struct_by_value (ffi_type *s, char *src, unsigned size, + unsigned *nfpr, double **fprs, unsigned long **arg) +{ + unsigned long *next_arg = *arg; + char *dest_cpy = (char *)next_arg; + + FFI_ASSERT (s->type == FFI_TYPE_STRUCT) + + if (!size) + return; + + /* First... special cases. */ + if (size < 3 + || (size == 4 + && s->elements[0] + && s->elements[0]->type != FFI_TYPE_FLOAT)) + { + /* Must be at least one GPR, padding is unspecified in value, + let's make it zero. */ + *next_arg = 0UL; + dest_cpy += 8 - size; + memcpy ((char *) dest_cpy, src, size); + next_arg++; + } + else if (size == 16) + { + memcpy ((char *) dest_cpy, src, size); + next_arg += 2; + } + else + { + /* now the general case, we consider embedded floats. */ + memcpy ((char *) dest_cpy, src, size); + darwin64_pass_struct_floats (s, src, nfpr, fprs); + next_arg += (size+7)/8; + } + + *arg = next_arg; +} + +double * +darwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *nf) +{ + int i; + unsigned struct_offset = 0; + + /* We don't assume anything about the alignment of the source. */ + for (i = 0; s->elements[i] != NULL; i++) + { + char *item_base; + ffi_type *p = s->elements[i]; + /* Find the start of this item (0 for the first one). */ + if (i > 0) + struct_offset = ALIGN(struct_offset, p->alignment); + item_base = dest + struct_offset; + + switch (p->type) + { + case FFI_TYPE_STRUCT: + fprs = darwin64_struct_floats_to_mem (p, item_base, fprs, nf); + break; + case FFI_TYPE_LONGDOUBLE: + if (*nf < NUM_FPR_ARG_REGISTERS) + { + *(double *)item_base = *fprs++ ; + (*nf) += 1; + } + item_base += 8; + /* FALL THROUGH */ + case FFI_TYPE_DOUBLE: + if (*nf < NUM_FPR_ARG_REGISTERS) + { + *(double *)item_base = *fprs++ ; + (*nf) += 1; + } + break; + case FFI_TYPE_FLOAT: + if (*nf < NUM_FPR_ARG_REGISTERS) + { + *(float *)item_base = (float) *fprs++ ; + (*nf) += 1; + } + break; + default: + break; + } + /* now count the size of what we just used. */ + struct_offset += p->size; + } + return fprs; +} + +#endif + +/* Adjust the size of S to be correct for Darwin. + On Darwin m32, the first field of a structure has natural alignment. + On Darwin m64, all fields have natural alignment. */ + +static void +darwin_adjust_aggregate_sizes (ffi_type *s) +{ + int i; + + if (s->type != FFI_TYPE_STRUCT) + return; + + s->size = 0; + for (i = 0; s->elements[i] != NULL; i++) + { + ffi_type *p; + int align; + + p = s->elements[i]; + if (p->type == FFI_TYPE_STRUCT) + darwin_adjust_aggregate_sizes (p); +#if defined(POWERPC_DARWIN64) + /* Natural alignment for all items. */ + align = p->alignment; +#else + /* Natrual alignment for the first item... */ + if (i == 0) + align = p->alignment; + else if (p->alignment == 16 || p->alignment < 4) + /* .. subsequent items with vector or align < 4 have natural align. */ + align = p->alignment; + else + /* .. or align is 4. */ + align = 4; +#endif + /* Pad, if necessary, before adding the current item. */ + s->size = ALIGN(s->size, align) + p->size; + } + + s->size = ALIGN(s->size, s->alignment); + + /* This should not be necessary on m64, but harmless. */ + if (s->elements[0]->type == FFI_TYPE_UINT64 + || s->elements[0]->type == FFI_TYPE_SINT64 + || s->elements[0]->type == FFI_TYPE_DOUBLE + || s->elements[0]->alignment == 8) + s->alignment = s->alignment > 8 ? s->alignment : 8; + /* Do not add additional tail padding. */ +} + +/* Adjust the size of S to be correct for AIX. + Word-align double unless it is the first member of a structure. */ + +static void +aix_adjust_aggregate_sizes (ffi_type *s) +{ + int i; + + if (s->type != FFI_TYPE_STRUCT) + return; + + s->size = 0; + for (i = 0; s->elements[i] != NULL; i++) + { + ffi_type *p; + int align; + + p = s->elements[i]; + aix_adjust_aggregate_sizes (p); + align = p->alignment; + if (i != 0 && p->type == FFI_TYPE_DOUBLE) + align = 4; + s->size = ALIGN(s->size, align) + p->size; + } + + s->size = ALIGN(s->size, s->alignment); + + if (s->elements[0]->type == FFI_TYPE_UINT64 + || s->elements[0]->type == FFI_TYPE_SINT64 + || s->elements[0]->type == FFI_TYPE_DOUBLE + || s->elements[0]->alignment == 8) + s->alignment = s->alignment > 8 ? s->alignment : 8; + /* Do not add additional tail padding. */ +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep (ffi_cif *cif) +{ + /* All this is for the DARWIN ABI. */ + unsigned i; + ffi_type **ptr; + unsigned bytes; + unsigned fparg_count = 0, intarg_count = 0; + unsigned flags = 0; + unsigned size_al = 0; + + /* All the machine-independent calculation of cif->bytes will be wrong. + All the calculation of structure sizes will also be wrong. + Redo the calculation for DARWIN. */ + + if (cif->abi == FFI_DARWIN) + { + darwin_adjust_aggregate_sizes (cif->rtype); + for (i = 0; i < cif->nargs; i++) + darwin_adjust_aggregate_sizes (cif->arg_types[i]); + } + + if (cif->abi == FFI_AIX) + { + aix_adjust_aggregate_sizes (cif->rtype); + for (i = 0; i < cif->nargs; i++) + aix_adjust_aggregate_sizes (cif->arg_types[i]); + } + + /* Space for the frame pointer, callee's LR, CR, etc, and for + the asm's temp regs. */ + + bytes = (LINKAGE_AREA_GPRS + ASM_NEEDS_REGISTERS) * sizeof(unsigned long); + + /* Return value handling. + The rules m32 are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values [??? and structures between 5 and 8 bytes] are + returned in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Long double FP (if not equivalent to double) values are returned in + fpr1 and fpr2; + m64: + - 64-bit or smaller integral values are returned in GPR3 + - Single/double FP values are returned in fpr1; + - Long double FP values are returned in fpr1 and fpr2; + m64 Structures: + - If the structure could be accommodated in registers were it to be the + first argument to a routine, then it is returned in those registers. + m32/m64 structures otherwise: + - Larger structures values are allocated space and a pointer is passed + as the first argument. */ + switch (cif->rtype->type) + { + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; + flags |= FLAG_RETURNS_FP; + break; +#endif + + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#ifdef POWERPC64 + case FFI_TYPE_POINTER: +#endif + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: +#if defined(POWERPC_DARWIN64) + { + /* Can we fit the struct into regs? */ + if (darwin64_struct_ret_by_value_p (cif->rtype)) + { + unsigned nfpr = 0; + flags |= FLAG_RETURNS_STRUCT; + if (cif->rtype->size != 16) + darwin64_scan_struct_for_floats (cif->rtype, &nfpr) ; + else + flags |= FLAG_RETURNS_128BITS; + /* Will be 0 for 16byte struct. */ + if (nfpr) + flags |= FLAG_RETURNS_FP; + } + else /* By ref. */ + { + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + } + } +#elif defined(DARWIN_PPC) + if (cif->rtype->size <= 4) + flags |= FLAG_RETURNS_STRUCT; + else /* else by reference. */ + { + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + } +#else /* assume we pass by ref. */ + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; +#endif + break; + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. + ??? Structures are passed as a pointer to a copy of the structure. + Stuff on the stack needs to keep proper alignment. + For m64 the count is effectively of half-GPRs. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + unsigned align_words; + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; +#if !defined(POWERPC_DARWIN64) + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS + && (intarg_count & 0x01) != 0) + intarg_count++; +#endif + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + fparg_count += 2; + /* If this FP arg is going on the stack, it must be + 16-byte-aligned. */ + if (fparg_count >= NUM_FPR_ARG_REGISTERS) +#if defined (POWERPC64) + intarg_count = ALIGN(intarg_count, 2); +#else + intarg_count = ALIGN(intarg_count, 4); +#endif + break; +#endif + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#if defined(POWERPC64) + intarg_count++; +#else + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. */ + if (intarg_count == NUM_GPR_ARG_REGISTERS-1 + || (intarg_count >= NUM_GPR_ARG_REGISTERS + && (intarg_count & 0x01) != 0)) + intarg_count++; + intarg_count += 2; +#endif + break; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; +#if defined(POWERPC_DARWIN64) + align_words = (*ptr)->alignment >> 3; + if (align_words) + intarg_count = ALIGN(intarg_count, align_words); + /* Base size of the struct. */ + intarg_count += (size_al + 7) / 8; + /* If 16 bytes then don't worry about floats. */ + if (size_al != 16) + /* Scan through for floats to be placed in regs. */ + darwin64_scan_struct_for_floats (*ptr, &fparg_count) ; +#else + align_words = (*ptr)->alignment >> 2; + if (align_words) + intarg_count = ALIGN(intarg_count, align_words); + /* If the first member of the struct is a double, then align + the struct to double-word. + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); */ +# ifdef POWERPC64 + intarg_count += (size_al + 7) / 8; +# else + intarg_count += (size_al + 3) / 4; +# endif +#endif + break; + + default: + /* Everything else is passed as a 4-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + if (fparg_count != 0) + flags |= FLAG_FP_ARGUMENTS; + +#if defined(POWERPC_DARWIN64) + /* Space to image the FPR registers, if needed - which includes when they might be + used in a struct return. */ + if (fparg_count != 0 + || ((flags & FLAG_RETURNS_STRUCT) + && (flags & FLAG_RETURNS_FP))) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); +#else + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); +#endif + + /* Stack space. */ +#ifdef POWERPC64 + if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + fparg_count) * sizeof(long); +#else + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); +#endif + else + bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); + + /* The stack space allocated needs to be a multiple of 16 bytes. */ + bytes = ALIGN(bytes, 16) ; + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *, + void (*fn)(void), void (*fn2)(void)); + +extern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *, + void (*fn)(void), void (*fn2)(void), ffi_type*); + +void +ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca (cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_AIX: + ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, + FFI_FN(ffi_prep_args)); + break; + case FFI_DARWIN: + ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, + FFI_FN(ffi_prep_args), cif->rtype); + break; + default: + FFI_ASSERT(0); + break; + } +} + +static void flush_icache(char *); +static void flush_range(char *, int); + +/* The layout of a function descriptor. A C function pointer really + points to one of these. */ + +typedef struct aix_fd_struct { + void *code_pointer; + void *toc; +} aix_fd; + +/* here I'd like to add the stack frame layout we use in darwin_closure.S + and aix_closure.S + + m32/m64 + + The stack layout looks like this: + + | Additional params... | | Higher address + ~ ~ ~ + | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS + |--------------------------------------------| | + | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | + |--------------------------------------------| | + | Reserved 2*4/8 | | + |--------------------------------------------| | + | Space for callee's LR 4/8 | | + |--------------------------------------------| | + | Saved CR [low word for m64] 4/8 | | + |--------------------------------------------| | + | Current backchain pointer 4/8 |-/ Parent's frame. + |--------------------------------------------| <+ <<< on entry to ffi_closure_ASM + | Result Bytes 16 | | + |--------------------------------------------| | + ~ padding to 16-byte alignment ~ ~ + |--------------------------------------------| | + | NUM_FPR_ARG_REGISTERS slots | | + | here fp13 .. fp1 13*8 | | + |--------------------------------------------| | + | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS + |--------------------------------------------| | + | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | + |--------------------------------------------| | stack | + | Reserved [compiler,binder] 2*4/8 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR [low word for m64] 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 |-/ during + |--------------------------------------------| <<< ffi_closure_ASM. + +*/ + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp; + struct ffi_aix_trampoline_struct *tramp_aix; + aix_fd *fd; + + switch (cif->abi) + { + case FFI_DARWIN: + + FFI_ASSERT (cif->abi == FFI_DARWIN); + + tramp = (unsigned int *) &closure->tramp[0]; +#if defined(POWERPC_DARWIN64) + tramp[0] = 0x7c0802a6; /* mflr r0 */ + tramp[1] = 0x429f0015; /* bcl- 20,4*cr7+so, +0x18 (L1) */ + /* We put the addresses here. */ + tramp[6] = 0x7d6802a6; /*L1: mflr r11 */ + tramp[7] = 0xe98b0000; /* ld r12,0(r11) function address */ + tramp[8] = 0x7c0803a6; /* mtlr r0 */ + tramp[9] = 0x7d8903a6; /* mtctr r12 */ + tramp[10] = 0xe96b0008; /* lwz r11,8(r11) static chain */ + tramp[11] = 0x4e800420; /* bctr */ + + *((unsigned long *)&tramp[2]) = (unsigned long) ffi_closure_ASM; /* function */ + *((unsigned long *)&tramp[4]) = (unsigned long) codeloc; /* context */ +#else + tramp[0] = 0x7c0802a6; /* mflr r0 */ + tramp[1] = 0x429f000d; /* bcl- 20,4*cr7+so,0x10 */ + tramp[4] = 0x7d6802a6; /* mflr r11 */ + tramp[5] = 0x818b0000; /* lwz r12,0(r11) function address */ + tramp[6] = 0x7c0803a6; /* mtlr r0 */ + tramp[7] = 0x7d8903a6; /* mtctr r12 */ + tramp[8] = 0x816b0004; /* lwz r11,4(r11) static chain */ + tramp[9] = 0x4e800420; /* bctr */ + tramp[2] = (unsigned long) ffi_closure_ASM; /* function */ + tramp[3] = (unsigned long) codeloc; /* context */ +#endif + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + /* Flush the icache. Only necessary on Darwin. */ + flush_range(codeloc, FFI_TRAMPOLINE_SIZE); + + break; + + case FFI_AIX: + + tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp); + fd = (aix_fd *)(void *)ffi_closure_ASM; + + FFI_ASSERT (cif->abi == FFI_AIX); + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = codeloc; + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + default: + + FFI_ASSERT(0); + break; + } + return FFI_OK; +} + +static void +flush_icache(char *addr) +{ +#ifndef _AIX + __asm__ volatile ( + "dcbf 0,%0\n" + "\tsync\n" + "\ticbi 0,%0\n" + "\tsync\n" + "\tisync" + : : "r"(addr) : "memory"); +#endif +} + +static void +flush_range(char * addr1, int size) +{ +#define MIN_LINE_SIZE 32 + int i; + for (i = 0; i < size; i += MIN_LINE_SIZE) + flush_icache(addr1+i); + flush_icache(addr1+size-1); +} + +typedef union +{ + float f; + double d; +} ffi_dblfl; + +ffi_type * +ffi_closure_helper_DARWIN (ffi_closure *, void *, + unsigned long *, ffi_dblfl *); + +/* Basically the trampoline invokes ffi_closure_ASM, and on + entry, r11 holds the address of the closure. + After storing the registers that could possibly contain + parameters to be passed into the stack frame and setting + up space for a return value, ffi_closure_ASM invokes the + following helper function to do most of the work. */ + +ffi_type * +ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue, + unsigned long *pgr, ffi_dblfl *pfr) +{ + /* rvalue is the pointer to space for return value in closure assembly + pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM + pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ + + typedef double ldbits[2]; + + union ldu + { + ldbits lb; + long double ld; + }; + + void ** avalue; + ffi_type ** arg_types; + long i, avn; + ffi_cif * cif; + ffi_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS; + unsigned size_al; +#if defined(POWERPC_DARWIN64) + unsigned fpsused = 0; +#endif + + cif = closure->cif; + avalue = alloca (cif->nargs * sizeof(void *)); + + if (cif->rtype->type == FFI_TYPE_STRUCT) + { +#if defined(POWERPC_DARWIN64) + if (!darwin64_struct_ret_by_value_p (cif->rtype)) + { + /* Won't fit into the regs - return by ref. */ + rvalue = (void *) *pgr; + pgr++; + } +#elif defined(DARWIN_PPC) + if (cif->rtype->size > 4) + { + rvalue = (void *) *pgr; + pgr++; + } +#else /* assume we return by ref. */ + rvalue = (void *) *pgr; + pgr++; +#endif + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + /* Grab the addresses of the arguments from the stack frame. */ + while (i < avn) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: +#if defined(POWERPC64) + avalue[i] = (char *) pgr + 7; +#else + avalue[i] = (char *) pgr + 3; +#endif + pgr++; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: +#if defined(POWERPC64) + avalue[i] = (char *) pgr + 6; +#else + avalue[i] = (char *) pgr + 2; +#endif + pgr++; + break; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: +#if defined(POWERPC64) + avalue[i] = (char *) pgr + 4; +#else + case FFI_TYPE_POINTER: + avalue[i] = pgr; +#endif + pgr++; + break; + + case FFI_TYPE_STRUCT: + size_al = arg_types[i]->size; +#if defined(POWERPC_DARWIN64) + pgr = (unsigned long *)ALIGN((char *)pgr, arg_types[i]->alignment); + if (size_al < 3 || size_al == 4) + { + avalue[i] = ((char *)pgr)+8-size_al; + if (arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT + && fpsused < NUM_FPR_ARG_REGISTERS) + { + *(float *)pgr = (float) *(double *)pfr; + pfr++; + fpsused++; + } + } + else + { + if (size_al != 16) + pfr = (ffi_dblfl *) + darwin64_struct_floats_to_mem (arg_types[i], (char *)pgr, + (double *)pfr, &fpsused); + avalue[i] = pgr; + } + pgr += (size_al + 7) / 8; +#else + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN(arg_types[i]->size, 8); +# if defined(POWERPC64) + FFI_ASSERT (cif->abi != FFI_DARWIN) + avalue[i] = pgr; + pgr += (size_al + 7) / 8; +# else + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. */ + if (size_al < 3 && cif->abi == FFI_DARWIN) + avalue[i] = (char*) pgr + 4 - size_al; + else + avalue[i] = pgr; + pgr += (size_al + 3) / 4; +# endif +#endif + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: +#if defined(POWERPC64) + case FFI_TYPE_POINTER: + avalue[i] = pgr; + pgr++; + break; +#else + /* Long long ints are passed in two gpr's. */ + avalue[i] = pgr; + pgr += 2; + break; +#endif + + case FFI_TYPE_FLOAT: + /* A float value consumes a GPR. + There are 13 64bit floating point registers. */ + if (pfr < end_pfr) + { + double temp = pfr->d; + pfr->f = (float) temp; + avalue[i] = pfr; + pfr++; + } + else + { + avalue[i] = pgr; + } + pgr++; + break; + + case FFI_TYPE_DOUBLE: + /* A double value consumes two GPRs. + There are 13 64bit floating point registers. */ + if (pfr < end_pfr) + { + avalue[i] = pfr; + pfr++; + } + else + { + avalue[i] = pgr; + } +#ifdef POWERPC64 + pgr++; +#else + pgr += 2; +#endif + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +#ifdef POWERPC64 + if (pfr + 1 < end_pfr) + { + avalue[i] = pfr; + pfr += 2; + } + else + { + if (pfr < end_pfr) + { + *pgr = *(unsigned long *) pfr; + pfr++; + } + avalue[i] = pgr; + } + pgr += 2; +#else /* POWERPC64 */ + /* A long double value consumes four GPRs and two FPRs. + There are 13 64bit floating point registers. */ + if (pfr + 1 < end_pfr) + { + avalue[i] = pfr; + pfr += 2; + } + /* Here we have the situation where one part of the long double + is stored in fpr13 and the other part is already on the stack. + We use a union to pass the long double to avalue[i]. */ + else if (pfr + 1 == end_pfr) + { + union ldu temp_ld; + memcpy (&temp_ld.lb[0], pfr, sizeof(ldbits)); + memcpy (&temp_ld.lb[1], pgr + 2, sizeof(ldbits)); + avalue[i] = &temp_ld.ld; + pfr++; + } + else + { + avalue[i] = pgr; + } + pgr += 4; +#endif /* POWERPC64 */ + break; +#endif + default: + FFI_ASSERT(0); + } + i++; + } + + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_ASM to perform return type promotions. */ + return cif->rtype; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffitarget.h new file mode 100644 index 0000000..d17f731 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffitarget.h @@ -0,0 +1,139 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc + Target configuration macros for PowerPC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if defined (POWERPC) && defined (__powerpc64__) /* linux64 */ +#ifndef POWERPC64 +#define POWERPC64 +#endif +#elif defined (POWERPC_DARWIN) && defined (__ppc64__) /* Darwin64 */ +#ifndef POWERPC64 +#define POWERPC64 +#endif +#ifndef POWERPC_DARWIN64 +#define POWERPC_DARWIN64 +#endif +#elif defined (POWERPC_AIX) && defined (__64BIT__) /* AIX64 */ +#ifndef POWERPC64 +#define POWERPC64 +#endif +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +#ifdef POWERPC + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, + FFI_LINUX, + FFI_LINUX_SOFT_FLOAT, +# ifdef POWERPC64 + FFI_DEFAULT_ABI = FFI_LINUX64, +# else +# if (!defined(__NO_FPRS__) && (__LDBL_MANT_DIG__ == 106)) + FFI_DEFAULT_ABI = FFI_LINUX, +# else +# ifdef __NO_FPRS__ + FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT, +# else + FFI_DEFAULT_ABI = FFI_GCC_SYSV, +# endif +# endif +# endif +#endif + +#ifdef POWERPC_AIX + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_AIX, +#endif + +#ifdef POWERPC_DARWIN + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_DARWIN, +#endif + +#ifdef POWERPC_FREEBSD + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, + FFI_LINUX, + FFI_LINUX_SOFT_FLOAT, + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + FFI_LAST_ABI +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +/* For additional types like the below, take care about the order in + ppc_closures.S. They must follow after the FFI_TYPE_LAST. */ + +/* Needed for soft-float long-double-128 support. */ +#define FFI_TYPE_UINT128 (FFI_TYPE_LAST + 1) + +/* Needed for FFI_SYSV small structure returns. + We use two flag bits, (FLAG_SYSV_SMST_R3, FLAG_SYSV_SMST_R4) which are + defined in ffi.c, to determine the exact return type and its size. */ +#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 2) + +#if defined(POWERPC64) || defined(POWERPC_AIX) +# if defined(POWERPC_DARWIN64) +# define FFI_TRAMPOLINE_SIZE 48 +# else +# define FFI_TRAMPOLINE_SIZE 24 +# endif +#else /* POWERPC || POWERPC_AIX */ +# define FFI_TRAMPOLINE_SIZE 40 +#endif + +#ifndef LIBFFI_ASM +#if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) +struct ffi_aix_trampoline_struct { + void * code_pointer; /* Pointer to ffi_closure_ASM */ + void * toc; /* TOC */ + void * static_chain; /* Pointer to closure */ +}; +#endif +#endif + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64.S new file mode 100644 index 0000000..57b56cb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64.S @@ -0,0 +1,187 @@ +/* ----------------------------------------------------------------------- + sysv.h - Copyright (c) 2003 Jakub Jelinek + Copyright (c) 2008 Red Hat, Inc. + + PowerPC64 Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + +#ifdef __powerpc64__ + .hidden ffi_call_LINUX64, .ffi_call_LINUX64 + .globl ffi_call_LINUX64, .ffi_call_LINUX64 + .section ".opd","aw" + .align 3 +ffi_call_LINUX64: + .quad .ffi_call_LINUX64,.TOC.@tocbase,0 + .size ffi_call_LINUX64,24 + .type .ffi_call_LINUX64,@function + .text +.ffi_call_LINUX64: +.LFB1: + mflr %r0 + std %r28, -32(%r1) + std %r29, -24(%r1) + std %r30, -16(%r1) + std %r31, -8(%r1) + std %r0, 16(%r1) + + mr %r28, %r1 /* our AP. */ +.LCFI0: + stdux %r1, %r1, %r4 + mr %r31, %r5 /* flags, */ + mr %r30, %r6 /* rvalue, */ + mr %r29, %r7 /* function address. */ + std %r2, 40(%r1) + + /* Call ffi_prep_args64. */ + mr %r4, %r1 + bl .ffi_prep_args64 + + ld %r0, 0(%r29) + ld %r2, 8(%r29) + ld %r11, 16(%r29) + + /* Now do the call. */ + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, %r31 + + /* Get the address to call into CTR. */ + mtctr %r0 + /* Load all those argument registers. */ + ld %r3, -32-(8*8)(%r28) + ld %r4, -32-(7*8)(%r28) + ld %r5, -32-(6*8)(%r28) + ld %r6, -32-(5*8)(%r28) + bf- 5, 1f + ld %r7, -32-(4*8)(%r28) + ld %r8, -32-(3*8)(%r28) + ld %r9, -32-(2*8)(%r28) + ld %r10, -32-(1*8)(%r28) +1: + + /* Load all the FP registers. */ + bf- 6, 2f + lfd %f1, -32-(21*8)(%r28) + lfd %f2, -32-(20*8)(%r28) + lfd %f3, -32-(19*8)(%r28) + lfd %f4, -32-(18*8)(%r28) + lfd %f5, -32-(17*8)(%r28) + lfd %f6, -32-(16*8)(%r28) + lfd %f7, -32-(15*8)(%r28) + lfd %f8, -32-(14*8)(%r28) + lfd %f9, -32-(13*8)(%r28) + lfd %f10, -32-(12*8)(%r28) + lfd %f11, -32-(11*8)(%r28) + lfd %f12, -32-(10*8)(%r28) + lfd %f13, -32-(9*8)(%r28) +2: + + /* Make the call. */ + bctrl + + /* This must follow the call immediately, the unwinder + uses this to find out if r2 has been saved or not. */ + ld %r2, 40(%r1) + + /* Now, deal with the return value. */ + mtcrf 0x01, %r31 + bt- 30, .Ldone_return_value + bt- 29, .Lfp_return_value + std %r3, 0(%r30) + /* Fall through... */ + +.Ldone_return_value: + /* Restore the registers we used and return. */ + mr %r1, %r28 + ld %r0, 16(%r28) + ld %r28, -32(%r1) + mtlr %r0 + ld %r29, -24(%r1) + ld %r30, -16(%r1) + ld %r31, -8(%r1) + blr + +.Lfp_return_value: + bf 28, .Lfloat_return_value + stfd %f1, 0(%r30) + mtcrf 0x02, %r31 /* cr6 */ + bf 27, .Ldone_return_value + stfd %f2, 8(%r30) + b .Ldone_return_value +.Lfloat_return_value: + stfs %f1, 0(%r30) + b .Ldone_return_value +.LFE1: + .long 0 + .byte 0,12,0,1,128,4,0,0 + .size .ffi_call_LINUX64,.-.ffi_call_LINUX64 + + .section .eh_frame,EH_FRAME_FLAGS,@progbits +.Lframe1: + .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry +.LSCIE1: + .4byte 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "zR\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -8 # CIE Data Alignment Factor + .byte 0x41 # CIE RA Column + .uleb128 0x1 # Augmentation size + .byte 0x14 # FDE Encoding (pcrel udata8) + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x1 + .uleb128 0x0 + .align 3 +.LECIE1: +.LSFDE1: + .4byte .LEFDE1-.LASFDE1 # FDE Length +.LASFDE1: + .4byte .LASFDE1-.Lframe1 # FDE CIE offset + .8byte .LFB1-. # FDE initial location + .8byte .LFE1-.LFB1 # FDE address range + .uleb128 0x0 # Augmentation size + .byte 0x2 # DW_CFA_advance_loc1 + .byte .LCFI0-.LFB1 + .byte 0xd # DW_CFA_def_cfa_register + .uleb128 0x1c + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x41 + .sleb128 -2 + .byte 0x9f # DW_CFA_offset, column 0x1f + .uleb128 0x1 + .byte 0x9e # DW_CFA_offset, column 0x1e + .uleb128 0x2 + .byte 0x9d # DW_CFA_offset, column 0x1d + .uleb128 0x3 + .byte 0x9c # DW_CFA_offset, column 0x1c + .uleb128 0x4 + .align 3 +.LEFDE1: +#endif + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64_closure.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64_closure.S new file mode 100644 index 0000000..f7aa2c9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64_closure.S @@ -0,0 +1,236 @@ +/* ----------------------------------------------------------------------- + sysv.h - Copyright (c) 2003 Jakub Jelinek + Copyright (c) 2008 Red Hat, Inc. + + PowerPC64 Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ +#define LIBFFI_ASM +#include +#include + + .file "linux64_closure.S" + +#ifdef __powerpc64__ + FFI_HIDDEN (ffi_closure_LINUX64) + FFI_HIDDEN (.ffi_closure_LINUX64) + .globl ffi_closure_LINUX64, .ffi_closure_LINUX64 + .section ".opd","aw" + .align 3 +ffi_closure_LINUX64: + .quad .ffi_closure_LINUX64,.TOC.@tocbase,0 + .size ffi_closure_LINUX64,24 + .type .ffi_closure_LINUX64,@function + .text +.ffi_closure_LINUX64: +.LFB1: + # save general regs into parm save area + std %r3, 48(%r1) + std %r4, 56(%r1) + std %r5, 64(%r1) + std %r6, 72(%r1) + mflr %r0 + + std %r7, 80(%r1) + std %r8, 88(%r1) + std %r9, 96(%r1) + std %r10, 104(%r1) + std %r0, 16(%r1) + + # mandatory 48 bytes special reg save area + 64 bytes parm save area + # + 16 bytes retval area + 13*8 bytes fpr save area + round to 16 + stdu %r1, -240(%r1) +.LCFI0: + + # next save fpr 1 to fpr 13 + stfd %f1, 128+(0*8)(%r1) + stfd %f2, 128+(1*8)(%r1) + stfd %f3, 128+(2*8)(%r1) + stfd %f4, 128+(3*8)(%r1) + stfd %f5, 128+(4*8)(%r1) + stfd %f6, 128+(5*8)(%r1) + stfd %f7, 128+(6*8)(%r1) + stfd %f8, 128+(7*8)(%r1) + stfd %f9, 128+(8*8)(%r1) + stfd %f10, 128+(9*8)(%r1) + stfd %f11, 128+(10*8)(%r1) + stfd %f12, 128+(11*8)(%r1) + stfd %f13, 128+(12*8)(%r1) + + # set up registers for the routine that actually does the work + # get the context pointer from the trampoline + mr %r3, %r11 + + # now load up the pointer to the result storage + addi %r4, %r1, 112 + + # now load up the pointer to the parameter save area + # in the previous frame + addi %r5, %r1, 240 + 48 + + # now load up the pointer to the saved fpr registers */ + addi %r6, %r1, 128 + + # make the call + bl .ffi_closure_helper_LINUX64 +.Lret: + + # now r3 contains the return type + # so use it to look up in a table + # so we know how to deal with each type + + # look up the proper starting point in table + # by using return type as offset + mflr %r4 # move address of .Lret to r4 + sldi %r3, %r3, 4 # now multiply return type by 16 + addi %r4, %r4, .Lret_type0 - .Lret + ld %r0, 240+16(%r1) + add %r3, %r3, %r4 # add contents of table to table address + mtctr %r3 + bctr # jump to it + +# Each of the ret_typeX code fragments has to be exactly 16 bytes long +# (4 instructions). For cache effectiveness we align to a 16 byte boundary +# first. + .align 4 + +.Lret_type0: +# case FFI_TYPE_VOID + mtlr %r0 + addi %r1, %r1, 240 + blr + nop +# case FFI_TYPE_INT + lwa %r3, 112+4(%r1) + mtlr %r0 + addi %r1, %r1, 240 + blr +# case FFI_TYPE_FLOAT + lfs %f1, 112+0(%r1) + mtlr %r0 + addi %r1, %r1, 240 + blr +# case FFI_TYPE_DOUBLE + lfd %f1, 112+0(%r1) + mtlr %r0 + addi %r1, %r1, 240 + blr +# case FFI_TYPE_LONGDOUBLE + lfd %f1, 112+0(%r1) + mtlr %r0 + lfd %f2, 112+8(%r1) + b .Lfinish +# case FFI_TYPE_UINT8 + lbz %r3, 112+7(%r1) + mtlr %r0 + addi %r1, %r1, 240 + blr +# case FFI_TYPE_SINT8 + lbz %r3, 112+7(%r1) + extsb %r3,%r3 + mtlr %r0 + b .Lfinish +# case FFI_TYPE_UINT16 + lhz %r3, 112+6(%r1) + mtlr %r0 +.Lfinish: + addi %r1, %r1, 240 + blr +# case FFI_TYPE_SINT16 + lha %r3, 112+6(%r1) + mtlr %r0 + addi %r1, %r1, 240 + blr +# case FFI_TYPE_UINT32 + lwz %r3, 112+4(%r1) + mtlr %r0 + addi %r1, %r1, 240 + blr +# case FFI_TYPE_SINT32 + lwa %r3, 112+4(%r1) + mtlr %r0 + addi %r1, %r1, 240 + blr +# case FFI_TYPE_UINT64 + ld %r3, 112+0(%r1) + mtlr %r0 + addi %r1, %r1, 240 + blr +# case FFI_TYPE_SINT64 + ld %r3, 112+0(%r1) + mtlr %r0 + addi %r1, %r1, 240 + blr +# case FFI_TYPE_STRUCT + mtlr %r0 + addi %r1, %r1, 240 + blr + nop +# case FFI_TYPE_POINTER + ld %r3, 112+0(%r1) + mtlr %r0 + addi %r1, %r1, 240 + blr +# esac +.LFE1: + .long 0 + .byte 0,12,0,1,128,0,0,0 + .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64 + + .section .eh_frame,EH_FRAME_FLAGS,@progbits +.Lframe1: + .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry +.LSCIE1: + .4byte 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "zR\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -8 # CIE Data Alignment Factor + .byte 0x41 # CIE RA Column + .uleb128 0x1 # Augmentation size + .byte 0x14 # FDE Encoding (pcrel udata8) + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x1 + .uleb128 0x0 + .align 3 +.LECIE1: +.LSFDE1: + .4byte .LEFDE1-.LASFDE1 # FDE Length +.LASFDE1: + .4byte .LASFDE1-.Lframe1 # FDE CIE offset + .8byte .LFB1-. # FDE initial location + .8byte .LFE1-.LFB1 # FDE address range + .uleb128 0x0 # Augmentation size + .byte 0x2 # DW_CFA_advance_loc1 + .byte .LCFI0-.LFB1 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 240 + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x41 + .sleb128 -2 + .align 3 +.LEFDE1: +#endif + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ppc_closure.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ppc_closure.S new file mode 100644 index 0000000..56f7d1a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ppc_closure.S @@ -0,0 +1,327 @@ +/* ----------------------------------------------------------------------- + sysv.h - Copyright (c) 2003 Jakub Jelinek + Copyright (c) 2008 Red Hat, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ +#define LIBFFI_ASM +#include +#include +#include + + .file "ppc_closure.S" + +#ifndef __powerpc64__ + +ENTRY(ffi_closure_SYSV) +.LFB1: + stwu %r1,-144(%r1) +.LCFI0: + mflr %r0 +.LCFI1: + stw %r0,148(%r1) + +# we want to build up an areas for the parameters passed +# in registers (both floating point and integer) + + # so first save gpr 3 to gpr 10 (aligned to 4) + stw %r3, 16(%r1) + stw %r4, 20(%r1) + stw %r5, 24(%r1) + stw %r6, 28(%r1) + stw %r7, 32(%r1) + stw %r8, 36(%r1) + stw %r9, 40(%r1) + stw %r10,44(%r1) + +#ifndef __NO_FPRS__ + # next save fpr 1 to fpr 8 (aligned to 8) + stfd %f1, 48(%r1) + stfd %f2, 56(%r1) + stfd %f3, 64(%r1) + stfd %f4, 72(%r1) + stfd %f5, 80(%r1) + stfd %f6, 88(%r1) + stfd %f7, 96(%r1) + stfd %f8, 104(%r1) +#endif + + # set up registers for the routine that actually does the work + # get the context pointer from the trampoline + mr %r3,%r11 + + # now load up the pointer to the result storage + addi %r4,%r1,112 + + # now load up the pointer to the saved gpr registers + addi %r5,%r1,16 + + # now load up the pointer to the saved fpr registers */ + addi %r6,%r1,48 + + # now load up the pointer to the outgoing parameter + # stack in the previous frame + # i.e. the previous frame pointer + 8 + addi %r7,%r1,152 + + # make the call + bl ffi_closure_helper_SYSV@local +.Lret: + # now r3 contains the return type + # so use it to look up in a table + # so we know how to deal with each type + + # look up the proper starting point in table + # by using return type as offset + + mflr %r4 # move address of .Lret to r4 + slwi %r3,%r3,4 # now multiply return type by 16 + addi %r4, %r4, .Lret_type0 - .Lret + lwz %r0,148(%r1) + add %r3,%r3,%r4 # add contents of table to table address + mtctr %r3 + bctr # jump to it +.LFE1: + +# Each of the ret_typeX code fragments has to be exactly 16 bytes long +# (4 instructions). For cache effectiveness we align to a 16 byte boundary +# first. + .align 4 +# case FFI_TYPE_VOID +.Lret_type0: + mtlr %r0 + addi %r1,%r1,144 + blr + nop + +# case FFI_TYPE_INT + lwz %r3,112+0(%r1) + mtlr %r0 +.Lfinish: + addi %r1,%r1,144 + blr + +# case FFI_TYPE_FLOAT + lfs %f1,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +# case FFI_TYPE_DOUBLE + lfd %f1,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +# case FFI_TYPE_LONGDOUBLE + lfd %f1,112+0(%r1) + lfd %f2,112+8(%r1) + mtlr %r0 + b .Lfinish + +# case FFI_TYPE_UINT8 + lbz %r3,112+3(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +# case FFI_TYPE_SINT8 + lbz %r3,112+3(%r1) + extsb %r3,%r3 + mtlr %r0 + b .Lfinish + +# case FFI_TYPE_UINT16 + lhz %r3,112+2(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +# case FFI_TYPE_SINT16 + lha %r3,112+2(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +# case FFI_TYPE_UINT32 + lwz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +# case FFI_TYPE_SINT32 + lwz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +# case FFI_TYPE_UINT64 + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) + mtlr %r0 + b .Lfinish + +# case FFI_TYPE_SINT64 + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) + mtlr %r0 + b .Lfinish + +# case FFI_TYPE_STRUCT + mtlr %r0 + addi %r1,%r1,144 + blr + nop + +# case FFI_TYPE_POINTER + lwz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +# case FFI_TYPE_UINT128 + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) + lwz %r5,112+8(%r1) + bl .Luint128 + +# The return types below are only used when the ABI type is FFI_SYSV. +# case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct. + lbz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct. + lhz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct. + lwz %r3,112+0(%r1) + srwi %r3,%r3,8 + mtlr %r0 + b .Lfinish + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct. + lwz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct. + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) + li %r5,24 + b .Lstruct567 + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct. + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) + li %r5,16 + b .Lstruct567 + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct. + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) + li %r5,8 + b .Lstruct567 + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct. + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) + mtlr %r0 + b .Lfinish + +.Lstruct567: + subfic %r6,%r5,32 + srw %r4,%r4,%r5 + slw %r6,%r3,%r6 + srw %r3,%r3,%r5 + or %r4,%r6,%r4 + mtlr %r0 + addi %r1,%r1,144 + blr + +.Luint128: + lwz %r6,112+12(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + +END(ffi_closure_SYSV) + + .section ".eh_frame",EH_FRAME_FLAGS,@progbits +.Lframe1: + .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry +.LSCIE1: + .4byte 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version +#if defined _RELOCATABLE || defined __PIC__ + .ascii "zR\0" # CIE Augmentation +#else + .ascii "\0" # CIE Augmentation +#endif + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor + .byte 0x41 # CIE RA Column +#if defined _RELOCATABLE || defined __PIC__ + .uleb128 0x1 # Augmentation size + .byte 0x1b # FDE Encoding (pcrel sdata4) +#endif + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x1 + .uleb128 0x0 + .align 2 +.LECIE1: +.LSFDE1: + .4byte .LEFDE1-.LASFDE1 # FDE Length +.LASFDE1: + .4byte .LASFDE1-.Lframe1 # FDE CIE offset +#if defined _RELOCATABLE || defined __PIC__ + .4byte .LFB1-. # FDE initial location +#else + .4byte .LFB1 # FDE initial location +#endif + .4byte .LFE1-.LFB1 # FDE address range +#if defined _RELOCATABLE || defined __PIC__ + .uleb128 0x0 # Augmentation size +#endif + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI0-.LFB1 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 144 + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI1-.LCFI0 + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x41 + .sleb128 -1 + .align 2 +.LEFDE1: + +#endif + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/sysv.S new file mode 100644 index 0000000..96ea22b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/sysv.S @@ -0,0 +1,219 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 1998 Geoffrey Keating + Copyright (C) 2007 Free Software Foundation, Inc + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include +#include + +#ifndef __powerpc64__ + .globl ffi_prep_args_SYSV +ENTRY(ffi_call_SYSV) +.LFB1: + /* Save the old stack pointer as AP. */ + mr %r8,%r1 + +.LCFI0: + /* Allocate the stack space we need. */ + stwux %r1,%r1,%r4 + /* Save registers we use. */ + mflr %r9 + stw %r28,-16(%r8) +.LCFI1: + stw %r29,-12(%r8) +.LCFI2: + stw %r30, -8(%r8) +.LCFI3: + stw %r31, -4(%r8) +.LCFI4: + stw %r9, 4(%r8) +.LCFI5: + + /* Save arguments over call... */ + mr %r31,%r5 /* flags, */ + mr %r30,%r6 /* rvalue, */ + mr %r29,%r7 /* function address, */ + mr %r28,%r8 /* our AP. */ +.LCFI6: + + /* Call ffi_prep_args_SYSV. */ + mr %r4,%r1 + bl ffi_prep_args_SYSV@local + + /* Now do the call. */ + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,%r31 + /* Get the address to call into CTR. */ + mtctr %r29 + /* Load all those argument registers. */ + lwz %r3,-16-(8*4)(%r28) + lwz %r4,-16-(7*4)(%r28) + lwz %r5,-16-(6*4)(%r28) + lwz %r6,-16-(5*4)(%r28) + bf- 5,1f + nop + lwz %r7,-16-(4*4)(%r28) + lwz %r8,-16-(3*4)(%r28) + lwz %r9,-16-(2*4)(%r28) + lwz %r10,-16-(1*4)(%r28) + nop +1: + + /* Load all the FP registers. */ + bf- 6,2f + lfd %f1,-16-(8*4)-(8*8)(%r28) + lfd %f2,-16-(8*4)-(7*8)(%r28) + lfd %f3,-16-(8*4)-(6*8)(%r28) + lfd %f4,-16-(8*4)-(5*8)(%r28) + nop + lfd %f5,-16-(8*4)-(4*8)(%r28) + lfd %f6,-16-(8*4)-(3*8)(%r28) + lfd %f7,-16-(8*4)-(2*8)(%r28) + lfd %f8,-16-(8*4)-(1*8)(%r28) +2: + + /* Make the call. */ + bctrl + + /* Now, deal with the return value. */ + mtcrf 0x01,%r31 /* cr7 */ + bt- 31,L(small_struct_return_value) + bt- 30,L(done_return_value) + bt- 29,L(fp_return_value) + stw %r3,0(%r30) + bf+ 28,L(done_return_value) + stw %r4,4(%r30) + mtcrf 0x02,%r31 /* cr6 */ + bf 27,L(done_return_value) + stw %r5,8(%r30) + stw %r6,12(%r30) + /* Fall through... */ + +L(done_return_value): + /* Restore the registers we used and return. */ + lwz %r9, 4(%r28) + lwz %r31, -4(%r28) + mtlr %r9 + lwz %r30, -8(%r28) + lwz %r29,-12(%r28) + lwz %r28,-16(%r28) + lwz %r1,0(%r1) + blr + +L(fp_return_value): + bf 28,L(float_return_value) + stfd %f1,0(%r30) + mtcrf 0x02,%r31 /* cr6 */ + bf 27,L(done_return_value) + stfd %f2,8(%r30) + b L(done_return_value) +L(float_return_value): + stfs %f1,0(%r30) + b L(done_return_value) + +L(small_struct_return_value): + extrwi %r6,%r31,2,19 /* number of bytes padding = shift/8 */ + mtcrf 0x02,%r31 /* copy flags to cr[24:27] (cr6) */ + extrwi %r5,%r31,5,19 /* r5 <- number of bits of padding */ + subfic %r6,%r6,4 /* r6 <- number of useful bytes in r3 */ + bf- 25,L(done_return_value) /* struct in r3 ? if not, done. */ +/* smst_one_register: */ + slw %r3,%r3,%r5 /* Left-justify value in r3 */ + mtxer %r6 /* move byte count to XER ... */ + stswx %r3,0,%r30 /* ... and store that many bytes */ + bf+ 26,L(done_return_value) /* struct in r3:r4 ? */ + add %r6,%r6,%r30 /* adjust pointer */ + stswi %r4,%r6,4 /* store last four bytes */ + b L(done_return_value) + +.LFE1: +END(ffi_call_SYSV) + + .section ".eh_frame",EH_FRAME_FLAGS,@progbits +.Lframe1: + .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ +.LSCIE1: + .4byte 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ +#if defined _RELOCATABLE || defined __PIC__ + .ascii "zR\0" /* CIE Augmentation */ +#else + .ascii "\0" /* CIE Augmentation */ +#endif + .uleb128 0x1 /* CIE Code Alignment Factor */ + .sleb128 -4 /* CIE Data Alignment Factor */ + .byte 0x41 /* CIE RA Column */ +#if defined _RELOCATABLE || defined __PIC__ + .uleb128 0x1 /* Augmentation size */ + .byte 0x1b /* FDE Encoding (pcrel sdata4) */ +#endif + .byte 0xc /* DW_CFA_def_cfa */ + .uleb128 0x1 + .uleb128 0x0 + .align 2 +.LECIE1: +.LSFDE1: + .4byte .LEFDE1-.LASFDE1 /* FDE Length */ +.LASFDE1: + .4byte .LASFDE1-.Lframe1 /* FDE CIE offset */ +#if defined _RELOCATABLE || defined __PIC__ + .4byte .LFB1-. /* FDE initial location */ +#else + .4byte .LFB1 /* FDE initial location */ +#endif + .4byte .LFE1-.LFB1 /* FDE address range */ +#if defined _RELOCATABLE || defined __PIC__ + .uleb128 0x0 /* Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI0-.LFB1 + .byte 0xd /* DW_CFA_def_cfa_register */ + .uleb128 0x08 + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI5-.LCFI0 + .byte 0x11 /* DW_CFA_offset_extended_sf */ + .uleb128 0x41 + .sleb128 -1 + .byte 0x9f /* DW_CFA_offset, column 0x1f */ + .uleb128 0x1 + .byte 0x9e /* DW_CFA_offset, column 0x1e */ + .uleb128 0x2 + .byte 0x9d /* DW_CFA_offset, column 0x1d */ + .uleb128 0x3 + .byte 0x9c /* DW_CFA_offset, column 0x1c */ + .uleb128 0x4 + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI6-.LCFI5 + .byte 0xd /* DW_CFA_def_cfa_register */ + .uleb128 0x1c + .align 2 +.LEFDE1: +#endif + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/prep_cif.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/prep_cif.c new file mode 100644 index 0000000..8548cfd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/prep_cif.c @@ -0,0 +1,177 @@ +/* ----------------------------------------------------------------------- + prep_cif.c - Copyright (c) 2011 Anthony Green + Copyright (c) 1996, 1998, 2007 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include +#include + +/* Round up to FFI_SIZEOF_ARG. */ + +#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) + +/* Perform machine independent initialization of aggregate type + specifications. */ + +static ffi_status initialize_aggregate(ffi_type *arg) +{ + ffi_type **ptr; + + if (UNLIKELY(arg == NULL || arg->elements == NULL)) + return FFI_BAD_TYPEDEF; + + arg->size = 0; + arg->alignment = 0; + + ptr = &(arg->elements[0]); + + if (UNLIKELY(ptr == 0)) + return FFI_BAD_TYPEDEF; + + while ((*ptr) != NULL) + { + if (UNLIKELY(((*ptr)->size == 0) + && (initialize_aggregate((*ptr)) != FFI_OK))) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type */ + FFI_ASSERT_VALID_TYPE(*ptr); + + arg->size = ALIGN(arg->size, (*ptr)->alignment); + arg->size += (*ptr)->size; + + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; + + ptr++; + } + + /* Structure size includes tail padding. This is important for + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = ALIGN (arg->size, arg->alignment); + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + else + return FFI_OK; +} + +#ifndef __CRIS__ +/* The CRIS ABI specifies structure elements to have byte + alignment only, so it completely overrides this functions, + which assumes "natural" alignment and padding. */ + +/* Perform machine independent ffi_cif preparation, then call + machine dependent routine. */ + +ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, + ffi_type *rtype, ffi_type **atypes) +{ + unsigned bytes = 0; + unsigned int i; + ffi_type **ptr; + + FFI_ASSERT(cif != NULL); + if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) + return FFI_BAD_ABI; + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = nargs; + cif->rtype = rtype; + + cif->flags = 0; + + /* Initialize the return type if necessary */ + if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the return type */ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86, x86-64 and s390 stack space allocation is handled in prep_machdep. */ +#if !defined M68K && !defined X86_ANY && !defined S390 && !defined PA + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT +#ifdef SPARC + && (cif->abi != FFI_V9 || cif->rtype->size > 32) +#endif + ) + bytes = STACK_ARG_SIZE(sizeof(void*)); +#endif + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + + /* Initialize any uninitialized aggregate type definitions */ + if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type, do this + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#if !defined X86_ANY && !defined S390 && !defined PA +#ifdef SPARC + if (((*ptr)->type == FFI_TYPE_STRUCT + && ((*ptr)->size > 16 || cif->abi != FFI_V9)) + || ((*ptr)->type == FFI_TYPE_LONGDOUBLE + && cif->abi != FFI_V9)) + bytes += sizeof(void*); + else +#endif + { + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) + bytes = ALIGN(bytes, (*ptr)->alignment); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#endif + } + + cif->bytes = bytes; + + /* Perform machine dependent cif processing */ + return ffi_prep_cif_machdep(cif); +} +#endif /* not __CRIS__ */ + +#if FFI_CLOSURES + +ffi_status +ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +{ + return ffi_prep_closure_loc (closure, cif, fun, user_data, closure); +} + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c new file mode 100644 index 0000000..ce21372 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c @@ -0,0 +1,254 @@ +/* ----------------------------------------------------------------------- + raw_api.c - Copyright (c) 1999, 2008 Red Hat, Inc. + + Author: Kresten Krab Thorup + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* This file defines generic functions for use with the raw api. */ + +#include +#include + +#if !FFI_NO_RAW_API + +size_t +ffi_raw_size (ffi_cif *cif) +{ + size_t result = 0; + int i; + + ffi_type **at = cif->arg_types; + + for (i = cif->nargs-1; i >= 0; i--, at++) + { +#if !FFI_NO_STRUCTS + if ((*at)->type == FFI_TYPE_STRUCT) + result += ALIGN (sizeof (void*), FFI_SIZEOF_ARG); + else +#endif + result += ALIGN ((*at)->size, FFI_SIZEOF_ARG); + } + + return result; +} + + +void +ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + +#if WORDS_BIGENDIAN + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 1); + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 2); + break; + +#if FFI_SIZEOF_ARG >= 4 + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 4); + break; +#endif + +#if !FFI_NO_STRUCTS + case FFI_TYPE_STRUCT: + *args = (raw++)->ptr; + break; +#endif + + case FFI_TYPE_POINTER: + *args = (void*) &(raw++)->ptr; + break; + + default: + *args = raw; + raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + } + } + +#else /* WORDS_BIGENDIAN */ + +#if !PDP + + /* then assume little endian */ + for (i = 0; i < cif->nargs; i++, tp++, args++) + { +#if !FFI_NO_STRUCTS + if ((*tp)->type == FFI_TYPE_STRUCT) + { + *args = (raw++)->ptr; + } + else +#endif + { + *args = (void*) raw; + raw += ALIGN ((*tp)->size, sizeof (void*)) / sizeof (void*); + } + } + +#else +#error "pdp endian not supported" +#endif /* ! PDP */ + +#endif /* WORDS_BIGENDIAN */ +} + +void +ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: + (raw++)->uint = *(UINT8*) (*args); + break; + + case FFI_TYPE_SINT8: + (raw++)->sint = *(SINT8*) (*args); + break; + + case FFI_TYPE_UINT16: + (raw++)->uint = *(UINT16*) (*args); + break; + + case FFI_TYPE_SINT16: + (raw++)->sint = *(SINT16*) (*args); + break; + +#if FFI_SIZEOF_ARG >= 4 + case FFI_TYPE_UINT32: + (raw++)->uint = *(UINT32*) (*args); + break; + + case FFI_TYPE_SINT32: + (raw++)->sint = *(SINT32*) (*args); + break; +#endif + +#if !FFI_NO_STRUCTS + case FFI_TYPE_STRUCT: + (raw++)->ptr = *args; + break; +#endif + + case FFI_TYPE_POINTER: + (raw++)->ptr = **(void***) args; + break; + + default: + memcpy ((void*) raw->data, (void*)*args, (*tp)->size); + raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + } + } +} + +#if !FFI_NATIVE_RAW_API + + +/* This is a generic definition of ffi_raw_call, to be used if the + * native system does not provide a machine-specific implementation. + * Having this, allows code to be written for the raw API, without + * the need for system-specific code to handle input in that format; + * these following couple of functions will handle the translation forth + * and back automatically. */ + +void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *raw) +{ + void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); + ffi_raw_to_ptrarray (cif, raw, avalue); + ffi_call (cif, fn, rvalue, avalue); +} + +#if FFI_CLOSURES /* base system provides closures */ + +static void +ffi_translate_args (ffi_cif *cif, void *rvalue, + void **avalue, void *user_data) +{ + ffi_raw *raw = (ffi_raw*)alloca (ffi_raw_size (cif)); + ffi_raw_closure *cl = (ffi_raw_closure*)user_data; + + ffi_ptrarray_to_raw (cif, avalue, raw); + (*cl->fun) (cif, rvalue, raw, cl->user_data); +} + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + ffi_status status; + + status = ffi_prep_closure_loc ((ffi_closure*) cl, + cif, + &ffi_translate_args, + codeloc, + codeloc); + if (status == FFI_OK) + { + cl->fun = fun; + cl->user_data = user_data; + } + + return status; +} + +#endif /* FFI_CLOSURES */ +#endif /* !FFI_NATIVE_RAW_API */ + +#if FFI_CLOSURES + +/* Again, here is the generic version of ffi_prep_raw_closure, which + * will install an intermediate "hub" for translation of arguments from + * the pointer-array format, to the raw format */ + +ffi_status +ffi_prep_raw_closure (ffi_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data) +{ + return ffi_prep_raw_closure_loc (cl, cif, fun, user_data, cl); +} + +#endif /* FFI_CLOSURES */ + +#endif /* !FFI_NO_RAW_API */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffi.c new file mode 100644 index 0000000..ca2675b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffi.c @@ -0,0 +1,780 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2000, 2007 Software AG + Copyright (c) 2008 Red Hat, Inc + + S390 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ +/*====================================================================*/ +/* Includes */ +/* -------- */ +/*====================================================================*/ + +#include +#include + +#include +#include + +/*====================== End of Includes =============================*/ + +/*====================================================================*/ +/* Defines */ +/* ------- */ +/*====================================================================*/ + +/* Maximum number of GPRs available for argument passing. */ +#define MAX_GPRARGS 5 + +/* Maximum number of FPRs available for argument passing. */ +#ifdef __s390x__ +#define MAX_FPRARGS 4 +#else +#define MAX_FPRARGS 2 +#endif + +/* Round to multiple of 16. */ +#define ROUND_SIZE(size) (((size) + 15) & ~15) + +/* If these values change, sysv.S must be adapted! */ +#define FFI390_RET_VOID 0 +#define FFI390_RET_STRUCT 1 +#define FFI390_RET_FLOAT 2 +#define FFI390_RET_DOUBLE 3 +#define FFI390_RET_INT32 4 +#define FFI390_RET_INT64 5 + +/*===================== End of Defines ===============================*/ + +/*====================================================================*/ +/* Prototypes */ +/* ---------- */ +/*====================================================================*/ + +static void ffi_prep_args (unsigned char *, extended_cif *); +void +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) +__attribute__ ((visibility ("hidden"))) +#endif +ffi_closure_helper_SYSV (ffi_closure *, unsigned long *, + unsigned long long *, unsigned long *); + +/*====================== End of Prototypes ===========================*/ + +/*====================================================================*/ +/* Externals */ +/* --------- */ +/*====================================================================*/ + +extern void ffi_call_SYSV(unsigned, + extended_cif *, + void (*)(unsigned char *, extended_cif *), + unsigned, + void *, + void (*fn)(void)); + +extern void ffi_closure_SYSV(void); + +/*====================== End of Externals ============================*/ + +/*====================================================================*/ +/* */ +/* Name - ffi_check_struct_type. */ +/* */ +/* Function - Determine if a structure can be passed within a */ +/* general purpose or floating point register. */ +/* */ +/*====================================================================*/ + +static int +ffi_check_struct_type (ffi_type *arg) +{ + size_t size = arg->size; + + /* If the struct has just one element, look at that element + to find out whether to consider the struct as floating point. */ + while (arg->type == FFI_TYPE_STRUCT + && arg->elements[0] && !arg->elements[1]) + arg = arg->elements[0]; + + /* Structs of size 1, 2, 4, and 8 are passed in registers, + just like the corresponding int/float types. */ + switch (size) + { + case 1: + return FFI_TYPE_UINT8; + + case 2: + return FFI_TYPE_UINT16; + + case 4: + if (arg->type == FFI_TYPE_FLOAT) + return FFI_TYPE_FLOAT; + else + return FFI_TYPE_UINT32; + + case 8: + if (arg->type == FFI_TYPE_DOUBLE) + return FFI_TYPE_DOUBLE; + else + return FFI_TYPE_UINT64; + + default: + break; + } + + /* Other structs are passed via a pointer to the data. */ + return FFI_TYPE_POINTER; +} + +/*======================== End of Routine ============================*/ + +/*====================================================================*/ +/* */ +/* Name - ffi_prep_args. */ +/* */ +/* Function - Prepare parameters for call to function. */ +/* */ +/* ffi_prep_args is called by the assembly routine once stack space */ +/* has been allocated for the function's arguments. */ +/* */ +/*====================================================================*/ + +static void +ffi_prep_args (unsigned char *stack, extended_cif *ecif) +{ + /* The stack space will be filled with those areas: + + FPR argument register save area (highest addresses) + GPR argument register save area + temporary struct copies + overflow argument area (lowest addresses) + + We set up the following pointers: + + p_fpr: bottom of the FPR area (growing upwards) + p_gpr: bottom of the GPR area (growing upwards) + p_ov: bottom of the overflow area (growing upwards) + p_struct: top of the struct copy area (growing downwards) + + All areas are kept aligned to twice the word size. */ + + int gpr_off = ecif->cif->bytes; + int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long)); + + unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off); + unsigned long *p_gpr = (unsigned long *)(stack + gpr_off); + unsigned char *p_struct = (unsigned char *)p_gpr; + unsigned long *p_ov = (unsigned long *)stack; + + int n_fpr = 0; + int n_gpr = 0; + int n_ov = 0; + + ffi_type **ptr; + void **p_argv = ecif->avalue; + int i; + + /* If we returning a structure then we set the first parameter register + to the address of where we are returning this structure. */ + + if (ecif->cif->flags == FFI390_RET_STRUCT) + p_gpr[n_gpr++] = (unsigned long) ecif->rvalue; + + /* Now for the arguments. */ + + for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; + i > 0; + i--, ptr++, p_argv++) + { + void *arg = *p_argv; + int type = (*ptr)->type; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + /* 16-byte long double is passed like a struct. */ + if (type == FFI_TYPE_LONGDOUBLE) + type = FFI_TYPE_STRUCT; +#endif + + /* Check how a structure type is passed. */ + if (type == FFI_TYPE_STRUCT) + { + type = ffi_check_struct_type (*ptr); + + /* If we pass the struct via pointer, copy the data. */ + if (type == FFI_TYPE_POINTER) + { + p_struct -= ROUND_SIZE ((*ptr)->size); + memcpy (p_struct, (char *)arg, (*ptr)->size); + arg = &p_struct; + } + } + + /* Now handle all primitive int/pointer/float data types. */ + switch (type) + { + case FFI_TYPE_DOUBLE: + if (n_fpr < MAX_FPRARGS) + p_fpr[n_fpr++] = *(unsigned long long *) arg; + else +#ifdef __s390x__ + p_ov[n_ov++] = *(unsigned long *) arg; +#else + p_ov[n_ov++] = ((unsigned long *) arg)[0], + p_ov[n_ov++] = ((unsigned long *) arg)[1]; +#endif + break; + + case FFI_TYPE_FLOAT: + if (n_fpr < MAX_FPRARGS) + p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32; + else + p_ov[n_ov++] = *(unsigned int *) arg; + break; + + case FFI_TYPE_POINTER: + if (n_gpr < MAX_GPRARGS) + p_gpr[n_gpr++] = (unsigned long)*(unsigned char **) arg; + else + p_ov[n_ov++] = (unsigned long)*(unsigned char **) arg; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#ifdef __s390x__ + if (n_gpr < MAX_GPRARGS) + p_gpr[n_gpr++] = *(unsigned long *) arg; + else + p_ov[n_ov++] = *(unsigned long *) arg; +#else + if (n_gpr == MAX_GPRARGS-1) + n_gpr = MAX_GPRARGS; + if (n_gpr < MAX_GPRARGS) + p_gpr[n_gpr++] = ((unsigned long *) arg)[0], + p_gpr[n_gpr++] = ((unsigned long *) arg)[1]; + else + p_ov[n_ov++] = ((unsigned long *) arg)[0], + p_ov[n_ov++] = ((unsigned long *) arg)[1]; +#endif + break; + + case FFI_TYPE_UINT32: + if (n_gpr < MAX_GPRARGS) + p_gpr[n_gpr++] = *(unsigned int *) arg; + else + p_ov[n_ov++] = *(unsigned int *) arg; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + if (n_gpr < MAX_GPRARGS) + p_gpr[n_gpr++] = *(signed int *) arg; + else + p_ov[n_ov++] = *(signed int *) arg; + break; + + case FFI_TYPE_UINT16: + if (n_gpr < MAX_GPRARGS) + p_gpr[n_gpr++] = *(unsigned short *) arg; + else + p_ov[n_ov++] = *(unsigned short *) arg; + break; + + case FFI_TYPE_SINT16: + if (n_gpr < MAX_GPRARGS) + p_gpr[n_gpr++] = *(signed short *) arg; + else + p_ov[n_ov++] = *(signed short *) arg; + break; + + case FFI_TYPE_UINT8: + if (n_gpr < MAX_GPRARGS) + p_gpr[n_gpr++] = *(unsigned char *) arg; + else + p_ov[n_ov++] = *(unsigned char *) arg; + break; + + case FFI_TYPE_SINT8: + if (n_gpr < MAX_GPRARGS) + p_gpr[n_gpr++] = *(signed char *) arg; + else + p_ov[n_ov++] = *(signed char *) arg; + break; + + default: + FFI_ASSERT (0); + break; + } + } +} + +/*======================== End of Routine ============================*/ + +/*====================================================================*/ +/* */ +/* Name - ffi_prep_cif_machdep. */ +/* */ +/* Function - Perform machine dependent CIF processing. */ +/* */ +/*====================================================================*/ + +ffi_status +ffi_prep_cif_machdep(ffi_cif *cif) +{ + size_t struct_size = 0; + int n_gpr = 0; + int n_fpr = 0; + int n_ov = 0; + + ffi_type **ptr; + int i; + + /* Determine return value handling. */ + + switch (cif->rtype->type) + { + /* Void is easy. */ + case FFI_TYPE_VOID: + cif->flags = FFI390_RET_VOID; + break; + + /* Structures are returned via a hidden pointer. */ + case FFI_TYPE_STRUCT: + cif->flags = FFI390_RET_STRUCT; + n_gpr++; /* We need one GPR to pass the pointer. */ + break; + + /* Floating point values are returned in fpr 0. */ + case FFI_TYPE_FLOAT: + cif->flags = FFI390_RET_FLOAT; + break; + + case FFI_TYPE_DOUBLE: + cif->flags = FFI390_RET_DOUBLE; + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + cif->flags = FFI390_RET_STRUCT; + n_gpr++; + break; +#endif + /* Integer values are returned in gpr 2 (and gpr 3 + for 64-bit values on 31-bit machines). */ + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + cif->flags = FFI390_RET_INT64; + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + /* These are to be extended to word size. */ +#ifdef __s390x__ + cif->flags = FFI390_RET_INT64; +#else + cif->flags = FFI390_RET_INT32; +#endif + break; + + default: + FFI_ASSERT (0); + break; + } + + /* Now for the arguments. */ + + for (ptr = cif->arg_types, i = cif->nargs; + i > 0; + i--, ptr++) + { + int type = (*ptr)->type; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + /* 16-byte long double is passed like a struct. */ + if (type == FFI_TYPE_LONGDOUBLE) + type = FFI_TYPE_STRUCT; +#endif + + /* Check how a structure type is passed. */ + if (type == FFI_TYPE_STRUCT) + { + type = ffi_check_struct_type (*ptr); + + /* If we pass the struct via pointer, we must reserve space + to copy its data for proper call-by-value semantics. */ + if (type == FFI_TYPE_POINTER) + struct_size += ROUND_SIZE ((*ptr)->size); + } + + /* Now handle all primitive int/float data types. */ + switch (type) + { + /* The first MAX_FPRARGS floating point arguments + go in FPRs, the rest overflow to the stack. */ + + case FFI_TYPE_DOUBLE: + if (n_fpr < MAX_FPRARGS) + n_fpr++; + else + n_ov += sizeof (double) / sizeof (long); + break; + + case FFI_TYPE_FLOAT: + if (n_fpr < MAX_FPRARGS) + n_fpr++; + else + n_ov++; + break; + + /* On 31-bit machines, 64-bit integers are passed in GPR pairs, + if one is still available, or else on the stack. If only one + register is free, skip the register (it won't be used for any + subsequent argument either). */ + +#ifndef __s390x__ + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + if (n_gpr == MAX_GPRARGS-1) + n_gpr = MAX_GPRARGS; + if (n_gpr < MAX_GPRARGS) + n_gpr += 2; + else + n_ov += 2; + break; +#endif + + /* Everything else is passed in GPRs (until MAX_GPRARGS + have been used) or overflows to the stack. */ + + default: + if (n_gpr < MAX_GPRARGS) + n_gpr++; + else + n_ov++; + break; + } + } + + /* Total stack space as required for overflow arguments + and temporary structure copies. */ + + cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size; + + return FFI_OK; +} + +/*======================== End of Routine ============================*/ + +/*====================================================================*/ +/* */ +/* Name - ffi_call. */ +/* */ +/* Function - Call the FFI routine. */ +/* */ +/*====================================================================*/ + +void +ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue) +{ + int ret_type = cif->flags; + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + ecif.rvalue = rvalue; + + /* If we don't have a return value, we need to fake one. */ + if (rvalue == NULL) + { + if (ret_type == FFI390_RET_STRUCT) + ecif.rvalue = alloca (cif->rtype->size); + else + ret_type = FFI390_RET_VOID; + } + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args, + ret_type, ecif.rvalue, fn); + break; + + default: + FFI_ASSERT (0); + break; + } +} + +/*======================== End of Routine ============================*/ + +/*====================================================================*/ +/* */ +/* Name - ffi_closure_helper_SYSV. */ +/* */ +/* Function - Call a FFI closure target function. */ +/* */ +/*====================================================================*/ + +void +ffi_closure_helper_SYSV (ffi_closure *closure, + unsigned long *p_gpr, + unsigned long long *p_fpr, + unsigned long *p_ov) +{ + unsigned long long ret_buffer; + + void *rvalue = &ret_buffer; + void **avalue; + void **p_arg; + + int n_gpr = 0; + int n_fpr = 0; + int n_ov = 0; + + ffi_type **ptr; + int i; + + /* Allocate buffer for argument list pointers. */ + + p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *)); + + /* If we returning a structure, pass the structure address + directly to the target function. Otherwise, have the target + function store the return value to the GPR save area. */ + + if (closure->cif->flags == FFI390_RET_STRUCT) + rvalue = (void *) p_gpr[n_gpr++]; + + /* Now for the arguments. */ + + for (ptr = closure->cif->arg_types, i = closure->cif->nargs; + i > 0; + i--, p_arg++, ptr++) + { + int deref_struct_pointer = 0; + int type = (*ptr)->type; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + /* 16-byte long double is passed like a struct. */ + if (type == FFI_TYPE_LONGDOUBLE) + type = FFI_TYPE_STRUCT; +#endif + + /* Check how a structure type is passed. */ + if (type == FFI_TYPE_STRUCT) + { + type = ffi_check_struct_type (*ptr); + + /* If we pass the struct via pointer, remember to + retrieve the pointer later. */ + if (type == FFI_TYPE_POINTER) + deref_struct_pointer = 1; + } + + /* Pointers are passed like UINTs of the same size. */ + if (type == FFI_TYPE_POINTER) +#ifdef __s390x__ + type = FFI_TYPE_UINT64; +#else + type = FFI_TYPE_UINT32; +#endif + + /* Now handle all primitive int/float data types. */ + switch (type) + { + case FFI_TYPE_DOUBLE: + if (n_fpr < MAX_FPRARGS) + *p_arg = &p_fpr[n_fpr++]; + else + *p_arg = &p_ov[n_ov], + n_ov += sizeof (double) / sizeof (long); + break; + + case FFI_TYPE_FLOAT: + if (n_fpr < MAX_FPRARGS) + *p_arg = &p_fpr[n_fpr++]; + else + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#ifdef __s390x__ + if (n_gpr < MAX_GPRARGS) + *p_arg = &p_gpr[n_gpr++]; + else + *p_arg = &p_ov[n_ov++]; +#else + if (n_gpr == MAX_GPRARGS-1) + n_gpr = MAX_GPRARGS; + if (n_gpr < MAX_GPRARGS) + *p_arg = &p_gpr[n_gpr], n_gpr += 2; + else + *p_arg = &p_ov[n_ov], n_ov += 2; +#endif + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + if (n_gpr < MAX_GPRARGS) + *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4; + else + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + if (n_gpr < MAX_GPRARGS) + *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2; + else + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2; + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + if (n_gpr < MAX_GPRARGS) + *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1; + else + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1; + break; + + default: + FFI_ASSERT (0); + break; + } + + /* If this is a struct passed via pointer, we need to + actually retrieve that pointer. */ + if (deref_struct_pointer) + *p_arg = *(void **)*p_arg; + } + + + /* Call the target function. */ + (closure->fun) (closure->cif, rvalue, avalue, closure->user_data); + + /* Convert the return value. */ + switch (closure->cif->rtype->type) + { + /* Void is easy, and so is struct. */ + case FFI_TYPE_VOID: + case FFI_TYPE_STRUCT: +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#endif + break; + + /* Floating point values are returned in fpr 0. */ + case FFI_TYPE_FLOAT: + p_fpr[0] = (long long) *(unsigned int *) rvalue << 32; + break; + + case FFI_TYPE_DOUBLE: + p_fpr[0] = *(unsigned long long *) rvalue; + break; + + /* Integer values are returned in gpr 2 (and gpr 3 + for 64-bit values on 31-bit machines). */ + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#ifdef __s390x__ + p_gpr[0] = *(unsigned long *) rvalue; +#else + p_gpr[0] = ((unsigned long *) rvalue)[0], + p_gpr[1] = ((unsigned long *) rvalue)[1]; +#endif + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT32: + case FFI_TYPE_UINT16: + case FFI_TYPE_UINT8: + p_gpr[0] = *(unsigned long *) rvalue; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_SINT16: + case FFI_TYPE_SINT8: + p_gpr[0] = *(signed long *) rvalue; + break; + + default: + FFI_ASSERT (0); + break; + } +} + +/*======================== End of Routine ============================*/ + +/*====================================================================*/ +/* */ +/* Name - ffi_prep_closure_loc. */ +/* */ +/* Function - Prepare a FFI closure. */ +/* */ +/*====================================================================*/ + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + void *codeloc) +{ + FFI_ASSERT (cif->abi == FFI_SYSV); + +#ifndef __s390x__ + *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ + *(short *)&closure->tramp [2] = 0x9801; /* lm %r0,%r1,6(%r1) */ + *(short *)&closure->tramp [4] = 0x1006; + *(short *)&closure->tramp [6] = 0x07f1; /* br %r1 */ + *(long *)&closure->tramp [8] = (long)codeloc; + *(long *)&closure->tramp[12] = (long)&ffi_closure_SYSV; +#else + *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ + *(short *)&closure->tramp [2] = 0xeb01; /* lmg %r0,%r1,14(%r1) */ + *(short *)&closure->tramp [4] = 0x100e; + *(short *)&closure->tramp [6] = 0x0004; + *(short *)&closure->tramp [8] = 0x07f1; /* br %r1 */ + *(long *)&closure->tramp[16] = (long)codeloc; + *(long *)&closure->tramp[24] = (long)&ffi_closure_SYSV; +#endif + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +/*======================== End of Routine ============================*/ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffitarget.h new file mode 100644 index 0000000..a262691 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffitarget.h @@ -0,0 +1,62 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for S390. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#if defined (__s390x__) +#ifndef S390X +#define S390X +#endif +#endif + +/* ---- System specific configurations ----------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#ifdef S390X +#define FFI_TRAMPOLINE_SIZE 32 +#else +#define FFI_TRAMPOLINE_SIZE 16 +#endif +#define FFI_NATIVE_RAW_API 0 + +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/sysv.S new file mode 100644 index 0000000..4731a31 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/sysv.S @@ -0,0 +1,434 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2000 Software AG + Copyright (c) 2008 Red Hat, Inc. + + S390 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + +#ifndef __s390x__ + +.text + + # r2: cif->bytes + # r3: &ecif + # r4: ffi_prep_args + # r5: ret_type + # r6: ecif.rvalue + # ov: fn + + # This assumes we are using gas. + .globl ffi_call_SYSV + .type ffi_call_SYSV,%function +ffi_call_SYSV: +.LFB1: + stm %r6,%r15,24(%r15) # Save registers +.LCFI0: + basr %r13,0 # Set up base register +.Lbase: + lr %r11,%r15 # Set up frame pointer +.LCFI1: + sr %r15,%r2 + ahi %r15,-96-48 # Allocate stack + lr %r8,%r6 # Save ecif.rvalue + sr %r9,%r9 + ic %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address + l %r7,96(%r11) # Load function address + st %r11,0(%r15) # Set up back chain + ahi %r11,-48 # Register save area +.LCFI2: + + la %r2,96(%r15) # Save area + # r3 already holds &ecif + basr %r14,%r4 # Call ffi_prep_args + + lm %r2,%r6,0(%r11) # Load arguments + ld %f0,32(%r11) + ld %f2,40(%r11) + la %r14,0(%r13,%r9) # Set return address + br %r7 # ... and call function + +.LretNone: # Return void + l %r4,48+56(%r11) + lm %r6,%r15,48+24(%r11) + br %r4 + +.LretFloat: + l %r4,48+56(%r11) + ste %f0,0(%r8) # Return float + lm %r6,%r15,48+24(%r11) + br %r4 + +.LretDouble: + l %r4,48+56(%r11) + std %f0,0(%r8) # Return double + lm %r6,%r15,48+24(%r11) + br %r4 + +.LretInt32: + l %r4,48+56(%r11) + st %r2,0(%r8) # Return int + lm %r6,%r15,48+24(%r11) + br %r4 + +.LretInt64: + l %r4,48+56(%r11) + stm %r2,%r3,0(%r8) # Return long long + lm %r6,%r15,48+24(%r11) + br %r4 + +.Ltable: + .byte .LretNone-.Lbase # FFI390_RET_VOID + .byte .LretNone-.Lbase # FFI390_RET_STRUCT + .byte .LretFloat-.Lbase # FFI390_RET_FLOAT + .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE + .byte .LretInt32-.Lbase # FFI390_RET_INT32 + .byte .LretInt64-.Lbase # FFI390_RET_INT64 + +.LFE1: +.ffi_call_SYSV_end: + .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV + + + .globl ffi_closure_SYSV + .type ffi_closure_SYSV,%function +ffi_closure_SYSV: +.LFB2: + stm %r12,%r15,48(%r15) # Save registers +.LCFI10: + basr %r13,0 # Set up base register +.Lcbase: + stm %r2,%r6,8(%r15) # Save arguments + std %f0,64(%r15) + std %f2,72(%r15) + lr %r1,%r15 # Set up stack frame + ahi %r15,-96 +.LCFI11: + l %r12,.Lchelper-.Lcbase(%r13) # Get helper function + lr %r2,%r0 # Closure + la %r3,8(%r1) # GPRs + la %r4,64(%r1) # FPRs + la %r5,96(%r1) # Overflow + st %r1,0(%r15) # Set up back chain + + bas %r14,0(%r12,%r13) # Call helper + + l %r4,96+56(%r15) + ld %f0,96+64(%r15) # Load return registers + lm %r2,%r3,96+8(%r15) + lm %r12,%r15,96+48(%r15) + br %r4 + + .align 4 +.Lchelper: + .long ffi_closure_helper_SYSV-.Lcbase + +.LFE2: + +.ffi_closure_SYSV_end: + .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV + + + .section .eh_frame,EH_FRAME_FLAGS,@progbits +.Lframe1: + .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry +.LSCIE1: + .4byte 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "zR\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor + .byte 0xe # CIE RA Column + .uleb128 0x1 # Augmentation size + .byte 0x1b # FDE Encoding (pcrel sdata4) + .byte 0xc # DW_CFA_def_cfa + .uleb128 0xf + .uleb128 0x60 + .align 4 +.LECIE1: +.LSFDE1: + .4byte .LEFDE1-.LASFDE1 # FDE Length +.LASFDE1: + .4byte .LASFDE1-.Lframe1 # FDE CIE offset + .4byte .LFB1-. # FDE initial location + .4byte .LFE1-.LFB1 # FDE address range + .uleb128 0x0 # Augmentation size + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI0-.LFB1 + .byte 0x8f # DW_CFA_offset, column 0xf + .uleb128 0x9 + .byte 0x8e # DW_CFA_offset, column 0xe + .uleb128 0xa + .byte 0x8d # DW_CFA_offset, column 0xd + .uleb128 0xb + .byte 0x8c # DW_CFA_offset, column 0xc + .uleb128 0xc + .byte 0x8b # DW_CFA_offset, column 0xb + .uleb128 0xd + .byte 0x8a # DW_CFA_offset, column 0xa + .uleb128 0xe + .byte 0x89 # DW_CFA_offset, column 0x9 + .uleb128 0xf + .byte 0x88 # DW_CFA_offset, column 0x8 + .uleb128 0x10 + .byte 0x87 # DW_CFA_offset, column 0x7 + .uleb128 0x11 + .byte 0x86 # DW_CFA_offset, column 0x6 + .uleb128 0x12 + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI1-.LCFI0 + .byte 0xd # DW_CFA_def_cfa_register + .uleb128 0xb + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI2-.LCFI1 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x90 + .align 4 +.LEFDE1: +.LSFDE2: + .4byte .LEFDE2-.LASFDE2 # FDE Length +.LASFDE2: + .4byte .LASFDE2-.Lframe1 # FDE CIE offset + .4byte .LFB2-. # FDE initial location + .4byte .LFE2-.LFB2 # FDE address range + .uleb128 0x0 # Augmentation size + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI10-.LFB2 + .byte 0x8f # DW_CFA_offset, column 0xf + .uleb128 0x9 + .byte 0x8e # DW_CFA_offset, column 0xe + .uleb128 0xa + .byte 0x8d # DW_CFA_offset, column 0xd + .uleb128 0xb + .byte 0x8c # DW_CFA_offset, column 0xc + .uleb128 0xc + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI11-.LCFI10 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0xc0 + .align 4 +.LEFDE2: + +#else + +.text + + # r2: cif->bytes + # r3: &ecif + # r4: ffi_prep_args + # r5: ret_type + # r6: ecif.rvalue + # ov: fn + + # This assumes we are using gas. + .globl ffi_call_SYSV + .type ffi_call_SYSV,%function +ffi_call_SYSV: +.LFB1: + stmg %r6,%r15,48(%r15) # Save registers +.LCFI0: + larl %r13,.Lbase # Set up base register + lgr %r11,%r15 # Set up frame pointer +.LCFI1: + sgr %r15,%r2 + aghi %r15,-160-80 # Allocate stack + lgr %r8,%r6 # Save ecif.rvalue + llgc %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address + lg %r7,160(%r11) # Load function address + stg %r11,0(%r15) # Set up back chain + aghi %r11,-80 # Register save area +.LCFI2: + + la %r2,160(%r15) # Save area + # r3 already holds &ecif + basr %r14,%r4 # Call ffi_prep_args + + lmg %r2,%r6,0(%r11) # Load arguments + ld %f0,48(%r11) + ld %f2,56(%r11) + ld %f4,64(%r11) + ld %f6,72(%r11) + la %r14,0(%r13,%r9) # Set return address + br %r7 # ... and call function + +.Lbase: +.LretNone: # Return void + lg %r4,80+112(%r11) + lmg %r6,%r15,80+48(%r11) + br %r4 + +.LretFloat: + lg %r4,80+112(%r11) + ste %f0,0(%r8) # Return float + lmg %r6,%r15,80+48(%r11) + br %r4 + +.LretDouble: + lg %r4,80+112(%r11) + std %f0,0(%r8) # Return double + lmg %r6,%r15,80+48(%r11) + br %r4 + +.LretInt32: + lg %r4,80+112(%r11) + st %r2,0(%r8) # Return int + lmg %r6,%r15,80+48(%r11) + br %r4 + +.LretInt64: + lg %r4,80+112(%r11) + stg %r2,0(%r8) # Return long + lmg %r6,%r15,80+48(%r11) + br %r4 + +.Ltable: + .byte .LretNone-.Lbase # FFI390_RET_VOID + .byte .LretNone-.Lbase # FFI390_RET_STRUCT + .byte .LretFloat-.Lbase # FFI390_RET_FLOAT + .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE + .byte .LretInt32-.Lbase # FFI390_RET_INT32 + .byte .LretInt64-.Lbase # FFI390_RET_INT64 + +.LFE1: +.ffi_call_SYSV_end: + .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV + + + .globl ffi_closure_SYSV + .type ffi_closure_SYSV,%function +ffi_closure_SYSV: +.LFB2: + stmg %r14,%r15,112(%r15) # Save registers +.LCFI10: + stmg %r2,%r6,16(%r15) # Save arguments + std %f0,128(%r15) + std %f2,136(%r15) + std %f4,144(%r15) + std %f6,152(%r15) + lgr %r1,%r15 # Set up stack frame + aghi %r15,-160 +.LCFI11: + lgr %r2,%r0 # Closure + la %r3,16(%r1) # GPRs + la %r4,128(%r1) # FPRs + la %r5,160(%r1) # Overflow + stg %r1,0(%r15) # Set up back chain + + brasl %r14,ffi_closure_helper_SYSV # Call helper + + lg %r14,160+112(%r15) + ld %f0,160+128(%r15) # Load return registers + lg %r2,160+16(%r15) + la %r15,160(%r15) + br %r14 +.LFE2: + +.ffi_closure_SYSV_end: + .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV + + + + .section .eh_frame,EH_FRAME_FLAGS,@progbits +.Lframe1: + .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry +.LSCIE1: + .4byte 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "zR\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -8 # CIE Data Alignment Factor + .byte 0xe # CIE RA Column + .uleb128 0x1 # Augmentation size + .byte 0x1b # FDE Encoding (pcrel sdata4) + .byte 0xc # DW_CFA_def_cfa + .uleb128 0xf + .uleb128 0xa0 + .align 8 +.LECIE1: +.LSFDE1: + .4byte .LEFDE1-.LASFDE1 # FDE Length +.LASFDE1: + .4byte .LASFDE1-.Lframe1 # FDE CIE offset + .4byte .LFB1-. # FDE initial location + .4byte .LFE1-.LFB1 # FDE address range + .uleb128 0x0 # Augmentation size + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI0-.LFB1 + .byte 0x8f # DW_CFA_offset, column 0xf + .uleb128 0x5 + .byte 0x8e # DW_CFA_offset, column 0xe + .uleb128 0x6 + .byte 0x8d # DW_CFA_offset, column 0xd + .uleb128 0x7 + .byte 0x8c # DW_CFA_offset, column 0xc + .uleb128 0x8 + .byte 0x8b # DW_CFA_offset, column 0xb + .uleb128 0x9 + .byte 0x8a # DW_CFA_offset, column 0xa + .uleb128 0xa + .byte 0x89 # DW_CFA_offset, column 0x9 + .uleb128 0xb + .byte 0x88 # DW_CFA_offset, column 0x8 + .uleb128 0xc + .byte 0x87 # DW_CFA_offset, column 0x7 + .uleb128 0xd + .byte 0x86 # DW_CFA_offset, column 0x6 + .uleb128 0xe + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI1-.LCFI0 + .byte 0xd # DW_CFA_def_cfa_register + .uleb128 0xb + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI2-.LCFI1 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0xf0 + .align 8 +.LEFDE1: +.LSFDE2: + .4byte .LEFDE2-.LASFDE2 # FDE Length +.LASFDE2: + .4byte .LASFDE2-.Lframe1 # FDE CIE offset + .4byte .LFB2-. # FDE initial location + .4byte .LFE2-.LFB2 # FDE address range + .uleb128 0x0 # Augmentation size + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI10-.LFB2 + .byte 0x8f # DW_CFA_offset, column 0xf + .uleb128 0x5 + .byte 0x8e # DW_CFA_offset, column 0xe + .uleb128 0x6 + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI11-.LCFI10 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x140 + .align 8 +.LEFDE2: + +#endif + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffi.c new file mode 100644 index 0000000..69bd025 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffi.c @@ -0,0 +1,716 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Kaz Kojima + Copyright (c) 2008 Red Hat, Inc. + + SuperH Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +#define NGREGARG 4 +#if defined(__SH4__) +#define NFREGARG 8 +#endif + +#if defined(__HITACHI__) +#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 +#else +#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 +#endif + +/* If the structure has essentialy an unique element, return its type. */ +static int +simple_type (ffi_type *arg) +{ + if (arg->type != FFI_TYPE_STRUCT) + return arg->type; + else if (arg->elements[1]) + return FFI_TYPE_STRUCT; + + return simple_type (arg->elements[0]); +} + +static int +return_type (ffi_type *arg) +{ + unsigned short type; + + if (arg->type != FFI_TYPE_STRUCT) + return arg->type; + + type = simple_type (arg->elements[0]); + if (! arg->elements[1]) + { + switch (type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + return FFI_TYPE_INT; + + default: + return type; + } + } + + /* gcc uses r0/r1 pair for some kind of structures. */ + if (arg->size <= 2 * sizeof (int)) + { + int i = 0; + ffi_type *e; + + while ((e = arg->elements[i++])) + { + type = simple_type (e); + switch (type) + { + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_INT: + case FFI_TYPE_FLOAT: + return FFI_TYPE_UINT64; + + default: + break; + } + } + } + + return FFI_TYPE_STRUCT; +} + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register int tmp; + register unsigned int avn; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + int greg, ireg; +#if defined(__SH4__) + int freg = 0; +#endif + + tmp = 0; + argp = stack; + + if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += 4; + ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0; + } + else + ireg = 0; + + /* Set arguments for registers. */ + greg = ireg; + avn = ecif->cif->nargs; + p_argv = ecif->avalue; + + for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) + { + size_t z; + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + if (greg++ >= NGREGARG) + continue; + + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + argp += z; + } + else if (z == sizeof(int)) + { +#if defined(__SH4__) + if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (freg++ >= NFREGARG) + continue; + } + else +#endif + { + if (greg++ >= NGREGARG) + continue; + } + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + argp += z; + } +#if defined(__SH4__) + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) + { + if (freg + 1 >= NFREGARG) + continue; + freg = (freg + 1) & ~1; + freg += 2; + memcpy (argp, *p_argv, z); + argp += z; + } +#endif + else + { + int n = (z + sizeof (int) - 1) / sizeof (int); +#if defined(__SH4__) + if (greg + n - 1 >= NGREGARG) + continue; +#else + if (greg >= NGREGARG) + continue; +#endif + greg += n; + memcpy (argp, *p_argv, z); + argp += n * sizeof (int); + } + } + + /* Set arguments on stack. */ + greg = ireg; +#if defined(__SH4__) + freg = 0; +#endif + p_argv = ecif->avalue; + + for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) + { + size_t z; + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + if (greg++ < NGREGARG) + continue; + + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + argp += z; + } + else if (z == sizeof(int)) + { +#if defined(__SH4__) + if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (freg++ < NFREGARG) + continue; + } + else +#endif + { + if (greg++ < NGREGARG) + continue; + } + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + argp += z; + } +#if defined(__SH4__) + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) + { + if (freg + 1 < NFREGARG) + { + freg = (freg + 1) & ~1; + freg += 2; + continue; + } + memcpy (argp, *p_argv, z); + argp += z; + } +#endif + else + { + int n = (z + sizeof (int) - 1) / sizeof (int); + if (greg + n - 1 < NGREGARG) + { + greg += n; + continue; + } +#if (! defined(__SH4__)) + else if (greg < NGREGARG) + { + greg = NGREGARG; + continue; + } +#endif + memcpy (argp, *p_argv, z); + argp += n * sizeof (int); + } + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + int i, j; + int size, type; + int n, m; + int greg; +#if defined(__SH4__) + int freg = 0; +#endif + + cif->flags = 0; + + greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) && + STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0; + +#if defined(__SH4__) + for (i = j = 0; i < cif->nargs && j < 12; i++) + { + type = (cif->arg_types)[i]->type; + switch (type) + { + case FFI_TYPE_FLOAT: + if (freg >= NFREGARG) + continue; + freg++; + cif->flags += ((cif->arg_types)[i]->type) << (2 * j); + j++; + break; + + case FFI_TYPE_DOUBLE: + if ((freg + 1) >= NFREGARG) + continue; + freg = (freg + 1) & ~1; + freg += 2; + cif->flags += ((cif->arg_types)[i]->type) << (2 * j); + j++; + break; + + default: + size = (cif->arg_types)[i]->size; + n = (size + sizeof (int) - 1) / sizeof (int); + if (greg + n - 1 >= NGREGARG) + continue; + greg += n; + for (m = 0; m < n; m++) + cif->flags += FFI_TYPE_INT << (2 * j++); + break; + } + } +#else + for (i = j = 0; i < cif->nargs && j < 4; i++) + { + size = (cif->arg_types)[i]->size; + n = (size + sizeof (int) - 1) / sizeof (int); + if (greg >= NGREGARG) + continue; + else if (greg + n - 1 >= NGREGARG) + n = NGREGARG - greg; + greg += n; + for (m = 0; m < n; m++) + cif->flags += FFI_TYPE_INT << (2 * j++); + } +#endif + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_STRUCT: + cif->flags += (unsigned) (return_type (cif->rtype)) << 24; + break; + + case FFI_TYPE_VOID: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags += (unsigned) cif->rtype->type << 24; + break; + + default: + cif->flags += FFI_TYPE_INT << 24; + break; + } + + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)(void)); + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + UINT64 trvalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if (cif->rtype->type == FFI_TYPE_STRUCT + && return_type (cif->rtype) != FFI_TYPE_STRUCT) + ecif.rvalue = &trvalue; + else if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, + fn); + break; + default: + FFI_ASSERT(0); + break; + } + + if (rvalue + && cif->rtype->type == FFI_TYPE_STRUCT + && return_type (cif->rtype) != FFI_TYPE_STRUCT) + memcpy (rvalue, &trvalue, cif->rtype->size); +} + +extern void ffi_closure_SYSV (void); +#if defined(__SH4__) +extern void __ic_invalidate (void *line); +#endif + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp; + unsigned int insn; + + FFI_ASSERT (cif->abi == FFI_GCC_SYSV); + + tramp = (unsigned int *) &closure->tramp[0]; + /* Set T bit if the function returns a struct pointed with R2. */ + insn = (return_type (cif->rtype) == FFI_TYPE_STRUCT + ? 0x0018 /* sett */ + : 0x0008 /* clrt */); + +#ifdef __LITTLE_ENDIAN__ + tramp[0] = 0xd301d102; + tramp[1] = 0x0000412b | (insn << 16); +#else + tramp[0] = 0xd102d301; + tramp[1] = 0x412b0000 | insn; +#endif + *(void **) &tramp[2] = (void *)codeloc; /* ctx */ + *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + +#if defined(__SH4__) + /* Flush the icache. */ + __ic_invalidate(codeloc); +#endif + + return FFI_OK; +} + +/* Basically the trampoline invokes ffi_closure_SYSV, and on + * entry, r3 holds the address of the closure. + * After storing the registers that could possibly contain + * parameters to be passed into the stack frame and setting + * up space for a return value, ffi_closure_SYSV invokes the + * following helper function to do most of the work. + */ + +#ifdef __LITTLE_ENDIAN__ +#define OFS_INT8 0 +#define OFS_INT16 0 +#else +#define OFS_INT8 3 +#define OFS_INT16 2 +#endif + +int +ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, + unsigned long *pgr, unsigned long *pfr, + unsigned long *pst) +{ + void **avalue; + ffi_type **p_arg; + int i, avn; + int ireg, greg = 0; +#if defined(__SH4__) + int freg = 0; +#endif + ffi_cif *cif; + + cif = closure->cif; + avalue = alloca(cif->nargs * sizeof(void *)); + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ + if (cif->rtype->type == FFI_TYPE_STRUCT && STRUCT_VALUE_ADDRESS_WITH_ARG) + { + rvalue = (void *) *pgr++; + ireg = 1; + } + else + ireg = 0; + + cif = closure->cif; + greg = ireg; + avn = cif->nargs; + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + if (greg++ >= NGREGARG) + continue; + + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (((char *)pgr) + OFS_INT8); + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (((char *)pgr) + OFS_INT16); + break; + + case FFI_TYPE_STRUCT: + avalue[i] = pgr; + break; + + default: + FFI_ASSERT(0); + } + pgr++; + } + else if (z == sizeof(int)) + { +#if defined(__SH4__) + if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (freg++ >= NFREGARG) + continue; + avalue[i] = pfr; + pfr++; + } + else +#endif + { + if (greg++ >= NGREGARG) + continue; + avalue[i] = pgr; + pgr++; + } + } +#if defined(__SH4__) + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) + { + if (freg + 1 >= NFREGARG) + continue; + if (freg & 1) + pfr++; + freg = (freg + 1) & ~1; + freg += 2; + avalue[i] = pfr; + pfr += 2; + } +#endif + else + { + int n = (z + sizeof (int) - 1) / sizeof (int); +#if defined(__SH4__) + if (greg + n - 1 >= NGREGARG) + continue; +#else + if (greg >= NGREGARG) + continue; +#endif + greg += n; + avalue[i] = pgr; + pgr += n; + } + } + + greg = ireg; +#if defined(__SH4__) + freg = 0; +#endif + + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + if (greg++ < NGREGARG) + continue; + + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (((char *)pst) + OFS_INT8); + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (((char *)pst) + OFS_INT16); + break; + + case FFI_TYPE_STRUCT: + avalue[i] = pst; + break; + + default: + FFI_ASSERT(0); + } + pst++; + } + else if (z == sizeof(int)) + { +#if defined(__SH4__) + if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (freg++ < NFREGARG) + continue; + } + else +#endif + { + if (greg++ < NGREGARG) + continue; + } + avalue[i] = pst; + pst++; + } +#if defined(__SH4__) + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) + { + if (freg + 1 < NFREGARG) + { + freg = (freg + 1) & ~1; + freg += 2; + continue; + } + avalue[i] = pst; + pst += 2; + } +#endif + else + { + int n = (z + sizeof (int) - 1) / sizeof (int); + if (greg + n - 1 < NGREGARG) + { + greg += n; + continue; + } +#if (! defined(__SH4__)) + else if (greg < NGREGARG) + { + greg += n; + pst += greg - NGREGARG; + continue; + } +#endif + avalue[i] = pst; + pst += n; + } + } + + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_SYSV how to perform return type promotions. */ + return return_type (cif->rtype); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffitarget.h new file mode 100644 index 0000000..4f1f639 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffitarget.h @@ -0,0 +1,49 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for SuperH. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 16 +#define FFI_NATIVE_RAW_API 0 + +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/sysv.S new file mode 100644 index 0000000..5be7516 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/sysv.S @@ -0,0 +1,850 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima + + SuperH Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include +#ifdef HAVE_MACHINE_ASM_H +#include +#else +/* XXX these lose for some platforms, I'm sure. */ +#define CNAME(x) x +#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): +#endif + +#if defined(__HITACHI__) +#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 +#else +#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 +#endif + +.text + + # r4: ffi_prep_args + # r5: &ecif + # r6: bytes + # r7: flags + # sp+0: rvalue + # sp+4: fn + + # This assumes we are using gas. +ENTRY(ffi_call_SYSV) + # Save registers +.LFB1: + mov.l r8,@-r15 +.LCFI0: + mov.l r9,@-r15 +.LCFI1: + mov.l r10,@-r15 +.LCFI2: + mov.l r12,@-r15 +.LCFI3: + mov.l r14,@-r15 +.LCFI4: + sts.l pr,@-r15 +.LCFI5: + mov r15,r14 +.LCFI6: +#if defined(__SH4__) + mov r6,r8 + mov r7,r9 + + sub r6,r15 + add #-16,r15 + mov #~7,r0 + and r0,r15 + + mov r4,r0 + jsr @r0 + mov r15,r4 + + mov r9,r1 + shlr8 r9 + shlr8 r9 + shlr8 r9 + + mov #FFI_TYPE_STRUCT,r2 + cmp/eq r2,r9 + bf 1f +#if STRUCT_VALUE_ADDRESS_WITH_ARG + mov.l @r15+,r4 + bra 2f + mov #5,r2 +#else + mov.l @r15+,r10 +#endif +1: + mov #4,r2 +2: + mov #4,r3 + +L_pass: + cmp/pl r8 + bf L_call_it + + mov r1,r0 + and #3,r0 + +L_pass_d: + cmp/eq #FFI_TYPE_DOUBLE,r0 + bf L_pass_f + + mov r3,r0 + and #1,r0 + tst r0,r0 + bt 1f + add #1,r3 +1: + mov #12,r0 + cmp/hs r0,r3 + bt/s 3f + shlr2 r1 + bsr L_pop_d + nop +3: + add #2,r3 + bra L_pass + add #-8,r8 + +L_pop_d: + mov r3,r0 + add r0,r0 + add r3,r0 + add #-12,r0 + braf r0 + nop +#ifdef __LITTLE_ENDIAN__ + fmov.s @r15+,fr5 + rts + fmov.s @r15+,fr4 + fmov.s @r15+,fr7 + rts + fmov.s @r15+,fr6 + fmov.s @r15+,fr9 + rts + fmov.s @r15+,fr8 + fmov.s @r15+,fr11 + rts + fmov.s @r15+,fr10 +#else + fmov.s @r15+,fr4 + rts + fmov.s @r15+,fr5 + fmov.s @r15+,fr6 + rts + fmov.s @r15+,fr7 + fmov.s @r15+,fr8 + rts + fmov.s @r15+,fr9 + fmov.s @r15+,fr10 + rts + fmov.s @r15+,fr11 +#endif + +L_pass_f: + cmp/eq #FFI_TYPE_FLOAT,r0 + bf L_pass_i + + mov #12,r0 + cmp/hs r0,r3 + bt/s 2f + shlr2 r1 + bsr L_pop_f + nop +2: + add #1,r3 + bra L_pass + add #-4,r8 + +L_pop_f: + mov r3,r0 + shll2 r0 + add #-16,r0 + braf r0 + nop +#ifdef __LITTLE_ENDIAN__ + rts + fmov.s @r15+,fr5 + rts + fmov.s @r15+,fr4 + rts + fmov.s @r15+,fr7 + rts + fmov.s @r15+,fr6 + rts + fmov.s @r15+,fr9 + rts + fmov.s @r15+,fr8 + rts + fmov.s @r15+,fr11 + rts + fmov.s @r15+,fr10 +#else + rts + fmov.s @r15+,fr4 + rts + fmov.s @r15+,fr5 + rts + fmov.s @r15+,fr6 + rts + fmov.s @r15+,fr7 + rts + fmov.s @r15+,fr8 + rts + fmov.s @r15+,fr9 + rts + fmov.s @r15+,fr10 + rts + fmov.s @r15+,fr11 +#endif + +L_pass_i: + cmp/eq #FFI_TYPE_INT,r0 + bf L_call_it + + mov #8,r0 + cmp/hs r0,r2 + bt/s 2f + shlr2 r1 + bsr L_pop_i + nop +2: + add #1,r2 + bra L_pass + add #-4,r8 + +L_pop_i: + mov r2,r0 + shll2 r0 + add #-16,r0 + braf r0 + nop + rts + mov.l @r15+,r4 + rts + mov.l @r15+,r5 + rts + mov.l @r15+,r6 + rts + mov.l @r15+,r7 + +L_call_it: + # call function +#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) + mov r10, r2 +#endif + mov.l @(28,r14),r1 + jsr @r1 + nop + +L_ret_d: + mov #FFI_TYPE_DOUBLE,r2 + cmp/eq r2,r9 + bf L_ret_ll + + mov.l @(24,r14),r1 +#ifdef __LITTLE_ENDIAN__ + fmov.s fr1,@r1 + add #4,r1 + bra L_epilogue + fmov.s fr0,@r1 +#else + fmov.s fr0,@r1 + add #4,r1 + bra L_epilogue + fmov.s fr1,@r1 +#endif + +L_ret_ll: + mov #FFI_TYPE_SINT64,r2 + cmp/eq r2,r9 + bt/s 1f + mov #FFI_TYPE_UINT64,r2 + cmp/eq r2,r9 + bf L_ret_f + +1: + mov.l @(24,r14),r2 + mov.l r0,@r2 + bra L_epilogue + mov.l r1,@(4,r2) + +L_ret_f: + mov #FFI_TYPE_FLOAT,r2 + cmp/eq r2,r9 + bf L_ret_i + + mov.l @(24,r14),r1 + bra L_epilogue + fmov.s fr0,@r1 + +L_ret_i: + mov #FFI_TYPE_INT,r2 + cmp/eq r2,r9 + bf L_epilogue + + mov.l @(24,r14),r1 + bra L_epilogue + mov.l r0,@r1 + +L_epilogue: + # Remove the space we pushed for the args + mov r14,r15 + + lds.l @r15+,pr + mov.l @r15+,r14 + mov.l @r15+,r12 + mov.l @r15+,r10 + mov.l @r15+,r9 + rts + mov.l @r15+,r8 +#else + mov r6,r8 + mov r7,r9 + + sub r6,r15 + add #-16,r15 + mov #~7,r0 + and r0,r15 + + mov r4,r0 + jsr @r0 + mov r15,r4 + + mov r9,r3 + shlr8 r9 + shlr8 r9 + shlr8 r9 + + mov #FFI_TYPE_STRUCT,r2 + cmp/eq r2,r9 + bf 1f +#if STRUCT_VALUE_ADDRESS_WITH_ARG + mov.l @r15+,r4 + bra 2f + mov #5,r2 +#else + mov.l @r15+,r10 +#endif +1: + mov #4,r2 +2: + +L_pass: + cmp/pl r8 + bf L_call_it + + mov r3,r0 + and #3,r0 + +L_pass_d: + cmp/eq #FFI_TYPE_DOUBLE,r0 + bf L_pass_i + + mov r15,r0 + and #7,r0 + tst r0,r0 + bt 1f + add #4,r15 +1: + mov #8,r0 + cmp/hs r0,r2 + bt/s 2f + shlr2 r3 + bsr L_pop_d + nop +2: + add #2,r2 + bra L_pass + add #-8,r8 + +L_pop_d: + mov r2,r0 + add r0,r0 + add r2,r0 + add #-12,r0 + add r0,r0 + braf r0 + nop + mov.l @r15+,r4 + rts + mov.l @r15+,r5 + mov.l @r15+,r5 + rts + mov.l @r15+,r6 + mov.l @r15+,r6 + rts + mov.l @r15+,r7 + rts + mov.l @r15+,r7 + +L_pass_i: + cmp/eq #FFI_TYPE_INT,r0 + bf L_call_it + + mov #8,r0 + cmp/hs r0,r2 + bt/s 2f + shlr2 r3 + bsr L_pop_i + nop +2: + add #1,r2 + bra L_pass + add #-4,r8 + +L_pop_i: + mov r2,r0 + shll2 r0 + add #-16,r0 + braf r0 + nop + rts + mov.l @r15+,r4 + rts + mov.l @r15+,r5 + rts + mov.l @r15+,r6 + rts + mov.l @r15+,r7 + +L_call_it: + # call function +#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) + mov r10, r2 +#endif + mov.l @(28,r14),r1 + jsr @r1 + nop + +L_ret_d: + mov #FFI_TYPE_DOUBLE,r2 + cmp/eq r2,r9 + bf L_ret_ll + + mov.l @(24,r14),r2 + mov.l r0,@r2 + bra L_epilogue + mov.l r1,@(4,r2) + +L_ret_ll: + mov #FFI_TYPE_SINT64,r2 + cmp/eq r2,r9 + bt/s 1f + mov #FFI_TYPE_UINT64,r2 + cmp/eq r2,r9 + bf L_ret_i + +1: + mov.l @(24,r14),r2 + mov.l r0,@r2 + bra L_epilogue + mov.l r1,@(4,r2) + +L_ret_i: + mov #FFI_TYPE_FLOAT,r2 + cmp/eq r2,r9 + bt 1f + mov #FFI_TYPE_INT,r2 + cmp/eq r2,r9 + bf L_epilogue +1: + mov.l @(24,r14),r1 + bra L_epilogue + mov.l r0,@r1 + +L_epilogue: + # Remove the space we pushed for the args + mov r14,r15 + + lds.l @r15+,pr + mov.l @r15+,r14 + mov.l @r15+,r12 + mov.l @r15+,r10 + mov.l @r15+,r9 + rts + mov.l @r15+,r8 +#endif +.LFE1: +.ffi_call_SYSV_end: + .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) + +.globl ffi_closure_helper_SYSV + +ENTRY(ffi_closure_SYSV) +.LFB2: + mov.l r7,@-r15 +.LCFI7: + mov.l r6,@-r15 +.LCFI8: + mov.l r5,@-r15 +.LCFI9: + mov.l r4,@-r15 +.LCFIA: + mov.l r14,@-r15 +.LCFIB: + sts.l pr,@-r15 + + /* Stack layout: + xx bytes (on stack parameters) + 16 bytes (register parameters) + 4 bytes (saved frame pointer) + 4 bytes (saved return address) + 32 bytes (floating register parameters, SH-4 only) + 8 bytes (result) + 4 bytes (pad) + 4 bytes (5th arg) + <- new stack pointer + */ +.LCFIC: +#if defined(__SH4__) + add #-48,r15 +#else + add #-16,r15 +#endif +.LCFID: + mov r15,r14 +.LCFIE: + +#if defined(__SH4__) + mov r14,r1 + add #48,r1 +#ifdef __LITTLE_ENDIAN__ + fmov.s fr10,@-r1 + fmov.s fr11,@-r1 + fmov.s fr8,@-r1 + fmov.s fr9,@-r1 + fmov.s fr6,@-r1 + fmov.s fr7,@-r1 + fmov.s fr4,@-r1 + fmov.s fr5,@-r1 +#else + fmov.s fr11,@-r1 + fmov.s fr10,@-r1 + fmov.s fr9,@-r1 + fmov.s fr8,@-r1 + fmov.s fr7,@-r1 + fmov.s fr6,@-r1 + fmov.s fr5,@-r1 + fmov.s fr4,@-r1 +#endif + mov r1,r7 + mov r14,r6 + add #56,r6 +#else + mov r14,r6 + add #24,r6 +#endif + + bt/s 10f + mov r2, r5 + mov r14,r1 + add #8,r1 + mov r1,r5 +10: + + mov r14,r1 +#if defined(__SH4__) + add #72,r1 +#else + add #40,r1 +#endif + mov.l r1,@r14 + +#ifdef PIC + mov.l L_got,r1 + mova L_got,r0 + add r0,r1 + mov.l L_helper,r0 + add r1,r0 +#else + mov.l L_helper,r0 +#endif + jsr @r0 + mov r3,r4 + + shll r0 + mov r0,r1 + mova L_table,r0 + add r1,r0 + mov.w @r0,r0 + mov r14,r2 + braf r0 + add #8,r2 +0: + .align 2 +#ifdef PIC +L_got: + .long _GLOBAL_OFFSET_TABLE_ +L_helper: + .long ffi_closure_helper_SYSV@GOTOFF +#else +L_helper: + .long ffi_closure_helper_SYSV +#endif +L_table: + .short L_case_v - 0b /* FFI_TYPE_VOID */ + .short L_case_i - 0b /* FFI_TYPE_INT */ +#if defined(__SH4__) + .short L_case_f - 0b /* FFI_TYPE_FLOAT */ + .short L_case_d - 0b /* FFI_TYPE_DOUBLE */ + .short L_case_d - 0b /* FFI_TYPE_LONGDOUBLE */ +#else + .short L_case_i - 0b /* FFI_TYPE_FLOAT */ + .short L_case_ll - 0b /* FFI_TYPE_DOUBLE */ + .short L_case_ll - 0b /* FFI_TYPE_LONGDOUBLE */ +#endif + .short L_case_uq - 0b /* FFI_TYPE_UINT8 */ + .short L_case_q - 0b /* FFI_TYPE_SINT8 */ + .short L_case_uh - 0b /* FFI_TYPE_UINT16 */ + .short L_case_h - 0b /* FFI_TYPE_SINT16 */ + .short L_case_i - 0b /* FFI_TYPE_UINT32 */ + .short L_case_i - 0b /* FFI_TYPE_SINT32 */ + .short L_case_ll - 0b /* FFI_TYPE_UINT64 */ + .short L_case_ll - 0b /* FFI_TYPE_SINT64 */ + .short L_case_v - 0b /* FFI_TYPE_STRUCT */ + .short L_case_i - 0b /* FFI_TYPE_POINTER */ + +#if defined(__SH4__) +L_case_d: +#ifdef __LITTLE_ENDIAN__ + fmov.s @r2+,fr1 + bra L_case_v + fmov.s @r2,fr0 +#else + fmov.s @r2+,fr0 + bra L_case_v + fmov.s @r2,fr1 +#endif + +L_case_f: + bra L_case_v + fmov.s @r2,fr0 +#endif + +L_case_ll: + mov.l @r2+,r0 + bra L_case_v + mov.l @r2,r1 + +L_case_i: + bra L_case_v + mov.l @r2,r0 + +L_case_q: +#ifdef __LITTLE_ENDIAN__ +#else + add #3,r2 +#endif + bra L_case_v + mov.b @r2,r0 + +L_case_uq: +#ifdef __LITTLE_ENDIAN__ +#else + add #3,r2 +#endif + mov.b @r2,r0 + bra L_case_v + extu.b r0,r0 + +L_case_h: +#ifdef __LITTLE_ENDIAN__ +#else + add #2,r2 +#endif + bra L_case_v + mov.w @r2,r0 + +L_case_uh: +#ifdef __LITTLE_ENDIAN__ +#else + add #2,r2 +#endif + mov.w @r2,r0 + extu.w r0,r0 + /* fall through */ + +L_case_v: +#if defined(__SH4__) + add #48,r15 +#else + add #16,r15 +#endif + lds.l @r15+,pr + mov.l @r15+,r14 + rts + add #16,r15 +.LFE2: +.ffi_closure_SYSV_end: + .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif + + .section ".eh_frame","aw",@progbits +__FRAME_BEGIN__: + .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ +.LSCIE1: + .4byte 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ +#ifdef PIC + .ascii "zR\0" /* CIE Augmentation */ +#else + .byte 0x0 /* CIE Augmentation */ +#endif + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x7c /* sleb128 -4; CIE Data Alignment Factor */ + .byte 0x11 /* CIE RA Column */ +#ifdef PIC + .uleb128 0x1 /* Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel) */ +#endif + .byte 0xc /* DW_CFA_def_cfa */ + .byte 0xf /* uleb128 0xf */ + .byte 0x0 /* uleb128 0x0 */ + .align 2 +.LECIE1: +.LSFDE1: + .4byte .LEFDE1-.LASFDE1 /* FDE Length */ +.LASFDE1: + .4byte .LASFDE1-__FRAME_BEGIN__ /* FDE CIE offset */ +#ifdef PIC + .4byte .LFB1-. /* FDE initial location */ +#else + .4byte .LFB1 /* FDE initial location */ +#endif + .4byte .LFE1-.LFB1 /* FDE address range */ +#ifdef PIC + .uleb128 0x0 /* Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI0-.LFB1 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x4 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI1-.LCFI0 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI2-.LCFI1 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0xc /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI3-.LCFI2 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x10 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI4-.LCFI3 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x14 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI5-.LCFI4 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x18 /* uleb128 0x4 */ + .byte 0x91 /* DW_CFA_offset, column 0x11 */ + .byte 0x6 /* uleb128 0x6 */ + .byte 0x8e /* DW_CFA_offset, column 0xe */ + .byte 0x5 /* uleb128 0x5 */ + .byte 0x8c /* DW_CFA_offset, column 0xc */ + .byte 0x4 /* uleb128 0x4 */ + .byte 0x8a /* DW_CFA_offset, column 0xa */ + .byte 0x3 /* uleb128 0x3 */ + .byte 0x89 /* DW_CFA_offset, column 0x9 */ + .byte 0x2 /* uleb128 0x2 */ + .byte 0x88 /* DW_CFA_offset, column 0x8 */ + .byte 0x1 /* uleb128 0x1 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI6-.LCFI5 + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0xe /* uleb128 0xe */ + .align 2 +.LEFDE1: + +.LSFDE3: + .4byte .LEFDE3-.LASFDE3 /* FDE Length */ +.LASFDE3: + .4byte .LASFDE3-__FRAME_BEGIN__ /* FDE CIE offset */ +#ifdef PIC + .4byte .LFB2-. /* FDE initial location */ +#else + .4byte .LFB2 /* FDE initial location */ +#endif + .4byte .LFE2-.LFB2 /* FDE address range */ +#ifdef PIC + .uleb128 0x0 /* Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI7-.LFB2 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x4 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI8-.LCFI7 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI9-.LCFI8 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0xc /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFIA-.LCFI9 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x10 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFIB-.LCFIA + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x14 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFIC-.LCFIB + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x18 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFID-.LCFIC + .byte 0xe /* DW_CFA_def_cfa_offset */ +#if defined(__SH4__) + .byte 24+48 /* uleb128 24+48 */ +#else + .byte 24+16 /* uleb128 24+16 */ +#endif + .byte 0x91 /* DW_CFA_offset, column 0x11 */ + .byte 0x6 /* uleb128 0x6 */ + .byte 0x8e /* DW_CFA_offset, column 0xe */ + .byte 0x5 /* uleb128 0x5 */ + .byte 0x84 /* DW_CFA_offset, column 0x4 */ + .byte 0x4 /* uleb128 0x4 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 */ + .byte 0x3 /* uleb128 0x3 */ + .byte 0x86 /* DW_CFA_offset, column 0x6 */ + .byte 0x2 /* uleb128 0x2 */ + .byte 0x87 /* DW_CFA_offset, column 0x7 */ + .byte 0x1 /* uleb128 0x1 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFIE-.LCFID + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0xe /* uleb128 0xe */ + .align 2 +.LEFDE3: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffi.c new file mode 100644 index 0000000..8fbc05c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffi.c @@ -0,0 +1,468 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2003, 2004, 2006, 2007 Kaz Kojima + Copyright (c) 2008 Anthony Green + + SuperH SHmedia Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +#define NGREGARG 8 +#define NFREGARG 12 + +static int +return_type (ffi_type *arg) +{ + + if (arg->type != FFI_TYPE_STRUCT) + return arg->type; + + /* gcc uses r2 if the result can be packed in on register. */ + if (arg->size <= sizeof (UINT8)) + return FFI_TYPE_UINT8; + else if (arg->size <= sizeof (UINT16)) + return FFI_TYPE_UINT16; + else if (arg->size <= sizeof (UINT32)) + return FFI_TYPE_UINT32; + else if (arg->size <= sizeof (UINT64)) + return FFI_TYPE_UINT64; + + return FFI_TYPE_STRUCT; +} + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register unsigned int avn; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += sizeof (UINT64); + } + + avn = ecif->cif->nargs; + p_argv = ecif->avalue; + + for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) + { + size_t z; + int align; + + z = (*p_arg)->size; + align = (*p_arg)->alignment; + if (z < sizeof (UINT32)) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(SINT64 *) argp = (SINT64) *(SINT8 *)(*p_argv); + break; + + case FFI_TYPE_UINT8: + *(UINT64 *) argp = (UINT64) *(UINT8 *)(*p_argv); + break; + + case FFI_TYPE_SINT16: + *(SINT64 *) argp = (SINT64) *(SINT16 *)(*p_argv); + break; + + case FFI_TYPE_UINT16: + *(UINT64 *) argp = (UINT64) *(UINT16 *)(*p_argv); + break; + + case FFI_TYPE_STRUCT: + memcpy (argp, *p_argv, z); + break; + + default: + FFI_ASSERT(0); + } + argp += sizeof (UINT64); + } + else if (z == sizeof (UINT32) && align == sizeof (UINT32)) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + *(SINT64 *) argp = (SINT64) *(SINT32 *) (*p_argv); + break; + + case FFI_TYPE_FLOAT: + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT32: + case FFI_TYPE_STRUCT: + *(UINT64 *) argp = (UINT64) *(UINT32 *) (*p_argv); + break; + + default: + FFI_ASSERT(0); + break; + } + argp += sizeof (UINT64); + } + else if (z == sizeof (UINT64) + && align == sizeof (UINT64) + && ((int) *p_argv & (sizeof (UINT64) - 1)) == 0) + { + *(UINT64 *) argp = *(UINT64 *) (*p_argv); + argp += sizeof (UINT64); + } + else + { + int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64); + + memcpy (argp, *p_argv, z); + argp += n * sizeof (UINT64); + } + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + int i, j; + int size, type; + int n, m; + int greg; + int freg; + int fpair = -1; + + greg = (return_type (cif->rtype) == FFI_TYPE_STRUCT ? 1 : 0); + freg = 0; + cif->flags2 = 0; + + for (i = j = 0; i < cif->nargs; i++) + { + type = (cif->arg_types)[i]->type; + switch (type) + { + case FFI_TYPE_FLOAT: + greg++; + cif->bytes += sizeof (UINT64) - sizeof (float); + if (freg >= NFREGARG - 1) + continue; + if (fpair < 0) + { + fpair = freg; + freg += 2; + } + else + fpair = -1; + cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++); + break; + + case FFI_TYPE_DOUBLE: + if (greg++ >= NGREGARG && (freg + 1) >= NFREGARG) + continue; + if ((freg + 1) < NFREGARG) + { + freg += 2; + cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++); + } + else + cif->flags2 += FFI_TYPE_INT << (2 * j++); + break; + + default: + size = (cif->arg_types)[i]->size; + if (size < sizeof (UINT64)) + cif->bytes += sizeof (UINT64) - size; + n = (size + sizeof (UINT64) - 1) / sizeof (UINT64); + if (greg >= NGREGARG) + continue; + else if (greg + n - 1 >= NGREGARG) + greg = NGREGARG; + else + greg += n; + for (m = 0; m < n; m++) + cif->flags2 += FFI_TYPE_INT << (2 * j++); + break; + } + } + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_STRUCT: + cif->flags = return_type (cif->rtype); + break; + + case FFI_TYPE_VOID: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = cif->rtype->type; + break; + + default: + cif->flags = FFI_TYPE_INT; + break; + } + + return FFI_OK; +} + +/*@-declundef@*/ +/*@-exportheader@*/ +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), + /*@out@*/ extended_cif *, + unsigned, unsigned, long long, + /*@out@*/ unsigned *, + void (*fn)(void)); +/*@=declundef@*/ +/*@=exportheader@*/ + +void ffi_call(/*@dependent@*/ ffi_cif *cif, + void (*fn)(void), + /*@out@*/ void *rvalue, + /*@dependent@*/ void **avalue) +{ + extended_cif ecif; + UINT64 trvalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if (cif->rtype->type == FFI_TYPE_STRUCT + && return_type (cif->rtype) != FFI_TYPE_STRUCT) + ecif.rvalue = &trvalue; + else if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, cif->flags2, + ecif.rvalue, fn); + break; + default: + FFI_ASSERT(0); + break; + } + + if (rvalue + && cif->rtype->type == FFI_TYPE_STRUCT + && return_type (cif->rtype) != FFI_TYPE_STRUCT) + memcpy (rvalue, &trvalue, cif->rtype->size); +} + +extern void ffi_closure_SYSV (void); +extern void __ic_invalidate (void *line); + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp; + + FFI_ASSERT (cif->abi == FFI_GCC_SYSV); + + tramp = (unsigned int *) &closure->tramp[0]; + /* Since ffi_closure is an aligned object, the ffi trampoline is + called as an SHcompact code. Sigh. + SHcompact part: + mova @(1,pc),r0; add #1,r0; jmp @r0; nop; + SHmedia part: + movi fnaddr >> 16,r1; shori fnaddr,r1; ptabs/l r1,tr0 + movi cxt >> 16,r1; shori cxt,r1; blink tr0,r63 */ +#ifdef __LITTLE_ENDIAN__ + tramp[0] = 0x7001c701; + tramp[1] = 0x0009402b; +#else + tramp[0] = 0xc7017001; + tramp[1] = 0x402b0009; +#endif + tramp[2] = 0xcc000010 | (((UINT32) ffi_closure_SYSV) >> 16) << 10; + tramp[3] = 0xc8000010 | (((UINT32) ffi_closure_SYSV) & 0xffff) << 10; + tramp[4] = 0x6bf10600; + tramp[5] = 0xcc000010 | (((UINT32) codeloc) >> 16) << 10; + tramp[6] = 0xc8000010 | (((UINT32) codeloc) & 0xffff) << 10; + tramp[7] = 0x4401fff0; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + /* Flush the icache. */ + asm volatile ("ocbwb %0,0; synco; icbi %1,0; synci" : : "r" (tramp), + "r"(codeloc)); + + return FFI_OK; +} + +/* Basically the trampoline invokes ffi_closure_SYSV, and on + * entry, r3 holds the address of the closure. + * After storing the registers that could possibly contain + * parameters to be passed into the stack frame and setting + * up space for a return value, ffi_closure_SYSV invokes the + * following helper function to do most of the work. + */ + +int +ffi_closure_helper_SYSV (ffi_closure *closure, UINT64 *rvalue, + UINT64 *pgr, UINT64 *pfr, UINT64 *pst) +{ + void **avalue; + ffi_type **p_arg; + int i, avn; + int greg, freg; + ffi_cif *cif; + int fpair = -1; + + cif = closure->cif; + avalue = alloca (cif->nargs * sizeof (void *)); + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ + if (return_type (cif->rtype) == FFI_TYPE_STRUCT) + { + rvalue = (UINT64 *) *pgr; + greg = 1; + } + else + greg = 0; + + freg = 0; + cif = closure->cif; + avn = cif->nargs; + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) + { + size_t z; + void *p; + + z = (*p_arg)->size; + if (z < sizeof (UINT32)) + { + p = pgr + greg++; + + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_STRUCT: +#ifdef __LITTLE_ENDIAN__ + avalue[i] = p; +#else + avalue[i] = ((char *) p) + sizeof (UINT32) - z; +#endif + break; + + default: + FFI_ASSERT(0); + } + } + else if (z == sizeof (UINT32)) + { + if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (freg < NFREGARG - 1) + { + if (fpair >= 0) + { + avalue[i] = (UINT32 *) pfr + fpair; + fpair = -1; + } + else + { +#ifdef __LITTLE_ENDIAN__ + fpair = freg; + avalue[i] = (UINT32 *) pfr + (1 ^ freg); +#else + fpair = 1 ^ freg; + avalue[i] = (UINT32 *) pfr + freg; +#endif + freg += 2; + } + } + else +#ifdef __LITTLE_ENDIAN__ + avalue[i] = pgr + greg; +#else + avalue[i] = (UINT32 *) (pgr + greg) + 1; +#endif + } + else +#ifdef __LITTLE_ENDIAN__ + avalue[i] = pgr + greg; +#else + avalue[i] = (UINT32 *) (pgr + greg) + 1; +#endif + greg++; + } + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) + { + if (freg + 1 >= NFREGARG) + avalue[i] = pgr + greg; + else + { + avalue[i] = pfr + (freg >> 1); + freg += 2; + } + greg++; + } + else + { + int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64); + + avalue[i] = pgr + greg; + greg += n; + } + } + + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_SYSV how to perform return type promotions. */ + return return_type (cif->rtype); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffitarget.h new file mode 100644 index 0000000..d935b89 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffitarget.h @@ -0,0 +1,53 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for SuperH - SHmedia. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; + +#define FFI_EXTRA_CIF_FIELDS long long flags2 +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 32 +#define FFI_NATIVE_RAW_API 0 + +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/sysv.S new file mode 100644 index 0000000..c4587d5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/sysv.S @@ -0,0 +1,539 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima + + SuperH SHmedia Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include +#ifdef HAVE_MACHINE_ASM_H +#include +#else +/* XXX these lose for some platforms, I'm sure. */ +#define CNAME(x) x +#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): +#endif + +#ifdef __LITTLE_ENDIAN__ +#define OFS_FLT 0 +#else +#define OFS_FLT 4 +#endif + + .section .text..SHmedia32,"ax" + + # r2: ffi_prep_args + # r3: &ecif + # r4: bytes + # r5: flags + # r6: flags2 + # r7: rvalue + # r8: fn + + # This assumes we are using gas. + .align 5 +ENTRY(ffi_call_SYSV) + # Save registers +.LFB1: + addi.l r15, -48, r15 +.LCFI0: + st.q r15, 40, r32 + st.q r15, 32, r31 + st.q r15, 24, r30 + st.q r15, 16, r29 + st.q r15, 8, r28 + st.l r15, 4, r18 + st.l r15, 0, r14 +.LCFI1: + add.l r15, r63, r14 +.LCFI2: +# add r4, r63, r28 + add r5, r63, r29 + add r6, r63, r30 + add r7, r63, r31 + add r8, r63, r32 + + addi r4, (64 + 7), r4 + andi r4, ~7, r4 + sub.l r15, r4, r15 + + ptabs/l r2, tr0 + add r15, r63, r2 + blink tr0, r18 + + addi r15, 64, r22 + movi 0, r0 + movi 0, r1 + movi -1, r23 + + pt/l 1f, tr1 + bnei/l r29, FFI_TYPE_STRUCT, tr1 + ld.l r15, 0, r19 + addi r15, 8, r15 + addi r0, 1, r0 +1: + +.L_pass: + andi r30, 3, r20 + shlri r30, 2, r30 + + pt/l .L_call_it, tr0 + pt/l .L_pass_i, tr1 + pt/l .L_pass_f, tr2 + + beqi/l r20, FFI_TYPE_VOID, tr0 + beqi/l r20, FFI_TYPE_INT, tr1 + beqi/l r20, FFI_TYPE_FLOAT, tr2 + +.L_pass_d: + addi r0, 1, r0 + pt/l 3f, tr0 + movi 12, r20 + bge/l r1, r20, tr0 + + pt/l .L_pop_d, tr1 + pt/l 2f, tr0 + blink tr1, r63 +2: + addi.l r15, 8, r15 +3: + pt/l .L_pass, tr0 + addi r1, 2, r1 + blink tr0, r63 + +.L_pop_d: + pt/l .L_pop_d_tbl, tr1 + gettr tr1, r20 + shlli r1, 2, r21 + add r20, r21, r20 + ptabs/l r20, tr1 + blink tr1, r63 + +.L_pop_d_tbl: + fld.d r15, 0, dr0 + blink tr0, r63 + fld.d r15, 0, dr2 + blink tr0, r63 + fld.d r15, 0, dr4 + blink tr0, r63 + fld.d r15, 0, dr6 + blink tr0, r63 + fld.d r15, 0, dr8 + blink tr0, r63 + fld.d r15, 0, dr10 + blink tr0, r63 + +.L_pass_f: + addi r0, 1, r0 + pt/l 3f, tr0 + movi 12, r20 + bge/l r1, r20, tr0 + + pt/l .L_pop_f, tr1 + pt/l 2f, tr0 + blink tr1, r63 +2: + addi.l r15, 8, r15 +3: + pt/l .L_pass, tr0 + blink tr0, r63 + +.L_pop_f: + pt/l .L_pop_f_tbl, tr1 + pt/l 5f, tr2 + gettr tr1, r20 + bge/l r23, r63, tr2 + add r1, r63, r23 + shlli r1, 3, r21 + addi r1, 2, r1 + add r20, r21, r20 + ptabs/l r20, tr1 + blink tr1, r63 +5: + addi r23, 1, r21 + movi -1, r23 + shlli r21, 3, r21 + add r20, r21, r20 + ptabs/l r20, tr1 + blink tr1, r63 + +.L_pop_f_tbl: + fld.s r15, OFS_FLT, fr0 + blink tr0, r63 + fld.s r15, OFS_FLT, fr1 + blink tr0, r63 + fld.s r15, OFS_FLT, fr2 + blink tr0, r63 + fld.s r15, OFS_FLT, fr3 + blink tr0, r63 + fld.s r15, OFS_FLT, fr4 + blink tr0, r63 + fld.s r15, OFS_FLT, fr5 + blink tr0, r63 + fld.s r15, OFS_FLT, fr6 + blink tr0, r63 + fld.s r15, OFS_FLT, fr7 + blink tr0, r63 + fld.s r15, OFS_FLT, fr8 + blink tr0, r63 + fld.s r15, OFS_FLT, fr9 + blink tr0, r63 + fld.s r15, OFS_FLT, fr10 + blink tr0, r63 + fld.s r15, OFS_FLT, fr11 + blink tr0, r63 + +.L_pass_i: + pt/l 3f, tr0 + movi 8, r20 + bge/l r0, r20, tr0 + + pt/l .L_pop_i, tr1 + pt/l 2f, tr0 + blink tr1, r63 +2: + addi.l r15, 8, r15 +3: + pt/l .L_pass, tr0 + addi r0, 1, r0 + blink tr0, r63 + +.L_pop_i: + pt/l .L_pop_i_tbl, tr1 + gettr tr1, r20 + shlli r0, 3, r21 + add r20, r21, r20 + ptabs/l r20, tr1 + blink tr1, r63 + +.L_pop_i_tbl: + ld.q r15, 0, r2 + blink tr0, r63 + ld.q r15, 0, r3 + blink tr0, r63 + ld.q r15, 0, r4 + blink tr0, r63 + ld.q r15, 0, r5 + blink tr0, r63 + ld.q r15, 0, r6 + blink tr0, r63 + ld.q r15, 0, r7 + blink tr0, r63 + ld.q r15, 0, r8 + blink tr0, r63 + ld.q r15, 0, r9 + blink tr0, r63 + +.L_call_it: + # call function + pt/l 1f, tr1 + bnei/l r29, FFI_TYPE_STRUCT, tr1 + add r19, r63, r2 +1: + add r22, r63, r15 + ptabs/l r32, tr0 + blink tr0, r18 + + pt/l .L_ret_i, tr0 + pt/l .L_ret_ll, tr1 + pt/l .L_ret_d, tr2 + pt/l .L_ret_f, tr3 + pt/l .L_epilogue, tr4 + + beqi/l r29, FFI_TYPE_INT, tr0 + beqi/l r29, FFI_TYPE_UINT32, tr0 + beqi/l r29, FFI_TYPE_SINT64, tr1 + beqi/l r29, FFI_TYPE_UINT64, tr1 + beqi/l r29, FFI_TYPE_DOUBLE, tr2 + beqi/l r29, FFI_TYPE_FLOAT, tr3 + + pt/l .L_ret_q, tr0 + pt/l .L_ret_h, tr1 + + beqi/l r29, FFI_TYPE_UINT8, tr0 + beqi/l r29, FFI_TYPE_UINT16, tr1 + blink tr4, r63 + +.L_ret_d: + fst.d r31, 0, dr0 + blink tr4, r63 + +.L_ret_ll: + st.q r31, 0, r2 + blink tr4, r63 + +.L_ret_f: + fst.s r31, OFS_FLT, fr0 + blink tr4, r63 + +.L_ret_q: + st.b r31, 0, r2 + blink tr4, r63 + +.L_ret_h: + st.w r31, 0, r2 + blink tr4, r63 + +.L_ret_i: + st.l r31, 0, r2 + # Fall + +.L_epilogue: + # Remove the space we pushed for the args + add r14, r63, r15 + + ld.l r15, 0, r14 + ld.l r15, 4, r18 + ld.q r15, 8, r28 + ld.q r15, 16, r29 + ld.q r15, 24, r30 + ld.q r15, 32, r31 + ld.q r15, 40, r32 + addi.l r15, 48, r15 + ptabs r18, tr0 + blink tr0, r63 + +.LFE1: +.ffi_call_SYSV_end: + .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) + + .align 5 +ENTRY(ffi_closure_SYSV) +.LFB2: + addi.l r15, -136, r15 +.LCFI3: + st.l r15, 12, r18 + st.l r15, 8, r14 + st.l r15, 4, r12 +.LCFI4: + add r15, r63, r14 +.LCFI5: + /* Stack layout: + ... + 64 bytes (register parameters) + 48 bytes (floating register parameters) + 8 bytes (result) + 4 bytes (r18) + 4 bytes (r14) + 4 bytes (r12) + 4 bytes (for align) + <- new stack pointer + */ + fst.d r14, 24, dr0 + fst.d r14, 32, dr2 + fst.d r14, 40, dr4 + fst.d r14, 48, dr6 + fst.d r14, 56, dr8 + fst.d r14, 64, dr10 + st.q r14, 72, r2 + st.q r14, 80, r3 + st.q r14, 88, r4 + st.q r14, 96, r5 + st.q r14, 104, r6 + st.q r14, 112, r7 + st.q r14, 120, r8 + st.q r14, 128, r9 + + add r1, r63, r2 + addi r14, 16, r3 + addi r14, 72, r4 + addi r14, 24, r5 + addi r14, 136, r6 +#ifdef PIC + movi (((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12 + shori ((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12 +.LPCS0: ptrel/u r12, tr0 + movi ((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1 + gettr tr0, r12 + ldx.l r1, r12, r1 + ptabs r1, tr0 +#else + pt/l ffi_closure_helper_SYSV, tr0 +#endif + blink tr0, r18 + + shlli r2, 1, r1 + movi (((datalabel .L_table) >> 16) & 65535), r2 + shori ((datalabel .L_table) & 65535), r2 + ldx.w r2, r1, r1 + add r1, r2, r1 + pt/l .L_case_v, tr1 + ptabs r1, tr0 + blink tr0, r63 + + .align 2 +.L_table: + .word .L_case_v - datalabel .L_table /* FFI_TYPE_VOID */ + .word .L_case_i - datalabel .L_table /* FFI_TYPE_INT */ + .word .L_case_f - datalabel .L_table /* FFI_TYPE_FLOAT */ + .word .L_case_d - datalabel .L_table /* FFI_TYPE_DOUBLE */ + .word .L_case_d - datalabel .L_table /* FFI_TYPE_LONGDOUBLE */ + .word .L_case_uq - datalabel .L_table /* FFI_TYPE_UINT8 */ + .word .L_case_q - datalabel .L_table /* FFI_TYPE_SINT8 */ + .word .L_case_uh - datalabel .L_table /* FFI_TYPE_UINT16 */ + .word .L_case_h - datalabel .L_table /* FFI_TYPE_SINT16 */ + .word .L_case_i - datalabel .L_table /* FFI_TYPE_UINT32 */ + .word .L_case_i - datalabel .L_table /* FFI_TYPE_SINT32 */ + .word .L_case_ll - datalabel .L_table /* FFI_TYPE_UINT64 */ + .word .L_case_ll - datalabel .L_table /* FFI_TYPE_SINT64 */ + .word .L_case_v - datalabel .L_table /* FFI_TYPE_STRUCT */ + .word .L_case_i - datalabel .L_table /* FFI_TYPE_POINTER */ + + .align 2 +.L_case_d: + fld.d r14, 16, dr0 + blink tr1, r63 +.L_case_f: + fld.s r14, 16, fr0 + blink tr1, r63 +.L_case_ll: + ld.q r14, 16, r2 + blink tr1, r63 +.L_case_i: + ld.l r14, 16, r2 + blink tr1, r63 +.L_case_q: + ld.b r14, 16, r2 + blink tr1, r63 +.L_case_uq: + ld.ub r14, 16, r2 + blink tr1, r63 +.L_case_h: + ld.w r14, 16, r2 + blink tr1, r63 +.L_case_uh: + ld.uw r14, 16, r2 + blink tr1, r63 +.L_case_v: + add.l r14, r63, r15 + ld.l r15, 4, r12 + ld.l r15, 8, r14 + ld.l r15, 12, r18 + addi.l r15, 136, r15 + ptabs r18, tr0 + blink tr0, r63 + +.LFE2: +.ffi_closure_SYSV_end: + .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif + + .section ".eh_frame","aw",@progbits +__FRAME_BEGIN__: + .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ +.LSCIE1: + .4byte 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ +#ifdef PIC + .ascii "zR\0" /* CIE Augmentation */ +#else + .byte 0x0 /* CIE Augmentation */ +#endif + .uleb128 0x1 /* CIE Code Alignment Factor */ + .sleb128 -4 /* CIE Data Alignment Factor */ + .byte 0x12 /* CIE RA Column */ +#ifdef PIC + .uleb128 0x1 /* Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel) */ +#endif + .byte 0xc /* DW_CFA_def_cfa */ + .uleb128 0xf + .uleb128 0x0 + .align 2 +.LECIE1: +.LSFDE1: + .4byte datalabel .LEFDE1-datalabel .LASFDE1 /* FDE Length */ +.LASFDE1: + .4byte datalabel .LASFDE1-datalabel __FRAME_BEGIN__ +#ifdef PIC + .4byte .LFB1-. /* FDE initial location */ +#else + .4byte .LFB1 /* FDE initial location */ +#endif + .4byte datalabel .LFE1-datalabel .LFB1 /* FDE address range */ +#ifdef PIC + .uleb128 0x0 /* Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI0-datalabel .LFB1 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .uleb128 0x30 + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI1-datalabel .LCFI0 + .byte 0x8e /* DW_CFA_offset, column 0xe */ + .uleb128 0xc + .byte 0x92 /* DW_CFA_offset, column 0x12 */ + .uleb128 0xb + .byte 0x9c /* DW_CFA_offset, column 0x1c */ + .uleb128 0xa + .byte 0x9d /* DW_CFA_offset, column 0x1d */ + .uleb128 0x8 + .byte 0x9e /* DW_CFA_offset, column 0x1e */ + .uleb128 0x6 + .byte 0x9f /* DW_CFA_offset, column 0x1f */ + .uleb128 0x4 + .byte 0xa0 /* DW_CFA_offset, column 0x20 */ + .uleb128 0x2 + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI2-datalabel .LCFI1 + .byte 0xd /* DW_CFA_def_cfa_register */ + .uleb128 0xe + .align 2 +.LEFDE1: + +.LSFDE3: + .4byte datalabel .LEFDE3-datalabel .LASFDE3 /* FDE Length */ +.LASFDE3: + .4byte datalabel .LASFDE3-datalabel __FRAME_BEGIN__ +#ifdef PIC + .4byte .LFB2-. /* FDE initial location */ +#else + .4byte .LFB2 /* FDE initial location */ +#endif + .4byte datalabel .LFE2-datalabel .LFB2 /* FDE address range */ +#ifdef PIC + .uleb128 0x0 /* Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI3-datalabel .LFB2 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .uleb128 0x88 + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI4-datalabel .LCFI3 + .byte 0x8c /* DW_CFA_offset, column 0xc */ + .uleb128 0x21 + .byte 0x8e /* DW_CFA_offset, column 0xe */ + .uleb128 0x20 + .byte 0x92 /* DW_CFA_offset, column 0x12 */ + .uleb128 0x1f + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI5-datalabel .LCFI4 + .byte 0xd /* DW_CFA_def_cfa_register */ + .uleb128 0xe + .align 2 +.LEFDE3: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffi.c new file mode 100644 index 0000000..1ac5d46 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffi.c @@ -0,0 +1,669 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2011 Anthony Green + Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc. + + SPARC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args_v8(char *stack, extended_cif *ecif) +{ + int i; + void **p_argv; + char *argp; + ffi_type **p_arg; + + /* Skip 16 words for the window save area */ + argp = stack + 16*sizeof(int); + + /* This should only really be done when we are returning a structure, + however, it's faster just to do it all the time... + + if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) */ + *(int *) argp = (long)ecif->rvalue; + + /* And 1 word for the structure return value. */ + argp += sizeof(int); + +#ifdef USING_PURIFY + /* Purify will probably complain in our assembly routine, unless we + zero out this memory. */ + + ((int*)argp)[0] = 0; + ((int*)argp)[1] = 0; + ((int*)argp)[2] = 0; + ((int*)argp)[3] = 0; + ((int*)argp)[4] = 0; + ((int*)argp)[5] = 0; +#endif + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++) + { + size_t z; + + if ((*p_arg)->type == FFI_TYPE_STRUCT +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + || (*p_arg)->type == FFI_TYPE_LONGDOUBLE +#endif + ) + { + *(unsigned int *) argp = (unsigned long)(* p_argv); + z = sizeof(int); + } + else + { + z = (*p_arg)->size; + if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = *(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = *(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = *(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = *(UINT16 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else + { + memcpy(argp, *p_argv, z); + } + } + p_argv++; + argp += z; + } + + return; +} + +int ffi_prep_args_v9(char *stack, extended_cif *ecif) +{ + int i, ret = 0; + int tmp; + void **p_argv; + char *argp; + ffi_type **p_arg; + + tmp = 0; + + /* Skip 16 words for the window save area */ + argp = stack + 16*sizeof(long long); + +#ifdef USING_PURIFY + /* Purify will probably complain in our assembly routine, unless we + zero out this memory. */ + + ((long long*)argp)[0] = 0; + ((long long*)argp)[1] = 0; + ((long long*)argp)[2] = 0; + ((long long*)argp)[3] = 0; + ((long long*)argp)[4] = 0; + ((long long*)argp)[5] = 0; +#endif + + p_argv = ecif->avalue; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && + ecif->cif->rtype->size > 32) + { + *(unsigned long long *) argp = (unsigned long)ecif->rvalue; + argp += sizeof(long long); + tmp = 1; + } + + for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; + i++, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + switch ((*p_arg)->type) + { + case FFI_TYPE_STRUCT: + if (z > 16) + { + /* For structures larger than 16 bytes we pass reference. */ + *(unsigned long long *) argp = (unsigned long)* p_argv; + argp += sizeof(long long); + tmp++; + p_argv++; + continue; + } + /* FALLTHROUGH */ + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#endif + ret = 1; /* We should promote into FP regs as well as integer. */ + break; + } + if (z < sizeof(long long)) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed long long *) argp = *(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned long long *) argp = *(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed long long *) argp = *(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned long long *) argp = *(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(signed long long *) argp = *(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: + *(unsigned long long *) argp = *(UINT32 *)(* p_argv); + break; + + case FFI_TYPE_FLOAT: + *(float *) (argp + 4) = *(FLOAT32 *)(* p_argv); /* Right justify */ + break; + + case FFI_TYPE_STRUCT: + memcpy(argp, *p_argv, z); + break; + + default: + FFI_ASSERT(0); + } + z = sizeof(long long); + tmp++; + } + else if (z == sizeof(long long)) + { + memcpy(argp, *p_argv, z); + z = sizeof(long long); + tmp++; + } + else + { + if ((tmp & 1) && (*p_arg)->alignment > 8) + { + tmp++; + argp += sizeof(long long); + } + memcpy(argp, *p_argv, z); + z = 2 * sizeof(long long); + tmp += 2; + } + p_argv++; + argp += z; + } + + return ret; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + int wordsize; + + if (cif->abi != FFI_V9) + { + wordsize = 4; + + /* If we are returning a struct, this will already have been added. + Otherwise we need to add it because it's always got to be there! */ + + if (cif->rtype->type != FFI_TYPE_STRUCT) + cif->bytes += wordsize; + + /* sparc call frames require that space is allocated for 6 args, + even if they aren't used. Make that space if necessary. */ + + if (cif->bytes < 4*6+4) + cif->bytes = 4*6+4; + } + else + { + wordsize = 8; + + /* sparc call frames require that space is allocated for 6 args, + even if they aren't used. Make that space if necessary. */ + + if (cif->bytes < 8*6) + cif->bytes = 8*6; + } + + /* Adjust cif->bytes. to include 16 words for the window save area, + and maybe the struct/union return pointer area, */ + + cif->bytes += 16 * wordsize; + + /* The stack must be 2 word aligned, so round bytes up + appropriately. */ + + cif->bytes = ALIGN(cif->bytes, 2 * wordsize); + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#endif + cif->flags = cif->rtype->type; + break; + + case FFI_TYPE_STRUCT: + if (cif->abi == FFI_V9 && cif->rtype->size > 32) + cif->flags = FFI_TYPE_VOID; + else + cif->flags = FFI_TYPE_STRUCT; + break; + + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + if (cif->abi == FFI_V9) + cif->flags = FFI_TYPE_INT; + else + cif->flags = cif->rtype->type; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + if (cif->abi == FFI_V9) + cif->flags = FFI_TYPE_INT; + else + cif->flags = FFI_TYPE_SINT64; + break; + + default: + cif->flags = FFI_TYPE_INT; + break; + } + return FFI_OK; +} + +int ffi_v9_layout_struct(ffi_type *arg, int off, char *ret, char *intg, char *flt) +{ + ffi_type **ptr = &arg->elements[0]; + + while (*ptr != NULL) + { + if (off & ((*ptr)->alignment - 1)) + off = ALIGN(off, (*ptr)->alignment); + + switch ((*ptr)->type) + { + case FFI_TYPE_STRUCT: + off = ffi_v9_layout_struct(*ptr, off, ret, intg, flt); + off = ALIGN(off, FFI_SIZEOF_ARG); + break; + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#endif + memmove(ret + off, flt + off, (*ptr)->size); + off += (*ptr)->size; + break; + default: + memmove(ret + off, intg + off, (*ptr)->size); + off += (*ptr)->size; + break; + } + ptr++; + } + return off; +} + + +#ifdef SPARC64 +extern int ffi_call_v9(void *, extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)(void)); +#else +extern int ffi_call_v8(void *, extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)(void)); +#endif + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + void *rval = rvalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + ecif.rvalue = rvalue; + if (cif->rtype->type == FFI_TYPE_STRUCT) + { + if (cif->rtype->size <= 32) + rval = alloca(64); + else + { + rval = NULL; + if (rvalue == NULL) + ecif.rvalue = alloca(cif->rtype->size); + } + } + + switch (cif->abi) + { + case FFI_V8: +#ifdef SPARC64 + /* We don't yet support calling 32bit code from 64bit */ + FFI_ASSERT(0); +#else + if (rvalue && (cif->rtype->type == FFI_TYPE_STRUCT +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + || cif->flags == FFI_TYPE_LONGDOUBLE +#endif + )) + { + /* For v8, we need an "unimp" with size of returning struct */ + /* behind "call", so we alloc some executable space for it. */ + /* l7 is used, we need to make sure v8.S doesn't use %l7. */ + unsigned int *call_struct = NULL; + ffi_closure_alloc(32, &call_struct); + if (call_struct) + { + unsigned long f = (unsigned long)fn; + call_struct[0] = 0xae10001f; /* mov %i7, %l7 */ + call_struct[1] = 0xbe10000f; /* mov %o7, %i7 */ + call_struct[2] = 0x03000000 | f >> 10; /* sethi %hi(fn), %g1 */ + call_struct[3] = 0x9fc06000 | (f & 0x3ff); /* jmp %g1+%lo(fn), %o7 */ + call_struct[4] = 0x01000000; /* nop */ + if (cif->rtype->size < 0x7f) + call_struct[5] = cif->rtype->size; /* unimp */ + else + call_struct[5] = 0x01000000; /* nop */ + call_struct[6] = 0x81c7e008; /* ret */ + call_struct[7] = 0xbe100017; /* mov %l7, %i7 */ + asm volatile ("iflush %0; iflush %0+8; iflush %0+16; iflush %0+24" : : + "r" (call_struct) : "memory"); + /* SPARC v8 requires 5 instructions for flush to be visible */ + asm volatile ("nop; nop; nop; nop; nop"); + ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, + cif->flags, rvalue, call_struct); + ffi_closure_free(call_struct); + } + else + { + ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, + cif->flags, rvalue, fn); + } + } + else + { + ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, + cif->flags, rvalue, fn); + } +#endif + break; + case FFI_V9: +#ifdef SPARC64 + ffi_call_v9(ffi_prep_args_v9, &ecif, cif->bytes, + cif->flags, rval, fn); + if (rvalue && rval && cif->rtype->type == FFI_TYPE_STRUCT) + ffi_v9_layout_struct(cif->rtype, 0, (char *)rvalue, (char *)rval, ((char *)rval)+32); +#else + /* And vice versa */ + FFI_ASSERT(0); +#endif + break; + default: + FFI_ASSERT(0); + break; + } +} + + +#ifdef SPARC64 +extern void ffi_closure_v9(void); +#else +extern void ffi_closure_v8(void); +#endif + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + unsigned long fn; +#ifdef SPARC64 + /* Trampoline address is equal to the closure address. We take advantage + of that to reduce the trampoline size by 8 bytes. */ + if (cif->abi != FFI_V9) + return FFI_BAD_ABI; + fn = (unsigned long) ffi_closure_v9; + tramp[0] = 0x83414000; /* rd %pc, %g1 */ + tramp[1] = 0xca586010; /* ldx [%g1+16], %g5 */ + tramp[2] = 0x81c14000; /* jmp %g5 */ + tramp[3] = 0x01000000; /* nop */ + *((unsigned long *) &tramp[4]) = fn; +#else + unsigned long ctx = (unsigned long) codeloc; + if (cif->abi != FFI_V8) + return FFI_BAD_ABI; + fn = (unsigned long) ffi_closure_v8; + tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */ + tramp[1] = 0x05000000 | ctx >> 10; /* sethi %hi(ctx), %g2 */ + tramp[2] = 0x81c06000 | (fn & 0x3ff); /* jmp %g1+%lo(fn) */ + tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or %g2, %lo(ctx) */ +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + /* Flush the Icache. closure is 8 bytes aligned. */ +#ifdef SPARC64 + asm volatile ("flush %0; flush %0+8" : : "r" (closure) : "memory"); +#else + asm volatile ("iflush %0; iflush %0+8" : : "r" (closure) : "memory"); + /* SPARC v8 requires 5 instructions for flush to be visible */ + asm volatile ("nop; nop; nop; nop; nop"); +#endif + + return FFI_OK; +} + +int +ffi_closure_sparc_inner_v8(ffi_closure *closure, + void *rvalue, unsigned long *gpr, unsigned long *scratch) +{ + ffi_cif *cif; + ffi_type **arg_types; + void **avalue; + int i, argn; + + cif = closure->cif; + arg_types = cif->arg_types; + avalue = alloca(cif->nargs * sizeof(void *)); + + /* Copy the caller's structure return address so that the closure + returns the data directly to the caller. */ + if (cif->flags == FFI_TYPE_STRUCT +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + || cif->flags == FFI_TYPE_LONGDOUBLE +#endif + ) + rvalue = (void *) gpr[0]; + + /* Always skip the structure return address. */ + argn = 1; + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0; i < cif->nargs; i++) + { + if (arg_types[i]->type == FFI_TYPE_STRUCT +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + || arg_types[i]->type == FFI_TYPE_LONGDOUBLE +#endif + ) + { + /* Straight copy of invisible reference. */ + avalue[i] = (void *)gpr[argn++]; + } + else if ((arg_types[i]->type == FFI_TYPE_DOUBLE + || arg_types[i]->type == FFI_TYPE_SINT64 + || arg_types[i]->type == FFI_TYPE_UINT64) + /* gpr is 8-byte aligned. */ + && (argn % 2) != 0) + { + /* Align on a 8-byte boundary. */ + scratch[0] = gpr[argn]; + scratch[1] = gpr[argn+1]; + avalue[i] = scratch; + scratch -= 2; + argn += 2; + } + else + { + /* Always right-justify. */ + argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size; + } + } + + /* Invoke the closure. */ + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_sparc how to perform return type promotions. */ + return cif->rtype->type; +} + +int +ffi_closure_sparc_inner_v9(ffi_closure *closure, + void *rvalue, unsigned long *gpr, double *fpr) +{ + ffi_cif *cif; + ffi_type **arg_types; + void **avalue; + int i, argn, fp_slot_max; + + cif = closure->cif; + arg_types = cif->arg_types; + avalue = alloca(cif->nargs * sizeof(void *)); + + /* Copy the caller's structure return address so that the closure + returns the data directly to the caller. */ + if (cif->flags == FFI_TYPE_VOID + && cif->rtype->type == FFI_TYPE_STRUCT) + { + rvalue = (void *) gpr[0]; + /* Skip the structure return address. */ + argn = 1; + } + else + argn = 0; + + fp_slot_max = 16 - argn; + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0; i < cif->nargs; i++) + { + if (arg_types[i]->type == FFI_TYPE_STRUCT) + { + if (arg_types[i]->size > 16) + { + /* Straight copy of invisible reference. */ + avalue[i] = (void *)gpr[argn++]; + } + else + { + /* Left-justify. */ + ffi_v9_layout_struct(arg_types[i], + 0, + (char *) &gpr[argn], + (char *) &gpr[argn], + (char *) &fpr[argn]); + avalue[i] = &gpr[argn]; + argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + } + } + else + { + /* Right-justify. */ + argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + + /* Align on a 16-byte boundary. */ +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + if (arg_types[i]->type == FFI_TYPE_LONGDOUBLE && (argn % 2) != 0) + argn++; +#endif + if (i < fp_slot_max + && (arg_types[i]->type == FFI_TYPE_FLOAT + || arg_types[i]->type == FFI_TYPE_DOUBLE +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + || arg_types[i]->type == FFI_TYPE_LONGDOUBLE +#endif + )) + avalue[i] = ((char *) &fpr[argn]) - arg_types[i]->size; + else + avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size; + } + } + + /* Invoke the closure. */ + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_sparc how to perform return type promotions. */ + return cif->rtype->type; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffitarget.h new file mode 100644 index 0000000..51275cb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffitarget.h @@ -0,0 +1,68 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for SPARC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if defined(__arch64__) || defined(__sparcv9) +#ifndef SPARC64 +#define SPARC64 +#endif +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_V8, + FFI_V8PLUS, + FFI_V9, + FFI_LAST_ABI, +#ifdef SPARC64 + FFI_DEFAULT_ABI = FFI_V9 +#else + FFI_DEFAULT_ABI = FFI_V8 +#endif +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +#ifdef SPARC64 +#define FFI_TRAMPOLINE_SIZE 24 +#else +#define FFI_TRAMPOLINE_SIZE 16 +#endif + +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v8.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v8.S new file mode 100644 index 0000000..2c4eb60 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v8.S @@ -0,0 +1,313 @@ +/* ----------------------------------------------------------------------- + v8.S - Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc. + + SPARC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + +#define STACKFRAME 96 /* Minimum stack framesize for SPARC */ +#define ARGS (64+4) /* Offset of register area in frame */ + +.text + .align 8 +.globl ffi_call_v8 +.globl _ffi_call_v8 + +ffi_call_v8: +_ffi_call_v8: +.LLFB1: + save %sp, -STACKFRAME, %sp +.LLCFI0: + + sub %sp, %i2, %sp ! alloca() space in stack for frame to set up + add %sp, STACKFRAME, %l0 ! %l0 has start of + ! frame to set up + + mov %l0, %o0 ! call routine to set up frame + call %i0 + mov %i1, %o1 ! (delay) + + ld [%l0+ARGS], %o0 ! call foreign function + ld [%l0+ARGS+4], %o1 + ld [%l0+ARGS+8], %o2 + ld [%l0+ARGS+12], %o3 + ld [%l0+ARGS+16], %o4 + ld [%l0+ARGS+20], %o5 + call %i5 + mov %l0, %sp ! (delay) switch to frame + nop ! STRUCT returning functions skip 12 instead of 8 bytes + + ! If the return value pointer is NULL, assume no return value. + tst %i4 + bz done + nop + + cmp %i3, FFI_TYPE_INT + be,a done + st %o0, [%i4] ! (delay) + + cmp %i3, FFI_TYPE_FLOAT + be,a done + st %f0, [%i4+0] ! (delay) + + cmp %i3, FFI_TYPE_DOUBLE + be,a double + st %f0, [%i4+0] ! (delay) + + cmp %i3, FFI_TYPE_SINT8 + be,a sint8 + sll %o0, 24, %o0 ! (delay) + + cmp %i3, FFI_TYPE_UINT8 + be,a uint8 + sll %o0, 24, %o0 ! (delay) + + cmp %i3, FFI_TYPE_SINT16 + be,a sint16 + sll %o0, 16, %o0 ! (delay) + + cmp %i3, FFI_TYPE_UINT16 + be,a uint16 + sll %o0, 16, %o0 ! (delay) + + cmp %i3, FFI_TYPE_SINT64 + be,a longlong + st %o0, [%i4+0] ! (delay) +done: + ret + restore + +double: + st %f1, [%i4+4] + ret + restore + +sint8: + sra %o0, 24, %o0 + st %o0, [%i4+0] + ret + restore + +uint8: + srl %o0, 24, %o0 + st %o0, [%i4+0] + ret + restore + +sint16: + sra %o0, 16, %o0 + st %o0, [%i4+0] + ret + restore + +uint16: + srl %o0, 16, %o0 + st %o0, [%i4+0] + ret + restore + +longlong: + st %o1, [%i4+4] + ret + restore +.LLFE1: + +.ffi_call_v8_end: + .size ffi_call_v8,.ffi_call_v8_end-ffi_call_v8 + + +#undef STACKFRAME +#define STACKFRAME 104 /* 16*4 register window + + 1*4 struct return + + 6*4 args backing store + + 3*4 locals */ + +/* ffi_closure_v8(...) + + Receives the closure argument in %g2. */ + + .text + .align 8 + .globl ffi_closure_v8 + +ffi_closure_v8: +#ifdef HAVE_AS_REGISTER_PSEUDO_OP + .register %g2, #scratch +#endif +.LLFB2: + ! Reserve frame space for all arguments in case + ! we need to align them on a 8-byte boundary. + ld [%g2+FFI_TRAMPOLINE_SIZE], %g1 + ld [%g1+4], %g1 + sll %g1, 3, %g1 + add %g1, STACKFRAME, %g1 + ! %g1 == STACKFRAME + 8*nargs + neg %g1 + save %sp, %g1, %sp +.LLCFI1: + + ! Store all of the potential argument registers in va_list format. + st %i0, [%fp+68+0] + st %i1, [%fp+68+4] + st %i2, [%fp+68+8] + st %i3, [%fp+68+12] + st %i4, [%fp+68+16] + st %i5, [%fp+68+20] + + ! Call ffi_closure_sparc_inner to do the bulk of the work. + mov %g2, %o0 + add %fp, -8, %o1 + add %fp, 64, %o2 + call ffi_closure_sparc_inner_v8 + add %fp, -16, %o3 + + ! Load up the return value in the proper type. + ! See ffi_prep_cif_machdep for the list of cases. + cmp %o0, FFI_TYPE_VOID + be done1 + + cmp %o0, FFI_TYPE_INT + be done1 + ld [%fp-8], %i0 + + cmp %o0, FFI_TYPE_FLOAT + be,a done1 + ld [%fp-8], %f0 + + cmp %o0, FFI_TYPE_DOUBLE + be,a done1 + ldd [%fp-8], %f0 + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + cmp %o0, FFI_TYPE_LONGDOUBLE + be done2 +#endif + + cmp %o0, FFI_TYPE_STRUCT + be done2 + + cmp %o0, FFI_TYPE_SINT64 + be,a done1 + ldd [%fp-8], %i0 + + ld [%fp-8], %i0 +done1: + jmp %i7+8 + restore +done2: + ! Skip 'unimp'. + jmp %i7+12 + restore +.LLFE2: + +.ffi_closure_v8_end: + .size ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8 + +#ifdef SPARC64 +#define WS 8 +#define nword xword +#define uanword uaxword +#else +#define WS 4 +#define nword long +#define uanword uaword +#endif + +#ifdef HAVE_RO_EH_FRAME + .section ".eh_frame",#alloc +#else + .section ".eh_frame",#alloc,#write +#endif +.LLframe1: + .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry +.LLSCIE1: + .uaword 0x0 ! CIE Identifier Tag + .byte 0x1 ! CIE Version + .ascii "zR\0" ! CIE Augmentation + .byte 0x1 ! uleb128 0x1; CIE Code Alignment Factor + .byte 0x80-WS ! sleb128 -WS; CIE Data Alignment Factor + .byte 0xf ! CIE RA Column + .byte 0x1 ! uleb128 0x1; Augmentation size +#ifdef HAVE_AS_SPARC_UA_PCREL + .byte 0x1b ! FDE Encoding (pcrel sdata4) +#else + .byte 0x50 ! FDE Encoding (aligned absolute) +#endif + .byte 0xc ! DW_CFA_def_cfa + .byte 0xe ! uleb128 0xe + .byte 0x0 ! uleb128 0x0 + .align WS +.LLECIE1: +.LLSFDE1: + .uaword .LLEFDE1-.LLASFDE1 ! FDE Length +.LLASFDE1: + .uaword .LLASFDE1-.LLframe1 ! FDE CIE offset +#ifdef HAVE_AS_SPARC_UA_PCREL + .uaword %r_disp32(.LLFB1) + .uaword .LLFE1-.LLFB1 ! FDE address range +#else + .align WS + .nword .LLFB1 + .uanword .LLFE1-.LLFB1 ! FDE address range +#endif + .byte 0x0 ! uleb128 0x0; Augmentation size + .byte 0x4 ! DW_CFA_advance_loc4 + .uaword .LLCFI0-.LLFB1 + .byte 0xd ! DW_CFA_def_cfa_register + .byte 0x1e ! uleb128 0x1e + .byte 0x2d ! DW_CFA_GNU_window_save + .byte 0x9 ! DW_CFA_register + .byte 0xf ! uleb128 0xf + .byte 0x1f ! uleb128 0x1f + .align WS +.LLEFDE1: +.LLSFDE2: + .uaword .LLEFDE2-.LLASFDE2 ! FDE Length +.LLASFDE2: + .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset +#ifdef HAVE_AS_SPARC_UA_PCREL + .uaword %r_disp32(.LLFB2) + .uaword .LLFE2-.LLFB2 ! FDE address range +#else + .align WS + .nword .LLFB2 + .uanword .LLFE2-.LLFB2 ! FDE address range +#endif + .byte 0x0 ! uleb128 0x0; Augmentation size + .byte 0x4 ! DW_CFA_advance_loc4 + .uaword .LLCFI1-.LLFB2 + .byte 0xd ! DW_CFA_def_cfa_register + .byte 0x1e ! uleb128 0x1e + .byte 0x2d ! DW_CFA_GNU_window_save + .byte 0x9 ! DW_CFA_register + .byte 0xf ! uleb128 0xf + .byte 0x1f ! uleb128 0x1f + .align WS +.LLEFDE2: + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v9.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v9.S new file mode 100644 index 0000000..489ff02 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v9.S @@ -0,0 +1,307 @@ +/* ----------------------------------------------------------------------- + v9.S - Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc. + + SPARC 64-bit Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include +#include + +#ifdef SPARC64 +/* Only compile this in for 64bit builds, because otherwise the object file + will have inproper architecture due to used instructions. */ + +#define STACKFRAME 128 /* Minimum stack framesize for SPARC */ +#define STACK_BIAS 2047 +#define ARGS (128) /* Offset of register area in frame */ + +.text + .align 8 +.globl ffi_call_v9 +.globl _ffi_call_v9 + +ffi_call_v9: +_ffi_call_v9: +.LLFB1: + save %sp, -STACKFRAME, %sp +.LLCFI0: + + sub %sp, %i2, %sp ! alloca() space in stack for frame to set up + add %sp, STACKFRAME+STACK_BIAS, %l0 ! %l0 has start of + ! frame to set up + + mov %l0, %o0 ! call routine to set up frame + call %i0 + mov %i1, %o1 ! (delay) + brz,pt %o0, 1f + ldx [%l0+ARGS], %o0 ! call foreign function + + ldd [%l0+ARGS], %f0 + ldd [%l0+ARGS+8], %f2 + ldd [%l0+ARGS+16], %f4 + ldd [%l0+ARGS+24], %f6 + ldd [%l0+ARGS+32], %f8 + ldd [%l0+ARGS+40], %f10 + ldd [%l0+ARGS+48], %f12 + ldd [%l0+ARGS+56], %f14 + ldd [%l0+ARGS+64], %f16 + ldd [%l0+ARGS+72], %f18 + ldd [%l0+ARGS+80], %f20 + ldd [%l0+ARGS+88], %f22 + ldd [%l0+ARGS+96], %f24 + ldd [%l0+ARGS+104], %f26 + ldd [%l0+ARGS+112], %f28 + ldd [%l0+ARGS+120], %f30 + +1: ldx [%l0+ARGS+8], %o1 + ldx [%l0+ARGS+16], %o2 + ldx [%l0+ARGS+24], %o3 + ldx [%l0+ARGS+32], %o4 + ldx [%l0+ARGS+40], %o5 + call %i5 + sub %l0, STACK_BIAS, %sp ! (delay) switch to frame + + ! If the return value pointer is NULL, assume no return value. + brz,pn %i4, done + nop + + cmp %i3, FFI_TYPE_INT + be,a,pt %icc, done + stx %o0, [%i4+0] ! (delay) + + cmp %i3, FFI_TYPE_FLOAT + be,a,pn %icc, done + st %f0, [%i4+0] ! (delay) + + cmp %i3, FFI_TYPE_DOUBLE + be,a,pn %icc, done + std %f0, [%i4+0] ! (delay) + + cmp %i3, FFI_TYPE_STRUCT + be,pn %icc, dostruct + + cmp %i3, FFI_TYPE_LONGDOUBLE + bne,pt %icc, done + nop + std %f0, [%i4+0] + std %f2, [%i4+8] + +done: ret + restore + +dostruct: + /* This will not work correctly for unions. */ + stx %o0, [%i4+0] + stx %o1, [%i4+8] + stx %o2, [%i4+16] + stx %o3, [%i4+24] + std %f0, [%i4+32] + std %f2, [%i4+40] + std %f4, [%i4+48] + std %f6, [%i4+56] + ret + restore +.LLFE1: + +.ffi_call_v9_end: + .size ffi_call_v9,.ffi_call_v9_end-ffi_call_v9 + + +#undef STACKFRAME +#define STACKFRAME 336 /* 16*8 register window + + 6*8 args backing store + + 20*8 locals */ +#define FP %fp+STACK_BIAS + +/* ffi_closure_v9(...) + + Receives the closure argument in %g1. */ + + .text + .align 8 + .globl ffi_closure_v9 + +ffi_closure_v9: +.LLFB2: + save %sp, -STACKFRAME, %sp +.LLCFI1: + + ! Store all of the potential argument registers in va_list format. + stx %i0, [FP+128+0] + stx %i1, [FP+128+8] + stx %i2, [FP+128+16] + stx %i3, [FP+128+24] + stx %i4, [FP+128+32] + stx %i5, [FP+128+40] + + ! Store possible floating point argument registers too. + std %f0, [FP-128] + std %f2, [FP-120] + std %f4, [FP-112] + std %f6, [FP-104] + std %f8, [FP-96] + std %f10, [FP-88] + std %f12, [FP-80] + std %f14, [FP-72] + std %f16, [FP-64] + std %f18, [FP-56] + std %f20, [FP-48] + std %f22, [FP-40] + std %f24, [FP-32] + std %f26, [FP-24] + std %f28, [FP-16] + std %f30, [FP-8] + + ! Call ffi_closure_sparc_inner to do the bulk of the work. + mov %g1, %o0 + add %fp, STACK_BIAS-160, %o1 + add %fp, STACK_BIAS+128, %o2 + call ffi_closure_sparc_inner_v9 + add %fp, STACK_BIAS-128, %o3 + + ! Load up the return value in the proper type. + ! See ffi_prep_cif_machdep for the list of cases. + cmp %o0, FFI_TYPE_VOID + be,pn %icc, done1 + + cmp %o0, FFI_TYPE_INT + be,pn %icc, integer + + cmp %o0, FFI_TYPE_FLOAT + be,a,pn %icc, done1 + ld [FP-160], %f0 + + cmp %o0, FFI_TYPE_DOUBLE + be,a,pn %icc, done1 + ldd [FP-160], %f0 + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + cmp %o0, FFI_TYPE_LONGDOUBLE + be,a,pn %icc, longdouble1 + ldd [FP-160], %f0 +#endif + + ! FFI_TYPE_STRUCT + ldx [FP-152], %i1 + ldx [FP-144], %i2 + ldx [FP-136], %i3 + ldd [FP-160], %f0 + ldd [FP-152], %f2 + ldd [FP-144], %f4 + ldd [FP-136], %f6 + +integer: + ldx [FP-160], %i0 + +done1: + ret + restore + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +longdouble1: + ldd [FP-152], %f2 + ret + restore +#endif +.LLFE2: + +.ffi_closure_v9_end: + .size ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9 + +#ifdef HAVE_RO_EH_FRAME + .section ".eh_frame",#alloc +#else + .section ".eh_frame",#alloc,#write +#endif +.LLframe1: + .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry +.LLSCIE1: + .uaword 0x0 ! CIE Identifier Tag + .byte 0x1 ! CIE Version + .ascii "zR\0" ! CIE Augmentation + .byte 0x1 ! uleb128 0x1; CIE Code Alignment Factor + .byte 0x78 ! sleb128 -8; CIE Data Alignment Factor + .byte 0xf ! CIE RA Column + .byte 0x1 ! uleb128 0x1; Augmentation size +#ifdef HAVE_AS_SPARC_UA_PCREL + .byte 0x1b ! FDE Encoding (pcrel sdata4) +#else + .byte 0x50 ! FDE Encoding (aligned absolute) +#endif + .byte 0xc ! DW_CFA_def_cfa + .byte 0xe ! uleb128 0xe + .byte 0xff,0xf ! uleb128 0x7ff + .align 8 +.LLECIE1: +.LLSFDE1: + .uaword .LLEFDE1-.LLASFDE1 ! FDE Length +.LLASFDE1: + .uaword .LLASFDE1-.LLframe1 ! FDE CIE offset +#ifdef HAVE_AS_SPARC_UA_PCREL + .uaword %r_disp32(.LLFB1) + .uaword .LLFE1-.LLFB1 ! FDE address range +#else + .align 8 + .xword .LLFB1 + .uaxword .LLFE1-.LLFB1 ! FDE address range +#endif + .byte 0x0 ! uleb128 0x0; Augmentation size + .byte 0x4 ! DW_CFA_advance_loc4 + .uaword .LLCFI0-.LLFB1 + .byte 0xd ! DW_CFA_def_cfa_register + .byte 0x1e ! uleb128 0x1e + .byte 0x2d ! DW_CFA_GNU_window_save + .byte 0x9 ! DW_CFA_register + .byte 0xf ! uleb128 0xf + .byte 0x1f ! uleb128 0x1f + .align 8 +.LLEFDE1: +.LLSFDE2: + .uaword .LLEFDE2-.LLASFDE2 ! FDE Length +.LLASFDE2: + .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset +#ifdef HAVE_AS_SPARC_UA_PCREL + .uaword %r_disp32(.LLFB2) + .uaword .LLFE2-.LLFB2 ! FDE address range +#else + .align 8 + .xword .LLFB2 + .uaxword .LLFE2-.LLFB2 ! FDE address range +#endif + .byte 0x0 ! uleb128 0x0; Augmentation size + .byte 0x4 ! DW_CFA_advance_loc4 + .uaword .LLCFI1-.LLFB2 + .byte 0xd ! DW_CFA_def_cfa_register + .byte 0x1e ! uleb128 0x1e + .byte 0x2d ! DW_CFA_GNU_window_save + .byte 0x9 ! DW_CFA_register + .byte 0xf ! uleb128 0xf + .byte 0x1f ! uleb128 0x1f + .align 8 +.LLEFDE2: +#endif + +#ifdef __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/types.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/types.c new file mode 100644 index 0000000..0a11eb0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/types.c @@ -0,0 +1,77 @@ +/* ----------------------------------------------------------------------- + types.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Predefined ffi_types needed by libffi. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* Hide the basic type definitions from the header file, so that we + can redefine them here as "const". */ +#define LIBFFI_HIDE_BASIC_TYPES + +#include +#include + +/* Type definitions */ + +#define FFI_TYPEDEF(name, type, id) \ +struct struct_align_##name { \ + char c; \ + type x; \ +}; \ +const ffi_type ffi_type_##name = { \ + sizeof(type), \ + offsetof(struct struct_align_##name, x), \ + id, NULL \ +} + +/* Size and alignment are fake here. They must not be 0. */ +const ffi_type ffi_type_void = { + 1, 1, FFI_TYPE_VOID, NULL +}; + +FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8); +FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8); +FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16); +FFI_TYPEDEF(sint16, SINT16, FFI_TYPE_SINT16); +FFI_TYPEDEF(uint32, UINT32, FFI_TYPE_UINT32); +FFI_TYPEDEF(sint32, SINT32, FFI_TYPE_SINT32); +FFI_TYPEDEF(uint64, UINT64, FFI_TYPE_UINT64); +FFI_TYPEDEF(sint64, SINT64, FFI_TYPE_SINT64); + +FFI_TYPEDEF(pointer, void*, FFI_TYPE_POINTER); + +FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT); +FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE); + +#ifdef __alpha__ +/* Even if we're not configured to default to 128-bit long double, + maintain binary compatibility, as -mlong-double-128 can be used + at any time. */ +/* Validate the hard-coded number below. */ +# if defined(__LONG_DOUBLE_128__) && FFI_TYPE_LONGDOUBLE != 4 +# error FFI_TYPE_LONGDOUBLE out of date +# endif +const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL }; +#elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE); +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin.S new file mode 100644 index 0000000..8f0f070 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin.S @@ -0,0 +1,444 @@ +/* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005 Red Hat, Inc. + Copyright (C) 2008 Free Software Foundation, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- + */ + +#ifndef __x86_64__ + +#define LIBFFI_ASM +#include +#include + +.text + +.globl _ffi_prep_args + + .align 4 +.globl _ffi_call_SYSV + +_ffi_call_SYSV: +.LFB1: + pushl %ebp +.LCFI0: + movl %esp,%ebp +.LCFI1: + subl $8,%esp + /* Make room for all of the new args. */ + movl 16(%ebp),%ecx + subl %ecx,%esp + + movl %esp,%eax + + /* Place all of the ffi_prep_args in position */ + subl $8,%esp + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + /* Return stack to previous state and call the function */ + addl $16,%esp + + call *28(%ebp) + + /* Load %ecx with the return type code */ + movl 20(%ebp),%ecx + + /* Protect %esi. We're going to pop it in the epilogue. */ + pushl %esi + + /* If the return value pointer is NULL, assume no return value. */ + cmpl $0,24(%ebp) + jne 0f + + /* Even if there is no space for the return value, we are + obliged to handle floating-point values. */ + cmpl $FFI_TYPE_FLOAT,%ecx + jne noretval + fstp %st(0) + + jmp epilogue +0: + .align 4 + call 1f +.Lstore_table: + .long noretval-.Lstore_table /* FFI_TYPE_VOID */ + .long retint-.Lstore_table /* FFI_TYPE_INT */ + .long retfloat-.Lstore_table /* FFI_TYPE_FLOAT */ + .long retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ + .long retlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long retuint8-.Lstore_table /* FFI_TYPE_UINT8 */ + .long retsint8-.Lstore_table /* FFI_TYPE_SINT8 */ + .long retuint16-.Lstore_table /* FFI_TYPE_UINT16 */ + .long retsint16-.Lstore_table /* FFI_TYPE_SINT16 */ + .long retint-.Lstore_table /* FFI_TYPE_UINT32 */ + .long retint-.Lstore_table /* FFI_TYPE_SINT32 */ + .long retint64-.Lstore_table /* FFI_TYPE_UINT64 */ + .long retint64-.Lstore_table /* FFI_TYPE_SINT64 */ + .long retstruct-.Lstore_table /* FFI_TYPE_STRUCT */ + .long retint-.Lstore_table /* FFI_TYPE_POINTER */ + .long retstruct1b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_1B */ + .long retstruct2b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_2B */ +1: + pop %esi + add (%esi, %ecx, 4), %esi + jmp *%esi + + /* Sign/zero extend as appropriate. */ +retsint8: + movsbl %al, %eax + jmp retint + +retsint16: + movswl %ax, %eax + jmp retint + +retuint8: + movzbl %al, %eax + jmp retint + +retuint16: + movzwl %ax, %eax + jmp retint + +retfloat: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstps (%ecx) + jmp epilogue + +retdouble: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpl (%ecx) + jmp epilogue + +retlongdouble: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpt (%ecx) + jmp epilogue + +retint64: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp epilogue + +retstruct1b: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movb %al,0(%ecx) + jmp epilogue + +retstruct2b: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movw %ax,0(%ecx) + jmp epilogue + +retint: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + +retstruct: + /* Nothing to do! */ + +noretval: +epilogue: + popl %esi + movl %ebp,%esp + popl %ebp + ret + +.LFE1: +.ffi_call_SYSV_end: + + .align 4 +FFI_HIDDEN (ffi_closure_SYSV) +.globl _ffi_closure_SYSV + +_ffi_closure_SYSV: +.LFB2: + pushl %ebp +.LCFI2: + movl %esp, %ebp +.LCFI3: + subl $40, %esp + leal -24(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ + movl %ebx, 8(%esp) +.LCFI7: + call L_ffi_closure_SYSV_inner$stub + movl 8(%esp), %ebx + movl -12(%ebp), %ecx + cmpl $FFI_TYPE_INT, %eax + je .Lcls_retint + + /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, + FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ + cmpl $FFI_TYPE_UINT64, %eax + jge 0f + cmpl $FFI_TYPE_UINT8, %eax + jge .Lcls_retint + +0: cmpl $FFI_TYPE_FLOAT, %eax + je .Lcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je .Lcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je .Lcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je .Lcls_retllong + cmpl $FFI_TYPE_SMALL_STRUCT_1B, %eax + je .Lcls_retstruct1b + cmpl $FFI_TYPE_SMALL_STRUCT_2B, %eax + je .Lcls_retstruct2b + cmpl $FFI_TYPE_STRUCT, %eax + je .Lcls_retstruct +.Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret +.Lcls_retint: + movl (%ecx), %eax + jmp .Lcls_epilogue +.Lcls_retfloat: + flds (%ecx) + jmp .Lcls_epilogue +.Lcls_retdouble: + fldl (%ecx) + jmp .Lcls_epilogue +.Lcls_retldouble: + fldt (%ecx) + jmp .Lcls_epilogue +.Lcls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp .Lcls_epilogue +.Lcls_retstruct1b: + movsbl (%ecx), %eax + jmp .Lcls_epilogue +.Lcls_retstruct2b: + movswl (%ecx), %eax + jmp .Lcls_epilogue +.Lcls_retstruct: + lea -8(%ebp),%esp + movl %ebp, %esp + popl %ebp + ret $4 +.LFE2: + +#if !FFI_NO_RAW_API + +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#define CIF_FLAGS_OFFSET 20 + + .align 4 +FFI_HIDDEN (ffi_closure_raw_SYSV) +.globl _ffi_closure_raw_SYSV + +_ffi_closure_raw_SYSV: +.LFB3: + pushl %ebp +.LCFI4: + movl %esp, %ebp +.LCFI5: + pushl %esi +.LCFI6: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ + cmpl $FFI_TYPE_INT, %eax + je .Lrcls_retint + + /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, + FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ + cmpl $FFI_TYPE_UINT64, %eax + jge 0f + cmpl $FFI_TYPE_UINT8, %eax + jge .Lrcls_retint +0: + cmpl $FFI_TYPE_FLOAT, %eax + je .Lrcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je .Lrcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je .Lrcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je .Lrcls_retllong +.Lrcls_epilogue: + addl $36, %esp + popl %esi + popl %ebp + ret +.Lrcls_retint: + movl -24(%ebp), %eax + jmp .Lrcls_epilogue +.Lrcls_retfloat: + flds -24(%ebp) + jmp .Lrcls_epilogue +.Lrcls_retdouble: + fldl -24(%ebp) + jmp .Lrcls_epilogue +.Lrcls_retldouble: + fldt -24(%ebp) + jmp .Lrcls_epilogue +.Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp .Lrcls_epilogue +.LFE3: +#endif + +.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 +L_ffi_closure_SYSV_inner$stub: + .indirect_symbol _ffi_closure_SYSV_inner + hlt ; hlt ; hlt ; hlt ; hlt + + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 +LSCIE1: + .long 0x0 + .byte 0x1 + .ascii "zR\0" + .byte 0x1 + .byte 0x7c + .byte 0x8 + .byte 0x1 + .byte 0x10 + .byte 0xc + .byte 0x5 + .byte 0x4 + .byte 0x88 + .byte 0x1 + .align 2 +LECIE1: +.globl _ffi_call_SYSV.eh +_ffi_call_SYSV.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 + .long .LFB1-. + .set L$set$2,.LFE1-.LFB1 + .long L$set$2 + .byte 0x0 + .byte 0x4 + .set L$set$3,.LCFI0-.LFB1 + .long L$set$3 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$4,.LCFI1-.LCFI0 + .long L$set$4 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE1: +.globl _ffi_closure_SYSV.eh +_ffi_closure_SYSV.eh: +LSFDE2: + .set L$set$5,LEFDE2-LASFDE2 + .long L$set$5 +LASFDE2: + .long LASFDE2-EH_frame1 + .long .LFB2-. + .set L$set$6,.LFE2-.LFB2 + .long L$set$6 + .byte 0x0 + .byte 0x4 + .set L$set$7,.LCFI2-.LFB2 + .long L$set$7 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$8,.LCFI3-.LCFI2 + .long L$set$8 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE2: + +#if !FFI_NO_RAW_API + +.globl _ffi_closure_raw_SYSV.eh +_ffi_closure_raw_SYSV.eh: +LSFDE3: + .set L$set$10,LEFDE3-LASFDE3 + .long L$set$10 +LASFDE3: + .long LASFDE3-EH_frame1 + .long .LFB3-. + .set L$set$11,.LFE3-.LFB3 + .long L$set$11 + .byte 0x0 + .byte 0x4 + .set L$set$12,.LCFI4-.LFB3 + .long L$set$12 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$13,.LCFI5-.LCFI4 + .long L$set$13 + .byte 0xd + .byte 0x4 + .byte 0x4 + .set L$set$14,.LCFI6-.LCFI5 + .long L$set$14 + .byte 0x85 + .byte 0x3 + .align 2 +LEFDE3: + +#endif + +#endif /* ifndef __x86_64__ */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin64.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin64.S new file mode 100644 index 0000000..2f7394e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin64.S @@ -0,0 +1,416 @@ +/* ----------------------------------------------------------------------- + darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. + Copyright (c) 2008 Red Hat, Inc. + derived from unix64.S + + x86-64 Foreign Function Interface for Darwin. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include +#include + + .file "darwin64.S" +.text + +/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)(void)); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 3 + .globl _ffi_call_unix64 + +_ffi_call_unix64: +LUW0: + movq (%rsp), %r10 /* Load return address. */ + leaq (%rdi, %rsi), %rax /* Find local stack base. */ + movq %rdx, (%rax) /* Save flags. */ + movq %rcx, 8(%rax) /* Save raddr. */ + movq %rbp, 16(%rax) /* Save old frame pointer. */ + movq %r10, 24(%rax) /* Relocate return address. */ + movq %rax, %rbp /* Finalize local stack frame. */ +LUW1: + movq %rdi, %r10 /* Save a copy of the register area. */ + movq %r8, %r11 /* Save a copy of the target fn. */ + movl %r9d, %eax /* Set number of SSE registers. */ + + /* Load up all argument registers. */ + movq (%r10), %rdi + movq 8(%r10), %rsi + movq 16(%r10), %rdx + movq 24(%r10), %rcx + movq 32(%r10), %r8 + movq 40(%r10), %r9 + testl %eax, %eax + jnz Lload_sse +Lret_from_load_sse: + + /* Deallocate the reg arg area. */ + leaq 176(%r10), %rsp + + /* Call the user function. */ + call *%r11 + + /* Deallocate stack arg area; local stack frame in redzone. */ + leaq 24(%rbp), %rsp + + movq 0(%rbp), %rcx /* Reload flags. */ + movq 8(%rbp), %rdi /* Reload raddr. */ + movq 16(%rbp), %rbp /* Reload old frame pointer. */ +LUW2: + + /* The first byte of the flags contains the FFI_TYPE. */ + movzbl %cl, %r10d + leaq Lstore_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lstore_table: + .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ + .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ + .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ + .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ + .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ + .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ + .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ + .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ + .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ + .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lst_void: + ret + .align 3 +Lst_uint8: + movzbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_sint8: + movsbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint16: + movzwq %ax, %rax + movq %rax, (%rdi) + .align 3 +Lst_sint16: + movswq %ax, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint32: + movl %eax, %eax + movq %rax, (%rdi) + .align 3 +Lst_sint32: + cltq + movq %rax, (%rdi) + ret + .align 3 +Lst_int64: + movq %rax, (%rdi) + ret + .align 3 +Lst_float: + movss %xmm0, (%rdi) + ret + .align 3 +Lst_double: + movsd %xmm0, (%rdi) + ret +Lst_ldouble: + fstpt (%rdi) + ret + .align 3 +Lst_struct: + leaq -20(%rsp), %rsi /* Scratch area in redzone. */ + + /* We have to locate the values now, and since we don't want to + write too much data into the user's return value, we spill the + value to a 16 byte scratch area first. Bits 8, 9, and 10 + control where the values are located. Only one of the three + bits will be set; see ffi_prep_cif_machdep for the pattern. */ + movd %xmm0, %r10 + movd %xmm1, %r11 + testl $0x100, %ecx + cmovnz %rax, %rdx + cmovnz %r10, %rax + testl $0x200, %ecx + cmovnz %r10, %rdx + testl $0x400, %ecx + cmovnz %r10, %rax + cmovnz %r11, %rdx + movq %rax, (%rsi) + movq %rdx, 8(%rsi) + + /* Bits 12-31 contain the true size of the structure. Copy from + the scratch area to the true destination. */ + shrl $12, %ecx + rep movsb + ret + + /* Many times we can avoid loading any SSE registers at all. + It's not worth an indirect jump to load the exact set of + SSE registers needed; zero or all is a good compromise. */ + .align 3 +LUW3: +Lload_sse: + movdqa 48(%r10), %xmm0 + movdqa 64(%r10), %xmm1 + movdqa 80(%r10), %xmm2 + movdqa 96(%r10), %xmm3 + movdqa 112(%r10), %xmm4 + movdqa 128(%r10), %xmm5 + movdqa 144(%r10), %xmm6 + movdqa 160(%r10), %xmm7 + jmp Lret_from_load_sse + +LUW4: + .align 3 + .globl _ffi_closure_unix64 + +_ffi_closure_unix64: +LUW5: + /* The carry flag is set by the trampoline iff SSE registers + are used. Don't clobber it before the branch instruction. */ + leaq -200(%rsp), %rsp +LUW6: + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + movq %rdx, 16(%rsp) + movq %rcx, 24(%rsp) + movq %r8, 32(%rsp) + movq %r9, 40(%rsp) + jc Lsave_sse +Lret_from_save_sse: + + movq %r10, %rdi + leaq 176(%rsp), %rsi + movq %rsp, %rdx + leaq 208(%rsp), %rcx + call _ffi_closure_unix64_inner + + /* Deallocate stack frame early; return value is now in redzone. */ + addq $200, %rsp +LUW7: + + /* The first byte of the return value contains the FFI_TYPE. */ + movzbl %al, %r10d + leaq Lload_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lload_table: + .long Lld_void-Lload_table /* FFI_TYPE_VOID */ + .long Lld_int32-Lload_table /* FFI_TYPE_INT */ + .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ + .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ + .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ + .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ + .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ + .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ + .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ + .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ + .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ + .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ + .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ + .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ + .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lld_void: + ret + .align 3 +Lld_int8: + movzbl -24(%rsp), %eax + ret + .align 3 +Lld_int16: + movzwl -24(%rsp), %eax + ret + .align 3 +Lld_int32: + movl -24(%rsp), %eax + ret + .align 3 +Lld_int64: + movq -24(%rsp), %rax + ret + .align 3 +Lld_float: + movss -24(%rsp), %xmm0 + ret + .align 3 +Lld_double: + movsd -24(%rsp), %xmm0 + ret + .align 3 +Lld_ldouble: + fldt -24(%rsp) + ret + .align 3 +Lld_struct: + /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, + %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading + both rdx and xmm1 with the second word. For the remaining, + bit 8 set means xmm0 gets the second word, and bit 9 means + that rax gets the second word. */ + movq -24(%rsp), %rcx + movq -16(%rsp), %rdx + movq -16(%rsp), %xmm1 + testl $0x100, %eax + cmovnz %rdx, %rcx + movd %rcx, %xmm0 + testl $0x200, %eax + movq -24(%rsp), %rax + cmovnz %rdx, %rax + ret + + /* See the comment above Lload_sse; the same logic applies here. */ + .align 3 +LUW8: +Lsave_sse: + movdqa %xmm0, 48(%rsp) + movdqa %xmm1, 64(%rsp) + movdqa %xmm2, 80(%rsp) + movdqa %xmm3, 96(%rsp) + movdqa %xmm4, 112(%rsp) + movdqa %xmm5, 128(%rsp) + movdqa %xmm6, 144(%rsp) + movdqa %xmm7, 160(%rsp) + jmp Lret_from_save_sse + +LUW9: +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ + .long L$set$0 +LSCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ + .byte 0x10 /* CIE RA Column */ + .byte 0x1 /* uleb128 0x1; Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel sdata4) */ + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 /* uleb128 0x7 */ + .byte 0x8 /* uleb128 0x8 */ + .byte 0x90 /* DW_CFA_offset, column 0x10 */ + .byte 0x1 + .align 3 +LECIE1: + .globl _ffi_call_unix64.eh +_ffi_call_unix64.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 /* FDE CIE offset */ + .quad LUW0-. /* FDE initial location */ + .set L$set$2,LUW4-LUW0 /* FDE address range */ + .quad L$set$2 + .byte 0x0 /* Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$3,LUW1-LUW0 + .long L$set$3 + + /* New stack frame based off rbp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-8, so from the + perspective of the unwind info, it hasn't moved. */ + .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ + .byte 0x6 + .byte 0x20 + .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ + .byte 0x2 + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$4,LUW2-LUW1 + .long L$set$4 + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 + .byte 0x8 + .byte 0xc0+6 /* DW_CFA_restore, %rbp */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$5,LUW3-LUW2 + .long L$set$5 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE1: + .globl _ffi_closure_unix64.eh +_ffi_closure_unix64.eh: +LSFDE3: + .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ + .long L$set$6 +LASFDE3: + .long LASFDE3-EH_frame1 /* FDE CIE offset */ + .quad LUW5-. /* FDE initial location */ + .set L$set$7,LUW9-LUW5 /* FDE address range */ + .quad L$set$7 + .byte 0x0 /* Augmentation size */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$8,LUW6-LUW5 + .long L$set$8 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 208,1 /* uleb128 208 */ + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$9,LUW7-LUW6 + .long L$set$9 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$10,LUW8-LUW7 + .long L$set$10 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE3: + .subsections_via_symbols + +#endif /* __x86_64__ */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c new file mode 100644 index 0000000..34f9c66 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c @@ -0,0 +1,644 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc. + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2002 Bo Thorsen + Copyright (c) 2002 Roger Sayle + Copyright (C) 2008, 2010 Free Software Foundation, Inc. + + x86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#if !defined(__x86_64__) || defined(_WIN64) + +#ifdef _WIN64 +#include +#endif + +#include +#include + +#include + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if (ecif->cif->flags == FFI_TYPE_STRUCT +#ifdef X86_WIN64 + && (ecif->cif->rtype->size != 1 && ecif->cif->rtype->size != 2 + && ecif->cif->rtype->size != 4 && ecif->cif->rtype->size != 8) +#endif + ) + { + *(void **) argp = ecif->rvalue; + argp += sizeof(void*); + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(void*) - 1) & (size_t) argp) + argp = (char *) ALIGN(argp, sizeof(void*)); + + z = (*p_arg)->size; +#ifdef X86_WIN64 + if (z > sizeof(ffi_arg) + || ((*p_arg)->type == FFI_TYPE_STRUCT + && (z != 1 && z != 2 && z != 4 && z != 8)) +#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE + || ((*p_arg)->type == FFI_TYPE_LONGDOUBLE) +#endif + ) + { + z = sizeof(ffi_arg); + *(void **)argp = *p_argv; + } + else if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + memcpy(argp, *p_argv, z); + } + else +#endif + if (z < sizeof(ffi_arg)) + { + z = sizeof(ffi_arg); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(ffi_sarg *) argp = (ffi_sarg)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(ffi_arg *) argp = (ffi_arg)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(ffi_sarg *) argp = (ffi_sarg)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(ffi_arg *) argp = (ffi_arg)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(ffi_sarg *) argp = (ffi_sarg)*(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: + *(ffi_arg *) argp = (ffi_arg)*(UINT32 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(ffi_arg *) argp = *(ffi_arg *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; +#ifdef X86_WIN64 + argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1); +#else + argp += z; +#endif + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + unsigned int i; + ffi_type **ptr; + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: +#ifdef X86_WIN64 + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: +#endif + case FFI_TYPE_SINT64: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: +#ifndef X86_WIN64 +#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE + case FFI_TYPE_LONGDOUBLE: +#endif +#endif + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_UINT64: +#ifdef X86_WIN64 + case FFI_TYPE_POINTER: +#endif + cif->flags = FFI_TYPE_SINT64; + break; + + case FFI_TYPE_STRUCT: +#ifndef X86 + if (cif->rtype->size == 1) + { + cif->flags = FFI_TYPE_SMALL_STRUCT_1B; /* same as char size */ + } + else if (cif->rtype->size == 2) + { + cif->flags = FFI_TYPE_SMALL_STRUCT_2B; /* same as short size */ + } + else if (cif->rtype->size == 4) + { +#ifdef X86_WIN64 + cif->flags = FFI_TYPE_SMALL_STRUCT_4B; +#else + cif->flags = FFI_TYPE_INT; /* same as int type */ +#endif + } + else if (cif->rtype->size == 8) + { + cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ + } + else +#endif + { + cif->flags = FFI_TYPE_STRUCT; + /* allocate space for return value pointer */ + cif->bytes += ALIGN(sizeof(void*), FFI_SIZEOF_ARG); + } + break; + + default: +#ifdef X86_WIN64 + cif->flags = FFI_TYPE_SINT64; + break; + case FFI_TYPE_INT: + cif->flags = FFI_TYPE_SINT32; +#else + cif->flags = FFI_TYPE_INT; +#endif + break; + } + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + if (((*ptr)->alignment - 1) & cif->bytes) + cif->bytes = ALIGN(cif->bytes, (*ptr)->alignment); + cif->bytes += ALIGN((*ptr)->size, FFI_SIZEOF_ARG); + } + +#ifdef X86_WIN64 + /* ensure space for storing four registers */ + cif->bytes += 4 * sizeof(ffi_arg); +#endif + +#ifdef X86_DARWIN + cif->bytes = (cif->bytes + 15) & ~0xF; +#endif + + return FFI_OK; +} + +#ifdef X86_WIN64 +extern int +ffi_call_win64(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)(void)); +#elif defined(X86_WIN32) +extern void +ffi_call_win32(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)(void)); +#else +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)(void)); +#endif + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + +#ifdef X86_WIN64 + if (rvalue == NULL + && cif->flags == FFI_TYPE_STRUCT + && cif->rtype->size != 1 && cif->rtype->size != 2 + && cif->rtype->size != 4 && cif->rtype->size != 8) + { + ecif.rvalue = alloca((cif->rtype->size + 0xF) & ~0xF); + } +#else + if (rvalue == NULL + && cif->flags == FFI_TYPE_STRUCT) + { + ecif.rvalue = alloca(cif->rtype->size); + } +#endif + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { +#ifdef X86_WIN64 + case FFI_WIN64: + ffi_call_win64(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; +#elif defined(X86_WIN32) + case FFI_SYSV: + case FFI_STDCALL: + ffi_call_win32(ffi_prep_args, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#else + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, + fn); + break; +#endif + default: + FFI_ASSERT(0); + break; + } +} + + +/** private members **/ + +/* The following __attribute__((regparm(1))) decorations will have no effect + on MSVC - standard cdecl convention applies. */ +static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif); +void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) + __attribute__ ((regparm(1))); +unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) + __attribute__ ((regparm(1))); +void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) + __attribute__ ((regparm(1))); +#ifdef X86_WIN32 +void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *) + __attribute__ ((regparm(1))); +#endif +#ifdef X86_WIN64 +void FFI_HIDDEN ffi_closure_win64 (ffi_closure *); +#endif + +/* This function is jumped to by the trampoline */ + +#ifdef X86_WIN64 +void * FFI_HIDDEN +ffi_closure_win64_inner (ffi_closure *closure, void *args) { + ffi_cif *cif; + void **arg_area; + void *result; + void *resp = &result; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will change RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, &resp, arg_area, cif); + + (closure->fun) (cif, resp, arg_area, closure->user_data); + + /* The result is returned in rax. This does the right thing for + result types except for floats; we have to 'mov xmm0, rax' in the + caller to correct this. + TODO: structure sizes of 3 5 6 7 are returned by reference, too!!! + */ + return cif->rtype->size > sizeof(void *) ? resp : *(void **)resp; +} + +#else +unsigned int FFI_HIDDEN __attribute__ ((regparm(1))) +ffi_closure_SYSV_inner (ffi_closure *closure, void **respp, void *args) +{ + /* our various things... */ + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will change RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); + + (closure->fun) (cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} +#endif /* !X86_WIN64 */ + +static void +ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, + ffi_cif *cif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + +#ifdef X86_WIN64 + if (cif->rtype->size > sizeof(ffi_arg) + || (cif->flags == FFI_TYPE_STRUCT + && (cif->rtype->size != 1 && cif->rtype->size != 2 + && cif->rtype->size != 4 && cif->rtype->size != 8))) { + *rvalue = *(void **) argp; + argp += sizeof(void *); + } +#else + if ( cif->flags == FFI_TYPE_STRUCT ) { + *rvalue = *(void **) argp; + argp += sizeof(void *); + } +#endif + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(void*) - 1) & (size_t) argp) { + argp = (char *) ALIGN(argp, sizeof(void*)); + } + +#ifdef X86_WIN64 + if ((*p_arg)->size > sizeof(ffi_arg) + || ((*p_arg)->type == FFI_TYPE_STRUCT + && ((*p_arg)->size != 1 && (*p_arg)->size != 2 + && (*p_arg)->size != 4 && (*p_arg)->size != 8))) + { + z = sizeof(void *); + *p_argv = *(void **)argp; + } + else +#endif + { + z = (*p_arg)->size; + + /* because we're little endian, this is what it turns into. */ + + *p_argv = (void*) argp; + } + + p_argv++; +#ifdef X86_WIN64 + argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1); +#else + argp += z; +#endif + } + + return; +} + +#define FFI_INIT_TRAMPOLINE_WIN64(TRAMP,FUN,CTX,MASK) \ +{ unsigned char *__tramp = (unsigned char*)(TRAMP); \ + void* __fun = (void*)(FUN); \ + void* __ctx = (void*)(CTX); \ + *(unsigned char*) &__tramp[0] = 0x41; \ + *(unsigned char*) &__tramp[1] = 0xbb; \ + *(unsigned int*) &__tramp[2] = MASK; /* mov $mask, %r11 */ \ + *(unsigned char*) &__tramp[6] = 0x48; \ + *(unsigned char*) &__tramp[7] = 0xb8; \ + *(void**) &__tramp[8] = __ctx; /* mov __ctx, %rax */ \ + *(unsigned char *) &__tramp[16] = 0x49; \ + *(unsigned char *) &__tramp[17] = 0xba; \ + *(void**) &__tramp[18] = __fun; /* mov __fun, %r10 */ \ + *(unsigned char *) &__tramp[26] = 0x41; \ + *(unsigned char *) &__tramp[27] = 0xff; \ + *(unsigned char *) &__tramp[28] = 0xe2; /* jmp %r10 */ \ + } + +/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ + +#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ +{ unsigned char *__tramp = (unsigned char*)(TRAMP); \ + unsigned int __fun = (unsigned int)(FUN); \ + unsigned int __ctx = (unsigned int)(CTX); \ + unsigned int __dis = __fun - (__ctx + 10); \ + *(unsigned char*) &__tramp[0] = 0xb8; \ + *(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ + *(unsigned char *) &__tramp[5] = 0xe9; \ + *(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ + } + +#define FFI_INIT_TRAMPOLINE_STDCALL(TRAMP,FUN,CTX,SIZE) \ +{ unsigned char *__tramp = (unsigned char*)(TRAMP); \ + unsigned int __fun = (unsigned int)(FUN); \ + unsigned int __ctx = (unsigned int)(CTX); \ + unsigned int __dis = __fun - (__ctx + 10); \ + unsigned short __size = (unsigned short)(SIZE); \ + *(unsigned char*) &__tramp[0] = 0xb8; \ + *(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ + *(unsigned char *) &__tramp[5] = 0xe8; \ + *(unsigned int*) &__tramp[6] = __dis; /* call __fun */ \ + *(unsigned char *) &__tramp[10] = 0xc2; \ + *(unsigned short*) &__tramp[11] = __size; /* ret __size */ \ + } + +/* the cif must already be prep'ed */ + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ +#ifdef X86_WIN64 +#define ISFLOAT(IDX) (cif->arg_types[IDX]->type == FFI_TYPE_FLOAT || cif->arg_types[IDX]->type == FFI_TYPE_DOUBLE) +#define FLAG(IDX) (cif->nargs>(IDX)&&ISFLOAT(IDX)?(1<<(IDX)):0) + if (cif->abi == FFI_WIN64) + { + int mask = FLAG(0)|FLAG(1)|FLAG(2)|FLAG(3); + FFI_INIT_TRAMPOLINE_WIN64 (&closure->tramp[0], + &ffi_closure_win64, + codeloc, mask); + /* make sure we can execute here */ + } +#else + if (cif->abi == FFI_SYSV) + { + FFI_INIT_TRAMPOLINE (&closure->tramp[0], + &ffi_closure_SYSV, + (void*)codeloc); + } +#ifdef X86_WIN32 + else if (cif->abi == FFI_STDCALL) + { + FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0], + &ffi_closure_STDCALL, + (void*)codeloc, cif->bytes); + } +#endif /* X86_WIN32 */ +#endif /* !X86_WIN64 */ + else + { + return FFI_BAD_ABI; + } + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +/* ------- Native raw API support -------------------------------- */ + +#if !FFI_NO_RAW_API + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + int i; + + if (cif->abi != FFI_SYSV) { + return FFI_BAD_ABI; + } + + /* we currently don't support certain kinds of arguments for raw + closures. This should be implemented by a separate assembly + language routine, since it would require argument processing, + something we don't do now for performance. */ + + for (i = cif->nargs-1; i >= 0; i--) + { + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); + } + + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, + codeloc); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +static void +ffi_prep_args_raw(char *stack, extended_cif *ecif) +{ + memcpy (stack, ecif->avalue, ecif->cif->bytes); +} + +/* we borrow this routine from libffi (it must be changed, though, to + * actually call the function passed in the first argument. as of + * libffi-1.20, this is not the case.) + */ + +void +ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue) +{ + extended_cif ecif; + void **avalue = (void **)fake_avalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { +#ifdef X86_WIN32 + case FFI_SYSV: + case FFI_STDCALL: + ffi_call_win32(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#else + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif + default: + FFI_ASSERT(0); + break; + } +} + +#endif + +#endif /* !__x86_64__ || X86_WIN64 */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi64.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi64.c new file mode 100644 index 0000000..c8eb455 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi64.c @@ -0,0 +1,635 @@ +/* ----------------------------------------------------------------------- + ffi64.c - Copyright (c) 20011 Anthony Green + Copyright (c) 2008, 2010 Red Hat, Inc. + Copyright (c) 2002, 2007 Bo Thorsen + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +#ifdef __x86_64__ + +#define MAX_GPR_REGS 6 +#define MAX_SSE_REGS 8 + +struct register_args +{ + /* Registers for argument passing. */ + UINT64 gpr[MAX_GPR_REGS]; + __int128_t sse[MAX_SSE_REGS]; +}; + +extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)(void), unsigned ssecount); + +/* All reference to register classes here is identical to the code in + gcc/config/i386/i386.c. Do *not* change one without the other. */ + +/* Register class used for passing given 64bit part of the argument. + These represent classes as documented by the PS ABI, with the + exception of SSESF, SSEDF classes, that are basically SSE class, + just gcc will use SF or DFmode move instead of DImode to avoid + reformatting penalties. + + Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + whenever possible (upper half does contain padding). */ +enum x86_64_reg_class + { + X86_64_NO_CLASS, + X86_64_INTEGER_CLASS, + X86_64_INTEGERSI_CLASS, + X86_64_SSE_CLASS, + X86_64_SSESF_CLASS, + X86_64_SSEDF_CLASS, + X86_64_SSEUP_CLASS, + X86_64_X87_CLASS, + X86_64_X87UP_CLASS, + X86_64_COMPLEX_X87_CLASS, + X86_64_MEMORY_CLASS + }; + +#define MAX_CLASSES 4 + +#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) + +/* x86-64 register passing implementation. See x86-64 ABI for details. Goal + of this code is to classify each 8bytes of incoming argument by the register + class and assign registers accordingly. */ + +/* Return the union class of CLASS1 and CLASS2. + See the x86-64 PS ABI for details. */ + +static enum x86_64_reg_class +merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2) +{ + /* Rule #1: If both classes are equal, this is the resulting class. */ + if (class1 == class2) + return class1; + + /* Rule #2: If one of the classes is NO_CLASS, the resulting class is + the other class. */ + if (class1 == X86_64_NO_CLASS) + return class2; + if (class2 == X86_64_NO_CLASS) + return class1; + + /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ + if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ + if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) + || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) + return X86_64_INTEGERSI_CLASS; + if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS + || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) + return X86_64_INTEGER_CLASS; + + /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, + MEMORY is used. */ + if (class1 == X86_64_X87_CLASS + || class1 == X86_64_X87UP_CLASS + || class1 == X86_64_COMPLEX_X87_CLASS + || class2 == X86_64_X87_CLASS + || class2 == X86_64_X87UP_CLASS + || class2 == X86_64_COMPLEX_X87_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #6: Otherwise class SSE is used. */ + return X86_64_SSE_CLASS; +} + +/* Classify the argument of type TYPE and mode MODE. + CLASSES will be filled by the register class used to pass each word + of the operand. The number of words is returned. In case the parameter + should be passed in memory, 0 is returned. As a special case for zero + sized containers, classes[0] will be NO_CLASS and 1 is returned. + + See the x86-64 PS ABI for details. +*/ +static int +classify_argument (ffi_type *type, enum x86_64_reg_class classes[], + size_t byte_offset) +{ + switch (type->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + { + int size = byte_offset + type->size; + + if (size <= 4) + { + classes[0] = X86_64_INTEGERSI_CLASS; + return 1; + } + else if (size <= 8) + { + classes[0] = X86_64_INTEGER_CLASS; + return 1; + } + else if (size <= 12) + { + classes[0] = X86_64_INTEGER_CLASS; + classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else if (size <= 16) + { + classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else + FFI_ASSERT (0); + } + case FFI_TYPE_FLOAT: + if (!(byte_offset % 8)) + classes[0] = X86_64_SSESF_CLASS; + else + classes[0] = X86_64_SSE_CLASS; + return 1; + case FFI_TYPE_DOUBLE: + classes[0] = X86_64_SSEDF_CLASS; + return 1; + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_X87_CLASS; + classes[1] = X86_64_X87UP_CLASS; + return 2; + case FFI_TYPE_STRUCT: + { + const int UNITS_PER_WORD = 8; + int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + ffi_type **ptr; + int i; + enum x86_64_reg_class subclasses[MAX_CLASSES]; + + /* If the struct is larger than 32 bytes, pass it on the stack. */ + if (type->size > 32) + return 0; + + for (i = 0; i < words; i++) + classes[i] = X86_64_NO_CLASS; + + /* Zero sized arrays or structures are NO_CLASS. We return 0 to + signalize memory class, so handle it as special case. */ + if (!words) + { + classes[0] = X86_64_NO_CLASS; + return 1; + } + + /* Merge the fields of structure. */ + for (ptr = type->elements; *ptr != NULL; ptr++) + { + int num; + + byte_offset = ALIGN (byte_offset, (*ptr)->alignment); + + num = classify_argument (*ptr, subclasses, byte_offset % 8); + if (num == 0) + return 0; + for (i = 0; i < num; i++) + { + int pos = byte_offset / 8; + classes[i + pos] = + merge_classes (subclasses[i], classes[i + pos]); + } + + byte_offset += (*ptr)->size; + } + + if (words > 2) + { + /* When size > 16 bytes, if the first one isn't + X86_64_SSE_CLASS or any other ones aren't + X86_64_SSEUP_CLASS, everything should be passed in + memory. */ + if (classes[0] != X86_64_SSE_CLASS) + return 0; + + for (i = 1; i < words; i++) + if (classes[i] != X86_64_SSEUP_CLASS) + return 0; + } + + /* Final merger cleanup. */ + for (i = 0; i < words; i++) + { + /* If one class is MEMORY, everything should be passed in + memory. */ + if (classes[i] == X86_64_MEMORY_CLASS) + return 0; + + /* The X86_64_SSEUP_CLASS should be always preceded by + X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */ + if (classes[i] == X86_64_SSEUP_CLASS + && classes[i - 1] != X86_64_SSE_CLASS + && classes[i - 1] != X86_64_SSEUP_CLASS) + { + /* The first one should never be X86_64_SSEUP_CLASS. */ + FFI_ASSERT (i != 0); + classes[i] = X86_64_SSE_CLASS; + } + + /* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS, + everything should be passed in memory. */ + if (classes[i] == X86_64_X87UP_CLASS + && (classes[i - 1] != X86_64_X87_CLASS)) + { + /* The first one should never be X86_64_X87UP_CLASS. */ + FFI_ASSERT (i != 0); + return 0; + } + } + return words; + } + + default: + FFI_ASSERT(0); + } + return 0; /* Never reached. */ +} + +/* Examine the argument and return set number of register required in each + class. Return zero iff parameter should be passed in memory, otherwise + the number of registers. */ + +static int +examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES], + _Bool in_return, int *pngpr, int *pnsse) +{ + int i, n, ngpr, nsse; + + n = classify_argument (type, classes, 0); + if (n == 0) + return 0; + + ngpr = nsse = 0; + for (i = 0; i < n; ++i) + switch (classes[i]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + ngpr++; + break; + case X86_64_SSE_CLASS: + case X86_64_SSESF_CLASS: + case X86_64_SSEDF_CLASS: + nsse++; + break; + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + case X86_64_X87_CLASS: + case X86_64_X87UP_CLASS: + case X86_64_COMPLEX_X87_CLASS: + return in_return != 0; + default: + abort (); + } + + *pngpr = ngpr; + *pnsse = nsse; + + return n; +} + +/* Perform machine dependent cif processing. */ + +ffi_status +ffi_prep_cif_machdep (ffi_cif *cif) +{ + int gprcount, ssecount, i, avn, n, ngpr, nsse, flags; + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t bytes; + + gprcount = ssecount = 0; + + flags = cif->rtype->type; + if (flags != FFI_TYPE_VOID) + { + n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + if (n == 0) + { + /* The return value is passed in memory. A pointer to that + memory is the first argument. Allocate a register for it. */ + gprcount++; + /* We don't have to do anything in asm for the return. */ + flags = FFI_TYPE_VOID; + } + else if (flags == FFI_TYPE_STRUCT) + { + /* Mark which registers the result appears in. */ + _Bool sse0 = SSE_CLASS_P (classes[0]); + _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]); + if (sse0 && !sse1) + flags |= 1 << 8; + else if (!sse0 && sse1) + flags |= 1 << 9; + else if (sse0 && sse1) + flags |= 1 << 10; + /* Mark the true size of the structure. */ + flags |= cif->rtype->size << 12; + } + } + + /* Go over all arguments and determine the way they should be passed. + If it's in a register and there is space for it, let that be so. If + not, add it's size to the stack byte count. */ + for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) + { + if (examine_argument (cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = cif->arg_types[i]->alignment; + + if (align < 8) + align = 8; + + bytes = ALIGN (bytes, align); + bytes += cif->arg_types[i]->size; + } + else + { + gprcount += ngpr; + ssecount += nsse; + } + } + if (ssecount) + flags |= 1 << 11; + cif->flags = flags; + cif->bytes = ALIGN (bytes, 8); + + return FFI_OK; +} + +void +ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + enum x86_64_reg_class classes[MAX_CLASSES]; + char *stack, *argp; + ffi_type **arg_types; + int gprcount, ssecount, ngpr, nsse, i, avn; + _Bool ret_in_memory; + struct register_args *reg_args; + + /* Can't call 32-bit mode from 64-bit mode. */ + FFI_ASSERT (cif->abi == FFI_UNIX64); + + /* If the return value is a struct and we don't have a return value + address then we need to make one. Note the setting of flags to + VOID above in ffi_prep_cif_machdep. */ + ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT + && (cif->flags & 0xff) == FFI_TYPE_VOID); + if (rvalue == NULL && ret_in_memory) + rvalue = alloca (cif->rtype->size); + + /* Allocate the space for the arguments, plus 4 words of temp space. */ + stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8); + reg_args = (struct register_args *) stack; + argp = stack + sizeof (struct register_args); + + gprcount = ssecount = 0; + + /* If the return value is passed in memory, add the pointer as the + first integer argument. */ + if (ret_in_memory) + reg_args->gpr[gprcount++] = (long) rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + size_t size = arg_types[i]->size; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + memcpy (argp, avalue[i], size); + argp += size; + } + else + { + /* The argument is passed entirely in registers. */ + char *a = (char *) avalue[i]; + int j; + + for (j = 0; j < n; j++, a += 8, size -= 8) + { + switch (classes[j]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + reg_args->gpr[gprcount] = 0; + memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); + gprcount++; + break; + case X86_64_SSE_CLASS: + case X86_64_SSEDF_CLASS: + reg_args->sse[ssecount++] = *(UINT64 *) a; + break; + case X86_64_SSESF_CLASS: + reg_args->sse[ssecount++] = *(UINT32 *) a; + break; + default: + abort(); + } + } + } + } + + ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args), + cif->flags, rvalue, fn, ssecount); +} + + +extern void ffi_closure_unix64(void); + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + volatile unsigned short *tramp; + + /* Sanity check on the cif ABI. */ + { + int abi = cif->abi; + if (UNLIKELY (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI))) + return FFI_BAD_ABI; + } + + tramp = (volatile unsigned short *) &closure->tramp[0]; + + tramp[0] = 0xbb49; /* mov , %r11 */ + *(void * volatile *) &tramp[1] = ffi_closure_unix64; + tramp[5] = 0xba49; /* mov , %r10 */ + *(void * volatile *) &tramp[6] = codeloc; + + /* Set the carry bit iff the function uses any sse registers. + This is clc or stc, together with the first byte of the jmp. */ + tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; + + tramp[11] = 0xe3ff; /* jmp *%r11 */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +int +ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue, + struct register_args *reg_args, char *argp) +{ + ffi_cif *cif; + void **avalue; + ffi_type **arg_types; + long i, avn; + int gprcount, ssecount, ngpr, nsse; + int ret; + + cif = closure->cif; + avalue = alloca(cif->nargs * sizeof(void *)); + gprcount = ssecount = 0; + + ret = cif->rtype->type; + if (ret != FFI_TYPE_VOID) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + if (n == 0) + { + /* The return value goes in memory. Arrange for the closure + return value to go directly back to the original caller. */ + rvalue = (void *) reg_args->gpr[gprcount++]; + /* We don't have to do anything in asm for the return. */ + ret = FFI_TYPE_VOID; + } + else if (ret == FFI_TYPE_STRUCT && n == 2) + { + /* Mark which register the second word of the structure goes in. */ + _Bool sse0 = SSE_CLASS_P (classes[0]); + _Bool sse1 = SSE_CLASS_P (classes[1]); + if (!sse0 && sse1) + ret |= 1 << 8; + else if (sse0 && !sse1) + ret |= 1 << 9; + } + } + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + avalue[i] = argp; + argp += arg_types[i]->size; + } + /* If the argument is in a single register, or two consecutive + integer registers, then we can use that address directly. */ + else if (n == 1 + || (n == 2 && !(SSE_CLASS_P (classes[0]) + || SSE_CLASS_P (classes[1])))) + { + /* The argument is in a single register. */ + if (SSE_CLASS_P (classes[0])) + { + avalue[i] = ®_args->sse[ssecount]; + ssecount += n; + } + else + { + avalue[i] = ®_args->gpr[gprcount]; + gprcount += n; + } + } + /* Otherwise, allocate space to make them consecutive. */ + else + { + char *a = alloca (16); + int j; + + avalue[i] = a; + for (j = 0; j < n; j++, a += 8) + { + if (SSE_CLASS_P (classes[j])) + memcpy (a, ®_args->sse[ssecount++], 8); + else + memcpy (a, ®_args->gpr[gprcount++], 8); + } + } + } + + /* Invoke the closure. */ + closure->fun (cif, rvalue, avalue, closure->user_data); + + /* Tell assembly how to perform return type promotions. */ + return ret; +} + +#endif /* __x86_64__ */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffitarget.h new file mode 100644 index 0000000..542e6d4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffitarget.h @@ -0,0 +1,121 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 1996-2003, 2010 Red Hat, Inc. + Copyright (C) 2008 Free Software Foundation, Inc. + + Target configuration macros for x86 and x86-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +/* For code common to all platforms on x86 and x86_64. */ +#define X86_ANY + +#if defined (X86_64) && defined (__i386__) +#undef X86_64 +#define X86 +#endif + +#ifdef X86_WIN64 +#define FFI_SIZEOF_ARG 8 +#define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */ +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM +#ifdef X86_WIN64 +#ifdef _MSC_VER +typedef unsigned __int64 ffi_arg; +typedef __int64 ffi_sarg; +#else +typedef unsigned long long ffi_arg; +typedef long long ffi_sarg; +#endif +#else +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; +#endif + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + + /* ---- Intel x86 Win32 ---------- */ +#ifdef X86_WIN32 + FFI_SYSV, + FFI_STDCALL, + FFI_LAST_ABI, + /* TODO: Add fastcall support for the sake of completeness */ + FFI_DEFAULT_ABI = FFI_SYSV + +#elif defined(X86_WIN64) + FFI_WIN64, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_WIN64 + +#else + /* ---- Intel x86 and AMD x86-64 - */ + FFI_SYSV, + FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ + FFI_LAST_ABI, +#if defined(__i386__) || defined(__i386) + FFI_DEFAULT_ABI = FFI_SYSV +#else + FFI_DEFAULT_ABI = FFI_UNIX64 +#endif +#endif +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1) +#define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2) +#define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3) + +#if defined (X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) +#define FFI_TRAMPOLINE_SIZE 24 +#define FFI_NATIVE_RAW_API 0 +#else +#ifdef X86_WIN32 +#define FFI_TRAMPOLINE_SIZE 13 +#else +#ifdef X86_WIN64 +#define FFI_TRAMPOLINE_SIZE 29 +#define FFI_NATIVE_RAW_API 0 +#define FFI_NO_RAW_API 1 +#else +#define FFI_TRAMPOLINE_SIZE 10 +#endif +#endif +#ifndef X86_WIN64 +#define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ +#endif +#endif + +#endif + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/freebsd.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/freebsd.S new file mode 100644 index 0000000..afde513 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/freebsd.S @@ -0,0 +1,458 @@ +/* ----------------------------------------------------------------------- + freebsd.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005 Red Hat, Inc. + Copyright (c) 2008 Björn König + + X86 Foreign Function Interface for FreeBSD + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +----------------------------------------------------------------------- */ + +#ifndef __x86_64__ + +#define LIBFFI_ASM +#include +#include + +.text + +.globl ffi_prep_args + + .align 4 +.globl ffi_call_SYSV + .type ffi_call_SYSV,@function + +ffi_call_SYSV: +.LFB1: + pushl %ebp +.LCFI0: + movl %esp,%ebp +.LCFI1: + /* Make room for all of the new args. */ + movl 16(%ebp),%ecx + subl %ecx,%esp + + movl %esp,%eax + + /* Place all of the ffi_prep_args in position */ + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + /* Return stack to previous state and call the function */ + addl $8,%esp + + call *28(%ebp) + + /* Load %ecx with the return type code */ + movl 20(%ebp),%ecx + + /* Protect %esi. We're going to pop it in the epilogue. */ + pushl %esi + + /* If the return value pointer is NULL, assume no return value. */ + cmpl $0,24(%ebp) + jne 0f + + /* Even if there is no space for the return value, we are + obliged to handle floating-point values. */ + cmpl $FFI_TYPE_FLOAT,%ecx + jne noretval + fstp %st(0) + + jmp epilogue + +0: + call 1f + +.Lstore_table: + .long noretval-.Lstore_table /* FFI_TYPE_VOID */ + .long retint-.Lstore_table /* FFI_TYPE_INT */ + .long retfloat-.Lstore_table /* FFI_TYPE_FLOAT */ + .long retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ + .long retlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long retuint8-.Lstore_table /* FFI_TYPE_UINT8 */ + .long retsint8-.Lstore_table /* FFI_TYPE_SINT8 */ + .long retuint16-.Lstore_table /* FFI_TYPE_UINT16 */ + .long retsint16-.Lstore_table /* FFI_TYPE_SINT16 */ + .long retint-.Lstore_table /* FFI_TYPE_UINT32 */ + .long retint-.Lstore_table /* FFI_TYPE_SINT32 */ + .long retint64-.Lstore_table /* FFI_TYPE_UINT64 */ + .long retint64-.Lstore_table /* FFI_TYPE_SINT64 */ + .long retstruct-.Lstore_table /* FFI_TYPE_STRUCT */ + .long retint-.Lstore_table /* FFI_TYPE_POINTER */ + .long retstruct1b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_1B */ + .long retstruct2b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_2B */ + +1: + pop %esi + add (%esi, %ecx, 4), %esi + jmp *%esi + + /* Sign/zero extend as appropriate. */ +retsint8: + movsbl %al, %eax + jmp retint + +retsint16: + movswl %ax, %eax + jmp retint + +retuint8: + movzbl %al, %eax + jmp retint + +retuint16: + movzwl %ax, %eax + jmp retint + +retfloat: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstps (%ecx) + jmp epilogue + +retdouble: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpl (%ecx) + jmp epilogue + +retlongdouble: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpt (%ecx) + jmp epilogue + +retint64: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp epilogue + +retstruct1b: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movb %al,0(%ecx) + jmp epilogue + +retstruct2b: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movw %ax,0(%ecx) + jmp epilogue + +retint: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + +retstruct: + /* Nothing to do! */ + +noretval: +epilogue: + popl %esi + movl %ebp,%esp + popl %ebp + ret +.LFE1: +.ffi_call_SYSV_end: + .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV + + .align 4 +FFI_HIDDEN (ffi_closure_SYSV) +.globl ffi_closure_SYSV + .type ffi_closure_SYSV, @function + +ffi_closure_SYSV: +.LFB2: + pushl %ebp +.LCFI2: + movl %esp, %ebp +.LCFI3: + subl $40, %esp + leal -24(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ +#if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__ + call ffi_closure_SYSV_inner +#else + movl %ebx, 8(%esp) +.LCFI7: + call 1f +1: popl %ebx + addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx + call ffi_closure_SYSV_inner@PLT + movl 8(%esp), %ebx +#endif + movl -12(%ebp), %ecx + cmpl $FFI_TYPE_INT, %eax + je .Lcls_retint + + /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, + FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ + cmpl $FFI_TYPE_UINT64, %eax + jge 0f + cmpl $FFI_TYPE_UINT8, %eax + jge .Lcls_retint + +0: cmpl $FFI_TYPE_FLOAT, %eax + je .Lcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je .Lcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je .Lcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je .Lcls_retllong + cmpl $FFI_TYPE_SMALL_STRUCT_1B, %eax + je .Lcls_retstruct1b + cmpl $FFI_TYPE_SMALL_STRUCT_2B, %eax + je .Lcls_retstruct2b + cmpl $FFI_TYPE_STRUCT, %eax + je .Lcls_retstruct +.Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret +.Lcls_retint: + movl (%ecx), %eax + jmp .Lcls_epilogue +.Lcls_retfloat: + flds (%ecx) + jmp .Lcls_epilogue +.Lcls_retdouble: + fldl (%ecx) + jmp .Lcls_epilogue +.Lcls_retldouble: + fldt (%ecx) + jmp .Lcls_epilogue +.Lcls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp .Lcls_epilogue +.Lcls_retstruct1b: + movsbl (%ecx), %eax + jmp .Lcls_epilogue +.Lcls_retstruct2b: + movswl (%ecx), %eax + jmp .Lcls_epilogue +.Lcls_retstruct: + movl %ebp, %esp + popl %ebp + ret $4 +.LFE2: + .size ffi_closure_SYSV, .-ffi_closure_SYSV + +#if !FFI_NO_RAW_API + +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#define CIF_FLAGS_OFFSET 20 + + .align 4 +FFI_HIDDEN (ffi_closure_raw_SYSV) +.globl ffi_closure_raw_SYSV + .type ffi_closure_raw_SYSV, @function + +ffi_closure_raw_SYSV: +.LFB3: + pushl %ebp +.LCFI4: + movl %esp, %ebp +.LCFI5: + pushl %esi +.LCFI6: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ + cmpl $FFI_TYPE_INT, %eax + je .Lrcls_retint + + /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, + FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ + cmpl $FFI_TYPE_UINT64, %eax + jge 0f + cmpl $FFI_TYPE_UINT8, %eax + jge .Lrcls_retint +0: + cmpl $FFI_TYPE_FLOAT, %eax + je .Lrcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je .Lrcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je .Lrcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je .Lrcls_retllong +.Lrcls_epilogue: + addl $36, %esp + popl %esi + popl %ebp + ret +.Lrcls_retint: + movl -24(%ebp), %eax + jmp .Lrcls_epilogue +.Lrcls_retfloat: + flds -24(%ebp) + jmp .Lrcls_epilogue +.Lrcls_retdouble: + fldl -24(%ebp) + jmp .Lrcls_epilogue +.Lrcls_retldouble: + fldt -24(%ebp) + jmp .Lrcls_epilogue +.Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp .Lrcls_epilogue +.LFE3: + .size ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV +#endif + + .section .eh_frame,EH_FRAME_FLAGS,@progbits +.Lframe1: + .long .LECIE1-.LSCIE1 /* Length of Common Information Entry */ +.LSCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ +#ifdef __PIC__ + .ascii "zR\0" /* CIE Augmentation */ +#else + .ascii "\0" /* CIE Augmentation */ +#endif + .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */ + .byte 0x8 /* CIE RA Column */ +#ifdef __PIC__ + .byte 0x1 /* .uleb128 0x1; Augmentation size */ + .byte 0x1b /* FDE Encoding (pcrel sdata4) */ +#endif + .byte 0xc /* DW_CFA_def_cfa */ + .byte 0x4 /* .uleb128 0x4 */ + .byte 0x4 /* .uleb128 0x4 */ + .byte 0x88 /* DW_CFA_offset, column 0x8 */ + .byte 0x1 /* .uleb128 0x1 */ + .align 4 +.LECIE1: +.LSFDE1: + .long .LEFDE1-.LASFDE1 /* FDE Length */ +.LASFDE1: + .long .LASFDE1-.Lframe1 /* FDE CIE offset */ +#ifdef __PIC__ + .long .LFB1-. /* FDE initial location */ +#else + .long .LFB1 /* FDE initial location */ +#endif + .long .LFE1-.LFB1 /* FDE address range */ +#ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI0-.LFB1 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 */ + .byte 0x2 /* .uleb128 0x2 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI1-.LCFI0 + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0x5 /* .uleb128 0x5 */ + .align 4 +.LEFDE1: +.LSFDE2: + .long .LEFDE2-.LASFDE2 /* FDE Length */ +.LASFDE2: + .long .LASFDE2-.Lframe1 /* FDE CIE offset */ +#ifdef __PIC__ + .long .LFB2-. /* FDE initial location */ +#else + .long .LFB2 +#endif + .long .LFE2-.LFB2 /* FDE address range */ +#ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI2-.LFB2 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 */ + .byte 0x2 /* .uleb128 0x2 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI3-.LCFI2 + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0x5 /* .uleb128 0x5 */ +#if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI7-.LCFI3 + .byte 0x83 /* DW_CFA_offset, column 0x3 */ + .byte 0xa /* .uleb128 0xa */ +#endif + .align 4 +.LEFDE2: + +#if !FFI_NO_RAW_API + +.LSFDE3: + .long .LEFDE3-.LASFDE3 /* FDE Length */ +.LASFDE3: + .long .LASFDE3-.Lframe1 /* FDE CIE offset */ +#ifdef __PIC__ + .long .LFB3-. /* FDE initial location */ +#else + .long .LFB3 +#endif + .long .LFE3-.LFB3 /* FDE address range */ +#ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI4-.LFB3 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 */ + .byte 0x2 /* .uleb128 0x2 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI5-.LCFI4 + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0x5 /* .uleb128 0x5 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI6-.LCFI5 + .byte 0x86 /* DW_CFA_offset, column 0x6 */ + .byte 0x3 /* .uleb128 0x3 */ + .align 4 +.LEFDE3: + +#endif + +#endif /* ifndef __x86_64__ */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/sysv.S new file mode 100644 index 0000000..f108dd8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/sysv.S @@ -0,0 +1,468 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 1996, 1998, 2001-2003, 2005, 2008, 2010 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef __x86_64__ + +#define LIBFFI_ASM +#include +#include + +.text + +.globl ffi_prep_args + + .align 4 +.globl ffi_call_SYSV + .type ffi_call_SYSV,@function + +ffi_call_SYSV: +.LFB1: + pushl %ebp +.LCFI0: + movl %esp,%ebp +.LCFI1: + /* Make room for all of the new args. */ + movl 16(%ebp),%ecx + subl %ecx,%esp + + /* Align the stack pointer to 16-bytes */ + andl $0xfffffff0, %esp + + movl %esp,%eax + + /* Place all of the ffi_prep_args in position */ + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + /* Return stack to previous state and call the function */ + addl $8,%esp + + call *28(%ebp) + + /* Load %ecx with the return type code */ + movl 20(%ebp),%ecx + + /* Protect %esi. We're going to pop it in the epilogue. */ + pushl %esi + + /* If the return value pointer is NULL, assume no return value. */ + cmpl $0,24(%ebp) + jne 0f + + /* Even if there is no space for the return value, we are + obliged to handle floating-point values. */ + cmpl $FFI_TYPE_FLOAT,%ecx + jne noretval + fstp %st(0) + + jmp epilogue + +0: + call 1f + +.Lstore_table: + .long noretval-.Lstore_table /* FFI_TYPE_VOID */ + .long retint-.Lstore_table /* FFI_TYPE_INT */ + .long retfloat-.Lstore_table /* FFI_TYPE_FLOAT */ + .long retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ + .long retlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long retuint8-.Lstore_table /* FFI_TYPE_UINT8 */ + .long retsint8-.Lstore_table /* FFI_TYPE_SINT8 */ + .long retuint16-.Lstore_table /* FFI_TYPE_UINT16 */ + .long retsint16-.Lstore_table /* FFI_TYPE_SINT16 */ + .long retint-.Lstore_table /* FFI_TYPE_UINT32 */ + .long retint-.Lstore_table /* FFI_TYPE_SINT32 */ + .long retint64-.Lstore_table /* FFI_TYPE_UINT64 */ + .long retint64-.Lstore_table /* FFI_TYPE_SINT64 */ + .long retstruct-.Lstore_table /* FFI_TYPE_STRUCT */ + .long retint-.Lstore_table /* FFI_TYPE_POINTER */ + +1: + pop %esi + add (%esi, %ecx, 4), %esi + jmp *%esi + + /* Sign/zero extend as appropriate. */ +retsint8: + movsbl %al, %eax + jmp retint + +retsint16: + movswl %ax, %eax + jmp retint + +retuint8: + movzbl %al, %eax + jmp retint + +retuint16: + movzwl %ax, %eax + jmp retint + +retfloat: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstps (%ecx) + jmp epilogue + +retdouble: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpl (%ecx) + jmp epilogue + +retlongdouble: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpt (%ecx) + jmp epilogue + +retint64: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp epilogue + +retint: + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + +retstruct: + /* Nothing to do! */ + +noretval: +epilogue: + popl %esi + movl %ebp,%esp + popl %ebp + ret +.LFE1: +.ffi_call_SYSV_end: + .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV + + .align 4 +FFI_HIDDEN (ffi_closure_SYSV) +.globl ffi_closure_SYSV + .type ffi_closure_SYSV, @function + +ffi_closure_SYSV: +.LFB2: + pushl %ebp +.LCFI2: + movl %esp, %ebp +.LCFI3: + subl $40, %esp + leal -24(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ +#if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__ + call ffi_closure_SYSV_inner +#else + movl %ebx, 8(%esp) +.LCFI7: + call 1f +1: popl %ebx + addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx + call ffi_closure_SYSV_inner@PLT + movl 8(%esp), %ebx +#endif + movl -12(%ebp), %ecx + cmpl $FFI_TYPE_INT, %eax + je .Lcls_retint + + /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, + FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ + cmpl $FFI_TYPE_UINT64, %eax + jge 0f + cmpl $FFI_TYPE_UINT8, %eax + jge .Lcls_retint + +0: cmpl $FFI_TYPE_FLOAT, %eax + je .Lcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je .Lcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je .Lcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je .Lcls_retllong + cmpl $FFI_TYPE_STRUCT, %eax + je .Lcls_retstruct +.Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret +.Lcls_retint: + movl (%ecx), %eax + jmp .Lcls_epilogue +.Lcls_retfloat: + flds (%ecx) + jmp .Lcls_epilogue +.Lcls_retdouble: + fldl (%ecx) + jmp .Lcls_epilogue +.Lcls_retldouble: + fldt (%ecx) + jmp .Lcls_epilogue +.Lcls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp .Lcls_epilogue +.Lcls_retstruct: + movl %ebp, %esp + popl %ebp + ret $4 +.LFE2: + .size ffi_closure_SYSV, .-ffi_closure_SYSV + +#if !FFI_NO_RAW_API + +/* Precalculate for e.g. the Solaris 10/x86 assembler. */ +#if FFI_TRAMPOLINE_SIZE == 10 +#define RAW_CLOSURE_CIF_OFFSET 12 +#define RAW_CLOSURE_FUN_OFFSET 16 +#define RAW_CLOSURE_USER_DATA_OFFSET 20 +#elif FFI_TRAMPOLINE_SIZE == 24 +#define RAW_CLOSURE_CIF_OFFSET 24 +#define RAW_CLOSURE_FUN_OFFSET 28 +#define RAW_CLOSURE_USER_DATA_OFFSET 32 +#else +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#endif +#define CIF_FLAGS_OFFSET 20 + + .align 4 +FFI_HIDDEN (ffi_closure_raw_SYSV) +.globl ffi_closure_raw_SYSV + .type ffi_closure_raw_SYSV, @function + +ffi_closure_raw_SYSV: +.LFB3: + pushl %ebp +.LCFI4: + movl %esp, %ebp +.LCFI5: + pushl %esi +.LCFI6: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ + cmpl $FFI_TYPE_INT, %eax + je .Lrcls_retint + + /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, + FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ + cmpl $FFI_TYPE_UINT64, %eax + jge 0f + cmpl $FFI_TYPE_UINT8, %eax + jge .Lrcls_retint +0: + cmpl $FFI_TYPE_FLOAT, %eax + je .Lrcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je .Lrcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je .Lrcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je .Lrcls_retllong +.Lrcls_epilogue: + addl $36, %esp + popl %esi + popl %ebp + ret +.Lrcls_retint: + movl -24(%ebp), %eax + jmp .Lrcls_epilogue +.Lrcls_retfloat: + flds -24(%ebp) + jmp .Lrcls_epilogue +.Lrcls_retdouble: + fldl -24(%ebp) + jmp .Lrcls_epilogue +.Lrcls_retldouble: + fldt -24(%ebp) + jmp .Lrcls_epilogue +.Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp .Lrcls_epilogue +.LFE3: + .size ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV +#endif + +#if defined __PIC__ +# if defined __sun__ && defined __svr4__ +/* 32-bit Solaris 2/x86 uses datarel encoding for PIC. GNU ld before 2.22 + doesn't correctly sort .eh_frame_hdr with mixed encodings, so match this. */ +# define FDE_ENCODING 0x30 /* datarel */ +# define FDE_ENCODE(X) X@GOTOFF +# else +# define FDE_ENCODING 0x1b /* pcrel sdata4 */ +# if defined HAVE_AS_X86_PCREL +# define FDE_ENCODE(X) X-. +# else +# define FDE_ENCODE(X) X@rel +# endif +# endif +#else +# define FDE_ENCODING 0 /* absolute */ +# define FDE_ENCODE(X) X +#endif + + .section .eh_frame,EH_FRAME_FLAGS,@progbits +.Lframe1: + .long .LECIE1-.LSCIE1 /* Length of Common Information Entry */ +.LSCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ +#ifdef HAVE_AS_ASCII_PSEUDO_OP +#ifdef __PIC__ + .ascii "zR\0" /* CIE Augmentation */ +#else + .ascii "\0" /* CIE Augmentation */ +#endif +#elif defined HAVE_AS_STRING_PSEUDO_OP +#ifdef __PIC__ + .string "zR" /* CIE Augmentation */ +#else + .string "" /* CIE Augmentation */ +#endif +#else +#error missing .ascii/.string +#endif + .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */ + .byte 0x8 /* CIE RA Column */ +#ifdef __PIC__ + .byte 0x1 /* .uleb128 0x1; Augmentation size */ + .byte FDE_ENCODING +#endif + .byte 0xc /* DW_CFA_def_cfa */ + .byte 0x4 /* .uleb128 0x4 */ + .byte 0x4 /* .uleb128 0x4 */ + .byte 0x88 /* DW_CFA_offset, column 0x8 */ + .byte 0x1 /* .uleb128 0x1 */ + .align 4 +.LECIE1: +.LSFDE1: + .long .LEFDE1-.LASFDE1 /* FDE Length */ +.LASFDE1: + .long .LASFDE1-.Lframe1 /* FDE CIE offset */ + .long FDE_ENCODE(.LFB1) /* FDE initial location */ + .long .LFE1-.LFB1 /* FDE address range */ +#ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI0-.LFB1 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 */ + .byte 0x2 /* .uleb128 0x2 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI1-.LCFI0 + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0x5 /* .uleb128 0x5 */ + .align 4 +.LEFDE1: +.LSFDE2: + .long .LEFDE2-.LASFDE2 /* FDE Length */ +.LASFDE2: + .long .LASFDE2-.Lframe1 /* FDE CIE offset */ + .long FDE_ENCODE(.LFB2) /* FDE initial location */ + .long .LFE2-.LFB2 /* FDE address range */ +#ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI2-.LFB2 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 */ + .byte 0x2 /* .uleb128 0x2 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI3-.LCFI2 + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0x5 /* .uleb128 0x5 */ +#if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI7-.LCFI3 + .byte 0x83 /* DW_CFA_offset, column 0x3 */ + .byte 0xa /* .uleb128 0xa */ +#endif + .align 4 +.LEFDE2: + +#if !FFI_NO_RAW_API + +.LSFDE3: + .long .LEFDE3-.LASFDE3 /* FDE Length */ +.LASFDE3: + .long .LASFDE3-.Lframe1 /* FDE CIE offset */ + .long FDE_ENCODE(.LFB3) /* FDE initial location */ + .long .LFE3-.LFB3 /* FDE address range */ +#ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI4-.LFB3 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 */ + .byte 0x2 /* .uleb128 0x2 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI5-.LCFI4 + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0x5 /* .uleb128 0x5 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI6-.LCFI5 + .byte 0x86 /* DW_CFA_offset, column 0x6 */ + .byte 0x3 /* .uleb128 0x3 */ + .align 4 +.LEFDE3: + +#endif + +#endif /* ifndef __x86_64__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/unix64.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/unix64.S new file mode 100644 index 0000000..7a6619a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/unix64.S @@ -0,0 +1,426 @@ +/* ----------------------------------------------------------------------- + unix64.S - Copyright (c) 2002 Bo Thorsen + Copyright (c) 2008 Red Hat, Inc + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include +#include + +.text + +/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)(void)); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 2 + .globl ffi_call_unix64 + .type ffi_call_unix64,@function + +ffi_call_unix64: +.LUW0: + movq (%rsp), %r10 /* Load return address. */ + leaq (%rdi, %rsi), %rax /* Find local stack base. */ + movq %rdx, (%rax) /* Save flags. */ + movq %rcx, 8(%rax) /* Save raddr. */ + movq %rbp, 16(%rax) /* Save old frame pointer. */ + movq %r10, 24(%rax) /* Relocate return address. */ + movq %rax, %rbp /* Finalize local stack frame. */ +.LUW1: + movq %rdi, %r10 /* Save a copy of the register area. */ + movq %r8, %r11 /* Save a copy of the target fn. */ + movl %r9d, %eax /* Set number of SSE registers. */ + + /* Load up all argument registers. */ + movq (%r10), %rdi + movq 8(%r10), %rsi + movq 16(%r10), %rdx + movq 24(%r10), %rcx + movq 32(%r10), %r8 + movq 40(%r10), %r9 + testl %eax, %eax + jnz .Lload_sse +.Lret_from_load_sse: + + /* Deallocate the reg arg area. */ + leaq 176(%r10), %rsp + + /* Call the user function. */ + call *%r11 + + /* Deallocate stack arg area; local stack frame in redzone. */ + leaq 24(%rbp), %rsp + + movq 0(%rbp), %rcx /* Reload flags. */ + movq 8(%rbp), %rdi /* Reload raddr. */ + movq 16(%rbp), %rbp /* Reload old frame pointer. */ +.LUW2: + + /* The first byte of the flags contains the FFI_TYPE. */ + movzbl %cl, %r10d + leaq .Lstore_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +.Lstore_table: + .long .Lst_void-.Lstore_table /* FFI_TYPE_VOID */ + .long .Lst_sint32-.Lstore_table /* FFI_TYPE_INT */ + .long .Lst_float-.Lstore_table /* FFI_TYPE_FLOAT */ + .long .Lst_double-.Lstore_table /* FFI_TYPE_DOUBLE */ + .long .Lst_ldouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long .Lst_uint8-.Lstore_table /* FFI_TYPE_UINT8 */ + .long .Lst_sint8-.Lstore_table /* FFI_TYPE_SINT8 */ + .long .Lst_uint16-.Lstore_table /* FFI_TYPE_UINT16 */ + .long .Lst_sint16-.Lstore_table /* FFI_TYPE_SINT16 */ + .long .Lst_uint32-.Lstore_table /* FFI_TYPE_UINT32 */ + .long .Lst_sint32-.Lstore_table /* FFI_TYPE_SINT32 */ + .long .Lst_int64-.Lstore_table /* FFI_TYPE_UINT64 */ + .long .Lst_int64-.Lstore_table /* FFI_TYPE_SINT64 */ + .long .Lst_struct-.Lstore_table /* FFI_TYPE_STRUCT */ + .long .Lst_int64-.Lstore_table /* FFI_TYPE_POINTER */ + + .align 2 +.Lst_void: + ret + .align 2 + +.Lst_uint8: + movzbq %al, %rax + movq %rax, (%rdi) + ret + .align 2 +.Lst_sint8: + movsbq %al, %rax + movq %rax, (%rdi) + ret + .align 2 +.Lst_uint16: + movzwq %ax, %rax + movq %rax, (%rdi) + .align 2 +.Lst_sint16: + movswq %ax, %rax + movq %rax, (%rdi) + ret + .align 2 +.Lst_uint32: + movl %eax, %eax + movq %rax, (%rdi) + .align 2 +.Lst_sint32: + cltq + movq %rax, (%rdi) + ret + .align 2 +.Lst_int64: + movq %rax, (%rdi) + ret + + .align 2 +.Lst_float: + movss %xmm0, (%rdi) + ret + .align 2 +.Lst_double: + movsd %xmm0, (%rdi) + ret +.Lst_ldouble: + fstpt (%rdi) + ret + + .align 2 +.Lst_struct: + leaq -20(%rsp), %rsi /* Scratch area in redzone. */ + + /* We have to locate the values now, and since we don't want to + write too much data into the user's return value, we spill the + value to a 16 byte scratch area first. Bits 8, 9, and 10 + control where the values are located. Only one of the three + bits will be set; see ffi_prep_cif_machdep for the pattern. */ + movd %xmm0, %r10 + movd %xmm1, %r11 + testl $0x100, %ecx + cmovnz %rax, %rdx + cmovnz %r10, %rax + testl $0x200, %ecx + cmovnz %r10, %rdx + testl $0x400, %ecx + cmovnz %r10, %rax + cmovnz %r11, %rdx + movq %rax, (%rsi) + movq %rdx, 8(%rsi) + + /* Bits 12-31 contain the true size of the structure. Copy from + the scratch area to the true destination. */ + shrl $12, %ecx + rep movsb + ret + + /* Many times we can avoid loading any SSE registers at all. + It's not worth an indirect jump to load the exact set of + SSE registers needed; zero or all is a good compromise. */ + .align 2 +.LUW3: +.Lload_sse: + movdqa 48(%r10), %xmm0 + movdqa 64(%r10), %xmm1 + movdqa 80(%r10), %xmm2 + movdqa 96(%r10), %xmm3 + movdqa 112(%r10), %xmm4 + movdqa 128(%r10), %xmm5 + movdqa 144(%r10), %xmm6 + movdqa 160(%r10), %xmm7 + jmp .Lret_from_load_sse + +.LUW4: + .size ffi_call_unix64,.-ffi_call_unix64 + + .align 2 + .globl ffi_closure_unix64 + .type ffi_closure_unix64,@function + +ffi_closure_unix64: +.LUW5: + /* The carry flag is set by the trampoline iff SSE registers + are used. Don't clobber it before the branch instruction. */ + leaq -200(%rsp), %rsp +.LUW6: + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + movq %rdx, 16(%rsp) + movq %rcx, 24(%rsp) + movq %r8, 32(%rsp) + movq %r9, 40(%rsp) + jc .Lsave_sse +.Lret_from_save_sse: + + movq %r10, %rdi + leaq 176(%rsp), %rsi + movq %rsp, %rdx + leaq 208(%rsp), %rcx + call ffi_closure_unix64_inner@PLT + + /* Deallocate stack frame early; return value is now in redzone. */ + addq $200, %rsp +.LUW7: + + /* The first byte of the return value contains the FFI_TYPE. */ + movzbl %al, %r10d + leaq .Lload_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +.Lload_table: + .long .Lld_void-.Lload_table /* FFI_TYPE_VOID */ + .long .Lld_int32-.Lload_table /* FFI_TYPE_INT */ + .long .Lld_float-.Lload_table /* FFI_TYPE_FLOAT */ + .long .Lld_double-.Lload_table /* FFI_TYPE_DOUBLE */ + .long .Lld_ldouble-.Lload_table /* FFI_TYPE_LONGDOUBLE */ + .long .Lld_int8-.Lload_table /* FFI_TYPE_UINT8 */ + .long .Lld_int8-.Lload_table /* FFI_TYPE_SINT8 */ + .long .Lld_int16-.Lload_table /* FFI_TYPE_UINT16 */ + .long .Lld_int16-.Lload_table /* FFI_TYPE_SINT16 */ + .long .Lld_int32-.Lload_table /* FFI_TYPE_UINT32 */ + .long .Lld_int32-.Lload_table /* FFI_TYPE_SINT32 */ + .long .Lld_int64-.Lload_table /* FFI_TYPE_UINT64 */ + .long .Lld_int64-.Lload_table /* FFI_TYPE_SINT64 */ + .long .Lld_struct-.Lload_table /* FFI_TYPE_STRUCT */ + .long .Lld_int64-.Lload_table /* FFI_TYPE_POINTER */ + + .align 2 +.Lld_void: + ret + + .align 2 +.Lld_int8: + movzbl -24(%rsp), %eax + ret + .align 2 +.Lld_int16: + movzwl -24(%rsp), %eax + ret + .align 2 +.Lld_int32: + movl -24(%rsp), %eax + ret + .align 2 +.Lld_int64: + movq -24(%rsp), %rax + ret + + .align 2 +.Lld_float: + movss -24(%rsp), %xmm0 + ret + .align 2 +.Lld_double: + movsd -24(%rsp), %xmm0 + ret + .align 2 +.Lld_ldouble: + fldt -24(%rsp) + ret + + .align 2 +.Lld_struct: + /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, + %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading + both rdx and xmm1 with the second word. For the remaining, + bit 8 set means xmm0 gets the second word, and bit 9 means + that rax gets the second word. */ + movq -24(%rsp), %rcx + movq -16(%rsp), %rdx + movq -16(%rsp), %xmm1 + testl $0x100, %eax + cmovnz %rdx, %rcx + movd %rcx, %xmm0 + testl $0x200, %eax + movq -24(%rsp), %rax + cmovnz %rdx, %rax + ret + + /* See the comment above .Lload_sse; the same logic applies here. */ + .align 2 +.LUW8: +.Lsave_sse: + movdqa %xmm0, 48(%rsp) + movdqa %xmm1, 64(%rsp) + movdqa %xmm2, 80(%rsp) + movdqa %xmm3, 96(%rsp) + movdqa %xmm4, 112(%rsp) + movdqa %xmm5, 128(%rsp) + movdqa %xmm6, 144(%rsp) + movdqa %xmm7, 160(%rsp) + jmp .Lret_from_save_sse + +.LUW9: + .size ffi_closure_unix64,.-ffi_closure_unix64 + +#ifdef HAVE_AS_X86_64_UNWIND_SECTION_TYPE + .section .eh_frame,"a",@unwind +#else + .section .eh_frame,"a",@progbits +#endif +.Lframe1: + .long .LECIE1-.LSCIE1 /* CIE Length */ +.LSCIE1: + .long 0 /* CIE Identifier Tag */ + .byte 1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .uleb128 1 /* CIE Code Alignment Factor */ + .sleb128 -8 /* CIE Data Alignment Factor */ + .byte 0x10 /* CIE RA Column */ + .uleb128 1 /* Augmentation size */ + .byte 0x1b /* FDE Encoding (pcrel sdata4) */ + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .uleb128 7 + .uleb128 8 + .byte 0x80+16 /* DW_CFA_offset, %rip offset 1*-8 */ + .uleb128 1 + .align 8 +.LECIE1: +.LSFDE1: + .long .LEFDE1-.LASFDE1 /* FDE Length */ +.LASFDE1: + .long .LASFDE1-.Lframe1 /* FDE CIE offset */ +#if HAVE_AS_X86_PCREL + .long .LUW0-. /* FDE initial location */ +#else + .long .LUW0@rel +#endif + .long .LUW4-.LUW0 /* FDE address range */ + .uleb128 0x0 /* Augmentation size */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LUW1-.LUW0 + + /* New stack frame based off rbp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-8, so from the + perspective of the unwind info, it hasn't moved. */ + .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ + .uleb128 6 + .uleb128 32 + .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ + .uleb128 2 + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LUW2-.LUW1 + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .uleb128 7 + .uleb128 8 + .byte 0xc0+6 /* DW_CFA_restore, %rbp */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LUW3-.LUW2 + .byte 0xb /* DW_CFA_restore_state */ + + .align 8 +.LEFDE1: +.LSFDE3: + .long .LEFDE3-.LASFDE3 /* FDE Length */ +.LASFDE3: + .long .LASFDE3-.Lframe1 /* FDE CIE offset */ +#if HAVE_AS_X86_PCREL + .long .LUW5-. /* FDE initial location */ +#else + .long .LUW5@rel +#endif + .long .LUW9-.LUW5 /* FDE address range */ + .uleb128 0x0 /* Augmentation size */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LUW6-.LUW5 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .uleb128 208 + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LUW7-.LUW6 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .uleb128 8 + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LUW8-.LUW7 + .byte 0xb /* DW_CFA_restore_state */ + + .align 8 +.LEFDE3: + +#endif /* __x86_64__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win32.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win32.S new file mode 100644 index 0000000..06c893f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win32.S @@ -0,0 +1,1065 @@ +/* ----------------------------------------------------------------------- + win32.S - Copyright (c) 1996, 1998, 2001, 2002, 2009 Red Hat, Inc. + Copyright (c) 2001 John Beniton + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2009 Daniel Witte + + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- + */ + +#define LIBFFI_ASM +#include +#include + +#ifdef _MSC_VER + +.386 +.MODEL FLAT, C + +EXTRN ffi_closure_SYSV_inner:NEAR + +_TEXT SEGMENT + +ffi_call_win32 PROC NEAR, + ffi_prep_args : NEAR PTR DWORD, + ecif : NEAR PTR DWORD, + cif_bytes : DWORD, + cif_flags : DWORD, + rvalue : NEAR PTR DWORD, + fn : NEAR PTR DWORD + + ;; Make room for all of the new args. + mov ecx, cif_bytes + sub esp, ecx + + mov eax, esp + + ;; Place all of the ffi_prep_args in position + push ecif + push eax + call ffi_prep_args + + ;; Return stack to previous state and call the function + add esp, 8 + + call fn + + ;; cdecl: we restore esp in the epilogue, so there's no need to + ;; remove the space we pushed for the args. + ;; stdcall: the callee has already cleaned the stack. + + ;; Load ecx with the return type code + mov ecx, cif_flags + + ;; If the return value pointer is NULL, assume no return value. + cmp rvalue, 0 + jne ca_jumptable + + ;; Even if there is no space for the return value, we are + ;; obliged to handle floating-point values. + cmp ecx, FFI_TYPE_FLOAT + jne ca_epilogue + fstp st(0) + + jmp ca_epilogue + +ca_jumptable: + jmp [ca_jumpdata + 4 * ecx] +ca_jumpdata: + ;; Do not insert anything here between label and jump table. + dd offset ca_epilogue ;; FFI_TYPE_VOID + dd offset ca_retint ;; FFI_TYPE_INT + dd offset ca_retfloat ;; FFI_TYPE_FLOAT + dd offset ca_retdouble ;; FFI_TYPE_DOUBLE + dd offset ca_retlongdouble ;; FFI_TYPE_LONGDOUBLE + dd offset ca_retint8 ;; FFI_TYPE_UINT8 + dd offset ca_retint8 ;; FFI_TYPE_SINT8 + dd offset ca_retint16 ;; FFI_TYPE_UINT16 + dd offset ca_retint16 ;; FFI_TYPE_SINT16 + dd offset ca_retint ;; FFI_TYPE_UINT32 + dd offset ca_retint ;; FFI_TYPE_SINT32 + dd offset ca_retint64 ;; FFI_TYPE_UINT64 + dd offset ca_retint64 ;; FFI_TYPE_SINT64 + dd offset ca_epilogue ;; FFI_TYPE_STRUCT + dd offset ca_retint ;; FFI_TYPE_POINTER + dd offset ca_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B + dd offset ca_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B + dd offset ca_retint ;; FFI_TYPE_SMALL_STRUCT_4B + +ca_retint8: + ;; Load %ecx with the pointer to storage for the return value + mov ecx, rvalue + mov [ecx + 0], al + jmp ca_epilogue + +ca_retint16: + ;; Load %ecx with the pointer to storage for the return value + mov ecx, rvalue + mov [ecx + 0], ax + jmp ca_epilogue + +ca_retint: + ;; Load %ecx with the pointer to storage for the return value + mov ecx, rvalue + mov [ecx + 0], eax + jmp ca_epilogue + +ca_retint64: + ;; Load %ecx with the pointer to storage for the return value + mov ecx, rvalue + mov [ecx + 0], eax + mov [ecx + 4], edx + jmp ca_epilogue + +ca_retfloat: + ;; Load %ecx with the pointer to storage for the return value + mov ecx, rvalue + fstp DWORD PTR [ecx] + jmp ca_epilogue + +ca_retdouble: + ;; Load %ecx with the pointer to storage for the return value + mov ecx, rvalue + fstp QWORD PTR [ecx] + jmp ca_epilogue + +ca_retlongdouble: + ;; Load %ecx with the pointer to storage for the return value + mov ecx, rvalue + fstp TBYTE PTR [ecx] + jmp ca_epilogue + +ca_epilogue: + ;; Epilogue code is autogenerated. + ret +ffi_call_win32 ENDP + +ffi_closure_SYSV PROC NEAR + ;; the ffi_closure ctx is passed in eax by the trampoline. + + sub esp, 40 + lea edx, [ebp - 24] + mov [ebp - 12], edx ;; resp + lea edx, [ebp + 8] + mov [esp + 8], edx ;; args + lea edx, [ebp - 12] + mov [esp + 4], edx ;; &resp + mov [esp], eax ;; closure + call ffi_closure_SYSV_inner + mov ecx, [ebp - 12] + +cs_jumptable: + jmp [cs_jumpdata + 4 * eax] +cs_jumpdata: + ;; Do not insert anything here between the label and jump table. + dd offset cs_epilogue ;; FFI_TYPE_VOID + dd offset cs_retint ;; FFI_TYPE_INT + dd offset cs_retfloat ;; FFI_TYPE_FLOAT + dd offset cs_retdouble ;; FFI_TYPE_DOUBLE + dd offset cs_retlongdouble ;; FFI_TYPE_LONGDOUBLE + dd offset cs_retint8 ;; FFI_TYPE_UINT8 + dd offset cs_retint8 ;; FFI_TYPE_SINT8 + dd offset cs_retint16 ;; FFI_TYPE_UINT16 + dd offset cs_retint16 ;; FFI_TYPE_SINT16 + dd offset cs_retint ;; FFI_TYPE_UINT32 + dd offset cs_retint ;; FFI_TYPE_SINT32 + dd offset cs_retint64 ;; FFI_TYPE_UINT64 + dd offset cs_retint64 ;; FFI_TYPE_SINT64 + dd offset cs_retstruct ;; FFI_TYPE_STRUCT + dd offset cs_retint ;; FFI_TYPE_POINTER + dd offset cs_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B + dd offset cs_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B + dd offset cs_retint ;; FFI_TYPE_SMALL_STRUCT_4B + +cs_retint8: + mov al, [ecx] + jmp cs_epilogue + +cs_retint16: + mov ax, [ecx] + jmp cs_epilogue + +cs_retint: + mov eax, [ecx] + jmp cs_epilogue + +cs_retint64: + mov eax, [ecx + 0] + mov edx, [ecx + 4] + jmp cs_epilogue + +cs_retfloat: + fld DWORD PTR [ecx] + jmp cs_epilogue + +cs_retdouble: + fld QWORD PTR [ecx] + jmp cs_epilogue + +cs_retlongdouble: + fld TBYTE PTR [ecx] + jmp cs_epilogue + +cs_retstruct: + ;; Caller expects us to pop struct return value pointer hidden arg. + ;; Epilogue code is autogenerated. + ret 4 + +cs_epilogue: + ;; Epilogue code is autogenerated. + ret +ffi_closure_SYSV ENDP + +#if !FFI_NO_RAW_API + +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) AND NOT 3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#define CIF_FLAGS_OFFSET 20 + +ffi_closure_raw_SYSV PROC NEAR USES esi + ;; the ffi_closure ctx is passed in eax by the trampoline. + + sub esp, 40 + mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif + mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data + mov [esp + 12], edx ;; user_data + lea edx, [ebp + 8] + mov [esp + 8], edx ;; raw_args + lea edx, [ebp - 24] + mov [esp + 4], edx ;; &res + mov [esp], esi ;; cif + call DWORD PTR [eax + RAW_CLOSURE_FUN_OFFSET] ;; closure->fun + mov eax, [esi + CIF_FLAGS_OFFSET] ;; cif->flags + lea ecx, [ebp - 24] + +cr_jumptable: + jmp [cr_jumpdata + 4 * eax] +cr_jumpdata: + ;; Do not insert anything here between the label and jump table. + dd offset cr_epilogue ;; FFI_TYPE_VOID + dd offset cr_retint ;; FFI_TYPE_INT + dd offset cr_retfloat ;; FFI_TYPE_FLOAT + dd offset cr_retdouble ;; FFI_TYPE_DOUBLE + dd offset cr_retlongdouble ;; FFI_TYPE_LONGDOUBLE + dd offset cr_retint8 ;; FFI_TYPE_UINT8 + dd offset cr_retint8 ;; FFI_TYPE_SINT8 + dd offset cr_retint16 ;; FFI_TYPE_UINT16 + dd offset cr_retint16 ;; FFI_TYPE_SINT16 + dd offset cr_retint ;; FFI_TYPE_UINT32 + dd offset cr_retint ;; FFI_TYPE_SINT32 + dd offset cr_retint64 ;; FFI_TYPE_UINT64 + dd offset cr_retint64 ;; FFI_TYPE_SINT64 + dd offset cr_epilogue ;; FFI_TYPE_STRUCT + dd offset cr_retint ;; FFI_TYPE_POINTER + dd offset cr_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B + dd offset cr_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B + dd offset cr_retint ;; FFI_TYPE_SMALL_STRUCT_4B + +cr_retint8: + mov al, [ecx] + jmp cr_epilogue + +cr_retint16: + mov ax, [ecx] + jmp cr_epilogue + +cr_retint: + mov eax, [ecx] + jmp cr_epilogue + +cr_retint64: + mov eax, [ecx + 0] + mov edx, [ecx + 4] + jmp cr_epilogue + +cr_retfloat: + fld DWORD PTR [ecx] + jmp cr_epilogue + +cr_retdouble: + fld QWORD PTR [ecx] + jmp cr_epilogue + +cr_retlongdouble: + fld TBYTE PTR [ecx] + jmp cr_epilogue + +cr_epilogue: + ;; Epilogue code is autogenerated. + ret +ffi_closure_raw_SYSV ENDP + +#endif /* !FFI_NO_RAW_API */ + +ffi_closure_STDCALL PROC NEAR + ;; the ffi_closure ctx is passed in eax by the trampoline. + + sub esp, 40 + lea edx, [ebp - 24] + mov [ebp - 12], edx ;; resp + lea edx, [ebp + 12] ;; account for stub return address on stack + mov [esp + 8], edx ;; args + lea edx, [ebp - 12] + mov [esp + 4], edx ;; &resp + mov [esp], eax ;; closure + call ffi_closure_SYSV_inner + mov ecx, [ebp - 12] + +cd_jumptable: + jmp [cd_jumpdata + 4 * eax] +cd_jumpdata: + ;; Do not insert anything here between the label and jump table. + dd offset cd_epilogue ;; FFI_TYPE_VOID + dd offset cd_retint ;; FFI_TYPE_INT + dd offset cd_retfloat ;; FFI_TYPE_FLOAT + dd offset cd_retdouble ;; FFI_TYPE_DOUBLE + dd offset cd_retlongdouble ;; FFI_TYPE_LONGDOUBLE + dd offset cd_retint8 ;; FFI_TYPE_UINT8 + dd offset cd_retint8 ;; FFI_TYPE_SINT8 + dd offset cd_retint16 ;; FFI_TYPE_UINT16 + dd offset cd_retint16 ;; FFI_TYPE_SINT16 + dd offset cd_retint ;; FFI_TYPE_UINT32 + dd offset cd_retint ;; FFI_TYPE_SINT32 + dd offset cd_retint64 ;; FFI_TYPE_UINT64 + dd offset cd_retint64 ;; FFI_TYPE_SINT64 + dd offset cd_epilogue ;; FFI_TYPE_STRUCT + dd offset cd_retint ;; FFI_TYPE_POINTER + dd offset cd_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B + dd offset cd_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B + dd offset cd_retint ;; FFI_TYPE_SMALL_STRUCT_4B + +cd_retint8: + mov al, [ecx] + jmp cd_epilogue + +cd_retint16: + mov ax, [ecx] + jmp cd_epilogue + +cd_retint: + mov eax, [ecx] + jmp cd_epilogue + +cd_retint64: + mov eax, [ecx + 0] + mov edx, [ecx + 4] + jmp cd_epilogue + +cd_retfloat: + fld DWORD PTR [ecx] + jmp cd_epilogue + +cd_retdouble: + fld QWORD PTR [ecx] + jmp cd_epilogue + +cd_retlongdouble: + fld TBYTE PTR [ecx] + jmp cd_epilogue + +cd_epilogue: + ;; Epilogue code is autogenerated. + ret +ffi_closure_STDCALL ENDP + +_TEXT ENDS +END + +#else + + .text + + # This assumes we are using gas. + .balign 16 + .globl _ffi_call_win32 +#ifndef __OS2__ + .def _ffi_call_win32; .scl 2; .type 32; .endef +#endif +_ffi_call_win32: +.LFB1: + pushl %ebp +.LCFI0: + movl %esp,%ebp +.LCFI1: + # Make room for all of the new args. + movl 16(%ebp),%ecx + subl %ecx,%esp + + movl %esp,%eax + + # Place all of the ffi_prep_args in position + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + # Return stack to previous state and call the function + addl $8,%esp + + # FIXME: Align the stack to a 128-bit boundary to avoid + # potential performance hits. + + call *28(%ebp) + + # stdcall functions pop arguments off the stack themselves + + # Load %ecx with the return type code + movl 20(%ebp),%ecx + + # If the return value pointer is NULL, assume no return value. + cmpl $0,24(%ebp) + jne 0f + + # Even if there is no space for the return value, we are + # obliged to handle floating-point values. + cmpl $FFI_TYPE_FLOAT,%ecx + jne .Lnoretval + fstp %st(0) + + jmp .Lepilogue + +0: + call 1f + # Do not insert anything here between the call and the jump table. +.Lstore_table: + .long .Lnoretval /* FFI_TYPE_VOID */ + .long .Lretint /* FFI_TYPE_INT */ + .long .Lretfloat /* FFI_TYPE_FLOAT */ + .long .Lretdouble /* FFI_TYPE_DOUBLE */ + .long .Lretlongdouble /* FFI_TYPE_LONGDOUBLE */ + .long .Lretuint8 /* FFI_TYPE_UINT8 */ + .long .Lretsint8 /* FFI_TYPE_SINT8 */ + .long .Lretuint16 /* FFI_TYPE_UINT16 */ + .long .Lretsint16 /* FFI_TYPE_SINT16 */ + .long .Lretint /* FFI_TYPE_UINT32 */ + .long .Lretint /* FFI_TYPE_SINT32 */ + .long .Lretint64 /* FFI_TYPE_UINT64 */ + .long .Lretint64 /* FFI_TYPE_SINT64 */ + .long .Lretstruct /* FFI_TYPE_STRUCT */ + .long .Lretint /* FFI_TYPE_POINTER */ + .long .Lretstruct1b /* FFI_TYPE_SMALL_STRUCT_1B */ + .long .Lretstruct2b /* FFI_TYPE_SMALL_STRUCT_2B */ + .long .Lretstruct4b /* FFI_TYPE_SMALL_STRUCT_4B */ +1: + add %ecx, %ecx + add %ecx, %ecx + add (%esp),%ecx + add $4, %esp + jmp *(%ecx) + + /* Sign/zero extend as appropriate. */ +.Lretsint8: + movsbl %al, %eax + jmp .Lretint + +.Lretsint16: + movswl %ax, %eax + jmp .Lretint + +.Lretuint8: + movzbl %al, %eax + jmp .Lretint + +.Lretuint16: + movzwl %ax, %eax + jmp .Lretint + +.Lretint: + # Load %ecx with the pointer to storage for the return value + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + jmp .Lepilogue + +.Lretfloat: + # Load %ecx with the pointer to storage for the return value + movl 24(%ebp),%ecx + fstps (%ecx) + jmp .Lepilogue + +.Lretdouble: + # Load %ecx with the pointer to storage for the return value + movl 24(%ebp),%ecx + fstpl (%ecx) + jmp .Lepilogue + +.Lretlongdouble: + # Load %ecx with the pointer to storage for the return value + movl 24(%ebp),%ecx + fstpt (%ecx) + jmp .Lepilogue + +.Lretint64: + # Load %ecx with the pointer to storage for the return value + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp .Lepilogue + +.Lretstruct1b: + # Load %ecx with the pointer to storage for the return value + movl 24(%ebp),%ecx + movb %al,0(%ecx) + jmp .Lepilogue + +.Lretstruct2b: + # Load %ecx with the pointer to storage for the return value + movl 24(%ebp),%ecx + movw %ax,0(%ecx) + jmp .Lepilogue + +.Lretstruct4b: + # Load %ecx with the pointer to storage for the return value + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + jmp .Lepilogue + +.Lretstruct: + # Nothing to do! + +.Lnoretval: +.Lepilogue: + movl %ebp,%esp + popl %ebp + ret +.ffi_call_win32_end: +.LFE1: + + # This assumes we are using gas. + .balign 16 + .globl _ffi_closure_SYSV +#ifndef __OS2__ + .def _ffi_closure_SYSV; .scl 2; .type 32; .endef +#endif +_ffi_closure_SYSV: +.LFB3: + pushl %ebp +.LCFI4: + movl %esp, %ebp +.LCFI5: + subl $40, %esp + leal -24(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ + call _ffi_closure_SYSV_inner + movl -12(%ebp), %ecx + +0: + call 1f + # Do not insert anything here between the call and the jump table. +.Lcls_store_table: + .long .Lcls_noretval /* FFI_TYPE_VOID */ + .long .Lcls_retint /* FFI_TYPE_INT */ + .long .Lcls_retfloat /* FFI_TYPE_FLOAT */ + .long .Lcls_retdouble /* FFI_TYPE_DOUBLE */ + .long .Lcls_retldouble /* FFI_TYPE_LONGDOUBLE */ + .long .Lcls_retuint8 /* FFI_TYPE_UINT8 */ + .long .Lcls_retsint8 /* FFI_TYPE_SINT8 */ + .long .Lcls_retuint16 /* FFI_TYPE_UINT16 */ + .long .Lcls_retsint16 /* FFI_TYPE_SINT16 */ + .long .Lcls_retint /* FFI_TYPE_UINT32 */ + .long .Lcls_retint /* FFI_TYPE_SINT32 */ + .long .Lcls_retllong /* FFI_TYPE_UINT64 */ + .long .Lcls_retllong /* FFI_TYPE_SINT64 */ + .long .Lcls_retstruct /* FFI_TYPE_STRUCT */ + .long .Lcls_retint /* FFI_TYPE_POINTER */ + .long .Lcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */ + .long .Lcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */ + .long .Lcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */ + +1: + add %eax, %eax + add %eax, %eax + add (%esp),%eax + add $4, %esp + jmp *(%eax) + + /* Sign/zero extend as appropriate. */ +.Lcls_retsint8: + movsbl (%ecx), %eax + jmp .Lcls_epilogue + +.Lcls_retsint16: + movswl (%ecx), %eax + jmp .Lcls_epilogue + +.Lcls_retuint8: + movzbl (%ecx), %eax + jmp .Lcls_epilogue + +.Lcls_retuint16: + movzwl (%ecx), %eax + jmp .Lcls_epilogue + +.Lcls_retint: + movl (%ecx), %eax + jmp .Lcls_epilogue + +.Lcls_retfloat: + flds (%ecx) + jmp .Lcls_epilogue + +.Lcls_retdouble: + fldl (%ecx) + jmp .Lcls_epilogue + +.Lcls_retldouble: + fldt (%ecx) + jmp .Lcls_epilogue + +.Lcls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp .Lcls_epilogue + +.Lcls_retstruct1: + movsbl (%ecx), %eax + jmp .Lcls_epilogue + +.Lcls_retstruct2: + movswl (%ecx), %eax + jmp .Lcls_epilogue + +.Lcls_retstruct4: + movl (%ecx), %eax + jmp .Lcls_epilogue + +.Lcls_retstruct: + # Caller expects us to pop struct return value pointer hidden arg. + movl %ebp, %esp + popl %ebp + ret $0x4 + +.Lcls_noretval: +.Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret +.ffi_closure_SYSV_end: +.LFE3: + +#if !FFI_NO_RAW_API + +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#define CIF_FLAGS_OFFSET 20 + + # This assumes we are using gas. + .balign 16 + .globl _ffi_closure_raw_SYSV +#ifndef __OS2__ + .def _ffi_closure_raw_SYSV; .scl 2; .type 32; .endef +#endif +_ffi_closure_raw_SYSV: +.LFB4: + pushl %ebp +.LCFI6: + movl %esp, %ebp +.LCFI7: + pushl %esi +.LCFI8: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ +0: + call 1f + # Do not insert anything here between the call and the jump table. +.Lrcls_store_table: + .long .Lrcls_noretval /* FFI_TYPE_VOID */ + .long .Lrcls_retint /* FFI_TYPE_INT */ + .long .Lrcls_retfloat /* FFI_TYPE_FLOAT */ + .long .Lrcls_retdouble /* FFI_TYPE_DOUBLE */ + .long .Lrcls_retldouble /* FFI_TYPE_LONGDOUBLE */ + .long .Lrcls_retuint8 /* FFI_TYPE_UINT8 */ + .long .Lrcls_retsint8 /* FFI_TYPE_SINT8 */ + .long .Lrcls_retuint16 /* FFI_TYPE_UINT16 */ + .long .Lrcls_retsint16 /* FFI_TYPE_SINT16 */ + .long .Lrcls_retint /* FFI_TYPE_UINT32 */ + .long .Lrcls_retint /* FFI_TYPE_SINT32 */ + .long .Lrcls_retllong /* FFI_TYPE_UINT64 */ + .long .Lrcls_retllong /* FFI_TYPE_SINT64 */ + .long .Lrcls_retstruct /* FFI_TYPE_STRUCT */ + .long .Lrcls_retint /* FFI_TYPE_POINTER */ + .long .Lrcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */ + .long .Lrcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */ + .long .Lrcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */ +1: + add %eax, %eax + add %eax, %eax + add (%esp),%eax + add $4, %esp + jmp *(%eax) + + /* Sign/zero extend as appropriate. */ +.Lrcls_retsint8: + movsbl -24(%ebp), %eax + jmp .Lrcls_epilogue + +.Lrcls_retsint16: + movswl -24(%ebp), %eax + jmp .Lrcls_epilogue + +.Lrcls_retuint8: + movzbl -24(%ebp), %eax + jmp .Lrcls_epilogue + +.Lrcls_retuint16: + movzwl -24(%ebp), %eax + jmp .Lrcls_epilogue + +.Lrcls_retint: + movl -24(%ebp), %eax + jmp .Lrcls_epilogue + +.Lrcls_retfloat: + flds -24(%ebp) + jmp .Lrcls_epilogue + +.Lrcls_retdouble: + fldl -24(%ebp) + jmp .Lrcls_epilogue + +.Lrcls_retldouble: + fldt -24(%ebp) + jmp .Lrcls_epilogue + +.Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp .Lrcls_epilogue + +.Lrcls_retstruct1: + movsbl -24(%ebp), %eax + jmp .Lrcls_epilogue + +.Lrcls_retstruct2: + movswl -24(%ebp), %eax + jmp .Lrcls_epilogue + +.Lrcls_retstruct4: + movl -24(%ebp), %eax + jmp .Lrcls_epilogue + +.Lrcls_retstruct: + # Nothing to do! + +.Lrcls_noretval: +.Lrcls_epilogue: + addl $36, %esp + popl %esi + popl %ebp + ret +.ffi_closure_raw_SYSV_end: +.LFE4: + +#endif /* !FFI_NO_RAW_API */ + + # This assumes we are using gas. + .balign 16 + .globl _ffi_closure_STDCALL +#ifndef __OS2__ + .def _ffi_closure_STDCALL; .scl 2; .type 32; .endef +#endif +_ffi_closure_STDCALL: +.LFB5: + pushl %ebp +.LCFI9: + movl %esp, %ebp +.LCFI10: + subl $40, %esp + leal -24(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 12(%ebp), %edx /* account for stub return address on stack */ + movl %edx, 4(%esp) /* args */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ + call _ffi_closure_SYSV_inner + movl -12(%ebp), %ecx +0: + call 1f + # Do not insert anything here between the call and the jump table. +.Lscls_store_table: + .long .Lscls_noretval /* FFI_TYPE_VOID */ + .long .Lscls_retint /* FFI_TYPE_INT */ + .long .Lscls_retfloat /* FFI_TYPE_FLOAT */ + .long .Lscls_retdouble /* FFI_TYPE_DOUBLE */ + .long .Lscls_retldouble /* FFI_TYPE_LONGDOUBLE */ + .long .Lscls_retuint8 /* FFI_TYPE_UINT8 */ + .long .Lscls_retsint8 /* FFI_TYPE_SINT8 */ + .long .Lscls_retuint16 /* FFI_TYPE_UINT16 */ + .long .Lscls_retsint16 /* FFI_TYPE_SINT16 */ + .long .Lscls_retint /* FFI_TYPE_UINT32 */ + .long .Lscls_retint /* FFI_TYPE_SINT32 */ + .long .Lscls_retllong /* FFI_TYPE_UINT64 */ + .long .Lscls_retllong /* FFI_TYPE_SINT64 */ + .long .Lscls_retstruct /* FFI_TYPE_STRUCT */ + .long .Lscls_retint /* FFI_TYPE_POINTER */ + .long .Lscls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */ + .long .Lscls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */ + .long .Lscls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */ +1: + add %eax, %eax + add %eax, %eax + add (%esp),%eax + add $4, %esp + jmp *(%eax) + + /* Sign/zero extend as appropriate. */ +.Lscls_retsint8: + movsbl (%ecx), %eax + jmp .Lscls_epilogue + +.Lscls_retsint16: + movswl (%ecx), %eax + jmp .Lscls_epilogue + +.Lscls_retuint8: + movzbl (%ecx), %eax + jmp .Lscls_epilogue + +.Lscls_retuint16: + movzwl (%ecx), %eax + jmp .Lscls_epilogue + +.Lscls_retint: + movl (%ecx), %eax + jmp .Lscls_epilogue + +.Lscls_retfloat: + flds (%ecx) + jmp .Lscls_epilogue + +.Lscls_retdouble: + fldl (%ecx) + jmp .Lscls_epilogue + +.Lscls_retldouble: + fldt (%ecx) + jmp .Lscls_epilogue + +.Lscls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp .Lscls_epilogue + +.Lscls_retstruct1: + movsbl (%ecx), %eax + jmp .Lscls_epilogue + +.Lscls_retstruct2: + movswl (%ecx), %eax + jmp .Lscls_epilogue + +.Lscls_retstruct4: + movl (%ecx), %eax + jmp .Lscls_epilogue + +.Lscls_retstruct: + # Nothing to do! + +.Lscls_noretval: +.Lscls_epilogue: + movl %ebp, %esp + popl %ebp + ret +.ffi_closure_STDCALL_end: +.LFE5: + +#ifndef __OS2__ + .section .eh_frame,"w" +#endif +.Lframe1: +.LSCIE1: + .long .LECIE1-.LASCIE1 /* Length of Common Information Entry */ +.LASCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ +#ifdef __PIC__ + .ascii "zR\0" /* CIE Augmentation */ +#else + .ascii "\0" /* CIE Augmentation */ +#endif + .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */ + .byte 0x8 /* CIE RA Column */ +#ifdef __PIC__ + .byte 0x1 /* .uleb128 0x1; Augmentation size */ + .byte 0x1b /* FDE Encoding (pcrel sdata4) */ +#endif + .byte 0xc /* DW_CFA_def_cfa CFA = r4 + 4 = 4(%esp) */ + .byte 0x4 /* .uleb128 0x4 */ + .byte 0x4 /* .uleb128 0x4 */ + .byte 0x88 /* DW_CFA_offset, column 0x8 %eip at CFA + 1 * -4 */ + .byte 0x1 /* .uleb128 0x1 */ + .align 4 +.LECIE1: + +.LSFDE1: + .long .LEFDE1-.LASFDE1 /* FDE Length */ +.LASFDE1: + .long .LASFDE1-.Lframe1 /* FDE CIE offset */ +#if defined __PIC__ && defined HAVE_AS_X86_PCREL + .long .LFB1-. /* FDE initial location */ +#else + .long .LFB1 +#endif + .long .LFE1-.LFB1 /* FDE address range */ +#ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ +#endif + /* DW_CFA_xxx CFI instructions go here. */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI0-.LFB1 + .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ + .byte 0x2 /* .uleb128 0x2 */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI1-.LCFI0 + .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ + .byte 0x5 /* .uleb128 0x5 */ + + /* End of DW_CFA_xxx CFI instructions. */ + .align 4 +.LEFDE1: + + +.LSFDE3: + .long .LEFDE3-.LASFDE3 /* FDE Length */ +.LASFDE3: + .long .LASFDE3-.Lframe1 /* FDE CIE offset */ +#if defined __PIC__ && defined HAVE_AS_X86_PCREL + .long .LFB3-. /* FDE initial location */ +#else + .long .LFB3 +#endif + .long .LFE3-.LFB3 /* FDE address range */ +#ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ +#endif + /* DW_CFA_xxx CFI instructions go here. */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI4-.LFB3 + .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ + .byte 0x2 /* .uleb128 0x2 */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI5-.LCFI4 + .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ + .byte 0x5 /* .uleb128 0x5 */ + + /* End of DW_CFA_xxx CFI instructions. */ + .align 4 +.LEFDE3: + +#if !FFI_NO_RAW_API + +.LSFDE4: + .long .LEFDE4-.LASFDE4 /* FDE Length */ +.LASFDE4: + .long .LASFDE4-.Lframe1 /* FDE CIE offset */ +#if defined __PIC__ && defined HAVE_AS_X86_PCREL + .long .LFB4-. /* FDE initial location */ +#else + .long .LFB4 +#endif + .long .LFE4-.LFB4 /* FDE address range */ +#ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ +#endif + /* DW_CFA_xxx CFI instructions go here. */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI6-.LFB4 + .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ + .byte 0x2 /* .uleb128 0x2 */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI7-.LCFI6 + .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ + .byte 0x5 /* .uleb128 0x5 */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI8-.LCFI7 + .byte 0x86 /* DW_CFA_offset, column 0x6 %esi at CFA + 3 * -4 */ + .byte 0x3 /* .uleb128 0x3 */ + + /* End of DW_CFA_xxx CFI instructions. */ + .align 4 +.LEFDE4: + +#endif /* !FFI_NO_RAW_API */ + +.LSFDE5: + .long .LEFDE5-.LASFDE5 /* FDE Length */ +.LASFDE5: + .long .LASFDE5-.Lframe1 /* FDE CIE offset */ +#if defined __PIC__ && defined HAVE_AS_X86_PCREL + .long .LFB5-. /* FDE initial location */ +#else + .long .LFB5 +#endif + .long .LFE5-.LFB5 /* FDE address range */ +#ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ +#endif + /* DW_CFA_xxx CFI instructions go here. */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI9-.LFB5 + .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ + .byte 0x2 /* .uleb128 0x2 */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI10-.LCFI9 + .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ + .byte 0x5 /* .uleb128 0x5 */ + + /* End of DW_CFA_xxx CFI instructions. */ + .align 4 +.LEFDE5: + +#endif /* !_MSC_VER */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win64.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win64.S new file mode 100644 index 0000000..fcdb270 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win64.S @@ -0,0 +1,468 @@ +#define LIBFFI_ASM +#include +#include + +/* Constants for ffi_call_win64 */ +#define STACK 0 +#define PREP_ARGS_FN 32 +#define ECIF 40 +#define CIF_BYTES 48 +#define CIF_FLAGS 56 +#define RVALUE 64 +#define FN 72 + +/* ffi_call_win64 (void (*prep_args_fn)(char *, extended_cif *), + extended_cif *ecif, unsigned bytes, unsigned flags, + unsigned *rvalue, void (*fn)()); + */ + +#ifdef _MSC_VER +PUBLIC ffi_call_win64 + +EXTRN __chkstk:NEAR +EXTRN ffi_closure_win64_inner:NEAR + +_TEXT SEGMENT + +;;; ffi_closure_win64 will be called with these registers set: +;;; rax points to 'closure' +;;; r11 contains a bit mask that specifies which of the +;;; first four parameters are float or double +;;; +;;; It must move the parameters passed in registers to their stack location, +;;; call ffi_closure_win64_inner for the actual work, then return the result. +;;; +ffi_closure_win64 PROC FRAME + ;; copy register arguments onto stack + test r11, 1 + jne first_is_float + mov QWORD PTR [rsp+8], rcx + jmp second +first_is_float: + movlpd QWORD PTR [rsp+8], xmm0 + +second: + test r11, 2 + jne second_is_float + mov QWORD PTR [rsp+16], rdx + jmp third +second_is_float: + movlpd QWORD PTR [rsp+16], xmm1 + +third: + test r11, 4 + jne third_is_float + mov QWORD PTR [rsp+24], r8 + jmp fourth +third_is_float: + movlpd QWORD PTR [rsp+24], xmm2 + +fourth: + test r11, 8 + jne fourth_is_float + mov QWORD PTR [rsp+32], r9 + jmp done +fourth_is_float: + movlpd QWORD PTR [rsp+32], xmm3 + +done: + .ALLOCSTACK 40 + sub rsp, 40 + .ENDPROLOG + mov rcx, rax ; context is first parameter + mov rdx, rsp ; stack is second parameter + add rdx, 48 ; point to start of arguments + mov rax, ffi_closure_win64_inner + call rax ; call the real closure function + add rsp, 40 + movd xmm0, rax ; If the closure returned a float, + ; ffi_closure_win64_inner wrote it to rax + ret 0 +ffi_closure_win64 ENDP + +ffi_call_win64 PROC FRAME + ;; copy registers onto stack + mov QWORD PTR [rsp+32], r9 + mov QWORD PTR [rsp+24], r8 + mov QWORD PTR [rsp+16], rdx + mov QWORD PTR [rsp+8], rcx + .PUSHREG rbp + push rbp + .ALLOCSTACK 48 + sub rsp, 48 ; 00000030H + .SETFRAME rbp, 32 + lea rbp, QWORD PTR [rsp+32] + .ENDPROLOG + + mov eax, DWORD PTR CIF_BYTES[rbp] + add rax, 15 + and rax, -16 + call __chkstk + sub rsp, rax + lea rax, QWORD PTR [rsp+32] + mov QWORD PTR STACK[rbp], rax + + mov rdx, QWORD PTR ECIF[rbp] + mov rcx, QWORD PTR STACK[rbp] + call QWORD PTR PREP_ARGS_FN[rbp] + + mov rsp, QWORD PTR STACK[rbp] + + movlpd xmm3, QWORD PTR [rsp+24] + movd r9, xmm3 + + movlpd xmm2, QWORD PTR [rsp+16] + movd r8, xmm2 + + movlpd xmm1, QWORD PTR [rsp+8] + movd rdx, xmm1 + + movlpd xmm0, QWORD PTR [rsp] + movd rcx, xmm0 + + call QWORD PTR FN[rbp] +ret_struct4b$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_4B + jne ret_struct2b$ + + mov rcx, QWORD PTR RVALUE[rbp] + mov DWORD PTR [rcx], eax + jmp ret_void$ + +ret_struct2b$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_2B + jne ret_struct1b$ + + mov rcx, QWORD PTR RVALUE[rbp] + mov WORD PTR [rcx], ax + jmp ret_void$ + +ret_struct1b$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_1B + jne ret_uint8$ + + mov rcx, QWORD PTR RVALUE[rbp] + mov BYTE PTR [rcx], al + jmp ret_void$ + +ret_uint8$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT8 + jne ret_sint8$ + + mov rcx, QWORD PTR RVALUE[rbp] + movzx rax, al + mov QWORD PTR [rcx], rax + jmp ret_void$ + +ret_sint8$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT8 + jne ret_uint16$ + + mov rcx, QWORD PTR RVALUE[rbp] + movsx rax, al + mov QWORD PTR [rcx], rax + jmp ret_void$ + +ret_uint16$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT16 + jne ret_sint16$ + + mov rcx, QWORD PTR RVALUE[rbp] + movzx rax, ax + mov QWORD PTR [rcx], rax + jmp SHORT ret_void$ + +ret_sint16$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT16 + jne ret_uint32$ + + mov rcx, QWORD PTR RVALUE[rbp] + movsx rax, ax + mov QWORD PTR [rcx], rax + jmp SHORT ret_void$ + +ret_uint32$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT32 + jne ret_sint32$ + + mov rcx, QWORD PTR RVALUE[rbp] + mov eax, eax + mov QWORD PTR [rcx], rax + jmp SHORT ret_void$ + +ret_sint32$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT32 + jne ret_float$ + + mov rcx, QWORD PTR RVALUE[rbp] + cdqe + mov QWORD PTR [rcx], rax + jmp SHORT ret_void$ + +ret_float$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_FLOAT + jne SHORT ret_double$ + + mov rax, QWORD PTR RVALUE[rbp] + movss DWORD PTR [rax], xmm0 + jmp SHORT ret_void$ + +ret_double$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_DOUBLE + jne SHORT ret_sint64$ + + mov rax, QWORD PTR RVALUE[rbp] + movlpd QWORD PTR [rax], xmm0 + jmp SHORT ret_void$ + +ret_sint64$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT64 + jne ret_void$ + + mov rcx, QWORD PTR RVALUE[rbp] + mov QWORD PTR [rcx], rax + jmp SHORT ret_void$ + +ret_void$: + xor rax, rax + + lea rsp, QWORD PTR [rbp+16] + pop rbp + ret 0 +ffi_call_win64 ENDP +_TEXT ENDS +END + +#else + +#ifdef SYMBOL_UNDERSCORE +#define SYMBOL_NAME(name) _##name +#else +#define SYMBOL_NAME(name) name +#endif + +.text + +.extern SYMBOL_NAME(ffi_closure_win64_inner) + +# ffi_closure_win64 will be called with these registers set: +# rax points to 'closure' +# r11 contains a bit mask that specifies which of the +# first four parameters are float or double +# +# It must move the parameters passed in registers to their stack location, +# call ffi_closure_win64_inner for the actual work, then return the result. +# + .balign 16 + .globl SYMBOL_NAME(ffi_closure_win64) +SYMBOL_NAME(ffi_closure_win64): + # copy register arguments onto stack + test $1,%r11 + jne .Lfirst_is_float + mov %rcx, 8(%rsp) + jmp .Lsecond +.Lfirst_is_float: + movlpd %xmm0, 8(%rsp) + +.Lsecond: + test $2, %r11 + jne .Lsecond_is_float + mov %rdx, 16(%rsp) + jmp .Lthird +.Lsecond_is_float: + movlpd %xmm1, 16(%rsp) + +.Lthird: + test $4, %r11 + jne .Lthird_is_float + mov %r8,24(%rsp) + jmp .Lfourth +.Lthird_is_float: + movlpd %xmm2, 24(%rsp) + +.Lfourth: + test $8, %r11 + jne .Lfourth_is_float + mov %r9, 32(%rsp) + jmp .Ldone +.Lfourth_is_float: + movlpd %xmm3, 32(%rsp) + +.Ldone: +#.ALLOCSTACK 40 + sub $40, %rsp +#.ENDPROLOG + mov %rax, %rcx # context is first parameter + mov %rsp, %rdx # stack is second parameter + add $48, %rdx # point to start of arguments + mov $SYMBOL_NAME(ffi_closure_win64_inner), %rax + callq *%rax # call the real closure function + add $40, %rsp + movq %rax, %xmm0 # If the closure returned a float, + # ffi_closure_win64_inner wrote it to rax + retq +.ffi_closure_win64_end: + + .balign 16 + .globl SYMBOL_NAME(ffi_call_win64) +SYMBOL_NAME(ffi_call_win64): + # copy registers onto stack + mov %r9,32(%rsp) + mov %r8,24(%rsp) + mov %rdx,16(%rsp) + mov %rcx,8(%rsp) + #.PUSHREG rbp + push %rbp + #.ALLOCSTACK 48 + sub $48,%rsp + #.SETFRAME rbp, 32 + lea 32(%rsp),%rbp + #.ENDPROLOG + + mov CIF_BYTES(%rbp),%eax + add $15, %rax + and $-16, %rax + cmpq $0x1000, %rax + jb Lch_done +Lch_probe: + subq $0x1000,%rsp + orl $0x0, (%rsp) + subq $0x1000,%rax + cmpq $0x1000,%rax + ja Lch_probe +Lch_done: + subq %rax, %rsp + orl $0x0, (%rsp) + lea 32(%rsp), %rax + mov %rax, STACK(%rbp) + + mov ECIF(%rbp), %rdx + mov STACK(%rbp), %rcx + callq *PREP_ARGS_FN(%rbp) + + mov STACK(%rbp), %rsp + + movlpd 24(%rsp), %xmm3 + movd %xmm3, %r9 + + movlpd 16(%rsp), %xmm2 + movd %xmm2, %r8 + + movlpd 8(%rsp), %xmm1 + movd %xmm1, %rdx + + movlpd (%rsp), %xmm0 + movd %xmm0, %rcx + + callq *FN(%rbp) +.Lret_struct4b: + cmpl $FFI_TYPE_SMALL_STRUCT_4B, CIF_FLAGS(%rbp) + jne .Lret_struct2b + + mov RVALUE(%rbp), %rcx + mov %eax, (%rcx) + jmp .Lret_void + +.Lret_struct2b: + cmpl $FFI_TYPE_SMALL_STRUCT_2B, CIF_FLAGS(%rbp) + jne .Lret_struct1b + + mov RVALUE(%rbp), %rcx + mov %ax, (%rcx) + jmp .Lret_void + +.Lret_struct1b: + cmpl $FFI_TYPE_SMALL_STRUCT_1B, CIF_FLAGS(%rbp) + jne .Lret_uint8 + + mov RVALUE(%rbp), %rcx + mov %al, (%rcx) + jmp .Lret_void + +.Lret_uint8: + cmpl $FFI_TYPE_UINT8, CIF_FLAGS(%rbp) + jne .Lret_sint8 + + mov RVALUE(%rbp), %rcx + movzbq %al, %rax + movq %rax, (%rcx) + jmp .Lret_void + +.Lret_sint8: + cmpl $FFI_TYPE_SINT8, CIF_FLAGS(%rbp) + jne .Lret_uint16 + + mov RVALUE(%rbp), %rcx + movsbq %al, %rax + movq %rax, (%rcx) + jmp .Lret_void + +.Lret_uint16: + cmpl $FFI_TYPE_UINT16, CIF_FLAGS(%rbp) + jne .Lret_sint16 + + mov RVALUE(%rbp), %rcx + movzwq %ax, %rax + movq %rax, (%rcx) + jmp .Lret_void + +.Lret_sint16: + cmpl $FFI_TYPE_SINT16, CIF_FLAGS(%rbp) + jne .Lret_uint32 + + mov RVALUE(%rbp), %rcx + movswq %ax, %rax + movq %rax, (%rcx) + jmp .Lret_void + +.Lret_uint32: + cmpl $FFI_TYPE_UINT32, CIF_FLAGS(%rbp) + jne .Lret_sint32 + + mov RVALUE(%rbp), %rcx + movl %eax, %eax + movq %rax, (%rcx) + jmp .Lret_void + +.Lret_sint32: + cmpl $FFI_TYPE_SINT32, CIF_FLAGS(%rbp) + jne .Lret_float + + mov RVALUE(%rbp), %rcx + cltq + movq %rax, (%rcx) + jmp .Lret_void + +.Lret_float: + cmpl $FFI_TYPE_FLOAT, CIF_FLAGS(%rbp) + jne .Lret_double + + mov RVALUE(%rbp), %rax + movss %xmm0, (%rax) + jmp .Lret_void + +.Lret_double: + cmpl $FFI_TYPE_DOUBLE, CIF_FLAGS(%rbp) + jne .Lret_sint64 + + mov RVALUE(%rbp), %rax + movlpd %xmm0, (%rax) + jmp .Lret_void + +.Lret_sint64: + cmpl $FFI_TYPE_SINT64, CIF_FLAGS(%rbp) + jne .Lret_void + + mov RVALUE(%rbp), %rcx + mov %rax, (%rcx) + jmp .Lret_void + +.Lret_void: + xor %rax, %rax + + lea 16(%rbp), %rsp + pop %rbp + retq +.ffi_call_win64_end: +#endif /* !_MSC_VER */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.am b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.am new file mode 100644 index 0000000..cfd1df4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.am @@ -0,0 +1,80 @@ +## Process this file with automake to produce Makefile.in. + +AUTOMAKE_OPTIONS = foreign dejagnu + +# Setup the testing framework, if you have one +EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \ + echo $(top_builddir)/../expect/expect ; \ + else echo expect ; fi` + +RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \ + echo $(top_srcdir)/../dejagnu/runtest ; \ + else echo runtest; fi` + +AM_RUNTESTFLAGS = + +CLEANFILES = *.exe core* *.log *.sum + +EXTRA_DIST = libffi.special/special.exp \ +libffi.special/unwindtest_ffi_call.cc libffi.special/unwindtest.cc \ +libffi.special/ffitestcxx.h config/default.exp lib/target-libpath.exp \ +lib/libffi.exp lib/wrapper.exp libffi.call/float.c \ +libffi.call/cls_multi_schar.c libffi.call/float3.c \ +libffi.call/cls_3_1byte.c libffi.call/stret_large2.c \ +libffi.call/cls_5_1_byte.c libffi.call/stret_medium.c \ +libffi.call/promotion.c libffi.call/cls_dbls_struct.c \ +libffi.call/nested_struct.c libffi.call/closure_fn1.c \ +libffi.call/cls_4_1byte.c libffi.call/cls_float.c \ +libffi.call/cls_2byte.c libffi.call/closure_fn4.c \ +libffi.call/return_fl2.c libffi.call/nested_struct7.c \ +libffi.call/cls_uint.c libffi.call/cls_align_sint64.c \ +libffi.call/float1.c libffi.call/cls_19byte.c \ +libffi.call/nested_struct1.c libffi.call/cls_4byte.c \ +libffi.call/return_fl1.c libffi.call/cls_align_pointer.c \ +libffi.call/nested_struct4.c libffi.call/nested_struct3.c \ +libffi.call/struct7.c libffi.call/nested_struct9.c \ +libffi.call/cls_sshort.c libffi.call/cls_ulonglong.c \ +libffi.call/cls_pointer_stack.c libffi.call/cls_multi_uchar.c \ +libffi.call/testclosure.c libffi.call/cls_3byte1.c \ +libffi.call/struct6.c libffi.call/return_uc.c libffi.call/return_ll1.c \ +libffi.call/cls_ushort.c libffi.call/stret_medium2.c \ +libffi.call/cls_multi_ushortchar.c libffi.call/return_dbl2.c \ +libffi.call/closure_loc_fn0.c libffi.call/return_sc.c \ +libffi.call/nested_struct8.c libffi.call/cls_7_1_byte.c \ +libffi.call/return_ll.c libffi.call/cls_pointer.c \ +libffi.call/err_bad_abi.c libffi.call/return_dbl1.c \ +libffi.call/call.exp libffi.call/ffitest.h libffi.call/strlen.c \ +libffi.call/return_sl.c libffi.call/cls_1_1byte.c \ +libffi.call/struct1.c libffi.call/cls_64byte.c libffi.call/return_ul.c \ +libffi.call/cls_double.c libffi.call/many_win32.c \ +libffi.call/cls_16byte.c libffi.call/cls_align_double.c \ +libffi.call/cls_align_uint16.c libffi.call/cls_9byte1.c \ +libffi.call/cls_multi_sshortchar.c libffi.call/cls_multi_ushort.c \ +libffi.call/closure_stdcall.c libffi.call/return_fl.c \ +libffi.call/strlen_win32.c libffi.call/return_ldl.c \ +libffi.call/cls_align_float.c libffi.call/struct3.c \ +libffi.call/cls_uchar.c libffi.call/cls_sint.c libffi.call/float2.c \ +libffi.call/cls_align_longdouble_split.c \ +libffi.call/cls_longdouble_va.c libffi.call/cls_multi_sshort.c \ +libffi.call/stret_large.c libffi.call/cls_align_sint16.c \ +libffi.call/nested_struct6.c libffi.call/cls_5byte.c \ +libffi.call/return_dbl.c libffi.call/cls_20byte.c \ +libffi.call/cls_8byte.c libffi.call/pyobjc-tc.c \ +libffi.call/cls_24byte.c libffi.call/cls_align_longdouble_split2.c \ +libffi.call/cls_6_1_byte.c libffi.call/cls_schar.c \ +libffi.call/cls_18byte.c libffi.call/closure_fn3.c \ +libffi.call/err_bad_typedef.c libffi.call/closure_fn2.c \ +libffi.call/struct2.c libffi.call/cls_3byte2.c \ +libffi.call/cls_align_longdouble.c libffi.call/cls_20byte1.c \ +libffi.call/return_fl3.c libffi.call/cls_align_uint32.c \ +libffi.call/problem1.c libffi.call/float4.c \ +libffi.call/cls_align_uint64.c libffi.call/struct9.c \ +libffi.call/closure_fn5.c libffi.call/cls_align_sint32.c \ +libffi.call/closure_fn0.c libffi.call/closure_fn6.c \ +libffi.call/struct4.c libffi.call/nested_struct2.c \ +libffi.call/cls_6byte.c libffi.call/cls_7byte.c libffi.call/many.c \ +libffi.call/struct8.c libffi.call/negint.c libffi.call/struct5.c \ +libffi.call/cls_12byte.c libffi.call/cls_double_va.c \ +libffi.call/cls_longdouble.c libffi.call/cls_9byte2.c \ +libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ +libffi.call/huge_struct.c diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.in b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.in new file mode 100644 index 0000000..53de9c0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.in @@ -0,0 +1,500 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = testsuite +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +DEJATOOL = $(PACKAGE) +RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_LTLDFLAGS = @AM_LTLDFLAGS@ +AM_RUNTESTFLAGS = +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PRTDIAG = @PRTDIAG@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TARGET = @TARGET@ +TARGETDIR = @TARGETDIR@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +ax_enable_builddir_sed = @ax_enable_builddir_sed@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sys_symbol_underscore = @sys_symbol_underscore@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +toolexecdir = @toolexecdir@ +toolexeclibdir = @toolexeclibdir@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign dejagnu + +# Setup the testing framework, if you have one +EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \ + echo $(top_builddir)/../expect/expect ; \ + else echo expect ; fi` + +RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \ + echo $(top_srcdir)/../dejagnu/runtest ; \ + else echo runtest; fi` + +CLEANFILES = *.exe core* *.log *.sum +EXTRA_DIST = libffi.special/special.exp \ +libffi.special/unwindtest_ffi_call.cc libffi.special/unwindtest.cc \ +libffi.special/ffitestcxx.h config/default.exp lib/target-libpath.exp \ +lib/libffi.exp lib/wrapper.exp libffi.call/float.c \ +libffi.call/cls_multi_schar.c libffi.call/float3.c \ +libffi.call/cls_3_1byte.c libffi.call/stret_large2.c \ +libffi.call/cls_5_1_byte.c libffi.call/stret_medium.c \ +libffi.call/promotion.c libffi.call/cls_dbls_struct.c \ +libffi.call/nested_struct.c libffi.call/closure_fn1.c \ +libffi.call/cls_4_1byte.c libffi.call/cls_float.c \ +libffi.call/cls_2byte.c libffi.call/closure_fn4.c \ +libffi.call/return_fl2.c libffi.call/nested_struct7.c \ +libffi.call/cls_uint.c libffi.call/cls_align_sint64.c \ +libffi.call/float1.c libffi.call/cls_19byte.c \ +libffi.call/nested_struct1.c libffi.call/cls_4byte.c \ +libffi.call/return_fl1.c libffi.call/cls_align_pointer.c \ +libffi.call/nested_struct4.c libffi.call/nested_struct3.c \ +libffi.call/struct7.c libffi.call/nested_struct9.c \ +libffi.call/cls_sshort.c libffi.call/cls_ulonglong.c \ +libffi.call/cls_pointer_stack.c libffi.call/cls_multi_uchar.c \ +libffi.call/testclosure.c libffi.call/cls_3byte1.c \ +libffi.call/struct6.c libffi.call/return_uc.c libffi.call/return_ll1.c \ +libffi.call/cls_ushort.c libffi.call/stret_medium2.c \ +libffi.call/cls_multi_ushortchar.c libffi.call/return_dbl2.c \ +libffi.call/closure_loc_fn0.c libffi.call/return_sc.c \ +libffi.call/nested_struct8.c libffi.call/cls_7_1_byte.c \ +libffi.call/return_ll.c libffi.call/cls_pointer.c \ +libffi.call/err_bad_abi.c libffi.call/return_dbl1.c \ +libffi.call/call.exp libffi.call/ffitest.h libffi.call/strlen.c \ +libffi.call/return_sl.c libffi.call/cls_1_1byte.c \ +libffi.call/struct1.c libffi.call/cls_64byte.c libffi.call/return_ul.c \ +libffi.call/cls_double.c libffi.call/many_win32.c \ +libffi.call/cls_16byte.c libffi.call/cls_align_double.c \ +libffi.call/cls_align_uint16.c libffi.call/cls_9byte1.c \ +libffi.call/cls_multi_sshortchar.c libffi.call/cls_multi_ushort.c \ +libffi.call/closure_stdcall.c libffi.call/return_fl.c \ +libffi.call/strlen_win32.c libffi.call/return_ldl.c \ +libffi.call/cls_align_float.c libffi.call/struct3.c \ +libffi.call/cls_uchar.c libffi.call/cls_sint.c libffi.call/float2.c \ +libffi.call/cls_align_longdouble_split.c \ +libffi.call/cls_longdouble_va.c libffi.call/cls_multi_sshort.c \ +libffi.call/stret_large.c libffi.call/cls_align_sint16.c \ +libffi.call/nested_struct6.c libffi.call/cls_5byte.c \ +libffi.call/return_dbl.c libffi.call/cls_20byte.c \ +libffi.call/cls_8byte.c libffi.call/pyobjc-tc.c \ +libffi.call/cls_24byte.c libffi.call/cls_align_longdouble_split2.c \ +libffi.call/cls_6_1_byte.c libffi.call/cls_schar.c \ +libffi.call/cls_18byte.c libffi.call/closure_fn3.c \ +libffi.call/err_bad_typedef.c libffi.call/closure_fn2.c \ +libffi.call/struct2.c libffi.call/cls_3byte2.c \ +libffi.call/cls_align_longdouble.c libffi.call/cls_20byte1.c \ +libffi.call/return_fl3.c libffi.call/cls_align_uint32.c \ +libffi.call/problem1.c libffi.call/float4.c \ +libffi.call/cls_align_uint64.c libffi.call/struct9.c \ +libffi.call/closure_fn5.c libffi.call/cls_align_sint32.c \ +libffi.call/closure_fn0.c libffi.call/closure_fn6.c \ +libffi.call/struct4.c libffi.call/nested_struct2.c \ +libffi.call/cls_6byte.c libffi.call/cls_7byte.c libffi.call/many.c \ +libffi.call/struct8.c libffi.call/negint.c libffi.call/struct5.c \ +libffi.call/cls_12byte.c libffi.call/cls_double_va.c \ +libffi.call/cls_longdouble.c libffi.call/cls_9byte2.c \ +libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ +libffi.call/huge_struct.c + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign testsuite/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +check-DEJAGNU: site.exp + srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \ + EXPECT=$(EXPECT); export EXPECT; \ + runtest=$(RUNTEST); \ + if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ + exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \ + if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ + then :; else exit_status=1; fi; \ + done; \ + else echo "WARNING: could not find \`runtest'" 1>&2; :;\ + fi; \ + exit $$exit_status +site.exp: Makefile + @echo 'Making a new site.exp file...' + @echo '## these variables are automatically generated by make ##' >site.tmp + @echo '# Do not edit here. If you wish to override these values' >>site.tmp + @echo '# edit the last section' >>site.tmp + @echo 'set srcdir $(srcdir)' >>site.tmp + @echo "set objdir `pwd`" >>site.tmp + @echo 'set build_alias "$(build_alias)"' >>site.tmp + @echo 'set build_triplet $(build_triplet)' >>site.tmp + @echo 'set host_alias "$(host_alias)"' >>site.tmp + @echo 'set host_triplet $(host_triplet)' >>site.tmp + @echo 'set target_alias "$(target_alias)"' >>site.tmp + @echo 'set target_triplet $(target_triplet)' >>site.tmp + @echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp + @test ! -f site.exp || \ + sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp + @-rm -f site.bak + @test ! -f site.exp || mv site.exp site.bak + @mv site.tmp site.exp + +distclean-DEJAGNU: + -rm -f site.exp site.bak + -l='$(DEJATOOL)'; for tool in $$l; do \ + rm -f $$tool.sum $$tool.log; \ + done + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-DEJAGNU distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \ + clean-libtool distclean distclean-DEJAGNU distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/config/default.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/config/default.exp new file mode 100644 index 0000000..90967cc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/config/default.exp @@ -0,0 +1 @@ +load_lib "standard.exp" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp new file mode 100644 index 0000000..304d2f5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp @@ -0,0 +1,300 @@ +# Copyright (C) 2003, 2005, 2008, 2009 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 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +proc load_gcc_lib { filename } { + global srcdir + load_file $srcdir/lib/$filename +} + +load_lib dg.exp +load_lib libgloss.exp +load_gcc_lib target-libpath.exp +load_gcc_lib wrapper.exp + + +# Define libffi callbacks for dg.exp. + +proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } { + + # To get all \n in dg-output test strings to match printf output + # in a system that outputs it as \015\012 (i.e. not just \012), we + # need to change all \n into \r?\n. As there is no dejagnu flag + # or hook to do that, we simply change the text being tested. + # Unfortunately, we have to know that the variable is called + # dg-output-text and lives in the caller of libffi-dg-test, which + # is two calls up. Overriding proc dg-output would be longer and + # would necessarily have the same assumption. + upvar 2 dg-output-text output_match + + if { [llength $output_match] > 1 } { + regsub -all "\n" [lindex $output_match 1] "\r?\n" x + set output_match [lreplace $output_match 1 1 $x] + } + + # Set up the compiler flags, based on what we're going to do. + + set options [list] + switch $do_what { + "compile" { + set compile_type "assembly" + set output_file "[file rootname [file tail $prog]].s" + } + "link" { + set compile_type "executable" + set output_file "[file rootname [file tail $prog]].exe" + # The following line is needed for targets like the i960 where + # the default output file is b.out. Sigh. + } + "run" { + set compile_type "executable" + # FIXME: "./" is to cope with "." not being in $PATH. + # Should this be handled elsewhere? + # YES. + set output_file "./[file rootname [file tail $prog]].exe" + # This is the only place where we care if an executable was + # created or not. If it was, dg.exp will try to run it. + remote_file build delete $output_file; + } + default { + perror "$do_what: not a valid dg-do keyword" + return "" + } + } + + if { $extra_tool_flags != "" } { + lappend options "additional_flags=$extra_tool_flags" + } + + set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options]; + + + return [list $comp_output $output_file] +} + + +proc libffi-dg-test { prog do_what extra_tool_flags } { + return [libffi-dg-test-1 target_compile $prog $do_what $extra_tool_flags] +} + +proc libffi-init { args } { + global gluefile wrap_flags; + global srcdir + global blddirffi + global objdir + global TOOL_OPTIONS + global tool + global libffi_include + global libffi_link_flags + global tool_root_dir + global ld_library_path + + set blddirffi [pwd]/.. + verbose "libffi $blddirffi" + + set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a] + if {$gccdir != ""} { + set gccdir [file dirname $gccdir] + } + verbose "gccdir $gccdir" + + set ld_library_path "." + append ld_library_path ":${gccdir}" + + set compiler "${gccdir}/xgcc" + if { [is_remote host] == 0 && [which $compiler] != 0 } { + foreach i "[exec $compiler --print-multi-lib]" { + set mldir "" + regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir + set mldir [string trimright $mldir "\;@"] + if { "$mldir" == "." } { + continue + } + if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } { + append ld_library_path ":${gccdir}/${mldir}" + } + } + } + # add the library path for libffi. + append ld_library_path ":${blddirffi}/.libs" + + verbose "ld_library_path: $ld_library_path" + + # Point to the Libffi headers in libffi. + set libffi_include "${blddirffi}/include" + verbose "libffi_include $libffi_include" + + set libffi_dir "${blddirffi}/.libs" + verbose "libffi_dir $libffi_dir" + if { $libffi_dir != "" } { + set libffi_dir [file dirname ${libffi_dir}] + set libffi_link_flags "-L${libffi_dir}/.libs" + } + + set_ld_library_path_env_vars + libffi_maybe_build_wrapper "${objdir}/testglue.o" +} + +proc libffi_exit { } { + global gluefile; + + if [info exists gluefile] { + file_on_build delete $gluefile; + unset gluefile; + } +} + +proc libffi_target_compile { source dest type options } { + global gluefile wrap_flags; + global srcdir + global blddirffi + global TOOL_OPTIONS + global libffi_link_flags + global libffi_include + global target_triplet + + + if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } { + lappend options "libs=${gluefile}" + lappend options "ldflags=$wrap_flags" + } + + # TOOL_OPTIONS must come first, so that it doesn't override testcase + # specific options. + if [info exists TOOL_OPTIONS] { + lappend options [concat "additional_flags=$TOOL_OPTIONS" $options]; + } + + # search for ffi_mips.h in srcdir, too + lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include -I${libffi_include}/.." + lappend options "additional_flags=${libffi_link_flags}" + + # Darwin needs a stack execution allowed flag. + + if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"] + || [istarget "*-*-darwin2*"] } { + lappend options "additional_flags=-Wl,-allow_stack_execute" + } + + # If you're building the compiler with --prefix set to a place + # where it's not yet installed, then the linker won't be able to + # find the libgcc used by libffi.dylib. We could pass the + # -dylib_file option, but that's complicated, and it's much easier + # to just make the linker find libgcc using -L options. + if { [string match "*-*-darwin*" $target_triplet] } { + lappend options "libs= -shared-libgcc" + } + + if { [string match "*-*-openbsd*" $target_triplet] } { + lappend options "libs= -lpthread" + } + + lappend options "libs= -lffi" + + verbose "options: $options" + return [target_compile $source $dest $type $options] +} + +# Utility routines. + +# +# search_for -- looks for a string match in a file +# +proc search_for { file pattern } { + set fd [open $file r] + while { [gets $fd cur_line]>=0 } { + if [string match "*$pattern*" $cur_line] then { + close $fd + return 1 + } + } + close $fd + return 0 +} + +# Modified dg-runtest that can cycle through a list of optimization options +# as c-torture does. +proc libffi-dg-runtest { testcases default-extra-flags } { + global runtests + + foreach test $testcases { + # If we're only testing specific files and this isn't one of + # them, skip it. + if ![runtest_file_p $runtests $test] { + continue + } + + # Look for a loop within the source code - if we don't find one, + # don't pass -funroll[-all]-loops. + global torture_with_loops torture_without_loops + if [expr [search_for $test "for*("]+[search_for $test "while*("]] { + set option_list $torture_with_loops + } else { + set option_list $torture_without_loops + } + + set nshort [file tail [file dirname $test]]/[file tail $test] + + foreach flags $option_list { + verbose "Testing $nshort, $flags" 1 + dg-test $test $flags ${default-extra-flags} + } + } +} + + +# Like check_conditional_xfail, but callable from a dg test. + +proc dg-xfail-if { args } { + set args [lreplace $args 0 0] + set selector "target [join [lindex $args 1]]" + if { [dg-process-target $selector] == "S" } { + global compiler_conditional_xfail_data + set compiler_conditional_xfail_data $args + } +} + + +# We need to make sure that additional_files and additional_sources +# are both cleared out after every test. It is not enough to clear +# them out *before* the next test run because gcc-target-compile gets +# run directly from some .exp files (outside of any test). (Those +# uses should eventually be eliminated.) + +# Because the DG framework doesn't provide a hook that is run at the +# end of a test, we must replace dg-test with a wrapper. + +if { [info procs saved-dg-test] == [list] } { + rename dg-test saved-dg-test + + proc dg-test { args } { + global additional_files + global additional_sources + global errorInfo + + if { [ catch { eval saved-dg-test $args } errmsg ] } { + set saved_info $errorInfo + set additional_files "" + set additional_sources "" + error $errmsg $saved_info + } + set additional_files "" + set additional_sources "" + } +} + +# Local Variables: +# tcl-indent-level:4 +# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi.exp new file mode 100644 index 0000000..4a65ed1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi.exp @@ -0,0 +1,350 @@ +# Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011 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 3 of the License, 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; see the file COPYING3. If not see +# . + +proc load_gcc_lib { filename } { + global srcdir + load_file $srcdir/lib/$filename +} + +load_lib dg.exp +load_lib libgloss.exp +load_gcc_lib target-libpath.exp +load_gcc_lib wrapper.exp + + +# Define libffi callbacks for dg.exp. + +proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } { + + # To get all \n in dg-output test strings to match printf output + # in a system that outputs it as \015\012 (i.e. not just \012), we + # need to change all \n into \r?\n. As there is no dejagnu flag + # or hook to do that, we simply change the text being tested. + # Unfortunately, we have to know that the variable is called + # dg-output-text and lives in the caller of libffi-dg-test, which + # is two calls up. Overriding proc dg-output would be longer and + # would necessarily have the same assumption. + upvar 2 dg-output-text output_match + + if { [llength $output_match] > 1 } { + regsub -all "\n" [lindex $output_match 1] "\r?\n" x + set output_match [lreplace $output_match 1 1 $x] + } + + # Set up the compiler flags, based on what we're going to do. + + set options [list] + switch $do_what { + "compile" { + set compile_type "assembly" + set output_file "[file rootname [file tail $prog]].s" + } + "link" { + set compile_type "executable" + set output_file "[file rootname [file tail $prog]].exe" + # The following line is needed for targets like the i960 where + # the default output file is b.out. Sigh. + } + "run" { + set compile_type "executable" + # FIXME: "./" is to cope with "." not being in $PATH. + # Should this be handled elsewhere? + # YES. + set output_file "./[file rootname [file tail $prog]].exe" + # This is the only place where we care if an executable was + # created or not. If it was, dg.exp will try to run it. + remote_file build delete $output_file; + } + default { + perror "$do_what: not a valid dg-do keyword" + return "" + } + } + + if { $extra_tool_flags != "" } { + lappend options "additional_flags=$extra_tool_flags" + } + + set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options]; + + + return [list $comp_output $output_file] +} + + +proc libffi-dg-test { prog do_what extra_tool_flags } { + return [libffi-dg-test-1 target_compile $prog $do_what $extra_tool_flags] +} + +proc libffi-init { args } { + global gluefile wrap_flags; + global srcdir + global blddirffi + global objdir + global TOOL_OPTIONS + global tool + global libffi_include + global libffi_link_flags + global tool_root_dir + global ld_library_path + + set blddirffi [pwd]/.. + verbose "libffi $blddirffi" + + set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a] + if {$gccdir != ""} { + set gccdir [file dirname $gccdir] + } + verbose "gccdir $gccdir" + + set ld_library_path "." + append ld_library_path ":${gccdir}" + + set compiler "${gccdir}/xgcc" + if { [is_remote host] == 0 && [which $compiler] != 0 } { + foreach i "[exec $compiler --print-multi-lib]" { + set mldir "" + regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir + set mldir [string trimright $mldir "\;@"] + if { "$mldir" == "." } { + continue + } + if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } { + append ld_library_path ":${gccdir}/${mldir}" + } + } + } + # add the library path for libffi. + append ld_library_path ":${blddirffi}/.libs" + + verbose "ld_library_path: $ld_library_path" + + # Point to the Libffi headers in libffi. + set libffi_include "${blddirffi}/include" + verbose "libffi_include $libffi_include" + + set libffi_dir "${blddirffi}/.libs" + verbose "libffi_dir $libffi_dir" + if { $libffi_dir != "" } { + set libffi_dir [file dirname ${libffi_dir}] + set libffi_link_flags "-L${libffi_dir}/.libs" + } + + set_ld_library_path_env_vars + libffi_maybe_build_wrapper "${objdir}/testglue.o" +} + +proc libffi_exit { } { + global gluefile; + + if [info exists gluefile] { + file_on_build delete $gluefile; + unset gluefile; + } +} + +proc libffi_target_compile { source dest type options } { + global gluefile wrap_flags; + global srcdir + global blddirffi + global TOOL_OPTIONS + global libffi_link_flags + global libffi_include + global target_triplet + + + if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } { + lappend options "libs=${gluefile}" + lappend options "ldflags=$wrap_flags" + } + + # TOOL_OPTIONS must come first, so that it doesn't override testcase + # specific options. + if [info exists TOOL_OPTIONS] { + lappend options [concat "additional_flags=$TOOL_OPTIONS" $options]; + } + + # search for ffi_mips.h in srcdir, too + lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include -I${libffi_include}/.." + lappend options "additional_flags=${libffi_link_flags}" + + # Darwin needs a stack execution allowed flag. + + if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"] + || [istarget "*-*-darwin2*"] } { + lappend options "additional_flags=-Wl,-allow_stack_execute" + } + + # If you're building the compiler with --prefix set to a place + # where it's not yet installed, then the linker won't be able to + # find the libgcc used by libffi.dylib. We could pass the + # -dylib_file option, but that's complicated, and it's much easier + # to just make the linker find libgcc using -L options. + if { [string match "*-*-darwin*" $target_triplet] } { + lappend options "libs= -shared-libgcc" + } + + if { [string match "*-*-openbsd*" $target_triplet] } { + lappend options "libs= -lpthread" + } + + lappend options "libs= -lffi" + + verbose "options: $options" + return [target_compile $source $dest $type $options] +} + +# Utility routines. + +# +# search_for -- looks for a string match in a file +# +proc search_for { file pattern } { + set fd [open $file r] + while { [gets $fd cur_line]>=0 } { + if [string match "*$pattern*" $cur_line] then { + close $fd + return 1 + } + } + close $fd + return 0 +} + +# Modified dg-runtest that can cycle through a list of optimization options +# as c-torture does. +proc libffi-dg-runtest { testcases default-extra-flags } { + global runtests + + foreach test $testcases { + # If we're only testing specific files and this isn't one of + # them, skip it. + if ![runtest_file_p $runtests $test] { + continue + } + + # Look for a loop within the source code - if we don't find one, + # don't pass -funroll[-all]-loops. + global torture_with_loops torture_without_loops + if [expr [search_for $test "for*("]+[search_for $test "while*("]] { + set option_list $torture_with_loops + } else { + set option_list $torture_without_loops + } + + set nshort [file tail [file dirname $test]]/[file tail $test] + + foreach flags $option_list { + verbose "Testing $nshort, $flags" 1 + dg-test $test $flags ${default-extra-flags} + } + } +} + + +# Like check_conditional_xfail, but callable from a dg test. + +proc dg-xfail-if { args } { + set args [lreplace $args 0 0] + set selector "target [join [lindex $args 1]]" + if { [dg-process-target $selector] == "S" } { + global compiler_conditional_xfail_data + set compiler_conditional_xfail_data $args + } +} + +proc check-flags { args } { + + # The args are within another list; pull them out. + set args [lindex $args 0] + + # The next two arguments are optional. If they were not specified, + # use the defaults. + if { [llength $args] == 2 } { + lappend $args [list "*"] + } + if { [llength $args] == 3 } { + lappend $args [list ""] + } + + # If the option strings are the defaults, or the same as the + # defaults, there is no need to call check_conditional_xfail to + # compare them to the actual options. + if { [string compare [lindex $args 2] "*"] == 0 + && [string compare [lindex $args 3] "" ] == 0 } { + set result 1 + } else { + # The target list might be an effective-target keyword, so replace + # the original list with "*-*-*", since we already know it matches. + set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]] + } + + return $result +} + +proc dg-skip-if { args } { + # Verify the number of arguments. The last two are optional. + set args [lreplace $args 0 0] + if { [llength $args] < 2 || [llength $args] > 4 } { + error "dg-skip-if 2: need 2, 3, or 4 arguments" + } + + # Don't bother if we're already skipping the test. + upvar dg-do-what dg-do-what + if { [lindex ${dg-do-what} 1] == "N" } { + return + } + + set selector [list target [lindex $args 1]] + if { [dg-process-target $selector] == "S" } { + if [check-flags $args] { + upvar dg-do-what dg-do-what + set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] + } + } +} + +# We need to make sure that additional_files and additional_sources +# are both cleared out after every test. It is not enough to clear +# them out *before* the next test run because gcc-target-compile gets +# run directly from some .exp files (outside of any test). (Those +# uses should eventually be eliminated.) + +# Because the DG framework doesn't provide a hook that is run at the +# end of a test, we must replace dg-test with a wrapper. + +if { [info procs saved-dg-test] == [list] } { + rename dg-test saved-dg-test + + proc dg-test { args } { + global additional_files + global additional_sources + global errorInfo + + if { [ catch { eval saved-dg-test $args } errmsg ] } { + set saved_info $errorInfo + set additional_files "" + set additional_sources "" + error $errmsg $saved_info + } + set additional_files "" + set additional_sources "" + } +} + +# Local Variables: +# tcl-indent-level:4 +# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp new file mode 100644 index 0000000..8999aa4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp @@ -0,0 +1,263 @@ +# Copyright (C) 2004, 2005, 2007 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 3 of the License, 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 GCC; see the file COPYING3. If not see +# . + +# This file was contributed by John David Anglin (dave.anglin@nrc-cnrc.gc.ca) + +set orig_environment_saved 0 +set orig_ld_library_path_saved 0 +set orig_ld_run_path_saved 0 +set orig_shlib_path_saved 0 +set orig_ld_libraryn32_path_saved 0 +set orig_ld_library64_path_saved 0 +set orig_ld_library_path_32_saved 0 +set orig_ld_library_path_64_saved 0 +set orig_dyld_library_path_saved 0 + + +####################################### +# proc set_ld_library_path_env_vars { } +####################################### + +proc set_ld_library_path_env_vars { } { + global ld_library_path + global orig_environment_saved + global orig_ld_library_path_saved + global orig_ld_run_path_saved + global orig_shlib_path_saved + global orig_ld_libraryn32_path_saved + global orig_ld_library64_path_saved + global orig_ld_library_path_32_saved + global orig_ld_library_path_64_saved + global orig_dyld_library_path_saved + global orig_ld_library_path + global orig_ld_run_path + global orig_shlib_path + global orig_ld_libraryn32_path + global orig_ld_library64_path + global orig_ld_library_path_32 + global orig_ld_library_path_64 + global orig_dyld_library_path + global GCC_EXEC_PREFIX + + # Set the relocated compiler prefix, but only if the user hasn't specified one. + if { [info exists GCC_EXEC_PREFIX] && ![info exists env(GCC_EXEC_PREFIX)] } { + setenv GCC_EXEC_PREFIX "$GCC_EXEC_PREFIX" + } + + # Setting the ld library path causes trouble when testing cross-compilers. + if { [is_remote target] } { + return + } + + if { $orig_environment_saved == 0 } { + global env + + set orig_environment_saved 1 + + # Save the original environment. + if [info exists env(LD_LIBRARY_PATH)] { + set orig_ld_library_path "$env(LD_LIBRARY_PATH)" + set orig_ld_library_path_saved 1 + } + if [info exists env(LD_RUN_PATH)] { + set orig_ld_run_path "$env(LD_RUN_PATH)" + set orig_ld_run_path_saved 1 + } + if [info exists env(SHLIB_PATH)] { + set orig_shlib_path "$env(SHLIB_PATH)" + set orig_shlib_path_saved 1 + } + if [info exists env(LD_LIBRARYN32_PATH)] { + set orig_ld_libraryn32_path "$env(LD_LIBRARYN32_PATH)" + set orig_ld_libraryn32_path_saved 1 + } + if [info exists env(LD_LIBRARY64_PATH)] { + set orig_ld_library64_path "$env(LD_LIBRARY64_PATH)" + set orig_ld_library64_path_saved 1 + } + if [info exists env(LD_LIBRARY_PATH_32)] { + set orig_ld_library_path_32 "$env(LD_LIBRARY_PATH_32)" + set orig_ld_library_path_32_saved 1 + } + if [info exists env(LD_LIBRARY_PATH_64)] { + set orig_ld_library_path_64 "$env(LD_LIBRARY_PATH_64)" + set orig_ld_library_path_64_saved 1 + } + if [info exists env(DYLD_LIBRARY_PATH)] { + set orig_dyld_library_path "$env(DYLD_LIBRARY_PATH)" + set orig_dyld_library_path_saved 1 + } + } + + # We need to set ld library path in the environment. Currently, + # unix.exp doesn't set the environment correctly for all systems. + # It only sets SHLIB_PATH and LD_LIBRARY_PATH when it executes a + # program. We also need the environment set for compilations, etc. + # + # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but + # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH + # (for the 64-bit ABI). The same applies to Darwin (DYLD_LIBRARY_PATH), + # Solaris 32 bit (LD_LIBRARY_PATH_32), Solaris 64 bit (LD_LIBRARY_PATH_64), + # and HP-UX (SHLIB_PATH). In some cases, the variables are independent + # of LD_LIBRARY_PATH, and in other cases LD_LIBRARY_PATH is used if the + # variable is not defined. + # + # Doing this is somewhat of a hack as ld_library_path gets repeated in + # SHLIB_PATH and LD_LIBRARY_PATH when unix_load sets these variables. + if { $orig_ld_library_path_saved } { + setenv LD_LIBRARY_PATH "$ld_library_path:$orig_ld_library_path" + } else { + setenv LD_LIBRARY_PATH "$ld_library_path" + } + if { $orig_ld_run_path_saved } { + setenv LD_RUN_PATH "$ld_library_path:$orig_ld_run_path" + } else { + setenv LD_RUN_PATH "$ld_library_path" + } + # The default shared library dynamic path search for 64-bit + # HP-UX executables searches LD_LIBRARY_PATH before SHLIB_PATH. + # LD_LIBRARY_PATH isn't used for 32-bit executables. Thus, we + # set LD_LIBRARY_PATH and SHLIB_PATH as if they were independent. + if { $orig_shlib_path_saved } { + setenv SHLIB_PATH "$ld_library_path:$orig_shlib_path" + } else { + setenv SHLIB_PATH "$ld_library_path" + } + if { $orig_ld_libraryn32_path_saved } { + setenv LD_LIBRARYN32_PATH "$ld_library_path:$orig_ld_libraryn32_path" + } elseif { $orig_ld_library_path_saved } { + setenv LD_LIBRARYN32_PATH "$ld_library_path:$orig_ld_library_path" + } else { + setenv LD_LIBRARYN32_PATH "$ld_library_path" + } + if { $orig_ld_library64_path_saved } { + setenv LD_LIBRARY64_PATH "$ld_library_path:$orig_ld_library64_path" + } elseif { $orig_ld_library_path_saved } { + setenv LD_LIBRARY64_PATH "$ld_library_path:$orig_ld_library_path" + } else { + setenv LD_LIBRARY64_PATH "$ld_library_path" + } + if { $orig_ld_library_path_32_saved } { + setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path_32" + } elseif { $orig_ld_library_path_saved } { + setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path" + } else { + setenv LD_LIBRARY_PATH_32 "$ld_library_path" + } + if { $orig_ld_library_path_64_saved } { + setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path_64" + } elseif { $orig_ld_library_path_saved } { + setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path" + } else { + setenv LD_LIBRARY_PATH_64 "$ld_library_path" + } + if { $orig_dyld_library_path_saved } { + setenv DYLD_LIBRARY_PATH "$ld_library_path:$orig_dyld_library_path" + } else { + setenv DYLD_LIBRARY_PATH "$ld_library_path" + } + + verbose -log "set_ld_library_path_env_vars: ld_library_path=$ld_library_path" +} + +####################################### +# proc restore_ld_library_path_env_vars { } +####################################### + +proc restore_ld_library_path_env_vars { } { + global orig_environment_saved + global orig_ld_library_path_saved + global orig_ld_run_path_saved + global orig_shlib_path_saved + global orig_ld_libraryn32_path_saved + global orig_ld_library64_path_saved + global orig_ld_library_path_32_saved + global orig_ld_library_path_64_saved + global orig_dyld_library_path_saved + global orig_ld_library_path + global orig_ld_run_path + global orig_shlib_path + global orig_ld_libraryn32_path + global orig_ld_library64_path + global orig_ld_library_path_32 + global orig_ld_library_path_64 + global orig_dyld_library_path + + if { $orig_environment_saved == 0 } { + return + } + + if { $orig_ld_library_path_saved } { + setenv LD_LIBRARY_PATH "$orig_ld_library_path" + } elseif [info exists env(LD_LIBRARY_PATH)] { + unsetenv LD_LIBRARY_PATH + } + if { $orig_ld_run_path_saved } { + setenv LD_RUN_PATH "$orig_ld_run_path" + } elseif [info exists env(LD_RUN_PATH)] { + unsetenv LD_RUN_PATH + } + if { $orig_shlib_path_saved } { + setenv SHLIB_PATH "$orig_shlib_path" + } elseif [info exists env(SHLIB_PATH)] { + unsetenv SHLIB_PATH + } + if { $orig_ld_libraryn32_path_saved } { + setenv LD_LIBRARYN32_PATH "$orig_ld_libraryn32_path" + } elseif [info exists env(LD_LIBRARYN32_PATH)] { + unsetenv LD_LIBRARYN32_PATH + } + if { $orig_ld_library64_path_saved } { + setenv LD_LIBRARY64_PATH "$orig_ld_library64_path" + } elseif [info exists env(LD_LIBRARY64_PATH)] { + unsetenv LD_LIBRARY64_PATH + } + if { $orig_ld_library_path_32_saved } { + setenv LD_LIBRARY_PATH_32 "$orig_ld_library_path_32" + } elseif [info exists env(LD_LIBRARY_PATH_32)] { + unsetenv LD_LIBRARY_PATH_32 + } + if { $orig_ld_library_path_64_saved } { + setenv LD_LIBRARY_PATH_64 "$orig_ld_library_path_64" + } elseif [info exists env(LD_LIBRARY_PATH_64)] { + unsetenv LD_LIBRARY_PATH_64 + } + if { $orig_dyld_library_path_saved } { + setenv DYLD_LIBRARY_PATH "$orig_dyld_library_path" + } elseif [info exists env(DYLD_LIBRARY_PATH)] { + unsetenv DYLD_LIBRARY_PATH + } +} + +####################################### +# proc get_shlib_extension { } +####################################### + +proc get_shlib_extension { } { + global shlib_ext + + if { [ istarget *-*-darwin* ] } { + set shlib_ext "dylib" + } elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-mingw* ] } { + set shlib_ext "dll" + } elseif { [ istarget hppa*-*-hpux* ] } { + set shlib_ext "sl" + } else { + set shlib_ext "so" + } + return $shlib_ext +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/wrapper.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/wrapper.exp new file mode 100644 index 0000000..4e5ae43 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/wrapper.exp @@ -0,0 +1,45 @@ +# Copyright (C) 2004, 2007 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 3 of the License, 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 GCC; see the file COPYING3. If not see +# . + +# This file contains GCC-specifics for status wrappers for test programs. + +# ${tool}_maybe_build_wrapper -- Build wrapper object if the target +# needs it. FILENAME is the path to the wrapper file. If there are +# additional arguments, they are command-line options to provide to +# the compiler when compiling FILENAME. + +proc ${tool}_maybe_build_wrapper { filename args } { + global gluefile wrap_flags + + if { [target_info needs_status_wrapper] != "" \ + && [target_info needs_status_wrapper] != "0" \ + && ![info exists gluefile] } { + set saved_wrap_compile_flags [target_info wrap_compile_flags] + set flags [join $args " "] + # The wrapper code may contain code that gcc objects on. This + # became true for dejagnu-1.4.4. The set of warnings and code + # that gcc objects on may change, so just make sure -w is always + # passed to turn off all warnings. + set_currtarget_info wrap_compile_flags \ + "$saved_wrap_compile_flags -w $flags" + set result [build_wrapper $filename] + set_currtarget_info wrap_compile_flags "$saved_wrap_compile_flags" + if { $result != "" } { + set gluefile [lindex $result 0] + set wrap_flags [lindex $result 1] + } + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/call.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/call.exp new file mode 100644 index 0000000..26acd81 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/call.exp @@ -0,0 +1,32 @@ +# Copyright (C) 2003, 2006, 2009, 2010 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 3 of the License, 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; see the file COPYING3. If not see +# . + +dg-init +libffi-init + +global srcdir subdir + +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O0 -W -Wall" "" +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O2" "" +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O3" "" +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-Os" "" +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O2 -fomit-frame-pointer" "" + +dg-finish + +# Local Variables: +# tcl-indent-level:4 +# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c new file mode 100644 index 0000000..a579ff6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c @@ -0,0 +1,89 @@ +/* Area: closure_call + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: 20030828 */ + + + + +/* { dg-do run } */ +#include "ffitest.h" + +static void +closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) + + (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] + + (int)(*(signed short *)args[4]) + + (int)(*(unsigned long long *)args[5]) + + (int)*(int *)args[6] + (int)(*(int *)args[7]) + + (int)(*(double *)args[8]) + (int)*(int *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(int *)args[13]) + + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]), + (int)(*(unsigned long long *)args[2]), + (int)*(int *)args[3], (int)(*(signed short *)args[4]), + (int)(*(unsigned long long *)args[5]), + (int)*(int *)args[6], (int)(*(int *)args[7]), + (int)(*(double *)args[8]), (int)*(int *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(int *)args[13]), + (int)(*(int *)args[14]),*(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); + +} + +typedef int (*closure_test_type0)(unsigned long long, int, unsigned long long, + int, signed short, unsigned long long, int, + int, double, int, int, float, int, int, + int, int); + +int main (void) +{ + ffi_cif cif; + void * code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_uint64; + cl_arg_types[1] = &ffi_type_sint; + cl_arg_types[2] = &ffi_type_uint64; + cl_arg_types[3] = &ffi_type_sint; + cl_arg_types[4] = &ffi_type_sshort; + cl_arg_types[5] = &ffi_type_uint64; + cl_arg_types[6] = &ffi_type_sint; + cl_arg_types[7] = &ffi_type_sint; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_sint; + cl_arg_types[10] = &ffi_type_sint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_sint; + cl_arg_types[14] = &ffi_type_sint; + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type0)code)) + (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13, + 19, 21, 1); + /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 680" } */ + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c new file mode 100644 index 0000000..9123173 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c @@ -0,0 +1,81 @@ +/* Area: closure_call. + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + + +static void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(float *)args[0] +(int)(*(float *)args[1]) + + (int)(*(float *)args[2]) + (int)*(float *)args[3] + + (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + + (int)*(float *)args[6] + (int)(*(int *)args[7]) + + (int)(*(double*)args[8]) + (int)*(int *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(int *)args[13]) + + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(float *)args[0], (int)(*(float *)args[1]), + (int)(*(float *)args[2]), (int)*(float *)args[3], + (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), + (int)*(float *)args[6], (int)(*(int *)args[7]), + (int)(*(double *)args[8]), (int)*(int *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(int *)args[13]), + (int)(*(int *)args[14]), *(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); +} + +typedef int (*closure_test_type1)(float, float, float, float, signed short, + float, float, int, double, int, int, float, + int, int, int, int); +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_float; + cl_arg_types[1] = &ffi_type_float; + cl_arg_types[2] = &ffi_type_float; + cl_arg_types[3] = &ffi_type_float; + cl_arg_types[4] = &ffi_type_sshort; + cl_arg_types[5] = &ffi_type_float; + cl_arg_types[6] = &ffi_type_float; + cl_arg_types[7] = &ffi_type_sint; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_sint; + cl_arg_types[10] = &ffi_type_sint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_sint; + cl_arg_types[14] = &ffi_type_sint; + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type1)code)) + (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, + 19, 21, 1); + /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 255" } */ + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c new file mode 100644 index 0000000..08ff9d9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c @@ -0,0 +1,81 @@ +/* Area: closure_call + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void closure_test_fn2(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(double *)args[0] +(int)(*(double *)args[1]) + + (int)(*(double *)args[2]) + (int)*(double *)args[3] + + (int)(*(signed short *)args[4]) + (int)(*(double *)args[5]) + + (int)*(double *)args[6] + (int)(*(int *)args[7]) + + (int)(*(double *)args[8]) + (int)*(int *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(float *)args[13]) + + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(double *)args[0], (int)(*(double *)args[1]), + (int)(*(double *)args[2]), (int)*(double *)args[3], + (int)(*(signed short *)args[4]), (int)(*(double *)args[5]), + (int)*(double *)args[6], (int)(*(int *)args[7]), + (int)(*(double*)args[8]), (int)*(int *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(float *)args[13]), + (int)(*(int *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, + (int)*(ffi_arg *)resp); +} + +typedef int (*closure_test_type2)(double, double, double, double, signed short, + double, double, int, double, int, int, float, + int, float, int, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_double; + cl_arg_types[1] = &ffi_type_double; + cl_arg_types[2] = &ffi_type_double; + cl_arg_types[3] = &ffi_type_double; + cl_arg_types[4] = &ffi_type_sshort; + cl_arg_types[5] = &ffi_type_double; + cl_arg_types[6] = &ffi_type_double; + cl_arg_types[7] = &ffi_type_sint; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_sint; + cl_arg_types[10] = &ffi_type_sint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_float; + cl_arg_types[14] = &ffi_type_sint; + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn2, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type2)code)) + (1, 2, 3, 4, 127, 5, 6, 8, 9, 10, 11, 12.0, 13, + 19.0, 21, 1); + /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 255" } */ + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c new file mode 100644 index 0000000..9b54d80 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c @@ -0,0 +1,82 @@ +/* Area: closure_call + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void closure_test_fn3(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) + { + *(ffi_arg*)resp = + (int)*(float *)args[0] +(int)(*(float *)args[1]) + + (int)(*(float *)args[2]) + (int)*(float *)args[3] + + (int)(*(float *)args[4]) + (int)(*(float *)args[5]) + + (int)*(float *)args[6] + (int)(*(float *)args[7]) + + (int)(*(double *)args[8]) + (int)*(int *)args[9] + + (int)(*(float *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(float *)args[13]) + + (int)(*(float *)args[14]) + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(float *)args[0], (int)(*(float *)args[1]), + (int)(*(float *)args[2]), (int)*(float *)args[3], + (int)(*(float *)args[4]), (int)(*(float *)args[5]), + (int)*(float *)args[6], (int)(*(float *)args[7]), + (int)(*(double *)args[8]), (int)*(int *)args[9], + (int)(*(float *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(float *)args[13]), + (int)(*(float *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, + (int)*(ffi_arg *)resp); + + } + +typedef int (*closure_test_type3)(float, float, float, float, float, float, + float, float, double, int, float, float, int, + float, float, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_float; + cl_arg_types[1] = &ffi_type_float; + cl_arg_types[2] = &ffi_type_float; + cl_arg_types[3] = &ffi_type_float; + cl_arg_types[4] = &ffi_type_float; + cl_arg_types[5] = &ffi_type_float; + cl_arg_types[6] = &ffi_type_float; + cl_arg_types[7] = &ffi_type_float; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_sint; + cl_arg_types[10] = &ffi_type_float; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_float; + cl_arg_types[14] = &ffi_type_float; + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn3, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type3)code)) + (1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9, 10, 11.11, 12.0, 13, + 19.19, 21.21, 1); + /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 19 21 1 3: 135" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 135" } */ + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c new file mode 100644 index 0000000..d4a1530 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c @@ -0,0 +1,89 @@ +/* Area: closure_call + Purpose: Check multiple long long values passing. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: 20031026 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static void +closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + + (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + + (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + + (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + + (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + + (int)*(unsigned long long *)args[10] + + (int)*(unsigned long long *)args[11] + + (int)*(unsigned long long *)args[12] + + (int)*(unsigned long long *)args[13] + + (int)*(unsigned long long *)args[14] + + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(unsigned long long *)args[0], + (int)*(unsigned long long *)args[1], + (int)*(unsigned long long *)args[2], + (int)*(unsigned long long *)args[3], + (int)*(unsigned long long *)args[4], + (int)*(unsigned long long *)args[5], + (int)*(unsigned long long *)args[6], + (int)*(unsigned long long *)args[7], + (int)*(unsigned long long *)args[8], + (int)*(unsigned long long *)args[9], + (int)*(unsigned long long *)args[10], + (int)*(unsigned long long *)args[11], + (int)*(unsigned long long *)args[12], + (int)*(unsigned long long *)args[13], + (int)*(unsigned long long *)args[14], + *(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); + +} + +typedef int (*closure_test_type0)(unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int i, res; + + for (i = 0; i < 15; i++) { + cl_arg_types[i] = &ffi_type_uint64; + } + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type0)code)) + (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL, + 13LL, 19LL, 21LL, 1); + /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 680" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c new file mode 100644 index 0000000..9907442 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c @@ -0,0 +1,92 @@ +/* Area: closure_call + Purpose: Check multiple long long values passing. + Exceed the limit of gpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: 20031026 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void +closure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + + (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + + (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + + (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + + (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + + (int)*(int *)args[10] + + (int)*(unsigned long long *)args[11] + + (int)*(unsigned long long *)args[12] + + (int)*(unsigned long long *)args[13] + + (int)*(unsigned long long *)args[14] + + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(unsigned long long *)args[0], + (int)*(unsigned long long *)args[1], + (int)*(unsigned long long *)args[2], + (int)*(unsigned long long *)args[3], + (int)*(unsigned long long *)args[4], + (int)*(unsigned long long *)args[5], + (int)*(unsigned long long *)args[6], + (int)*(unsigned long long *)args[7], + (int)*(unsigned long long *)args[8], + (int)*(unsigned long long *)args[9], + (int)*(int *)args[10], + (int)*(unsigned long long *)args[11], + (int)*(unsigned long long *)args[12], + (int)*(unsigned long long *)args[13], + (int)*(unsigned long long *)args[14], + *(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); + +} + +typedef int (*closure_test_type0)(unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + int, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int i, res; + + for (i = 0; i < 10; i++) { + cl_arg_types[i] = &ffi_type_uint64; + } + cl_arg_types[10] = &ffi_type_sint; + for (i = 11; i < 15; i++) { + cl_arg_types[i] = &ffi_type_uint64; + } + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn5, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type0)code)) + (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL, + 13LL, 19LL, 21LL, 1); + /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 680" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c new file mode 100644 index 0000000..73c54fd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c @@ -0,0 +1,90 @@ +/* Area: closure_call + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC. + Limitations: none. + PR: PR23404 + Originator: 20050830 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void +closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(unsigned long long *)args[0] + + (int)(*(unsigned long long *)args[1]) + + (int)(*(unsigned long long *)args[2]) + + (int)*(unsigned long long *)args[3] + + (int)(*(int *)args[4]) + (int)(*(double *)args[5]) + + (int)*(double *)args[6] + (int)(*(float *)args[7]) + + (int)(*(double *)args[8]) + (int)*(double *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(int *)args[13]) + + (int)(*(double *)args[14]) + (int)*(double *)args[15] + + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(unsigned long long *)args[0], + (int)(*(unsigned long long *)args[1]), + (int)(*(unsigned long long *)args[2]), + (int)*(unsigned long long *)args[3], + (int)(*(int *)args[4]), (int)(*(double *)args[5]), + (int)*(double *)args[6], (int)(*(float *)args[7]), + (int)(*(double *)args[8]), (int)*(double *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(int *)args[13]), + (int)(*(double *)args[14]), (int)(*(double *)args[15]), + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); + +} + +typedef int (*closure_test_type0)(unsigned long long, + unsigned long long, + unsigned long long, + unsigned long long, + int, double, double, float, double, double, + int, float, int, int, double, double); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_uint64; + cl_arg_types[1] = &ffi_type_uint64; + cl_arg_types[2] = &ffi_type_uint64; + cl_arg_types[3] = &ffi_type_uint64; + cl_arg_types[4] = &ffi_type_sint; + cl_arg_types[5] = &ffi_type_double; + cl_arg_types[6] = &ffi_type_double; + cl_arg_types[7] = &ffi_type_float; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_double; + cl_arg_types[10] = &ffi_type_sint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_sint; + cl_arg_types[14] = &ffi_type_double; + cl_arg_types[15] = &ffi_type_double; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type0)code)) + (1, 2, 3, 4, 127, 429., 7., 8., 9.5, 10., 11, 12., 13, + 19, 21., 1.); + /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 680" } */ + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c new file mode 100644 index 0000000..b3afa0b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c @@ -0,0 +1,95 @@ +/* Area: closure_call + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: 20030828 */ + + + + +/* { dg-do run } */ +#include "ffitest.h" + +static void +closure_loc_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) + + (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] + + (int)(*(signed short *)args[4]) + + (int)(*(unsigned long long *)args[5]) + + (int)*(int *)args[6] + (int)(*(int *)args[7]) + + (int)(*(double *)args[8]) + (int)*(int *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(int *)args[13]) + + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]), + (int)(*(unsigned long long *)args[2]), + (int)*(int *)args[3], (int)(*(signed short *)args[4]), + (int)(*(unsigned long long *)args[5]), + (int)*(int *)args[6], (int)(*(int *)args[7]), + (int)(*(double *)args[8]), (int)*(int *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(int *)args[13]), + (int)(*(int *)args[14]),*(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); + +} + +typedef int (*closure_loc_test_type0)(unsigned long long, int, unsigned long long, + int, signed short, unsigned long long, int, + int, double, int, int, float, int, int, + int, int); + +int main (void) +{ + ffi_cif cif; + ffi_closure *pcl; + ffi_type * cl_arg_types[17]; + int res; + void *codeloc; + + cl_arg_types[0] = &ffi_type_uint64; + cl_arg_types[1] = &ffi_type_sint; + cl_arg_types[2] = &ffi_type_uint64; + cl_arg_types[3] = &ffi_type_sint; + cl_arg_types[4] = &ffi_type_sshort; + cl_arg_types[5] = &ffi_type_uint64; + cl_arg_types[6] = &ffi_type_sint; + cl_arg_types[7] = &ffi_type_sint; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_sint; + cl_arg_types[10] = &ffi_type_sint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_sint; + cl_arg_types[14] = &ffi_type_sint; + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + pcl = ffi_closure_alloc(sizeof(ffi_closure), &codeloc); + CHECK(pcl != NULL); + CHECK(codeloc != NULL); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_loc_test_fn0, + (void *) 3 /* userdata */, codeloc) == FFI_OK); + + CHECK(memcmp(pcl, codeloc, sizeof(*pcl)) == 0); + + res = (*((closure_loc_test_type0)codeloc)) + (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13, + 19, 21, 1); + /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 680" } */ + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c new file mode 100644 index 0000000..6bfcc1f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c @@ -0,0 +1,64 @@ +/* Area: closure_call (stdcall convention) + Purpose: Check handling when caller expects stdcall callee + Limitations: none. + PR: none. + Originator: */ + +/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ +#include "ffitest.h" + +static void +closure_test_stdcall(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(int *)args[0] + (int)(*(int *)args[1]) + + (int)(*(int *)args[2]) + (int)(*(int *)args[3]) + + (int)(intptr_t)userdata; + + printf("%d %d %d %d: %d\n", + (int)*(int *)args[0], (int)(*(int *)args[1]), + (int)(*(int *)args[2]), (int)(*(int *)args[3]), + (int)*(ffi_arg *)resp); + +} + +typedef int (__stdcall *closure_test_type0)(int, int, int, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + void* sp_pre; + void* sp_post; + char buf[1024]; + + cl_arg_types[0] = &ffi_type_uint; + cl_arg_types[1] = &ffi_type_uint; + cl_arg_types[2] = &ffi_type_uint; + cl_arg_types[3] = &ffi_type_uint; + cl_arg_types[4] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 4, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_stdcall, + (void *) 3 /* userdata */, code) == FFI_OK); + + asm volatile (" movl %%esp,%0" : "=g" (sp_pre)); + res = (*(closure_test_type0)code)(0, 1, 2, 3); + asm volatile (" movl %%esp,%0" : "=g" (sp_post)); + /* { dg-output "0 1 2 3: 9" } */ + + printf("res: %d\n",res); + /* { dg-output "\nres: 9" } */ + + sprintf(buf, "mismatch: pre=%p vs post=%p", sp_pre, sp_post); + printf("stack pointer %s\n", (sp_pre == sp_post ? "match" : buf)); + /* { dg-output "\nstack pointer match" } */ + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c new file mode 100644 index 0000000..f0a334f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c @@ -0,0 +1,94 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_12byte { + int a; + int b; + int c; +} cls_struct_12byte; + +cls_struct_12byte cls_struct_12byte_fn(struct cls_struct_12byte b1, + struct cls_struct_12byte b2) +{ + struct cls_struct_12byte result; + + result.a = b1.a + b2.a; + result.b = b1.b + b2.b; + result.c = b1.c + b2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c, + result.a, result.b, result.c); + + return result; +} + +static void cls_struct_12byte_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args , void* userdata __UNUSED__) +{ + struct cls_struct_12byte b1, b2; + + b1 = *(struct cls_struct_12byte*)(args[0]); + b2 = *(struct cls_struct_12byte*)(args[1]); + + *(cls_struct_12byte*)resp = cls_struct_12byte_fn(b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_12byte h_dbl = { 7, 4, 9 }; + struct cls_struct_12byte j_dbl = { 1, 5, 3 }; + struct cls_struct_12byte res_dbl; + + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_sint; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &h_dbl; + args_dbl[1] = &j_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_12byte_fn), &res_dbl, args_dbl); + /* { dg-output "7 4 9 1 5 3: 8 9 12" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 8 9 12" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_12byte_gn, NULL, code) == FFI_OK); + + res_dbl.a = 0; + res_dbl.b = 0; + res_dbl.c = 0; + + res_dbl = ((cls_struct_12byte(*)(cls_struct_12byte, cls_struct_12byte))(code))(h_dbl, j_dbl); + /* { dg-output "\n7 4 9 1 5 3: 8 9 12" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 8 9 12" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c new file mode 100644 index 0000000..9b9292a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c @@ -0,0 +1,95 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_16byte { + int a; + double b; + int c; +} cls_struct_16byte; + +cls_struct_16byte cls_struct_16byte_fn(struct cls_struct_16byte b1, + struct cls_struct_16byte b2) +{ + struct cls_struct_16byte result; + + result.a = b1.a + b2.a; + result.b = b1.b + b2.b; + result.c = b1.c + b2.c; + + printf("%d %g %d %d %g %d: %d %g %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c, + result.a, result.b, result.c); + + return result; +} + +static void cls_struct_16byte_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + struct cls_struct_16byte b1, b2; + + b1 = *(struct cls_struct_16byte*)(args[0]); + b2 = *(struct cls_struct_16byte*)(args[1]); + + *(cls_struct_16byte*)resp = cls_struct_16byte_fn(b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_16byte h_dbl = { 7, 8.0, 9 }; + struct cls_struct_16byte j_dbl = { 1, 9.0, 3 }; + struct cls_struct_16byte res_dbl; + + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &h_dbl; + args_dbl[1] = &j_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_16byte_fn), &res_dbl, args_dbl); + /* { dg-output "7 8 9 1 9 3: 8 17 12" } */ + printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 8 17 12" } */ + + res_dbl.a = 0; + res_dbl.b = 0.0; + res_dbl.c = 0; + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_16byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_16byte(*)(cls_struct_16byte, cls_struct_16byte))(code))(h_dbl, j_dbl); + /* { dg-output "\n7 8 9 1 9 3: 8 17 12" } */ + printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 8 17 12" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c new file mode 100644 index 0000000..40c8c6d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c @@ -0,0 +1,96 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Double alignment check on darwin. + Limitations: none. + PR: none. + Originator: 20030915 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_18byte { + double a; + unsigned char b; + unsigned char c; + double d; +} cls_struct_18byte; + +cls_struct_18byte cls_struct_18byte_fn(struct cls_struct_18byte a1, + struct cls_struct_18byte a2) +{ + struct cls_struct_18byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + + + printf("%g %d %d %g %g %d %d %g: %g %d %d %g\n", a1.a, a1.b, a1.c, a1.d, + a2.a, a2.b, a2.c, a2.d, + result.a, result.b, result.c, result.d); + return result; +} + +static void +cls_struct_18byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_18byte a1, a2; + + a1 = *(struct cls_struct_18byte*)(args[0]); + a2 = *(struct cls_struct_18byte*)(args[1]); + + *(cls_struct_18byte*)resp = cls_struct_18byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 }; + struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 }; + struct cls_struct_18byte res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_18byte_fn), &res_dbl, args_dbl); + /* { dg-output "1 127 126 3 4 125 124 5: 5 252 250 8" } */ + printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 5 252 250 8" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_18byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_18byte(*)(cls_struct_18byte, cls_struct_18byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 127 126 3 4 125 124 5: 5 252 250 8" } */ + printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 5 252 250 8" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c new file mode 100644 index 0000000..aa64248 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c @@ -0,0 +1,102 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Double alignment check on darwin. + Limitations: none. + PR: none. + Originator: 20030915 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_19byte { + double a; + unsigned char b; + unsigned char c; + double d; + unsigned char e; +} cls_struct_19byte; + +cls_struct_19byte cls_struct_19byte_fn(struct cls_struct_19byte a1, + struct cls_struct_19byte a2) +{ + struct cls_struct_19byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + result.e = a1.e + a2.e; + + + printf("%g %d %d %g %d %g %d %d %g %d: %g %d %d %g %d\n", + a1.a, a1.b, a1.c, a1.d, a1.e, + a2.a, a2.b, a2.c, a2.d, a2.e, + result.a, result.b, result.c, result.d, result.e); + return result; +} + +static void +cls_struct_19byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_19byte a1, a2; + + a1 = *(struct cls_struct_19byte*)(args[0]); + a2 = *(struct cls_struct_19byte*)(args[1]); + + *(cls_struct_19byte*)resp = cls_struct_19byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[6]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 }; + struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 }; + struct cls_struct_19byte res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_19byte_fn), &res_dbl, args_dbl); + /* { dg-output "1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */ + printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e); + /* { dg-output "\nres: 5 252 250 8 239" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_19byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_19byte(*)(cls_struct_19byte, cls_struct_19byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */ + printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e); + /* { dg-output "\nres: 5 252 250 8 239" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c new file mode 100644 index 0000000..b9402d6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c @@ -0,0 +1,89 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. + Limitations: none. + PR: none. + Originator: 20030902 */ + + + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_1_1byte { + unsigned char a; +} cls_struct_1_1byte; + +cls_struct_1_1byte cls_struct_1_1byte_fn(struct cls_struct_1_1byte a1, + struct cls_struct_1_1byte a2) +{ + struct cls_struct_1_1byte result; + + result.a = a1.a + a2.a; + + printf("%d %d: %d\n", a1.a, a2.a, result.a); + + return result; +} + +static void +cls_struct_1_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_1_1byte a1, a2; + + a1 = *(struct cls_struct_1_1byte*)(args[0]); + a2 = *(struct cls_struct_1_1byte*)(args[1]); + + *(cls_struct_1_1byte*)resp = cls_struct_1_1byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[2]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_1_1byte g_dbl = { 12 }; + struct cls_struct_1_1byte f_dbl = { 178 }; + struct cls_struct_1_1byte res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_1_1byte_fn), &res_dbl, args_dbl); + /* { dg-output "12 178: 190" } */ + printf("res: %d\n", res_dbl.a); + /* { dg-output "\nres: 190" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_1_1byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_1_1byte(*)(cls_struct_1_1byte, cls_struct_1_1byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 178: 190" } */ + printf("res: %d\n", res_dbl.a); + /* { dg-output "\nres: 190" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c new file mode 100644 index 0000000..80dd7ac --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_20byte { + double a; + double b; + int c; +} cls_struct_20byte; + +cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1, + struct cls_struct_20byte a2) +{ + struct cls_struct_20byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%g %g %d %g %g %d: %g %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, + result.a, result.b, result.c); + return result; +} + +static void +cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_20byte a1, a2; + + a1 = *(struct cls_struct_20byte*)(args[0]); + a2 = *(struct cls_struct_20byte*)(args[1]); + + *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 }; + struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 }; + struct cls_struct_20byte res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl); + /* { dg-output "1 2 3 4 5 7: 5 7 10" } */ + printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 5 7 10" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */ + printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 5 7 10" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c new file mode 100644 index 0000000..50bcbbf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c @@ -0,0 +1,93 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20030828 */ + + + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_20byte { + int a; + double b; + double c; +} cls_struct_20byte; + +cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1, + struct cls_struct_20byte a2) +{ + struct cls_struct_20byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %g %g %d %g %g: %d %g %g\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, + result.a, result.b, result.c); + return result; +} + +static void +cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_20byte a1, a2; + + a1 = *(struct cls_struct_20byte*)(args[0]); + a2 = *(struct cls_struct_20byte*)(args[1]); + + *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 }; + struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 }; + struct cls_struct_20byte res_dbl; + + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl); + /* { dg-output "1 2 3 4 5 7: 5 7 10" } */ + printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 5 7 10" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */ + printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 5 7 10" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c new file mode 100644 index 0000000..46a6eb4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c @@ -0,0 +1,113 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_24byte { + double a; + double b; + int c; + float d; +} cls_struct_24byte; + +cls_struct_24byte cls_struct_24byte_fn(struct cls_struct_24byte b0, + struct cls_struct_24byte b1, + struct cls_struct_24byte b2, + struct cls_struct_24byte b3) +{ + struct cls_struct_24byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + + printf("%g %g %d %g %g %g %d %g %g %g %d %g %g %g %d %g: %g %g %d %g\n", + b0.a, b0.b, b0.c, b0.d, + b1.a, b1.b, b1.c, b1.d, + b2.a, b2.b, b2.c, b2.d, + b3.a, b3.b, b3.c, b2.d, + result.a, result.b, result.c, result.d); + + return result; +} + +static void +cls_struct_24byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_24byte b0, b1, b2, b3; + + b0 = *(struct cls_struct_24byte*)(args[0]); + b1 = *(struct cls_struct_24byte*)(args[1]); + b2 = *(struct cls_struct_24byte*)(args[2]); + b3 = *(struct cls_struct_24byte*)(args[3]); + + *(cls_struct_24byte*)resp = cls_struct_24byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_24byte e_dbl = { 9.0, 2.0, 6, 5.0 }; + struct cls_struct_24byte f_dbl = { 1.0, 2.0, 3, 7.0 }; + struct cls_struct_24byte g_dbl = { 4.0, 5.0, 7, 9.0 }; + struct cls_struct_24byte h_dbl = { 8.0, 6.0, 1, 4.0 }; + struct cls_struct_24byte res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = &ffi_type_float; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_24byte_fn), &res_dbl, args_dbl); + /* { dg-output "9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */ + printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 22 15 17 25" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_24byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_24byte(*)(cls_struct_24byte, + cls_struct_24byte, + cls_struct_24byte, + cls_struct_24byte)) + (code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */ + printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 22 15 17 25" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c new file mode 100644 index 0000000..101e130 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_2byte { + unsigned char a; + unsigned char b; +} cls_struct_2byte; + +cls_struct_2byte cls_struct_2byte_fn(struct cls_struct_2byte a1, + struct cls_struct_2byte a2) +{ + struct cls_struct_2byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + + printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); + + return result; +} + +static void +cls_struct_2byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_2byte a1, a2; + + a1 = *(struct cls_struct_2byte*)(args[0]); + a2 = *(struct cls_struct_2byte*)(args[1]); + + *(cls_struct_2byte*)resp = cls_struct_2byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_2byte g_dbl = { 12, 127 }; + struct cls_struct_2byte f_dbl = { 1, 13 }; + struct cls_struct_2byte res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_2byte_fn), &res_dbl, args_dbl); + /* { dg-output "12 127 1 13: 13 140" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 13 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_2byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_2byte(*)(cls_struct_2byte, cls_struct_2byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 127 1 13: 13 140" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 13 140" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c new file mode 100644 index 0000000..fc780c3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c @@ -0,0 +1,95 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. + Limitations: none. + PR: none. + Originator: 20030902 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_3_1byte { + unsigned char a; + unsigned char b; + unsigned char c; +} cls_struct_3_1byte; + +cls_struct_3_1byte cls_struct_3_1byte_fn(struct cls_struct_3_1byte a1, + struct cls_struct_3_1byte a2) +{ + struct cls_struct_3_1byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, + a2.a, a2.b, a2.c, + result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_3_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_3_1byte a1, a2; + + a1 = *(struct cls_struct_3_1byte*)(args[0]); + a2 = *(struct cls_struct_3_1byte*)(args[1]); + + *(cls_struct_3_1byte*)resp = cls_struct_3_1byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_3_1byte g_dbl = { 12, 13, 14 }; + struct cls_struct_3_1byte f_dbl = { 178, 179, 180 }; + struct cls_struct_3_1byte res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_3_1byte_fn), &res_dbl, args_dbl); + /* { dg-output "12 13 14 178 179 180: 190 192 194" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 190 192 194" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3_1byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_3_1byte(*)(cls_struct_3_1byte, cls_struct_3_1byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 13 14 178 179 180: 190 192 194" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 190 192 194" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c new file mode 100644 index 0000000..5705ce3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_3byte { + unsigned short a; + unsigned char b; +} cls_struct_3byte; + +cls_struct_3byte cls_struct_3byte_fn(struct cls_struct_3byte a1, + struct cls_struct_3byte a2) +{ + struct cls_struct_3byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + + printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); + + return result; +} + +static void +cls_struct_3byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_3byte a1, a2; + + a1 = *(struct cls_struct_3byte*)(args[0]); + a2 = *(struct cls_struct_3byte*)(args[1]); + + *(cls_struct_3byte*)resp = cls_struct_3byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_3byte g_dbl = { 12, 119 }; + struct cls_struct_3byte f_dbl = { 1, 15 }; + struct cls_struct_3byte res_dbl; + + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_3byte_fn), &res_dbl, args_dbl); + /* { dg-output "12 119 1 15: 13 134" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 13 134" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_3byte(*)(cls_struct_3byte, cls_struct_3byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 119 1 15: 13 134" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 13 134" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c new file mode 100644 index 0000000..01770a0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_3byte_1 { + unsigned char a; + unsigned short b; +} cls_struct_3byte_1; + +cls_struct_3byte_1 cls_struct_3byte_fn1(struct cls_struct_3byte_1 a1, + struct cls_struct_3byte_1 a2) +{ + struct cls_struct_3byte_1 result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + + printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); + + return result; +} + +static void +cls_struct_3byte_gn1(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_3byte_1 a1, a2; + + a1 = *(struct cls_struct_3byte_1*)(args[0]); + a2 = *(struct cls_struct_3byte_1*)(args[1]); + + *(cls_struct_3byte_1*)resp = cls_struct_3byte_fn1(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_3byte_1 g_dbl = { 15, 125 }; + struct cls_struct_3byte_1 f_dbl = { 9, 19 }; + struct cls_struct_3byte_1 res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_3byte_fn1), &res_dbl, args_dbl); + /* { dg-output "15 125 9 19: 24 144" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 24 144" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn1, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_3byte_1(*)(cls_struct_3byte_1, cls_struct_3byte_1))(code))(g_dbl, f_dbl); + /* { dg-output "\n15 125 9 19: 24 144" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 24 144" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c new file mode 100644 index 0000000..f3806d7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c @@ -0,0 +1,98 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. + Limitations: none. + PR: none. + Originator: 20030902 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_4_1byte { + unsigned char a; + unsigned char b; + unsigned char c; + unsigned char d; +} cls_struct_4_1byte; + +cls_struct_4_1byte cls_struct_4_1byte_fn(struct cls_struct_4_1byte a1, + struct cls_struct_4_1byte a2) +{ + struct cls_struct_4_1byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + + printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, + a2.a, a2.b, a2.c, a2.d, + result.a, result.b, result.c, result.d); + + return result; +} + +static void +cls_struct_4_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_4_1byte a1, a2; + + a1 = *(struct cls_struct_4_1byte*)(args[0]); + a2 = *(struct cls_struct_4_1byte*)(args[1]); + + *(cls_struct_4_1byte*)resp = cls_struct_4_1byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 }; + struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 }; + struct cls_struct_4_1byte res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_4_1byte_fn), &res_dbl, args_dbl); + /* { dg-output "12 13 14 15 178 179 180 181: 190 192 194 196" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 190 192 194 196" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4_1byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_4_1byte(*)(cls_struct_4_1byte, cls_struct_4_1byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 13 14 15 178 179 180 181: 190 192 194 196" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 190 192 194 196" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c new file mode 100644 index 0000000..a1aba3c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +typedef struct cls_struct_4byte { + unsigned short a; + unsigned short b; +} cls_struct_4byte; + +cls_struct_4byte cls_struct_4byte_fn(struct cls_struct_4byte a1, + struct cls_struct_4byte a2) +{ + struct cls_struct_4byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + + printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); + + return result; +} + +static void +cls_struct_4byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_4byte a1, a2; + + a1 = *(struct cls_struct_4byte*)(args[0]); + a2 = *(struct cls_struct_4byte*)(args[1]); + + *(cls_struct_4byte*)resp = cls_struct_4byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_4byte g_dbl = { 127, 120 }; + struct cls_struct_4byte f_dbl = { 12, 128 }; + struct cls_struct_4byte res_dbl; + + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_4byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 12 128: 139 248" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 139 248" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_4byte(*)(cls_struct_4byte, cls_struct_4byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 12 128: 139 248" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 139 248" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c new file mode 100644 index 0000000..2ceba3d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c @@ -0,0 +1,109 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20050708 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_5byte { + unsigned char a; + unsigned char b; + unsigned char c; + unsigned char d; + unsigned char e; +} cls_struct_5byte; + +cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1, + struct cls_struct_5byte a2) +{ + struct cls_struct_5byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + result.e = a1.e + a2.e; + + printf("%d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d\n", + a1.a, a1.b, a1.c, a1.d, a1.e, + a2.a, a2.b, a2.c, a2.d, a2.e, + result.a, result.b, result.c, result.d, result.e); + + return result; +} + +static void +cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_5byte a1, a2; + + a1 = *(struct cls_struct_5byte*)(args[0]); + a2 = *(struct cls_struct_5byte*)(args[1]); + + *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[6]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 }; + struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 }; + struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 }; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ + printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e); + /* { dg-output "\nres: 139 248 10 6 8" } */ + + res_dbl.a = 0; + res_dbl.b = 0; + res_dbl.c = 0; + res_dbl.d = 0; + res_dbl.e = 0; + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ + printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e); + /* { dg-output "\nres: 139 248 10 6 8" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c new file mode 100644 index 0000000..61d595c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c @@ -0,0 +1,98 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_5byte { + unsigned short a; + unsigned short b; + unsigned char c; +} cls_struct_5byte; + +cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1, + struct cls_struct_5byte a2) +{ + struct cls_struct_5byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, + a2.a, a2.b, a2.c, + result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_5byte a1, a2; + + a1 = *(struct cls_struct_5byte*)(args[0]); + a2 = *(struct cls_struct_5byte*)(args[1]); + + *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_5byte g_dbl = { 127, 120, 1 }; + struct cls_struct_5byte f_dbl = { 12, 128, 9 }; + struct cls_struct_5byte res_dbl = { 0, 0, 0 }; + + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 12 128 9: 139 248 10" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 139 248 10" } */ + + res_dbl.a = 0; + res_dbl.b = 0; + res_dbl.c = 0; + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 12 128 9: 139 248 10" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 139 248 10" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c new file mode 100644 index 0000000..576ebe0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c @@ -0,0 +1,124 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check bigger struct which overlaps + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_64byte { + double a; + double b; + double c; + double d; + double e; + double f; + double g; + double h; +} cls_struct_64byte; + +cls_struct_64byte cls_struct_64byte_fn(struct cls_struct_64byte b0, + struct cls_struct_64byte b1, + struct cls_struct_64byte b2, + struct cls_struct_64byte b3) +{ + struct cls_struct_64byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + result.e = b0.e + b1.e + b2.e + b3.e; + result.f = b0.f + b1.f + b2.f + b3.f; + result.g = b0.g + b1.g + b2.g + b3.g; + result.h = b0.h + b1.h + b2.h + b3.h; + + printf("%g %g %g %g %g %g %g %g\n", result.a, result.b, result.c, + result.d, result.e, result.f, result.g, result.h); + + return result; +} + +static void +cls_struct_64byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_64byte b0, b1, b2, b3; + + b0 = *(struct cls_struct_64byte*)(args[0]); + b1 = *(struct cls_struct_64byte*)(args[1]); + b2 = *(struct cls_struct_64byte*)(args[2]); + b3 = *(struct cls_struct_64byte*)(args[3]); + + *(cls_struct_64byte*)resp = cls_struct_64byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[9]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_64byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0 }; + struct cls_struct_64byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0 }; + struct cls_struct_64byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0 }; + struct cls_struct_64byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0 }; + struct cls_struct_64byte res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; + cls_struct_fields[8] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_64byte_fn), &res_dbl, args_dbl); + /* { dg-output "22 15 17 25 6 13 19 18" } */ + printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_64byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_64byte(*)(cls_struct_64byte, + cls_struct_64byte, + cls_struct_64byte, + cls_struct_64byte)) + (code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n22 15 17 25 6 13 19 18" } */ + printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c new file mode 100644 index 0000000..9f2eff6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c @@ -0,0 +1,113 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20050708 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_6byte { + unsigned char a; + unsigned char b; + unsigned char c; + unsigned char d; + unsigned char e; + unsigned char f; +} cls_struct_6byte; + +cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1, + struct cls_struct_6byte a2) +{ + struct cls_struct_6byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + result.e = a1.e + a2.e; + result.f = a1.f + a2.f; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d\n", + a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, + a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, + result.a, result.b, result.c, result.d, result.e, result.f); + + return result; +} + +static void +cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_6byte a1, a2; + + a1 = *(struct cls_struct_6byte*)(args[0]); + a2 = *(struct cls_struct_6byte*)(args[1]); + + *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[7]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_6byte g_dbl = { 127, 120, 1, 3, 4, 5 }; + struct cls_struct_6byte f_dbl = { 12, 128, 9, 3, 4, 5 }; + struct cls_struct_6byte res_dbl = { 0, 0, 0, 0, 0, 0 }; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = &ffi_type_uchar; + cls_struct_fields[6] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */ + printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f); + /* { dg-output "\nres: 139 248 10 6 8 10" } */ + + res_dbl.a = 0; + res_dbl.b = 0; + res_dbl.c = 0; + res_dbl.d = 0; + res_dbl.e = 0; + res_dbl.f = 0; + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */ + printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f); + /* { dg-output "\nres: 139 248 10 6 8 10" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c new file mode 100644 index 0000000..73257b0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c @@ -0,0 +1,99 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20030828 */ + + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_6byte { + unsigned short a; + unsigned short b; + unsigned char c; + unsigned char d; +} cls_struct_6byte; + +cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1, + struct cls_struct_6byte a2) +{ + struct cls_struct_6byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + + printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, + a2.a, a2.b, a2.c, a2.d, + result.a, result.b, result.c, result.d); + + return result; +} + +static void +cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_6byte a1, a2; + + a1 = *(struct cls_struct_6byte*)(args[0]); + a2 = *(struct cls_struct_6byte*)(args[1]); + + *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_6byte g_dbl = { 127, 120, 1, 128 }; + struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 }; + struct cls_struct_6byte res_dbl; + + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 128 12 128 9 127: 139 248 10 255" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 139 248 10 255" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 128 12 128 9 127: 139 248 10 255" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 139 248 10 255" } */ + + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c new file mode 100644 index 0000000..50d09c9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c @@ -0,0 +1,117 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20050708 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_7byte { + unsigned char a; + unsigned char b; + unsigned char c; + unsigned char d; + unsigned char e; + unsigned char f; + unsigned char g; +} cls_struct_7byte; + +cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1, + struct cls_struct_7byte a2) +{ + struct cls_struct_7byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + result.e = a1.e + a2.e; + result.f = a1.f + a2.f; + result.g = a1.g + a2.g; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d %d\n", + a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, + a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, + result.a, result.b, result.c, result.d, result.e, result.f, result.g); + + return result; +} + +static void +cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_7byte a1, a2; + + a1 = *(struct cls_struct_7byte*)(args[0]); + a2 = *(struct cls_struct_7byte*)(args[1]); + + *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[8]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 }; + struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 }; + struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 }; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = &ffi_type_uchar; + cls_struct_fields[6] = &ffi_type_uchar; + cls_struct_fields[7] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */ + printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 139 248 10 6 8 10 12" } */ + + res_dbl.a = 0; + res_dbl.b = 0; + res_dbl.c = 0; + res_dbl.d = 0; + res_dbl.e = 0; + res_dbl.f = 0; + res_dbl.g = 0; + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */ + printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 139 248 10 6 8 10 12" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c new file mode 100644 index 0000000..f5c0000 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c @@ -0,0 +1,97 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_7byte { + unsigned short a; + unsigned short b; + unsigned char c; + unsigned short d; +} cls_struct_7byte; + +cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1, + struct cls_struct_7byte a2) +{ + struct cls_struct_7byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + + printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, + a2.a, a2.b, a2.c, a2.d, + result.a, result.b, result.c, result.d); + + return result; +} + +static void +cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_7byte a1, a2; + + a1 = *(struct cls_struct_7byte*)(args[0]); + a2 = *(struct cls_struct_7byte*)(args[1]); + + *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 }; + struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 }; + struct cls_struct_7byte res_dbl; + + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_ushort; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 254 12 128 9 255: 139 248 10 509" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 139 248 10 509" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 254 12 128 9 255: 139 248 10 509" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 139 248 10 509" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c new file mode 100644 index 0000000..4aa99d1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c @@ -0,0 +1,88 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_8byte { + int a; + float b; +} cls_struct_8byte; + +cls_struct_8byte cls_struct_8byte_fn(struct cls_struct_8byte a1, + struct cls_struct_8byte a2) +{ + struct cls_struct_8byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + + printf("%d %g %d %g: %d %g\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); + + return result; +} + +static void +cls_struct_8byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_8byte a1, a2; + + a1 = *(struct cls_struct_8byte*)(args[0]); + a2 = *(struct cls_struct_8byte*)(args[1]); + + *(cls_struct_8byte*)resp = cls_struct_8byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_8byte g_dbl = { 1, 2.0 }; + struct cls_struct_8byte f_dbl = { 4, 5.0 }; + struct cls_struct_8byte res_dbl; + + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_8byte_fn), &res_dbl, args_dbl); + /* { dg-output "1 2 4 5: 5 7" } */ + printf("res: %d %g\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 5 7" } */ + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_8byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_8byte(*)(cls_struct_8byte, cls_struct_8byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 2 4 5: 5 7" } */ + printf("res: %d %g\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 5 7" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c new file mode 100644 index 0000000..cc5e9d6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Darwin/AIX do double-word + alignment of the struct if the first element is a double. + Check that it does not here. + Limitations: none. + PR: none. + Originator: 20030914 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_9byte { + int a; + double b; +} cls_struct_9byte; + +cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1, + struct cls_struct_9byte b2) +{ + struct cls_struct_9byte result; + + result.a = b1.a + b2.a; + result.b = b1.b + b2.b; + + printf("%d %g %d %g: %d %g\n", b1.a, b1.b, b2.a, b2.b, + result.a, result.b); + + return result; +} + +static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + struct cls_struct_9byte b1, b2; + + b1 = *(struct cls_struct_9byte*)(args[0]); + b2 = *(struct cls_struct_9byte*)(args[1]); + + *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_9byte h_dbl = { 7, 8.0}; + struct cls_struct_9byte j_dbl = { 1, 9.0}; + struct cls_struct_9byte res_dbl; + + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &h_dbl; + args_dbl[1] = &j_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl); + /* { dg-output "7 8 1 9: 8 17" } */ + printf("res: %d %g\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 8 17" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl); + /* { dg-output "\n7 8 1 9: 8 17" } */ + printf("res: %d %g\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 8 17" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c new file mode 100644 index 0000000..5c0ba0d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Darwin/AIX do double-word + alignment of the struct if the first element is a double. + Check that it does here. + Limitations: none. + PR: none. + Originator: 20030914 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_9byte { + double a; + int b; +} cls_struct_9byte; + +cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1, + struct cls_struct_9byte b2) +{ + struct cls_struct_9byte result; + + result.a = b1.a + b2.a; + result.b = b1.b + b2.b; + + printf("%g %d %g %d: %g %d\n", b1.a, b1.b, b2.a, b2.b, + result.a, result.b); + + return result; +} + +static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + struct cls_struct_9byte b1, b2; + + b1 = *(struct cls_struct_9byte*)(args[0]); + b2 = *(struct cls_struct_9byte*)(args[1]); + + *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_9byte h_dbl = { 7.0, 8}; + struct cls_struct_9byte j_dbl = { 1.0, 9}; + struct cls_struct_9byte res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_sint; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &h_dbl; + args_dbl[1] = &j_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl); + /* { dg-output "7 8 1 9: 8 17" } */ + printf("res: %g %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 8 17" } */ + + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl); + /* { dg-output "\n7 8 1 9: 8 17" } */ + printf("res: %g %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 8 17" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c new file mode 100644 index 0000000..22b94d5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c @@ -0,0 +1,93 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of double. + Limitations: none. + PR: none. + Originator: 20031203 */ + + + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + double b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c new file mode 100644 index 0000000..62637f2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of float. + Limitations: none. + PR: none. + Originator: 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + float b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c new file mode 100644 index 0000000..af38060 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c @@ -0,0 +1,92 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of long double. + Limitations: none. + PR: none. + Originator: 20031203 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + long double b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_longdouble; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c new file mode 100644 index 0000000..a3732bd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c @@ -0,0 +1,134 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of long double. + Limitations: none. + PR: none. + Originator: 20031203 */ + +/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ +/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ + +#include "ffitest.h" + +typedef struct cls_struct_align { + long double a; + long double b; + long double c; + long double d; + long double e; + long double f; + long double g; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn( + cls_struct_align a1, + cls_struct_align a2) +{ + struct cls_struct_align r; + + r.a = a1.a + a2.a; + r.b = a1.b + a2.b; + r.c = a1.c + a2.c; + r.d = a1.d + a2.d; + r.e = a1.e + a2.e; + r.f = a1.f + a2.f; + r.g = a1.g + a2.g; + + printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: " + "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", + a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, + a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, + r.a, r.b, r.c, r.d, r.e, r.f, r.g); + + return r; +} + +cls_struct_align cls_struct_align_fn2( + cls_struct_align a1) +{ + struct cls_struct_align r; + + r.a = a1.a + 1; + r.b = a1.b + 1; + r.c = a1.c + 1; + r.d = a1.d + 1; + r.e = a1.e + 1; + r.f = a1.f + 1; + r.g = a1.g + 1; + + printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg: " + "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", + a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, + r.a, r.b, r.c, r.d, r.e, r.f, r.g); + + return r; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[8]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; + struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_longdouble; + cls_struct_fields[1] = &ffi_type_longdouble; + cls_struct_fields[2] = &ffi_type_longdouble; + cls_struct_fields[3] = &ffi_type_longdouble; + cls_struct_fields[4] = &ffi_type_longdouble; + cls_struct_fields[5] = &ffi_type_longdouble; + cls_struct_fields[6] = &ffi_type_longdouble; + cls_struct_fields[7] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ + printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ + printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c new file mode 100644 index 0000000..63a0f76 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c @@ -0,0 +1,117 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of long double. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/18/2007 +*/ + +/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ +/* { dg-do run { xfail strongarm*-*-* } } */ +/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ +/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ + +#include "ffitest.h" + +typedef struct cls_struct_align { + long double a; + long double b; + long double c; + long double d; + long double e; + double f; + long double g; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn( + cls_struct_align a1, + cls_struct_align a2) +{ + struct cls_struct_align r; + + r.a = a1.a + a2.a; + r.b = a1.b + a2.b; + r.c = a1.c + a2.c; + r.d = a1.d + a2.d; + r.e = a1.e + a2.e; + r.f = a1.f + a2.f; + r.g = a1.g + a2.g; + + printf("%Lg %Lg %Lg %Lg %Lg %g %Lg %Lg %Lg %Lg %Lg %Lg %g %Lg: " + "%Lg %Lg %Lg %Lg %Lg %g %Lg\n", + a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, + a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, + r.a, r.b, r.c, r.d, r.e, r.f, r.g); + + return r; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[8]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; + struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_longdouble; + cls_struct_fields[1] = &ffi_type_longdouble; + cls_struct_fields[2] = &ffi_type_longdouble; + cls_struct_fields[3] = &ffi_type_longdouble; + cls_struct_fields[4] = &ffi_type_longdouble; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_longdouble; + cls_struct_fields[7] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ + printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ + printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ + + exit(0); +} + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c new file mode 100644 index 0000000..cbc4f95 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c @@ -0,0 +1,95 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of pointer. + Limitations: none. + PR: none. + Originator: 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + void *b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = (void *)((uintptr_t)a1.b + (uintptr_t)a2.b); + result.c = a1.c + a2.c; + + printf("%d %" PRIuPTR " %d %d %" PRIuPTR " %d: %d %" PRIuPTR " %d\n", + a1.a, (uintptr_t)a1.b, a1.c, + a2.a, (uintptr_t)a2.b, a2.c, + result.a, (uintptr_t)result.b, + result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 12, (void *)4951, 127 }; + struct cls_struct_align f_dbl = { 1, (void *)9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_pointer; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c new file mode 100644 index 0000000..383ea41 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of sint16. + Limitations: none. + PR: none. + Originator: 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + signed short b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_sshort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c new file mode 100644 index 0000000..705d78c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of sint32. + Limitations: none. + PR: none. + Originator: 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + signed int b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_sint; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c new file mode 100644 index 0000000..31d53af --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c @@ -0,0 +1,92 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of sint64. + Limitations: none. + PR: none. + Originator: 20031203 */ + +/* { dg-do run } */ +/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + signed long long b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_sint64; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c new file mode 100644 index 0000000..cb6b748 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of uint16. + Limitations: none. + PR: none. + Originator: 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + unsigned short b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c new file mode 100644 index 0000000..e453d3e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of uint32. + Limitations: none. + PR: none. + Originator: 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + unsigned int b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uint; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c new file mode 100644 index 0000000..495c79f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c @@ -0,0 +1,93 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of uint64. + Limitations: none. + PR: none. + Originator: 20031203 */ + + +/* { dg-do run } */ +/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + unsigned long long b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uint64; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c new file mode 100644 index 0000000..660dabb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c @@ -0,0 +1,66 @@ +/* Area: ffi_call, closure_call + Purpose: Check double arguments in structs. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/23/2007 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +typedef struct Dbls { + double x; + double y; +} Dbls; + +void +closure_test_fn(Dbls p) +{ + printf("%.1f %.1f\n", p.x, p.y); +} + +void +closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, + void** args, void* userdata __UNUSED__) +{ + closure_test_fn(*(Dbls*)args[0]); +} + +int main(int argc __UNUSED__, char** argv __UNUSED__) +{ + ffi_cif cif; + + void *code; + ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type* cl_arg_types[1]; + + ffi_type ts1_type; + ffi_type* ts1_type_elements[4]; + + ts1_type.size = 0; + ts1_type.alignment = 0; + ts1_type.type = FFI_TYPE_STRUCT; + ts1_type.elements = ts1_type_elements; + + ts1_type_elements[0] = &ffi_type_double; + ts1_type_elements[1] = &ffi_type_double; + ts1_type_elements[2] = NULL; + + cl_arg_types[0] = &ts1_type; + + Dbls arg = { 1.0, 2.0 }; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_void, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK); + + ((void*(*)(Dbls))(code))(arg); + /* { dg-output "1.0 2.0\n" } */ + + closure_test_fn(arg); + /* { dg-output "1.0 2.0\n" } */ + + return 0; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c new file mode 100644 index 0000000..84ad4cb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c @@ -0,0 +1,43 @@ +/* Area: closure_call + Purpose: Check return value double. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) + { + *(double *)resp = *(double *)args[0]; + + printf("%f: %f\n",*(double *)args[0], + *(double *)resp); + } +typedef double (*cls_ret_double)(double); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + double res; + + cl_arg_types[0] = &ffi_type_double; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_double, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_double)code))(21474.789); + /* { dg-output "21474.789000: 21474.789000" } */ + printf("res: %.6f\n", res); + /* { dg-output "\nres: 21474.789000" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c new file mode 100644 index 0000000..e769caf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c @@ -0,0 +1,60 @@ +/* Area: ffi_call, closure_call + Purpose: Test doubles passed in variable argument lists. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-output "" { xfail avr32*-*-* } } */ +/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ +/* { dg-skip-if "" arm*-*-* { "-mfloat-abi=hard" } { "" } } */ + +#include "ffitest.h" + +static void +cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + char* format = *(char**)args[0]; + double doubleValue = *(double*)args[1]; + + *(ffi_arg*)resp = printf(format, doubleValue); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[3]; + ffi_type* arg_types[3]; + + char* format = "%.1f\n"; + double doubleArg = 7; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &ffi_type_double; + arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, + arg_types) == FFI_OK); + + args[0] = &format; + args[1] = &doubleArg; + args[2] = NULL; + + ffi_call(&cif, FFI_FN(printf), &res, args); + // { dg-output "7.0" } + printf("res: %d\n", (int) res); + // { dg-output "\nres: 4" } + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL, code) == FFI_OK); + + res = ((int(*)(char*, double))(code))(format, doubleArg); + // { dg-output "\n7.0" } + printf("res: %d\n", (int) res); + // { dg-output "\nres: 4" } + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c new file mode 100644 index 0000000..0090fed --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c @@ -0,0 +1,42 @@ +/* Area: closure_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_float_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) + { + *(float *)resp = *(float *)args[0]; + + printf("%g: %g\n",*(float *)args[0], + *(float *)resp); + } + +typedef float (*cls_ret_float)(float); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + float res; + + cl_arg_types[0] = &ffi_type_float; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_float, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_float_fn, NULL, code) == FFI_OK); + res = ((((cls_ret_float)code)(-2122.12))); + /* { dg-output "\\-2122.12: \\-2122.12" } */ + printf("res: %.6f\n", res); + /* { dg-output "\nres: \-2122.120117" } */ + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c new file mode 100644 index 0000000..e6bac1f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c @@ -0,0 +1,105 @@ +/* Area: ffi_call, closure_call + Purpose: Check long double arguments. + Limitations: none. + PR: none. + Originator: Blake Chaffin */ + +/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ +/* { dg-do run { xfail arm*-*-* strongarm*-*-* xscale*-*-* } } */ +/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ +/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ + +#include "ffitest.h" + +long double cls_ldouble_fn( + long double a1, + long double a2, + long double a3, + long double a4, + long double a5, + long double a6, + long double a7, + long double a8) +{ + long double r = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8; + + printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n", + a1, a2, a3, a4, a5, a6, a7, a8, r); + + return r; +} + +static void +cls_ldouble_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + long double a1 = *(long double*)args[0]; + long double a2 = *(long double*)args[1]; + long double a3 = *(long double*)args[2]; + long double a4 = *(long double*)args[3]; + long double a5 = *(long double*)args[4]; + long double a6 = *(long double*)args[5]; + long double a7 = *(long double*)args[6]; + long double a8 = *(long double*)args[7]; + + *(long double*)resp = cls_ldouble_fn( + a1, a2, a3, a4, a5, a6, a7, a8); +} + +int main(void) +{ + ffi_cif cif; + void* code; + ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[9]; + ffi_type* arg_types[9]; + long double res = 0; + + long double arg1 = 1; + long double arg2 = 2; + long double arg3 = 3; + long double arg4 = 4; + long double arg5 = 5; + long double arg6 = 6; + long double arg7 = 7; + long double arg8 = 8; + + arg_types[0] = &ffi_type_longdouble; + arg_types[1] = &ffi_type_longdouble; + arg_types[2] = &ffi_type_longdouble; + arg_types[3] = &ffi_type_longdouble; + arg_types[4] = &ffi_type_longdouble; + arg_types[5] = &ffi_type_longdouble; + arg_types[6] = &ffi_type_longdouble; + arg_types[7] = &ffi_type_longdouble; + arg_types[8] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 8, &ffi_type_longdouble, + arg_types) == FFI_OK); + + args[0] = &arg1; + args[1] = &arg2; + args[2] = &arg3; + args[3] = &arg4; + args[4] = &arg5; + args[5] = &arg6; + args[6] = &arg7; + args[7] = &arg8; + args[8] = NULL; + + ffi_call(&cif, FFI_FN(cls_ldouble_fn), &res, args); + /* { dg-output "1 2 3 4 5 6 7 8: 36" } */ + printf("res: %Lg\n", res); + /* { dg-output "\nres: 36" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ldouble_gn, NULL, code) == FFI_OK); + + res = ((long double(*)(long double, long double, long double, long double, + long double, long double, long double, long double))(code))(arg1, arg2, + arg3, arg4, arg5, arg6, arg7, arg8); + /* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */ + printf("res: %Lg\n", res); + /* { dg-output "\nres: 36" } */ + + return 0; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c new file mode 100644 index 0000000..07780ed --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c @@ -0,0 +1,60 @@ +/* Area: ffi_call, closure_call + Purpose: Test long doubles passed in variable argument lists. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */ +/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ +/* { dg-skip-if "" arm*-*-* { "-mfloat-abi=hard" } { "" } } */ + +#include "ffitest.h" + +static void +cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + char* format = *(char**)args[0]; + long double ldValue = *(long double*)args[1]; + + *(ffi_arg*)resp = printf(format, ldValue); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[3]; + ffi_type* arg_types[3]; + + char* format = "%.1Lf\n"; + long double ldArg = 7; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &ffi_type_longdouble; + arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, + arg_types) == FFI_OK); + + args[0] = &format; + args[1] = &ldArg; + args[2] = NULL; + + ffi_call(&cif, FFI_FN(printf), &res, args); + // { dg-output "7.0" } + printf("res: %d\n", (int) res); + // { dg-output "\nres: 4" } + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL, code) == FFI_OK); + + res = ((int(*)(char*, long double))(code))(format, ldArg); + // { dg-output "\n7.0" } + printf("res: %d\n", (int) res); + // { dg-output "\nres: 4" } + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c new file mode 100644 index 0000000..71df7b6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c @@ -0,0 +1,74 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple signed char values. + Limitations: none. + PR: PR13221. + Originator: 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +signed char test_func_fn(signed char a1, signed char a2) +{ + signed char result; + + result = a1 + a2; + + printf("%d %d: %d\n", a1, a2, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + signed char a1, a2; + + a1 = *(signed char *)avals[0]; + a2 = *(signed char *)avals[1]; + + *(ffi_arg *)rval = test_func_fn(a1, a2); + +} + +typedef signed char (*test_type)(signed char, signed char); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[3]; + ffi_type * cl_arg_types[3]; + ffi_arg res_call; + signed char a, b, res_closure; + + a = 2; + b = 125; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = NULL; + + cl_arg_types[0] = &ffi_type_schar; + cl_arg_types[1] = &ffi_type_schar; + cl_arg_types[2] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_schar, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "2 125: 127" } */ + printf("res: %d\n", (signed char)res_call); + /* { dg-output "\nres: 127" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(2, 125); + /* { dg-output "\n2 125: 127" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 127" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c new file mode 100644 index 0000000..4c39153 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c @@ -0,0 +1,74 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple signed short values. + Limitations: none. + PR: PR13221. + Originator: 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +signed short test_func_fn(signed short a1, signed short a2) +{ + signed short result; + + result = a1 + a2; + + printf("%d %d: %d\n", a1, a2, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + signed short a1, a2; + + a1 = *(signed short *)avals[0]; + a2 = *(signed short *)avals[1]; + + *(ffi_arg *)rval = test_func_fn(a1, a2); + +} + +typedef signed short (*test_type)(signed short, signed short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[3]; + ffi_type * cl_arg_types[3]; + ffi_arg res_call; + unsigned short a, b, res_closure; + + a = 2; + b = 32765; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = NULL; + + cl_arg_types[0] = &ffi_type_sshort; + cl_arg_types[1] = &ffi_type_sshort; + cl_arg_types[2] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_sshort, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "2 32765: 32767" } */ + printf("res: %d\n", (unsigned short)res_call); + /* { dg-output "\nres: 32767" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(2, 32765); + /* { dg-output "\n2 32765: 32767" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 32767" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c new file mode 100644 index 0000000..1c3aeb5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c @@ -0,0 +1,86 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple signed short/char values. + Limitations: none. + PR: PR13221. + Originator: 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +signed short test_func_fn(signed char a1, signed short a2, + signed char a3, signed short a4) +{ + signed short result; + + result = a1 + a2 + a3 + a4; + + printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + signed char a1, a3; + signed short a2, a4; + + a1 = *(signed char *)avals[0]; + a2 = *(signed short *)avals[1]; + a3 = *(signed char *)avals[2]; + a4 = *(signed short *)avals[3]; + + *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); + +} + +typedef signed short (*test_type)(signed char, signed short, + signed char, signed short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[5]; + ffi_type * cl_arg_types[5]; + ffi_arg res_call; + signed char a, c; + signed short b, d, res_closure; + + a = 1; + b = 32765; + c = 127; + d = -128; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = &c; + args_dbl[3] = &d; + args_dbl[4] = NULL; + + cl_arg_types[0] = &ffi_type_schar; + cl_arg_types[1] = &ffi_type_sshort; + cl_arg_types[2] = &ffi_type_schar; + cl_arg_types[3] = &ffi_type_sshort; + cl_arg_types[4] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_sshort, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "1 32765 127 -128: 32765" } */ + printf("res: %d\n", (signed short)res_call); + /* { dg-output "\nres: 32765" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(1, 32765, 127, -128); + /* { dg-output "\n1 32765 127 -128: 32765" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 32765" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c new file mode 100644 index 0000000..009c02c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple unsigned char values. + Limitations: none. + PR: PR13221. + Originator: 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +unsigned char test_func_fn(unsigned char a1, unsigned char a2, + unsigned char a3, unsigned char a4) +{ + unsigned char result; + + result = a1 + a2 + a3 + a4; + + printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + unsigned char a1, a2, a3, a4; + + a1 = *(unsigned char *)avals[0]; + a2 = *(unsigned char *)avals[1]; + a3 = *(unsigned char *)avals[2]; + a4 = *(unsigned char *)avals[3]; + + *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); + +} + +typedef unsigned char (*test_type)(unsigned char, unsigned char, + unsigned char, unsigned char); + +void test_func(ffi_cif *cif __UNUSED__, void *rval __UNUSED__, void **avals, + void *data __UNUSED__) +{ + printf("%d %d %d %d\n", *(unsigned char *)avals[0], + *(unsigned char *)avals[1], *(unsigned char *)avals[2], + *(unsigned char *)avals[3]); +} +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[5]; + ffi_type * cl_arg_types[5]; + ffi_arg res_call; + unsigned char a, b, c, d, res_closure; + + a = 1; + b = 2; + c = 127; + d = 125; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = &c; + args_dbl[3] = &d; + args_dbl[4] = NULL; + + cl_arg_types[0] = &ffi_type_uchar; + cl_arg_types[1] = &ffi_type_uchar; + cl_arg_types[2] = &ffi_type_uchar; + cl_arg_types[3] = &ffi_type_uchar; + cl_arg_types[4] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_uchar, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "1 2 127 125: 255" } */ + printf("res: %d\n", (unsigned char)res_call); + /* { dg-output "\nres: 255" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(1, 2, 127, 125); + /* { dg-output "\n1 2 127 125: 255" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 255" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c new file mode 100644 index 0000000..dd10ca7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c @@ -0,0 +1,74 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple unsigned short values. + Limitations: none. + PR: PR13221. + Originator: 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +unsigned short test_func_fn(unsigned short a1, unsigned short a2) +{ + unsigned short result; + + result = a1 + a2; + + printf("%d %d: %d\n", a1, a2, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + unsigned short a1, a2; + + a1 = *(unsigned short *)avals[0]; + a2 = *(unsigned short *)avals[1]; + + *(ffi_arg *)rval = test_func_fn(a1, a2); + +} + +typedef unsigned short (*test_type)(unsigned short, unsigned short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[3]; + ffi_type * cl_arg_types[3]; + ffi_arg res_call; + unsigned short a, b, res_closure; + + a = 2; + b = 32765; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = NULL; + + cl_arg_types[0] = &ffi_type_ushort; + cl_arg_types[1] = &ffi_type_ushort; + cl_arg_types[2] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_ushort, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "2 32765: 32767" } */ + printf("res: %d\n", (unsigned short)res_call); + /* { dg-output "\nres: 32767" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(2, 32765); + /* { dg-output "\n2 32765: 32767" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 32767" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c new file mode 100644 index 0000000..2588e97 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c @@ -0,0 +1,86 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple unsigned short/char values. + Limitations: none. + PR: PR13221. + Originator: 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +unsigned short test_func_fn(unsigned char a1, unsigned short a2, + unsigned char a3, unsigned short a4) +{ + unsigned short result; + + result = a1 + a2 + a3 + a4; + + printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + unsigned char a1, a3; + unsigned short a2, a4; + + a1 = *(unsigned char *)avals[0]; + a2 = *(unsigned short *)avals[1]; + a3 = *(unsigned char *)avals[2]; + a4 = *(unsigned short *)avals[3]; + + *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); + +} + +typedef unsigned short (*test_type)(unsigned char, unsigned short, + unsigned char, unsigned short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[5]; + ffi_type * cl_arg_types[5]; + ffi_arg res_call; + unsigned char a, c; + unsigned short b, d, res_closure; + + a = 1; + b = 2; + c = 127; + d = 128; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = &c; + args_dbl[3] = &d; + args_dbl[4] = NULL; + + cl_arg_types[0] = &ffi_type_uchar; + cl_arg_types[1] = &ffi_type_ushort; + cl_arg_types[2] = &ffi_type_uchar; + cl_arg_types[3] = &ffi_type_ushort; + cl_arg_types[4] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_ushort, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "1 2 127 128: 258" } */ + printf("res: %d\n", (unsigned short)res_call); + /* { dg-output "\nres: 258" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(1, 2, 127, 128); + /* { dg-output "\n1 2 127 128: 258" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 258" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c new file mode 100644 index 0000000..cf03993 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c @@ -0,0 +1,74 @@ +/* Area: ffi_call, closure_call + Purpose: Check pointer arguments. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +#include "ffitest.h" + +void* cls_pointer_fn(void* a1, void* a2) +{ + void* result = (void*)((intptr_t)a1 + (intptr_t)a2); + + printf("0x%08x 0x%08x: 0x%08x\n", + (unsigned int)(uintptr_t) a1, + (unsigned int)(uintptr_t) a2, + (unsigned int)(uintptr_t) result); + + return result; +} + +static void +cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + void* a1 = *(void**)(args[0]); + void* a2 = *(void**)(args[1]); + + *(void**)resp = cls_pointer_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[3]; +// ffi_type cls_pointer_type; + ffi_type* arg_types[3]; + +/* cls_pointer_type.size = sizeof(void*); + cls_pointer_type.alignment = 0; + cls_pointer_type.type = FFI_TYPE_POINTER; + cls_pointer_type.elements = NULL;*/ + + void* arg1 = (void*)0x12345678; + void* arg2 = (void*)0x89abcdef; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &ffi_type_pointer; + arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer, + arg_types) == FFI_OK); + + args[0] = &arg1; + args[1] = &arg2; + args[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_pointer_fn), &res, args); + /* { dg-output "0x12345678 0x89abcdef: 0x9be02467" } */ + printf("res: 0x%08x\n", (unsigned int) res); + /* { dg-output "\nres: 0x9be02467" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); + + res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); + /* { dg-output "\n0x12345678 0x89abcdef: 0x9be02467" } */ + printf("res: 0x%08x\n", (unsigned int) res); + /* { dg-output "\nres: 0x9be02467" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c new file mode 100644 index 0000000..d631cf8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c @@ -0,0 +1,140 @@ +/* Area: ffi_call, closure_call + Purpose: Check pointer arguments across multiple hideous stack frames. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/7/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +#include "ffitest.h" + +static long dummyVar; + +long dummy_func( + long double a1, char b1, + long double a2, char b2, + long double a3, char b3, + long double a4, char b4) +{ + return a1 + b1 + a2 + b2 + a3 + b3 + a4 + b4; +} + +void* cls_pointer_fn2(void* a1, void* a2) +{ + long double trample1 = (intptr_t)a1 + (intptr_t)a2; + char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; + long double trample3 = (intptr_t)trample1 + (intptr_t)a1; + char trample4 = trample2 + ((char*)&a1)[1]; + long double trample5 = (intptr_t)trample3 + (intptr_t)a2; + char trample6 = trample4 + ((char*)&a2)[1]; + long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; + char trample8 = trample6 + trample2; + + dummyVar = dummy_func(trample1, trample2, trample3, trample4, + trample5, trample6, trample7, trample8); + + void* result = (void*)((intptr_t)a1 + (intptr_t)a2); + + printf("0x%08x 0x%08x: 0x%08x\n", + (unsigned int)(uintptr_t) a1, + (unsigned int)(uintptr_t) a2, + (unsigned int)(uintptr_t) result); + + return result; +} + +void* cls_pointer_fn1(void* a1, void* a2) +{ + long double trample1 = (intptr_t)a1 + (intptr_t)a2; + char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; + long double trample3 = (intptr_t)trample1 + (intptr_t)a1; + char trample4 = trample2 + ((char*)&a1)[1]; + long double trample5 = (intptr_t)trample3 + (intptr_t)a2; + char trample6 = trample4 + ((char*)&a2)[1]; + long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; + char trample8 = trample6 + trample2; + + dummyVar = dummy_func(trample1, trample2, trample3, trample4, + trample5, trample6, trample7, trample8); + + void* result = (void*)((intptr_t)a1 + (intptr_t)a2); + + printf("0x%08x 0x%08x: 0x%08x\n", + (unsigned int)(intptr_t) a1, + (unsigned int)(intptr_t) a2, + (unsigned int)(intptr_t) result); + + result = cls_pointer_fn2(result, a1); + + return result; +} + +static void +cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + void* a1 = *(void**)(args[0]); + void* a2 = *(void**)(args[1]); + + long double trample1 = (intptr_t)a1 + (intptr_t)a2; + char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; + long double trample3 = (intptr_t)trample1 + (intptr_t)a1; + char trample4 = trample2 + ((char*)&a1)[1]; + long double trample5 = (intptr_t)trample3 + (intptr_t)a2; + char trample6 = trample4 + ((char*)&a2)[1]; + long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; + char trample8 = trample6 + trample2; + + dummyVar = dummy_func(trample1, trample2, trample3, trample4, + trample5, trample6, trample7, trample8); + + *(void**)resp = cls_pointer_fn1(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[3]; +// ffi_type cls_pointer_type; + ffi_type* arg_types[3]; + +/* cls_pointer_type.size = sizeof(void*); + cls_pointer_type.alignment = 0; + cls_pointer_type.type = FFI_TYPE_POINTER; + cls_pointer_type.elements = NULL;*/ + + void* arg1 = (void*)0x01234567; + void* arg2 = (void*)0x89abcdef; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &ffi_type_pointer; + arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer, + arg_types) == FFI_OK); + + args[0] = &arg1; + args[1] = &arg2; + args[2] = NULL; + + printf("\n"); + ffi_call(&cif, FFI_FN(cls_pointer_fn1), &res, args); + + printf("res: 0x%08x\n", (unsigned int) res); + // { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } + // { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } + // { dg-output "\nres: 0x8bf258bd" } + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); + + res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); + + printf("res: 0x%08x\n", (unsigned int) res); + // { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } + // { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } + // { dg-output "\nres: 0x8bf258bd" } + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c new file mode 100644 index 0000000..82986b1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c @@ -0,0 +1,44 @@ +/* Area: closure_call + Purpose: Check return value schar. + Limitations: none. + PR: none. + Originator: 20031108 */ + + + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_schar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg*)resp = *(signed char *)args[0]; + printf("%d: %d\n",*(signed char *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef signed char (*cls_ret_schar)(signed char); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + signed char res; + + cl_arg_types[0] = &ffi_type_schar; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_schar, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_schar_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_schar)code))(127); + /* { dg-output "127: 127" } */ + printf("res: %d\n", res); + /* { dg-output "\nres: 127" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c new file mode 100644 index 0000000..c7e13b7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c @@ -0,0 +1,42 @@ +/* Area: closure_call + Purpose: Check return value sint32. + Limitations: none. + PR: none. + Originator: 20031108 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_sint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg*)resp = *(signed int *)args[0]; + printf("%d: %d\n",*(signed int *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef signed int (*cls_ret_sint)(signed int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + signed int res; + + cl_arg_types[0] = &ffi_type_sint; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sint_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_sint)code))(65534); + /* { dg-output "65534: 65534" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 65534" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c new file mode 100644 index 0000000..846d57e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c @@ -0,0 +1,42 @@ +/* Area: closure_call + Purpose: Check return value sshort. + Limitations: none. + PR: none. + Originator: 20031108 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_sshort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg*)resp = *(signed short *)args[0]; + printf("%d: %d\n",*(signed short *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef signed short (*cls_ret_sshort)(signed short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + signed short res; + + cl_arg_types[0] = &ffi_type_sshort; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_sshort, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sshort_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_sshort)code))(255); + /* { dg-output "255: 255" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 255" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c new file mode 100644 index 0000000..c1317e7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c @@ -0,0 +1,42 @@ +/* Area: closure_call + Purpose: Check return value uchar. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_uchar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg*)resp = *(unsigned char *)args[0]; + printf("%d: %d\n",*(unsigned char *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef unsigned char (*cls_ret_uchar)(unsigned char); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + unsigned char res; + + cl_arg_types[0] = &ffi_type_uchar; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uchar, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uchar_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_uchar)code))(127); + /* { dg-output "127: 127" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 127" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c new file mode 100644 index 0000000..885cff5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c @@ -0,0 +1,43 @@ +/* Area: closure_call + Purpose: Check return value uint. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_uint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg *)resp = *(unsigned int *)args[0]; + + printf("%d: %d\n",*(unsigned int *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef unsigned int (*cls_ret_uint)(unsigned int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + unsigned int res; + + cl_arg_types[0] = &ffi_type_uint; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uint_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_uint)code))(2147483647); + /* { dg-output "2147483647: 2147483647" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 2147483647" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c new file mode 100644 index 0000000..235ab44 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c @@ -0,0 +1,47 @@ +/* Area: closure_call + Purpose: Check return value long long. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ +#include "ffitest.h" + +static void cls_ret_ulonglong_fn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + *(unsigned long long *)resp= *(unsigned long long *)args[0]; + + printf("%" PRIuLL ": %" PRIuLL "\n",*(unsigned long long *)args[0], + *(unsigned long long *)(resp)); +} +typedef unsigned long long (*cls_ret_ulonglong)(unsigned long long); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + unsigned long long res; + + cl_arg_types[0] = &ffi_type_uint64; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint64, cl_arg_types) == FFI_OK); + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ulonglong_fn, NULL, code) == FFI_OK); + res = (*((cls_ret_ulonglong)code))(214LL); + /* { dg-output "214: 214" } */ + printf("res: %" PRIdLL "\n", res); + /* { dg-output "\nres: 214" } */ + + res = (*((cls_ret_ulonglong)code))(9223372035854775808LL); + /* { dg-output "\n9223372035854775808: 9223372035854775808" } */ + printf("res: %" PRIdLL "\n", res); + /* { dg-output "\nres: 9223372035854775808" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c new file mode 100644 index 0000000..a00100e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c @@ -0,0 +1,43 @@ +/* Area: closure_call + Purpose: Check return value ushort. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_ushort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg*)resp = *(unsigned short *)args[0]; + + printf("%d: %d\n",*(unsigned short *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef unsigned short (*cls_ret_ushort)(unsigned short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + unsigned short res; + + cl_arg_types[0] = &ffi_type_ushort; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_ushort, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ushort_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_ushort)code))(65535); + /* { dg-output "65535: 65535" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 65535" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c new file mode 100644 index 0000000..f5a7317 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c @@ -0,0 +1,36 @@ +/* Area: ffi_prep_cif, ffi_prep_closure + Purpose: Test error return for bad ABIs. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static void +dummy_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, + void** args __UNUSED__, void* userdata __UNUSED__) +{} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type* arg_types[1]; + + arg_types[0] = NULL; + + CHECK(ffi_prep_cif(&cif, 255, 0, &ffi_type_void, + arg_types) == FFI_BAD_ABI); + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void, + arg_types) == FFI_OK); + + cif.abi= 255; + + CHECK(ffi_prep_closure_loc(pcl, &cif, dummy_fn, NULL, code) == FFI_BAD_ABI); + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c new file mode 100644 index 0000000..2539273 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c @@ -0,0 +1,26 @@ +/* Area: ffi_prep_cif + Purpose: Test error return for bad typedefs. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +int main (void) +{ + ffi_cif cif; + ffi_type* arg_types[1]; + + arg_types[0] = NULL; + + ffi_type badType = ffi_type_void; + + badType.size = 0; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &badType, + arg_types) == FFI_BAD_TYPEDEF); + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h new file mode 100644 index 0000000..0e95e16 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h @@ -0,0 +1,153 @@ +#include +#include +#include +#include +#include +#include "fficonfig.h" + +#if defined HAVE_STDINT_H +#include +#endif + +#if defined HAVE_INTTYPES_H +#include +#endif + +#define MAX_ARGS 256 + +#define CHECK(x) !(x) ? abort() : 0 + +/* Define __UNUSED__ that also other compilers than gcc can run the tests. */ +#undef __UNUSED__ +#if defined(__GNUC__) +#define __UNUSED__ __attribute__((__unused__)) +#else +#define __UNUSED__ +#endif + +/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a + file open. */ +#ifdef HAVE_MMAP_ANON +# undef HAVE_MMAP_DEV_ZERO + +# include +# ifndef MAP_FAILED +# define MAP_FAILED -1 +# endif +# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) +# define MAP_ANONYMOUS MAP_ANON +# endif +# define USING_MMAP + +#endif + +#ifdef HAVE_MMAP_DEV_ZERO + +# include +# ifndef MAP_FAILED +# define MAP_FAILED -1 +# endif +# define USING_MMAP + +#endif + +/* MinGW kludge. */ +#ifdef _WIN64 +#define PRIdLL "I64d" +#define PRIuLL "I64u" +#else +#define PRIdLL "lld" +#define PRIuLL "llu" +#endif + +/* Tru64 UNIX kludge. */ +#if defined(__alpha__) && defined(__osf__) +/* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit. */ +#undef PRIdLL +#define PRIdLL "ld" +#undef PRIuLL +#define PRIuLL "lu" +#define PRId8 "hd" +#define PRIu8 "hu" +#define PRId64 "ld" +#define PRIu64 "lu" +#define PRIuPTR "lu" +#endif + +/* PA HP-UX kludge. */ +#if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) +#define PRIuPTR "lu" +#endif + +/* IRIX kludge. */ +#if defined(__sgi) +/* IRIX 6.5 provides all definitions, but only for C99 + compilations. */ +#define PRId8 "hhd" +#define PRIu8 "hhu" +#if (_MIPS_SZLONG == 32) +#define PRId64 "lld" +#define PRIu64 "llu" +#endif +/* This doesn't match , which always has "lld" here, but the + arguments are uint64_t, int64_t, which are unsigned long, long for + 64-bit in . */ +#if (_MIPS_SZLONG == 64) +#define PRId64 "ld" +#define PRIu64 "lu" +#endif +/* This doesn't match , which has "u" here, but the arguments + are uintptr_t, which is always unsigned long. */ +#define PRIuPTR "lu" +#endif + +/* Solaris < 10 kludge. */ +#if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) +#if defined(__arch64__) || defined (__x86_64__) +#define PRIuPTR "lu" +#else +#define PRIuPTR "u" +#endif +#endif + +#ifdef USING_MMAP +static inline void * +allocate_mmap (size_t size) +{ + void *page; +#if defined (HAVE_MMAP_DEV_ZERO) + static int dev_zero_fd = -1; +#endif + +#ifdef HAVE_MMAP_DEV_ZERO + if (dev_zero_fd == -1) + { + dev_zero_fd = open ("/dev/zero", O_RDONLY); + if (dev_zero_fd == -1) + { + perror ("open /dev/zero: %m"); + exit (1); + } + } +#endif + + +#ifdef HAVE_MMAP_ANON + page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +#endif +#ifdef HAVE_MMAP_DEV_ZERO + page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE, dev_zero_fd, 0); +#endif + + if (page == (void *) MAP_FAILED) + { + perror ("virtual memory exhausted"); + exit (1); + } + + return page; +} + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float.c new file mode 100644 index 0000000..fbc272d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float.c @@ -0,0 +1,59 @@ +/* Area: ffi_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static int floating(int a, float b, double c, long double d) +{ + int i; + + i = (int) ((float)a/b + ((float)c/(float)d)); + + return i; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + + float f; + signed int si1; + double d; + long double ld; + + args[0] = &ffi_type_sint; + values[0] = &si1; + args[1] = &ffi_type_float; + values[1] = &f; + args[2] = &ffi_type_double; + values[2] = &d; + args[3] = &ffi_type_longdouble; + values[3] = &ld; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_sint, args) == FFI_OK); + + si1 = 6; + f = 3.14159; + d = (double)1.0/(double)3.0; + ld = 2.71828182846L; + + floating (si1, f, d, ld); + + ffi_call(&cif, FFI_FN(floating), &rint, values); + + printf ("%d vs %d\n", (int)rint, floating (si1, f, d, ld)); + + CHECK((int)rint == floating(si1, f, d, ld)); + + exit (0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float1.c new file mode 100644 index 0000000..991d059 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float1.c @@ -0,0 +1,58 @@ +/* Area: ffi_call + Purpose: Check return value double. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +#include "float.h" + +typedef union +{ + double d; + unsigned char c[sizeof (double)]; +} value_type; + +#define CANARY 0xba + +static double dblit(float f) +{ + return f/3.0; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float f; + value_type result[2]; + unsigned int i; + + args[0] = &ffi_type_float; + values[0] = &f; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_double, args) == FFI_OK); + + f = 3.14159; + + /* Put a canary in the return array. This is a regression test for + a buffer overrun. */ + memset(result[1].c, CANARY, sizeof (double)); + + ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); + + /* These are not always the same!! Check for a reasonable delta */ + + CHECK(result[0].d - dblit(f) < DBL_EPSILON); + + /* Check the canary. */ + for (i = 0; i < sizeof (double); ++i) + CHECK(result[1].c[i] == CANARY); + + exit(0); + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float2.c new file mode 100644 index 0000000..a0b296c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float2.c @@ -0,0 +1,58 @@ +/* Area: ffi_call + Purpose: Check return value long double. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-excess-errors "fails" { target x86_64-*-mingw* x86_64-*-cygwin* } } */ +/* { dg-do run { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ + +#include "ffitest.h" +#include "float.h" + +static long double ldblit(float f) +{ + return (long double) (((long double) f)/ (long double) 3.0); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float f; + long double ld; + + args[0] = &ffi_type_float; + values[0] = &f; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_longdouble, args) == FFI_OK); + + f = 3.14159; + +#if 1 + /* This is ifdef'd out for now. long double support under SunOS/gcc + is pretty much non-existent. You'll get the odd bus error in library + routines like printf(). */ + printf ("%Lf\n", ldblit(f)); +#endif + ld = 666; + ffi_call(&cif, FFI_FN(ldblit), &ld, values); + +#if 1 + /* This is ifdef'd out for now. long double support under SunOS/gcc + is pretty much non-existent. You'll get the odd bus error in library + routines like printf(). */ + printf ("%Lf, %Lf, %Lf, %Lf\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON); +#endif + + /* These are not always the same!! Check for a reasonable delta */ + if (ld - ldblit(f) < LDBL_EPSILON) + puts("long double return value tests ok!"); + else + CHECK(0); + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float3.c new file mode 100644 index 0000000..76bd5f2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float3.c @@ -0,0 +1,72 @@ +/* Area: ffi_call + Purpose: Check float arguments with different orders. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ + +#include "ffitest.h" +#include "float.h" + +static double floating_1(float a, double b, long double c) +{ + return (double) a + b + (double) c; +} + +static double floating_2(long double a, double b, float c) +{ + return (double) a + b + (double) c; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double rd; + + float f; + double d; + long double ld; + + args[0] = &ffi_type_float; + values[0] = &f; + args[1] = &ffi_type_double; + values[1] = &d; + args[2] = &ffi_type_longdouble; + values[2] = &ld; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &ffi_type_double, args) == FFI_OK); + + f = 3.14159; + d = (double)1.0/(double)3.0; + ld = 2.71828182846L; + + floating_1 (f, d, ld); + + ffi_call(&cif, FFI_FN(floating_1), &rd, values); + + CHECK(rd - floating_1(f, d, ld) < DBL_EPSILON); + + args[0] = &ffi_type_longdouble; + values[0] = &ld; + args[1] = &ffi_type_double; + values[1] = &d; + args[2] = &ffi_type_float; + values[2] = &f; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &ffi_type_double, args) == FFI_OK); + + floating_2 (ld, d, f); + + ffi_call(&cif, FFI_FN(floating_2), &rd, values); + + CHECK(rd - floating_2(ld, d, f) < DBL_EPSILON); + + exit (0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float4.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float4.c new file mode 100644 index 0000000..0dd6d85 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float4.c @@ -0,0 +1,62 @@ +/* Area: ffi_call + Purpose: Check denorm double value. + Limitations: none. + PR: PR26483. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +/* { dg-options "-mieee" { target alpha*-*-* } } */ + +#include "ffitest.h" +#include "float.h" + +typedef union +{ + double d; + unsigned char c[sizeof (double)]; +} value_type; + +#define CANARY 0xba + +static double dblit(double d) +{ + return d; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double d; + value_type result[2]; + unsigned int i; + + args[0] = &ffi_type_double; + values[0] = &d; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_double, args) == FFI_OK); + + d = DBL_MIN / 2; + + /* Put a canary in the return array. This is a regression test for + a buffer overrun. */ + memset(result[1].c, CANARY, sizeof (double)); + + ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); + + /* The standard delta check doesn't work for denorms. Since we didn't do + any arithmetic, we should get the original result back, and hence an + exact check should be OK here. */ + + CHECK(result[0].d == dblit(d)); + + /* Check the canary. */ + for (i = 0; i < sizeof (double); ++i) + CHECK(result[1].c[i] == CANARY); + + exit(0); + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c new file mode 100644 index 0000000..e04e1d5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c @@ -0,0 +1,342 @@ +/* Area: ffi_call, closure_call + Purpose: Check large structure returns. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/18/2007 +*/ + +/* { dg-excess-errors "" { target x86_64-*-mingw* x86_64-*-cygwin* } } */ +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ +/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ + +#include "ffitest.h" + +typedef struct BigStruct{ + uint8_t a; + int8_t b; + uint16_t c; + int16_t d; + uint32_t e; + int32_t f; + uint64_t g; + int64_t h; + float i; + double j; + long double k; + char* l; + uint8_t m; + int8_t n; + uint16_t o; + int16_t p; + uint32_t q; + int32_t r; + uint64_t s; + int64_t t; + float u; + double v; + long double w; + char* x; + uint8_t y; + int8_t z; + uint16_t aa; + int16_t bb; + uint32_t cc; + int32_t dd; + uint64_t ee; + int64_t ff; + float gg; + double hh; + long double ii; + char* jj; + uint8_t kk; + int8_t ll; + uint16_t mm; + int16_t nn; + uint32_t oo; + int32_t pp; + uint64_t qq; + int64_t rr; + float ss; + double tt; + long double uu; + char* vv; + uint8_t ww; + int8_t xx; +} BigStruct; + +BigStruct +test_large_fn( + uint8_t ui8_1, + int8_t si8_1, + uint16_t ui16_1, + int16_t si16_1, + uint32_t ui32_1, + int32_t si32_1, + uint64_t ui64_1, + int64_t si64_1, + float f_1, + double d_1, + long double ld_1, + char* p_1, + uint8_t ui8_2, + int8_t si8_2, + uint16_t ui16_2, + int16_t si16_2, + uint32_t ui32_2, + int32_t si32_2, + uint64_t ui64_2, + int64_t si64_2, + float f_2, + double d_2, + long double ld_2, + char* p_2, + uint8_t ui8_3, + int8_t si8_3, + uint16_t ui16_3, + int16_t si16_3, + uint32_t ui32_3, + int32_t si32_3, + uint64_t ui64_3, + int64_t si64_3, + float f_3, + double d_3, + long double ld_3, + char* p_3, + uint8_t ui8_4, + int8_t si8_4, + uint16_t ui16_4, + int16_t si16_4, + uint32_t ui32_4, + int32_t si32_4, + uint64_t ui64_4, + int64_t si64_4, + float f_4, + double d_4, + long double ld_4, + char* p_4, + uint8_t ui8_5, + int8_t si8_5) +{ + BigStruct retVal = { + ui8_1 + 1, si8_1 + 1, ui16_1 + 1, si16_1 + 1, ui32_1 + 1, si32_1 + 1, + ui64_1 + 1, si64_1 + 1, f_1 + 1, d_1 + 1, ld_1 + 1, (char*)((intptr_t)p_1 + 1), + ui8_2 + 2, si8_2 + 2, ui16_2 + 2, si16_2 + 2, ui32_2 + 2, si32_2 + 2, + ui64_2 + 2, si64_2 + 2, f_2 + 2, d_2 + 2, ld_2 + 2, (char*)((intptr_t)p_2 + 2), + ui8_3 + 3, si8_3 + 3, ui16_3 + 3, si16_3 + 3, ui32_3 + 3, si32_3 + 3, + ui64_3 + 3, si64_3 + 3, f_3 + 3, d_3 + 3, ld_3 + 3, (char*)((intptr_t)p_3 + 3), + ui8_4 + 4, si8_4 + 4, ui16_4 + 4, si16_4 + 4, ui32_4 + 4, si32_4 + 4, + ui64_4 + 4, si64_4 + 4, f_4 + 4, d_4 + 4, ld_4 + 4, (char*)((intptr_t)p_4 + 4), + ui8_5 + 5, si8_5 + 5}; + + printf("%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 ": " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n", + ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, (unsigned long)p_1, + ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, (unsigned long)p_2, + ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, (unsigned long)p_3, + ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, (unsigned long)p_4, ui8_5, si8_5, + retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f, + retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l, + retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r, + retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x, + retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd, + retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj, + retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp, + retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx); + + return retVal; +} + +static void +cls_large_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) +{ + uint8_t ui8_1 = *(uint8_t*)args[0]; + int8_t si8_1 = *(int8_t*)args[1]; + uint16_t ui16_1 = *(uint16_t*)args[2]; + int16_t si16_1 = *(int16_t*)args[3]; + uint32_t ui32_1 = *(uint32_t*)args[4]; + int32_t si32_1 = *(int32_t*)args[5]; + uint64_t ui64_1 = *(uint64_t*)args[6]; + int64_t si64_1 = *(int64_t*)args[7]; + float f_1 = *(float*)args[8]; + double d_1 = *(double*)args[9]; + long double ld_1 = *(long double*)args[10]; + char* p_1 = *(char**)args[11]; + uint8_t ui8_2 = *(uint8_t*)args[12]; + int8_t si8_2 = *(int8_t*)args[13]; + uint16_t ui16_2 = *(uint16_t*)args[14]; + int16_t si16_2 = *(int16_t*)args[15]; + uint32_t ui32_2 = *(uint32_t*)args[16]; + int32_t si32_2 = *(int32_t*)args[17]; + uint64_t ui64_2 = *(uint64_t*)args[18]; + int64_t si64_2 = *(int64_t*)args[19]; + float f_2 = *(float*)args[20]; + double d_2 = *(double*)args[21]; + long double ld_2 = *(long double*)args[22]; + char* p_2 = *(char**)args[23]; + uint8_t ui8_3 = *(uint8_t*)args[24]; + int8_t si8_3 = *(int8_t*)args[25]; + uint16_t ui16_3 = *(uint16_t*)args[26]; + int16_t si16_3 = *(int16_t*)args[27]; + uint32_t ui32_3 = *(uint32_t*)args[28]; + int32_t si32_3 = *(int32_t*)args[29]; + uint64_t ui64_3 = *(uint64_t*)args[30]; + int64_t si64_3 = *(int64_t*)args[31]; + float f_3 = *(float*)args[32]; + double d_3 = *(double*)args[33]; + long double ld_3 = *(long double*)args[34]; + char* p_3 = *(char**)args[35]; + uint8_t ui8_4 = *(uint8_t*)args[36]; + int8_t si8_4 = *(int8_t*)args[37]; + uint16_t ui16_4 = *(uint16_t*)args[38]; + int16_t si16_4 = *(int16_t*)args[39]; + uint32_t ui32_4 = *(uint32_t*)args[40]; + int32_t si32_4 = *(int32_t*)args[41]; + uint64_t ui64_4 = *(uint64_t*)args[42]; + int64_t si64_4 = *(int64_t*)args[43]; + float f_4 = *(float*)args[44]; + double d_4 = *(double*)args[45]; + long double ld_4 = *(long double*)args[46]; + char* p_4 = *(char**)args[47]; + uint8_t ui8_5 = *(uint8_t*)args[48]; + int8_t si8_5 = *(int8_t*)args[49]; + + *(BigStruct*)resp = test_large_fn( + ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, p_1, + ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, p_2, + ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, p_3, + ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, p_4, + ui8_5, si8_5); +} + +int +main(int argc __UNUSED__, const char** argv __UNUSED__) +{ + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + + ffi_cif cif; + ffi_type* argTypes[51]; + void* argValues[51]; + + ffi_type ret_struct_type; + ffi_type* st_fields[51]; + BigStruct retVal; + + memset (&retVal, 0, sizeof(retVal)); + + ret_struct_type.size = 0; + ret_struct_type.alignment = 0; + ret_struct_type.type = FFI_TYPE_STRUCT; + ret_struct_type.elements = st_fields; + + st_fields[0] = st_fields[12] = st_fields[24] = st_fields[36] = st_fields[48] = &ffi_type_uint8; + st_fields[1] = st_fields[13] = st_fields[25] = st_fields[37] = st_fields[49] = &ffi_type_sint8; + st_fields[2] = st_fields[14] = st_fields[26] = st_fields[38] = &ffi_type_uint16; + st_fields[3] = st_fields[15] = st_fields[27] = st_fields[39] = &ffi_type_sint16; + st_fields[4] = st_fields[16] = st_fields[28] = st_fields[40] = &ffi_type_uint32; + st_fields[5] = st_fields[17] = st_fields[29] = st_fields[41] = &ffi_type_sint32; + st_fields[6] = st_fields[18] = st_fields[30] = st_fields[42] = &ffi_type_uint64; + st_fields[7] = st_fields[19] = st_fields[31] = st_fields[43] = &ffi_type_sint64; + st_fields[8] = st_fields[20] = st_fields[32] = st_fields[44] = &ffi_type_float; + st_fields[9] = st_fields[21] = st_fields[33] = st_fields[45] = &ffi_type_double; + st_fields[10] = st_fields[22] = st_fields[34] = st_fields[46] = &ffi_type_longdouble; + st_fields[11] = st_fields[23] = st_fields[35] = st_fields[47] = &ffi_type_pointer; + + st_fields[50] = NULL; + + uint8_t ui8 = 1; + int8_t si8 = 2; + uint16_t ui16 = 3; + int16_t si16 = 4; + uint32_t ui32 = 5; + int32_t si32 = 6; + uint64_t ui64 = 7; + int64_t si64 = 8; + float f = 9; + double d = 10; + long double ld = 11; + char* p = (char*)0x12345678; + + argTypes[0] = argTypes[12] = argTypes[24] = argTypes[36] = argTypes[48] = &ffi_type_uint8; + argValues[0] = argValues[12] = argValues[24] = argValues[36] = argValues[48] = &ui8; + argTypes[1] = argTypes[13] = argTypes[25] = argTypes[37] = argTypes[49] = &ffi_type_sint8; + argValues[1] = argValues[13] = argValues[25] = argValues[37] = argValues[49] = &si8; + argTypes[2] = argTypes[14] = argTypes[26] = argTypes[38] = &ffi_type_uint16; + argValues[2] = argValues[14] = argValues[26] = argValues[38] = &ui16; + argTypes[3] = argTypes[15] = argTypes[27] = argTypes[39] = &ffi_type_sint16; + argValues[3] = argValues[15] = argValues[27] = argValues[39] = &si16; + argTypes[4] = argTypes[16] = argTypes[28] = argTypes[40] = &ffi_type_uint32; + argValues[4] = argValues[16] = argValues[28] = argValues[40] = &ui32; + argTypes[5] = argTypes[17] = argTypes[29] = argTypes[41] = &ffi_type_sint32; + argValues[5] = argValues[17] = argValues[29] = argValues[41] = &si32; + argTypes[6] = argTypes[18] = argTypes[30] = argTypes[42] = &ffi_type_uint64; + argValues[6] = argValues[18] = argValues[30] = argValues[42] = &ui64; + argTypes[7] = argTypes[19] = argTypes[31] = argTypes[43] = &ffi_type_sint64; + argValues[7] = argValues[19] = argValues[31] = argValues[43] = &si64; + argTypes[8] = argTypes[20] = argTypes[32] = argTypes[44] = &ffi_type_float; + argValues[8] = argValues[20] = argValues[32] = argValues[44] = &f; + argTypes[9] = argTypes[21] = argTypes[33] = argTypes[45] = &ffi_type_double; + argValues[9] = argValues[21] = argValues[33] = argValues[45] = &d; + argTypes[10] = argTypes[22] = argTypes[34] = argTypes[46] = &ffi_type_longdouble; + argValues[10] = argValues[22] = argValues[34] = argValues[46] = &ld; + argTypes[11] = argTypes[23] = argTypes[35] = argTypes[47] = &ffi_type_pointer; + argValues[11] = argValues[23] = argValues[35] = argValues[47] = &p; + + argTypes[50] = NULL; + argValues[50] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 50, &ret_struct_type, argTypes) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_large_fn), &retVal, argValues); + // { dg-output "1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } + printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n", + retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f, + retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l, + retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r, + retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x, + retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd, + retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj, + retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp, + retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx); + // { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_large_fn, NULL, code) == FFI_OK); + + retVal = ((BigStruct(*)( + uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, + uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, + uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, + uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, + uint8_t, int8_t))(code))( + ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, + ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, + ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, + ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, + ui8, si8); + // { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } + printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n", + retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f, + retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l, + retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r, + retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x, + retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd, + retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj, + retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp, + retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx); + // { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } + + return 0; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many.c new file mode 100644 index 0000000..4869ba9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many.c @@ -0,0 +1,69 @@ +/* Area: ffi_call + Purpose: Check return value float, with many arguments + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +#include + +static float many(float f1, + float f2, + float f3, + float f4, + float f5, + float f6, + float f7, + float f8, + float f9, + float f10, + float f11, + float f12, + float f13) +{ +#if 0 + printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n", + (double) f1, (double) f2, (double) f3, (double) f4, (double) f5, + (double) f6, (double) f7, (double) f8, (double) f9, (double) f10, + (double) f11, (double) f12, (double) f13); +#endif + + return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[13]; + void *values[13]; + float fa[13]; + float f, ff; + int i; + + for (i = 0; i < 13; i++) + { + args[i] = &ffi_type_float; + values[i] = &fa[i]; + fa[i] = (float) i; + } + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, + &ffi_type_float, args) == FFI_OK); + + ffi_call(&cif, FFI_FN(many), &f, values); + + ff = many(fa[0], fa[1], + fa[2], fa[3], + fa[4], fa[5], + fa[6], fa[7], + fa[8], fa[9], + fa[10],fa[11],fa[12]); + + if (f - ff < FLT_EPSILON) + exit(0); + else + abort(); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c new file mode 100644 index 0000000..1b26332 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c @@ -0,0 +1,63 @@ +/* Area: ffi_call + Purpose: Check stdcall many call on X86_WIN32 systems. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ + +#include "ffitest.h" +#include + +static float __attribute__((stdcall)) stdcall_many(float f1, + float f2, + float f3, + float f4, + float f5, + float f6, + float f7, + float f8, + float f9, + float f10, + float f11, + float f12, + float f13) +{ + return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[13]; + void *values[13]; + float fa[13]; + float f, ff; + unsigned long ul; + + for (ul = 0; ul < 13; ul++) + { + args[ul] = &ffi_type_float; + values[ul] = &fa[ul]; + fa[ul] = (float) ul; + } + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 13, + &ffi_type_float, args) == FFI_OK); + + ff = stdcall_many(fa[0], fa[1], + fa[2], fa[3], + fa[4], fa[5], + fa[6], fa[7], + fa[8], fa[9], + fa[10], fa[11], fa[12]); + + ffi_call(&cif, FFI_FN(stdcall_many), &f, values); + + if (f - ff < FLT_EPSILON) + printf("stdcall many arg tests ok!\n"); + else + CHECK(0); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/negint.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/negint.c new file mode 100644 index 0000000..3168113 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/negint.c @@ -0,0 +1,53 @@ +/* Area: ffi_call + Purpose: Check that negative integers are passed correctly. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +/* { dg-options -O2 } */ + +#include "ffitest.h" + +static int checking(int a, short b, signed char c) +{ + + return (a < 0 && b < 0 && c < 0); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + + signed int si; + signed short ss; + signed char sc; + + args[0] = &ffi_type_sint; + values[0] = &si; + args[1] = &ffi_type_sshort; + values[1] = &ss; + args[2] = &ffi_type_schar; + values[2] = ≻ + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &ffi_type_sint, args) == FFI_OK); + + si = -6; + ss = -12; + sc = -1; + + checking (si, ss, sc); + + ffi_call(&cif, FFI_FN(checking), &rint, values); + + printf ("%d vs %d\n", (int)rint, checking (si, ss, sc)); + + CHECK(rint != 0); + + exit (0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c new file mode 100644 index 0000000..8aa527e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c @@ -0,0 +1,152 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_16byte1 { + double a; + float b; + int c; +} cls_struct_16byte1; + +typedef struct cls_struct_16byte2 { + int ii; + double dd; + float ff; +} cls_struct_16byte2; + +typedef struct cls_struct_combined { + cls_struct_16byte1 d; + cls_struct_16byte2 e; +} cls_struct_combined; + +cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0, + struct cls_struct_16byte2 b1, + struct cls_struct_combined b2) +{ + struct cls_struct_combined result; + + result.d.a = b0.a + b1.dd + b2.d.a; + result.d.b = b0.b + b1.ff + b2.d.b; + result.d.c = b0.c + b1.ii + b2.d.c; + result.e.ii = b0.c + b1.ii + b2.e.ii; + result.e.dd = b0.a + b1.dd + b2.e.dd; + result.e.ff = b0.b + b1.ff + b2.e.ff; + + printf("%g %g %d %d %g %g %g %g %d %d %g %g: %g %g %d %d %g %g\n", + b0.a, b0.b, b0.c, + b1.ii, b1.dd, b1.ff, + b2.d.a, b2.d.b, b2.d.c, + b2.e.ii, b2.e.dd, b2.e.ff, + result.d.a, result.d.b, result.d.c, + result.e.ii, result.e.dd, result.e.ff); + + return result; +} + +static void +cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_16byte1 b0; + struct cls_struct_16byte2 b1; + struct cls_struct_combined b2; + + b0 = *(struct cls_struct_16byte1*)(args[0]); + b1 = *(struct cls_struct_16byte2*)(args[1]); + b2 = *(struct cls_struct_combined*)(args[2]); + + + *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type* cls_struct_fields1[5]; + ffi_type* cls_struct_fields2[5]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; + struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; + struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, + {3, 1.0, 8.0}}; + struct cls_struct_combined res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + cls_struct_fields1[0] = &ffi_type_sint; + cls_struct_fields1[1] = &ffi_type_double; + cls_struct_fields1[2] = &ffi_type_float; + cls_struct_fields1[3] = NULL; + + cls_struct_fields2[0] = &cls_struct_type; + cls_struct_fields2[1] = &cls_struct_type1; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type2, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl); + /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */ + CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); + CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); + CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); + CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); + CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); + CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1, + cls_struct_16byte2, + cls_struct_combined)) + (code))(e_dbl, f_dbl, g_dbl); + /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */ + CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); + CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); + CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); + CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); + CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); + CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c new file mode 100644 index 0000000..2a9f515 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c @@ -0,0 +1,161 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_16byte1 { + double a; + float b; + int c; +} cls_struct_16byte1; + +typedef struct cls_struct_16byte2 { + int ii; + double dd; + float ff; +} cls_struct_16byte2; + +typedef struct cls_struct_combined { + cls_struct_16byte1 d; + cls_struct_16byte2 e; +} cls_struct_combined; + +cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0, + struct cls_struct_16byte2 b1, + struct cls_struct_combined b2, + struct cls_struct_16byte1 b3) +{ + struct cls_struct_combined result; + + result.d.a = b0.a + b1.dd + b2.d.a; + result.d.b = b0.b + b1.ff + b2.d.b; + result.d.c = b0.c + b1.ii + b2.d.c; + result.e.ii = b0.c + b1.ii + b2.e.ii; + result.e.dd = b0.a + b1.dd + b2.e.dd; + result.e.ff = b0.b + b1.ff + b2.e.ff; + + printf("%g %g %d %d %g %g %g %g %d %d %g %g %g %g %d: %g %g %d %d %g %g\n", + b0.a, b0.b, b0.c, + b1.ii, b1.dd, b1.ff, + b2.d.a, b2.d.b, b2.d.c, + b2.e.ii, b2.e.dd, b2.e.ff, + b3.a, b3.b, b3.c, + result.d.a, result.d.b, result.d.c, + result.e.ii, result.e.dd, result.e.ff); + + return result; +} + +static void +cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_16byte1 b0; + struct cls_struct_16byte2 b1; + struct cls_struct_combined b2; + struct cls_struct_16byte1 b3; + + b0 = *(struct cls_struct_16byte1*)(args[0]); + b1 = *(struct cls_struct_16byte2*)(args[1]); + b2 = *(struct cls_struct_combined*)(args[2]); + b3 = *(struct cls_struct_16byte1*)(args[3]); + + + *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type* cls_struct_fields1[5]; + ffi_type* cls_struct_fields2[5]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; + struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; + struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, + {3, 1.0, 8.0}}; + struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4}; + struct cls_struct_combined res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + cls_struct_fields1[0] = &ffi_type_sint; + cls_struct_fields1[1] = &ffi_type_double; + cls_struct_fields1[2] = &ffi_type_float; + cls_struct_fields1[3] = NULL; + + cls_struct_fields2[0] = &cls_struct_type; + cls_struct_fields2[1] = &cls_struct_type1; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type2, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl); + /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */ + CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); + CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); + CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); + CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); + CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); + CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1, + cls_struct_16byte2, + cls_struct_combined, + cls_struct_16byte1)) + (code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */ + CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); + CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); + CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); + CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); + CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); + CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); + // CHECK( 1 == 0); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c new file mode 100644 index 0000000..d6a718b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c @@ -0,0 +1,133 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned long long a; + unsigned char b; +} A; + +typedef struct B { + unsigned char y; + struct A x; + unsigned int z; +} B; + +typedef struct C { + unsigned long long d; + unsigned char e; +} C; + +static B B_fn(struct A b2, struct B b3, struct C b4) +{ + struct B result; + + result.x.a = b2.a + b3.x.a + b3.z + b4.d; + result.x.b = b2.b + b3.x.b + b3.y + b4.e; + result.y = b2.b + b3.x.b + b4.e; + + printf("%d %d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, b3.z, (int)b4.d, b4.e, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + struct C b2; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + b2 = *(struct C*)(args[2]); + + *(B*)resp = B_fn(b0, b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[4]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + struct A e_dbl = { 1LL, 7}; + struct B f_dbl = { 99, {12LL , 127}, 255}; + struct C g_dbl = { 2LL, 9}; + + struct B res_dbl; + + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &ffi_type_uchar; + cls_struct_fields1[1] = &cls_struct_type; + cls_struct_fields1[2] = &ffi_type_uint; + cls_struct_fields1[3] = NULL; + + cls_struct_fields2[0] = &ffi_type_uint64; + cls_struct_fields2[1] = &ffi_type_uchar; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99 255 2 9: 270 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); + /* { dg-output "\n1 7 12 127 99 255 2 9: 270 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c new file mode 100644 index 0000000..de1584c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c @@ -0,0 +1,110 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: 20030911 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned long a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +B B_fn(struct A b0, struct B b1) +{ + struct B result; + + result.x.a = b0.a + b1.x.a; + result.x.b = b0.b + b1.x.b + b1.y; + result.y = b0.b + b1.x.b; + + printf("%lu %d %lu %d %d: %lu %d %d\n", b0.a, b0.b, b1.x.a, b1.x.b, b1.y, + result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + + *(B*)resp = B_fn(b0, b1); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + struct A e_dbl = { 1, 7}; + struct B f_dbl = {{12 , 127}, 99}; + + struct B res_dbl; + + cls_struct_fields[0] = &ffi_type_ulong; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); + /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c new file mode 100644 index 0000000..58aa853 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c @@ -0,0 +1,111 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: 20030911 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned long long a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +B B_fn(struct A b0, struct B b1) +{ + struct B result; + + result.x.a = b0.a + b1.x.a; + result.x.b = b0.b + b1.x.b + b1.y; + result.y = b0.b + b1.x.b; + + printf("%d %d %d %d %d: %d %d %d\n", (int)b0.a, b0.b, + (int)b1.x.a, b1.x.b, b1.y, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + + *(B*)resp = B_fn(b0, b1); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + struct A e_dbl = { 1LL, 7}; + struct B f_dbl = {{12LL , 127}, 99}; + + struct B res_dbl; + + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); + /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c new file mode 100644 index 0000000..98e491e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c @@ -0,0 +1,111 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: PR 25630. + Originator: 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + double a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +static B B_fn(struct A b2, struct B b3) +{ + struct B result; + + result.x.a = b2.a + b3.x.a; + result.x.b = b2.b + b3.x.b + b3.y; + result.y = b2.b + b3.x.b; + + printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + + *(B*)resp = B_fn(b0, b1); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + struct A e_dbl = { 1.0, 7}; + struct B f_dbl = {{12.0 , 127}, 99}; + + struct B res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); + /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c new file mode 100644 index 0000000..d8e3537 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c @@ -0,0 +1,112 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + long double a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +static B B_fn(struct A b2, struct B b3) +{ + struct B result; + + result.x.a = b2.a + b3.x.a; + result.x.b = b2.b + b3.x.b + b3.y; + result.y = b2.b + b3.x.b; + + printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + + *(B*)resp = B_fn(b0, b1); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + struct A e_dbl = { 1.0, 7}; + struct B f_dbl = {{12.0 , 127}, 99}; + + struct B res_dbl; + + cls_struct_fields[0] = &ffi_type_longdouble; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); + /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c new file mode 100644 index 0000000..2f2b25a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c @@ -0,0 +1,131 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: PR 25630. + Originator: 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + double a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +typedef struct C { + long d; + unsigned char e; +} C; + +static B B_fn(struct A b2, struct B b3, struct C b4) +{ + struct B result; + + result.x.a = b2.a + b3.x.a + b4.d; + result.x.b = b2.b + b3.x.b + b3.y + b4.e; + result.y = b2.b + b3.x.b + b4.e; + + printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + struct C b2; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + b2 = *(struct C*)(args[2]); + + *(B*)resp = B_fn(b0, b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + struct A e_dbl = { 1.0, 7}; + struct B f_dbl = {{12.0 , 127}, 99}; + struct C g_dbl = { 2, 9}; + + struct B res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + cls_struct_fields2[0] = &ffi_type_slong; + cls_struct_fields2[1] = &ffi_type_uchar; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); + /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c new file mode 100644 index 0000000..14c7023 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c @@ -0,0 +1,111 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned long long a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +static B B_fn(struct A b2, struct B b3) +{ + struct B result; + + result.x.a = b2.a + b3.x.a; + result.x.b = b2.b + b3.x.b + b3.y; + result.y = b2.b + b3.x.b; + + printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + + *(B*)resp = B_fn(b0, b1); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + struct A e_dbl = { 1LL, 7}; + struct B f_dbl = {{12.0 , 127}, 99}; + + struct B res_dbl; + + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); + /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c new file mode 100644 index 0000000..bb77ead --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c @@ -0,0 +1,131 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned long long a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +typedef struct C { + unsigned long long d; + unsigned char e; +} C; + +static B B_fn(struct A b2, struct B b3, struct C b4) +{ + struct B result; + + result.x.a = b2.a + b3.x.a + b4.d; + result.x.b = b2.b + b3.x.b + b3.y + b4.e; + result.y = b2.b + b3.x.b + b4.e; + + printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + struct C b2; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + b2 = *(struct C*)(args[2]); + + *(B*)resp = B_fn(b0, b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + struct A e_dbl = { 1LL, 7}; + struct B f_dbl = {{12LL , 127}, 99}; + struct C g_dbl = { 2LL, 9}; + + struct B res_dbl; + + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + cls_struct_fields2[0] = &ffi_type_uint64; + cls_struct_fields2[1] = &ffi_type_uchar; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); + /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c new file mode 100644 index 0000000..e9f541c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c @@ -0,0 +1,131 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned char a; + unsigned long long b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +typedef struct C { + unsigned long d; + unsigned char e; +} C; + +static B B_fn(struct A b2, struct B b3, struct C b4) +{ + struct B result; + + result.x.a = b2.a + b3.x.a + b4.d; + result.x.b = b2.b + b3.x.b + b3.y + b4.e; + result.y = b2.b + b3.x.b + b4.e; + + printf("%d %d %d %d %d %d %d: %d %d %d\n", b2.a, (int)b2.b, + b3.x.a, (int)b3.x.b, b3.y, (int)b4.d, b4.e, + result.x.a, (int)result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + struct C b2; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + b2 = *(struct C*)(args[2]); + + *(B*)resp = B_fn(b0, b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + struct A e_dbl = { 1, 7LL}; + struct B f_dbl = {{12.0 , 127}, 99}; + struct C g_dbl = { 2, 9}; + + struct B res_dbl; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uint64; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + cls_struct_fields2[0] = &ffi_type_ulong; + cls_struct_fields2[1] = &ffi_type_uchar; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); + /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c new file mode 100644 index 0000000..6a91555 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Limitations: none. + PR: none. + Originator: 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct my_ffi_struct { + double a; + double b; + double c; +} my_ffi_struct; + +my_ffi_struct callee(struct my_ffi_struct a1, struct my_ffi_struct a2) +{ + struct my_ffi_struct result; + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + + printf("%g %g %g %g %g %g: %g %g %g\n", a1.a, a1.b, a1.c, + a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +void stub(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct my_ffi_struct a1; + struct my_ffi_struct a2; + + a1 = *(struct my_ffi_struct*)(args[0]); + a2 = *(struct my_ffi_struct*)(args[1]); + + *(my_ffi_struct *)resp = callee(a1, a2); +} + + +int main(void) +{ + ffi_type* my_ffi_struct_fields[4]; + ffi_type my_ffi_struct_type; + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[4]; + ffi_type* arg_types[3]; + + struct my_ffi_struct g = { 1.0, 2.0, 3.0 }; + struct my_ffi_struct f = { 1.0, 2.0, 3.0 }; + struct my_ffi_struct res; + + my_ffi_struct_type.size = 0; + my_ffi_struct_type.alignment = 0; + my_ffi_struct_type.type = FFI_TYPE_STRUCT; + my_ffi_struct_type.elements = my_ffi_struct_fields; + + my_ffi_struct_fields[0] = &ffi_type_double; + my_ffi_struct_fields[1] = &ffi_type_double; + my_ffi_struct_fields[2] = &ffi_type_double; + my_ffi_struct_fields[3] = NULL; + + arg_types[0] = &my_ffi_struct_type; + arg_types[1] = &my_ffi_struct_type; + arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &my_ffi_struct_type, + arg_types) == FFI_OK); + + args[0] = &g; + args[1] = &f; + args[2] = NULL; + ffi_call(&cif, FFI_FN(callee), &res, args); + /* { dg-output "1 2 3 1 2 3: 2 4 6" } */ + printf("res: %g %g %g\n", res.a, res.b, res.c); + /* { dg-output "\nres: 2 4 6" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, stub, NULL, code) == FFI_OK); + + res = ((my_ffi_struct(*)(struct my_ffi_struct, struct my_ffi_struct))(code))(g, f); + /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */ + printf("res: %g %g %g\n", res.a, res.b, res.c); + /* { dg-output "\nres: 2 4 6" } */ + + exit(0);; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c new file mode 100644 index 0000000..4456161 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c @@ -0,0 +1,59 @@ +/* Area: ffi_call + Purpose: Promotion test. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +static int promotion(signed char sc, signed short ss, + unsigned char uc, unsigned short us) +{ + int r = (int) sc + (int) ss + (int) uc + (int) us; + + return r; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + signed char sc; + unsigned char uc; + signed short ss; + unsigned short us; + unsigned long ul; + + args[0] = &ffi_type_schar; + args[1] = &ffi_type_sshort; + args[2] = &ffi_type_uchar; + args[3] = &ffi_type_ushort; + values[0] = ≻ + values[1] = &ss; + values[2] = &uc; + values[3] = &us; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_sint, args) == FFI_OK); + + us = 0; + ul = 0; + + for (sc = (signed char) -127; + sc <= (signed char) 120; sc += 1) + for (ss = -30000; ss <= 30000; ss += 10000) + for (uc = (unsigned char) 0; + uc <= (unsigned char) 200; uc += 20) + for (us = 0; us <= 60000; us += 10000) + { + ul++; + ffi_call(&cif, FFI_FN(promotion), &rint, values); + CHECK((int)rint == (signed char) sc + (signed short) ss + + (unsigned char) uc + (unsigned short) us); + } + printf("%lu promotion tests run\n", ul); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c new file mode 100644 index 0000000..e29bd6c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c @@ -0,0 +1,114 @@ +/* Area: ffi_call + Purpose: Check different structures. + Limitations: none. + PR: none. + Originator: Ronald Oussoren 20030824 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct Point { + float x; + float y; +} Point; + +typedef struct Size { + float h; + float w; +} Size; + +typedef struct Rect { + Point o; + Size s; +} Rect; + +int doit(int o, char* s, Point p, Rect r, int last) +{ + printf("CALLED WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", + o, s, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, last); + return 42; +} + + +int main(void) +{ + ffi_type point_type; + ffi_type size_type; + ffi_type rect_type; + ffi_cif cif; + ffi_type* arglist[6]; + void* values[6]; + int r; + + /* + * First set up FFI types for the 3 struct types + */ + + point_type.size = 0; /*sizeof(Point);*/ + point_type.alignment = 0; /*__alignof__(Point);*/ + point_type.type = FFI_TYPE_STRUCT; + point_type.elements = malloc(3 * sizeof(ffi_type*)); + point_type.elements[0] = &ffi_type_float; + point_type.elements[1] = &ffi_type_float; + point_type.elements[2] = NULL; + + size_type.size = 0;/* sizeof(Size);*/ + size_type.alignment = 0;/* __alignof__(Size);*/ + size_type.type = FFI_TYPE_STRUCT; + size_type.elements = malloc(3 * sizeof(ffi_type*)); + size_type.elements[0] = &ffi_type_float; + size_type.elements[1] = &ffi_type_float; + size_type.elements[2] = NULL; + + rect_type.size = 0;/*sizeof(Rect);*/ + rect_type.alignment =0;/* __alignof__(Rect);*/ + rect_type.type = FFI_TYPE_STRUCT; + rect_type.elements = malloc(3 * sizeof(ffi_type*)); + rect_type.elements[0] = &point_type; + rect_type.elements[1] = &size_type; + rect_type.elements[2] = NULL; + + /* + * Create a CIF + */ + arglist[0] = &ffi_type_sint; + arglist[1] = &ffi_type_pointer; + arglist[2] = &point_type; + arglist[3] = &rect_type; + arglist[4] = &ffi_type_sint; + arglist[5] = NULL; + + r = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, + 5, &ffi_type_sint, arglist); + if (r != FFI_OK) { + abort(); + } + + + /* And call the function through the CIF */ + + { + Point p = { 1.0, 2.0 }; + Rect r = { { 9.0, 10.0}, { -1.0, -2.0 } }; + int o = 0; + int l = 42; + char* m = "myMethod"; + ffi_arg result; + + values[0] = &o; + values[1] = &m; + values[2] = &p; + values[3] = &r; + values[4] = &l; + values[5] = NULL; + + printf("CALLING WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", + o, m, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, l); + + ffi_call(&cif, FFI_FN(doit), &result, values); + + printf ("The result is %d\n", (int)result); + + } + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c new file mode 100644 index 0000000..1aab403 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c @@ -0,0 +1,35 @@ +/* Area: ffi_call + Purpose: Check return value double. + Limitations: none. + PR: none. + Originator: 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static double return_dbl(double dbl) +{ + return 2 * dbl; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double dbl, rdbl; + + args[0] = &ffi_type_double; + values[0] = &dbl; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_double, args) == FFI_OK); + + for (dbl = -127.3; dbl < 127; dbl++) + { + ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); + printf ("%f vs %f\n", rdbl, return_dbl(dbl)); + CHECK(rdbl == 2 * dbl); + } + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c new file mode 100644 index 0000000..0ea5d50 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c @@ -0,0 +1,43 @@ +/* Area: ffi_call + Purpose: Check return value double. + Limitations: none. + PR: none. + Originator: 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static double return_dbl(double dbl1, float fl2, unsigned int in3, double dbl4) +{ + return dbl1 + fl2 + in3 + dbl4; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double dbl1, dbl4, rdbl; + float fl2; + unsigned int in3; + args[0] = &ffi_type_double; + args[1] = &ffi_type_float; + args[2] = &ffi_type_uint; + args[3] = &ffi_type_double; + values[0] = &dbl1; + values[1] = &fl2; + values[2] = &in3; + values[3] = &dbl4; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_double, args) == FFI_OK); + dbl1 = 127.0; + fl2 = 128.0; + in3 = 255; + dbl4 = 512.7; + + ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); + printf ("%f vs %f\n", rdbl, return_dbl(dbl1, fl2, in3, dbl4)); + CHECK(rdbl == dbl1 + fl2 + in3 + dbl4); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c new file mode 100644 index 0000000..b3818f8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c @@ -0,0 +1,42 @@ +/* Area: ffi_call + Purpose: Check return value double. + Limitations: none. + PR: none. + Originator: 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static double return_dbl(double dbl1, double dbl2, unsigned int in3, double dbl4) +{ + return dbl1 + dbl2 + in3 + dbl4; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double dbl1, dbl2, dbl4, rdbl; + unsigned int in3; + args[0] = &ffi_type_double; + args[1] = &ffi_type_double; + args[2] = &ffi_type_uint; + args[3] = &ffi_type_double; + values[0] = &dbl1; + values[1] = &dbl2; + values[2] = &in3; + values[3] = &dbl4; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_double, args) == FFI_OK); + dbl1 = 127.0; + dbl2 = 128.0; + in3 = 255; + dbl4 = 512.7; + + ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); + printf ("%f vs %f\n", rdbl, return_dbl(dbl1, dbl2, in3, dbl4)); + CHECK(rdbl == dbl1 + dbl2 + in3 + dbl4); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c new file mode 100644 index 0000000..fb8a09e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c @@ -0,0 +1,35 @@ +/* Area: ffi_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static float return_fl(float fl) +{ + return 2 * fl; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float fl, rfl; + + args[0] = &ffi_type_float; + values[0] = &fl; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_float, args) == FFI_OK); + + for (fl = -127.0; fl < 127; fl++) + { + ffi_call(&cif, FFI_FN(return_fl), &rfl, values); + printf ("%f vs %f\n", rfl, return_fl(fl)); + CHECK(rfl == 2 * fl); + } + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c new file mode 100644 index 0000000..c3d92c2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c @@ -0,0 +1,36 @@ +/* Area: ffi_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static float return_fl(float fl1, float fl2) +{ + return fl1 + fl2; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float fl1, fl2, rfl; + + args[0] = &ffi_type_float; + args[1] = &ffi_type_float; + values[0] = &fl1; + values[1] = &fl2; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_float, args) == FFI_OK); + fl1 = 127.0; + fl2 = 128.0; + + ffi_call(&cif, FFI_FN(return_fl), &rfl, values); + printf ("%f vs %f\n", rfl, return_fl(fl1, fl2)); + CHECK(rfl == fl1 + fl2); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c new file mode 100644 index 0000000..ddb976c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c @@ -0,0 +1,49 @@ +/* Area: ffi_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +/* Use volatile float to avoid false negative on ix86. See PR target/323. */ +static float return_fl(float fl1, float fl2, float fl3, float fl4) +{ + volatile float sum; + + sum = fl1 + fl2 + fl3 + fl4; + return sum; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float fl1, fl2, fl3, fl4, rfl; + volatile float sum; + + args[0] = &ffi_type_float; + args[1] = &ffi_type_float; + args[2] = &ffi_type_float; + args[3] = &ffi_type_float; + values[0] = &fl1; + values[1] = &fl2; + values[2] = &fl3; + values[3] = &fl4; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_float, args) == FFI_OK); + fl1 = 127.0; + fl2 = 128.0; + fl3 = 255.1; + fl4 = 512.7; + + ffi_call(&cif, FFI_FN(return_fl), &rfl, values); + printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, fl3, fl4)); + + sum = fl1 + fl2 + fl3 + fl4; + CHECK(rfl == sum); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c new file mode 100644 index 0000000..c37877b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c @@ -0,0 +1,42 @@ +/* Area: ffi_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static float return_fl(float fl1, float fl2, unsigned int in3, float fl4) +{ + return fl1 + fl2 + in3 + fl4; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float fl1, fl2, fl4, rfl; + unsigned int in3; + args[0] = &ffi_type_float; + args[1] = &ffi_type_float; + args[2] = &ffi_type_uint; + args[3] = &ffi_type_float; + values[0] = &fl1; + values[1] = &fl2; + values[2] = &in3; + values[3] = &fl4; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_float, args) == FFI_OK); + fl1 = 127.0; + fl2 = 128.0; + in3 = 255; + fl4 = 512.7; + + ffi_call(&cif, FFI_FN(return_fl), &rfl, values); + printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, in3, fl4)); + CHECK(rfl == fl1 + fl2 + in3 + fl4); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c new file mode 100644 index 0000000..5c2fe65 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c @@ -0,0 +1,34 @@ +/* Area: ffi_call + Purpose: Check return value long double. + Limitations: none. + PR: none. + Originator: 20071113 */ + +/* { dg-do run { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ +#include "ffitest.h" + +static long double return_ldl(long double ldl) +{ + return 2*ldl; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + long double ldl, rldl; + + args[0] = &ffi_type_longdouble; + values[0] = &ldl; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_longdouble, args) == FFI_OK); + + for (ldl = -127.0; ldl < 127.0; ldl++) + { + ffi_call(&cif, FFI_FN(return_ldl), &rldl, values); + CHECK(rldl == 2 * ldl); + } + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c new file mode 100644 index 0000000..ea4a1e4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c @@ -0,0 +1,41 @@ +/* Area: ffi_call + Purpose: Check return value long long. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +static long long return_ll(long long ll) +{ + return ll; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + long long rlonglong; + long long ll; + + args[0] = &ffi_type_sint64; + values[0] = ≪ + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_sint64, args) == FFI_OK); + + for (ll = 0LL; ll < 100LL; ll++) + { + ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); + CHECK(rlonglong == ll); + } + + for (ll = 55555555555000LL; ll < 55555555555100LL; ll++) + { + ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); + CHECK(rlonglong == ll); + } + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c new file mode 100644 index 0000000..593e8a3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c @@ -0,0 +1,43 @@ +/* Area: ffi_call + Purpose: Check if long long are passed in the corresponding regs on ppc. + Limitations: none. + PR: 20104. + Originator: 20050222 */ + +/* { dg-do run } */ +/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ +#include "ffitest.h" +static long long return_ll(int ll0, long long ll1, int ll2) +{ + return ll0 + ll1 + ll2; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + long long rlonglong; + long long ll1; + unsigned ll0, ll2; + + args[0] = &ffi_type_sint; + args[1] = &ffi_type_sint64; + args[2] = &ffi_type_sint; + values[0] = &ll0; + values[1] = &ll1; + values[2] = &ll2; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &ffi_type_sint64, args) == FFI_OK); + + ll0 = 11111111; + ll1 = 11111111111000LL; + ll2 = 11111111; + + ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); + printf("res: %" PRIdLL ", %" PRIdLL "\n", rlonglong, ll0 + ll1 + ll2); + /* { dg-output "res: 11111133333222, 11111133333222" } */ + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c new file mode 100644 index 0000000..19608ee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c @@ -0,0 +1,36 @@ +/* Area: ffi_call + Purpose: Check return value signed char. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +static signed char return_sc(signed char sc) +{ + return sc; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + signed char sc; + + args[0] = &ffi_type_schar; + values[0] = ≻ + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_schar, args) == FFI_OK); + + for (sc = (signed char) -127; + sc < (signed char) 127; sc++) + { + ffi_call(&cif, FFI_FN(return_sc), &rint, values); + CHECK(rint == (ffi_arg) sc); + } + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c new file mode 100644 index 0000000..f0fd345 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c @@ -0,0 +1,38 @@ +/* Area: ffi_call + Purpose: Check if long as return type is handled correctly. + Limitations: none. + PR: none. + */ + +/* { dg-do run } */ +#include "ffitest.h" +static long return_sl(long l1, long l2) +{ + return l1 - l2; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg res; + unsigned long l1, l2; + + args[0] = &ffi_type_slong; + args[1] = &ffi_type_slong; + values[0] = &l1; + values[1] = &l2; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_slong, args) == FFI_OK); + + l1 = 1073741823L; + l2 = 1073741824L; + + ffi_call(&cif, FFI_FN(return_sl), &res, values); + printf("res: %ld, %ld\n", (long)res, l1 - l2); + /* { dg-output "res: -1, -1" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c new file mode 100644 index 0000000..07c45de --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c @@ -0,0 +1,38 @@ +/* Area: ffi_call + Purpose: Check return value unsigned char. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +static unsigned char return_uc(unsigned char uc) +{ + return uc; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + + unsigned char uc; + + args[0] = &ffi_type_uchar; + values[0] = &uc; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uchar, args) == FFI_OK); + + for (uc = (unsigned char) '\x00'; + uc < (unsigned char) '\xff'; uc++) + { + ffi_call(&cif, FFI_FN(return_uc), &rint, values); + CHECK(rint == (signed int) uc); + } + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c new file mode 100644 index 0000000..12b266f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c @@ -0,0 +1,38 @@ +/* Area: ffi_call + Purpose: Check if unsigned long as return type is handled correctly. + Limitations: none. + PR: none. + Originator: 20060724 */ + +/* { dg-do run } */ +#include "ffitest.h" +static unsigned long return_ul(unsigned long ul1, unsigned long ul2) +{ + return ul1 + ul2; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg res; + unsigned long ul1, ul2; + + args[0] = &ffi_type_ulong; + args[1] = &ffi_type_ulong; + values[0] = &ul1; + values[1] = &ul2; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_ulong, args) == FFI_OK); + + ul1 = 1073741823L; + ul2 = 1073741824L; + + ffi_call(&cif, FFI_FN(return_ul), &res, values); + printf("res: %lu, %lu\n", (unsigned long)res, ul1 + ul2); + /* { dg-output "res: 2147483647, 2147483647" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c new file mode 100644 index 0000000..23a93b9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c @@ -0,0 +1,145 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure returning with different structure size. + Depending on the ABI. Check bigger struct which overlaps + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/21/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +#include "ffitest.h" + +// 13 FPRs: 104 bytes +// 14 FPRs: 112 bytes + +typedef struct struct_108byte { + double a; + double b; + double c; + double d; + double e; + double f; + double g; + double h; + double i; + double j; + double k; + double l; + double m; + int n; +} struct_108byte; + +struct_108byte cls_struct_108byte_fn( + struct_108byte b0, + struct_108byte b1, + struct_108byte b2, + struct_108byte b3) +{ + struct_108byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + result.e = b0.e + b1.e + b2.e + b3.e; + result.f = b0.f + b1.f + b2.f + b3.f; + result.g = b0.g + b1.g + b2.g + b3.g; + result.h = b0.h + b1.h + b2.h + b3.h; + result.i = b0.i + b1.i + b2.i + b3.i; + result.j = b0.j + b1.j + b2.j + b3.j; + result.k = b0.k + b1.k + b2.k + b3.k; + result.l = b0.l + b1.l + b2.l + b3.l; + result.m = b0.m + b1.m + b2.m + b3.m; + result.n = b0.n + b1.n + b2.n + b3.n; + + printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c, + result.d, result.e, result.f, result.g, result.h, result.i, + result.j, result.k, result.l, result.m, result.n); + + return result; +} + +static void +cls_struct_108byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) +{ + struct_108byte b0, b1, b2, b3; + + b0 = *(struct_108byte*)(args[0]); + b1 = *(struct_108byte*)(args[1]); + b2 = *(struct_108byte*)(args[2]); + b3 = *(struct_108byte*)(args[3]); + + *(struct_108byte*)resp = cls_struct_108byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[15]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct_108byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 7 }; + struct_108byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 4 }; + struct_108byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 3 }; + struct_108byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 2 }; + struct_108byte res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; + cls_struct_fields[8] = &ffi_type_double; + cls_struct_fields[9] = &ffi_type_double; + cls_struct_fields[10] = &ffi_type_double; + cls_struct_fields[11] = &ffi_type_double; + cls_struct_fields[12] = &ffi_type_double; + cls_struct_fields[13] = &ffi_type_sint32; + cls_struct_fields[14] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_108byte_fn), &res_dbl, args_dbl); + /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, + res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_108byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((struct_108byte(*)(struct_108byte, struct_108byte, + struct_108byte, struct_108byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, + res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c new file mode 100644 index 0000000..e2599d2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c @@ -0,0 +1,148 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure returning with different structure size. + Depending on the ABI. Check bigger struct which overlaps + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/21/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +#include "ffitest.h" + +// 13 FPRs: 104 bytes +// 14 FPRs: 112 bytes + +typedef struct struct_116byte { + double a; + double b; + double c; + double d; + double e; + double f; + double g; + double h; + double i; + double j; + double k; + double l; + double m; + double n; + int o; +} struct_116byte; + +struct_116byte cls_struct_116byte_fn( + struct_116byte b0, + struct_116byte b1, + struct_116byte b2, + struct_116byte b3) +{ + struct_116byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + result.e = b0.e + b1.e + b2.e + b3.e; + result.f = b0.f + b1.f + b2.f + b3.f; + result.g = b0.g + b1.g + b2.g + b3.g; + result.h = b0.h + b1.h + b2.h + b3.h; + result.i = b0.i + b1.i + b2.i + b3.i; + result.j = b0.j + b1.j + b2.j + b3.j; + result.k = b0.k + b1.k + b2.k + b3.k; + result.l = b0.l + b1.l + b2.l + b3.l; + result.m = b0.m + b1.m + b2.m + b3.m; + result.n = b0.n + b1.n + b2.n + b3.n; + result.o = b0.o + b1.o + b2.o + b3.o; + + printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c, + result.d, result.e, result.f, result.g, result.h, result.i, + result.j, result.k, result.l, result.m, result.n, result.o); + + return result; +} + +static void +cls_struct_116byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) +{ + struct_116byte b0, b1, b2, b3; + + b0 = *(struct_116byte*)(args[0]); + b1 = *(struct_116byte*)(args[1]); + b2 = *(struct_116byte*)(args[2]); + b3 = *(struct_116byte*)(args[3]); + + *(struct_116byte*)resp = cls_struct_116byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[16]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct_116byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 7 }; + struct_116byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 6.0, 4 }; + struct_116byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 7.0, 3 }; + struct_116byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 8.0, 2 }; + struct_116byte res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; + cls_struct_fields[8] = &ffi_type_double; + cls_struct_fields[9] = &ffi_type_double; + cls_struct_fields[10] = &ffi_type_double; + cls_struct_fields[11] = &ffi_type_double; + cls_struct_fields[12] = &ffi_type_double; + cls_struct_fields[13] = &ffi_type_double; + cls_struct_fields[14] = &ffi_type_sint32; + cls_struct_fields[15] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_116byte_fn), &res_dbl, args_dbl); + /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, + res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_116byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((struct_116byte(*)(struct_116byte, struct_116byte, + struct_116byte, struct_116byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, + res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c new file mode 100644 index 0000000..1fc6a9e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c @@ -0,0 +1,124 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure returning with different structure size. + Depending on the ABI. Check bigger struct which overlaps + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/21/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +#include "ffitest.h" + +typedef struct struct_72byte { + double a; + double b; + double c; + double d; + double e; + double f; + double g; + double h; + double i; +} struct_72byte; + +struct_72byte cls_struct_72byte_fn( + struct_72byte b0, + struct_72byte b1, + struct_72byte b2, + struct_72byte b3) +{ + struct_72byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + result.e = b0.e + b1.e + b2.e + b3.e; + result.f = b0.f + b1.f + b2.f + b3.f; + result.g = b0.g + b1.g + b2.g + b3.g; + result.h = b0.h + b1.h + b2.h + b3.h; + result.i = b0.i + b1.i + b2.i + b3.i; + + printf("%g %g %g %g %g %g %g %g %g\n", result.a, result.b, result.c, + result.d, result.e, result.f, result.g, result.h, result.i); + + return result; +} + +static void +cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) +{ + struct_72byte b0, b1, b2, b3; + + b0 = *(struct_72byte*)(args[0]); + b1 = *(struct_72byte*)(args[1]); + b2 = *(struct_72byte*)(args[2]); + b3 = *(struct_72byte*)(args[3]); + + *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[10]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7.0 }; + struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0 }; + struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3.0 }; + struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2.0 }; + struct_72byte res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; + cls_struct_fields[8] = &ffi_type_double; + cls_struct_fields[9] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl); + /* { dg-output "22 15 17 25 6 13 19 18 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte, + struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c new file mode 100644 index 0000000..cb2f2fb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c @@ -0,0 +1,125 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure returning with different structure size. + Depending on the ABI. Check bigger struct which overlaps + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/21/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ +#include "ffitest.h" + +typedef struct struct_72byte { + double a; + double b; + double c; + double d; + double e; + double f; + double g; + double h; + long long i; +} struct_72byte; + +struct_72byte cls_struct_72byte_fn( + struct_72byte b0, + struct_72byte b1, + struct_72byte b2, + struct_72byte b3) +{ + struct_72byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + result.e = b0.e + b1.e + b2.e + b3.e; + result.f = b0.f + b1.f + b2.f + b3.f; + result.g = b0.g + b1.g + b2.g + b3.g; + result.h = b0.h + b1.h + b2.h + b3.h; + result.i = b0.i + b1.i + b2.i + b3.i; + + printf("%g %g %g %g %g %g %g %g %" PRIdLL "\n", result.a, result.b, result.c, + result.d, result.e, result.f, result.g, result.h, result.i); + + return result; +} + +static void +cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) +{ + struct_72byte b0, b1, b2, b3; + + b0 = *(struct_72byte*)(args[0]); + b1 = *(struct_72byte*)(args[1]); + b2 = *(struct_72byte*)(args[2]); + b3 = *(struct_72byte*)(args[3]); + + *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[10]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7 }; + struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4 }; + struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3 }; + struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2 }; + struct_72byte res_dbl; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; + cls_struct_fields[8] = &ffi_type_sint64; + cls_struct_fields[9] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl); + /* { dg-output "22 15 17 25 6 13 19 18 16" } */ + printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte, + struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */ + printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ + + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c new file mode 100644 index 0000000..3de45de --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c @@ -0,0 +1,44 @@ +/* Area: ffi_call + Purpose: Check strlen function call. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +static size_t my_strlen(char *s) +{ + return (strlen(s)); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + char *s; + + args[0] = &ffi_type_pointer; + values[0] = (void*) &s; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_sint, args) == FFI_OK); + + s = "a"; + ffi_call(&cif, FFI_FN(my_strlen), &rint, values); + CHECK(rint == 1); + + s = "1234567"; + ffi_call(&cif, FFI_FN(my_strlen), &rint, values); + CHECK(rint == 7); + + s = "1234567890123456789012345"; + ffi_call(&cif, FFI_FN(my_strlen), &rint, values); + CHECK(rint == 25); + + exit (0); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c new file mode 100644 index 0000000..6fbcc87 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c @@ -0,0 +1,44 @@ +/* Area: ffi_call + Purpose: Check stdcall strlen call on X86_WIN32 systems. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ + +#include "ffitest.h" + +static size_t __attribute__((stdcall)) my_stdcall_strlen(char *s) +{ + return (strlen(s)); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + char *s; + args[0] = &ffi_type_pointer; + values[0] = (void*) &s; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 1, + &ffi_type_sint, args) == FFI_OK); + + s = "a"; + ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values); + CHECK(rint == 1); + + s = "1234567"; + ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values); + CHECK(rint == 7); + + s = "1234567890123456789012345"; + ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values); + CHECK(rint == 25); + + printf("stdcall strlen tests passed\n"); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c new file mode 100644 index 0000000..ea76c85 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c @@ -0,0 +1,65 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + unsigned char uc; + double d; + unsigned int ui; +} test_structure_1; + +static test_structure_1 struct1(test_structure_1 ts) +{ + ts.uc++; + ts.d--; + ts.ui++; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts1_type; + ffi_type *ts1_type_elements[4]; + ts1_type.size = 0; + ts1_type.alignment = 0; + ts1_type.type = FFI_TYPE_STRUCT; + ts1_type.elements = ts1_type_elements; + ts1_type_elements[0] = &ffi_type_uchar; + ts1_type_elements[1] = &ffi_type_double; + ts1_type_elements[2] = &ffi_type_uint; + ts1_type_elements[3] = NULL; + + test_structure_1 ts1_arg; + /* This is a hack to get a properly aligned result buffer */ + test_structure_1 *ts1_result = + (test_structure_1 *) malloc (sizeof(test_structure_1)); + + args[0] = &ts1_type; + values[0] = &ts1_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ts1_type, args) == FFI_OK); + + ts1_arg.uc = '\x01'; + ts1_arg.d = 3.14159; + ts1_arg.ui = 555; + + ffi_call(&cif, FFI_FN(struct1), ts1_result, values); + + CHECK(ts1_result->ui == 556); + CHECK(ts1_result->d == 3.14159 - 1); + + free (ts1_result); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c new file mode 100644 index 0000000..14bc9fd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c @@ -0,0 +1,67 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + double d1; + double d2; +} test_structure_2; + +static test_structure_2 struct2(test_structure_2 ts) +{ + ts.d1--; + ts.d2--; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + test_structure_2 ts2_arg; + ffi_type ts2_type; + ffi_type *ts2_type_elements[3]; + ts2_type.size = 0; + ts2_type.alignment = 0; + ts2_type.type = FFI_TYPE_STRUCT; + ts2_type.elements = ts2_type_elements; + ts2_type_elements[0] = &ffi_type_double; + ts2_type_elements[1] = &ffi_type_double; + ts2_type_elements[2] = NULL; + + + /* This is a hack to get a properly aligned result buffer */ + test_structure_2 *ts2_result = + (test_structure_2 *) malloc (sizeof(test_structure_2)); + + args[0] = &ts2_type; + values[0] = &ts2_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts2_type, args) == FFI_OK); + + ts2_arg.d1 = 5.55; + ts2_arg.d2 = 6.66; + + printf ("%g\n", ts2_arg.d1); + printf ("%g\n", ts2_arg.d2); + + ffi_call(&cif, FFI_FN(struct2), ts2_result, values); + + printf ("%g\n", ts2_result->d1); + printf ("%g\n", ts2_result->d2); + + CHECK(ts2_result->d1 == 5.55 - 1); + CHECK(ts2_result->d2 == 6.66 - 1); + + free (ts2_result); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c new file mode 100644 index 0000000..e0bb09b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c @@ -0,0 +1,59 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + int si; +} test_structure_3; + +static test_structure_3 struct3(test_structure_3 ts) +{ + ts.si = -(ts.si*2); + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + int compare_value; + ffi_type ts3_type; + ffi_type *ts3_type_elements[2]; + ts3_type.size = 0; + ts3_type.alignment = 0; + ts3_type.type = FFI_TYPE_STRUCT; + ts3_type.elements = ts3_type_elements; + ts3_type_elements[0] = &ffi_type_sint; + ts3_type_elements[1] = NULL; + + test_structure_3 ts3_arg; + test_structure_3 *ts3_result = + (test_structure_3 *) malloc (sizeof(test_structure_3)); + + args[0] = &ts3_type; + values[0] = &ts3_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ts3_type, args) == FFI_OK); + + ts3_arg.si = -123; + compare_value = ts3_arg.si; + + ffi_call(&cif, FFI_FN(struct3), ts3_result, values); + + printf ("%d %d\n", ts3_result->si, -(compare_value*2)); + + CHECK(ts3_result->si == -(compare_value*2)); + + free (ts3_result); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c new file mode 100644 index 0000000..0ad0a83 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c @@ -0,0 +1,63 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + unsigned ui1; + unsigned ui2; + unsigned ui3; +} test_structure_4; + +static test_structure_4 struct4(test_structure_4 ts) +{ + ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts4_type; + ffi_type *ts4_type_elements[4]; + ts4_type.size = 0; + ts4_type.alignment = 0; + ts4_type.type = FFI_TYPE_STRUCT; + test_structure_4 ts4_arg; + ts4_type.elements = ts4_type_elements; + ts4_type_elements[0] = &ffi_type_uint; + ts4_type_elements[1] = &ffi_type_uint; + ts4_type_elements[2] = &ffi_type_uint; + ts4_type_elements[3] = NULL; + + + /* This is a hack to get a properly aligned result buffer */ + test_structure_4 *ts4_result = + (test_structure_4 *) malloc (sizeof(test_structure_4)); + + args[0] = &ts4_type; + values[0] = &ts4_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts4_type, args) == FFI_OK); + + ts4_arg.ui1 = 2; + ts4_arg.ui2 = 3; + ts4_arg.ui3 = 4; + + ffi_call (&cif, FFI_FN(struct4), ts4_result, values); + + CHECK(ts4_result->ui3 == 2U * 3U * 4U); + + + free (ts4_result); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c new file mode 100644 index 0000000..c03cc97 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c @@ -0,0 +1,65 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +typedef struct +{ + char c1; + char c2; +} test_structure_5; + +static test_structure_5 struct5(test_structure_5 ts1, test_structure_5 ts2) +{ + ts1.c1 += ts2.c1; + ts1.c2 -= ts2.c2; + + return ts1; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts5_type; + ffi_type *ts5_type_elements[3]; + ts5_type.size = 0; + ts5_type.alignment = 0; + ts5_type.type = FFI_TYPE_STRUCT; + ts5_type.elements = ts5_type_elements; + ts5_type_elements[0] = &ffi_type_schar; + ts5_type_elements[1] = &ffi_type_schar; + ts5_type_elements[2] = NULL; + + test_structure_5 ts5_arg1, ts5_arg2; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_5 *ts5_result = + (test_structure_5 *) malloc (sizeof(test_structure_5)); + + args[0] = &ts5_type; + args[1] = &ts5_type; + values[0] = &ts5_arg1; + values[1] = &ts5_arg2; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ts5_type, args) == FFI_OK); + + ts5_arg1.c1 = 2; + ts5_arg1.c2 = 6; + ts5_arg2.c1 = 5; + ts5_arg2.c2 = 3; + + ffi_call (&cif, FFI_FN(struct5), ts5_result, values); + + CHECK(ts5_result->c1 == 7); + CHECK(ts5_result->c2 == 3); + + + free (ts5_result); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c new file mode 100644 index 0000000..83db9af --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c @@ -0,0 +1,64 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +typedef struct +{ + float f; + double d; +} test_structure_6; + +static test_structure_6 struct6 (test_structure_6 ts) +{ + ts.f += 1; + ts.d += 1; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts6_type; + ffi_type *ts6_type_elements[3]; + ts6_type.size = 0; + ts6_type.alignment = 0; + ts6_type.type = FFI_TYPE_STRUCT; + ts6_type.elements = ts6_type_elements; + ts6_type_elements[0] = &ffi_type_float; + ts6_type_elements[1] = &ffi_type_double; + ts6_type_elements[2] = NULL; + + + test_structure_6 ts6_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_6 *ts6_result = + (test_structure_6 *) malloc (sizeof(test_structure_6)); + + args[0] = &ts6_type; + values[0] = &ts6_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts6_type, args) == FFI_OK); + + ts6_arg.f = 5.55f; + ts6_arg.d = 6.66; + + printf ("%g\n", ts6_arg.f); + printf ("%g\n", ts6_arg.d); + + ffi_call(&cif, FFI_FN(struct6), ts6_result, values); + + CHECK(ts6_result->f == 5.55f + 1); + CHECK(ts6_result->d == 6.66 + 1); + + free (ts6_result); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c new file mode 100644 index 0000000..58aac4c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c @@ -0,0 +1,74 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +typedef struct +{ + float f1; + float f2; + double d; +} test_structure_7; + +static test_structure_7 struct7 (test_structure_7 ts) +{ + ts.f1 += 1; + ts.f2 += 1; + ts.d += 1; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts7_type; + ffi_type *ts7_type_elements[4]; + ts7_type.size = 0; + ts7_type.alignment = 0; + ts7_type.type = FFI_TYPE_STRUCT; + ts7_type.elements = ts7_type_elements; + ts7_type_elements[0] = &ffi_type_float; + ts7_type_elements[1] = &ffi_type_float; + ts7_type_elements[2] = &ffi_type_double; + ts7_type_elements[3] = NULL; + + + test_structure_7 ts7_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_7 *ts7_result = + (test_structure_7 *) malloc (sizeof(test_structure_7)); + + args[0] = &ts7_type; + values[0] = &ts7_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts7_type, args) == FFI_OK); + + ts7_arg.f1 = 5.55f; + ts7_arg.f2 = 55.5f; + ts7_arg.d = 6.66; + + printf ("%g\n", ts7_arg.f1); + printf ("%g\n", ts7_arg.f2); + printf ("%g\n", ts7_arg.d); + + ffi_call(&cif, FFI_FN(struct7), ts7_result, values); + + printf ("%g\n", ts7_result->f1); + printf ("%g\n", ts7_result->f2); + printf ("%g\n", ts7_result->d); + + CHECK(ts7_result->f1 == 5.55f + 1); + CHECK(ts7_result->f2 == 55.5f + 1); + CHECK(ts7_result->d == 6.66 + 1); + + free (ts7_result); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c new file mode 100644 index 0000000..c773ac7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c @@ -0,0 +1,80 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +typedef struct +{ + float f1; + float f2; + float f3; + float f4; +} test_structure_8; + +static test_structure_8 struct8 (test_structure_8 ts) +{ + ts.f1 += 1; + ts.f2 += 1; + ts.f3 += 1; + ts.f4 += 1; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts8_type; + ffi_type *ts8_type_elements[5]; + ts8_type.size = 0; + ts8_type.alignment = 0; + ts8_type.type = FFI_TYPE_STRUCT; + ts8_type.elements = ts8_type_elements; + ts8_type_elements[0] = &ffi_type_float; + ts8_type_elements[1] = &ffi_type_float; + ts8_type_elements[2] = &ffi_type_float; + ts8_type_elements[3] = &ffi_type_float; + ts8_type_elements[4] = NULL; + + test_structure_8 ts8_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_8 *ts8_result = + (test_structure_8 *) malloc (sizeof(test_structure_8)); + + args[0] = &ts8_type; + values[0] = &ts8_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts8_type, args) == FFI_OK); + + ts8_arg.f1 = 5.55f; + ts8_arg.f2 = 55.5f; + ts8_arg.f3 = -5.55f; + ts8_arg.f4 = -55.5f; + + printf ("%g\n", ts8_arg.f1); + printf ("%g\n", ts8_arg.f2); + printf ("%g\n", ts8_arg.f3); + printf ("%g\n", ts8_arg.f4); + + ffi_call(&cif, FFI_FN(struct8), ts8_result, values); + + printf ("%g\n", ts8_result->f1); + printf ("%g\n", ts8_result->f2); + printf ("%g\n", ts8_result->f3); + printf ("%g\n", ts8_result->f4); + + CHECK(ts8_result->f1 == 5.55f + 1); + CHECK(ts8_result->f2 == 55.5f + 1); + CHECK(ts8_result->f3 == -5.55f + 1); + CHECK(ts8_result->f4 == -55.5f + 1); + + free (ts8_result); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c new file mode 100644 index 0000000..f30091f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c @@ -0,0 +1,67 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + float f; + int i; +} test_structure_9; + +static test_structure_9 struct9 (test_structure_9 ts) +{ + ts.f += 1; + ts.i += 1; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts9_type; + ffi_type *ts9_type_elements[3]; + ts9_type.size = 0; + ts9_type.alignment = 0; + ts9_type.type = FFI_TYPE_STRUCT; + ts9_type.elements = ts9_type_elements; + ts9_type_elements[0] = &ffi_type_float; + ts9_type_elements[1] = &ffi_type_sint; + ts9_type_elements[2] = NULL; + + test_structure_9 ts9_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_9 *ts9_result = + (test_structure_9 *) malloc (sizeof(test_structure_9)); + + args[0] = &ts9_type; + values[0] = &ts9_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts9_type, args) == FFI_OK); + + ts9_arg.f = 5.55f; + ts9_arg.i = 5; + + printf ("%g\n", ts9_arg.f); + printf ("%d\n", ts9_arg.i); + + ffi_call(&cif, FFI_FN(struct9), ts9_result, values); + + printf ("%g\n", ts9_result->f); + printf ("%d\n", ts9_result->i); + + CHECK(ts9_result->f == 5.55f + 1); + CHECK(ts9_result->i == 5 + 1); + + free (ts9_result); + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c new file mode 100644 index 0000000..161cc89 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c @@ -0,0 +1,70 @@ +/* Area: closure_call + Purpose: Check return value float. + Limitations: none. + PR: 41908. + Originator: 20091102 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_combined { + float a; + float b; + float c; + float d; +} cls_struct_combined; + +void cls_struct_combined_fn(struct cls_struct_combined arg) +{ + printf("%g %g %g %g\n", + arg.a, arg.b, + arg.c, arg.d); + fflush(stdout); +} + +static void +cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, + void** args, void* userdata __UNUSED__) +{ + struct cls_struct_combined a0; + + a0 = *(struct cls_struct_combined*)(args[0]); + + cls_struct_combined_fn(a0); +} + + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type* cls_struct_fields0[5]; + ffi_type cls_struct_type0; + ffi_type* dbl_arg_types[5]; + + cls_struct_type0.size = 0; + cls_struct_type0.alignment = 0; + cls_struct_type0.type = FFI_TYPE_STRUCT; + cls_struct_type0.elements = cls_struct_fields0; + + struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0}; + + cls_struct_fields0[0] = &ffi_type_float; + cls_struct_fields0[1] = &ffi_type_float; + cls_struct_fields0[2] = &ffi_type_float; + cls_struct_fields0[3] = &ffi_type_float; + cls_struct_fields0[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type0; + dbl_arg_types[1] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_void, + dbl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); + + ((void(*)(cls_struct_combined)) (code))(g_dbl); + /* { dg-output "4 5 1 8" } */ + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h new file mode 100644 index 0000000..83f5442 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include "fficonfig.h" + +#define MAX_ARGS 256 + + +/* Define __UNUSED__ that also other compilers than gcc can run the tests. */ +#undef __UNUSED__ +#if defined(__GNUC__) +#define __UNUSED__ __attribute__((__unused__)) +#else +#define __UNUSED__ +#endif + +#define CHECK(x) (!(x) ? abort() : (void)0) + +/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a + file open. */ +#ifdef HAVE_MMAP_ANON +# undef HAVE_MMAP_DEV_ZERO + +# include +# ifndef MAP_FAILED +# define MAP_FAILED -1 +# endif +# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) +# define MAP_ANONYMOUS MAP_ANON +# endif +# define USING_MMAP + +#endif + +#ifdef HAVE_MMAP_DEV_ZERO + +# include +# ifndef MAP_FAILED +# define MAP_FAILED -1 +# endif +# define USING_MMAP + +#endif + + +/* MinGW kludge. */ +#ifdef _WIN64 +#define PRIdLL "I64d" +#define PRIuLL "I64u" +#else +#define PRIdLL "lld" +#define PRIuLL "llu" +#endif + +#ifdef USING_MMAP +static inline void * +allocate_mmap (size_t size) +{ + void *page; +#if defined (HAVE_MMAP_DEV_ZERO) + static int dev_zero_fd = -1; +#endif + +#ifdef HAVE_MMAP_DEV_ZERO + if (dev_zero_fd == -1) + { + dev_zero_fd = open ("/dev/zero", O_RDONLY); + if (dev_zero_fd == -1) + { + perror ("open /dev/zero: %m"); + exit (1); + } + } +#endif + + +#ifdef HAVE_MMAP_ANON + page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +#endif +#ifdef HAVE_MMAP_DEV_ZERO + page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE, dev_zero_fd, 0); +#endif + + if (page == (char *) MAP_FAILED) + { + perror ("virtual memory exhausted"); + exit (1); + } + + return page; +} + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/special.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/special.exp new file mode 100644 index 0000000..74671b1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/special.exp @@ -0,0 +1,35 @@ +# Copyright (C) 2003, 2006, 2009, 2010 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 3 of the License, 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; see the file COPYING3. If not see +# . + +dg-init +libffi-init + +global srcdir subdir + +global cxx_options + +set cxx_options " -shared-libgcc -lstdc++" + +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O0 -W -Wall" +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O2" +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O3" +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-Os" + +dg-finish + +# Local Variables: +# tcl-indent-level:4 +# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc new file mode 100644 index 0000000..d7ffd4a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc @@ -0,0 +1,124 @@ +/* Area: ffi_closure, unwind info + Purpose: Check if the unwind information is passed correctly. + Limitations: none. + PR: none. + Originator: Jeff Sturm */ + +/* { dg-do run } */ +#include "ffitestcxx.h" + +#if defined HAVE_STDINT_H +#include +#endif + +#if defined HAVE_INTTYPES_H +#include +#endif + +void +closure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, + void** args __UNUSED__, void* userdata __UNUSED__) +{ + throw 9; +} + +typedef void (*closure_test_type)(); + +void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) + { + *(ffi_arg*)resp = + (int)*(float *)args[0] +(int)(*(float *)args[1]) + + (int)(*(float *)args[2]) + (int)*(float *)args[3] + + (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + + (int)*(float *)args[6] + (int)(*(int *)args[7]) + + (int)(*(double*)args[8]) + (int)*(int *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(int *)args[13]) + + (int)(*(int *)args[14]) + *(int *)args[15] + (int)(intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(float *)args[0], (int)(*(float *)args[1]), + (int)(*(float *)args[2]), (int)*(float *)args[3], + (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), + (int)*(float *)args[6], (int)(*(int *)args[7]), + (int)(*(double *)args[8]), (int)*(int *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(int *)args[13]), + (int)(*(int *)args[14]), *(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg*)resp); + + throw (int)*(ffi_arg*)resp; +} + +typedef int (*closure_test_type1)(float, float, float, float, signed short, + float, float, int, double, int, int, float, + int, int, int, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = (ffi_closure *)ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + + { + cl_arg_types[1] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, + &ffi_type_void, cl_arg_types) == FFI_OK); + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn, NULL, code) == FFI_OK); + + try + { + (*((closure_test_type)(code)))(); + } catch (int exception_code) + { + CHECK(exception_code == 9); + } + + printf("part one OK\n"); + /* { dg-output "part one OK" } */ + } + + { + + cl_arg_types[0] = &ffi_type_float; + cl_arg_types[1] = &ffi_type_float; + cl_arg_types[2] = &ffi_type_float; + cl_arg_types[3] = &ffi_type_float; + cl_arg_types[4] = &ffi_type_sshort; + cl_arg_types[5] = &ffi_type_float; + cl_arg_types[6] = &ffi_type_float; + cl_arg_types[7] = &ffi_type_uint; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_uint; + cl_arg_types[10] = &ffi_type_uint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_uint; + cl_arg_types[13] = &ffi_type_uint; + cl_arg_types[14] = &ffi_type_uint; + cl_arg_types[15] = &ffi_type_uint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, + (void *) 3 /* userdata */, code) == FFI_OK); + try + { + (*((closure_test_type1)code)) + (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, + 19, 21, 1); + /* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ + } catch (int exception_code) + { + CHECK(exception_code == 255); + } + printf("part two OK\n"); + /* { dg-output "\npart two OK" } */ + } + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc new file mode 100644 index 0000000..29739cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc @@ -0,0 +1,53 @@ +/* Area: ffi_call, unwind info + Purpose: Check if the unwind information is passed correctly. + Limitations: none. + PR: none. + Originator: Andreas Tobler 20061213 */ + +/* { dg-do run } */ +#include "ffitestcxx.h" + +static int checking(int a __UNUSED__, short b __UNUSED__, + signed char c __UNUSED__) +{ + throw 9; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + + signed int si; + signed short ss; + signed char sc; + + args[0] = &ffi_type_sint; + values[0] = &si; + args[1] = &ffi_type_sshort; + values[1] = &ss; + args[2] = &ffi_type_schar; + values[2] = ≻ + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &ffi_type_sint, args) == FFI_OK); + + si = -6; + ss = -12; + sc = -1; + { + try + { + ffi_call(&cif, FFI_FN(checking), &rint, values); + } catch (int exception_code) + { + CHECK(exception_code == 9); + } + printf("part one OK\n"); + /* { dg-output "part one OK" } */ + } + exit(0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/texinfo.tex b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/texinfo.tex new file mode 100644 index 0000000..ff2c406 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/libffi/texinfo.tex @@ -0,0 +1,7210 @@ +% texinfo.tex -- TeX macros to handle Texinfo files. +% +% Load plain if necessary, i.e., if running under initex. +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi +% +\def\texinfoversion{2005-07-05.19} +% +% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software +% Foundation, Inc. +% +% This texinfo.tex file 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 texinfo.tex file 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 texinfo.tex file; see the file COPYING. If not, write +% to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +% Boston, MA 02110-1301, USA. +% +% As a special exception, when this file is read by TeX when processing +% a Texinfo source document, you may use the result without +% restriction. (This has been our intent since Texinfo was invented.) +% +% Please try the latest version of texinfo.tex before submitting bug +% reports; you can get the latest version from: +% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or +% ftp://tug.org/tex/texinfo.tex +% (and all CTAN mirrors, see http://www.ctan.org). +% The texinfo.tex in any given distribution could well be out +% of date, so if that's what you're using, please check. +% +% Send bug reports to bug-texinfo@gnu.org. Please include including a +% complete document in each bug report with which we can reproduce the +% problem. Patches are, of course, greatly appreciated. +% +% To process a Texinfo manual with TeX, it's most reliable to use the +% texi2dvi shell script that comes with the distribution. For a simple +% manual foo.texi, however, you can get away with this: +% tex foo.texi +% texindex foo.?? +% tex foo.texi +% tex foo.texi +% dvips foo.dvi -o # or whatever; this makes foo.ps. +% The extra TeX runs get the cross-reference information correct. +% Sometimes one run after texindex suffices, and sometimes you need more +% than two; texi2dvi does it as many times as necessary. +% +% It is possible to adapt texinfo.tex for other languages, to some +% extent. You can get the existing language-specific files from the +% full Texinfo distribution. +% +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. + + +\message{Loading texinfo [version \texinfoversion]:} + +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}% + \catcode`+=\active \catcode`\_=\active} + +\message{Basics,} +\chardef\other=12 + +% We never want plain's \outer definition of \+ in Texinfo. +% For @tex, we can use \tabalign. +\let\+ = \relax + +% Save some plain tex macros whose names we will redefine. +\let\ptexb=\b +\let\ptexbullet=\bullet +\let\ptexc=\c +\let\ptexcomma=\, +\let\ptexdot=\. +\let\ptexdots=\dots +\let\ptexend=\end +\let\ptexequiv=\equiv +\let\ptexexclam=\! +\let\ptexfootnote=\footnote +\let\ptexgtr=> +\let\ptexhat=^ +\let\ptexi=\i +\let\ptexindent=\indent +\let\ptexinsert=\insert +\let\ptexlbrace=\{ +\let\ptexless=< +\let\ptexnewwrite\newwrite +\let\ptexnoindent=\noindent +\let\ptexplus=+ +\let\ptexrbrace=\} +\let\ptexslash=\/ +\let\ptexstar=\* +\let\ptext=\t + +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\thisisundefined + \let\linenumber = \empty % Pre-3.0. +\else + \def\linenumber{l.\the\inputlineno:\space} +\fi + +% Set up fixed words for English if not already set. +\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi +\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi +\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi +\ifx\putwordin\undefined \gdef\putwordin{in}\fi +\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi +\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi +\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi +\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi +\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi +\ifx\putwordof\undefined \gdef\putwordof{of}\fi +\ifx\putwordon\undefined \gdef\putwordon{on}\fi +\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi +\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi +\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi +\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi +\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi +\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi +\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi +% +\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi +\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi +\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi +\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi +\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi +\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi +\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi +\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi +\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi +\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi +\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi +\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi +% +\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi +\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi +\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi +\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi +\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi + +% In some macros, we cannot use the `\? notation---the left quote is +% in some cases the escape char. +\chardef\backChar = `\\ +\chardef\colonChar = `\: +\chardef\commaChar = `\, +\chardef\dotChar = `\. +\chardef\exclamChar= `\! +\chardef\plusChar = `\+ +\chardef\questChar = `\? +\chardef\semiChar = `\; +\chardef\underChar = `\_ + +\chardef\spaceChar = `\ % +\chardef\spacecat = 10 +\def\spaceisspace{\catcode\spaceChar=\spacecat} + +{% for help with debugging. + % example usage: \expandafter\show\activebackslash + \catcode`\! = 0 \catcode`\\ = \active + !global!def!activebackslash{\} +} + +% Ignore a token. +% +\def\gobble#1{} + +% The following is used inside several \edef's. +\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} + +% Hyphenation fixes. +\hyphenation{ + Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script + ap-pen-dix bit-map bit-maps + data-base data-bases eshell fall-ing half-way long-est man-u-script + man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm + par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces + spell-ing spell-ings + stand-alone strong-est time-stamp time-stamps which-ever white-space + wide-spread wrap-around +} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen\bindingoffset +\newdimen\normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% For a final copy, take out the rectangles +% that mark overfull boxes (in case you have decided +% that the text looks ok even though it passes the margin). +% +\def\finalout{\overfullrule=0pt} + +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + +% Sometimes it is convenient to have everything in the transcript file +% and nothing on the terminal. We don't just call \tracingall here, +% since that produces some useless output on the terminal. We also make +% some effort to order the tracing commands to reduce output in the log +% file; cf. trace.sty in LaTeX. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{% + \tracingstats2 + \tracingpages1 + \tracinglostchars2 % 2 gives us more in etex + \tracingparagraphs1 + \tracingoutput1 + \tracingmacros2 + \tracingrestores1 + \showboxbreadth\maxdimen \showboxdepth\maxdimen + \ifx\eTeXversion\undefined\else % etex gives us more logging + \tracingscantokens1 + \tracingifs1 + \tracinggroups1 + \tracingnesting2 + \tracingassigns1 + \fi + \tracingcommands3 % 3 gives us more in etex + \errorcontextlines16 +}% + +% add check for \lastpenalty to plain's definitions. If the last thing +% we did was a \nobreak, we don't want to insert more space. +% +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi\fi} +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi\fi} +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi\fi} + +% For @cropmarks command. +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=1pc +\newdimen\cornerthick \cornerthick=.3pt +\newdimen\topandbottommargin \topandbottommargin=.75in + +% Main output routine. +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions, but you have to call it yourself. +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). + \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \indexdummies % don't expand commands in the output. + \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi + % + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingxxx.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 2\baselineskip + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + }% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \indexdummies + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi +\dimen@=\dp#1 \unvbox#1 +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Parse an argument, then pass it to #1. The argument is the rest of +% the input line (except we remove a trailing comment). #1 should be a +% macro which expects an ordinary undelimited TeX argument. +% +\def\parsearg{\parseargusing{}} +\def\parseargusing#1#2{% + \def\next{#2}% + \begingroup + \obeylines + \spaceisspace + #1% + \parseargline\empty% Insert the \empty token, see \finishparsearg below. +} + +{\obeylines % + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + \argremovecomment #1\comment\ArgTerm% + }% +} + +% First remove any @comment, then any @c comment. +\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} +\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} + +% Each occurence of `\^^M' or `\^^M' is replaced by a single space. +% +% \argremovec might leave us with trailing space, e.g., +% @end itemize @c foo +% This space token undergoes the same procedure and is eventually removed +% by \finishparsearg. +% +\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} +\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} +\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% + \def\temp{#3}% + \ifx\temp\empty + % We cannot use \next here, as it holds the macro to run; + % thus we reuse \temp. + \let\temp\finishparsearg + \else + \let\temp\argcheckspaces + \fi + % Put the space token in: + \temp#1 #3\ArgTerm +} + +% If a _delimited_ argument is enclosed in braces, they get stripped; so +% to get _exactly_ the rest of the line, we had to prevent such situation. +% We prepended an \empty token at the very beginning and we expand it now, +% just before passing the control to \next. +% (Similarily, we have to think about #3 of \argcheckspacesY above: it is +% either the null string, or it ends with \^^M---thus there is no danger +% that a pair of braces would be stripped. +% +% But first, we have to remove the trailing space token. +% +\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}} + +% \parseargdef\foo{...} +% is roughly equivalent to +% \def\foo{\parsearg\Xfoo} +% \def\Xfoo#1{...} +% +% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my +% favourite TeX trick. --kasal, 16nov03 + +\def\parseargdef#1{% + \expandafter \doparseargdef \csname\string#1\endcsname #1% +} +\def\doparseargdef#1#2{% + \def#2{\parsearg#1}% + \def#1##1% +} + +% Several utility definitions with active space: +{ + \obeyspaces + \gdef\obeyedspace{ } + + % Make each space character in the input produce a normal interword + % space in the output. Don't allow a line break at this space, as this + % is used only in environments like @example, where each line of input + % should produce a line of output anyway. + % + \gdef\sepspaces{\obeyspaces\let =\tie} + + % If an index command is used in an @example environment, any spaces + % therein should become regular spaces in the raw index file, not the + % expansion of \tie (\leavevmode \penalty \@M \ ). + \gdef\unsepspaces{\let =\space} +} + + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +% Define the framework for environments in texinfo.tex. It's used like this: +% +% \envdef\foo{...} +% \def\Efoo{...} +% +% It's the responsibility of \envdef to insert \begingroup before the +% actual body; @end closes the group after calling \Efoo. \envdef also +% defines \thisenv, so the current environment is known; @end checks +% whether the environment name matches. The \checkenv macro can also be +% used to check whether the current environment is the one expected. +% +% Non-false conditionals (@iftex, @ifset) don't fit into this, so they +% are not treated as enviroments; they don't open a group. (The +% implementation of @end takes care not to call \endgroup in this +% special case.) + + +% At runtime, environments start with this: +\def\startenvironment#1{\begingroup\def\thisenv{#1}} +% initialize +\let\thisenv\empty + +% ... but they get defined via ``\envdef\foo{...}'': +\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} + +% Check whether we're in the right environment: +\def\checkenv#1{% + \def\temp{#1}% + \ifx\thisenv\temp + \else + \badenverr + \fi +} + +% Evironment mismatch, #1 expected: +\def\badenverr{% + \errhelp = \EMsimple + \errmessage{This command can appear only \inenvironment\temp, + not \inenvironment\thisenv}% +} +\def\inenvironment#1{% + \ifx#1\empty + out of any environment% + \else + in environment \expandafter\string#1% + \fi +} + +% @end foo executes the definition of \Efoo. +% But first, it executes a specialized version of \checkenv +% +\parseargdef\end{% + \if 1\csname iscond.#1\endcsname + \else + % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 + \expandafter\checkenv\csname#1\endcsname + \csname E#1\endcsname + \endgroup + \fi +} + +\newhelp\EMsimple{Press RETURN to continue.} + + +%% Simple single-character @ commands + +% @@ prints an @ +% Kludge this until the fonts are right (grr). +\def\@{{\tt\char64}} + +% This is turned off because it was never documented +% and you can use @w{...} around a quote to suppress ligatures. +%% Define @` and @' to be the same as ` and ' +%% but suppressing ligatures. +%\def\`{{`}} +%\def\'{{'}} + +% Used to generate quoted braces. +\def\mylbrace {{\tt\char123}} +\def\myrbrace {{\tt\char125}} +\let\{=\mylbrace +\let\}=\myrbrace +\begingroup + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux/toc files. + \catcode`\{ = \other \catcode`\} = \other + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\! = 0 \catcode`\\ = \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% @comma{} to avoid , parsing problems. +\let\comma = , + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \c +\let\dotaccent = \. +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \t +\let\ubaraccent = \b +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ptexi + \else\ifx\temp\jmacro \j + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} + +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence. (Idea found in latex.) +% +\edef\TeX{\TeX \spacefactor=1000 } + +% @LaTeX{} logo. Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). +% +\def\LaTeX{% + L\kern-.36em + {\setbox0=\hbox{T}% + \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% + \kern-.15em + \TeX +} + +% Be sure we're in horizontal mode when doing a tie, since we make space +% equivalent to this in @example-like environments. Otherwise, a space +% at the beginning of a line will start with \penalty -- and +% since \penalty is valid in vertical mode, we'd end up putting the +% penalty on the vertical list instead of in the new paragraph. +{\catcode`@ = 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty = \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} + +% @: forces normal size whitespace following. +\def\:{\spacefactor=1000 } + +% @* forces a line break. +\def\*{\hfil\break\hbox{}\ignorespaces} + +% @/ allows a line break. +\let\/=\allowbreak + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=\endofsentencespacefactor\space} + +% @! is an end-of-sentence bang. +\def\!{!\spacefactor=\endofsentencespacefactor\space} + +% @? is an end-of-sentence query. +\def\?{?\spacefactor=\endofsentencespacefactor\space} + +% @frenchspacing on|off says whether to put extra space after punctuation. +% +\def\onword{on} +\def\offword{off} +% +\parseargdef\frenchspacing{% + \def\temp{#1}% + \ifx\temp\onword \plainfrenchspacing + \else\ifx\temp\offword \plainnonfrenchspacing + \else + \errhelp = \EMsimple + \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% + \fi\fi +} + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +% Another complication is that the group might be very large. This can +% cause the glue on the previous page to be unduly stretched, because it +% does not have much material. In this case, it's better to add an +% explicit \vfill so that the extra space is at the bottom. The +% threshold for doing this is if the group is more than \vfilllimit +% percent of a page (\vfilllimit can be changed inside of @tex). +% +\newbox\groupbox +\def\vfilllimit{0.7} +% +\envdef\group{% + \ifnum\catcode`\^^M=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + \startsavinginserts + % + \setbox\groupbox = \vtop\bgroup + % Do @comment since we are called inside an environment such as + % @example, where each end-of-line in the input causes an + % end-of-line in the output. We don't want the end-of-line after + % the `@group' to put extra space in the output. Since @group + % should appear on a line by itself (according to the Texinfo + % manual), we don't worry about eating any user text. + \comment +} +% +% The \vtop produces a box with normal height and large depth; thus, TeX puts +% \baselineskip glue before it, and (when the next line of text is done) +% \lineskip glue after it. Thus, space below is not quite equal to space +% above. But it's pretty close. +\def\Egroup{% + % To get correct interline space between the last line of the group + % and the first line afterwards, we have to propagate \prevdepth. + \endgraf % Not \par, as it may have been set to \lisppar. + \global\dimen1 = \prevdepth + \egroup % End the \vtop. + % \dimen0 is the vertical size of the group's box. + \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox + % \dimen2 is how much space is left on the page (more or less). + \dimen2 = \pageheight \advance\dimen2 by -\pagetotal + % if the group doesn't fit on the current page, and it's a big big + % group, force a page break. + \ifdim \dimen0 > \dimen2 + \ifdim \pagetotal < \vfilllimit\pageheight + \page + \fi + \fi + \box\groupbox + \prevdepth = \dimen1 + \checkinserts +} +% +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help +% message, so this ends up printing `@group can only ...'. +% +\newhelp\groupinvalidhelp{% +group can only be used in environments such as @example,^^J% +where each line of input produces a line of output.} + +% @need space-in-mils +% forces a page break if there is not space-in-mils remaining. + +\newdimen\mil \mil=0.001in + +% Old definition--didn't work. +%\parseargdef\need{\par % +%% This method tries to make TeX break the page naturally +%% if the depth of the box does not fit. +%{\baselineskip=0pt% +%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak +%\prevdepth=-1000pt +%}} + +\parseargdef\need{% + % Ensure vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % If the @need value is less than one line space, it's useless. + \dimen0 = #1\mil + \dimen2 = \ht\strutbox + \advance\dimen2 by \dp\strutbox + \ifdim\dimen0 > \dimen2 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak + \fi +} + +% @br forces paragraph break (and is undocumented). + +\let\br = \par + +% @page forces the start of a new page. +% +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount + +% This defn is used inside fill environments such as @defun. +\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} + +% This defn is used inside nofill environments such as @example. +\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount + \leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. +% +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} + +% @include file insert text of that file as input. +% +\def\include{\parseargusing\filenamecatcodes\includezzz} +\def\includezzz#1{% + \pushthisfilestack + \def\thisfile{#1}% + {% + \makevalueexpandable + \def\temp{\input #1 }% + \expandafter + }\temp + \popthisfilestack +} +\def\filenamecatcodes{% + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \catcode`-=\other +} + +\def\pushthisfilestack{% + \expandafter\pushthisfilestackX\popthisfilestack\StackTerm +} +\def\pushthisfilestackX{% + \expandafter\pushthisfilestackY\thisfile\StackTerm +} +\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% + \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% +} + +\def\popthisfilestack{\errthisfilestackempty} +\def\errthisfilestackempty{\errmessage{Internal error: + the stack of filenames is empty.}} + +\def\thisfile{} + +% @center line +% outputs that line, centered. +% +\parseargdef\center{% + \ifhmode + \let\next\centerH + \else + \let\next\centerV + \fi + \next{\hfil \ignorespaces#1\unskip \hfil}% +} +\def\centerH#1{% + {% + \hfil\break + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{#1}% + \break + }% +} +\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} + +% @sp n outputs n lines of vertical space + +\parseargdef\sp{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment + +\def\comment{\begingroup \catcode`\^^M=\other% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% +\commentxxx} +{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} + +\let\c=\comment + +% @paragraphindent NCHARS +% We'll use ems for NCHARS, close enough. +% NCHARS can also be the word `asis' or `none'. +% We cannot feasibly implement @paragraphindent asis, though. +% +\def\asisword{asis} % no translation, these are keywords +\def\noneword{none} +% +\parseargdef\paragraphindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \defaultparindent = 0pt + \else + \defaultparindent = #1em + \fi + \fi + \parindent = \defaultparindent +} + +% @exampleindent NCHARS +% We'll use ems for NCHARS like @paragraphindent. +% It seems @exampleindent asis isn't necessary, but +% I preserve it to make it similar to @paragraphindent. +\parseargdef\exampleindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \lispnarrowing = 0pt + \else + \lispnarrowing = #1em + \fi + \fi +} + +% @firstparagraphindent WORD +% If WORD is `none', then suppress indentation of the first paragraph +% after a section heading. If WORD is `insert', then do indent at such +% paragraphs. +% +% The paragraph indentation is suppressed or not by calling +% \suppressfirstparagraphindent, which the sectioning commands do. +% We switch the definition of this back and forth according to WORD. +% By default, we suppress indentation. +% +\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} +\def\insertword{insert} +% +\parseargdef\firstparagraphindent{% + \def\temp{#1}% + \ifx\temp\noneword + \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent + \else\ifx\temp\insertword + \let\suppressfirstparagraphindent = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @firstparagraphindent option `\temp'}% + \fi\fi +} + +% Here is how we actually suppress indentation. Redefine \everypar to +% \kern backwards by \parindent, and then reset itself to empty. +% +% We also make \indent itself not actually do anything until the next +% paragraph. +% +\gdef\dosuppressfirstparagraphindent{% + \gdef\indent{% + \restorefirstparagraphindent + \indent + }% + \gdef\noindent{% + \restorefirstparagraphindent + \noindent + }% + \global\everypar = {% + \kern -\parindent + \restorefirstparagraphindent + }% +} + +\gdef\restorefirstparagraphindent{% + \global \let \indent = \ptexindent + \global \let \noindent = \ptexnoindent + \global \everypar = {}% +} + + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ + \catcode\underChar = \active + \gdef\mathunderscore{% + \catcode\underChar=\active + \def_{\ifnum\fam=\slfam \_\else\sb\fi}% + } +} +% Another complication: we want \\ (and @\) to output a \ character. +% FYI, plain.tex uses \\ as a temporary control sequence (why?), but +% this is not advertised and we don't care. Texinfo does not +% otherwise define @\. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \tex + \mathunderscore + \let\\ = \mathbackslash + \mathactive + $\finishmath +} +\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an argument +% to a command which sets the catcodes (such as @item or @section). +% +{ + \catcode`^ = \active + \catcode`< = \active + \catcode`> = \active + \catcode`+ = \active + \gdef\mathactive{% + \let^ = \ptexhat + \let< = \ptexless + \let> = \ptexgtr + \let+ = \ptexplus + } +} + +% @bullet and @minus need the same treatment as @math, just above. +\def\bullet{$\ptexbullet$} +\def\minus{$-$} + +% @dots{} outputs an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in a typewriter +% font as three actual period characters. +% +\def\dots{% + \leavevmode + \hbox to 1.5em{% + \hskip 0pt plus 0.25fil + .\hfil.\hfil.% + \hskip 0pt plus 0.5fil + }% +} + +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \dots + \spacefactor=\endofsentencespacefactor +} + +% @comma{} is so commas can be inserted into text without messing up +% Texinfo's parsing. +% +\let\comma = , + +% @refill is a no-op. +\let\refill=\relax + +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test runs. +% This is done with @novalidate (before @setfilename). +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% @setfilename is done at the beginning of every texinfo file. +% So open here the files we need to have open while reading the input. +% This makes it possible to make a .fmt file for texinfo. +\def\setfilename{% + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \iflinks + \tryauxfile + % Open the new aux file. TeX will close it automatically at exit. + \immediate\openout\auxfile=\jobname.aux + \fi % \openindices needs to do some work in any case. + \openindices + \let\setfilename=\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + \openin 1 texinfo.cnf + \ifeof 1 \else \input texinfo.cnf \fi + \closein 1 + % + \comment % Ignore the actual filename. +} + +% Called from \setfilename. +% +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% @bye. +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + + +\message{pdf,} +% adobe `portable' document format +\newcount\tempnum +\newcount\lnkcount +\newtoks\filename +\newcount\filenamelength +\newcount\pgn +\newtoks\toksA +\newtoks\toksB +\newtoks\toksC +\newtoks\toksD +\newbox\boxA +\newcount\countA +\newif\ifpdf +\newif\ifpdfmakepagedest + +% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 +% can be set). So we test for \relax and 0 as well as \undefined, +% borrowed from ifpdf.sty. +\ifx\pdfoutput\undefined +\else + \ifx\pdfoutput\relax + \else + \ifcase\pdfoutput + \else + \pdftrue + \fi + \fi +\fi + +% PDF uses PostScript string constants for the names of xref targets, to +% for display in the outlines, and in other places. Thus, we have to +% double any backslashes. Otherwise, a name like "\node" will be +% interpreted as a newline (\n), followed by o, d, e. Not good. +% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html +% (and related messages, the final outcome is that it is up to the TeX +% user to double the backslashes and otherwise make the string valid, so +% that's we do). + +% double active backslashes. +% +{\catcode`\@=0 \catcode`\\=\active + @gdef@activebackslash{@catcode`@\=@active @otherbackslash} + @gdef@activebackslashdouble{% + @catcode@backChar=@active + @let\=@doublebackslash} +} + +% To handle parens, we must adopt a different approach, since parens are +% not active characters. hyperref.dtx (which has the same problem as +% us) handles it with this amazing macro to replace tokens. I've +% tinkered with it a little for texinfo, but it's definitely from there. +% +% #1 is the tokens to replace. +% #2 is the replacement. +% #3 is the control sequence with the string. +% +\def\HyPsdSubst#1#2#3{% + \def\HyPsdReplace##1#1##2\END{% + ##1% + \ifx\\##2\\% + \else + #2% + \HyReturnAfterFi{% + \HyPsdReplace##2\END + }% + \fi + }% + \xdef#3{\expandafter\HyPsdReplace#3#1\END}% +} +\long\def\HyReturnAfterFi#1\fi{\fi#1} + +% #1 is a control sequence in which to do the replacements. +\def\backslashparens#1{% + \xdef#1{#1}% redefine it as its expansion; the definition is simply + % \lastnode when called from \setref -> \pdfmkdest. + \HyPsdSubst{(}{\backslashlparen}{#1}% + \HyPsdSubst{)}{\backslashrparen}{#1}% +} + +{\catcode\exclamChar = 0 \catcode\backChar = \other + !gdef!backslashlparen{\(}% + !gdef!backslashrparen{\)}% +} + +\ifpdf + \input pdfcolor + \pdfcatalog{/PageMode /UseOutlines}% + \def\dopdfimage#1#2#3{% + \def\imagewidth{#2}% + \def\imageheight{#3}% + % without \immediate, pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifx\empty\imagewidth\else width \imagewidth \fi + \ifx\empty\imageheight\else height \imageheight \fi + \ifnum\pdftexversion<13 + #1.pdf% + \else + {#1.pdf}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + \def\pdfmkdest#1{{% + % We have to set dummies so commands such as @code, and characters + % such as \, aren't expanded when present in a section title. + \atdummies + \activebackslashdouble + \def\pdfdestname{#1}% + \backslashparens\pdfdestname + \pdfdest name{\pdfdestname} xyz% + }}% + % + % used to mark target names; must be expandable. + \def\pdfmkpgn#1{#1}% + % + \let\linkcolor = \Blue % was Cyan, but that seems light? + \def\endlink{\Black\pdfendlink} + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by 1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + % + % #1 is the section text, which is what will be displayed in the + % outline by the pdf viewer. #2 is the pdf expression for the number + % of subentries (or empty, for subsubsections). #3 is the node text, + % which might be empty if this toc entry had no corresponding node. + % #4 is the page number + % + \def\dopdfoutline#1#2#3#4{% + % Generate a link to the node text if that exists; else, use the + % page number. We could generate a destination for the section + % text in the case where a section has no node, but it doesn't + % seem worth the trouble, since most documents are normally structured. + \def\pdfoutlinedest{#3}% + \ifx\pdfoutlinedest\empty + \def\pdfoutlinedest{#4}% + \else + % Doubled backslashes in the name. + {\activebackslashdouble \xdef\pdfoutlinedest{#3}% + \backslashparens\pdfoutlinedest}% + \fi + % + % Also double the backslashes in the display string. + {\activebackslashdouble \xdef\pdfoutlinetext{#1}% + \backslashparens\pdfoutlinetext}% + % + \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% + } + % + \def\pdfmakeoutlines{% + \begingroup + % Thanh's hack / proper braces in bookmarks + \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace + \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace + % + % Read toc silently, to get counts of subentries for \pdfoutline. + \def\numchapentry##1##2##3##4{% + \def\thischapnum{##2}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + }% + \def\numsecentry##1##2##3##4{% + \advancenumber{chap\thischapnum}% + \def\thissecnum{##2}% + \def\thissubsecnum{0}% + }% + \def\numsubsecentry##1##2##3##4{% + \advancenumber{sec\thissecnum}% + \def\thissubsecnum{##2}% + }% + \def\numsubsubsecentry##1##2##3##4{% + \advancenumber{subsec\thissubsecnum}% + }% + \def\thischapnum{0}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + % + % use \def rather than \let here because we redefine \chapentry et + % al. a second time, below. + \def\appentry{\numchapentry}% + \def\appsecentry{\numsecentry}% + \def\appsubsecentry{\numsubsecentry}% + \def\appsubsubsecentry{\numsubsubsecentry}% + \def\unnchapentry{\numchapentry}% + \def\unnsecentry{\numsecentry}% + \def\unnsubsecentry{\numsubsecentry}% + \def\unnsubsubsecentry{\numsubsubsecentry}% + \readdatafile{toc}% + % + % Read toc second time, this time actually producing the outlines. + % The `-' means take the \expnumber as the absolute number of + % subentries, which we calculated on our first read of the .toc above. + % + % We use the node names as the destinations. + \def\numchapentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% + \def\numsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% + \def\numsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% + \def\numsubsubsecentry##1##2##3##4{% count is always zero + \dopdfoutline{##1}{}{##3}{##4}}% + % + % PDF outlines are displayed using system fonts, instead of + % document fonts. Therefore we cannot use special characters, + % since the encoding is unknown. For example, the eogonek from + % Latin 2 (0xea) gets translated to a | character. Info from + % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. + % + % xx to do this right, we have to translate 8-bit characters to + % their "best" equivalent, based on the @documentencoding. Right + % now, I guess we'll just let the pdf reader have its way. + \indexnofonts + \setupdatafile + \activebackslash + \input \jobname.toc + \endgroup + } + % + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \ifx\p\space\else\addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \fi + \nextsp} + \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + \def\pdfurl#1{% + \begingroup + \normalturnoffactive\def\@{@}% + \makevalueexpandable + \leavevmode\Red + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + \endgroup} + \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS|\relax + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \linkcolor #1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\else + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\linkcolor = \relax + \let\pdfmakeoutlines = \relax +\fi % \ifx\pdfoutput + + +\message{fonts,} + +% Change the current font style to #1, remembering it in \curfontstyle. +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in +% italics, not bold italics. +% +\def\setfontstyle#1{% + \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. + \csname ten#1\endcsname % change the current font +} + +% Select #1 fonts with the current style. +% +\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} + +\def\rm{\fam=0 \setfontstyle{rm}} +\def\it{\fam=\itfam \setfontstyle{it}} +\def\sl{\fam=\slfam \setfontstyle{sl}} +\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} +\def\tt{\fam=\ttfam \setfontstyle{tt}} + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf. +\newfam\sffam +\def\sf{\fam=\sffam \setfontstyle{sf}} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this font style. +\def\ttsl{\setfontstyle{ttsl}} + +% Default leading. +\newdimen\textleading \textleading = 13.2pt + +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +\def\setleading#1{% + \normalbaselineskip = #1\relax + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% Set the font macro #1 to the font named #2, adding on the +% specified font prefix (normally `cm'). +% #3 is the font's design size, #4 is a scale factor +\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\undefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} %where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +% Text fonts (11.2pt, magstep1). +\def\textnominalsize{11pt} +\edef\mainmagstep{\magstephalf} +\setfont\textrm\rmshape{10}{\mainmagstep} +\setfont\texttt\ttshape{10}{\mainmagstep} +\setfont\textbf\bfshape{10}{\mainmagstep} +\setfont\textit\itshape{10}{\mainmagstep} +\setfont\textsl\slshape{10}{\mainmagstep} +\setfont\textsf\sfshape{10}{\mainmagstep} +\setfont\textsc\scshape{10}{\mainmagstep} +\setfont\textttsl\ttslshape{10}{\mainmagstep} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstep1} +\setfont\deftt\ttshape{10}{\magstep1} +\setfont\defttsl\ttslshape{10}{\magstep1} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000} +\setfont\smalltt\ttshape{9}{1000} +\setfont\smallbf\bfshape{10}{900} +\setfont\smallit\itshape{9}{1000} +\setfont\smallsl\slshape{9}{1000} +\setfont\smallsf\sfshape{9}{1000} +\setfont\smallsc\scshape{10}{900} +\setfont\smallttsl\ttslshape{10}{900} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000} +\setfont\smallertt\ttshape{8}{1000} +\setfont\smallerbf\bfshape{10}{800} +\setfont\smallerit\itshape{8}{1000} +\setfont\smallersl\slshape{8}{1000} +\setfont\smallersf\sfshape{8}{1000} +\setfont\smallersc\scshape{10}{800} +\setfont\smallerttsl\ttslshape{10}{800} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3} +\setfont\titleit\itbshape{10}{\magstep4} +\setfont\titlesl\slbshape{10}{\magstep4} +\setfont\titlett\ttbshape{12}{\magstep3} +\setfont\titlettsl\ttslshape{10}{\magstep4} +\setfont\titlesf\sfbshape{17}{\magstep1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\authorrm{\secrm} +\def\authortt{\sectt} + +% Chapter (and unnumbered) fonts (17.28pt). +\def\chapnominalsize{17pt} +\setfont\chaprm\rmbshape{12}{\magstep2} +\setfont\chapit\itbshape{10}{\magstep3} +\setfont\chapsl\slbshape{10}{\magstep3} +\setfont\chaptt\ttbshape{12}{\magstep2} +\setfont\chapttsl\ttslshape{10}{\magstep3} +\setfont\chapsf\sfbshape{17}{1000} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 + +% Section fonts (14.4pt). +\def\secnominalsize{14pt} +\setfont\secrm\rmbshape{12}{\magstep1} +\setfont\secit\itbshape{10}{\magstep2} +\setfont\secsl\slbshape{10}{\magstep2} +\setfont\sectt\ttbshape{12}{\magstep1} +\setfont\secttsl\ttslshape{10}{\magstep2} +\setfont\secsf\sfbshape{12}{\magstep1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 + +% Subsection fonts (13.15pt). +\def\ssecnominalsize{13pt} +\setfont\ssecrm\rmbshape{12}{\magstephalf} +\setfont\ssecit\itbshape{10}{1315} +\setfont\ssecsl\slbshape{10}{1315} +\setfont\ssectt\ttbshape{12}{\magstephalf} +\setfont\ssecttsl\ttslshape{10}{1315} +\setfont\ssecsf\sfbshape{12}{\magstephalf} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1315} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 + +% Reduced fonts for @acro in text (10pt). +\def\reducednominalsize{10pt} +\setfont\reducedrm\rmshape{10}{1000} +\setfont\reducedtt\ttshape{10}{1000} +\setfont\reducedbf\bfshape{10}{1000} +\setfont\reducedit\itshape{10}{1000} +\setfont\reducedsl\slshape{10}{1000} +\setfont\reducedsf\sfshape{10}{1000} +\setfont\reducedsc\scshape{10}{1000} +\setfont\reducedttsl\ttslshape{10}{1000} +\font\reducedi=cmmi10 +\font\reducedsy=cmsy10 + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% texinfo doesn't allow for producing subscripts and superscripts except +% in the main text, we don't bother to reset \scriptfont and +% \scriptscriptfont (which would also require loading a lot more fonts). +% +\def\resetmathfonts{% + \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy + \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf + \textfont\ttfam=\tentt \textfont\sffam=\tensf +} + +% The font-changing commands redefine the meanings of \tenSTYLE, instead +% of just \STYLE. We do this because \STYLE needs to also set the +% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire +% \tenSTYLE to set the current font. +% +% Each font-changing command also sets the names \lsize (one size lower) +% and \lllsize (three sizes lower). These relative commands are used in +% the LaTeX logo and acronyms. +% +% This all needs generalizing, badly. +% +\def\textfonts{% + \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl + \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy + \let\tenttsl=\textttsl + \def\curfontsize{text}% + \def\lsize{reduced}\def\lllsize{smaller}% + \resetmathfonts \setleading{\textleading}} +\def\titlefonts{% + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy + \let\tenttsl=\titlettsl + \def\curfontsize{title}% + \def\lsize{chap}\def\lllsize{subsec}% + \resetmathfonts \setleading{25pt}} +\def\titlefont#1{{\titlefonts\rm #1}} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy + \let\tenttsl=\chapttsl + \def\curfontsize{chap}% + \def\lsize{sec}\def\lllsize{text}% + \resetmathfonts \setleading{19pt}} +\def\secfonts{% + \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy + \let\tenttsl=\secttsl + \def\curfontsize{sec}% + \def\lsize{subsec}\def\lllsize{reduced}% + \resetmathfonts \setleading{16pt}} +\def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy + \let\tenttsl=\ssecttsl + \def\curfontsize{ssec}% + \def\lsize{text}\def\lllsize{small}% + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts +\def\reducedfonts{% + \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl + \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc + \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy + \let\tenttsl=\reducedttsl + \def\curfontsize{reduced}% + \def\lsize{small}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallfonts{% + \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl + \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc + \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy + \let\tenttsl=\smallttsl + \def\curfontsize{small}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallerfonts{% + \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl + \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc + \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy + \let\tenttsl=\smallerttsl + \def\curfontsize{smaller}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{9.5pt}} + +% Set the fonts to use with the @small... environments. +\let\smallexamplefonts = \smallfonts + +% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample +% can fit this many characters: +% 8.5x11=86 smallbook=72 a4=90 a5=69 +% If we use \scriptfonts (8pt), then we can fit this many characters: +% 8.5x11=90+ smallbook=80 a4=90+ a5=77 +% For me, subjectively, the few extra characters that fit aren't worth +% the additional smallness of 8pt. So I'm making the default 9pt. +% +% By the way, for comparison, here's what fits with @example (10pt): +% 8.5x11=71 smallbook=60 a4=75 a5=58 +% +% I wish the USA used A4 paper. +% --karl, 24jan03. + + +% Set up the default fonts, so we can use them for creating boxes. +% +\textfonts \rm + +% Define these so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000} +\setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12 +\setfont\shortcontsl\slshape{12}{1000} +\setfont\shortconttt\ttshape{12}{1000} + +%% Add scribe-like font environments, plus @l for inline lisp (usually sans +%% serif) and @ii for TeX italic + +% \smartitalic{ARG} outputs arg in italics, followed by an italic correction +% unless the following character is such as not to need one. +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else + \ptexslash\fi\fi\fi} +\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} +\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} + +% like \smartslanted except unconditionally uses \ttsl. +% @var is set to this for defun arguments. +\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} + +% like \smartslanted except unconditionally use \sl. We never want +% ttsl for book titles, do we? +\def\cite#1{{\sl #1}\futurelet\next\smartitalicx} + +\let\i=\smartitalic +\let\slanted=\smartslanted +\let\var=\smartslanted +\let\dfn=\smartslanted +\let\emph=\smartitalic + +% @b, explicit bold. +\def\b#1{{\bf #1}} +\let\strong=\b + +% @sansserif, explicit sans. +\def\sansserif#1{{\sf #1}} + +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +% Set sfcode to normal for the chars that usually have another value. +% Can't use plain's \frenchspacing because it uses the `\x notation, and +% sometimes \x has an active definition that messes things up. +% +\catcode`@=11 + \def\plainfrenchspacing{% + \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m + \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m + \def\endofsentencespacefactor{1000}% for @. and friends + } + \def\plainnonfrenchspacing{% + \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 + \def\endofsentencespacefactor{3000}% for @. and friends + } +\catcode`@=\other +\def\endofsentencespacefactor{3000}% default + +\def\t#1{% + {\tt \rawbackslash \plainfrenchspacing #1}% + \null +} +\def\samp#1{`\tclose{#1}'\null} +\setfont\keyrm\rmshape{8}{1000} +\font\keysy=cmsy9 +\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% + \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% + \vbox{\hrule\kern-0.4pt + \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% + \kern-0.4pt\hrule}% + \kern-.06em\raise0.4pt\hbox{\angleright}}}} +% The old definition, with no lozenge: +%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +% @file, @option are the same as @samp. +\let\file=\samp +\let\option=\samp + +% @code is a modification of @t, +% which makes spaces the same size as normal in the surrounding text. +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \plainfrenchspacing + #1% + }% + \null +} + +% We *must* turn on hyphenation at `-' and `_' in @code. +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. + +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. +% -- rms. +{ + \catcode`\-=\active + \catcode`\_=\active + % + \global\def\code{\begingroup + \catcode`\-=\active \catcode`\_=\active + \ifallowcodebreaks + \let-\codedash + \let_\codeunder + \else + \let-\realdash + \let_\realunder + \fi + \codex + } +} + +\def\realdash{-} +\def\codedash{-\discretionary{}{}{}} +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} +\def\codex #1{\tclose{#1}\endgroup} + +% An additional complication: the above will allow breaks after, e.g., +% each of the four underscores in __typeof__. This is undesirable in +% some manuals, especially if they don't have long identifiers in +% general. @allowcodebreaks provides a way to control this. +% +\newif\ifallowcodebreaks \allowcodebreakstrue + +\def\keywordtrue{true} +\def\keywordfalse{false} + +\parseargdef\allowcodebreaks{% + \def\txiarg{#1}% + \ifx\txiarg\keywordtrue + \allowcodebreakstrue + \else\ifx\txiarg\keywordfalse + \allowcodebreaksfalse + \else + \errhelp = \EMsimple + \errmessage{Unknown @allowcodebreaks option `\txiarg'}% + \fi\fi +} + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. + +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +% `example' (@kbd uses ttsl only inside of @example and friends), +% or `code' (@kbd uses normal tty font always). +\parseargdef\kbdinputstyle{% + \def\txiarg{#1}% + \ifx\txiarg\worddistinct + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% + \else\ifx\txiarg\wordexample + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% + \else\ifx\txiarg\wordcode + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% + \else + \errhelp = \EMsimple + \errmessage{Unknown @kbdinputstyle option `\txiarg'}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is `distinct.' +\kbdinputstyle distinct + +\def\xkey{\key} +\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% +\ifx\one\xkey\ifx\threex\three \key{#2}% +\else{\tclose{\kbdfont\look}}\fi +\else{\tclose{\kbdfont\look}}\fi} + +% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. +\let\indicateurl=\code +\let\env=\code +\let\command=\code + +% @uref (abbreviation for `urlref') takes an optional (comma-separated) +% second argument specifying the text to display and an optional third +% arg as text to display instead of (rather than in addition to) the url +% itself. First (mandatory) arg is the url. Perhaps eventually put in +% a hypertex \special here. +% +\def\uref#1{\douref #1,,,\finish} +\def\douref#1,#2,#3,#4\finish{\begingroup + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \code{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% @url synonym for @uref, since that's how everyone uses it. +% +\let\url=\uref + +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \let\email=\uref +\fi + +% Check if we are currently using a typewriter font. Since all the +% Computer Modern typewriter fonts have zero interword stretch (and +% shrink), and it is reasonable to expect all typewriter fonts to have +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } + +% Typeset a dimension, e.g., `in' or `pt'. The only reason for the +% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. +% +\def\dmn#1{\thinspace #1} + +\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} + +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} + +% Explicit font changes: @r, @sc, undocumented @ii. +\def\r#1{{\rm #1}} % roman font +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +% @acronym for "FBI", "NATO", and the like. +% We print this one point size smaller, since it's intended for +% all-uppercase. +% +\def\acronym#1{\doacronym #1,,\finish} +\def\doacronym#1,#2,#3\finish{% + {\selectfonts\lsize #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi +} + +% @abbr for "Comput. J." and the like. +% No font change, but don't do end-of-sentence spacing. +% +\def\abbr#1{\doabbr #1,,\finish} +\def\doabbr#1,#2,#3\finish{% + {\plainfrenchspacing #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi +} + +% @pounds{} is a sterling sign, which Knuth put in the CM italic font. +% +\def\pounds{{\it\$}} + +% @euro{} comes from a separate font, depending on the current style. +% We use the free feym* fonts from the eurosym package by Henrik +% Theiling, which support regular, slanted, bold and bold slanted (and +% "outlined" (blackboard board, sort of) versions, which we don't need). +% It is available from http://www.ctan.org/tex-archive/fonts/eurosym. +% +% Although only regular is the truly official Euro symbol, we ignore +% that. The Euro is designed to be slightly taller than the regular +% font height. +% +% feymr - regular +% feymo - slanted +% feybr - bold +% feybo - bold slanted +% +% There is no good (free) typewriter version, to my knowledge. +% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. +% Hmm. +% +% Also doesn't work in math. Do we need to do math with euro symbols? +% Hope not. +% +% +\def\euro{{\eurofont e}} +\def\eurofont{% + % We set the font at each command, rather than predefining it in + % \textfonts and the other font-switching commands, so that + % installations which never need the symbol don't have to have the + % font installed. + % + % There is only one designed size (nominal 10pt), so we always scale + % that to the current nominal size. + % + % By the way, simply using "at 1em" works for cmr10 and the like, but + % does not work for cmbx10 and other extended/shrunken fonts. + % + \def\eurosize{\csname\curfontsize nominalsize\endcsname}% + % + \ifx\curfontstyle\bfstylename + % bold: + \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize + \else + % regular: + \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize + \fi + \thiseurofont +} + +% @registeredsymbol - R in a circle. The font for the R should really +% be smaller yet, but lllsize is the best we can do for now. +% Adapted from the plain.tex definition of \copyright. +% +\def\registeredsymbol{% + $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% + \hfil\crcr\Orb}}% + }$% +} + +% Laurent Siebenmann reports \Orb undefined with: +% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 +% so we'll define it if necessary. +% +\ifx\Orb\undefined +\def\Orb{\mathhexbox20D} +\fi + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +% Do an implicit @contents or @shortcontents after @end titlepage if the +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. +% +\newif\ifsetcontentsaftertitlepage + \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue +\newif\ifsetshortcontentsaftertitlepage + \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue + +\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + +\envdef\titlepage{% + % Open one extra group, as we want to close it in the middle of \Etitlepage. + \begingroup + \parindent=0pt \textfonts + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Most title ``pages'' are actually two pages long, with space + % at the top of the second. We don't want the ragged left on the second. + \let\oldpage = \page + \def\page{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + \let\page = \oldpage + \page + \null + }% +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + % + % Need this before the \...aftertitlepage checks so that if they are + % in effect the toc pages will come out with page numbers. + \HEADINGSon + % + % If they want short, they certainly want long too. + \ifsetshortcontentsaftertitlepage + \shortcontents + \contents + \global\let\shortcontents = \relax + \global\let\contents = \relax + \fi + % + \ifsetcontentsaftertitlepage + \contents + \global\let\contents = \relax + \global\let\shortcontents = \relax + \fi +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +%%% Macros to be used within @titlepage: + +\let\subtitlerm=\tenrm +\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} + +\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines + \let\tt=\authortt} + +\parseargdef\title{% + \checkenv\titlepage + \leftline{\titlefonts\rm #1} + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt +} + +\parseargdef\subtitle{% + \checkenv\titlepage + {\subtitlefont \rightline{#1}}% +} + +% @author should come last, but may come many times. +% It can also be used inside @quotation. +% +\parseargdef\author{% + \def\temp{\quotation}% + \ifx\thisenv\temp + \def\quotationauthor{#1}% printed in \Equotation. + \else + \checkenv\titlepage + \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi + {\authorfont \leftline{#1}}% + \fi +} + + +%%% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks\evenheadline % headline on even pages +\newtoks\oddheadline % headline on odd pages +\newtoks\evenfootline % footline on even pages +\newtoks\oddfootline % footline on odd pages + +% Now make TeX use those variables +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} +\let\HEADINGShook=\relax + +% Commands to set those variables. +% For example, this is what @headings on does +% @evenheading @thistitle|@thispage|@thischapter +% @oddheading @thischapter|@thispage|@thistitle +% @evenfooting @thisfile|| +% @oddfooting ||@thisfile + + +\def\evenheading{\parsearg\evenheadingxxx} +\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} +\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddheading{\parsearg\oddheadingxxx} +\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} +\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} +\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddfooting{\parsearg\oddfootingxxx} +\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} +\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% + \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% + % + % Leave some space for the footline. Hopefully ok to assume + % @evenfooting will not be used by itself. + \global\advance\pageheight by -\baselineskip + \global\advance\vsize by -\baselineskip +} + +\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} + + +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. +% @headings singleafter turns on single-sided headings after this page. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. + +\def\headings #1 {\csname HEADINGS#1\endcsname} + +\def\HEADINGSoff{% +\global\evenheadline={\hfil} \global\evenfootline={\hfil} +\global\oddheadline={\hfil} \global\oddfootline={\hfil}} +\HEADINGSoff +% When we turn headings on, set the page number to 1. +% For double-sided printing, put current file name in lower left corner, +% chapter name on inside top of right hand pages, document +% title on inside top of left hand pages, and page numbers on outside top +% edge of all pages. +\def\HEADINGSdouble{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} +\let\contentsalignmacro = \chappager + +% For single-sided printing, chapter title goes across top left of page, +% page number on top right. +\def\HEADINGSsingle{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} +\def\HEADINGSon{\HEADINGSdouble} + +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} + +% Subroutines used in generating headings +% This produces Day Month Year style of output. +% Only define if not already defined, in case a txi-??.tex file has set +% up a different format (e.g., txi-cs.tex does this). +\ifx\today\undefined +\def\today{% + \number\day\space + \ifcase\month + \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr + \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug + \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec + \fi + \space\number\year} +\fi + +% @settitle line... specifies the title of the document, for headings. +% It generates no output of its own. +\def\thistitle{\putwordNoTitle} +\def\settitle{\parsearg{\gdef\thistitle}} + + +\message{tables,} +% Tables -- @table, @ftable, @vtable, @item(x). + +% default indentation of table text +\newdimen\tableindent \tableindent=.8in +% default indentation of @itemize and @enumerate text +\newdimen\itemindent \itemindent=.3in +% margin between end of table item and start of table text. +\newdimen\itemmargin \itemmargin=.1in + +% used internally for \itemindent minus \itemmargin +\newdimen\itemmax + +% Note @table, @ftable, and @vtable define @item, @itemx, etc., with +% these defs. +% They also define \itemindex +% to index the item name in whatever manner is desired (perhaps none). + +\newif\ifitemxneedsnegativevskip + +\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} + +\def\internalBitem{\smallbreak \parsearg\itemzzz} +\def\internalBitemx{\itemxpar \parsearg\itemzzz} + +\def\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemindicate{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + % + % Make this a paragraph so we get the \parskip glue and wrapping, + % but leave it ragged-right. + \begingroup + \advance\leftskip by-\tableindent + \advance\hsize by\tableindent + \advance\rightskip by0pt plus1fil + \leavevmode\unhbox0\par + \endgroup + % + % We're going to be starting a paragraph, but we don't want the + % \parskip glue -- logically it's part of the @item we just started. + \nobreak \vskip-\parskip + % + % Stop a page break at the \parskip glue coming up. However, if + % what follows is an environment such as @example, there will be no + % \parskip glue; then the negative vskip we just inserted would + % cause the example and the item to crash together. So we use this + % bizarre value of 10001 as a signal to \aboveenvbreak to insert + % \parskip glue after all. Section titles are handled this way also. + % + \penalty 10001 + \endgroup + \itemxneedsnegativevskipfalse + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. + \noindent + % Do this with kerns and \unhbox so that if there is a footnote in + % the item text, it can migrate to the main vertical list and + % eventually be printed. + \nobreak\kern-\tableindent + \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 + \unhbox0 + \nobreak\kern\dimen0 + \endgroup + \itemxneedsnegativevskiptrue + \fi +} + +\def\item{\errmessage{@item while not in a list environment}} +\def\itemx{\errmessage{@itemx while not in a list environment}} + +% @table, @ftable, @vtable. +\envdef\table{% + \let\itemindex\gobble + \tablecheck{table}% +} +\envdef\ftable{% + \def\itemindex ##1{\doind {fn}{\code{##1}}}% + \tablecheck{ftable}% +} +\envdef\vtable{% + \def\itemindex ##1{\doind {vr}{\code{##1}}}% + \tablecheck{vtable}% +} +\def\tablecheck#1{% + \ifnum \the\catcode`\^^M=\active + \endgroup + \errmessage{This command won't work in this context; perhaps the problem is + that we are \inenvironment\thisenv}% + \def\next{\doignore{#1}}% + \else + \let\next\tablex + \fi + \next +} +\def\tablex#1{% + \def\itemindicate{#1}% + \parsearg\tabley +} +\def\tabley#1{% + {% + \makevalueexpandable + \edef\temp{\noexpand\tablez #1\space\space\space}% + \expandafter + }\temp \endtablez +} +\def\tablez #1 #2 #3 #4\endtablez{% + \aboveenvbreak + \ifnum 0#1>0 \advance \leftskip by #1\mil \fi + \ifnum 0#2>0 \tableindent=#2\mil \fi + \ifnum 0#3>0 \advance \rightskip by #3\mil \fi + \itemmax=\tableindent + \advance \itemmax by -\itemmargin + \advance \leftskip by \tableindent + \exdentamount=\tableindent + \parindent = 0pt + \parskip = \smallskipamount + \ifdim \parskip=0pt \parskip=2pt \fi + \let\item = \internalBitem + \let\itemx = \internalBitemx +} +\def\Etable{\endgraf\afterenvbreak} +\let\Eftable\Etable +\let\Evtable\Etable +\let\Eitemize\Etable +\let\Eenumerate\Etable + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\envdef\itemize{\parsearg\doitemize} + +\def\doitemize#1{% + \aboveenvbreak + \itemmax=\itemindent + \advance\itemmax by -\itemmargin + \advance\leftskip by \itemindent + \exdentamount=\itemindent + \parindent=0pt + \parskip=\smallskipamount + \ifdim\parskip=0pt \parskip=2pt \fi + \def\itemcontents{#1}% + % @itemize with no arg is equivalent to @itemize @bullet. + \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi + \let\item=\itemizeitem +} + +% Definition of @item while inside @itemize and @enumerate. +% +\def\itemizeitem{% + \advance\itemno by 1 % for enumerations + {\let\par=\endgraf \smallbreak}% reasonable place to break + {% + % If the document has an @itemize directly after a section title, a + % \nobreak will be last on the list, and \sectionheading will have + % done a \vskip-\parskip. In that case, we don't want to zero + % parskip, or the item text will crash with the heading. On the + % other hand, when there is normal text preceding the item (as there + % usually is), we do want to zero parskip, or there would be too much + % space. In that case, we won't have a \nobreak before. At least + % that's the theory. + \ifnum\lastpenalty<10000 \parskip=0in \fi + \noindent + \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% + \vadjust{\penalty 1200}}% not good to break after first line of item. + \flushcr +} + +% \splitoff TOKENS\endmark defines \first to be the first token in +% TOKENS, and \rest to be the remainder. +% +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% + +% Allow an optional argument of an uppercase letter, lowercase letter, +% or number, to specify the first label in the enumerated list. No +% argument is the same as `1'. +% +\envparseargdef\enumerate{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a . + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call \doitemize, adding a period to the first argument and supplying the +% common last two arguments. Also subtract one from the initial value in +% \itemno, since @item increments \itemno. +% +\def\startenumeration#1{% + \advance\itemno by -1 + \doitemize{#1.}\flushcr +} + +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} + + +% @multitable macros +% Amy Hendrickson, 8/18/94, 3/6/96 +% +% @multitable ... @end multitable will make as many columns as desired. +% Contents of each column will wrap at width given in preamble. Width +% can be specified either with sample text given in a template line, +% or in percent of \hsize, the current width of text on page. + +% Table can continue over pages but will only break between lines. + +% To make preamble: +% +% Either define widths of columns in terms of percent of \hsize: +% @multitable @columnfractions .25 .3 .45 +% @item ... +% +% Numbers following @columnfractions are the percent of the total +% current hsize to be used for each column. You may use as many +% columns as desired. + + +% Or use a template: +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item ... +% using the widest term desired in each column. + +% Each new table line starts with @item, each subsequent new column +% starts with @tab. Empty columns may be produced by supplying @tab's +% with nothing between them for as many times as empty columns are needed, +% ie, @tab@tab@tab will produce two empty columns. + +% @item, @tab do not need to be on their own lines, but it will not hurt +% if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. +% +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt + +% Macros used to set up halign preamble: +% +\let\endsetuptable\relax +\def\xendsetuptable{\endsetuptable} +\let\columnfractions\relax +\def\xcolumnfractions{\columnfractions} +\newif\ifsetpercent + +% #1 is the @columnfraction, usually a decimal number like .5, but might +% be just 1. We just use it, whatever it is. +% +\def\pickupwholefraction#1 {% + \global\advance\colcount by 1 + \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% + \setuptable +} + +\newcount\colcount +\def\setuptable#1{% + \def\firstarg{#1}% + \ifx\firstarg\xendsetuptable + \let\go = \relax + \else + \ifx\firstarg\xcolumnfractions + \global\setpercenttrue + \else + \ifsetpercent + \let\go\pickupwholefraction + \else + \global\advance\colcount by 1 + \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a + % separator; typically that is always in the input, anyway. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi + \fi + \ifx\go\pickupwholefraction + % Put the argument back for the \pickupwholefraction call, so + % we'll always have a period there to be parsed. + \def\go{\pickupwholefraction#1}% + \else + \let\go = \setuptable + \fi% + \fi + \go +} + +% multitable-only commands. +% +% @headitem starts a heading row, which we typeset in bold. +% Assignments have to be global since we are inside the implicit group +% of an alignment entry. Note that \everycr resets \everytab. +\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}% +% +% A \tab used to include \hskip1sp. But then the space in a template +% line is not enough. That is bad. So let's go back to just `&' until +% we encounter the problem it was intended to solve again. +% --karl, nathan@acm.org, 20apr99. +\def\tab{\checkenv\multitable &\the\everytab}% + +% @multitable ... @end multitable definitions: +% +\newtoks\everytab % insert after every tab. +% +\envdef\multitable{% + \vskip\parskip + \startsavinginserts + % + % @item within a multitable starts a normal row. + % We use \def instead of \let so that if one of the multitable entries + % contains an @itemize, we don't choke on the \item (seen as \crcr aka + % \endtemplate) expanding \doitemize. + \def\item{\crcr}% + % + \tolerance=9500 + \hbadness=9500 + \setmultitablespacing + \parskip=\multitableparskip + \parindent=\multitableparindent + \overfullrule=0pt + \global\colcount=0 + % + \everycr = {% + \noalign{% + \global\everytab={}% + \global\colcount=0 % Reset the column counter. + % Check for saved footnotes, etc. + \checkinserts + % Keeps underfull box messages off when table breaks over pages. + %\filbreak + % Maybe so, but it also creates really weird page breaks when the + % table breaks over pages. Wouldn't \vfil be better? Wait until the + % problem manifests itself, so it can be fixed for real --karl. + }% + }% + % + \parsearg\domultitable +} +\def\domultitable#1{% + % To parse everything between @multitable and @item: + \setuptable#1 \endsetuptable + % + % This preamble sets up a generic column definition, which will + % be used as many times as user calls for columns. + % \vtop will set a single line and will also let text wrap and + % continue for many paragraphs if desired. + \halign\bgroup &% + \global\advance\colcount by 1 + \multistrut + \vtop{% + % Use the current \colcount to find the correct column width: + \hsize=\expandafter\csname col\the\colcount\endcsname + % + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % + % If the user has set preamble in terms of percent of \hsize we will + % use that dimension as the width of the column, and the \leftskip + % will keep entries from bumping into each other. Table will start at + % left margin and final column will justify at right margin. + % + % Make sure we don't inherit \rightskip from the outer environment. + \rightskip=0pt + \ifnum\colcount=1 + % The first column will be indented with the surrounding text. + \advance\hsize by\leftskip + \else + \ifsetpercent \else + % If user has not set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace. + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: + \leftskip=\multitablecolspace + \fi + % Ignoring space at the beginning and end avoids an occasional spurious + % blank line, when TeX decides to break the line at the space before the + % box from the multistrut, so the strut ends up on a line by itself. + % For example: + % @multitable @columnfractions .11 .89 + % @item @code{#} + % @tab Legal holiday which is valid in major parts of the whole country. + % Is automatically provided with highlighting sequences respectively + % marking characters. + \noindent\ignorespaces##\unskip\multistrut + }\cr +} +\def\Emultitable{% + \crcr + \egroup % end the \halign + \global\setpercentfalse +} + +\def\setmultitablespacing{% + \def\multistrut{\strut}% just use the standard line spacing + % + % Compute \multitablelinespace (if not defined by user) for use in + % \multitableparskip calculation. We used define \multistrut based on + % this, but (ironically) that caused the spacing to be off. + % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. +\ifdim\multitablelinespace=0pt +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip +\global\advance\multitablelinespace by-\ht0 +\fi +%% Test to see if parskip is larger than space between lines of +%% table. If not, do nothing. +%% If so, set to same dimension as multitablelinespace. +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi} + + +\message{conditionals,} + +% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, +% @ifnotxml always succeed. They currently do nothing; we don't +% attempt to check whether the conditionals are properly nested. But we +% have to remember that they are conditionals, so that @end doesn't +% attempt to close an environment group. +% +\def\makecond#1{% + \expandafter\let\csname #1\endcsname = \relax + \expandafter\let\csname iscond.#1\endcsname = 1 +} +\makecond{iftex} +\makecond{ifnotdocbook} +\makecond{ifnothtml} +\makecond{ifnotinfo} +\makecond{ifnotplaintext} +\makecond{ifnotxml} + +% Ignore @ignore, @ifhtml, @ifinfo, and the like. +% +\def\direntry{\doignore{direntry}} +\def\documentdescription{\doignore{documentdescription}} +\def\docbook{\doignore{docbook}} +\def\html{\doignore{html}} +\def\ifdocbook{\doignore{ifdocbook}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifinfo{\doignore{ifinfo}} +\def\ifnottex{\doignore{ifnottex}} +\def\ifplaintext{\doignore{ifplaintext}} +\def\ifxml{\doignore{ifxml}} +\def\ignore{\doignore{ignore}} +\def\menu{\doignore{menu}} +\def\xml{\doignore{xml}} + +% Ignore text until a line `@end #1', keeping track of nested conditionals. +% +% A count to remember the depth of nesting. +\newcount\doignorecount + +\def\doignore#1{\begingroup + % Scan in ``verbatim'' mode: + \catcode`\@ = \other + \catcode`\{ = \other + \catcode`\} = \other + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \spaceisspace + % + % Count number of #1's that we've seen. + \doignorecount = 0 + % + % Swallow text until we reach the matching `@end #1'. + \dodoignore{#1}% +} + +{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. + \obeylines % + % + \gdef\dodoignore#1{% + % #1 contains the command name as a string, e.g., `ifinfo'. + % + % Define a command to find the next `@end #1', which must be on a line + % by itself. + \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}% + % And this command to find another #1 command, at the beginning of a + % line. (Otherwise, we would consider a line `@c @ifset', for + % example, to count as an @ifset for nesting.) + \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% + % + % And now expand that command. + \obeylines % + \doignoretext ^^M% + }% +} + +\def\doignoreyyy#1{% + \def\temp{#1}% + \ifx\temp\empty % Nothing found. + \let\next\doignoretextzzz + \else % Found a nested condition, ... + \advance\doignorecount by 1 + \let\next\doignoretextyyy % ..., look for another. + % If we're here, #1 ends with ^^M\ifinfo (for example). + \fi + \next #1% the token \_STOP_ is present just after this macro. +} + +% We have to swallow the remaining "\_STOP_". +% +\def\doignoretextzzz#1{% + \ifnum\doignorecount = 0 % We have just found the outermost @end. + \let\next\enddoignore + \else % Still inside a nested condition. + \advance\doignorecount by -1 + \let\next\doignoretext % Look for the next @end. + \fi + \next +} + +% Finish off ignored text. +\def\enddoignore{\endgroup\ignorespaces} + + +% @set VAR sets the variable VAR to an empty value. +% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. +% +% Since we want to separate VAR from REST-OF-LINE (which might be +% empty), we can't just use \parsearg; we have to insert a space of our +% own to delimit the rest of the line, and then take it out again if we +% didn't need it. +% We rely on the fact that \parsearg sets \catcode`\ =10. +% +\parseargdef\set{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + {% + \makevalueexpandable + \def\temp{#2}% + \edef\next{\gdef\makecsname{SET#1}}% + \ifx\temp\empty + \next{}% + \else + \setzzz#2\endsetzzz + \fi + }% +} +% Remove the trailing space \setxxx inserted. +\def\setzzz#1 \endsetzzz{\next{#1}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\parseargdef\clear{% + {% + \makevalueexpandable + \global\expandafter\let\csname SET#1\endcsname=\relax + }% +} + +% @value{foo} gets the text saved in variable foo. +\def\value{\begingroup\makevalueexpandable\valuexxx} +\def\valuexxx#1{\expandablevalue{#1}\endgroup} +{ + \catcode`\- = \active \catcode`\_ = \active + % + \gdef\makevalueexpandable{% + \let\value = \expandablevalue + % We don't want these characters active, ... + \catcode`\-=\other \catcode`\_=\other + % ..., but we might end up with active ones in the argument if + % we're called from @code, as @code{@value{foo-bar_}}, though. + % So \let them to their normal equivalents. + \let-\realdash \let_\normalunderscore + } +} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we call \makevalueexpandable in \indexdummies). +% The command has to be fully expandable (if the variable is set), since +% the result winds up in the index file. This means that if the +% variable's value contains other Texinfo commands, it's almost certain +% it will fail (although perhaps we could fix that with sufficient work +% to do a one-level expansion on the result, instead of complete). +% +\def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% + \message{Variable `#1', used in @value, is not set.}% + \else + \csname SET#1\endcsname + \fi +} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +% To get special treatment of `@end ifset,' call \makeond and the redefine. +% +\makecond{ifset} +\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} +\def\doifset#1#2{% + {% + \makevalueexpandable + \let\next=\empty + \expandafter\ifx\csname SET#2\endcsname\relax + #1% If not set, redefine \next. + \fi + \expandafter + }\next +} +\def\ifsetfail{\doignore{ifset}} + +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +% The `\else' inside the `\doifset' parameter is a trick to reuse the +% above code: if the variable is not set, do nothing, if it is set, +% then redefine \next to \ifclearfail. +% +\makecond{ifclear} +\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} +\def\ifclearfail{\doignore{ifclear}} + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory=\comment + +% @defininfoenclose. +\let\definfoenclose=\comment + + +\message{indexing,} +% Index generation facilities + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within macros and \if's. +\edef\newwrite{\makecsname{ptexnewwrite}} + +% \newindex {foo} defines an index named foo. +% It automatically defines \fooindex such that +% \fooindex ...rest of line... puts an entry in the index foo. +% It also defines \fooindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is foo. +% The name of an index should be no more than 2 characters long +% for the sake of vms. +% +\def\newindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 % Open the file + \fi + \expandafter\xdef\csname#1index\endcsname{% % Define @#1index + \noexpand\doindex{#1}} +} + +% @defindex foo == \newindex{foo} +% +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. +% +\def\defcodeindex{\parsearg\newcodeindex} +% +\def\newcodeindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 + \fi + \expandafter\xdef\csname#1index\endcsname{% + \noexpand\docodeindex{#1}}% +} + + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +% +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +% +\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} +\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} + +% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), +% #3 the target index (bar). +\def\dosynindex#1#2#3{% + % Only do \closeout if we haven't already done it, else we'll end up + % closing the target index. + \expandafter \ifx\csname donesynindex#2\endcsname \undefined + % The \closeout helps reduce unnecessary open files; the limit on the + % Acorn RISC OS is a mere 16 files. + \expandafter\closeout\csname#2indfile\endcsname + \expandafter\let\csname\donesynindex#2\endcsname = 1 + \fi + % redefine \fooindfile: + \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname + \expandafter\let\csname#2indfile\endcsname=\temp + % redefine \fooindex: + \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} + +% Take care of Texinfo commands that can appear in an index entry. +% Since there are some commands we want to expand, and others we don't, +% we have to laboriously prevent expansion for those that we don't. +% +\def\indexdummies{% + \escapechar = `\\ % use backslash in output files. + \def\@{@}% change to @@ when we switch to @ as escape char in index files. + \def\ {\realbackslash\space }% + % Need these in case \tex is in effect and \{ is a \delimiter again. + % But can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. + \let\{ = \mylbrace + \let\} = \myrbrace + % + % Do the redefinitions. + \commondummies +} + +% For the aux and toc files, @ is the escape character. So we want to +% redefine everything using @ as the escape character (instead of +% \realbackslash, still used for index files). When everything uses @, +% this will be simpler. +% +\def\atdummies{% + \def\@{@@}% + \def\ {@ }% + \let\{ = \lbraceatcmd + \let\} = \rbraceatcmd + % + % Do the redefinitions. + \commondummies +} + +% Called from \indexdummies and \atdummies. +% +\def\commondummies{% + % + % \definedummyword defines \#1 as \string\#1\space, thus effectively + % preventing its expansion. This is used only for control% words, + % not control letters, because the \space would be incorrect for + % control characters, but is needed to separate the control word + % from whatever follows. + % + % For control letters, we have \definedummyletter, which omits the + % space. + % + % These can be used both for control words that take an argument and + % those that do not. If it is followed by {arg} in the input, then + % that will dutifully get written to the index (or wherever). + % + \def\definedummyword ##1{\def##1{\string##1\space}}% + \def\definedummyletter##1{\def##1{\string##1}}% + \let\definedummyaccent\definedummyletter + % + \commondummiesnofonts + % + \definedummyletter\_% + % + % Non-English letters. + \definedummyword\AA + \definedummyword\AE + \definedummyword\L + \definedummyword\OE + \definedummyword\O + \definedummyword\aa + \definedummyword\ae + \definedummyword\l + \definedummyword\oe + \definedummyword\o + \definedummyword\ss + \definedummyword\exclamdown + \definedummyword\questiondown + \definedummyword\ordf + \definedummyword\ordm + % + % Although these internal commands shouldn't show up, sometimes they do. + \definedummyword\bf + \definedummyword\gtr + \definedummyword\hat + \definedummyword\less + \definedummyword\sf + \definedummyword\sl + \definedummyword\tclose + \definedummyword\tt + % + \definedummyword\LaTeX + \definedummyword\TeX + % + % Assorted special characters. + \definedummyword\bullet + \definedummyword\comma + \definedummyword\copyright + \definedummyword\registeredsymbol + \definedummyword\dots + \definedummyword\enddots + \definedummyword\equiv + \definedummyword\error + \definedummyword\euro + \definedummyword\expansion + \definedummyword\minus + \definedummyword\pounds + \definedummyword\point + \definedummyword\print + \definedummyword\result + % + % We want to disable all macros so that they are not expanded by \write. + \macrolist + % + \normalturnoffactive + % + % Handle some cases of @value -- where it does not contain any + % (non-fully-expandable) commands. + \makevalueexpandable +} + +% \commondummiesnofonts: common to \commondummies and \indexnofonts. +% +% Better have this without active chars. +{ + \catcode`\~=\other + \gdef\commondummiesnofonts{% + % Control letters and accents. + \definedummyletter\!% + \definedummyaccent\"% + \definedummyaccent\'% + \definedummyletter\*% + \definedummyaccent\,% + \definedummyletter\.% + \definedummyletter\/% + \definedummyletter\:% + \definedummyaccent\=% + \definedummyletter\?% + \definedummyaccent\^% + \definedummyaccent\`% + \definedummyaccent\~% + \definedummyword\u + \definedummyword\v + \definedummyword\H + \definedummyword\dotaccent + \definedummyword\ringaccent + \definedummyword\tieaccent + \definedummyword\ubaraccent + \definedummyword\udotaccent + \definedummyword\dotless + % + % Texinfo font commands. + \definedummyword\b + \definedummyword\i + \definedummyword\r + \definedummyword\sc + \definedummyword\t + % + % Commands that take arguments. + \definedummyword\acronym + \definedummyword\cite + \definedummyword\code + \definedummyword\command + \definedummyword\dfn + \definedummyword\emph + \definedummyword\env + \definedummyword\file + \definedummyword\kbd + \definedummyword\key + \definedummyword\math + \definedummyword\option + \definedummyword\samp + \definedummyword\strong + \definedummyword\tie + \definedummyword\uref + \definedummyword\url + \definedummyword\var + \definedummyword\verb + \definedummyword\w + } +} + +% \indexnofonts is used when outputting the strings to sort the index +% by, and when constructing control sequence names. It eliminates all +% control sequences and just writes whatever the best ASCII sort string +% would be for a given command (usually its argument). +% +\def\indexnofonts{% + % Accent commands should become @asis. + \def\definedummyaccent##1{\let##1\asis}% + % We can just ignore other control letters. + \def\definedummyletter##1{\let##1\empty}% + % Hopefully, all control words can become @asis. + \let\definedummyword\definedummyaccent + % + \commondummiesnofonts + % + % Don't no-op \tt, since it isn't a user-level command + % and is used in the definitions of the active chars like <, >, |, etc. + % Likewise with the other plain tex font commands. + %\let\tt=\asis + % + \def\ { }% + \def\@{@}% + % how to handle braces? + \def\_{\normalunderscore}% + % + % Non-English letters. + \def\AA{AA}% + \def\AE{AE}% + \def\L{L}% + \def\OE{OE}% + \def\O{O}% + \def\aa{aa}% + \def\ae{ae}% + \def\l{l}% + \def\oe{oe}% + \def\o{o}% + \def\ss{ss}% + \def\exclamdown{!}% + \def\questiondown{?}% + \def\ordf{a}% + \def\ordm{o}% + % + \def\LaTeX{LaTeX}% + \def\TeX{TeX}% + % + % Assorted special characters. + % (The following {} will end up in the sort string, but that's ok.) + \def\bullet{bullet}% + \def\comma{,}% + \def\copyright{copyright}% + \def\registeredsymbol{R}% + \def\dots{...}% + \def\enddots{...}% + \def\equiv{==}% + \def\error{error}% + \def\euro{euro}% + \def\expansion{==>}% + \def\minus{-}% + \def\pounds{pounds}% + \def\point{.}% + \def\print{-|}% + \def\result{=>}% + % + % We need to get rid of all macros, leaving only the arguments (if present). + % Of course this is not nearly correct, but it is the best we can do for now. + % makeinfo does not expand macros in the argument to @deffn, which ends up + % writing an index entry, and texindex isn't prepared for an index sort entry + % that starts with \. + % + % Since macro invocations are followed by braces, we can just redefine them + % to take a single TeX argument. The case of a macro invocation that + % goes to end-of-line is not handled. + % + \macrolist +} + +\let\indexbackslash=0 %overridden during \printindex. +\let\SETmarginindex=\relax % put index entries in margin (undocumented)? + +% Most index entries go through here, but \dosubind is the general case. +% #1 is the index name, #2 is the entry text. +\def\doind#1#2{\dosubind{#1}{#2}{}} + +% Workhorse for all \fooindexes. +% #1 is name of index, #2 is stuff to put there, #3 is subentry -- +% empty if called from \doind, as we usually are (the main exception +% is with most defuns, which call us directly). +% +\def\dosubind#1#2#3{% + \iflinks + {% + % Store the main index entry text (including the third arg). + \toks0 = {#2}% + % If third arg is present, precede it with a space. + \def\thirdarg{#3}% + \ifx\thirdarg\empty \else + \toks0 = \expandafter{\the\toks0 \space #3}% + \fi + % + \edef\writeto{\csname#1indfile\endcsname}% + % + \ifvmode + \dosubindsanitize + \else + \dosubindwrite + \fi + }% + \fi +} + +% Write the entry in \toks0 to the index file: +% +\def\dosubindwrite{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% + \fi + % + % Remember, we are within a group. + \indexdummies % Must do this here, since \bf, etc expand at this stage + \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % Process the index entry with all font commands turned off, to + % get the string to sort by. + {\indexnofonts + \edef\temp{\the\toks0}% need full expansion + \xdef\indexsorttmp{\temp}% + }% + % + % Set up the complete index entry, with both the sort key and + % the original text, including any font commands. We write + % three arguments to \entry to the .?? file (four in the + % subentry case), texindex reduces to two when writing the .??s + % sorted result. + \edef\temp{% + \write\writeto{% + \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% + }% + \temp +} + +% Take care of unwanted page breaks: +% +% If a skip is the last thing on the list now, preserve it +% by backing up by \lastskip, doing the \write, then inserting +% the skip again. Otherwise, the whatsit generated by the +% \write will make \lastskip zero. The result is that sequences +% like this: +% @end defun +% @tindex whatever +% @defun ... +% will have extra space inserted, because the \medbreak in the +% start of the @defun won't see the skip inserted by the @end of +% the previous defun. +% +% But don't do any of this if we're not in vertical mode. We +% don't want to do a \vskip and prematurely end a paragraph. +% +% Avoid page breaks due to these extra skips, too. +% +% But wait, there is a catch there: +% We'll have to check whether \lastskip is zero skip. \ifdim is not +% sufficient for this purpose, as it ignores stretch and shrink parts +% of the skip. The only way seems to be to check the textual +% representation of the skip. +% +% The following is almost like \def\zeroskipmacro{0.0pt} except that +% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). +% +\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} +% +% ..., ready, GO: +% +\def\dosubindsanitize{% + % \lastskip and \lastpenalty cannot both be nonzero simultaneously. + \skip0 = \lastskip + \edef\lastskipmacro{\the\lastskip}% + \count255 = \lastpenalty + % + % If \lastskip is nonzero, that means the last item was a + % skip. And since a skip is discardable, that means this + % -\skip0 glue we're inserting is preceded by a + % non-discardable item, therefore it is not a potential + % breakpoint, therefore no \nobreak needed. + \ifx\lastskipmacro\zeroskipmacro + \else + \vskip-\skip0 + \fi + % + \dosubindwrite + % + \ifx\lastskipmacro\zeroskipmacro + % If \lastskip was zero, perhaps the last item was a penalty, and + % perhaps it was >=10000, e.g., a \nobreak. In that case, we want + % to re-insert the same penalty (values >10000 are used for various + % signals); since we just inserted a non-discardable item, any + % following glue (such as a \parskip) would be a breakpoint. For example: + % + % @deffn deffn-whatever + % @vindex index-whatever + % Description. + % would allow a break between the index-whatever whatsit + % and the "Description." paragraph. + \ifnum\count255>9999 \penalty\count255 \fi + \else + % On the other hand, if we had a nonzero \lastskip, + % this make-up glue would be preceded by a non-discardable item + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\skip0 + \fi +} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% @printindex causes a particular index (the ??s file) to get printed. +% It does not print any chapter heading (usually an @unnumbered). +% +\parseargdef\printindex{\begingroup + \dobreak \chapheadingskip{10000}% + % + \smallfonts \rm + \tolerance = 9500 + \everypar = {}% don't want the \kern\-parindent from indentation suppression. + % + % See if the index file exists and is nonempty. + % Change catcode of @ here so that if the index file contains + % \initial {@} + % as its first line, TeX doesn't complain about mismatched braces + % (because it thinks @} is a control sequence). + \catcode`\@ = 11 + \openin 1 \jobname.#1s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + \putwordIndexNonexistent + \else + % + % If the index file exists but is empty, then \openin leaves \ifeof + % false. We have to make TeX try to read something from the file, so + % it can discover if there is anything in it. + \read 1 to \temp + \ifeof 1 + \putwordIndexIsEmpty + \else + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \def\indexbackslash{\backslashcurfont}% + \catcode`\\ = 0 + \escapechar = `\\ + \begindoublecolumns + \input \jobname.#1s + \enddoublecolumns + \fi + \fi + \closein 1 +\endgroup} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +\def\initial#1{{% + % Some minor font changes for the special characters. + \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt + % + % Remove any glue we may have, we'll be inserting our own. + \removelastskip + % + % We like breaks before the index initials, so insert a bonus. + \nobreak + \vskip 0pt plus 3\baselineskip + \penalty 0 + \vskip 0pt plus -3\baselineskip + % + % Typeset the initial. Making this add up to a whole number of + % baselineskips increases the chance of the dots lining up from column + % to column. It still won't often be perfect, because of the stretch + % we need before each entry, but it's better. + % + % No shrink because it confuses \balancecolumns. + \vskip 1.67\baselineskip plus .5\baselineskip + \leftline{\secbf #1}% + % Do our best not to break after the initial. + \nobreak + \vskip .33\baselineskip plus .1\baselineskip +}} + +% \entry typesets a paragraph consisting of the text (#1), dot leaders, and +% then page number (#2) flushed to the right margin. It is used for index +% and table of contents entries. The paragraph is indented by \leftskip. +% +% A straightforward implementation would start like this: +% \def\entry#1#2{... +% But this frozes the catcodes in the argument, and can cause problems to +% @code, which sets - active. This problem was fixed by a kludge--- +% ``-'' was active throughout whole index, but this isn't really right. +% +% The right solution is to prevent \entry from swallowing the whole text. +% --kasal, 21nov03 +\def\entry{% + \begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % Do not fill out the last line with white space. + \parfillskip = 0in + % + % No extra space above this paragraph. + \parskip = 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % \hangindent is only relevant when the entry text and page number + % don't both fit on one line. In that case, bob suggests starting the + % dots pretty far over on the line. Unfortunately, a large + % indentation looks wrong when the entry text itself is broken across + % lines. So we use a small indentation and put up with long leaders. + % + % \hangafter is reset to 1 (which is the value we want) at the start + % of each paragraph, so we need not do anything with that. + \hangindent = 2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip = 0pt plus1fil + % + % A bit of stretch before each entry for the benefit of balancing + % columns. + \vskip 0pt plus1pt + % + % Swallow the left brace of the text (first parameter): + \afterassignment\doentry + \let\temp = +} +\def\doentry{% + \bgroup % Instead of the swallowed brace. + \noindent + \aftergroup\finishentry + % And now comes the text of the entry. +} +\def\finishentry#1{% + % #1 is the page number. + % + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \def\tempa{{\rm }}% + \def\tempb{#1}% + \edef\tempc{\tempa}% + \edef\tempd{\tempb}% + \ifx\tempc\tempd + \ % + \else + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ifpdf + \pdfgettoks#1.% + \ \the\toksA + \else + \ #1% + \fi + \fi + \par + \endgroup +} + +% Like \dotfill except takes at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm +\def\secondary#1#2{{% + \parfillskip=0in + \parskip=0in + \hangindent=1in + \hangafter=1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage = \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + }% + \eject % run that output routine to set \partialpage + % + % Use the double-column output routine for subsequent pages. + \output = {\doublecolumnout}% + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it in one place. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +-<1pt) + % as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} + +% The double-column output routine for all double-column pages except +% the last. +% +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@ = \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. +\def\pagesofar{% + \unvbox\partialpage + % + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize + \hbox to\pagewidth{\box0\hfil\box2}% +} +% +% All done with double columns. +\def\enddoublecolumns{% + \output = {% + % Split the last of the double-column material. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output = {\onepageout{\pagecontents\PAGE}}% + }% + \eject + \endgroup % started in \begindoublecolumns + % + % \pagegoal was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). + \pagegoal = \vsize +} +% +% Called at the end of the double column material. +\def\balancecolumns{% + \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 % target to split to + %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% + \splittopskip = \topskip + % Loop until we get a decent breakpoint. + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + \ifdim\ht3>\dimen@ + \global\advance\dimen@ by 1pt + \repeat + }% + %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + % + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Chapters, sections, etc. + +% \unnumberedno is an oxymoron, of course. But we count the unnumbered +% sections so that we can refer to them unambiguously in the pdf +% outlines by their "section number". We avoid collisions with chapter +% numbers by starting them at 10000. (If a document ever has 10000 +% chapters, we're in trouble anyway, I'm sure.) +\newcount\unnumberedno \unnumberedno = 10000 +\newcount\chapno +\newcount\secno \secno=0 +\newcount\subsecno \subsecno=0 +\newcount\subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount\appendixno \appendixno = `\@ +% +% \def\appendixletter{\char\the\appendixno} +% We do the following ugly conditional instead of the above simple +% construct for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +% +\def\appendixletter{% + \ifnum\appendixno=`A A% + \else\ifnum\appendixno=`B B% + \else\ifnum\appendixno=`C C% + \else\ifnum\appendixno=`D D% + \else\ifnum\appendixno=`E E% + \else\ifnum\appendixno=`F F% + \else\ifnum\appendixno=`G G% + \else\ifnum\appendixno=`H H% + \else\ifnum\appendixno=`I I% + \else\ifnum\appendixno=`J J% + \else\ifnum\appendixno=`K K% + \else\ifnum\appendixno=`L L% + \else\ifnum\appendixno=`M M% + \else\ifnum\appendixno=`N N% + \else\ifnum\appendixno=`O O% + \else\ifnum\appendixno=`P P% + \else\ifnum\appendixno=`Q Q% + \else\ifnum\appendixno=`R R% + \else\ifnum\appendixno=`S S% + \else\ifnum\appendixno=`T T% + \else\ifnum\appendixno=`U U% + \else\ifnum\appendixno=`V V% + \else\ifnum\appendixno=`W W% + \else\ifnum\appendixno=`X X% + \else\ifnum\appendixno=`Y Y% + \else\ifnum\appendixno=`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% Each @chapter defines this as the name of the chapter. +% page headings and footings can use it. @section does likewise. +% However, they are not reliable, because we don't use marks. +\def\thischapter{} +\def\thissection{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\let\up=\raisesections % original BFox name + +% @lowersections: treat @chapter as section, @section as subsection, etc. +\def\lowersections{\global\advance\secbase by 1} +\let\down=\lowersections % original BFox name + +% we only have subsub. +\chardef\maxseclevel = 3 +% +% A numbered section within an unnumbered changes to unnumbered too. +% To achive this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unmlevel = \maxseclevel +% +% Trace whether the current chapter is an appendix or not: +% \chapheadtype is "N" or "A", unnumbered chapters are ignored. +\def\chapheadtype{N} + +% Choose a heading macro +% #1 is heading type +% #2 is heading level +% #3 is text for heading +\def\genhead#1#2#3{% + % Compute the abs. sec. level: + \absseclevel=#2 + \advance\absseclevel by \secbase + % Make sure \absseclevel doesn't fall outside the range: + \ifnum \absseclevel < 0 + \absseclevel = 0 + \else + \ifnum \absseclevel > 3 + \absseclevel = 3 + \fi + \fi + % The heading type: + \def\headtype{#1}% + \if \headtype U% + \ifnum \absseclevel < \unmlevel + \chardef\unmlevel = \absseclevel + \fi + \else + % Check for appendix sections: + \ifnum \absseclevel = 0 + \edef\chapheadtype{\headtype}% + \else + \if \headtype A\if \chapheadtype N% + \errmessage{@appendix... within a non-appendix chapter}% + \fi\fi + \fi + % Check for numbered within unnumbered: + \ifnum \absseclevel > \unmlevel + \def\headtype{U}% + \else + \chardef\unmlevel = 3 + \fi + \fi + % Now print the heading: + \if \headtype U% + \ifcase\absseclevel + \unnumberedzzz{#3}% + \or \unnumberedseczzz{#3}% + \or \unnumberedsubseczzz{#3}% + \or \unnumberedsubsubseczzz{#3}% + \fi + \else + \if \headtype A% + \ifcase\absseclevel + \appendixzzz{#3}% + \or \appendixsectionzzz{#3}% + \or \appendixsubseczzz{#3}% + \or \appendixsubsubseczzz{#3}% + \fi + \else + \ifcase\absseclevel + \chapterzzz{#3}% + \or \seczzz{#3}% + \or \numberedsubseczzz{#3}% + \or \numberedsubsubseczzz{#3}% + \fi + \fi + \fi + \suppressfirstparagraphindent +} + +% an interface: +\def\numhead{\genhead N} +\def\apphead{\genhead A} +\def\unnmhead{\genhead U} + +% @chapter, @appendix, @unnumbered. Increment top-level counter, reset +% all lower-level sectioning counters to zero. +% +% Also set \chaplevelprefix, which we prepend to @float sequence numbers +% (e.g., figures), q.v. By default (before any chapter), that is empty. +\let\chaplevelprefix = \empty +% +\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz#1{% + % section resetting is \global in case the chapter is in a group, such + % as an @include file. + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\chapno by 1 + % + % Used for \float. + \gdef\chaplevelprefix{\the\chapno.}% + \resetallfloatnos + % + \message{\putwordChapter\space \the\chapno}% + % + % Write the actual heading. + \chapmacro{#1}{Ynumbered}{\the\chapno}% + % + % So @section and the like are numbered underneath this chapter. + \global\let\section = \numberedsec + \global\let\subsection = \numberedsubsec + \global\let\subsubsection = \numberedsubsubsec +} + +\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz +\def\appendixzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\appendixno by 1 + \gdef\chaplevelprefix{\appendixletter.}% + \resetallfloatnos + % + \def\appendixnum{\putwordAppendix\space \appendixletter}% + \message{\appendixnum}% + % + \chapmacro{#1}{Yappendix}{\appendixletter}% + % + \global\let\section = \appendixsec + \global\let\subsection = \appendixsubsec + \global\let\subsubsection = \appendixsubsubsec +} + +\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz +\def\unnumberedzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\unnumberedno by 1 + % + % Since an unnumbered has no number, no prefix for figures. + \global\let\chaplevelprefix = \empty + \resetallfloatnos + % + % This used to be simply \message{#1}, but TeX fully expands the + % argument to \message. Therefore, if #1 contained @-commands, TeX + % expanded them. For example, in `@unnumbered The @cite{Book}', TeX + % expanded @cite (which turns out to cause errors because \cite is meant + % to be executed, not expanded). + % + % Anyway, we don't want the fully-expanded definition of @cite to appear + % as a result of the \message, we just want `@cite' itself. We use + % \the to achieve this: TeX expands \the only once, + % simply yielding the contents of . (We also do this for + % the toc entries.) + \toks0 = {#1}% + \message{(\the\toks0)}% + % + \chapmacro{#1}{Ynothing}{\the\unnumberedno}% + % + \global\let\section = \unnumberedsec + \global\let\subsection = \unnumberedsubsec + \global\let\subsubsection = \unnumberedsubsubsec +} + +% @centerchap is like @unnumbered, but the heading is centered. +\outer\parseargdef\centerchap{% + % Well, we could do the following in a group, but that would break + % an assumption that \chapmacro is called at the outermost level. + % Thus we are safer this way: --kasal, 24feb04 + \let\centerparametersmaybe = \centerparameters + \unnmhead0{#1}% + \let\centerparametersmaybe = \relax +} + +% @top is like @unnumbered. +\let\top\unnumbered + +% Sections. +\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz +\def\seczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% +} + +\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz +\def\appendixsectionzzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% +} +\let\appendixsec\appendixsection + +\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz +\def\unnumberedseczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% +} + +% Subsections. +\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz +\def\numberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz +\def\appendixsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +\def\unnumberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno}% +} + +% Subsubsections. +\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz +\def\numberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynumbered}% + {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz +\def\appendixsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +\def\unnumberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% These macros control what the section commands do, according +% to what kind of chapter we are in (ordinary, appendix, or unnumbered). +% Define them by default for a numbered chapter. +\let\section = \numberedsec +\let\subsection = \numberedsubsec +\let\subsubsection = \numberedsubsubsec + +% Define @majorheading, @heading and @subheading + +% NOTE on use of \vbox for chapter headings, section headings, and such: +% 1) We use \vbox rather than the earlier \line to permit +% overlong headings to fold. +% 2) \hyphenpenalty is set to 10000 because hyphenation in a +% heading is obnoxious; this forbids it. +% 3) Likewise, headings look best if no \parindent is used, and +% if justification is not attempted. Hence \raggedright. + + +\def\majorheading{% + {\advance\chapheadingskip by 10pt \chapbreak }% + \parsearg\chapheadingzzz +} + +\def\chapheading{\chapbreak \parsearg\chapheadingzzz} +\def\chapheadingzzz#1{% + {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}% + \bigskip \par\penalty 200\relax + \suppressfirstparagraphindent +} + +% @heading, @subheading, @subsubheading. +\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} + +% These macros generate a chapter, section, etc. heading only +% (including whitespace, linebreaking, etc. around it), +% given all the information in convenient, parsed form. + +%%% Args are the skip and penalty (usually negative) +\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} + +%%% Define plain chapter starts, and page on/off switching for it +% Parameter controlling skip before chapter headings (if needed) + +\newskip\chapheadingskip + +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} + +\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} + +\def\CHAPPAGoff{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chapbreak +\global\let\pagealignmacro=\chappager} + +\def\CHAPPAGon{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager +\global\def\HEADINGSon{\HEADINGSsingle}} + +\def\CHAPPAGodd{% +\global\let\contentsalignmacro = \chapoddpage +\global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage +\global\def\HEADINGSon{\HEADINGSdouble}} + +\CHAPPAGon + +% Chapter opening. +% +% #1 is the text, #2 is the section type (Ynumbered, Ynothing, +% Yappendix, Yomitfromtoc), #3 the chapter number. +% +% To test against our argument. +\def\Ynothingkeyword{Ynothing} +\def\Yomitfromtockeyword{Yomitfromtoc} +\def\Yappendixkeyword{Yappendix} +% +\def\chapmacro#1#2#3{% + \pchapsepmacro + {% + \chapfonts \rm + % + % Have to define \thissection before calling \donoderef, because the + % xref code eventually uses it. On the other hand, it has to be called + % after \pchapsepmacro, or the headline will change too soon. + \gdef\thissection{#1}% + \gdef\thischaptername{#1}% + % + % Only insert the separating space if we have a chapter/appendix + % number, and don't print the unnumbered ``number''. + \def\temptype{#2}% + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unnchap}% + \gdef\thischapter{#1}% + \else\ifx\temptype\Yomitfromtockeyword + \setbox0 = \hbox{}% contents like unnumbered, but no toc entry + \def\toctype{omit}% + \gdef\thischapter{}% + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% + \def\toctype{app}% + % We don't substitute the actual chapter name into \thischapter + % because we don't want its macros evaluated now. And we don't + % use \thissection because that changes with each section. + % + \xdef\thischapter{\putwordAppendix{} \appendixletter: + \noexpand\thischaptername}% + \else + \setbox0 = \hbox{#3\enspace}% + \def\toctype{numchap}% + \xdef\thischapter{\putwordChapter{} \the\chapno: + \noexpand\thischaptername}% + \fi\fi\fi + % + % Write the toc entry for this chapter. Must come before the + % \donoderef, because we include the current node name in the toc + % entry, and \donoderef resets it to empty. + \writetocentry{\toctype}{#1}{#3}% + % + % For pdftex, we have to write out the node definition (aka, make + % the pdfdest) after any page break, but before the actual text has + % been typeset. If the destination for the pdf outline is after the + % text, then jumping from the outline may wind up with the text not + % being visible, for instance under high magnification. + \donoderef{#2}% + % + % Typeset the actual heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent=\wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerparameters{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt +} + + +% I don't think this chapter style is supported any more, so I'm not +% updating it with the new noderef stuff. We'll see. --karl, 11aug03. +% +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} +% +\def\unnchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\nobreak +} +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} +\def\centerchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt + \hfill {\rm #1}\hfill}}\bigskip \par\nobreak +} +\def\CHAPFopen{% + \global\let\chapmacro=\chfopen + \global\let\centerchapmacro=\centerchfopen} + + +% Section titles. These macros combine the section number parts and +% call the generic \sectionheading to do the printing. +% +\newskip\secheadingskip +\def\secheadingbreak{\dobreak \secheadingskip{-1000}} + +% Subsection titles. +\newskip\subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} + +% Subsubsection titles. +\def\subsubsecheadingskip{\subsecheadingskip} +\def\subsubsecheadingbreak{\subsecheadingbreak} + + +% Print any size, any type, section title. +% +% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is +% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the +% section number. +% +\def\sectionheading#1#2#3#4{% + {% + % Switch to the right set of fonts. + \csname #2fonts\endcsname \rm + % + % Insert space above the heading. + \csname #2headingbreak\endcsname + % + % Only insert the space after the number if we have a section number. + \def\sectionlevel{#2}% + \def\temptype{#3}% + % + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unn}% + \gdef\thissection{#1}% + \else\ifx\temptype\Yomitfromtockeyword + % for @headings -- no section number, don't include in toc, + % and don't redefine \thissection. + \setbox0 = \hbox{}% + \def\toctype{omit}% + \let\sectionlevel=\empty + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{#4\enspace}% + \def\toctype{app}% + \gdef\thissection{#1}% + \else + \setbox0 = \hbox{#4\enspace}% + \def\toctype{num}% + \gdef\thissection{#1}% + \fi\fi\fi + % + % Write the toc entry (before \donoderef). See comments in \chfplain. + \writetocentry{\toctype\sectionlevel}{#1}{#4}% + % + % Write the node reference (= pdf destination for pdftex). + % Again, see comments in \chfplain. + \donoderef{#3}% + % + % Output the actual section heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent=\wd0 % zero if no section number + \unhbox0 #1}% + }% + % Add extra space after the heading -- half of whatever came above it. + % Don't allow stretch, though. + \kern .5 \csname #2headingskip\endcsname + % + % Do not let the kern be a potential breakpoint, as it would be if it + % was followed by glue. + \nobreak + % + % We'll almost certainly start a paragraph next, so don't let that + % glue accumulate. (Not a breakpoint because it's preceded by a + % discardable item.) + \vskip-\parskip + % + % This is purely so the last item on the list is a known \penalty > + % 10000. This is so \startdefun can avoid allowing breakpoints after + % section headings. Otherwise, it would insert a valid breakpoint between: + % + % @section sec-whatever + % @deffn def-whatever + \penalty 10001 +} + + +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc. +% +% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} +% We append the current node name (if any) and page number as additional +% arguments for the \{chap,sec,...}entry macros which will eventually +% read this. The node name is used in the pdf outlines as the +% destination to jump to. +% +% We open the .toc file for writing here instead of at @setfilename (or +% any other fixed time) so that @contents can be anywhere in the document. +% But if #1 is `omit', then we don't do anything. This is used for the +% table of contents chapter openings themselves. +% +\newif\iftocfileopened +\def\omitkeyword{omit}% +% +\def\writetocentry#1#2#3{% + \edef\writetoctype{#1}% + \ifx\writetoctype\omitkeyword \else + \iftocfileopened\else + \immediate\openout\tocfile = \jobname.toc + \global\tocfileopenedtrue + \fi + % + \iflinks + {\atdummies + \edef\temp{% + \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% + \temp + } + \fi + \fi + % + % Tell \shipout to create a pdf destination on each page, if we're + % writing pdf. These are used in the table of contents. We can't + % just write one on every page because the title pages are numbered + % 1 and 2 (the page numbers aren't printed), and so are the first + % two pages of the document. Thus, we'd have two destinations named + % `1', and two named `2'. + \ifpdf \global\pdfmakepagedesttrue \fi +} + + +% These characters do not print properly in the Computer Modern roman +% fonts, so we must take special care. This is more or less redundant +% with the Texinfo input format setup at the end of this file. +% +\def\activecatcodes{% + \catcode`\"=\active + \catcode`\$=\active + \catcode`\<=\active + \catcode`\>=\active + \catcode`\\=\active + \catcode`\^=\active + \catcode`\_=\active + \catcode`\|=\active + \catcode`\~=\active +} + + +% Read the toc file, which is essentially Texinfo input. +\def\readtocfile{% + \setupdatafile + \activecatcodes + \input \jobname.toc +} + +\newskip\contentsrightmargin \contentsrightmargin=1in +\newcount\savepageno +\newcount\lastnegativepageno \lastnegativepageno = -1 + +% Prepare to read what we've written to \tocfile. +% +\def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund + \contentsalignmacro + \immediate\closeout\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \def\thischapter{}% + \chapmacro{#1}{Yomitfromtoc}{}% + % + \savepageno = \pageno + \begingroup % Set up to handle contents files properly. + \raggedbottom % Worry more about breakpoints than the bottom. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi +} + + +% Normal (long) toc. +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \jobname.toc + \ifeof 1 \else + \readtocfile + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \ifeof 1 \else + \pdfmakeoutlines + \fi + \closein 1 + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} + +% And just the chapters. +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\numchapentry = \shortchapentry + \let\appentry = \shortchapentry + \let\unnchapentry = \shortunnchapentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf + \let\sl=\shortcontsl \let\tt=\shortconttt + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\numsecentry##1##2##3##4{} + \let\appsecentry = \numsecentry + \let\unnsecentry = \numsecentry + \let\numsubsecentry = \numsecentry + \let\appsubsecentry = \numsecentry + \let\unnsubsecentry = \numsecentry + \let\numsubsubsecentry = \numsecentry + \let\appsubsubsecentry = \numsecentry + \let\unnsubsubsecentry = \numsecentry + \openin 1 \jobname.toc + \ifeof 1 \else + \readtocfile + \fi + \closein 1 + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} +\let\shortcontents = \summarycontents + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g., `A' for an appendix, or `3' for a chapter. +% +\def\shortchaplabel#1{% + % This space should be enough, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % But use \hss just in case. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + % + % We'd like to right-justify chapter numbers, but that looks strange + % with appendix letters. And right-justifying numbers and + % left-justifying letters looks strange when there is less than 10 + % chapters. Have to read the whole toc once to know how many chapters + % there are before deciding ... + \hbox to 1em{#1\hss}% +} + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% Chapters, in the main contents. +\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} +% +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3#4{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% +} + +% Appendices, in the main contents. +% Need the word Appendix, and a fixed-size box. +% +\def\appendixbox#1{% + % We use M since it's probably the widest letter. + \setbox0 = \hbox{\putwordAppendix{} M}% + \hbox to \wd0{\putwordAppendix{} #1\hss}} +% +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} + +% Unnumbered chapters. +\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} +\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} + +% Sections. +\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} +\let\appsecentry=\numsecentry +\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} + +% Subsections. +\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} +\let\appsubsecentry=\numsubsecentry +\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} + +% And subsubsections. +\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} +\let\appsubsubsecentry=\numsubsubsecentry +\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} + +% This parameter controls the indentation of the various levels. +% Same as \defaultparindent. +\newdimen\tocindent \tocindent = 15pt + +% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% page number. +% +% If the toc has to be broken over pages, we want it to be at chapters +% if at all possible; hence the \penalty. +\def\dochapentry#1#2{% + \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip + \begingroup + \chapentryfonts + \tocentry{#1}{\dopageno\bgroup#2\egroup}% + \endgroup + \nobreak\vskip .25\baselineskip plus.1\baselineskip +} + +\def\dosecentry#1#2{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsubsecentry#1#2{\begingroup + \subsubsecentryfonts \leftskip=3\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +% We use the same \entry macro as for the index entries. +\let\tocentry = \entry + +% Space between chapter (or whatever) number and the title. +\def\labelspace{\hskip1em \relax} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} + +\def\chapentryfonts{\secfonts \rm} +\def\secentryfonts{\textfonts} +\def\subsecentryfonts{\textfonts} +\def\subsubsecentryfonts{\textfonts} + + +\message{environments,} +% @foo ... @end foo. + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, it should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} +% +\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{% + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} +% +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @tex ... @end tex escapes into raw Tex temporarily. +% One exception: @ is still an escape character, so that @end tex works. +% But \@ or @@ will get a plain tex @ character. + +\envdef\tex{% + \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 + \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 + \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie + \catcode `\%=14 + \catcode `\+=\other + \catcode `\"=\other + \catcode `\|=\other + \catcode `\<=\other + \catcode `\>=\other + \escapechar=`\\ + % + \let\b=\ptexb + \let\bullet=\ptexbullet + \let\c=\ptexc + \let\,=\ptexcomma + \let\.=\ptexdot + \let\dots=\ptexdots + \let\equiv=\ptexequiv + \let\!=\ptexexclam + \let\i=\ptexi + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \let\{=\ptexlbrace + \let\+=\tabalign + \let\}=\ptexrbrace + \let\/=\ptexslash + \let\*=\ptexstar + \let\t=\ptext + \let\frenchspacing=\plainfrenchspacing + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% + \def\@{@}% +} +% There is no need to define \Etex. + +% Define @lisp ... @end lisp. +% @lisp environment forms a group so it can rebind things, +% including the definition of @end lisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip. +% +\def\aboveenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz and + % \sectionheading, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + % it's not a good place to break if the last penalty was \nobreak + % or better ... + \ifnum\lastpenalty<10000 \penalty-50 \fi + \vskip\envskipamount + \fi + \fi +}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will +% also clear it, so that its embedded environments do the narrowing again. +\let\nonarrowing=\relax + +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\envdef\cartouche{% + \ifhmode\par\fi % can't be in the midst of a paragraph. + \startsavinginserts + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt % we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either + % side, and for 6pt waste from + % each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing = t% + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \kern3pt + \hsize=\cartinner + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip + \comment % For explanation, see the end of \def\group. +} +\def\Ecartouche{% + \ifhmode\par\fi + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup + \checkinserts +} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\def\nonfillstart{% + \aboveenvbreak + \hfuzz = 12pt % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + \parindent = 0pt + \emergencystretch = 0pt % don't try to avoid overfull boxes + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \else + \let\nonarrowing = \relax + \fi + \let\exdent=\nofillexdent +} + +% If you want all examples etc. small: @set dispenvsize small. +% If you want even small examples the full size: @set dispenvsize nosmall. +% This affects the following displayed environments: +% @example, @display, @format, @lisp +% +\def\smallword{small} +\def\nosmallword{nosmall} +\let\SETdispenvsize\relax +\def\setnormaldispenv{% + \ifx\SETdispenvsize\smallword + \smallexamplefonts \rm + \fi +} +\def\setsmalldispenv{% + \ifx\SETdispenvsize\nosmallword + \else + \smallexamplefonts \rm + \fi +} + +% We often define two environments, @foo and @smallfoo. +% Let's do it by one command: +\def\makedispenv #1#2{ + \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} + \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} + \expandafter\let\csname E#1\endcsname \afterenvbreak + \expandafter\let\csname Esmall#1\endcsname \afterenvbreak +} + +% Define two synonyms: +\def\maketwodispenvs #1#2#3{ + \makedispenv{#1}{#3} + \makedispenv{#2}{#3} +} + +% @lisp: indented, narrowed, typewriter font; @example: same as @lisp. +% +% @smallexample and @smalllisp: use smaller fonts. +% Originally contributed by Pavel@xerox. +% +\maketwodispenvs {lisp}{example}{% + \nonfillstart + \tt + \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} + +% @display/@smalldisplay: same as @lisp except keep current font. +% +\makedispenv {display}{% + \nonfillstart + \gobble +} + +% @format/@smallformat: same as @display except don't narrow margins. +% +\makedispenv{format}{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} + +% @flushleft: same as @format, but doesn't obey \SETdispenvsize. +\envdef\flushleft{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} +\let\Eflushleft = \afterenvbreak + +% @flushright. +% +\envdef\flushright{% + \let\nonarrowing = t% + \nonfillstart + \advance\leftskip by 0pt plus 1fill + \gobble +} +\let\Eflushright = \afterenvbreak + + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. We keep \parskip nonzero in general, since +% we're doing normal filling. So, when using \aboveenvbreak and +% \afterenvbreak, temporarily make \parskip 0. +% +\envdef\quotation{% + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \advance\rightskip by \lispnarrowing + \exdentamount = \lispnarrowing + \else + \let\nonarrowing = \relax + \fi + \parsearg\quotationlabel +} + +% We have retained a nonzero parskip for the environment, since we're +% doing normal filling. +% +\def\Equotation{% + \par + \ifx\quotationauthor\undefined\else + % indent a bit. + \leftline{\kern 2\leftskip \sl ---\quotationauthor}% + \fi + {\parskip=0pt \afterenvbreak}% +} + +% If we're given an argument, typeset it in bold with a colon after. +\def\quotationlabel#1{% + \def\temp{#1}% + \ifx\temp\empty \else + {\bf #1: }% + \fi +} + + +% LaTeX-like @verbatim...@end verbatim and @verb{...} +% If we want to allow any as delimiter, +% we need the curly braces so that makeinfo sees the @verb command, eg: +% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org +% +% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. +% +% [Knuth] p.344; only we need to do the other characters Texinfo sets +% active too. Otherwise, they get lost as the first character on a +% verbatim line. +\def\dospecials{% + \do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% + \do\<\do\>\do\|\do\@\do+\do\"% +} +% +% [Knuth] p. 380 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1=\other}\dospecials} +% +% [Knuth] pp. 380,381,391 +% Disable Spanish ligatures ?` and !` of \tt font +\begingroup + \catcode`\`=\active\gdef`{\relax\lq} +\endgroup +% +% Setup for the @verb command. +% +% Eight spaces for a tab +\begingroup + \catcode`\^^I=\active + \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} +\endgroup +% +\def\setupverb{% + \tt % easiest (and conventionally used) font for verbatim + \def\par{\leavevmode\endgraf}% + \catcode`\`=\active + \tabeightspaces + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces +} + +% Setup for the @verbatim environment +% +% Real tab expansion +\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount +% +\def\starttabbox{\setbox0=\hbox\bgroup} +\begingroup + \catcode`\^^I=\active + \gdef\tabexpand{% + \catcode`\^^I=\active + \def^^I{\leavevmode\egroup + \dimen0=\wd0 % the width so far, or since the previous tab + \divide\dimen0 by\tabw + \multiply\dimen0 by\tabw % compute previous multiple of \tabw + \advance\dimen0 by\tabw % advance to next multiple of \tabw + \wd0=\dimen0 \box0 \starttabbox + }% + } +\endgroup +\def\setupverbatim{% + \let\nonarrowing = t% + \nonfillstart + % Easiest (and conventionally used) font for verbatim + \tt + \def\par{\leavevmode\egroup\box0\endgraf}% + \catcode`\`=\active + \tabexpand + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: +% +% \def\doverb'{'#1'}'{#1} +% +% [Knuth] p. 382; only eat outer {} +\begingroup + \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other + \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] +\endgroup +% +\def\verb{\begingroup\setupverb\doverb} +% +% +% Do the @verbatim magic: define the macro \doverbatim so that +% the (first) argument ends when '@end verbatim' is reached, ie: +% +% \def\doverbatim#1@end verbatim{#1} +% +% For Texinfo it's a lot easier than for LaTeX, +% because texinfo's \verbatim doesn't stop at '\end{verbatim}': +% we need not redefine '\', '{' and '}'. +% +% Inspired by LaTeX's verbatim command set [latex.ltx] +% +\begingroup + \catcode`\ =\active + \obeylines % + % ignore everything up to the first ^^M, that's the newline at the end + % of the @verbatim input line itself. Otherwise we get an extra blank + % line in the output. + \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% + % We really want {...\end verbatim} in the body of the macro, but + % without the active space; thus we have to use \xdef and \gobble. +\endgroup +% +\envdef\verbatim{% + \setupverbatim\doverbatim +} +\let\Everbatim = \afterenvbreak + + +% @verbatiminclude FILE - insert text of file in verbatim environment. +% +\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} +% +\def\doverbatiminclude#1{% + {% + \makevalueexpandable + \setupverbatim + \input #1 + \afterenvbreak + }% +} + +% @copying ... @end copying. +% Save the text away for @insertcopying later. +% +% We save the uninterpreted tokens, rather than creating a box. +% Saving the text in a box would be much easier, but then all the +% typesetting commands (@smallbook, font changes, etc.) have to be done +% beforehand -- and a) we want @copying to be done first in the source +% file; b) letting users define the frontmatter in as flexible order as +% possible is very desirable. +% +\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} +\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} +% +\def\insertcopying{% + \begingroup + \parindent = 0pt % paragraph indentation looks wrong on title page + \scanexp\copyingtext + \endgroup +} + +\message{defuns,} +% @defun etc. + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deflastargmargin \deflastargmargin=18pt + +% Start the processing of @deffn: +\def\startdefun{% + \ifnum\lastpenalty<10000 + \medbreak + \else + % If there are two @def commands in a row, we'll have a \nobreak, + % which is there to keep the function description together with its + % header. But if there's nothing but headers, we need to allow a + % break somewhere. Check specifically for penalty 10002, inserted + % by \defargscommonending, instead of 10000, since the sectioning + % commands also insert a nobreak penalty, and we don't want to allow + % a break between a section heading and a defun. + % + \ifnum\lastpenalty=10002 \penalty2000 \fi + % + % Similarly, after a section heading, do not allow a break. + % But do insert the glue. + \medskip % preceded by discardable penalty, so not a breakpoint + \fi + % + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent +} + +\def\dodefunx#1{% + % First, check whether we are in the right environment: + \checkenv#1% + % + % As above, allow line break if we have multiple x headers in a row. + % It's not a great place, though. + \ifnum\lastpenalty=10002 \penalty3000 \fi + % + % And now, it's time to reuse the body of the original defun: + \expandafter\gobbledefun#1% +} +\def\gobbledefun#1\startdefun{} + +% \printdefunline \deffnheader{text} +% +\def\printdefunline#1#2{% + \begingroup + % call \deffnheader: + #1#2 \endheader + % common ending: + \interlinepenalty = 10000 + \advance\rightskip by 0pt plus 1fil + \endgraf + \nobreak\vskip -\parskip + \penalty 10002 % signal to \startdefun and \dodefunx + % Some of the @defun-type tags do not enable magic parentheses, + % rendering the following check redundant. But we don't optimize. + \checkparencounts + \endgroup +} + +\def\Edefun{\endgraf\medbreak} + +% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; +% the only thing remainnig is to define \deffnheader. +% +\def\makedefun#1{% + \expandafter\let\csname E#1\endcsname = \Edefun + \edef\temp{\noexpand\domakedefun + \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% + \temp +} + +% \domakedefun \deffn \deffnx \deffnheader +% +% Define \deffn and \deffnx, without parameters. +% \deffnheader has to be defined explicitly. +% +\def\domakedefun#1#2#3{% + \envdef#1{% + \startdefun + \parseargusing\activeparens{\printdefunline#3}% + }% + \def#2{\dodefunx#1}% + \def#3% +} + +%%% Untyped functions: + +% @deffn category name args +\makedefun{deffn}{\deffngeneral{}} + +% @deffn category class name args +\makedefun{defop}#1 {\defopon{#1\ \putwordon}} + +% \defopon {category on}class name args +\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deffngeneral {subind}category name args +% +\def\deffngeneral#1#2 #3 #4\endheader{% + % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. + \dosubind{fn}{\code{#3}}{#1}% + \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% +} + +%%% Typed functions: + +% @deftypefn category type name args +\makedefun{deftypefn}{\deftypefngeneral{}} + +% @deftypeop category class type name args +\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} + +% \deftypeopon {category on}class type name args +\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deftypefngeneral {subind}category type name args +% +\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% + \dosubind{fn}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Typed variables: + +% @deftypevr category type var args +\makedefun{deftypevr}{\deftypecvgeneral{}} + +% @deftypecv category class type var args +\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} + +% \deftypecvof {category of}class type var args +\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } + +% \deftypecvgeneral {subind}category type var args +% +\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% + \dosubind{vr}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Untyped variables: + +% @defvr category var args +\makedefun{defvr}#1 {\deftypevrheader{#1} {} } + +% @defcv category class var args +\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} + +% \defcvof {category of}class var args +\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } + +%%% Type: +% @deftp category name args +\makedefun{deftp}#1 #2 #3\endheader{% + \doind{tp}{\code{#2}}% + \defname{#1}{}{#2}\defunargs{#3\unskip}% +} + +% Remaining @defun-like shortcuts: +\makedefun{defun}{\deffnheader{\putwordDeffunc} } +\makedefun{defmac}{\deffnheader{\putwordDefmac} } +\makedefun{defspec}{\deffnheader{\putwordDefspec} } +\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } +\makedefun{defvar}{\defvrheader{\putwordDefvar} } +\makedefun{defopt}{\defvrheader{\putwordDefopt} } +\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } +\makedefun{defmethod}{\defopon\putwordMethodon} +\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} +\makedefun{defivar}{\defcvof\putwordInstanceVariableof} +\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} + +% \defname, which formats the name of the @def (not the args). +% #1 is the category, such as "Function". +% #2 is the return type, if any. +% #3 is the function name. +% +% We are followed by (but not passed) the arguments, if any. +% +\def\defname#1#2#3{% + % Get the values of \leftskip and \rightskip as they were outside the @def... + \advance\leftskip by -\defbodyindent + % + % How we'll format the type name. Putting it in brackets helps + % distinguish it from the body text that may end up on the next line + % just below it. + \def\temp{#1}% + \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} + % + % Figure out line sizes for the paragraph shape. + % The first line needs space for \box0; but if \rightskip is nonzero, + % we need only space for the part of \box0 which exceeds it: + \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip + % The continuations: + \dimen2=\hsize \advance\dimen2 by -\defargsindent + % (plain.tex says that \dimen1 should be used only as global.) + \parshape 2 0in \dimen0 \defargsindent \dimen2 + % + % Put the type name to the right margin. + \noindent + \hbox to 0pt{% + \hfil\box0 \kern-\hsize + % \hsize has to be shortened this way: + \kern\leftskip + % Intentionally do not respect \rightskip, since we need the space. + }% + % + % Allow all lines to be underfull without complaint: + \tolerance=10000 \hbadness=10000 + \exdentamount=\defbodyindent + {% + % defun fonts. We use typewriter by default (used to be bold) because: + % . we're printing identifiers, they should be in tt in principle. + % . in languages with many accents, such as Czech or French, it's + % common to leave accents off identifiers. The result looks ok in + % tt, but exceedingly strange in rm. + % . we don't want -- and --- to be treated as ligatures. + % . this still does not fix the ?` and !` ligatures, but so far no + % one has made identifiers using them :). + \df \tt + \def\temp{#2}% return value type + \ifx\temp\empty\else \tclose{\temp} \fi + #3% output function name + }% + {\rm\enskip}% hskip 0.5 em of \tenrm + % + \boldbrax + % arguments will be output next, if any. +} + +% Print arguments in slanted roman (not ttsl), inconsistently with using +% tt for the name. This is because literal text is sometimes needed in +% the argument list (groff manual), and ttsl and tt are not very +% distinguishable. Prevent hyphenation at `-' chars. +% +\def\defunargs#1{% + % use sl by default (not ttsl), + % tt for the names. + \df \sl \hyphenchar\font=0 + % + % On the other hand, if an argument has two dashes (for instance), we + % want a way to get ttsl. Let's try @var for that. + \let\var=\ttslanted + #1% + \sl\hyphenchar\font=45 +} + +% We want ()&[] to print specially on the defun line. +% +\def\activeparens{% + \catcode`\(=\active \catcode`\)=\active + \catcode`\[=\active \catcode`\]=\active + \catcode`\&=\active +} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + +% Be sure that we always have a definition for `(', etc. For example, +% if the fn name has parens in it, \boldbrax will not be in effect yet, +% so TeX would otherwise complain about undefined control sequence. +{ + \activeparens + \global\let(=\lparen \global\let)=\rparen + \global\let[=\lbrack \global\let]=\rbrack + \global\let& = \& + + \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} + \gdef\magicamp{\let&=\amprm} +} + +\newcount\parencount + +% If we encounter &foo, then turn on ()-hacking afterwards +\newif\ifampseen +\def\amprm#1 {\ampseentrue{\bf\ }} + +\def\parenfont{% + \ifampseen + % At the first level, print parens in roman, + % otherwise use the default font. + \ifnum \parencount=1 \rm \fi + \else + % The \sf parens (in \boldbrax) actually are a little bolder than + % the contained text. This is especially needed for [ and ] . + \sf + \fi +} +\def\infirstlevel#1{% + \ifampseen + \ifnum\parencount=1 + #1% + \fi + \fi +} +\def\bfafterword#1 {#1 \bf} + +\def\opnr{% + \global\advance\parencount by 1 + {\parenfont(}% + \infirstlevel \bfafterword +} +\def\clnr{% + {\parenfont)}% + \infirstlevel \sl + \global\advance\parencount by -1 +} + +\newcount\brackcount +\def\lbrb{% + \global\advance\brackcount by 1 + {\bf[}% +} +\def\rbrb{% + {\bf]}% + \global\advance\brackcount by -1 +} + +\def\checkparencounts{% + \ifnum\parencount=0 \else \badparencount \fi + \ifnum\brackcount=0 \else \badbrackcount \fi +} +\def\badparencount{% + \errmessage{Unbalanced parentheses in @def}% + \global\parencount=0 +} +\def\badbrackcount{% + \errmessage{Unbalanced square braces in @def}% + \global\brackcount=0 +} + + +\message{macros,} +% @macro. + +% To do this right we need a feature of e-TeX, \scantokens, +% which we arrange to emulate with a temporary file in ordinary TeX. +\ifx\eTeXversion\undefined + \newwrite\macscribble + \def\scantokens#1{% + \toks0={#1}% + \immediate\openout\macscribble=\jobname.tmp + \immediate\write\macscribble{\the\toks0}% + \immediate\closeout\macscribble + \input \jobname.tmp + } +\fi + +\def\scanmacro#1{% + \begingroup + \newlinechar`\^^M + \let\xeatspaces\eatspaces + % Undo catcode changes of \startcontents and \doprintindex + % When called from @insertcopying or (short)caption, we need active + % backslash to get it printed correctly. Previously, we had + % \catcode`\\=\other instead. We'll see whether a problem appears + % with macro expansion. --kasal, 19aug04 + \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ + % ... and \example + \spaceisspace + % + % Append \endinput to make sure that TeX does not see the ending newline. + % + % I've verified that it is necessary both for e-TeX and for ordinary TeX + % --kasal, 29nov03 + \scantokens{#1\endinput}% + \endgroup +} + +\def\scanexp#1{% + \edef\temp{\noexpand\scanmacro{#1}}% + \temp +} + +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? + +% List of all defined macros in the form +% \definedummyword\macro1\definedummyword\macro2... +% Currently is also contains all @aliases; the list can be split +% if there is a need. +\def\macrolist{} + +% Add the macro to \macrolist +\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} +\def\addtomacrolistxxx#1{% + \toks0 = \expandafter{\macrolist\definedummyword#1}% + \xdef\macrolist{\the\toks0}% +} + +% Utility routines. +% This does \let #1 = #2, with \csnames; that is, +% \let \csname#1\endcsname = \csname#2\endcsname +% (except of course we have to play expansion games). +% +\def\cslet#1#2{% + \expandafter\let + \csname#1\expandafter\endcsname + \csname#2\endcsname +} + +% Trim leading and trailing spaces off a string. +% Concepts from aro-bend problem 15 (see CTAN). +{\catcode`\@=11 +\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} +\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} +\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} +\def\unbrace#1{#1} +\unbrace{\gdef\trim@@@ #1 } #2@{#1} +} + +% Trim a single trailing ^^M off a string. +{\catcode`\^^M=\other \catcode`\Q=3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} + +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \. + +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. + +\def\scanctxt{% + \catcode`\"=\other + \catcode`\+=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\@=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\~=\other +} + +\def\scanargctxt{% + \scanctxt + \catcode`\\=\other + \catcode`\^^M=\other +} + +\def\macrobodyctxt{% + \scanctxt + \catcode`\{=\other + \catcode`\}=\other + \catcode`\^^M=\other + \usembodybackslash +} + +\def\macroargctxt{% + \scanctxt + \catcode`\\=\other +} + +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ => \csname macarg.foo\endcsname => #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. + +{\catcode`@=0 @catcode`@\=@active + @gdef@usembodybackslash{@let\=@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=0% + \else + \expandafter\parsemargdef \argl;% + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% + \addtomacrolist{\the\macname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\parseargdef\unmacro{% + \if1\csname ismacro.#1\endcsname + \global\cslet{#1}{macsave.#1}% + \global\expandafter\let \csname ismacro.#1\endcsname=0% + % Remove the macro name from \macrolist: + \begingroup + \expandafter\let\csname#1\endcsname \relax + \let\definedummyword\unmacrodo + \xdef\macrolist{\macrolist}% + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} + +% Called by \do from \dounmacro on each macro. The idea is to omit any +% macro definitions that have been changed to \relax. +% +\def\unmacrodo#1{% + \ifx #1\relax + % remove this + \else + \noexpand\definedummyword \noexpand#1% + \fi +} + +% This makes use of the obscure feature that if the last token of a +% is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. +\def\getargs#1{\getargsxxx#1{}} +\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} +\def\getmacname #1 #2\relax{\macname={#1}} +\def\getmacargs#1{\def\argl{#1}} + +% Parse the optional {params} list. Set up \paramno and \paramlist +% so \defmacro knows what to do. Define \macarg.blah for each blah +% in the params list, to be ##N where N is the position in that list. +% That gets used by \mbodybackslash (above). + +% We need to get `macro parameter char #' into several definitions. +% The technique used is stolen from LaTeX: let \hash be something +% unexpandable, insert that wherever you need a #, and then redefine +% it to # just before using the token list produced. +% +% The same technique is used to protect \eatspaces till just before +% the macro is used. + +\def\parsemargdef#1;{\paramno=0\def\paramlist{}% + \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} +\def\parsemargdefxxx#1,{% + \if#1;\let\next=\relax + \else \let\next=\parsemargdefxxx + \advance\paramno by 1% + \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname + {\xeatspaces{\hash\the\paramno}}% + \edef\paramlist{\paramlist\hash\the\paramno,}% + \fi\next} + +% These two commands read recursive and nonrecursive macro bodies. +% (They're different since rec and nonrec macros end differently.) + +\long\def\parsemacbody#1@end macro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\long\def\parsermacbody#1@end rmacro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% + +% This defines the macro itself. There are six cases: recursive and +% nonrecursive macros of zero, one, and many arguments. +% Much magic with \expandafter here. +% \xdef is used so that macro definitions will survive the file +% they're defined in; @include reads the file inside a group. +\def\defmacro{% + \let\hash=##% convert placeholders to macro parameter chars + \ifrecursive + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\temp}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup\noexpand\scanmacro{\temp}}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \fi + \else + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \fi + \fi} + +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} + +% \braceorline decides whether the next nonwhitespace character is a +% {. If so it reads up to the closing }, if not, it reads the whole +% line. Whatever was read is then fed to the next control sequence +% as an argument (by \parsebrace or \parsearg) +\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup\else + \expandafter\parsearg + \fi \next} + + +% @alias. +% We need some trickery to remove the optional spaces around the equal +% sign. Just make them active and then expand them all to nothing. +\def\alias{\parseargusing\obeyspaces\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=#2\relax{% + {% + \expandafter\let\obeyedspace=\empty + \addtomacrolist{#1}% + \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% + }% + \next +} + + +\message{cross references,} + +\newwrite\auxfile + +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% @inforef is relatively simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + +% @node's only job in TeX is to define \lastnode, which is used in +% cross-references. The @node line might or might not have commas, and +% might or might not have spaces before the first comma, like: +% @node foo , bar , ... +% We don't want such trailing spaces in the node name. +% +\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} +% +% also remove a trailing comma, in case of something like this: +% @node Help-Cross, , , Cross-refs +\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} +\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} + +\let\nwnode=\node +\let\lastnode=\empty + +% Write a cross-reference definition for the current node. #1 is the +% type (Ynumbered, Yappendix, Ynothing). +% +\def\donoderef#1{% + \ifx\lastnode\empty\else + \setref{\lastnode}{#1}% + \global\let\lastnode=\empty + \fi +} + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +% +\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} +\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} +\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an +% anchor), which consists of three parts: +% 1) NAME-title - the current sectioning name taken from \thissection, +% or the anchor name. +% 2) NAME-snt - section number and type, passed as the SNT arg, or +% empty for anchors. +% 3) NAME-pg - the page number. +% +% This is called from \donoderef, \anchor, and \dofloat. In the case of +% floats, there is an additional part, which is not written here: +% 4) NAME-lof - the text as it should appear in a @listoffloats. +% +\def\setref#1#2{% + \pdfmkdest{#1}% + \iflinks + {% + \atdummies % preserve commands, but don't expand them + \edef\writexrdef##1##2{% + \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef + ##1}{##2}}% these are parameters of \writexrdef + }% + \toks0 = \expandafter{\thissection}% + \immediate \writexrdef{title}{\the\toks0 }% + \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. + \writexrdef{pg}{\folio}% will be written later, during \shipout + }% + \fi +} + +% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is +% the node name, #2 the name of the Info cross-reference, #3 the printed +% node name, #4 the name of the Info file, #5 the name of the printed +% manual. All but the node name can be omitted. +% +\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} +\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \unsepspaces + \def\printedmanual{\ignorespaces #5}% + \def\printedrefname{\ignorespaces #3}% + \setbox1=\hbox{\printedmanual\unskip}% + \setbox0=\hbox{\printedrefname\unskip}% + \ifdim \wd0 = 0pt + % No printed node name was explicitly given. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax + % Use the node name inside the square brackets. + \def\printedrefname{\ignorespaces #1}% + \else + % Use the actual chapter/section title appear inside + % the square brackets. Use the real section title if we have it. + \ifdim \wd1 > 0pt + % It is in another manual, so we don't have it. + \def\printedrefname{\ignorespaces #1}% + \else + \ifhavexrefs + % We know the real title if we have the xref values. + \def\printedrefname{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printedrefname{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % Make link in pdf output. + \ifpdf + \leavevmode + \getfilename{#4}% + {\turnoffactive + % See comments at \activebackslashdouble. + {\activebackslashdouble \xdef\pdfxrefdest{#1}% + \backslashparens\pdfxrefdest}% + % + \ifnum\filenamelength>0 + \startlink attr{/Border [0 0 0]}% + goto file{\the\filename.pdf} name{\pdfxrefdest}% + \else + \startlink attr{/Border [0 0 0]}% + goto name{\pdfmkpgn{\pdfxrefdest}}% + \fi + }% + \linkcolor + \fi + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". We distinguish them by the + % LABEL-title being set to a magic string. + {% + % Have to otherify everything special to allow the \csname to + % include an _ in the xref name, etc. + \indexnofonts + \turnoffactive + \expandafter\global\expandafter\let\expandafter\Xthisreftitle + \csname XR#1-title\endcsname + }% + \iffloat\Xthisreftitle + % If the user specified the print name (third arg) to the ref, + % print it instead of our usual "Figure 1.2". + \ifdim\wd0 = 0pt + \refx{#1-snt}% + \else + \printedrefname + \fi + % + % if the user also gave the printed manual name (fifth arg), append + % "in MANUALNAME". + \ifdim \wd1 > 0pt + \space \putwordin{} \cite{\printedmanual}% + \fi + \else + % node/anchor (non-float) references. + % + % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not + % insert empty discretionaries after hyphens, which means that it will + % not find a line break at a hyphen in a node names. Since some manuals + % are best written with fairly long node names, containing hyphens, this + % is a loss. Therefore, we give the text of the node name again, so it + % is as if TeX is seeing it for the first time. + \ifdim \wd1 > 0pt + \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% + \else + % _ (for example) has to be the character _ for the purposes of the + % control sequence corresponding to the node, but it has to expand + % into the usual \leavevmode...\vrule stuff for purposes of + % printing. So we \turnoffactive for the \refx-snt, back on for the + % printing, back off for the \refx-pg. + {\turnoffactive + % Only output a following space if the -snt ref is nonempty; for + % @unnumbered and @anchor, it won't be. + \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% + \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi + }% + % output the `[mynode]' via a macro so it can be overridden. + \xrefprintnodename\printedrefname + % + % But we always want a comma and a space: + ,\space + % + % output the `page 3'. + \turnoffactive \putwordpage\tie\refx{#1-pg}{}% + \fi + \fi + \endlink +\endgroup} + +% This macro is called from \xrefX for the `[nodename]' part of xref +% output. It's a separate macro only so it can be changed more easily, +% since square brackets don't work well in some documents. Particularly +% one that Bob is working on :). +% +\def\xrefprintnodename#1{[#1]} + +% Things referred to by \setref. +% +\def\Ynothing{} +\def\Yomitfromtoc{} +\def\Ynumbered{% + \ifnum\secno=0 + \putwordChapter@tie \the\chapno + \else \ifnum\subsecno=0 + \putwordSection@tie \the\chapno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno + \else + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} +\def\Yappendix{% + \ifnum\secno=0 + \putwordAppendix@tie @char\the\appendixno{}% + \else \ifnum\subsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno + \else + \putwordSection@tie + @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. +% +\def\refx#1#2{% + {% + \indexnofonts + \otherbackslash + \expandafter\global\expandafter\let\expandafter\thisrefX + \csname XR#1\endcsname + }% + \ifx\thisrefX\relax + % If not defined, say something at least. + \angleleft un\-de\-fined\angleright + \iflinks + \ifhavexrefs + \message{\linenumber Undefined cross reference `#1'.}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.}% + \fi + \fi + \fi + \else + % It's defined, so just use it. + \thisrefX + \fi + #2% Output the suffix in any case. +} + +% This is the macro invoked by entries in the aux file. Usually it's +% just a \def (we prepend XR to the control sequence name to avoid +% collisions). But if this is a float type, we have more work to do. +% +\def\xrdef#1#2{% + \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value. + % + % Was that xref control sequence that we just defined for a float? + \expandafter\iffloat\csname XR#1\endcsname + % it was a float, and we have the (safe) float type in \iffloattype. + \expandafter\let\expandafter\floatlist + \csname floatlist\iffloattype\endcsname + % + % Is this the first time we've seen this float type? + \expandafter\ifx\floatlist\relax + \toks0 = {\do}% yes, so just \do + \else + % had it before, so preserve previous elements in list. + \toks0 = \expandafter{\floatlist\do}% + \fi + % + % Remember this xref in the control sequence \floatlistFLOATTYPE, + % for later use in \listoffloats. + \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}% + \fi +} + +% Read the last existing aux file, if any. No error if none exists. +% +\def\tryauxfile{% + \openin 1 \jobname.aux + \ifeof 1 \else + \readdatafile{aux}% + \global\havexrefstrue + \fi + \closein 1 +} + +\def\setupdatafile{% + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. + % in xref tags, i.e., node names. But since ^^e4 notation isn't + % supported in the main text, it doesn't seem desirable. Furthermore, + % that is not enough: for node names that actually contain a ^ + % character, we would end up writing a line like this: 'xrdef {'hat + % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first + % argument, and \hat is not an expandable control sequence. It could + % all be worked out, but why? Either we support ^^ or we don't. + % + % The other change necessary for this was to define \auxhat: + % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter + % and then to call \auxhat in \setq. + % + \catcode`\^=\other + % + % Special characters. Should be turned off anyway, but... + \catcode`\~=\other + \catcode`\[=\other + \catcode`\]=\other + \catcode`\"=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\$=\other + \catcode`\#=\other + \catcode`\&=\other + \catcode`\%=\other + \catcode`+=\other % avoid \+ for paranoia even though we've turned it off + % + % This is to support \ in node names and titles, since the \ + % characters end up in a \csname. It's easier than + % leaving it active and making its active definition an actual \ + % character. What I don't understand is why it works in the *value* + % of the xrdef. Seems like it should be a catcode12 \, and that + % should not typeset properly. But it works, so I'm moving on for + % now. --karl, 15jan04. + \catcode`\\=\other + % + % Make the characters 128-255 be printing characters. + {% + \count1=128 + \def\loop{% + \catcode\count1=\other + \advance\count1 by 1 + \ifnum \count1<256 \loop \fi + }% + }% + % + % @ is our escape character in .aux files, and we need braces. + \catcode`\{=1 + \catcode`\}=2 + \catcode`\@=0 +} + +\def\readdatafile#1{% +\begingroup + \setupdatafile + \input\jobname.#1 +\endgroup} + +\message{insertions,} +% including footnotes. + +\newcount \footnoteno + +% The trailing space in the following definition for supereject is +% vital for proper filling; pages come out unaligned when you do a +% pagealignmacro call if that space before the closing brace is +% removed. (Generally, numeric constants should always be followed by a +% space to prevent strange expansion errors.) +\def\supereject{\par\penalty -20000\footnoteno =0 } + +% @footnotestyle is meaningful for info output only. +\let\footnotestyle=\comment + +{\catcode `\@=11 +% +% Auto-number footnotes. Otherwise like plain. +\gdef\footnote{% + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % + % In case the footnote comes at the end of a sentence, preserve the + % extra spacing after we do the footnote number. + \let\@sf\empty + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \dofootnote +}% + +% Don't bother with the trickery in plain.tex to not require the +% footnote text as a parameter. Our footnotes don't need to be so general. +% +% Oh yes, they do; otherwise, @ifset (and anything else that uses +% \parseargline) fails inside footnotes because the tokens are fixed when +% the footnote is read. --karl, 16nov96. +% +\gdef\dofootnote{% + \insert\footins\bgroup + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. + \hsize=\pagewidth + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip + \rightskip\z@skip + \spaceskip\z@skip + \xspaceskip\z@skip + \parindent\defaultparindent + % + \smallfonts \rm + % + % Because we use hanging indentation in footnotes, a @noindent appears + % to exdent this text, so make it be a no-op. makeinfo does not use + % hanging indentation so @noindent can still be needed within footnote + % text after an @example or the like (not that this is good style). + \let\noindent = \relax + % + % Hang the footnote text off the number. Use \everypar in case the + % footnote extends for more than one paragraph. + \everypar = {\hang}% + \textindent{\thisfootno}% + % + % Don't crash into the line above the footnote text. Since this + % expands into a box, it must come within the paragraph, lest it + % provide a place where TeX can split the footnote. + \footstrut + \futurelet\next\fo@t +} +}%end \catcode `\@=11 + +% In case a @footnote appears in a vbox, save the footnote text and create +% the real \insert just after the vbox finished. Otherwise, the insertion +% would be lost. +% Similarily, if a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is finished. +% And the same can be done for other insert classes. --kasal, 16nov03. + +% Replace the \insert primitive by a cheating macro. +% Deeper inside, just make sure that the saved insertions are not spilled +% out prematurely. +% +\def\startsavinginserts{% + \ifx \insert\ptexinsert + \let\insert\saveinsert + \else + \let\checkinserts\relax + \fi +} + +% This \insert replacement works for both \insert\footins{foo} and +% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. +% +\def\saveinsert#1{% + \edef\next{\noexpand\savetobox \makeSAVEname#1}% + \afterassignment\next + % swallow the left brace + \let\temp = +} +\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} +\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} + +\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} + +\def\placesaveins#1{% + \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname + {\box#1}% +} + +% eat @SAVE -- beware, all of them have catcode \other: +{ + \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) + \gdef\gobblesave @SAVE{} +} + +% initialization: +\def\newsaveins #1{% + \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% + \next +} +\def\newsaveinsX #1{% + \csname newbox\endcsname #1% + \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts + \checksaveins #1}% +} + +% initialize: +\let\checkinserts\empty +\newsaveins\footins +\newsaveins\margin + + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = epsf.tex +\ifeof 1 \else + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +\closein 1 +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\undefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing this stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M = 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue + \nobreak\bigskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \line\bgroup\hss + \fi + % + % Output the image. + \ifpdf + \dopdfimage{#1}{#2}{#3}% + \else + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% + \fi + % + \ifimagevmode \hss \egroup \bigbreak \fi % space after the image +\endgroup} + + +% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, +% etc. We don't actually implement floating yet, we always include the +% float "here". But it seemed the best name for the future. +% +\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} + +% There may be a space before second and/or third parameter; delete it. +\def\eatcommaspace#1, {#1,} + +% #1 is the optional FLOATTYPE, the text label for this float, typically +% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, +% this float will not be numbered and cannot be referred to. +% +% #2 is the optional xref label. Also must be present for the float to +% be referable. +% +% #3 is the optional positioning argument; for now, it is ignored. It +% will somehow specify the positions allowed to float to (here, top, bottom). +% +% We keep a separate counter for each FLOATTYPE, which we reset at each +% chapter-level command. +\let\resetallfloatnos=\empty +% +\def\dofloat#1,#2,#3,#4\finish{% + \let\thiscaption=\empty + \let\thisshortcaption=\empty + % + % don't lose footnotes inside @float. + % + % BEWARE: when the floats start float, we have to issue warning whenever an + % insert appears inside a float which could possibly float. --kasal, 26may04 + % + \startsavinginserts + % + % We can't be used inside a paragraph. + \par + % + \vtop\bgroup + \def\floattype{#1}% + \def\floatlabel{#2}% + \def\floatloc{#3}% we do nothing with this yet. + % + \ifx\floattype\empty + \let\safefloattype=\empty + \else + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + \fi + % + % If label is given but no type, we handle that as the empty type. + \ifx\floatlabel\empty \else + % We want each FLOATTYPE to be numbered separately (Figure 1, + % Table 1, Figure 2, ...). (And if no label, no number.) + % + \expandafter\getfloatno\csname\safefloattype floatno\endcsname + \global\advance\floatno by 1 + % + {% + % This magic value for \thissection is output by \setref as the + % XREFLABEL-title value. \xrefX uses it to distinguish float + % labels (which have a completely different output format) from + % node and anchor labels. And \xrdef uses it to construct the + % lists of floats. + % + \edef\thissection{\floatmagic=\safefloattype}% + \setref{\floatlabel}{Yfloat}% + }% + \fi + % + % start with \parskip glue, I guess. + \vskip\parskip + % + % Don't suppress indentation if a float happens to start a section. + \restorefirstparagraphindent +} + +% we have these possibilities: +% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap +% @float Foo,lbl & no caption: Foo 1.1 +% @float Foo & @caption{Cap}: Foo: Cap +% @float Foo & no caption: Foo +% @float ,lbl & Caption{Cap}: 1.1: Cap +% @float ,lbl & no caption: 1.1 +% @float & @caption{Cap}: Cap +% @float & no caption: +% +\def\Efloat{% + \let\floatident = \empty + % + % In all cases, if we have a float type, it comes first. + \ifx\floattype\empty \else \def\floatident{\floattype}\fi + % + % If we have an xref label, the number comes next. + \ifx\floatlabel\empty \else + \ifx\floattype\empty \else % if also had float type, need tie first. + \appendtomacro\floatident{\tie}% + \fi + % the number. + \appendtomacro\floatident{\chaplevelprefix\the\floatno}% + \fi + % + % Start the printed caption with what we've constructed in + % \floatident, but keep it separate; we need \floatident again. + \let\captionline = \floatident + % + \ifx\thiscaption\empty \else + \ifx\floatident\empty \else + \appendtomacro\captionline{: }% had ident, so need a colon between + \fi + % + % caption text. + \appendtomacro\captionline{\scanexp\thiscaption}% + \fi + % + % If we have anything to print, print it, with space before. + % Eventually this needs to become an \insert. + \ifx\captionline\empty \else + \vskip.5\parskip + \captionline + % + % Space below caption. + \vskip\parskip + \fi + % + % If have an xref label, write the list of floats info. Do this + % after the caption, to avoid chance of it being a breakpoint. + \ifx\floatlabel\empty \else + % Write the text that goes in the lof to the aux file as + % \floatlabel-lof. Besides \floatident, we include the short + % caption if specified, else the full caption if specified, else nothing. + {% + \atdummies + % since we read the caption text in the macro world, where ^^M + % is turned into a normal character, we have to scan it back, so + % we don't write the literal three characters "^^M" into the aux file. + \scanexp{% + \xdef\noexpand\gtemp{% + \ifx\thisshortcaption\empty + \thiscaption + \else + \thisshortcaption + \fi + }% + }% + \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident + \ifx\gtemp\empty \else : \gtemp \fi}}% + }% + \fi + \egroup % end of \vtop + % + % place the captured inserts + % + % BEWARE: when the floats start float, we have to issue warning whenever an + % insert appears inside a float which could possibly float. --kasal, 26may04 + % + \checkinserts +} + +% Append the tokens #2 to the definition of macro #1, not expanding either. +% +\def\appendtomacro#1#2{% + \expandafter\def\expandafter#1\expandafter{#1#2}% +} + +% @caption, @shortcaption +% +\def\caption{\docaption\thiscaption} +\def\shortcaption{\docaption\thisshortcaption} +\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} +\def\defcaption#1#2{\egroup \def#1{#2}} + +% The parameter is the control sequence identifying the counter we are +% going to use. Create it if it doesn't exist and assign it to \floatno. +\def\getfloatno#1{% + \ifx#1\relax + % Haven't seen this figure type before. + \csname newcount\endcsname #1% + % + % Remember to reset this floatno at the next chap. + \expandafter\gdef\expandafter\resetallfloatnos + \expandafter{\resetallfloatnos #1=0 }% + \fi + \let\floatno#1% +} + +% \setref calls this to get the XREFLABEL-snt value. We want an @xref +% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we +% first read the @float command. +% +\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% + +% Magic string used for the XREFLABEL-title value, so \xrefX can +% distinguish floats from other xref types. +\def\floatmagic{!!float!!} + +% #1 is the control sequence we are passed; we expand into a conditional +% which is true if #1 represents a float ref. That is, the magic +% \thissection value which we \setref above. +% +\def\iffloat#1{\expandafter\doiffloat#1==\finish} +% +% #1 is (maybe) the \floatmagic string. If so, #2 will be the +% (safe) float type for this float. We set \iffloattype to #2. +% +\def\doiffloat#1=#2=#3\finish{% + \def\temp{#1}% + \def\iffloattype{#2}% + \ifx\temp\floatmagic +} + +% @listoffloats FLOATTYPE - print a list of floats like a table of contents. +% +\parseargdef\listoffloats{% + \def\floattype{#1}% floattype + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + % + % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. + \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax + \ifhavexrefs + % if the user said @listoffloats foo but never @float foo. + \message{\linenumber No `\safefloattype' floats to list.}% + \fi + \else + \begingroup + \leftskip=\tocindent % indent these entries like a toc + \let\do=\listoffloatsdo + \csname floatlist\safefloattype\endcsname + \endgroup + \fi +} + +% This is called on each entry in a list of floats. We're passed the +% xref label, in the form LABEL-title, which is how we save it in the +% aux file. We strip off the -title and look up \XRLABEL-lof, which +% has the text we're supposed to typeset here. +% +% Figures without xref labels will not be included in the list (since +% they won't appear in the aux file). +% +\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} +\def\listoffloatsdoentry#1-title\finish{{% + % Can't fully expand XR#1-lof because it can contain anything. Just + % pass the control sequence. On the other hand, XR#1-pg is just the + % page number, and we want to fully expand that so we can get a link + % in pdf output. + \toksA = \expandafter{\csname XR#1-lof\endcsname}% + % + % use the same \entry macro we use to generate the TOC and index. + \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% + \writeentry +}} + +\message{localization,} +% and i18n. + +% @documentlanguage is usually given very early, just after +% @setfilename. If done too late, it may not override everything +% properly. Single argument is the language abbreviation. +% It would be nice if we could set up a hyphenation file here. +% +\parseargdef\documentlanguage{% + \tex % read txi-??.tex file in plain TeX. + % Read the file if it exists. + \openin 1 txi-#1.tex + \ifeof 1 + \errhelp = \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \else + \input txi-#1.tex + \fi + \closein 1 + \endgroup +} +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? In the current directory +should work if nowhere else does.} + + +% @documentencoding should change something in TeX eventually, most +% likely, but for now just recognize it. +\let\documentencoding = \comment + + +% Page size parameters. +% +\newdimen\defaultparindent \defaultparindent = 15pt + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness = 10000 + +% Don't be so finicky about underfull hboxes, either. +\hbadness = 2000 + +% Following George Bush, just get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. We call this whenever the paper size is set. +% +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch = .15\hsize + \fi +} + +% Parameters in order: 1) textheight; 2) textwidth; +% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; +% 7) physical page height; 8) physical page width. +% +% We also call \setleading{\textleading}, so the caller should define +% \textleading. The caller should also set \parskip. +% +\def\internalpagesizes#1#2#3#4#5#6#7#8{% + \voffset = #3\relax + \topskip = #6\relax + \splittopskip = \topskip + % + \vsize = #1\relax + \advance\vsize by \topskip + \outervsize = \vsize + \advance\outervsize by 2\topandbottommargin + \pageheight = \vsize + % + \hsize = #2\relax + \outerhsize = \hsize + \advance\outerhsize by 0.5in + \pagewidth = \hsize + % + \normaloffset = #4\relax + \bindingoffset = #5\relax + % + \ifpdf + \pdfpageheight #7\relax + \pdfpagewidth #8\relax + \fi + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{46\baselineskip}{6in}% + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.25 trim size. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5in}% + {\voffset}{.25in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .5cm +}} + +% Use @smallerbook to reset parameters for 6x9 trim size. +% (Just testing, parameters still in flux.) +\def\smallerbook{{\globaldefs = 1 + \parskip = 1.5pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.4in}{4.8in}% + {-.2in}{-.4in}% + {0pt}{14pt}% + {9in}{6in}% + % + \lispnarrowing = 0.25in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .4cm +}} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % Double-side printing via postscript on Laserjet 4050 + % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. + % To change the settings for a different printer or situation, adjust + % \normaloffset until the front-side and back-side texts align. Then + % do the same for \bindingoffset. You can set these for testing in + % your texinfo source file like this: + % @tex + % \global\normaloffset = -6mm + % \global\bindingoffset = 10mm + % @end tex + \internalpagesizes{51\baselineskip}{160mm} + {\voffset}{\hoffset}% + {\bindingoffset}{44pt}% + {297mm}{210mm}% + % + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = 5mm +}} + +% Use @afivepaper to print on European A5 paper. +% From romildo@urano.iceb.ufop.br, 2 July 2000. +% He also recommends making @example and @lisp be small. +\def\afivepaper{{\globaldefs = 1 + \parskip = 2pt plus 1pt minus 0.1pt + \textleading = 12.5pt + % + \internalpagesizes{160mm}{120mm}% + {\voffset}{\hoffset}% + {\bindingoffset}{8pt}% + {210mm}{148mm}% + % + \lispnarrowing = 0.2in + \tolerance = 800 + \hfuzz = 1.2pt + \contentsrightmargin = 0pt + \defbodyindent = 2mm + \tableindent = 12mm +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. +\def\afourlatex{{\globaldefs = 1 + \afourpaper + \internalpagesizes{237mm}{150mm}% + {\voffset}{4.6mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + % + % Must explicitly reset to 0 because we call \afourpaper. + \globaldefs = 0 +}} + +% Use @afourwide to print on A4 paper in landscape format. +\def\afourwide{{\globaldefs = 1 + \afourpaper + \internalpagesizes{241mm}{165mm}% + {\voffset}{-2.95mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + \globaldefs = 0 +}} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} +\def\pagesizesyyy#1,#2,#3\finish{{% + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi + \globaldefs = 1 + % + \parskip = 3pt plus 2pt minus 1pt + \setleading{\textleading}% + % + \dimen0 = #1 + \advance\dimen0 by \voffset + % + \dimen2 = \hsize + \advance\dimen2 by \normaloffset + % + \internalpagesizes{#1}{\hsize}% + {\voffset}{\normaloffset}% + {\bindingoffset}{44pt}% + {\dimen0}{\dimen2}% +}} + +% Set default to letter. +% +\letterpaper + + +\message{and turning on texinfo input format.} + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other +\catcode`\~=\other +\catcode`\^=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\catcode`\+=\other +\catcode`\$=\other +\def\normaldoublequote{"} +\def\normaltilde{~} +\def\normalcaret{^} +\def\normalunderscore{_} +\def\normalverticalbar{|} +\def\normalless{<} +\def\normalgreater{>} +\def\normalplus{+} +\def\normaldollar{$}%$ font-lock fix + +% This macro is used to make a character print one way in \tt +% (where it can probably be output as-is), and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt\char34}} +\let"=\activedoublequote +\catcode`\~=\active +\def~{{\tt\char126}} +\chardef\hat=`\^ +\catcode`\^=\active +\def^{{\tt \hat}} + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +\let\realunder=_ +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } + +\catcode`\|=\active +\def|{{\tt\char124}} +\chardef \less=`\< +\catcode`\<=\active +\def<{{\tt \less}} +\chardef \gtr=`\> +\catcode`\>=\active +\def>{{\tt \gtr}} +\catcode`\+=\active +\def+{{\tt \char 43}} +\catcode`\$=\active +\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +\catcode`\@=0 + +% \backslashcurfont outputs one backslash character in current font, +% as in \char`\\. +\global\chardef\backslashcurfont=`\\ +\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work + +% \rawbackslash defines an active \ to do \backslashcurfont. +% \otherbackslash defines an active \ to be a literal `\' character with +% catcode other. +{\catcode`\\=\active + @gdef@rawbackslash{@let\=@backslashcurfont} + @gdef@otherbackslash{@let\=@realbackslash} +} + +% \realbackslash is an actual character `\' with catcode other, and +% \doublebackslash is two of them (for the pdf outlines). +{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} + +% \normalbackslash outputs one backslash in fixed width font. +\def\normalbackslash{{\tt\backslashcurfont}} + +\catcode`\\=\active + +% Used sometimes to turn off (effectively) the active characters +% even after parsing them. +@def@turnoffactive{% + @let"=@normaldoublequote + @let\=@realbackslash + @let~=@normaltilde + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let<=@normalless + @let>=@normalgreater + @let+=@normalplus + @let$=@normaldollar %$ font-lock fix + @unsepspaces +} + +% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +% the literal character `\'. (Thus, \ is not expandable when this is in +% effect.) +% +@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash} + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\{ in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% Also turn back on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active + @catcode`@_=@active +} + +% Say @foo, not \foo, in error messages. +@escapechar = `@@ + +% These look ok in all fonts, so just make them not special. +@catcode`@& = @other +@catcode`@# = @other +@catcode`@% = @other + + +@c Local variables: +@c eval: (add-hook 'write-file-hooks 'time-stamp) +@c page-delimiter: "^\\\\message" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" +@c End: + +@c vim:sw=2: + +@ignore + arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 +@end ignore diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/rbffi.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/rbffi.h new file mode 100644 index 0000000..b6fe477 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/rbffi.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_RBFFI_H +#define RBFFI_RBFFI_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_PARAMETERS (32) + +extern VALUE rbffi_FFIModule; + +extern void rbffi_Type_Init(VALUE ffiModule); +extern void rbffi_Buffer_Init(VALUE ffiModule); +extern void rbffi_Invoker_Init(VALUE ffiModule); +extern void rbffi_Variadic_Init(VALUE ffiModule); +extern void rbffi_DataConverter_Init(VALUE ffiModule); +extern VALUE rbffi_AbstractMemoryClass, rbffi_InvokerClass; +extern int rbffi_type_size(VALUE type); +extern void rbffi_Thread_Init(VALUE moduleFFI); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_RBFFI_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/rbffi_endian.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/rbffi_endian.h new file mode 100644 index 0000000..ebb8420 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/rbffi_endian.h @@ -0,0 +1,59 @@ +#ifndef JFFI_ENDIAN_H +#define JFFI_ENDIAN_H + +#ifndef _MSC_VER +#include +#endif + +#include + +#if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || defined(__GLIBC__) || defined(__HAIKU__) +# include +# if !defined(LITTLE_ENDIAN) && defined(__LITTLE_ENDIAN) +# define LITTLE_ENDIAN __LITTLE_ENDIAN +# endif +# if !defined(BIG_ENDIAN) && defined(__BIG_ENDIAN) +# define BIG_ENDIAN __BIG_ENDIAN +# endif +# if !defined(BYTE_ORDER) && defined(__BYTE_ORDER) +# define BYTE_ORDER __BYTE_ORDER +# endif +#endif + +#ifdef __sun +# include +# define LITTLE_ENDIAN 1234 +# define BIG_ENDIAN 4321 +# if defined(_BIG_ENDIAN) +# define BYTE_ORDER BIG_ENDIAN +# elif defined(_LITTLE_ENDIAN) +# define BYTE_ORDER LITTLE_ENDIAN +# else +# error "Cannot determine endian-ness" +# endif +#endif + +#if defined(_AIX) && !defined(BYTE_ORDER) +# define LITTLE_ENDIAN 1234 +# define BIG_ENDIAN 4321 +# if defined(__BIG_ENDIAN__) +# define BYTE_ORDER BIG_ENDIAN +# elif defined(__LITTLE_ENDIAN__) +# define BYTE_ORDER LITTLE_ENDIAN +# else +# error "Cannot determine endian-ness" +# endif +#endif + +#if defined(_WIN32) +# define LITTLE_ENDIAN 1234 +# define BIG_ENDIAN 4321 +# define BYTE_ORDER LITTLE_ENDIAN +#endif + +#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN) +# error "Cannot determine the endian-ness of this platform" +#endif + +#endif /* JFFI_ENDIAN_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdbool.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdbool.h new file mode 100644 index 0000000..9130a8b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdbool.h @@ -0,0 +1,8 @@ +#ifndef FFI_STDBOOL_H +#define FFI_STDBOOL_H + +typedef int bool; +#define true 1 +#define false 0 + +#endif /* FFI_STDBOOL_H */ \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdint.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdint.h new file mode 100644 index 0000000..6ce7457 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdint.h @@ -0,0 +1,201 @@ +/* stdint.h standard header */ +#if !defined(_MSC_VER) && !defined(INT8_MIN) +#pragma once +#ifndef _STDINT +#define _STDINT +#ifndef RC_INVOKED +#include + +/* NB: assumes + byte has 8 bits + long is 32 bits + pointer can convert to and from long long + long long is longest type + */ + +_C_STD_BEGIN + /* TYPE DEFINITIONS */ +typedef signed char int8_t; +typedef short int16_t; +typedef int int32_t; + +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; + +typedef signed char int_least8_t; +typedef short int_least16_t; +typedef int int_least32_t; + +typedef unsigned char uint_least8_t; +typedef unsigned short uint_least16_t; +typedef unsigned int uint_least32_t; + +typedef char int_fast8_t; +typedef int int_fast16_t; +typedef int int_fast32_t; + +typedef unsigned char uint_fast8_t; +typedef unsigned int uint_fast16_t; +typedef unsigned int uint_fast32_t; + +#ifndef _INTPTR_T_DEFINED + #define _INTPTR_T_DEFINED + #ifdef _WIN64 +typedef __int64 intptr_t; + #else /* _WIN64 */ +typedef _W64 int intptr_t; + #endif /* _WIN64 */ +#endif /* _INTPTR_T_DEFINED */ + +#ifndef _UINTPTR_T_DEFINED + #define _UINTPTR_T_DEFINED + #ifdef _WIN64 +typedef unsigned __int64 uintptr_t; + #else /* _WIN64 */ +typedef _W64 unsigned int uintptr_t; + #endif /* _WIN64 */ +#endif /* _UINTPTR_T_DEFINED */ + +typedef _Longlong int64_t; +typedef _ULonglong uint64_t; + +typedef _Longlong int_least64_t; +typedef _ULonglong uint_least64_t; + +typedef _Longlong int_fast64_t; +typedef _ULonglong uint_fast64_t; + +typedef _Longlong intmax_t; +typedef _ULonglong uintmax_t; + + /* LIMIT MACROS */ +#define INT8_MIN (-0x7f - _C2) +#define INT16_MIN (-0x7fff - _C2) +#define INT32_MIN (-0x7fffffff - _C2) + +#define INT8_MAX 0x7f +#define INT16_MAX 0x7fff +#define INT32_MAX 0x7fffffff +#define UINT8_MAX 0xff +#define UINT16_MAX 0xffff +#define UINT32_MAX 0xffffffff + +#define INT_LEAST8_MIN (-0x7f - _C2) +#define INT_LEAST16_MIN (-0x7fff - _C2) +#define INT_LEAST32_MIN (-0x7fffffff - _C2) + +#define INT_LEAST8_MAX 0x7f +#define INT_LEAST16_MAX 0x7fff +#define INT_LEAST32_MAX 0x7fffffff +#define UINT_LEAST8_MAX 0xff +#define UINT_LEAST16_MAX 0xffff +#define UINT_LEAST32_MAX 0xffffffff + +#define INT_FAST8_MIN (-0x7f - _C2) +#define INT_FAST16_MIN (-0x7fff - _C2) +#define INT_FAST32_MIN (-0x7fffffff - _C2) + +#define INT_FAST8_MAX 0x7f +#define INT_FAST16_MAX 0x7fff +#define INT_FAST32_MAX 0x7fffffff +#define UINT_FAST8_MAX 0xff +#define UINT_FAST16_MAX 0xffff +#define UINT_FAST32_MAX 0xffffffff + + #if _INTPTR == 0 || _INTPTR == 1 +#define INTPTR_MAX 0x7fffffff +#define INTPTR_MIN (-INTPTR_MAX - _C2) +#define UINTPTR_MAX 0xffffffff + + #else /* _INTPTR == 2 */ +#define INTPTR_MIN (-_LLONG_MAX - _C2) +#define INTPTR_MAX _LLONG_MAX +#define UINTPTR_MAX _ULLONG_MAX +#endif /* _INTPTR */ + +#define INT8_C(x) (x) +#define INT16_C(x) (x) +#define INT32_C(x) ((x) + (INT32_MAX - INT32_MAX)) + +#define UINT8_C(x) (x) +#define UINT16_C(x) (x) +#define UINT32_C(x) ((x) + (UINT32_MAX - UINT32_MAX)) + +#ifdef _WIN64 + #define PTRDIFF_MIN INT64_MIN + #define PTRDIFF_MAX INT64_MAX +#else /* _WIN64 */ + #define PTRDIFF_MIN INT32_MIN + #define PTRDIFF_MAX INT32_MAX +#endif /* _WIN64 */ + +#define SIG_ATOMIC_MIN INT32_MIN +#define SIG_ATOMIC_MAX INT32_MAX + +#ifndef SIZE_MAX + #ifdef _WIN64 + #define SIZE_MAX UINT64_MAX + #else /* _WIN64 */ + #define SIZE_MAX UINT32_MAX + #endif /* _WIN64 */ +#endif /* SIZE_MAX */ + +#define WCHAR_MIN 0x0000 +#define WCHAR_MAX 0xffff + +#define WINT_MIN 0x0000 +#define WINT_MAX 0xffff + + #define INT64_MIN (-0x7fffffffffffffff - _C2) + #define INT64_MAX 0x7fffffffffffffff + #define UINT64_MAX 0xffffffffffffffffU + + #define INT_LEAST64_MIN (-0x7fffffffffffffff - _C2) + #define INT_LEAST64_MAX 0x7fffffffffffffff + #define UINT_LEAST64_MAX 0xffffffffffffffffU + + #define INT_FAST64_MIN (-0x7fffffffffffffff - _C2) + #define INT_FAST64_MAX 0x7fffffffffffffff + #define UINT_FAST64_MAX 0xffffffffffffffffU + + #define INTMAX_MIN (-0x7fffffffffffffff - _C2) + #define INTMAX_MAX 0x7fffffffffffffff + #define UINTMAX_MAX 0xffffffffffffffffU + +#define INT64_C(x) ((x) + (INT64_MAX - INT64_MAX)) +#define UINT64_C(x) ((x) + (UINT64_MAX - UINT64_MAX)) +#define INTMAX_C(x) INT64_C(x) +#define UINTMAX_C(x) UINT64_C(x) +_C_STD_END +#endif /* RC_INVOKED */ +#endif /* _STDINT */ + + #if defined(_STD_USING) +using _CSTD int8_t; using _CSTD int16_t; +using _CSTD int32_t; using _CSTD int64_t; + +using _CSTD uint8_t; using _CSTD uint16_t; +using _CSTD uint32_t; using _CSTD uint64_t; + +using _CSTD int_least8_t; using _CSTD int_least16_t; +using _CSTD int_least32_t; using _CSTD int_least64_t; +using _CSTD uint_least8_t; using _CSTD uint_least16_t; +using _CSTD uint_least32_t; using _CSTD uint_least64_t; + +using _CSTD intmax_t; using _CSTD uintmax_t; + +using _CSTD uintptr_t; +using _CSTD intptr_t; + +using _CSTD int_fast8_t; using _CSTD int_fast16_t; +using _CSTD int_fast32_t; using _CSTD int_fast64_t; +using _CSTD uint_fast8_t; using _CSTD uint_fast16_t; +using _CSTD uint_fast32_t; using _CSTD uint_fast64_t; + #endif /* defined(_STD_USING) */ + +/* + * Copyright (c) 1992-2009 by P.J. Plauger. ALL RIGHTS RESERVED. + * Consult your license regarding permissions and restrictions. +V5.20:0009 */ +#endif /* !defined(_MSC_VER) && !defined(INT8_MIN) */ \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ffi.gemspec b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ffi.gemspec new file mode 100644 index 0000000..b11893a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ffi.gemspec @@ -0,0 +1,23 @@ +require File.expand_path("../lib/#{File.basename(__FILE__, '.gemspec')}/version", __FILE__) + +Gem::Specification.new do |s| + s.name = 'ffi' + s.version = FFI::VERSION + s.author = 'Wayne Meissner' + s.email = 'wmeissner@gmail.com' + s.homepage = 'http://wiki.github.com/ffi/ffi' + s.summary = 'Ruby FFI' + s.description = 'Ruby FFI library' + s.files = %w(ffi.gemspec LICENSE COPYING README.md Rakefile) + Dir.glob("{ext,gen,lib,spec,libtest}/**/*").reject { |f| f =~ /(lib\/[12]\.[089]|\.s?[ao]$|\.bundle|\.dylib$)/ } + s.extensions << 'ext/ffi_c/extconf.rb' + s.has_rdoc = false + s.rdoc_options = %w[--exclude=ext/ffi_c/.*\.o$ --exclude=ffi_c\.(bundle|so)$] + s.license = 'BSD-3-Clause' + s.require_paths << 'ext/ffi_c' + s.required_ruby_version = '>= 1.8.7' + s.add_development_dependency 'rake', '~> 10.1' + s.add_development_dependency 'rake-compiler', '~> 1.0' + s.add_development_dependency 'rake-compiler-dock', '~> 0.6.0' + s.add_development_dependency 'rspec', '~> 2.14.1' + s.add_development_dependency 'rubygems-tasks', "~> 0.2.4" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/gen/Rakefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/gen/Rakefile new file mode 100644 index 0000000..f71a1da --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/gen/Rakefile @@ -0,0 +1,30 @@ +$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib') +require 'fileutils' +require 'ffi' +require 'ffi/platform' +require 'ffi/tools/types_generator' +types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf')) + +logfile = File.join(File.dirname(__FILE__), 'log') + +file types_conf do |task| + options = {} + FileUtils.mkdir_p(File.dirname(task.name), { :mode => 0755 }) + File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f| + f.puts FFI::TypesGenerator.generate(options) + end + File.open(logfile, 'w') do |log| + log.puts(types_conf) + end +end + +task :default => types_conf do +end + +task :clean do + File.readlines(logfile).each do |file| + file.strip! + rm_f file + end + rm_f logfile +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi.rb new file mode 100644 index 0000000..361e53d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi.rb @@ -0,0 +1,20 @@ +if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx' + Object.send(:remove_const, :FFI) if defined?(::FFI) + begin + require RUBY_VERSION.split('.')[0, 2].join('.') + '/ffi_c' + rescue Exception + require 'ffi_c' + end + + require 'ffi/ffi' + +elsif defined?(RUBY_ENGINE) + # Remove the ffi gem dir from the load path, then reload the internal ffi implementation + $LOAD_PATH.delete(File.dirname(__FILE__)) + $LOAD_PATH.delete(File.join(File.dirname(__FILE__), 'ffi')) + unless $LOADED_FEATURES.nil? + $LOADED_FEATURES.delete(__FILE__) + $LOADED_FEATURES.delete('ffi.rb') + end + require 'ffi.rb' +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/autopointer.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/autopointer.rb new file mode 100644 index 0000000..889a3e3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/autopointer.rb @@ -0,0 +1,203 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# Copyright (C) 2008 Mike Dalessio +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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. + +module FFI + class AutoPointer < Pointer + extend DataConverter + + # @overload initialize(pointer, method) + # @param pointer [Pointer] + # @param method [Method] + # @return [self] + # The passed Method will be invoked at GC time. + # @overload initialize(pointer, proc) + # @param pointer [Pointer] + # @return [self] + # The passed Proc will be invoked at GC time (SEE WARNING BELOW!) + # @note WARNING: passing a proc _may_ cause your pointer to never be + # GC'd, unless you're careful to avoid trapping a reference to the + # pointer in the proc. See the test specs for examples. + # @overload initialize(pointer) { |p| ... } + # @param pointer [Pointer] + # @yieldparam [Pointer] p +pointer+ passed to the block + # @return [self] + # The passed block will be invoked at GC time. + # @note + # WARNING: passing a block will cause your pointer to never be GC'd. + # This is bad. + # @overload initialize(pointer) + # @param pointer [Pointer] + # @return [self] + # The pointer's release() class method will be invoked at GC time. + # + # @note The safest, and therefore preferred, calling + # idiom is to pass a Method as the second parameter. Example usage: + # + # class PointerHelper + # def self.release(pointer) + # ... + # end + # end + # + # p = AutoPointer.new(other_pointer, PointerHelper.method(:release)) + # + # The above code will cause PointerHelper#release to be invoked at GC time. + # + # @note + # The last calling idiom (only one parameter) is generally only + # going to be useful if you subclass {AutoPointer}, and override + # #release, which by default does nothing. + def initialize(ptr, proc=nil, &block) + super(ptr.type_size, ptr) + raise TypeError, "Invalid pointer" if ptr.nil? || !ptr.kind_of?(Pointer) \ + || ptr.kind_of?(MemoryPointer) || ptr.kind_of?(AutoPointer) + + @releaser = if proc + if not proc.respond_to?(:call) + raise RuntimeError.new("proc must be callable") + end + CallableReleaser.new(ptr, proc) + + else + if not self.class.respond_to?(:release) + raise RuntimeError.new("no release method defined") + end + DefaultReleaser.new(ptr, self.class) + end + + ObjectSpace.define_finalizer(self, @releaser) + self + end + + # @return [nil] + # Free the pointer. + def free + @releaser.free + end + + # @param [Boolean] autorelease + # @return [Boolean] +autorelease+ + # Set +autorelease+ property. See {Pointer Autorelease section at Pointer}. + def autorelease=(autorelease) + @releaser.autorelease=(autorelease) + end + + # @return [Boolean] +autorelease+ + # Get +autorelease+ property. See {Pointer Autorelease section at Pointer}. + def autorelease? + @releaser.autorelease + end + + # @abstract Base class for {AutoPointer}'s releasers. + # + # All subclasses of Releaser should define a +#release(ptr)+ method. + # A releaser is an object in charge of release an {AutoPointer}. + class Releaser + attr_accessor :autorelease + + # @param [Pointer] ptr + # @param [#call] proc + # @return [nil] + # A new instance of Releaser. + def initialize(ptr, proc) + @ptr = ptr + @proc = proc + @autorelease = true + end + + # @return [nil] + # Free pointer. + def free + if @ptr + release(@ptr) + @autorelease = false + @ptr = nil + @proc = nil + end + end + + # @param args + # Release pointer if +autorelease+ is set. + def call(*args) + release(@ptr) if @autorelease && @ptr + end + end + + # DefaultReleaser is a {Releaser} used when an {AutoPointer} is defined + # without Proc or Method. In this case, the pointer to release must be of + # a class derived from AutoPointer with a {release} class method. + class DefaultReleaser < Releaser + # @param [Pointer] ptr + # @return [nil] + # Release +ptr+ using the {release} class method of its class. + def release(ptr) + @proc.release(ptr) + end + end + + # CallableReleaser is a {Releaser} used when an {AutoPointer} is defined with a + # Proc or a Method. + class CallableReleaser < Releaser + # Release +ptr+ by using Proc or Method defined at +ptr+ + # {AutoPointer#initialize initialization}. + # + # @param [Pointer] ptr + # @return [nil] + def release(ptr) + @proc.call(ptr) + end + end + + # Return native type of AutoPointer. + # + # Override {DataConverter#native_type}. + # @return [Type::POINTER] + # @raise {RuntimeError} if class does not implement a +#release+ method + def self.native_type + if not self.respond_to?(:release) + raise RuntimeError.new("no release method defined for #{self.inspect}") + end + Type::POINTER + end + + # Create a new AutoPointer. + # + # Override {DataConverter#from_native}. + # @overload self.from_native(ptr, ctx) + # @param [Pointer] ptr + # @param ctx not used. Please set +nil+. + # @return [AutoPointer] + def self.from_native(val, ctx) + self.new(val) + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/buffer.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/buffer.rb new file mode 100644 index 0000000..449e45b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/buffer.rb @@ -0,0 +1,4 @@ +# +# All the code from this file is now implemented in C. This file remains +# to satisfy any leftover require 'ffi/buffer' in user code +# diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/callback.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/callback.rb new file mode 100644 index 0000000..32d52f7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/callback.rb @@ -0,0 +1,4 @@ +# +# All the code from this file is now implemented in C. This file remains +# to satisfy any leftover require 'ffi/callback' in user code +# diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/enum.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/enum.rb new file mode 100644 index 0000000..846b836 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/enum.rb @@ -0,0 +1,172 @@ +# +# Copyright (C) 2009, 2010 Wayne Meissner +# Copyright (C) 2009 Luc Heinrich +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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. +# + +module FFI + + # An instance of this class permits to manage {Enum}s. In fact, Enums is a collection of {Enum}s. + class Enums + + # @return [nil] + def initialize + @all_enums = Array.new + @tagged_enums = Hash.new + @symbol_map = Hash.new + end + + # @param [Enum] enum + # Add an {Enum} to the collection. + def <<(enum) + @all_enums << enum + @tagged_enums[enum.tag] = enum unless enum.tag.nil? + @symbol_map.merge!(enum.symbol_map) + end + + # @param query enum tag or part of an enum name + # @return [Enum] + # Find a {Enum} in collection. + def find(query) + if @tagged_enums.has_key?(query) + @tagged_enums[query] + else + @all_enums.detect { |enum| enum.symbols.include?(query) } + end + end + + # @param symbol a symbol to find in merge symbol maps of all enums. + # @return a symbol + def __map_symbol(symbol) + @symbol_map[symbol] + end + + end + + # Represents a C enum. + # + # For a C enum: + # enum fruits { + # apple, + # banana, + # orange, + # pineapple + # }; + # are defined this vocabulary: + # * a _symbol_ is a word from the enumeration (ie. _apple_, by example); + # * a _value_ is the value of a symbol in the enumeration (by example, apple has value _0_ and banana _1_). + class Enum + include DataConverter + + attr_reader :tag + attr_reader :native_type + + # @overload initialize(info, tag=nil) + # @param [nil, Enumerable] info + # @param [nil, Symbol] tag enum tag + # @overload initialize(native_type, info, tag=nil) + # @param [FFI::Type] native_type Native type for new Enum + # @param [nil, Enumerable] info symbols and values for new Enum + # @param [nil, Symbol] tag name of new Enum + def initialize(*args) + @native_type = args.first.kind_of?(FFI::Type) ? args.shift : Type::INT + info, @tag = *args + @kv_map = Hash.new + unless info.nil? + last_cst = nil + value = 0 + info.each do |i| + case i + when Symbol + raise ArgumentError, "duplicate enum key" if @kv_map.has_key?(i) + @kv_map[i] = value + last_cst = i + value += 1 + when Integer + @kv_map[last_cst] = i + value = i+1 + end + end + end + @vk_map = @kv_map.invert + end + + # @return [Array] enum symbol names + def symbols + @kv_map.keys + end + + # Get a symbol or a value from the enum. + # @overload [](query) + # Get enum value from symbol. + # @param [Symbol] query + # @return [Integer] + # @overload [](query) + # Get enum symbol from value. + # @param [Integer] query + # @return [Symbol] + def [](query) + case query + when Symbol + @kv_map[query] + when Integer + @vk_map[query] + end + end + alias find [] + + # Get the symbol map. + # @return [Hash] + def symbol_map + @kv_map + end + + alias to_h symbol_map + alias to_hash symbol_map + + # @param [Symbol, Integer, #to_int] val + # @param ctx unused + # @return [Integer] value of a enum symbol + def to_native(val, ctx) + @kv_map[val] || if val.is_a?(Integer) + val + elsif val.respond_to?(:to_int) + val.to_int + else + raise ArgumentError, "invalid enum value, #{val.inspect}" + end + end + + # @param val + # @return symbol name if it exists for +val+. + def from_native(val, ctx) + @vk_map[val] || val + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/errno.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/errno.rb new file mode 100644 index 0000000..de82d89 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/errno.rb @@ -0,0 +1,43 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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.# + +module FFI + # @return (see FFI::LastError.error) + # @see FFI::LastError.error + def self.errno + FFI::LastError.error + end + # @param error (see FFI::LastError.error=) + # @return (see FFI::LastError.error=) + # @see FFI::LastError.error= + def self.errno=(error) + FFI::LastError.error = error + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/ffi.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/ffi.rb new file mode 100644 index 0000000..11d451f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/ffi.rb @@ -0,0 +1,44 @@ +# +# Copyright (C) 2008-2010 JRuby project +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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. + +require 'ffi/platform' +require 'ffi/types' +require 'ffi/library' +require 'ffi/errno' +require 'ffi/pointer' +require 'ffi/memorypointer' +require 'ffi/struct' +require 'ffi/union' +require 'ffi/managedstruct' +require 'ffi/callback' +require 'ffi/io' +require 'ffi/autopointer' +require 'ffi/variadic' +require 'ffi/enum' diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/io.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/io.rb new file mode 100644 index 0000000..7fa1cf7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/io.rb @@ -0,0 +1,62 @@ +# +# Copyright (C) 2008, 2009 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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.# + +module FFI + + # This module implements a couple of class methods to play with IO. + module IO + # @param [Integer] fd file decriptor + # @param [String] mode mode string + # @return [::IO] + # Synonym for IO::for_fd. + def self.for_fd(fd, mode = "r") + ::IO.for_fd(fd, mode) + end + + # @param [#read] io io to read from + # @param [AbstractMemory] buf destination for data read from +io+ + # @param [nil, Numeric] len maximul number of bytes to read from +io+. If +nil+, + # read until end of file. + # @return [Numeric] length really read, in bytes + # + # A version of IO#read that reads data from an IO and put then into a native buffer. + # + # This will be optimized at some future time to eliminate the double copy. + # + def self.native_read(io, buf, len) + tmp = io.read(len) + return -1 unless tmp + buf.put_bytes(0, tmp) + tmp.length + end + + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/library.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/library.rb new file mode 100644 index 0000000..5d52edd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/library.rb @@ -0,0 +1,538 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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.# + +module FFI + CURRENT_PROCESS = USE_THIS_PROCESS_AS_LIBRARY = Object.new + + # @param [#to_s] lib library name + # @return [String] library name formatted for current platform + # Transform a generic library name to a platform library name + # @example + # # Linux + # FFI.map_library_name 'c' # -> "libc.so.6" + # FFI.map_library_name 'jpeg' # -> "libjpeg.so" + # # Windows + # FFI.map_library_name 'c' # -> "msvcrt.dll" + # FFI.map_library_name 'jpeg' # -> "jpeg.dll" + def self.map_library_name(lib) + # Mangle the library name to reflect the native library naming conventions + lib = lib.to_s unless lib.kind_of?(String) + lib = Library::LIBC if lib == 'c' + + if lib && File.basename(lib) == lib + lib = Platform::LIBPREFIX + lib unless lib =~ /^#{Platform::LIBPREFIX}/ + r = Platform::IS_GNU ? "\\.so($|\\.[1234567890]+)" : "\\.#{Platform::LIBSUFFIX}$" + lib += ".#{Platform::LIBSUFFIX}" unless lib =~ /#{r}/ + end + + lib + end + + # Exception raised when a function is not found in libraries + class NotFoundError < LoadError + def initialize(function, *libraries) + super("Function '#{function}' not found in [#{libraries[0].nil? ? 'current process' : libraries.join(", ")}]") + end + end + + # This module is the base to use native functions. + # + # A basic usage may be: + # require 'ffi' + # + # module Hello + # extend FFI::Library + # ffi_lib FFI::Library::LIBC + # attach_function 'puts', [ :string ], :int + # end + # + # Hello.puts("Hello, World") + # + # + module Library + CURRENT_PROCESS = FFI::CURRENT_PROCESS + LIBC = FFI::Platform::LIBC + + # @param mod extended object + # @return [nil] + # @raise {RuntimeError} if +mod+ is not a Module + # Test if extended object is a Module. If not, raise RuntimeError. + def self.extended(mod) + raise RuntimeError.new("must only be extended by module") unless mod.kind_of?(Module) + end + + + # @param [Array] names names of libraries to load + # @return [Array] + # @raise {LoadError} if a library cannot be opened + # Load native libraries. + def ffi_lib(*names) + raise LoadError.new("library names list must not be empty") if names.empty? + + lib_flags = defined?(@ffi_lib_flags) ? @ffi_lib_flags : FFI::DynamicLibrary::RTLD_LAZY | FFI::DynamicLibrary::RTLD_LOCAL + ffi_libs = names.map do |name| + + if name == FFI::CURRENT_PROCESS + FFI::DynamicLibrary.open(nil, FFI::DynamicLibrary::RTLD_LAZY | FFI::DynamicLibrary::RTLD_LOCAL) + + else + libnames = (name.is_a?(::Array) ? name : [ name ]).map { |n| [ n, FFI.map_library_name(n) ].uniq }.flatten.compact + lib = nil + errors = {} + + libnames.each do |libname| + begin + orig = libname + lib = FFI::DynamicLibrary.open(libname, lib_flags) + break if lib + + rescue Exception => ex + ldscript = false + if ex.message =~ /(([^ \t()])+\.so([^ \t:()])*):([ \t])*(invalid ELF header|file too short|invalid file format)/ + if File.read($1) =~ /(?:GROUP|INPUT) *\( *([^ \)]+)/ + libname = $1 + ldscript = true + end + end + + if ldscript + retry + else + # TODO better library lookup logic + libname = libname.to_s + unless libname.start_with?("/") + path = ['/usr/lib/','/usr/local/lib/'].find do |pth| + File.exist?(pth + libname) + end + if path + libname = path + libname + retry + end + end + + libr = (orig == libname ? orig : "#{orig} #{libname}") + errors[libr] = ex + end + end + end + + if lib.nil? + raise LoadError.new(errors.values.join(".\n")) + end + + # return the found lib + lib + end + end + + @ffi_libs = ffi_libs + end + + # Set the calling convention for {#attach_function} and {#callback} + # + # @see http://en.wikipedia.org/wiki/Stdcall#stdcall + # @note +:stdcall+ is typically used for attaching Windows API functions + # + # @param [Symbol] convention one of +:default+, +:stdcall+ + # @return [Symbol] the new calling convention + def ffi_convention(convention = nil) + @ffi_convention ||= :default + @ffi_convention = convention if convention + @ffi_convention + end + + # @see #ffi_lib + # @return [Array] array of currently loaded FFI libraries + # @raise [LoadError] if no libraries have been loaded (using {#ffi_lib}) + # Get FFI libraries loaded using {#ffi_lib}. + def ffi_libraries + raise LoadError.new("no library specified") if !defined?(@ffi_libs) || @ffi_libs.empty? + @ffi_libs + end + + # Flags used in {#ffi_lib}. + # + # This map allows you to supply symbols to {#ffi_lib_flags} instead of + # the actual constants. + FlagsMap = { + :global => DynamicLibrary::RTLD_GLOBAL, + :local => DynamicLibrary::RTLD_LOCAL, + :lazy => DynamicLibrary::RTLD_LAZY, + :now => DynamicLibrary::RTLD_NOW + } + + # Sets library flags for {#ffi_lib}. + # + # @example + # ffi_lib_flags(:lazy, :local) # => 5 + # + # @param [Symbol, …] flags (see {FlagsMap}) + # @return [Fixnum] the new value + def ffi_lib_flags(*flags) + @ffi_lib_flags = flags.inject(0) { |result, f| result | FlagsMap[f] } + end + + + ## + # @overload attach_function(func, args, returns, options = {}) + # @example attach function without an explicit name + # module Foo + # extend FFI::Library + # ffi_lib FFI::Library::LIBC + # attach_function :malloc, [:size_t], :pointer + # end + # # now callable via Foo.malloc + # @overload attach_function(name, func, args, returns, options = {}) + # @example attach function with an explicit name + # module Bar + # extend FFI::Library + # ffi_lib FFI::Library::LIBC + # attach_function :c_malloc, :malloc, [:size_t], :pointer + # end + # # now callable via Bar.c_malloc + # + # Attach C function +func+ to this module. + # + # + # @param [#to_s] name name of ruby method to attach as + # @param [#to_s] func name of C function to attach + # @param [Array] args an array of types + # @param [Symbol] returns type of return value + # @option options [Boolean] :blocking (@blocking) set to true if the C function is a blocking call + # @option options [Symbol] :convention (:default) calling convention (see {#ffi_convention}) + # @option options [FFI::Enums] :enums + # @option options [Hash] :type_map + # + # @return [FFI::VariadicInvoker] + # + # @raise [FFI::NotFoundError] if +func+ cannot be found in the attached libraries (see {#ffi_lib}) + def attach_function(name, func, args, returns = nil, options = nil) + mname, a2, a3, a4, a5 = name, func, args, returns, options + cname, arg_types, ret_type, opts = (a4 && (a2.is_a?(String) || a2.is_a?(Symbol))) ? [ a2, a3, a4, a5 ] : [ mname.to_s, a2, a3, a4 ] + + # Convert :foo to the native type + arg_types = arg_types.map { |e| find_type(e) } + options = { + :convention => ffi_convention, + :type_map => defined?(@ffi_typedefs) ? @ffi_typedefs : nil, + :blocking => defined?(@blocking) && @blocking, + :enums => defined?(@ffi_enums) ? @ffi_enums : nil, + } + + @blocking = false + options.merge!(opts) if opts && opts.is_a?(Hash) + + # Try to locate the function in any of the libraries + invokers = [] + ffi_libraries.each do |lib| + if invokers.empty? + begin + function = nil + function_names(cname, arg_types).find do |fname| + function = lib.find_function(fname) + end + raise LoadError unless function + + invokers << if arg_types.length > 0 && arg_types[arg_types.length - 1] == FFI::NativeType::VARARGS + VariadicInvoker.new(function, arg_types, find_type(ret_type), options) + + else + Function.new(find_type(ret_type), arg_types, function, options) + end + + rescue LoadError + end + end + end + invoker = invokers.compact.shift + raise FFI::NotFoundError.new(cname.to_s, ffi_libraries.map { |lib| lib.name }) unless invoker + + invoker.attach(self, mname.to_s) + invoker + end + + # @param [#to_s] name function name + # @param [Array] arg_types function's argument types + # @return [Array] + # This function returns a list of possible names to lookup. + # @note Function names on windows may be decorated if they are using stdcall. See + # * http://en.wikipedia.org/wiki/Name_mangling#C_name_decoration_in_Microsoft_Windows + # * http://msdn.microsoft.com/en-us/library/zxk0tw93%28v=VS.100%29.aspx + # * http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#STDCALL + # Note that decorated names can be overridden via def files. Also note that the + # windows api, although using, doesn't have decorated names. + def function_names(name, arg_types) + result = [name.to_s] + if ffi_convention == :stdcall + # Get the size of each parameter + size = arg_types.inject(0) do |mem, arg| + size = arg.size + # The size must be a multiple of 4 + size += (4 - size) % 4 + mem + size + end + + result << "_#{name.to_s}@#{size}" # win32 + result << "#{name.to_s}@#{size}" # win64 + end + result + end + + # @overload attach_variable(mname, cname, type) + # @param [#to_s] mname name of ruby method to attach as + # @param [#to_s] cname name of C variable to attach + # @param [DataConverter, Struct, Symbol, Type] type C variable's type + # @example + # module Bar + # extend FFI::Library + # ffi_lib 'my_lib' + # attach_variable :c_myvar, :myvar, :long + # end + # # now callable via Bar.c_myvar + # @overload attach_variable(cname, type) + # @param [#to_s] mname name of ruby method to attach as + # @param [DataConverter, Struct, Symbol, Type] type C variable's type + # @example + # module Bar + # extend FFI::Library + # ffi_lib 'my_lib' + # attach_variable :myvar, :long + # end + # # now callable via Bar.myvar + # @return [DynamicLibrary::Symbol] + # @raise {FFI::NotFoundError} if +cname+ cannot be found in libraries + # + # Attach C variable +cname+ to this module. + def attach_variable(mname, a1, a2 = nil) + cname, type = a2 ? [ a1, a2 ] : [ mname.to_s, a1 ] + address = nil + ffi_libraries.each do |lib| + begin + address = lib.find_variable(cname.to_s) + break unless address.nil? + rescue LoadError + end + end + + raise FFI::NotFoundError.new(cname, ffi_libraries) if address.nil? || address.null? + if type.is_a?(Class) && type < FFI::Struct + # If it is a global struct, just attach directly to the pointer + s = type.new(address) + self.module_eval <<-code, __FILE__, __LINE__ + @@ffi_gvar_#{mname} = s + def self.#{mname} + @@ffi_gvar_#{mname} + end + code + + else + sc = Class.new(FFI::Struct) + sc.layout :gvar, find_type(type) + s = sc.new(address) + # + # Attach to this module as mname/mname= + # + self.module_eval <<-code, __FILE__, __LINE__ + @@ffi_gvar_#{mname} = s + def self.#{mname} + @@ffi_gvar_#{mname}[:gvar] + end + def self.#{mname}=(value) + @@ffi_gvar_#{mname}[:gvar] = value + end + code + + end + + address + end + + + # @overload callback(name, params, ret) + # @param name callback name to add to type map + # @param [Array] params array of parameters' types + # @param [DataConverter, Struct, Symbol, Type] ret callback return type + # @overload callback(params, ret) + # @param [Array] params array of parameters' types + # @param [DataConverter, Struct, Symbol, Type] ret callback return type + # @return [FFI::CallbackInfo] + def callback(*args) + raise ArgumentError, "wrong number of arguments" if args.length < 2 || args.length > 3 + name, params, ret = if args.length == 3 + args + else + [ nil, args[0], args[1] ] + end + + native_params = params.map { |e| find_type(e) } + raise ArgumentError, "callbacks cannot have variadic parameters" if native_params.include?(FFI::Type::VARARGS) + options = Hash.new + options[:convention] = ffi_convention + options[:enums] = @ffi_enums if defined?(@ffi_enums) + cb = FFI::CallbackInfo.new(find_type(ret), native_params, options) + + # Add to the symbol -> type map (unless there was no name) + unless name.nil? + typedef cb, name + end + + cb + end + + # Register or get an already registered type definition. + # + # To register a new type definition, +old+ should be a {FFI::Type}. +add+ + # is in this case the type definition. + # + # If +old+ is a {DataConverter}, a {Type::Mapped} is returned. + # + # If +old+ is +:enum+ + # * and +add+ is an +Array+, a call to {#enum} is made with +add+ as single parameter; + # * in others cases, +info+ is used to create a named enum. + # + # If +old+ is a key for type map, #typedef get +old+ type definition. + # + # @param [DataConverter, Symbol, Type] old + # @param [Symbol] add + # @param [Symbol] info + # @return [FFI::Enum, FFI::Type] + def typedef(old, add, info=nil) + @ffi_typedefs = Hash.new unless defined?(@ffi_typedefs) + + @ffi_typedefs[add] = if old.kind_of?(FFI::Type) + old + + elsif @ffi_typedefs.has_key?(old) + @ffi_typedefs[old] + + elsif old.is_a?(DataConverter) + FFI::Type::Mapped.new(old) + + elsif old == :enum + if add.kind_of?(Array) + self.enum(add) + else + self.enum(info, add) + end + + else + FFI.find_type(old) + end + end + + # @overload enum(name, values) + # Create a named enum. + # @example + # enum :foo, [:zero, :one, :two] # named enum + # @param [Symbol] name name for new enum + # @param [Array] values values for enum + # @overload enum(*args) + # Create an unnamed enum. + # @example + # enum :zero, :one, :two # unnamed enum + # @param args values for enum + # @overload enum(values) + # Create an unnamed enum. + # @example + # enum [:zero, :one, :two] # unnamed enum, equivalent to above example + # @param [Array] values values for enum + # @overload enum(native_type, name, values) + # Create a named enum and specify the native type. + # @example + # enum FFI::Type::UINT64, :foo, [:zero, :one, :two] # named enum + # @param [FFI::Type] native_type native type for new enum + # @param [Symbol] name name for new enum + # @param [Array] values values for enum + # @overload enum(native_type, *args) + # Create an unnamed enum and specify the native type. + # @example + # enum FFI::Type::UINT64, :zero, :one, :two # unnamed enum + # @param [FFI::Type] native_type native type for new enum + # @param args values for enum + # @overload enum(native_type, values) + # Create an unnamed enum and specify the native type. + # @example + # enum Type::UINT64, [:zero, :one, :two] # unnamed enum, equivalent to above example + # @param [FFI::Type] native_type native type for new enum + # @param [Array] values values for enum + # @return [FFI::Enum] + # Create a new {FFI::Enum}. + def enum(*args) + native_type = args.first.kind_of?(FFI::Type) ? args.shift : nil + name, values = if args[0].kind_of?(Symbol) && args[1].kind_of?(Array) + [ args[0], args[1] ] + elsif args[0].kind_of?(Array) + [ nil, args[0] ] + else + [ nil, args ] + end + @ffi_enums = FFI::Enums.new unless defined?(@ffi_enums) + @ffi_enums << (e = native_type ? FFI::Enum.new(native_type, values, name) : FFI::Enum.new(values, name)) + + # If called as enum :foo, [ :zero, :one, :two ], add a typedef alias + typedef(e, name) if name + e + end + + # @param name + # @return [FFI::Enum] + # Find an enum by name. + def enum_type(name) + @ffi_enums.find(name) if defined?(@ffi_enums) + end + + # @param symbol + # @return [FFI::Enum] + # Find an enum by a symbol it contains. + def enum_value(symbol) + @ffi_enums.__map_symbol(symbol) + end + + # @param [DataConverter, Type, Struct, Symbol] t type to find + # @return [Type] + # Find a type definition. + def find_type(t) + if t.kind_of?(Type) + t + + elsif defined?(@ffi_typedefs) && @ffi_typedefs.has_key?(t) + @ffi_typedefs[t] + + elsif t.is_a?(Class) && t < Struct + Type::POINTER + + elsif t.is_a?(DataConverter) + # Add a typedef so next time the converter is used, it hits the cache + typedef Type::Mapped.new(t), t + + end || FFI.find_type(t) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/managedstruct.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/managedstruct.rb new file mode 100644 index 0000000..0536280 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/managedstruct.rb @@ -0,0 +1,84 @@ +# Copyright (C) 2008 Mike Dalessio +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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. + +module FFI + # + # FFI::ManagedStruct allows custom garbage-collection of your FFI::Structs. + # + # The typical use case would be when interacting with a library + # that has a nontrivial memory management design, such as a linked + # list or a binary tree. + # + # When the {Struct} instance is garbage collected, FFI::ManagedStruct will + # invoke the class's release() method during object finalization. + # + # @example Example usage: + # module MyLibrary + # ffi_lib "libmylibrary" + # attach_function :new_dlist, [], :pointer + # attach_function :destroy_dlist, [:pointer], :void + # end + # + # class DoublyLinkedList < FFI::ManagedStruct + # @@@ + # struct do |s| + # s.name 'struct dlist' + # s.include 'dlist.h' + # s.field :head, :pointer + # s.field :tail, :pointer + # end + # @@@ + # + # def self.release ptr + # MyLibrary.destroy_dlist(ptr) + # end + # end + # + # begin + # ptr = DoublyLinkedList.new(MyLibrary.new_dlist) + # # do something with the list + # end + # # struct is out of scope, and will be GC'd using DoublyLinkedList#release + # + # + class ManagedStruct < FFI::Struct + + # @overload initialize(pointer) + # @param [Pointer] pointer + # Create a new ManagedStruct which will invoke the class method #release on + # @overload initialize + # A new instance of FFI::ManagedStruct. + def initialize(pointer=nil) + raise NoMethodError, "release() not implemented for class #{self}" unless self.class.respond_to? :release + raise ArgumentError, "Must supply a pointer to memory for the Struct" unless pointer + super AutoPointer.new(pointer, self.class.method(:release)) + end + + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/memorypointer.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/memorypointer.rb new file mode 100644 index 0000000..9f07bc6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/memorypointer.rb @@ -0,0 +1 @@ +# This class is now implemented in C diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform.rb new file mode 100644 index 0000000..7393459 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform.rb @@ -0,0 +1,159 @@ +# +# Copyright (C) 2008, 2009 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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.# + +require 'rbconfig' +module FFI + class PlatformError < LoadError; end + + # This module defines different constants and class methods to play with + # various platforms. + module Platform + OS = case RbConfig::CONFIG['host_os'].downcase + when /linux/ + "linux" + when /darwin/ + "darwin" + when /freebsd/ + "freebsd" + when /netbsd/ + "netbsd" + when /openbsd/ + "openbsd" + when /sunos|solaris/ + "solaris" + when /mingw|mswin/ + "windows" + else + RbConfig::CONFIG['host_os'].downcase + end + + ARCH = case CPU.downcase + when /amd64|x86_64/ + "x86_64" + when /i?86|x86|i86pc/ + "i386" + when /ppc64|powerpc64/ + "powerpc64" + when /ppc|powerpc/ + "powerpc" + else + case RbConfig::CONFIG['host_cpu'] + when /^arm/ + "arm" + else + RbConfig::CONFIG['host_cpu'] + end + end + + private + # @param [String) os + # @return [Boolean] + # Test if current OS is +os+. + def self.is_os(os) + OS == os + end + + NAME = "#{ARCH}-#{OS}" + IS_GNU = defined?(GNU_LIBC) + IS_LINUX = is_os("linux") + IS_MAC = is_os("darwin") + IS_FREEBSD = is_os("freebsd") + IS_NETBSD = is_os("netbsd") + IS_OPENBSD = is_os("openbsd") + IS_SOLARIS = is_os("solaris") + IS_WINDOWS = is_os("windows") + IS_BSD = IS_MAC || IS_FREEBSD || IS_NETBSD || IS_OPENBSD + CONF_DIR = File.join(File.dirname(__FILE__), 'platform', NAME) + + public + + LIBPREFIX = case OS + when /windows/ + '' + when /cygwin/ + 'cyg' + else + 'lib' + end + + LIBSUFFIX = case OS + when /darwin/ + 'dylib' + when /linux|bsd|solaris/ + 'so' + when /windows|cygwin/ + 'dll' + else + # Punt and just assume a sane unix (i.e. anything but AIX) + 'so' + end + + LIBC = if IS_WINDOWS + RbConfig::CONFIG['RUBY_SO_NAME'].split('-')[-2] + '.dll' + elsif IS_GNU + GNU_LIBC + elsif OS == 'cygwin' + "cygwin1.dll" + else + "#{LIBPREFIX}c.#{LIBSUFFIX}" + end + + # Test if current OS is a *BSD (include MAC) + # @return [Boolean] + def self.bsd? + IS_BSD + end + + # Test if current OS is Windows + # @return [Boolean] + def self.windows? + IS_WINDOWS + end + + # Test if current OS is Mac OS + # @return [Boolean] + def self.mac? + IS_MAC + end + + # Test if current OS is Solaris (Sun OS) + # @return [Boolean] + def self.solaris? + IS_SOLARIS + end + + # Test if current OS is a unix OS + # @return [Boolean] + def self.unix? + !IS_WINDOWS + end + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/aarch64-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/aarch64-linux/types.conf new file mode 100644 index 0000000..072c419 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/aarch64-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__blksize_t = int +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsword_t = long +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/arm-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/arm-linux/types.conf new file mode 100644 index 0000000..e9a923b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/arm-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-cygwin/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-cygwin/types.conf new file mode 100644 index 0000000..cd3cc38 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-cygwin/types.conf @@ -0,0 +1,3 @@ +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.ssize_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-darwin/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-darwin/types.conf new file mode 100644 index 0000000..6b9313e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-darwin/types.conf @@ -0,0 +1,100 @@ +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__darwin_intptr_t = long +rbx.platform.typedef.__darwin_natural_t = uint +rbx.platform.typedef.__darwin_ct_rune_t = int +rbx.platform.typedef.__darwin_ptrdiff_t = int +rbx.platform.typedef.__darwin_size_t = ulong +rbx.platform.typedef.__darwin_wchar_t = int +rbx.platform.typedef.__darwin_rune_t = int +rbx.platform.typedef.__darwin_wint_t = int +rbx.platform.typedef.__darwin_clock_t = ulong +rbx.platform.typedef.__darwin_socklen_t = uint +rbx.platform.typedef.__darwin_ssize_t = long +rbx.platform.typedef.__darwin_time_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.user_addr_t = ulong_long +rbx.platform.typedef.user_size_t = ulong_long +rbx.platform.typedef.user_ssize_t = long_long +rbx.platform.typedef.user_long_t = long_long +rbx.platform.typedef.user_ulong_t = ulong_long +rbx.platform.typedef.user_time_t = long_long +rbx.platform.typedef.syscall_arg_t = ulong_long +rbx.platform.typedef.__darwin_blkcnt_t = long_long +rbx.platform.typedef.__darwin_blksize_t = int +rbx.platform.typedef.__darwin_dev_t = int +rbx.platform.typedef.__darwin_fsblkcnt_t = uint +rbx.platform.typedef.__darwin_fsfilcnt_t = uint +rbx.platform.typedef.__darwin_gid_t = uint +rbx.platform.typedef.__darwin_id_t = uint +rbx.platform.typedef.__darwin_ino64_t = ulong_long +rbx.platform.typedef.__darwin_ino_t = ulong_long +rbx.platform.typedef.__darwin_mach_port_name_t = uint +rbx.platform.typedef.__darwin_mach_port_t = uint +rbx.platform.typedef.__darwin_mode_t = ushort +rbx.platform.typedef.__darwin_off_t = long_long +rbx.platform.typedef.__darwin_pid_t = int +rbx.platform.typedef.__darwin_pthread_key_t = ulong +rbx.platform.typedef.__darwin_sigset_t = uint +rbx.platform.typedef.__darwin_suseconds_t = int +rbx.platform.typedef.__darwin_uid_t = uint +rbx.platform.typedef.__darwin_useconds_t = uint +rbx.platform.typedef.__darwin_uuid_t[16] = uchar +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.fd_mask = int +rbx.platform.typedef.pthread_key_t = ulong +rbx.platform.typedef.fsblkcnt_t = uint +rbx.platform.typedef.fsfilcnt_t = uint +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.rlim_t = ulong_long diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-freebsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-freebsd/types.conf new file mode 100644 index 0000000..3e7b20d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-freebsd/types.conf @@ -0,0 +1,152 @@ +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__clock_t = ulong +rbx.platform.typedef.__cpumask_t = uint +rbx.platform.typedef.__critical_t = int +rbx.platform.typedef.__intfptr_t = int +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__ptrdiff_t = int +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__uintfptr_t = uint +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = uint +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__u_register_t = uint +rbx.platform.typedef.__vm_offset_t = uint +rbx.platform.typedef.__vm_ooffset_t = long_long +rbx.platform.typedef.__vm_paddr_t = uint +rbx.platform.typedef.__vm_pindex_t = ulong_long +rbx.platform.typedef.__vm_size_t = uint +rbx.platform.typedef.__blksize_t = uint +rbx.platform.typedef.__blkcnt_t = long_long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__fflags_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong_long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = long_long +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__lwpid_t = int +rbx.platform.typedef.__mode_t = ushort +rbx.platform.typedef.__accmode_t = int +rbx.platform.typedef.__nl_item = int +rbx.platform.typedef.__nlink_t = ushort +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__rlim_t = long_long +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__cpuwhich_t = int +rbx.platform.typedef.__cpulevel_t = int +rbx.platform.typedef.__cpusetid_t = int +rbx.platform.typedef.__ct_rune_t = int +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.__dev_t = uint +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.pthread_key_t = int +rbx.platform.typedef.*) = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.c_caddr_t = pointer +rbx.platform.typedef.blksize_t = uint +rbx.platform.typedef.cpuwhich_t = int +rbx.platform.typedef.cpulevel_t = int +rbx.platform.typedef.cpusetid_t = int +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpumask_t = uint +rbx.platform.typedef.critical_t = int +rbx.platform.typedef.daddr_t = long_long +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef.fflags_t = uint +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.id_t = long_long +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.key_t = long +rbx.platform.typedef.lwpid_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.accmode_t = int +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.register_t = int +rbx.platform.typedef.rlim_t = long_long +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = int +rbx.platform.typedef.u_register_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.vm_offset_t = uint +rbx.platform.typedef.vm_ooffset_t = long_long +rbx.platform.typedef.vm_paddr_t = uint +rbx.platform.typedef.vm_pindex_t = ulong_long +rbx.platform.typedef.vm_size_t = uint +rbx.platform.typedef.__fd_mask = ulong +rbx.platform.typedef.fd_mask = ulong +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.socklen_t = uint + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-gnu/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-gnu/types.conf new file mode 100644 index 0000000..f9169c2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-gnu/types.conf @@ -0,0 +1,107 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__dev_t = uint +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__fsid_t = ulong_long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.fsid_t = ulong_long +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__sigset_t = ulong +rbx.platform.typedef.sigset_t = ulong +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.__pthread_t = int +rbx.platform.typedef.pthread_t = int +rbx.platform.typedef.__pthread_key = int +rbx.platform.typedef.pthread_key_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-linux/types.conf new file mode 100644 index 0000000..c46a134 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-linux/types.conf @@ -0,0 +1,103 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-netbsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-netbsd/types.conf new file mode 100644 index 0000000..33bd12b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-netbsd/types.conf @@ -0,0 +1,126 @@ +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__clock_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.register_t = int +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.vsize_t = ulong +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.time_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.__fd_mask = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-openbsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-openbsd/types.conf new file mode 100644 index 0000000..c4df68a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-openbsd/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__clock_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.register_t = int +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.vsize_t = ulong +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.time_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.__fd_mask = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-solaris/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-solaris/types.conf new file mode 100644 index 0000000..a585100 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-solaris/types.conf @@ -0,0 +1,122 @@ +rbx.platform.typedef.lock_t = uchar +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.longlong_t = long_long +rbx.platform.typedef.u_longlong_t = ulong_long +rbx.platform.typedef.t_scalar_t = long +rbx.platform.typedef.t_uscalar_t = ulong +rbx.platform.typedef.uchar_t = uchar +rbx.platform.typedef.ushort_t = ushort +rbx.platform.typedef.uint_t = uint +rbx.platform.typedef.ulong_t = ulong +rbx.platform.typedef.*caddr_t = char +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.cnt_t = short +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.pfn_t = ulong +rbx.platform.typedef.pgcnt_t = ulong +rbx.platform.typedef.spgcnt_t = long +rbx.platform.typedef.use_t = uchar +rbx.platform.typedef.sysid_t = short +rbx.platform.typedef.index_t = short +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.off64_t = long_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.blkcnt64_t = long_long +rbx.platform.typedef.fsblkcnt64_t = ulong_long +rbx.platform.typedef.fsfilcnt64_t = ulong_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.pad64_t = long_long +rbx.platform.typedef.upad64_t = ulong_long +rbx.platform.typedef.offset_t = long_long +rbx.platform.typedef.u_offset_t = ulong_long +rbx.platform.typedef.len_t = ulong_long +rbx.platform.typedef.diskaddr_t = ulong_long +rbx.platform.typedef.k_fltset_t = uint +rbx.platform.typedef.id_t = long +rbx.platform.typedef.lgrp_id_t = long +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.major_t = ulong +rbx.platform.typedef.minor_t = ulong +rbx.platform.typedef.pri_t = short +rbx.platform.typedef.cpu_flag_t = ushort +rbx.platform.typedef.o_mode_t = ushort +rbx.platform.typedef.o_dev_t = short +rbx.platform.typedef.o_uid_t = ushort +rbx.platform.typedef.o_gid_t = ushort +rbx.platform.typedef.o_nlink_t = short +rbx.platform.typedef.o_pid_t = short +rbx.platform.typedef.o_ino_t = ushort +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = ulong +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.datalink_id_t = uint +rbx.platform.typedef.taskid_t = long +rbx.platform.typedef.projid_t = long +rbx.platform.typedef.poolid_t = long +rbx.platform.typedef.zoneid_t = long +rbx.platform.typedef.ctid_t = long +rbx.platform.typedef.pthread_t = uint +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.pid_t = long +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.hrtime_t = long_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fds_mask = long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.nfds_t = ulong +rbx.platform.typedef.disp_lock_t = uchar +rbx.platform.typedef.model_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.ipaddr_t = uint +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.rlim64_t = ulong_long diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-windows/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-windows/types.conf new file mode 100644 index 0000000..38168be --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/i386-windows/types.conf @@ -0,0 +1,105 @@ +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef._off_t = long +rbx.platform.typedef._off64_t = long_long +rbx.platform.typedef._ssize_t = int +rbx.platform.typedef.wint_t = uint +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.time_t = long +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.clockid_t = ulong +rbx.platform.typedef.timer_t = ulong +rbx.platform.typedef.useconds_t = ulong +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = long +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = ulong +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = long +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = ulong +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_fast16_t = long +rbx.platform.typedef.int_fast32_t = long +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_fast16_t = ulong +rbx.platform.typedef.uint_fast32_t = ulong +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.__dev16_t = short +rbx.platform.typedef.__dev32_t = ulong +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.__blkcnt32_t = long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.__uid16_t = ushort +rbx.platform.typedef.__uid32_t = ulong +rbx.platform.typedef.uid_t = ulong +rbx.platform.typedef.__gid16_t = ushort +rbx.platform.typedef.__gid32_t = ulong +rbx.platform.typedef.gid_t = ulong +rbx.platform.typedef.__ino32_t = ulong +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.id_t = ulong +rbx.platform.typedef.key_t = long_long +rbx.platform.typedef.vm_offset_t = ulong +rbx.platform.typedef.vm_size_t = ulong +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.*addr_t = char +rbx.platform.typedef.socklen_t = int +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.__ULong = ulong +rbx.platform.typedef._fpos_t = long +rbx.platform.typedef._fpos64_t = long_long +rbx.platform.typedef.sigset_t = ulong +rbx.platform.typedef.sig_atomic_t = int +rbx.platform.typedef.rlim_t = ulong diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/ia64-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/ia64-linux/types.conf new file mode 100644 index 0000000..70e44e8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/ia64-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mips-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mips-linux/types.conf new file mode 100644 index 0000000..ad4ced0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mips-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mips64el-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mips64el-linux/types.conf new file mode 100644 index 0000000..3feb704 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mips64el-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsword_t = long +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mipsel-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mipsel-linux/types.conf new file mode 100644 index 0000000..ad4ced0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/mipsel-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-aix/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-aix/types.conf new file mode 100644 index 0000000..30ee66b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-aix/types.conf @@ -0,0 +1,180 @@ +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_fast16_t = short +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_fast16_t = ushort +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.wchar_t = ushort +rbx.platform.typedef.intfast_t = int +rbx.platform.typedef.uintfast_t = uint +rbx.platform.typedef.__long32_t = long +rbx.platform.typedef.__ulong32_t = ulong +rbx.platform.typedef.__long64_t = int +rbx.platform.typedef.__ulong64_t = uint +rbx.platform.typedef.int32long64_t = int +rbx.platform.typedef.uint32long64_t = uint +rbx.platform.typedef.long32int64_t = long +rbx.platform.typedef.ulong32int64_t = ulong +rbx.platform.typedef.int8 = char +rbx.platform.typedef.int16 = short +rbx.platform.typedef.int32 = int +rbx.platform.typedef.int64 = long_long +rbx.platform.typedef.u_int8 = uchar +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16 = ushort +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32 = uint +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64 = ulong_long +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.wctype_t = uint +rbx.platform.typedef.fpos_t = long +rbx.platform.typedef.fpos64_t = long_long +rbx.platform.typedef.time_t = int +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.uchar_t = uchar +rbx.platform.typedef.ushort_t = ushort +rbx.platform.typedef.uint_t = uint +rbx.platform.typedef.ulong_t = ulong +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.level_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.ino32_t = uint +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.cnt_t = short +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef.dev32_t = uint +rbx.platform.typedef.dev64_t = ulong_long +rbx.platform.typedef.chan_t = int +rbx.platform.typedef.time32_t = int +rbx.platform.typedef.pid32_t = int +rbx.platform.typedef.tid32_t = int +rbx.platform.typedef.pid64_t = ulong_long +rbx.platform.typedef.tid64_t = ulong_long +rbx.platform.typedef.time64_t = long_long +rbx.platform.typedef.__ptr32 = pointer +rbx.platform.typedef.__cptr32 = string +rbx.platform.typedef.soff_t = int +rbx.platform.typedef.off_t = long +rbx.platform.typedef.off64_t = long_long +rbx.platform.typedef.paddr_t = long +rbx.platform.typedef.key_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.timer32_t = int +rbx.platform.typedef.timer64_t = long_long +rbx.platform.typedef.nlink_t = short +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mid_t = pointer +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.tid_t = int +rbx.platform.typedef.slab_t[12] = char +rbx.platform.typedef.mtyp_t = long +rbx.platform.typedef.boolean_t = int +rbx.platform.typedef.crid_t = int +rbx.platform.typedef.blkcnt_t = int +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.blkcnt32_t = int +rbx.platform.typedef.blksize32_t = int +rbx.platform.typedef.blkcnt64_t = ulong_long +rbx.platform.typedef.blksize64_t = ulong_long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.wint_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.clockid_t = long_long +rbx.platform.typedef.signal_t = int +rbx.platform.typedef.pthread_t = uint +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.vmid_t = long +rbx.platform.typedef.vmhandle_t = ulong +rbx.platform.typedef.vmid32_t = int +rbx.platform.typedef.vmhandle32_t = uint +rbx.platform.typedef.kvmid_t = long +rbx.platform.typedef.kvmhandle_t = ulong +rbx.platform.typedef.vmid64_t = long_long +rbx.platform.typedef.rpn64_t = long_long +rbx.platform.typedef.cnt64_t = long_long +rbx.platform.typedef.psize_t = long_long +rbx.platform.typedef.vmidx_t = int +rbx.platform.typedef.vmfkey_t = uint +rbx.platform.typedef.vmprkey_t = uint +rbx.platform.typedef.vmkey_t = int +rbx.platform.typedef.vmhwkey_t = int +rbx.platform.typedef.vpn_t = int +rbx.platform.typedef.rpn_t = int +rbx.platform.typedef.ptex_t = ulong +rbx.platform.typedef.swhatx_t = ulong +rbx.platform.typedef.esid_t = uint +rbx.platform.typedef.aptx_t = ushort +rbx.platform.typedef.pdtx_t = int +rbx.platform.typedef.psx_t = short +rbx.platform.typedef.pshift_t = ushort +rbx.platform.typedef.sshift_t = ushort +rbx.platform.typedef.unidx_t = int +rbx.platform.typedef.snidx_t = int +rbx.platform.typedef.vmnodeidx_t = int +rbx.platform.typedef.kvpn_t = int +rbx.platform.typedef.krpn_t = int +rbx.platform.typedef.vmsize_t = int +rbx.platform.typedef.vmm_lock_t = int +rbx.platform.typedef.ureg_t = ulong +rbx.platform.typedef.vmlpghandle_t = ulong +rbx.platform.typedef.ext_t = int +rbx.platform.typedef.va_list = string +rbx.platform.typedef.__ptr64 = ulong_long +rbx.platform.typedef.__cptr64 = ulong_long +rbx.platform.typedef.UniChar = ushort +rbx.platform.typedef.UTF32Char = uint +rbx.platform.typedef.uchar = uchar +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.offset_t = long_long +rbx.platform.typedef.ssize64_t = long_long +rbx.platform.typedef.longlong_t = long_long +rbx.platform.typedef.u_longlong_t = ulong_long +rbx.platform.typedef.class_id_t = uint +rbx.platform.typedef.liobn_t = uint +rbx.platform.typedef.unit_addr_t = ulong_long +rbx.platform.typedef.size64_t = ulong_long +rbx.platform.typedef.socklen_t = ulong +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.rlim64_t = ulong_long diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-darwin/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-darwin/types.conf new file mode 100644 index 0000000..6b9313e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-darwin/types.conf @@ -0,0 +1,100 @@ +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__darwin_intptr_t = long +rbx.platform.typedef.__darwin_natural_t = uint +rbx.platform.typedef.__darwin_ct_rune_t = int +rbx.platform.typedef.__darwin_ptrdiff_t = int +rbx.platform.typedef.__darwin_size_t = ulong +rbx.platform.typedef.__darwin_wchar_t = int +rbx.platform.typedef.__darwin_rune_t = int +rbx.platform.typedef.__darwin_wint_t = int +rbx.platform.typedef.__darwin_clock_t = ulong +rbx.platform.typedef.__darwin_socklen_t = uint +rbx.platform.typedef.__darwin_ssize_t = long +rbx.platform.typedef.__darwin_time_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.user_addr_t = ulong_long +rbx.platform.typedef.user_size_t = ulong_long +rbx.platform.typedef.user_ssize_t = long_long +rbx.platform.typedef.user_long_t = long_long +rbx.platform.typedef.user_ulong_t = ulong_long +rbx.platform.typedef.user_time_t = long_long +rbx.platform.typedef.syscall_arg_t = ulong_long +rbx.platform.typedef.__darwin_blkcnt_t = long_long +rbx.platform.typedef.__darwin_blksize_t = int +rbx.platform.typedef.__darwin_dev_t = int +rbx.platform.typedef.__darwin_fsblkcnt_t = uint +rbx.platform.typedef.__darwin_fsfilcnt_t = uint +rbx.platform.typedef.__darwin_gid_t = uint +rbx.platform.typedef.__darwin_id_t = uint +rbx.platform.typedef.__darwin_ino64_t = ulong_long +rbx.platform.typedef.__darwin_ino_t = ulong_long +rbx.platform.typedef.__darwin_mach_port_name_t = uint +rbx.platform.typedef.__darwin_mach_port_t = uint +rbx.platform.typedef.__darwin_mode_t = ushort +rbx.platform.typedef.__darwin_off_t = long_long +rbx.platform.typedef.__darwin_pid_t = int +rbx.platform.typedef.__darwin_pthread_key_t = ulong +rbx.platform.typedef.__darwin_sigset_t = uint +rbx.platform.typedef.__darwin_suseconds_t = int +rbx.platform.typedef.__darwin_uid_t = uint +rbx.platform.typedef.__darwin_useconds_t = uint +rbx.platform.typedef.__darwin_uuid_t[16] = uchar +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.fd_mask = int +rbx.platform.typedef.pthread_key_t = ulong +rbx.platform.typedef.fsblkcnt_t = uint +rbx.platform.typedef.fsfilcnt_t = uint +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.rlim_t = ulong_long diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-linux/types.conf new file mode 100644 index 0000000..76014cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-linux/types.conf @@ -0,0 +1,100 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc64-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc64-linux/types.conf new file mode 100644 index 0000000..3feb704 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc64-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsword_t = long +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/s390-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/s390-linux/types.conf new file mode 100644 index 0000000..1cc79ee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/s390-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/s390x-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/s390x-linux/types.conf new file mode 100644 index 0000000..f4c8cec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/s390x-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-linux/types.conf new file mode 100644 index 0000000..1882298 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-solaris/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-solaris/types.conf new file mode 100644 index 0000000..c03c144 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-solaris/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.lock_t = uchar +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.longlong_t = long_long +rbx.platform.typedef.u_longlong_t = ulong_long +rbx.platform.typedef.t_scalar_t = long +rbx.platform.typedef.t_uscalar_t = ulong +rbx.platform.typedef.uchar_t = uchar +rbx.platform.typedef.ushort_t = ushort +rbx.platform.typedef.uint_t = uint +rbx.platform.typedef.ulong_t = ulong +rbx.platform.typedef.*caddr_t = char +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.cnt_t = short +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.pfn_t = ulong +rbx.platform.typedef.pgcnt_t = ulong +rbx.platform.typedef.spgcnt_t = long +rbx.platform.typedef.use_t = uchar +rbx.platform.typedef.sysid_t = short +rbx.platform.typedef.index_t = short +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.off64_t = long_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.blkcnt64_t = long_long +rbx.platform.typedef.fsblkcnt64_t = ulong_long +rbx.platform.typedef.fsfilcnt64_t = ulong_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.pad64_t = long_long +rbx.platform.typedef.upad64_t = ulong_long +rbx.platform.typedef.offset_t = long_long +rbx.platform.typedef.u_offset_t = ulong_long +rbx.platform.typedef.len_t = ulong_long +rbx.platform.typedef.diskaddr_t = ulong_long +rbx.platform.typedef.k_fltset_t = uint +rbx.platform.typedef.id_t = long +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.major_t = ulong +rbx.platform.typedef.minor_t = ulong +rbx.platform.typedef.pri_t = short +rbx.platform.typedef.cpu_flag_t = ushort +rbx.platform.typedef.o_mode_t = ushort +rbx.platform.typedef.o_dev_t = short +rbx.platform.typedef.o_uid_t = ushort +rbx.platform.typedef.o_gid_t = ushort +rbx.platform.typedef.o_nlink_t = short +rbx.platform.typedef.o_pid_t = short +rbx.platform.typedef.o_ino_t = ushort +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = ulong +rbx.platform.typedef.uid_t = long +rbx.platform.typedef.gid_t = long +rbx.platform.typedef.taskid_t = long +rbx.platform.typedef.projid_t = long +rbx.platform.typedef.poolid_t = long +rbx.platform.typedef.zoneid_t = long +rbx.platform.typedef.ctid_t = long +rbx.platform.typedef.pthread_t = uint +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.pid_t = long +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.hrtime_t = long_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fds_mask = long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.Psocklen_t = pointer +rbx.platform.typedef.disp_lock_t = uchar +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.rlim64_t = ulong_long +rbx.platform.typedef.kid_t = int +rbx.platform.typedef.int) = pointer +rbx.platform.typedef.size_t) = pointer +rbx.platform.typedef.int) = pointer +rbx.platform.typedef.avl_index_t = uint +rbx.platform.typedef.() = pointer +rbx.platform.typedef.nfds_t = ulong +rbx.platform.typedef.model_t = uint +rbx.platform.typedef.ts_t = long_long +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.ipaddr_t = uint diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparcv9-solaris/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparcv9-solaris/types.conf new file mode 100644 index 0000000..c03c144 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/sparcv9-solaris/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.lock_t = uchar +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.longlong_t = long_long +rbx.platform.typedef.u_longlong_t = ulong_long +rbx.platform.typedef.t_scalar_t = long +rbx.platform.typedef.t_uscalar_t = ulong +rbx.platform.typedef.uchar_t = uchar +rbx.platform.typedef.ushort_t = ushort +rbx.platform.typedef.uint_t = uint +rbx.platform.typedef.ulong_t = ulong +rbx.platform.typedef.*caddr_t = char +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.cnt_t = short +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.pfn_t = ulong +rbx.platform.typedef.pgcnt_t = ulong +rbx.platform.typedef.spgcnt_t = long +rbx.platform.typedef.use_t = uchar +rbx.platform.typedef.sysid_t = short +rbx.platform.typedef.index_t = short +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.off64_t = long_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.blkcnt64_t = long_long +rbx.platform.typedef.fsblkcnt64_t = ulong_long +rbx.platform.typedef.fsfilcnt64_t = ulong_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.pad64_t = long_long +rbx.platform.typedef.upad64_t = ulong_long +rbx.platform.typedef.offset_t = long_long +rbx.platform.typedef.u_offset_t = ulong_long +rbx.platform.typedef.len_t = ulong_long +rbx.platform.typedef.diskaddr_t = ulong_long +rbx.platform.typedef.k_fltset_t = uint +rbx.platform.typedef.id_t = long +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.major_t = ulong +rbx.platform.typedef.minor_t = ulong +rbx.platform.typedef.pri_t = short +rbx.platform.typedef.cpu_flag_t = ushort +rbx.platform.typedef.o_mode_t = ushort +rbx.platform.typedef.o_dev_t = short +rbx.platform.typedef.o_uid_t = ushort +rbx.platform.typedef.o_gid_t = ushort +rbx.platform.typedef.o_nlink_t = short +rbx.platform.typedef.o_pid_t = short +rbx.platform.typedef.o_ino_t = ushort +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = ulong +rbx.platform.typedef.uid_t = long +rbx.platform.typedef.gid_t = long +rbx.platform.typedef.taskid_t = long +rbx.platform.typedef.projid_t = long +rbx.platform.typedef.poolid_t = long +rbx.platform.typedef.zoneid_t = long +rbx.platform.typedef.ctid_t = long +rbx.platform.typedef.pthread_t = uint +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.pid_t = long +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.hrtime_t = long_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fds_mask = long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.Psocklen_t = pointer +rbx.platform.typedef.disp_lock_t = uchar +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.rlim64_t = ulong_long +rbx.platform.typedef.kid_t = int +rbx.platform.typedef.int) = pointer +rbx.platform.typedef.size_t) = pointer +rbx.platform.typedef.int) = pointer +rbx.platform.typedef.avl_index_t = uint +rbx.platform.typedef.() = pointer +rbx.platform.typedef.nfds_t = ulong +rbx.platform.typedef.model_t = uint +rbx.platform.typedef.ts_t = long_long +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.ipaddr_t = uint diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-cygwin/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-cygwin/types.conf new file mode 100644 index 0000000..5dadc7f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-cygwin/types.conf @@ -0,0 +1,3 @@ +rbx.platform.typedef.size_t = uint64 +rbx.platform.typedef.ptrdiff_t = int64 +rbx.platform.typedef.ssize_t = int64 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-darwin/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-darwin/types.conf new file mode 100644 index 0000000..51637ee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-darwin/types.conf @@ -0,0 +1,126 @@ +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__darwin_intptr_t = long +rbx.platform.typedef.__darwin_natural_t = uint +rbx.platform.typedef.__darwin_ct_rune_t = int +rbx.platform.typedef.__darwin_ptrdiff_t = long +rbx.platform.typedef.__darwin_size_t = ulong +rbx.platform.typedef.__darwin_wchar_t = int +rbx.platform.typedef.__darwin_rune_t = int +rbx.platform.typedef.__darwin_wint_t = int +rbx.platform.typedef.__darwin_clock_t = ulong +rbx.platform.typedef.__darwin_socklen_t = uint +rbx.platform.typedef.__darwin_ssize_t = long +rbx.platform.typedef.__darwin_time_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long_long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.user_addr_t = ulong_long +rbx.platform.typedef.user_size_t = ulong_long +rbx.platform.typedef.user_ssize_t = long_long +rbx.platform.typedef.user_long_t = long_long +rbx.platform.typedef.user_ulong_t = ulong_long +rbx.platform.typedef.user_time_t = long_long +rbx.platform.typedef.user_off_t = long_long +rbx.platform.typedef.syscall_arg_t = ulong_long +rbx.platform.typedef.__darwin_blkcnt_t = long_long +rbx.platform.typedef.__darwin_blksize_t = int +rbx.platform.typedef.__darwin_dev_t = int +rbx.platform.typedef.__darwin_fsblkcnt_t = uint +rbx.platform.typedef.__darwin_fsfilcnt_t = uint +rbx.platform.typedef.__darwin_gid_t = uint +rbx.platform.typedef.__darwin_id_t = uint +rbx.platform.typedef.__darwin_ino64_t = ulong_long +rbx.platform.typedef.__darwin_ino_t = ulong_long +rbx.platform.typedef.__darwin_mach_port_name_t = uint +rbx.platform.typedef.__darwin_mach_port_t = uint +rbx.platform.typedef.__darwin_mode_t = ushort +rbx.platform.typedef.__darwin_off_t = long_long +rbx.platform.typedef.__darwin_pid_t = int +rbx.platform.typedef.__darwin_sigset_t = uint +rbx.platform.typedef.__darwin_suseconds_t = int +rbx.platform.typedef.__darwin_uid_t = uint +rbx.platform.typedef.__darwin_useconds_t = uint +rbx.platform.typedef.__darwin_uuid_t[16] = uchar +rbx.platform.typedef.__darwin_uuid_string_t[37] = char +rbx.platform.typedef.__darwin_pthread_key_t = ulong +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.rsize_t = ulong +rbx.platform.typedef.errno_t = int +rbx.platform.typedef.fd_mask = int +rbx.platform.typedef.pthread_key_t = ulong +rbx.platform.typedef.fsblkcnt_t = uint +rbx.platform.typedef.fsfilcnt_t = uint +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_fast16_t = short +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_fast16_t = ushort +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.intmax_t = long +rbx.platform.typedef.uintmax_t = ulong +rbx.platform.typedef.rlim_t = ulong_long diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-freebsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-freebsd/types.conf new file mode 100644 index 0000000..c4df68a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-freebsd/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__clock_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.register_t = int +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.vsize_t = ulong +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.time_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.__fd_mask = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-linux/types.conf new file mode 100644 index 0000000..f319c0b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__priority_which_t = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-netbsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-netbsd/types.conf new file mode 100644 index 0000000..c4df68a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-netbsd/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__clock_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.register_t = int +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.vsize_t = ulong +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.time_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.__fd_mask = int diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-openbsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-openbsd/types.conf new file mode 100644 index 0000000..f8419bd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-openbsd/types.conf @@ -0,0 +1,134 @@ +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__register_t = long +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__blkcnt_t = long_long +rbx.platform.typedef.__blksize_t = int +rbx.platform.typedef.__clock_t = long_long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong_long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = ulong_long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__time_t = long_long +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.register_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.vsize_t = ulong +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr_t = long_long +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.clock_t = long_long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.time_t = long_long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.__fd_mask = uint +rbx.platform.typedef.sigset_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.sa_family_t = uchar diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-solaris/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-solaris/types.conf new file mode 100644 index 0000000..f461b7e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-solaris/types.conf @@ -0,0 +1,122 @@ +rbx.platform.typedef.lock_t = uchar +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong +rbx.platform.typedef.intmax_t = long +rbx.platform.typedef.uintmax_t = ulong +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong +rbx.platform.typedef.longlong_t = long_long +rbx.platform.typedef.u_longlong_t = ulong_long +rbx.platform.typedef.t_scalar_t = int +rbx.platform.typedef.t_uscalar_t = uint +rbx.platform.typedef.uchar_t = uchar +rbx.platform.typedef.ushort_t = ushort +rbx.platform.typedef.uint_t = uint +rbx.platform.typedef.ulong_t = ulong +rbx.platform.typedef.*caddr_t = char +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.cnt_t = short +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.pfn_t = ulong +rbx.platform.typedef.pgcnt_t = ulong +rbx.platform.typedef.spgcnt_t = long +rbx.platform.typedef.use_t = uchar +rbx.platform.typedef.sysid_t = short +rbx.platform.typedef.index_t = short +rbx.platform.typedef.off_t = long +rbx.platform.typedef.off64_t = long +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.ino64_t = ulong +rbx.platform.typedef.blkcnt64_t = long +rbx.platform.typedef.fsblkcnt64_t = ulong +rbx.platform.typedef.fsfilcnt64_t = ulong +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.pad64_t = long +rbx.platform.typedef.upad64_t = ulong +rbx.platform.typedef.offset_t = long_long +rbx.platform.typedef.u_offset_t = ulong_long +rbx.platform.typedef.len_t = ulong_long +rbx.platform.typedef.diskaddr_t = ulong_long +rbx.platform.typedef.k_fltset_t = uint +rbx.platform.typedef.id_t = int +rbx.platform.typedef.lgrp_id_t = int +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.major_t = uint +rbx.platform.typedef.minor_t = uint +rbx.platform.typedef.pri_t = short +rbx.platform.typedef.cpu_flag_t = ushort +rbx.platform.typedef.o_mode_t = ushort +rbx.platform.typedef.o_dev_t = short +rbx.platform.typedef.o_uid_t = ushort +rbx.platform.typedef.o_gid_t = ushort +rbx.platform.typedef.o_nlink_t = short +rbx.platform.typedef.o_pid_t = short +rbx.platform.typedef.o_ino_t = ushort +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.datalink_id_t = uint +rbx.platform.typedef.taskid_t = int +rbx.platform.typedef.projid_t = int +rbx.platform.typedef.poolid_t = int +rbx.platform.typedef.zoneid_t = int +rbx.platform.typedef.ctid_t = int +rbx.platform.typedef.pthread_t = uint +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.hrtime_t = long_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fds_mask = long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.nfds_t = ulong +rbx.platform.typedef.disp_lock_t = uchar +rbx.platform.typedef.model_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.ipaddr_t = uint +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.rlim64_t = ulong_long diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-windows/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-windows/types.conf new file mode 100644 index 0000000..0909c19 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-windows/types.conf @@ -0,0 +1,27 @@ +rbx.platform.typedef.size_t = ulong_long +rbx.platform.typedef.ssize_t = long_long +rbx.platform.typedef.intptr_t = long_long +rbx.platform.typedef.uintptr_t = ulong_long +rbx.platform.typedef.ptrdiff_t = long_long +rbx.platform.typedef.wchar_t = ushort +rbx.platform.typedef.wint_t = ushort +rbx.platform.typedef.wctype_t = ushort +rbx.platform.typedef.errno_t = int +rbx.platform.typedef.__time32_t = long +rbx.platform.typedef.__time64_t = long_long +rbx.platform.typedef.time_t = long_long +rbx.platform.typedef._ino_t = ushort +rbx.platform.typedef.ino_t = ushort +rbx.platform.typedef._dev_t = uint +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef._pid_t = long_long +rbx.platform.typedef.pid_t = long_long +rbx.platform.typedef._mode_t = ushort +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef._off_t = long +rbx.platform.typedef.off32_t = long +rbx.platform.typedef._off64_t = long_long +rbx.platform.typedef.off64_t = long_long +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef._sigset_t = ulong_long diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/pointer.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/pointer.rb new file mode 100644 index 0000000..de4f91f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/pointer.rb @@ -0,0 +1,160 @@ +# +# Copyright (C) 2008, 2009 Wayne Meissner +# Copyright (c) 2007, 2008 Evan Phoenix +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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. +# + +require 'ffi/platform' +module FFI + class Pointer + + # Pointer size + SIZE = Platform::ADDRESS_SIZE / 8 + + # Return the size of a pointer on the current platform, in bytes + # @return [Numeric] + def self.size + SIZE + end + + # @param [nil,Numeric] len length of string to return + # @return [String] + # Read pointer's contents as a string, or the first +len+ bytes of the + # equivalent string if +len+ is not +nil+. + def read_string(len=nil) + if len + get_bytes(0, len) + else + get_string(0) + end + end + + # @param [Numeric] len length of string to return + # @return [String] + # Read the first +len+ bytes of pointer's contents as a string. + # + # Same as: + # ptr.read_string(len) # with len not nil + def read_string_length(len) + get_bytes(0, len) + end + + # @return [String] + # Read pointer's contents as a string. + # + # Same as: + # ptr.read_string # with no len + def read_string_to_null + get_string(0) + end + + # @param [String] str string to write + # @param [Numeric] len length of string to return + # @return [self] + # Write +len+ first bytes of +str+ in pointer's contents. + # + # Same as: + # ptr.write_string(str, len) # with len not nil + def write_string_length(str, len) + put_bytes(0, str, 0, len) + end + + # @param [String] str string to write + # @param [Numeric] len length of string to return + # @return [self] + # Write +str+ in pointer's contents, or first +len+ bytes if + # +len+ is not +nil+. + def write_string(str, len=nil) + len = str.bytesize unless len + # Write the string data without NUL termination + put_bytes(0, str, 0, len) + end + + # @param [Type] type type of data to read from pointer's contents + # @param [Symbol] reader method to send to +self+ to read +type+ + # @param [Numeric] length + # @return [Array] + # Read an array of +type+ of length +length+. + # @example + # ptr.read_array_of_type(TYPE_UINT8, :get_uint8, 4) # -> [1, 2, 3, 4] + def read_array_of_type(type, reader, length) + ary = [] + size = FFI.type_size(type) + tmp = self + length.times { |j| + ary << tmp.send(reader) + tmp += size unless j == length-1 # avoid OOB + } + ary + end + + # @param [Type] type type of data to write to pointer's contents + # @param [Symbol] writer method to send to +self+ to write +type+ + # @param [Array] ary + # @return [self] + # Write +ary+ in pointer's contents as +type+. + # @example + # ptr.write_array_of_type(TYPE_UINT8, :put_uint8, [1, 2, 3 ,4]) + def write_array_of_type(type, writer, ary) + size = FFI.type_size(type) + tmp = self + ary.each_with_index {|i, j| + tmp.send(writer, i) + tmp += size unless j == ary.length-1 # avoid OOB + } + self + end + + # @return [self] + def to_ptr + self + end + + # @param [Symbol,Type] type of data to read + # @return [Object] + # Read pointer's contents as +type+ + # + # Same as: + # ptr.get(type, 0) + def read(type) + get(type, 0) + end + + # @param [Symbol,Type] type of data to read + # @param [Object] value to write + # @return [nil] + # Write +value+ of type +type+ to pointer's content + # + # Same as: + # ptr.put(type, 0) + def write(type, value) + put(type, 0, value) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/struct.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/struct.rb new file mode 100644 index 0000000..0896d35 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/struct.rb @@ -0,0 +1,373 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# Copyright (C) 2008, 2009 Andrea Fazzi +# Copyright (C) 2008, 2009 Luc Heinrich +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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. +# + +require 'ffi/platform' +require 'ffi/struct_layout_builder' + +module FFI + + class StructLayout + + # @return [Array + # Get an array of tuples (field name, offset of the field). + def offsets + members.map { |m| [ m, self[m].offset ] } + end + + # @return [Numeric] + # Get the offset of a field. + def offset_of(field_name) + self[field_name].offset + end + + # An enum {Field} in a {StructLayout}. + class Enum < Field + + # @param [AbstractMemory] ptr pointer on a {Struct} + # @return [Object] + # Get an object of type {#type} from memory pointed by +ptr+. + def get(ptr) + type.find(ptr.get_int(offset)) + end + + # @param [AbstractMemory] ptr pointer on a {Struct} + # @param value + # @return [nil] + # Set +value+ into memory pointed by +ptr+. + def put(ptr, value) + ptr.put_int(offset, type.find(value)) + end + + end + + class InnerStruct < Field + def get(ptr) + type.struct_class.new(ptr.slice(self.offset, self.size)) + end + + def put(ptr, value) + raise TypeError, "wrong value type (expected #{type.struct_class})" unless value.is_a?(type.struct_class) + ptr.slice(self.offset, self.size).__copy_from__(value.pointer, self.size) + end + end + + class Mapped < Field + def initialize(name, offset, type, orig_field) + super(name, offset, type) + @orig_field = orig_field + end + + def get(ptr) + type.from_native(@orig_field.get(ptr), nil) + end + + def put(ptr, value) + @orig_field.put(ptr, type.to_native(value, nil)) + end + end + end + + + class Struct + + # Get struct size + # @return [Numeric] + def size + self.class.size + end + + # @return [Fixnum] Struct alignment + def alignment + self.class.alignment + end + alias_method :align, :alignment + + # (see FFI::StructLayout#offset_of) + def offset_of(name) + self.class.offset_of(name) + end + + # (see FFI::StructLayout#members) + def members + self.class.members + end + + # @return [Array] + # Get array of values from Struct fields. + def values + members.map { |m| self[m] } + end + + # (see FFI::StructLayout#offsets) + def offsets + self.class.offsets + end + + # Clear the struct content. + # @return [self] + def clear + pointer.clear + self + end + + # Get {Pointer} to struct content. + # @return [AbstractMemory] + def to_ptr + pointer + end + + # Get struct size + # @return [Numeric] + def self.size + defined?(@layout) ? @layout.size : defined?(@size) ? @size : 0 + end + + # set struct size + # @param [Numeric] size + # @return [size] + def self.size=(size) + raise ArgumentError, "Size already set" if defined?(@size) || defined?(@layout) + @size = size + end + + # @return (see Struct#alignment) + def self.alignment + @layout.alignment + end + + # (see FFI::Type#members) + def self.members + @layout.members + end + + # (see FFI::StructLayout#offsets) + def self.offsets + @layout.offsets + end + + # (see FFI::StructLayout#offset_of) + def self.offset_of(name) + @layout.offset_of(name) + end + + def self.in + ptr(:in) + end + + def self.out + ptr(:out) + end + + def self.ptr(flags = :inout) + @ref_data_type ||= Type::Mapped.new(StructByReference.new(self)) + end + + def self.val + @val_data_type ||= StructByValue.new(self) + end + + def self.by_value + self.val + end + + def self.by_ref(flags = :inout) + self.ptr(flags) + end + + class ManagedStructConverter < StructByReference + + # @param [Struct] struct_class + def initialize(struct_class) + super(struct_class) + + raise NoMethodError, "release() not implemented for class #{struct_class}" unless struct_class.respond_to? :release + @method = struct_class.method(:release) + end + + # @param [Pointer] ptr + # @param [nil] ctx + # @return [Struct] + def from_native(ptr, ctx) + struct_class.new(AutoPointer.new(ptr, @method)) + end + end + + def self.auto_ptr + @managed_type ||= Type::Mapped.new(ManagedStructConverter.new(self)) + end + + + class << self + public + + # @return [StructLayout] + # @overload layout + # @return [StructLayout] + # Get struct layout. + # @overload layout(*spec) + # @param [Array,Array(Hash)] spec + # @return [StructLayout] + # Create struct layout from +spec+. + # @example Creating a layout from an array +spec+ + # class MyStruct < Struct + # layout :field1, :int, + # :field2, :pointer, + # :field3, :string + # end + # @example Creating a layout from an array +spec+ with offset + # class MyStructWithOffset < Struct + # layout :field1, :int, + # :field2, :pointer, 6, # set offset to 6 for this field + # :field3, :string + # end + # @example Creating a layout from a hash +spec+ (Ruby 1.9 only) + # class MyStructFromHash < Struct + # layout :field1 => :int, + # :field2 => :pointer, + # :field3 => :string + # end + # @example Creating a layout with pointers to functions + # class MyFunctionTable < Struct + # layout :function1, callback([:int, :int], :int), + # :function2, callback([:pointer], :void), + # :field3, :string + # end + # @note Creating a layout from a hash +spec+ is supported only for Ruby 1.9. + def layout(*spec) + #raise RuntimeError, "struct layout already defined for #{self.inspect}" if defined?(@layout) + return @layout if spec.size == 0 + + builder = StructLayoutBuilder.new + builder.union = self < Union + builder.packed = @packed if defined?(@packed) + builder.alignment = @min_alignment if defined?(@min_alignment) + + if spec[0].kind_of?(Hash) + hash_layout(builder, spec) + else + array_layout(builder, spec) + end + builder.size = @size if defined?(@size) && @size > builder.size + cspec = builder.build + @layout = cspec unless self == Struct + @size = cspec.size + return cspec + end + + + protected + + def callback(params, ret) + mod = enclosing_module + FFI::CallbackInfo.new(find_type(ret, mod), params.map { |e| find_type(e, mod) }) + end + + def packed(packed = 1) + @packed = packed + end + alias :pack :packed + + def aligned(alignment = 1) + @min_alignment = alignment + end + alias :align :aligned + + def enclosing_module + begin + mod = self.name.split("::")[0..-2].inject(Object) { |obj, c| obj.const_get(c) } + (mod < FFI::Library || mod < FFI::Struct || mod.respond_to?(:find_type)) ? mod : nil + rescue Exception + nil + end + end + + + def find_field_type(type, mod = enclosing_module) + if type.kind_of?(Class) && type < Struct + FFI::Type::Struct.new(type) + + elsif type.kind_of?(Class) && type < FFI::StructLayout::Field + type + + elsif type.kind_of?(::Array) + FFI::Type::Array.new(find_field_type(type[0]), type[1]) + + else + find_type(type, mod) + end + end + + def find_type(type, mod = enclosing_module) + if mod + mod.find_type(type) + end || FFI.find_type(type) + end + + private + + # @param [StructLayoutBuilder] builder + # @param [Hash] spec + # @return [builder] + # @raise if Ruby 1.8 + # Add hash +spec+ to +builder+. + def hash_layout(builder, spec) + raise "Ruby version not supported" if RUBY_VERSION =~ /^1\.8\..*/ + spec[0].each do |name, type| + builder.add name, find_field_type(type), nil + end + end + + # @param [StructLayoutBuilder] builder + # @param [Array] spec + # @return [builder] + # Add array +spec+ to +builder+. + def array_layout(builder, spec) + i = 0 + while i < spec.size + name, type = spec[i, 2] + i += 2 + + # If the next param is a Integer, it specifies the offset + if spec[i].kind_of?(Integer) + offset = spec[i] + i += 1 + else + offset = nil + end + + builder.add name, find_field_type(type), offset + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/struct_layout_builder.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/struct_layout_builder.rb new file mode 100644 index 0000000..4d6a464 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/struct_layout_builder.rb @@ -0,0 +1,227 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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. +# + +module FFI + + # Build a {StructLayout struct layout}. + class StructLayoutBuilder + attr_reader :size + attr_reader :alignment + + def initialize + @size = 0 + @alignment = 1 + @min_alignment = 1 + @packed = false + @union = false + @fields = Array.new + end + + # Set size attribute with +size+ only if +size+ is greater than attribute value. + # @param [Numeric] size + def size=(size) + @size = size if size > @size + end + + # Set alignment attribute with +align+ only if it is greater than attribute value. + # @param [Numeric] align + def alignment=(align) + @alignment = align if align > @alignment + @min_alignment = align + end + + # Set union attribute. + # Set to +true+ to build a {Union} instead of a {Struct}. + # @param [Boolean] is_union + # @return [is_union] + def union=(is_union) + @union = is_union + end + + # Building a {Union} or a {Struct} ? + # + # @return [Boolean] + # + def union? + @union + end + + # Set packed attribute + # @overload packed=(packed) Set alignment and packed attributes to + # +packed+. + # + # @param [Fixnum] packed + # + # @return [packed] + # @overload packed=(packed) Set packed attribute. + # @param packed + # + # @return [0,1] + # + def packed=(packed) + if packed.is_a?(0.class) + @alignment = packed + @packed = packed + else + @packed = packed ? 1 : 0 + end + end + + + # List of number types + NUMBER_TYPES = [ + Type::INT8, + Type::UINT8, + Type::INT16, + Type::UINT16, + Type::INT32, + Type::UINT32, + Type::LONG, + Type::ULONG, + Type::INT64, + Type::UINT64, + Type::FLOAT32, + Type::FLOAT64, + Type::LONGDOUBLE, + Type::BOOL, + ] + + # @param [String, Symbol] name name of the field + # @param [Array, DataConverter, Struct, StructLayout::Field, Symbol, Type] type type of the field + # @param [Numeric, nil] offset + # @return [self] + # Add a field to the builder. + # @note Setting +offset+ to +nil+ or +-1+ is equivalent to +0+. + def add(name, type, offset = nil) + + if offset.nil? || offset == -1 + offset = @union ? 0 : align(@size, @packed ? [ @packed, type.alignment ].min : [ @min_alignment, type.alignment ].max) + end + + # + # If a FFI::Type type was passed in as the field arg, try and convert to a StructLayout::Field instance + # + field = type.is_a?(StructLayout::Field) ? type : field_for_type(name, offset, type) + @fields << field + @alignment = [ @alignment, field.alignment ].max unless @packed + @size = [ @size, field.size + (@union ? 0 : field.offset) ].max + + return self + end + + # @param (see #add) + # @return (see #add) + # Same as {#add}. + # @see #add + def add_field(name, type, offset = nil) + add(name, type, offset) + end + + # @param (see #add) + # @return (see #add) + # Add a struct as a field to the builder. + def add_struct(name, type, offset = nil) + add(name, Type::Struct.new(type), offset) + end + + # @param name (see #add) + # @param type (see #add) + # @param [Numeric] count array length + # @param offset (see #add) + # @return (see #add) + # Add an array as a field to the builder. + def add_array(name, type, count, offset = nil) + add(name, Type::Array.new(type, count), offset) + end + + # @return [StructLayout] + # Build and return the struct layout. + def build + # Add tail padding if the struct is not packed + size = @packed ? @size : align(@size, @alignment) + + layout = StructLayout.new(@fields, size, @alignment) + layout.__union! if @union + layout + end + + private + + # @param [Numeric] offset + # @param [Numeric] align + # @return [Numeric] + def align(offset, align) + align + ((offset - 1) & ~(align - 1)); + end + + # @param (see #add) + # @return [StructLayout::Field] + def field_for_type(name, offset, type) + field_class = case + when type.is_a?(Type::Function) + StructLayout::Function + + when type.is_a?(Type::Struct) + StructLayout::InnerStruct + + when type.is_a?(Type::Array) + StructLayout::Array + + when type.is_a?(FFI::Enum) + StructLayout::Enum + + when NUMBER_TYPES.include?(type) + StructLayout::Number + + when type == Type::POINTER + StructLayout::Pointer + + when type == Type::STRING + StructLayout::String + + when type.is_a?(Class) && type < StructLayout::Field + type + + when type.is_a?(DataConverter) + return StructLayout::Mapped.new(name, offset, Type::Mapped.new(type), field_for_type(name, offset, type.native_type)) + + when type.is_a?(Type::Mapped) + return StructLayout::Mapped.new(name, offset, type, field_for_type(name, offset, type.native_type)) + + else + raise TypeError, "invalid struct field type #{type.inspect}" + end + + field_class.new(name, offset, type) + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/const_generator.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/const_generator.rb new file mode 100644 index 0000000..dfc622e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/const_generator.rb @@ -0,0 +1,229 @@ +require 'tempfile' +require 'open3' + +module FFI + + # ConstGenerator turns C constants into ruby values. + # + # @example a simple example for stdio + # cg = FFI::ConstGenerator.new('stdio') do |gen| + # gen.const(:SEEK_SET) + # gen.const('SEEK_CUR') + # gen.const('seek_end') # this constant does not exist + # end # #calculate called automatically at the end of the block + # + # cg['SEEK_SET'] # => 0 + # cg['SEEK_CUR'] # => 1 + # cg['seek_end'] # => nil + # cg.to_ruby # => "SEEK_SET = 0\nSEEK_CUR = 1\n# seek_end not available" + class ConstGenerator + @options = {} + attr_reader :constants + + # Creates a new constant generator that uses +prefix+ as a name, and an + # options hash. + # + # The only option is +:required+, which if set to +true+ raises an error if a + # constant you have requested was not found. + # + # @param [#to_s] prefix + # @param [Hash] options + # @return + # @option options [Boolean] :required + # @overload initialize(prefix, options) + # @overload initialize(prefix, options) { |gen| ... } + # @yieldparam [ConstGenerator] gen new generator is passed to the block + # When passed a block, {#calculate} is automatically called at the end of + # the block, otherwise you must call it yourself. + def initialize(prefix = nil, options = {}) + @includes = ['stdio.h', 'stddef.h'] + @constants = {} + @prefix = prefix + + @required = options[:required] + @options = options + + if block_given? then + yield self + calculate self.class.options.merge(options) + end + end + # Set class options + # These options are merged with {#initialize} options when it is called with a block. + # @param [Hash] options + # @return [Hash] class options + def self.options=(options) + @options = options + end + # Get class options. + # @return [Hash] class options + def self.options + @options + end + # @param [String] name + # @return constant value (converted if a +converter+ was defined). + # Access a constant by name. + def [](name) + @constants[name].converted_value + end + + # Request the value for C constant +name+. + # + # @param [#to_s] name C constant name + # @param [String] format a printf format string to print the value out + # @param [String] cast a C cast for the value + # @param ruby_name alternate ruby name for {#to_ruby} + # + # @overload const(name, format=nil, cast='', ruby_name=nil, converter=nil) + # +converter+ is a Method or a Proc. + # @param [#call] converter convert the value from a string to the appropriate + # type for {#to_ruby}. + # @overload const(name, format=nil, cast='', ruby_name=nil) { |value| ... } + # Use a converter block. This block convert the value from a string to the + # appropriate type for {#to_ruby}. + # @yieldparam value constant value + def const(name, format = nil, cast = '', ruby_name = nil, converter = nil, + &converter_proc) + format ||= '%d' + cast ||= '' + + if converter_proc and converter then + raise ArgumentError, "Supply only converter or converter block" + end + + converter = converter_proc if converter.nil? + + const = Constant.new name, format, cast, ruby_name, converter + @constants[name.to_s] = const + return const + end + + # Calculate constants values. + # @param [Hash] options + # @option options [String] :cppflags flags for C compiler + # @return [nil] + # @raise if a constant is missing and +:required+ was set to +true+ (see {#initialize}) + def calculate(options = {}) + binary = File.join Dir.tmpdir, "rb_const_gen_bin_#{Process.pid}" + + Tempfile.open("#{@prefix}.const_generator") do |f| + @includes.each do |inc| + f.puts "#include <#{inc}>" + end + f.puts "\nint main(int argc, char **argv)\n{" + + @constants.each_value do |const| + f.puts <<-EOF + #ifdef #{const.name} + printf("#{const.name} #{const.format}\\n", #{const.cast}#{const.name}); + #endif + EOF + end + + f.puts "\n\treturn 0;\n}" + f.flush + + output = `gcc #{options[:cppflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -x c -Wall -Werror #{f.path} -o #{binary} 2>&1` + + unless $?.success? then + output = output.split("\n").map { |l| "\t#{l}" }.join "\n" + raise "Compilation error generating constants #{@prefix}:\n#{output}" + end + end + + output = `#{binary}` + File.unlink(binary + (FFI::Platform.windows? ? ".exe" : "")) + output.each_line do |line| + line =~ /^(\S+)\s(.*)$/ + const = @constants[$1] + const.value = $2 + end + + missing_constants = @constants.select do |name, constant| + constant.value.nil? + end.map { |name,| name } + + if @required and not missing_constants.empty? then + raise "Missing required constants for #{@prefix}: #{missing_constants.join ', '}" + end + end + + # Dump constants to +io+. + # @param [#puts] io + # @return [nil] + def dump_constants(io) + @constants.each do |name, constant| + name = [@prefix, name].join '.' if @prefix + io.puts "#{name} = #{constant.converted_value}" + end + end + + # Outputs values for discovered constants. If the constant's value was + # not discovered it is not omitted. + # @return [String] + def to_ruby + @constants.sort_by { |name,| name }.map do |name, constant| + if constant.value.nil? then + "# #{name} not available" + else + constant.to_ruby + end + end.join "\n" + end + + # Add additional C include file(s) to calculate constants from. + # @note +stdio.h+ and +stddef.h+ automatically included + # @param [List, Array] i include file(s) + # @return [Array] array of include files + def include(*i) + @includes |= i.flatten + end + + end + + # This class hold constants for {ConstGenerator} + class ConstGenerator::Constant + + attr_reader :name, :format, :cast + attr_accessor :value + + # @param [#to_s] name + # @param [String] format a printf format string to print the value out + # @param [String] cast a C cast for the value + # @param ruby_name alternate ruby name for {#to_ruby} + # @param [#call] converter convert the value from a string to the appropriate + # type for {#to_ruby}. + def initialize(name, format, cast, ruby_name = nil, converter=nil) + @name = name + @format = format + @cast = cast + @ruby_name = ruby_name + @converter = converter + @value = nil + end + + # Return constant value (converted if a +converter+ was defined). + # @return constant value. + def converted_value + if @converter + @converter.call(@value) + else + @value + end + end + + # get constant ruby name + # @return [String] + def ruby_name + @ruby_name || @name + end + + # Get an evaluable string from constant. + # @return [String] + def to_ruby + "#{ruby_name} = #{converted_value}" + end + + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/generator.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/generator.rb new file mode 100644 index 0000000..29b59e1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/generator.rb @@ -0,0 +1,60 @@ +module FFI + + # @private + class Generator + + def initialize(ffi_name, rb_name, options = {}) + @ffi_name = ffi_name + @rb_name = rb_name + @options = options + @name = File.basename rb_name, '.rb' + + file = File.read @ffi_name + + new_file = file.gsub(/^( *)@@@(.*?)@@@/m) do + @constants = [] + @structs = [] + + indent = $1 + original_lines = $2.count "\n" + + instance_eval $2, @ffi_name, $`.count("\n") + + new_lines = [] + @constants.each { |c| new_lines << c.to_ruby } + @structs.each { |s| new_lines << s.generate_layout } + + new_lines = new_lines.join("\n").split "\n" # expand multiline blocks + new_lines = new_lines.map { |line| indent + line } + + padding = original_lines - new_lines.length + new_lines += [nil] * padding if padding >= 0 + + new_lines.join "\n" + end + + open @rb_name, 'w' do |f| + f.puts "# This file is generated by rake. Do not edit." + f.puts + f.puts new_file + end + end + + def constants(options = {}, &block) + @constants << FFI::ConstGenerator.new(@name, @options.merge(options), &block) + end + + def struct(options = {}, &block) + @structs << FFI::StructGenerator.new(@name, @options.merge(options), &block) + end + + ## + # Utility converter for constants + + def to_s + proc { |obj| obj.to_s.inspect } + end + + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/generator_task.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/generator_task.rb new file mode 100644 index 0000000..9e39519 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/generator_task.rb @@ -0,0 +1,36 @@ +begin + require 'ffi/struct_generator' + require 'ffi/const_generator' + require 'ffi/generator' +rescue LoadError + # from Rakefile + require 'lib/ffi/struct_generator' + require 'lib/ffi/const_generator' + require 'lib/ffi/generator' +end + +require 'rake' +require 'rake/tasklib' +require 'tempfile' + +## +# Rake task that calculates C structs for FFI::Struct. + +# @private +class FFI::Generator::Task < Rake::TaskLib + + def initialize(rb_names) + task :clean do rm_f rb_names end + + rb_names.each do |rb_name| + ffi_name = "#{rb_name}.ffi" + + file rb_name => ffi_name do |t| + puts "Generating #{rb_name}..." if Rake.application.options.trace + + FFI::Generator.new ffi_name, rb_name + end + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/struct_generator.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/struct_generator.rb new file mode 100644 index 0000000..e892e65 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/struct_generator.rb @@ -0,0 +1,194 @@ +require 'tempfile' + +module FFI + + ## + # Generates an FFI Struct layout. + # + # Given the @@@ portion in: + # + # module Zlib::ZStream < FFI::Struct + # @@@ + # name "struct z_stream_s" + # include "zlib.h" + # + # field :next_in, :pointer + # field :avail_in, :uint + # field :total_in, :ulong + # + # # ... + # @@@ + # end + # + # StructGenerator will create the layout: + # + # layout :next_in, :pointer, 0, + # :avail_in, :uint, 4, + # :total_in, :ulong, 8, + # # ... + # + # StructGenerator does its best to pad the layout it produces to preserve + # line numbers. Place the struct definition as close to the top of the file + # for best results. + + class StructGenerator + @options = {} + attr_accessor :size + attr_reader :fields + + def initialize(name, options = {}) + @name = name + @struct_name = nil + @includes = [] + @fields = [] + @found = false + @size = nil + + if block_given? then + yield self + calculate self.class.options.merge(options) + end + end + def self.options=(options) + @options = options + end + def self.options + @options + end + def calculate(options = {}) + binary = File.join Dir.tmpdir, "rb_struct_gen_bin_#{Process.pid}" + + raise "struct name not set" if @struct_name.nil? + + Tempfile.open("#{@name}.struct_generator") do |f| + f.puts "#include " + + @includes.each do |inc| + f.puts "#include <#{inc}>" + end + + f.puts "#include \n\n" + f.puts "int main(int argc, char **argv)\n{" + f.puts " #{@struct_name} s;" + f.puts %[ printf("sizeof(#{@struct_name}) %u\\n", (unsigned int) sizeof(#{@struct_name}));] + + @fields.each do |field| + f.puts <<-EOF + printf("#{field.name} %u %u\\n", (unsigned int) offsetof(#{@struct_name}, #{field.name}), + (unsigned int) sizeof(s.#{field.name})); + EOF + end + + f.puts "\n return 0;\n}" + f.flush + + output = `gcc #{options[:cppflags]} #{options[:cflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -x c -Wall -Werror #{f.path} -o #{binary} 2>&1` + + unless $?.success? then + @found = false + output = output.split("\n").map { |l| "\t#{l}" }.join "\n" + raise "Compilation error generating struct #{@name} (#{@struct_name}):\n#{output}" + end + end + + output = `#{binary}`.split "\n" + File.unlink(binary + (FFI::Platform.windows? ? ".exe" : "")) + sizeof = output.shift + unless @size + m = /\s*sizeof\([^)]+\) (\d+)/.match sizeof + @size = m[1] + end + + line_no = 0 + output.each do |line| + md = line.match(/.+ (\d+) (\d+)/) + @fields[line_no].offset = md[1].to_i + @fields[line_no].size = md[2].to_i + + line_no += 1 + end + + @found = true + end + + def field(name, type=nil) + field = Field.new(name, type) + @fields << field + return field + end + + def found? + @found + end + + def dump_config(io) + io.puts "rbx.platform.#{@name}.sizeof = #{@size}" + + @fields.each { |field| io.puts field.to_config(@name) } + end + + def generate_layout + buf = "" + + @fields.each_with_index do |field, i| + if buf.empty? + buf << "layout :#{field.name}, :#{field.type}, #{field.offset}" + else + buf << " :#{field.name}, :#{field.type}, #{field.offset}" + end + + if i < @fields.length - 1 + buf << ",\n" + end + end + + buf + end + + def get_field(name) + @fields.find { |f| name == f.name } + end + + def include(i) + @includes << i + end + + def name(n) + @struct_name = n + end + + end + + ## + # A field in a Struct. + + class StructGenerator::Field + + attr_reader :name + attr_reader :type + attr_reader :offset + attr_accessor :size + + def initialize(name, type) + @name = name + @type = type + @offset = nil + @size = nil + end + + def offset=(o) + @offset = o + end + + def to_config(name) + buf = [] + buf << "rbx.platform.#{name}.#{@name}.offset = #{@offset}" + buf << "rbx.platform.#{name}.#{@name}.size = #{@size}" + buf << "rbx.platform.#{name}.#{@name}.type = #{@type}" if @type + buf + end + + end + +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/types_generator.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/types_generator.rb new file mode 100644 index 0000000..ff24ec5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/tools/types_generator.rb @@ -0,0 +1,134 @@ +require 'tempfile' + +module FFI + + # @private + class TypesGenerator + + ## + # Maps different C types to the C type representations we use + + TYPE_MAP = { + "char" => :char, + "signed char" => :char, + "__signed char" => :char, + "unsigned char" => :uchar, + + "short" => :short, + "signed short" => :short, + "signed short int" => :short, + "unsigned short" => :ushort, + "unsigned short int" => :ushort, + + "int" => :int, + "signed int" => :int, + "unsigned int" => :uint, + + "long" => :long, + "long int" => :long, + "signed long" => :long, + "signed long int" => :long, + "unsigned long" => :ulong, + "unsigned long int" => :ulong, + "long unsigned int" => :ulong, + + "long long" => :long_long, + "long long int" => :long_long, + "signed long long" => :long_long, + "signed long long int" => :long_long, + "unsigned long long" => :ulong_long, + "unsigned long long int" => :ulong_long, + + "char *" => :string, + "void *" => :pointer, + } + + def self.generate(options = {}) + typedefs = nil + Tempfile.open 'ffi_types_generator' do |io| + io.puts <<-C +#include +#if !(defined(WIN32)) +#include +#include +#endif + C + + io.close + cc = ENV['CC'] || 'gcc' + cmd = "#{cc} -E -x c #{options[:cppflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -c" + if options[:input] + typedefs = File.read(options[:input]) + elsif options[:remote] + typedefs = `ssh #{options[:remote]} #{cmd} - < #{io.path}` + else + typedefs = `#{cmd} #{io.path}` + end + end + + code = "" + + typedefs.each_line do |type| + # We only care about single line typedef + next unless type =~ /typedef/ + # Ignore unions or structs + next if type =~ /union|struct/ + + # strip off the starting typedef and ending ; + type.gsub!(/^(.*typedef\s*)/, "") + type.gsub!(/\s*;\s*$/, "") + + parts = type.split(/\s+/) + def_type = parts.join(" ") + + # GCC does mapping with __attribute__ stuf, also see + # http://hal.cs.berkeley.edu/cil/cil016.html section 16.2.7. Problem + # with this is that the __attribute__ stuff can either occur before or + # after the new type that is defined... + if type =~ /__attribute__/ + if parts.last =~ /__QI__|__HI__|__SI__|__DI__|__word__/ + + # In this case, the new type is BEFORE __attribute__ we need to + # find the final_type as the type before the part that starts with + # __attribute__ + final_type = "" + parts.each do |p| + break if p =~ /__attribute__/ + final_type = p + end + else + final_type = parts.pop + end + + def_type = case type + when /__QI__/ then "char" + when /__HI__/ then "short" + when /__SI__/ then "int" + when /__DI__/ then "long long" + when /__word__/ then "long" + else "int" + end + + def_type = "unsigned #{def_type}" if type =~ /unsigned/ + else + final_type = parts.pop + def_type = parts.join(" ") + end + + if type = TYPE_MAP[def_type] + code << "rbx.platform.typedef.#{final_type} = #{type}\n" + TYPE_MAP[final_type] = TYPE_MAP[def_type] + else + # Fallback to an ordinary pointer if we don't know the type + if def_type =~ /\*/ + code << "rbx.platform.typedef.#{final_type} = pointer\n" + TYPE_MAP[final_type] = :pointer + end + end + end + + code + end + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/types.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/types.rb new file mode 100644 index 0000000..ddad36e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/types.rb @@ -0,0 +1,194 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# Copyright (c) 2007, 2008 Evan Phoenix +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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. +# + +# see {file:README} +module FFI + + # @param [Type, DataConverter, Symbol] old type definition used by {FFI.find_type} + # @param [Symbol] add new type definition's name to add + # @return [Type] + # Add a definition type to type definitions. + def self.typedef(old, add) + TypeDefs[add] = self.find_type(old) + end + + # (see FFI.typedef) + def self.add_typedef(old, add) + typedef old, add + end + + + # @param [Type, DataConverter, Symbol] name + # @param [Hash] type_map if nil, {FFI::TypeDefs} is used + # @return [Type] + # Find a type in +type_map+ ({FFI::TypeDefs}, by default) from + # a type objet, a type name (symbol). If +name+ is a {DataConverter}, + # a new {Type::Mapped} is created. + def self.find_type(name, type_map = nil) + if name.is_a?(Type) + name + + elsif type_map && type_map.has_key?(name) + type_map[name] + + elsif TypeDefs.has_key?(name) + TypeDefs[name] + + elsif name.is_a?(DataConverter) + (type_map || TypeDefs)[name] = Type::Mapped.new(name) + else + raise TypeError, "unable to resolve type '#{name}'" + end + end + + # List of type definitions + TypeDefs.merge!({ + # The C void type; only useful for function return types + :void => Type::VOID, + + # C boolean type + :bool => Type::BOOL, + + # C nul-terminated string + :string => Type::STRING, + + # C signed char + :char => Type::CHAR, + # C unsigned char + :uchar => Type::UCHAR, + + # C signed short + :short => Type::SHORT, + # C unsigned short + :ushort => Type::USHORT, + + # C signed int + :int => Type::INT, + # C unsigned int + :uint => Type::UINT, + + # C signed long + :long => Type::LONG, + + # C unsigned long + :ulong => Type::ULONG, + + # C signed long long integer + :long_long => Type::LONG_LONG, + + # C unsigned long long integer + :ulong_long => Type::ULONG_LONG, + + # C single precision float + :float => Type::FLOAT, + + # C double precision float + :double => Type::DOUBLE, + + # C long double + :long_double => Type::LONGDOUBLE, + + # Native memory address + :pointer => Type::POINTER, + + # 8 bit signed integer + :int8 => Type::INT8, + # 8 bit unsigned integer + :uint8 => Type::UINT8, + + # 16 bit signed integer + :int16 => Type::INT16, + # 16 bit unsigned integer + :uint16 => Type::UINT16, + + # 32 bit signed integer + :int32 => Type::INT32, + # 32 bit unsigned integer + :uint32 => Type::UINT32, + + # 64 bit signed integer + :int64 => Type::INT64, + # 64 bit unsigned integer + :uint64 => Type::UINT64, + + :buffer_in => Type::BUFFER_IN, + :buffer_out => Type::BUFFER_OUT, + :buffer_inout => Type::BUFFER_INOUT, + + # Used in function prototypes to indicate the arguments are variadic + :varargs => Type::VARARGS, + }) + + # This will convert a pointer to a Ruby string (just like `:string`), but + # also allow to work with the pointer itself. This is useful when you want + # a Ruby string already containing a copy of the data, but also the pointer + # to the data for you to do something with it, like freeing it, in case the + # library handed the memory to off to the caller (Ruby-FFI). + # + # It's {typedef}'d as +:strptr+. + class StrPtrConverter + extend DataConverter + native_type Type::POINTER + + # @param [Pointer] val + # @param ctx not used + # @return [Array(String, Pointer)] + # Returns a [ String, Pointer ] tuple so the C memory for the string can be freed + def self.from_native(val, ctx) + [ val.null? ? nil : val.get_string(0), val ] + end + end + + typedef(StrPtrConverter, :strptr) + + # @param type +type+ is an instance of class accepted by {FFI.find_type} + # @return [Numeric] + # Get +type+ size, in bytes. + def self.type_size(type) + find_type(type).size + end + + # Load all the platform dependent types + begin + File.open(File.join(Platform::CONF_DIR, 'types.conf'), "r") do |f| + prefix = "rbx.platform.typedef." + f.each_line { |line| + if line.index(prefix) == 0 + new_type, orig_type = line.chomp.slice(prefix.length..-1).split(/\s*=\s*/) + typedef(orig_type.to_sym, new_type.to_sym) + end + } + end + typedef :pointer, :caddr_t + rescue Errno::ENOENT + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/union.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/union.rb new file mode 100644 index 0000000..38414ab --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/union.rb @@ -0,0 +1,43 @@ +# +# Copyright (C) 2009 Andrea Fazzi +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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. +# + +require 'ffi/struct' + +module FFI + + class Union < FFI::Struct + def self.builder + b = StructLayoutBuilder.new + b.union = true + b + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/variadic.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/variadic.rb new file mode 100644 index 0000000..2414055 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/variadic.rb @@ -0,0 +1,78 @@ +# +# Copyright (C) 2008, 2009 Wayne Meissner +# Copyright (C) 2009 Luc Heinrich +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may 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. +# + +module FFI + class VariadicInvoker + def init(arg_types, type_map) + @fixed = Array.new + @type_map = type_map + arg_types.each_with_index do |type, i| + @fixed << type unless type == Type::VARARGS + end + end + + + def call(*args, &block) + param_types = Array.new(@fixed) + param_values = Array.new + @fixed.each_with_index do |t, i| + param_values << args[i] + end + i = @fixed.length + while i < args.length + param_types << FFI.find_type(args[i], @type_map) + param_values << args[i + 1] + i += 2 + end + invoke(param_types, param_values, &block) + end + + # + # Attach the invoker to module +mod+ as +mname+ + # + def attach(mod, mname) + invoker = self + params = "*args" + call = "call" + mod.module_eval <<-code + @@#{mname} = invoker + def self.#{mname}(#{params}) + @@#{mname}.#{call}(#{params}) + end + def #{mname}(#{params}) + @@#{mname}.#{call}(#{params}) + end + code + invoker + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/version.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/version.rb new file mode 100644 index 0000000..4390b70 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi/version.rb @@ -0,0 +1,4 @@ +module FFI + VERSION = '1.9.18' +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi_c.bundle b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/lib/ffi_c.bundle new file mode 100755 index 0000000000000000000000000000000000000000..c6c4767c2277cb8a83cac90e733b39192f290e5f GIT binary patch literal 349780 zcmeFad3Y4X7B)Ts27(YKDA9;Sf`SBBq6`voBqIcRWTGgdxF9MnxPmaFAX_xag|=rH{1|cf}+$IR0ItON`CKqPETiudcWWE{r5eOd7epkpL6Qe zsZ&*_PMxZ*UcGzql0YEPDk~6ZhimIVAQw-Iw&1=aehO=~2C%=K?!j>R>+dfO{H1}v zH1L-O{?fo-8u&{Ce`(+^4g95nzclcd2L95(UmEy-Ndxcf{BAcU`B|9w2eR?/R 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�`Hp#7-}a{Z-d&P3(TsA&CTFg~rwsobF2 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

      X{}o(@*XOjSqkM?*cH-ODxXI6~b}g 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 a_j1Sj`pJG17j@k?U*^-Ou{oWZn)+WG;($E> literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/Benchmark.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/Benchmark.c new file mode 100644 index 0000000..55a7380 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/Benchmark.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ +#include +#include + +void returnVoid() { + +} + +void returnVoidI(int arg) { + +} +int returnInt() { + return 0; +} + +int returnIntI(int arg) { + return arg; +} + +typedef int8_t s8; +typedef uint8_t u8; +typedef int16_t s16; +typedef uint16_t u16; +typedef int32_t s32; +typedef uint32_t u32; +typedef int64_t s64; +typedef uint64_t u64; +typedef float f32; +typedef double f64; +typedef void v; +typedef char* S; +typedef void* P; + +#define B6(R, T1, T2, T3, T4, T5, T6) R bench_##T1##T2##T3##T4##T5##T6##_##R(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) {} +#define B5(R, T1, T2, T3, T4, T5) R bench_##T1##T2##T3##T4##T5##_##R(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) {} +#define B4(R, T1, T2, T3, T4) R bench_##T1##T2##T3##T4##_##R(T1 a1, T2 a2, T3 a3, T4 a4) {} +#define B3(R, T1, T2, T3) R bench_##T1##T2##T3##_##R(T1 a1, T2 a2, T3 a3) {} +#define B2(R, T1, T2) R bench_##T1##T2##_##R(T1 a1, T2 a2) {} +#define B1(R, T1) R bench_##T1##_##R(T1 a1) {} +#define BrV(T) B1(v, T); B2(v, T, T); B3(v, T, T, T); B4(v, T, T, T, T); B5(v, T, T, T, T, T); B6(v, T, T, T, T, T, T); +BrV(u32); +BrV(s32); +BrV(s64); +BrV(u64); +BrV(f32); +BrV(f64); +BrV(S); +BrV(P); diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/BoolTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/BoolTest.c new file mode 100644 index 0000000..04cb6c6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/BoolTest.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2007 Wayne Meissner. + * Copyright (c) 2009 Aman Gupta. + * + * All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include + +bool +bool_return_true() +{ + return true; +} + +bool +bool_return_false() +{ + return false; +} + +bool +bool_return_val(bool value) +{ + return value; +} + +bool +bool_reverse_val(bool value) +{ + return value ? false : true; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/BufferTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/BufferTest.c new file mode 100644 index 0000000..3e95ebc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/BufferTest.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + + +#define MEMSET(buf, value, size) do { \ + int i; for (i = 0; i < size; ++i) buf[i] = value; \ +} while(0) +#define MEMCPY(dst, src, size) do { \ + int i; for (i = 0; i < size; ++i) dst[i] = src[i]; \ +} while(0) + +#define FILL(JTYPE, CTYPE) \ +void fill##JTYPE##Buffer(CTYPE* buf, CTYPE value, int size) { MEMSET(buf, value, size); } + +#define COPY(JTYPE, CTYPE) \ +void copy##JTYPE##Buffer(CTYPE* dst, CTYPE* src, int size) { MEMCPY(dst, src, size); } + +#define FUNC(JTYPE, CTYPE) \ + FILL(JTYPE, CTYPE); \ + COPY(JTYPE, CTYPE) + +FUNC(Byte, char); +FUNC(Short, short); +FUNC(Int, int); +FUNC(Long, long long); +FUNC(Float, float); +FUNC(Double, double); + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/ClosureTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/ClosureTest.c new file mode 100644 index 0000000..dfeabde --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/ClosureTest.c @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#ifndef _WIN32 +# include +#else +# include +# include +#endif + +#define R(T, rtype) rtype testClosureVr##T(rtype (*closure)(void)) { \ + return closure != NULL ? (*closure)() : (rtype) 0; \ +} + +#define P(T, ptype) void testClosure##T##rV(void (*closure)(ptype), ptype a1) { \ + if (closure != NULL) (*closure)(a1); \ +} + +void testClosureVrV(void (*closure)(void)) +{ + (*closure)(); +} + +R(Z, bool); +R(B, char); +R(S, short); +R(I, int); +R(L, long); +R(J, long long); +R(LL, long long); +R(F, float); +R(D, double); +R(P, const void*); + + +P(Z, bool); +P(B, char); +P(S, short); +P(I, int); +P(L, long); +P(J, long long); +P(LL, long long); +P(F, float); +P(D, double); +P(P, const void*); +P(UL, unsigned long); + +#if defined(_WIN32) && !defined(_WIN64) +bool __stdcall testClosureStdcall(long *a1, void __stdcall(*closure)(void *, long), long a2) { \ + void* sp_pre; + void* sp_post; + + asm volatile (" movl %%esp,%0" : "=g" (sp_pre)); + (*closure)(a1, a2); + asm volatile (" movl %%esp,%0" : "=g" (sp_post)); + + /* %esp before pushing parameters on the stack and after the call returns + * should be equal, if both sides respects the stdcall convention */ + return sp_pre == sp_post; +} +#endif + +void testOptionalClosureBrV(void (*closure)(char), char a1) +{ + if (closure) { + (*closure)(a1); + } +} + + +struct ThreadVrV { + void (*closure)(void); + int count; +}; + +static void * +threadVrV(void *arg) +{ + struct ThreadVrV* t = (struct ThreadVrV *) arg; + + int i; + for (i = 0; i < t->count; i++) { + (*t->closure)(); + } + + return NULL; +} + +void testThreadedClosureVrV(void (*closure)(void), int n) +{ + struct ThreadVrV arg = {closure, n}; +#ifndef _WIN32 + pthread_t t; + pthread_create(&t, NULL, threadVrV, &arg); + pthread_join(t, NULL); +#else + HANDLE hThread = (HANDLE) _beginthread((void (*)(void *))threadVrV, 0, &arg); + WaitForSingleObject(hThread, INFINITE); +#endif +} + +struct s8f32s32 { + char s8; + float f32; + int s32; +}; + +// Takes a struct argument +void testClosureTrV(void (*closure)(struct s8f32s32 s), struct s8f32s32* s) +{ + (*closure)(*s); +} + +// Returns a struct value +struct s8f32s32 testClosureVrT(struct s8f32s32 (*closure)()) +{ + return (*closure)(); +} + +typedef int (*returnTypeClosure_t)(int) ; +typedef returnTypeClosure_t (*lookupClosure_t)(); + +int testReturnsClosure(lookupClosure_t lookup, int val) +{ + returnTypeClosure_t func = lookup ? (*lookup)() : NULL; + return func ? (*func)(val) : 0; +} + +static int multiplyByTwo(int value) +{ + return value * 2; +} + +returnTypeClosure_t testReturnsFunctionPointer() +{ + return multiplyByTwo; +} + +typedef int (*argumentClosure_t)(int); +typedef int (*withArgumentClosure_t)(argumentClosure_t, int); + +int testArgumentClosure(withArgumentClosure_t closure_with, argumentClosure_t closure_arg, int val) +{ + return (*closure_with)(closure_arg, val); +} + + +// +// These macros produce functions of the form: +// testClosureBIrV(void (*closure)(char, int), char a1, int a2) {} +// +#define C2_(J1, J2, N1, N2) \ +void testClosure##J1##J2##rV(void (*closure)(N1, N2), N1 a1, N2 a2) \ +{ \ + if (closure != NULL) (*closure)(a1, a2); \ +} + +#define C2(J, N) \ + C2_(B, J, char, N) \ + C2_(S, J, short, N) \ + C2_(I, J, int, N) \ + C2_(LL, J, long long, N) \ + C2_(F, J, float, N) \ + C2_(D, J, double, N) \ + + +C2(B, char); +C2(S, short); +C2(I, int); +C2(LL, long long); +C2(F, float); +C2(D, double); + +#define C3_(J1, J2, J3, N1, N2, N3) \ +void testClosure##J1##J2##J3##rV(void (*closure)(N1, N2, N3), N1 a1, N2 a2, N3 a3) \ +{ \ + (*closure)(a1, a2, a3); \ +} + + +#define C3(J, N) \ + C3_(B, J, B, char, N, char) \ + C3_(S, J, S, short, N, short) \ + C3_(I, J, I, int, N, int) \ + C3_(LL, J, LL, long long, N, long long) \ + C3_(F, J, F, float, N, float) \ + C3_(D, J, D, double, N, double) \ + +C3(B, char); +C3(S, short); +C3(I, int); +C3(LL, long long); +C3(F, float); +C3(D, double); +C3_(B, S, I, char, short, int); +C3_(B, S, LL, char, short, long long); +C3_(LL, S, B, long long, short, char); +C3_(LL, B, S, long long, char, short); + + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/EnumTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/EnumTest.c new file mode 100644 index 0000000..4bf8d23 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/EnumTest.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ +#include + +int test_untagged_enum(int val) { + return val; +} + +int test_untagged_typedef_enum(int val) { + return val; +} + +uint8_t test_untagged_nonint_enum(uint8_t val) { + return val; +} + +uint16_t test_tagged_nonint_enum1(uint16_t val) { + return val; +} + +uint32_t test_tagged_nonint_enum2(uint32_t val) { + return val; +} + +uint64_t test_tagged_nonint_enum3(uint64_t val) { + return val; +} + +typedef enum {c1, c2, c3, c4} enum_type1; +enum_type1 test_tagged_typedef_enum1(enum_type1 val) { + return val; +} + +typedef enum {c5 = 42, c6, c7, c8} enum_type2; +enum_type2 test_tagged_typedef_enum2(enum_type2 val) { + return val; +} + +typedef enum {c9 = 42, c10, c11 = 4242, c12} enum_type3; +enum_type3 test_tagged_typedef_enum3(enum_type3 val) { + return val; +} + +typedef enum {c13 = 42, c14 = 4242, c15 = 424242, c16 = 42424242} enum_type4; +enum_type4 test_tagged_typedef_enum4(enum_type4 val) { + return val; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/FunctionTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/FunctionTest.c new file mode 100644 index 0000000..8cde5f1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/FunctionTest.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#ifdef _WIN32 +#include +#define sleep(x) Sleep((x)*1000) +#endif + +#ifndef _WIN32 +#include +#include +#endif + +int testAdd(int a, int b) +{ + return a + b; +}; + +int testFunctionAdd(int a, int b, int (*f)(int, int)) +{ + return f(a, b); +}; + +void testBlocking(int seconds) { + sleep(seconds); +}; + +struct async_data { + void (*fn)(int); + int value; +}; + +static void* asyncThreadCall(void *data) +{ + struct async_data* d = (struct async_data *) data; + if (d != NULL && d->fn != NULL) { + (*d->fn)(d->value); + } + + return NULL; +} + +void testAsyncCallback(void (*fn)(int), int value) +{ +#ifndef _WIN32 + pthread_t t; + struct async_data d; + d.fn = fn; + d.value = value; + pthread_create(&t, NULL, asyncThreadCall, &d); + pthread_join(t, NULL); +#else + (*fn)(value); +#endif +} + +#if defined(_WIN32) && !defined(_WIN64) +struct StructUCDP { + unsigned char a1; + double a2; + void *a3; +}; + +void __stdcall testStdcallManyParams(long *a1, char a2, short int a3, int a4, __int64 a5, + struct StructUCDP a6, struct StructUCDP *a7, float a8, double a9) { +} +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/GNUmakefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/GNUmakefile new file mode 100644 index 0000000..a7ba9e6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/GNUmakefile @@ -0,0 +1,149 @@ +# -*- makefile -*- + +ifeq ($(OS),) + BUILD_OS := $(shell uname -s | tr '[:upper:]' '[:lower:]') + OS := $(BUILD_OS) +endif + +ifeq ($(CPU),) + CPU := $(shell uname -m | sed -e 's/i[345678]86/i386/') +endif + +PLATFORM = $(CPU)-$(OS) + +ifeq ($(OS), sunos) + OS = solaris +endif + +SRC_DIR = libtest +BUILD_DIR ?= build +TEST_BUILD_DIR = $(BUILD_DIR)/libtest +# Set defaults to unix (linux/solaris/bsd) +PREFIX = lib +LIBEXT ?= so +LIBNAME = $(PREFIX)test.$(LIBEXT) + +export MACOSX_DEPLOYMENT_TARGET=10.4 + +CCACHE := $(strip $(realpath $(shell which ccache 2> /dev/null))) + +TEST_SRCS = $(wildcard $(SRC_DIR)/*.c) +TEST_OBJS := $(patsubst $(SRC_DIR)/%.c, $(TEST_BUILD_DIR)/%.o, $(TEST_SRCS)) + +# +# Compiler/linker flags from: +# http://weblogs.java.net/blog/kellyohair/archive/2006/01/compilation_of_1.html +JFLAGS = -fno-omit-frame-pointer -fno-strict-aliasing +OFLAGS = -O2 $(JFLAGS) +WFLAGS = -W -Wall -Wno-unused -Wno-parentheses +PICFLAGS = -fPIC +SOFLAGS = -shared +LDFLAGS += $(SOFLAGS) + +IFLAGS = -I"$(BUILD_DIR)" +CFLAGS = $(OFLAGS) $(WFLAGS) $(IFLAGS) $(PICFLAGS) -D_REENTRANT + +ifneq ($(strip $(findstring $(OS), win32, mingw, cygwin)),) + # For cygwin => win32-native builds, strip out cygwin deps + ifneq ($(findstring cygwin, $(BUILD_OS)),) + CC += -mno-cygwin -mwin32 + LDFLAGS += -mno-cygwin -Wl,--add-stdcall-alias + endif + PICFLAGS= + LIBEXT=dll + CC = gcc +endif + +ifeq ($(OS), darwin) + ifneq ($(findstring $(CPU),ppc),) + ARCHFLAGS += -arch ppc + endif + ifneq ($(findstring $(CPU),i386 x86_64),) + ARCHFLAGS += -arch i386 -arch x86_64 + endif + CFLAGS += $(ARCHFLAGS) -DTARGET_RT_MAC_CFM=0 + CFLAGS += -fno-common + LDFLAGS = $(ARCHFLAGS) -dynamiclib + # link against the universal libraries on ppc machines + LDFLAGS += -L$(MACSDK)/usr/lib + LIBEXT = dylib + FFI_CFLAGS += -isysroot $(MACSDK) + PICFLAGS = + SOFLAGS = +endif + +ifeq ($(OS), linux) + SOFLAGS += -Wl,-soname,$(LIBNAME) +endif + +ifeq ($(OS), solaris) + CC = /usr/sfw/bin/gcc -std=c99 + LD = /usr/ccs/bin/ld + SOFLAGS = -shared -static-libgcc +endif + +ifeq ($(OS), aix) + LIBEXT = a + SOFLAGS = -shared -static-libgcc + PICFLAGS += -pthread +endif + +ifneq ($(findstring bsd, $(OS)),) + SOFLAGS = -shared -static-libgcc + CFLAGS += -pthread + LDFLAGS += -pthread +endif + +ifeq ($(CPU), i386) + MODEL = 32 +endif + +ifeq ($(CPU), sparcv9) + MODEL = 64 +endif + +ifeq ($(CPU), amd64) + MODEL = 64 +endif + +ifeq ($(CPU), x86_64) + MODEL = 64 +endif + +ifeq ($(CPU), ppc64) + MODEL = 64 +endif + +ifeq ($(CPU), powerpc64) + MODEL = 64 +endif + +MODELFLAG = +ifneq ($(MODEL),) + MODELFLAG = -m$(MODEL) +endif + +# On platforms (linux, solaris) that support both 32bit and 64bit, force building for one or the other +ifneq ($(or $(findstring linux, $(OS)), $(findstring solaris, $(OS))),) + # Change the CC/LD instead of CFLAGS/LDFLAGS, incase other things in the flags + # makes the libffi build choke + CC += $(MODELFLAG) + LD += $(MODELFLAG) +endif + +LIBTEST = $(BUILD_DIR)/$(LIBNAME) + +all: $(LIBTEST) + +$(TEST_BUILD_DIR)/%.o : $(SRC_DIR)/%.c + @mkdir -p $(@D) + $(CCACHE) $(CC) $(CFLAGS) -c $< -o $@ + +$(LIBTEST): $(TEST_OBJS) + $(CC) -o $@ $(LDFLAGS) $(TEST_OBJS) -lm + +clean:: + # nothing to do - ant will delete the build dir + +debug:: + @echo "SRCS=$(TEST_SRCS)" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/GlobalVariable.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/GlobalVariable.c new file mode 100644 index 0000000..39c12a2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/GlobalVariable.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include + +typedef int8_t s8; +typedef uint8_t u8; +typedef int16_t s16; +typedef uint16_t u16; +typedef int32_t s32; +typedef uint32_t u32; +typedef int64_t s64; +typedef uint64_t u64; +typedef signed long sL; +typedef unsigned long uL; +typedef float f32; +typedef double f64; +#if !defined(__OpenBSD__) +typedef unsigned long ulong; +#endif +typedef void* pointer; +typedef void* P; + +#define GVAR(T) \ + extern T gvar_##T; \ + T gvar_##T = (T) -1; \ + T gvar_##T##_get() { return gvar_##T; }; \ + void gvar_##T##_set(T v) { gvar_##T = v; } + +GVAR(s8); +GVAR(u8); +GVAR(s16); +GVAR(u16); +GVAR(s32); +GVAR(u32); +GVAR(s64); +GVAR(u64); +GVAR(long); +GVAR(ulong); +GVAR(pointer); + +struct gstruct { + long data; +}; + +struct gstruct gvar_gstruct = { -1 }; + +struct gstruct* +gvar_gstruct_get(void) +{ + return &gvar_gstruct; +} + +void +gvar_gstruct_set(const struct gstruct* val) +{ + gvar_gstruct = *val; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/LastErrorTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/LastErrorTest.c new file mode 100644 index 0000000..02ce4a8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/LastErrorTest.c @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#if defined(_WIN32) || defined(__WIN32__) +# include +#else +# include +#endif + +int setLastError(int error) { +#if defined(_WIN32) || defined(__WIN32__) + SetLastError(error); +#else + errno = error; +#endif + return -1; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/NumberTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/NumberTest.c new file mode 100644 index 0000000..3fa25a8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/NumberTest.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#include +#include + +#if defined(__sparc) && defined(__sun__) + #define fix_mem_access __asm("ta 6") +#else + #define fix_mem_access +#endif + +typedef int8_t s8; +typedef uint8_t u8; +typedef int16_t s16; +typedef uint16_t u16; +typedef int32_t s32; +typedef uint32_t u32; +typedef int64_t s64; +typedef uint64_t u64; +typedef signed long sL; +typedef unsigned long uL; +typedef float f32; +typedef double f64; +typedef long double f128; +#if !defined(__OpenBSD__) +typedef unsigned long ulong; +#endif + +#define ADD(T) T add_##T(T arg1, T arg2) { return arg1 + arg2; } +#define SUB(T) T sub_##T(T arg1, T arg2) { return arg1 - arg2; } +#define MUL(T) T mul_##T(T arg1, T arg2) { return arg1 * arg2; } +#define DIV(T) T div_##T(T arg1, T arg2) { return arg1 / arg2; } +#define RET(T) T ret_##T(T arg1) { return arg1; } +#define SET(T) static T T##_;void set_##T(T arg1) { T##_ = arg1; } +#define GET(T) T get_##T() { return T##_; } +typedef char* ptr; +#define TEST(T) ADD(T) SUB(T) MUL(T) DIV(T) RET(T) SET(T) GET(T) +TEST(s8); +TEST(u8); +TEST(s16); +TEST(u16); +TEST(s32); +TEST(u32); +TEST(s64); +TEST(u64); +TEST(float); +TEST(double); +TEST(long); +TEST(ulong); +TEST(f128); + +#define ADD2(R, T1, T2) R add_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 + arg2; } +#define SUB2(R, T1, T2) R sub_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 - arg2; } +#define MUL2(R, T1, T2) R mul_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 * arg2; } +#define DIV2(R, T1, T2) R div_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 / arg2; } + +#define T2__(R, T1, T2) ADD2(R, T1, T2) SUB2(R, T1, T2) MUL2(R, T1, T2) DIV2(R, T1, T2) +#define T2_(R, T1) \ + T2__(R, T1, s8) T2__(R, T1, u8) \ + T2__(R, T1, s16) T2__(R, T1, u16) \ + T2__(R, T1, s32) T2__(R, T1, u32) \ + T2__(R, T1, sL) T2__(R, T1, uL) \ + T2__(R, T1, s64) T2__(R, T1, u64) \ + +#define TEST2(R) \ + T2_(R, s8) T2_(R, u8) T2_(R, s16) T2_(R, u16) T2_(R, s32) T2_(R, u32) \ + T2_(R, sL) T2_(R, uL) T2_(R, s64) T2_(R, u64) + +#ifdef notyet +TEST2(s32) +TEST2(u32) +TEST2(s64) +TEST2(u64) +#endif + +#define ADD3(R, T1, T2, T3) R add_##T1##T2##T3##_##R(T1 arg1, T2 arg2, T3 arg3) { return arg1 + arg2 + arg3; } +#define pack_f32(buf, v) do { float f = v; memcpy((buf), &f, sizeof(f)); } while(0) +#define pack_f64(buf, v) do { double f = v; memcpy((buf), &f, sizeof(f)); } while(0) +#define pack_int(buf, v) do { *(buf) = v; } while(0) +#define pack_s8 pack_int +#define pack_u8 pack_int +#define pack_s16 pack_int +#define pack_u16 pack_int +#define pack_s32 pack_int +#define pack_u32 pack_int +#define pack_s64 pack_int +#define pack_u64 pack_int +#define pack_sL pack_int +#define pack_uL pack_int + +#define PACK3(R, T1, T2, T3) void pack_##T1##T2##T3##_##R(T1 arg1, T2 arg2, T3 arg3, R* r) { \ + fix_mem_access; \ + pack_##T1(&r[0], arg1); \ + pack_##T2(&r[1], arg2); \ + pack_##T3(&r[2], arg3); \ +} + +#define T3___(R, T1, T2, T3) PACK3(R, T1, T2, T3) /* SUB2(R, T1, T2) MUL2(R, T1, T2) DIV2(R, T1, T2) */ +#define T3__(R, T1, T2) \ + T3___(R, T1, T2, s8) T3___(R, T1, T2, u8) \ + T3___(R, T1, T2, s16) T3___(R, T1, T2, u16) \ + T3___(R, T1, T2, s32) T3___(R, T1, T2, u32) \ + T3___(R, T1, T2, sL) T3___(R, T1, T2, uL) \ + T3___(R, T1, T2, s64) T3___(R, T1, T2, u64) \ + T3___(R, T1, T2, f32) T3___(R, T1, T2, f64) \ + +#define T3_(R, T1) \ + T3__(R, T1, s8) T3__(R, T1, u8) \ + T3__(R, T1, s16) T3__(R, T1, u16) \ + T3__(R, T1, s32) T3__(R, T1, u32) \ + T3__(R, T1, sL) T3__(R, T1, uL) \ + T3__(R, T1, s64) T3__(R, T1, u64) \ + T3__(R, T1, f32) T3__(R, T1, f64) \ + +#define TEST3(R) \ + T3_(R, s8) T3_(R, u8) T3_(R, s16) T3_(R, u16) T3_(R, s32) T3_(R, u32) \ + T3_(R, sL) T3_(R, uL) T3_(R, s64) T3_(R, u64) T3_(R, f32) T3_(R, f64) + +TEST3(s64) + +void +foo6(intptr_t i1, intptr_t i2, intptr_t i3, intptr_t i4, intptr_t i5, intptr_t i6) { } + +void +foo5(intptr_t i1, intptr_t i2, intptr_t i3, intptr_t i4, intptr_t i5) { } + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/PointerTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/PointerTest.c new file mode 100644 index 0000000..7237ab2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/PointerTest.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#include +#include +#include +#include +typedef void* ptr; +typedef void* pointer; +#ifdef _WIN32 +typedef char* caddr_t; +#endif + +#define RET(T) T ptr_ret_##T(void* arg1, int offset) { \ + T tmp; memcpy(&tmp, (caddr_t) arg1 + offset, sizeof(tmp)); return tmp; \ +} +#define SET(T) void ptr_set_##T(void* arg1, int offset, T value) { \ + memcpy((caddr_t) arg1 + offset, &value, sizeof(value)); \ +} +#define TEST(T) SET(T) RET(T) + +TEST(int8_t); +TEST(int16_t); +TEST(int32_t); +TEST(int64_t); +TEST(float); +TEST(double); +TEST(pointer); + +void* +ptr_return_array_element(void **ptrArray, int arrayIndex) +{ + return ptrArray[arrayIndex]; +} + +void +ptr_set_array_element(void **ptrArray, int arrayIndex, void *value) +{ + ptrArray[arrayIndex] = value; +} + +void* +ptr_malloc(int size) +{ + return calloc(1, size); +} +void +ptr_free(void* ptr) +{ + free(ptr); +} + +void* +ptr_from_address(uintptr_t addr) +{ + return (void *) addr; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/ReferenceTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/ReferenceTest.c new file mode 100644 index 0000000..d1dd88b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/ReferenceTest.c @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include + +#define REF(T) void ref_##T(T arg, T* result) { *result = arg; } +#define ADD(T) void ref_add_##T(T arg1, T arg2, T* result) { *result = arg1 + arg2; } +#define SUB(T) void ref_sub_##T(T arg1, T arg2, T* result) { *result = arg1 - arg2; } +#define MUL(T) void ref_mul_##T(T arg1, T arg2, T* result) { *result = arg1 * arg2; } +#define DIV(T) void ref_div_##T(T arg1, T arg2, T* result) { *result = arg1 / arg2; } +#define TEST(T) ADD(T) SUB(T) MUL(T) DIV(T) REF(T) + +TEST(int8_t); +TEST(int16_t); +TEST(int32_t); +TEST(int64_t); +TEST(float); +TEST(double); + + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/StringTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/StringTest.c new file mode 100644 index 0000000..292242b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/StringTest.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include + +int +string_equals(const char* s1, const char* s2) +{ + return strcmp(s1, s2) == 0; +} + +void +string_set(char* s1, const char* s2) +{ + strcpy(s1, s2); +} +void +string_concat(char* dst, const char* src) +{ + strcat(dst, src); +} +void +string_dummy(char* dummy) +{ +} +const char* +string_null(void) +{ + return NULL; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/StructTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/StructTest.c new file mode 100644 index 0000000..25683d3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/StructTest.c @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2007 Wayne Meissner. + * Copyright (c) 2009 Andrea Fazzi . + * + * All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#include +#include +#include +#include + +typedef char s8; +typedef short s16; +typedef int s32; +typedef long long s64; +typedef float f32; +typedef double f64; + +typedef struct bugged_struct { + unsigned char visible; + unsigned int x; + unsigned int y; + short rx; + short ry; + unsigned char order; + unsigned char size; +} bugged_struct_t; + +unsigned int +bugged_struct_size() { + return sizeof(bugged_struct_t); +} + +struct test1 { + char b; + short s; + int i; + long long j; + long l; + float f; + double d; + char string[32]; +}; + +struct struct_with_array { + char c; + int a[5]; +}; + +struct nested { + int i; +}; + +struct container { + char first; + struct nested s; +}; + +int +struct_align_nested_struct(struct container* a) { return a->s.i; } + +void* +struct_field_array(struct struct_with_array* s) { return &s->a; } + +struct container* +struct_make_container_struct(int i) +{ + static struct container cs; + memset(&cs, 0, sizeof(cs)); + cs.first = 1; + cs.s.i = i; + return &cs; +} + +#define T(x, type) \ + type struct_field_##type(struct test1* t) { return t->x; } \ + struct type##_align { char first; type value; }; \ + type struct_align_##type(struct type##_align* a) { return a->value; } + +T(b, s8); +T(s, s16); +T(i, s32); +T(j, s64); +T(f, f32); +T(d, f64); +T(l, long); + +void +struct_set_string(struct test1* t, char* s) +{ + strcpy(t->string, s); +} + +struct test1* +struct_make_struct(char b, short s, int i, long long ll, float f, double d) +{ + static struct test1 t; + memset(&t, 0, sizeof(t)); + t.b = b; + t.s = s; + t.i = i; + t.j = ll; + t.f = f; + t.d = d; + return &t; +} + +typedef int (*add_cb)(int a1, int a2); +typedef int (*sub_cb)(int a1, int a2); +struct test2 { + add_cb add_callback; + sub_cb sub_callback; +}; + +int +struct_call_add_cb(struct test2* t, int a1, int a2) +{ + return t->add_callback(a1, a2); +} + +int +struct_call_sub_cb(struct test2* t, int a1, int a2) +{ + return t->sub_callback(a1, a2); +} + + +struct struct_with_array* +struct_make_struct_with_array(int a_0, int a_1, int a_2, int a_3, int a_4) +{ + static struct struct_with_array s; + + memset(&s, 0, sizeof(s)); + + s.a[0] = a_0; + s.a[1] = a_1; + s.a[2] = a_2; + s.a[3] = a_3; + s.a[4] = a_4; + + return &s; + +} + +struct s8s32 { + char s8; + int s32; +}; + +struct s8s32 +struct_return_s8s32() +{ + struct s8s32 s; + s.s8 = 0x7f; + s.s32 = 0x12345678; + + return s; +} + +struct s8s32 +struct_s8s32_set(char s8, int s32) +{ + struct s8s32 s; + + s.s8 = s8; + s.s32 = s32; + + return s; +} + +int +struct_s8s32_get_s8(struct s8s32 s) +{ + return s.s8; +} + +int +struct_s8s32_get_s32(struct s8s32 s) +{ + return s.s32; +} + +struct s8s32 +struct_s8s32_ret_s8s32(struct s8s32 s) +{ + return s; +} + +// Pass a struct and an int arg, ensure the int arg is passed correctly +int +struct_s8s32_s32_ret_s32(struct s8s32 s, int s32) +{ + return s32; +} + +// Pass a struct and a long long arg, ensure the long long arg is passed correctly +long long +struct_s8s32_s64_ret_s64(struct s8s32 s, long long s64) +{ + return s64; +} + +// Pass a struct and a long long arg, ensure the long long arg is passed correctly +int +struct_s32_ptr_s32_s8s32_ret_s32(int s32a, void *ptr, int s32b, struct s8s32 s) +{ + if (ptr != NULL) *(struct s8s32 *) ptr = s; + return s.s32; +} + +// Pass a char *, copy into buffer length struct +struct struct_string { + char *bytes; + int len; +}; + +struct struct_string +struct_varargs_ret_struct_string(int len, ...) +{ + struct struct_string ss; + va_list vl; + char* cp = NULL; + + va_start(vl, len); + + ss.len = len; + ss.bytes = va_arg(vl, char *); + if (ss.bytes != NULL) { + cp = malloc(strlen(ss.bytes) + 1); + strcpy(cp, ss.bytes); + ss.bytes = cp; + } + + va_end(vl); + + return ss; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/UnionTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/UnionTest.c new file mode 100644 index 0000000..0929a31 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/UnionTest.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#include +#include +#include + +typedef char s8; +typedef short s16; +typedef int s32; +typedef long long s64; +typedef float f32; +typedef double f64; + +typedef union union_test { + char b; + short s; + int i; + long long j; + long l; + float f; + double d; + s8 a[10]; +} union_test_t; + +#define T(x, type) \ + type union_align_##type(union_test_t* u) { return u->x; } \ + union_test_t* union_make_union_with_##type(type value) { static union_test_t u; u.x = value; return &u; } + +T(b, s8); +T(s, s16); +T(i, s32); +T(j, s64); +T(f, f32); +T(d, f64); +T(l, long); + +unsigned int union_size() { return sizeof(union_test_t); } diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/VariadicTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/VariadicTest.c new file mode 100644 index 0000000..2f3d801 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/libtest/VariadicTest.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#include +#include +#include + +typedef int8_t s8; +typedef uint8_t u8; +typedef int16_t s16; +typedef uint16_t u16; +typedef int32_t s32; +typedef uint32_t u32; +typedef int64_t s64; +typedef uint64_t u64; +typedef signed long sL; +typedef unsigned long uL; +typedef float F; +typedef double D; + +void pack_varargs(s64* buf, const char* fmt, ...) +{ + va_list ap; + int c; + double d; + va_start(ap, fmt); + while ((c = *fmt++)) { + switch (c) { + case 'c': + case 's': + case 'i': + *buf++ = va_arg(ap, s32); + break; + case 'l': + *buf++ = va_arg(ap, long); + break; + case 'j': + *buf++ = va_arg(ap, s64); + break; + case 'f': + case 'd': + d = va_arg(ap, double); + memcpy(buf++, &d, sizeof(d)); + break; + case 'C': + case 'S': + case 'I': + *buf++ = va_arg(ap, u32); + break; + case 'L': + *buf++ = va_arg(ap, unsigned long); + break; + } + } + va_end(ap); +} + +int pack_varargs2(s64* buf, int retval, const char* fmt, ...) +{ + va_list ap; + int c; + double d; + va_start(ap, fmt); + while ((c = *fmt++)) { + switch (c) { + case 'c': + case 's': + case 'i': + *buf++ = va_arg(ap, s32); + break; + case 'l': + *buf++ = va_arg(ap, long); + break; + case 'j': + *buf++ = va_arg(ap, s64); + break; + case 'f': + case 'd': + d = va_arg(ap, double); + memcpy(buf++, &d, sizeof(d)); + break; + case 'C': + case 'S': + case 'I': + *buf++ = va_arg(ap, u32); + break; + case 'L': + *buf++ = va_arg(ap, unsigned long); + break; + } + } + va_end(ap); + return retval + 1; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/LICENSE.SPECS b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/LICENSE.SPECS new file mode 100644 index 0000000..561dd8c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/LICENSE.SPECS @@ -0,0 +1,22 @@ +Copyright (c) 2008-2014 Ruby-FFI contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/async_callback_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/async_callback_spec.rb new file mode 100644 index 0000000..87950cc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/async_callback_spec.rb @@ -0,0 +1,35 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "async callback" do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + AsyncIntCallback = callback [ :int ], :void + + @blocking = true + attach_function :testAsyncCallback, [ AsyncIntCallback, :int ], :void + end + + it ":int (0x7fffffff) argument" do + v = 0xdeadbeef + called = false + cb = Proc.new {|i| v = i; called = true } + LibTest.testAsyncCallback(cb, 0x7fffffff) + expect(called).to be true + expect(v).to eq(0x7fffffff) + end + + it "called a second time" do + v = 0xdeadbeef + called = false + cb = Proc.new {|i| v = i; called = true } + LibTest.testAsyncCallback(cb, 0x7fffffff) + expect(called).to be true + expect(v).to eq(0x7fffffff) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/bool_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/bool_spec.rb new file mode 100644 index 0000000..6cd1d6f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/bool_spec.rb @@ -0,0 +1,32 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "Function with primitive boolean arguments and return values" do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :bool_return_true, [ ], :bool + attach_function :bool_return_false, [ ], :bool + attach_function :bool_return_val, [ :bool ], :bool + attach_function :bool_reverse_val, [ :bool ], :bool + end + + it "bools" do + expect(LibTest.bool_return_true).to be true + expect(LibTest.bool_return_false).to be false + + expect(LibTest.bool_return_val(true)).to be true + expect(LibTest.bool_return_val(false)).to be false + + expect(LibTest.bool_reverse_val(true)).to be false + expect(LibTest.bool_reverse_val(false)).to be true + end + + it "raise error on invalid types" do + expect { LibTest.bool_return_val(nil) }.to raise_error(::TypeError) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/buffer_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/buffer_spec.rb new file mode 100644 index 0000000..5f22a62 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/buffer_spec.rb @@ -0,0 +1,279 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "Buffer#total" do + [1,2,3].each do |i| + { :char => 1, :uchar => 1, :short => 2, :ushort => 2, :int => 4, + :uint => 4, :long => FFI::Type::LONG.size, :ulong => FFI::Type::ULONG.size, + :long_long => 8, :ulong_long => 8, :float => 4, :double => 8 + }.each_pair do |t, s| + + it "Buffer.alloc_in(#{t}, #{i}).total == #{i * s}" do + expect(FFI::Buffer.alloc_in(t, i).total).to eq(i * s) + end + + it "Buffer.alloc_out(#{t}, #{i}).total == #{i * s}" do + expect(FFI::Buffer.alloc_out(t, i).total).to eq(i * s) + end + + it "Buffer.alloc_inout(#{t}, #{i}).total == #{i * s}" do + expect(FFI::Buffer.alloc_inout(t, i).total).to eq(i * s) + end + end + end +end + +describe "Buffer#put_char" do + bufsize = 4 + (0..127).each do |i| + (0..bufsize-1).each do |offset| + it "put_char(#{offset}, #{i}).get_char(#{offset}) == #{i}" do + expect(FFI::Buffer.alloc_in(bufsize).put_char(offset, i).get_char(offset)).to eq(i) + end + end + end +end + +describe "Buffer#put_uchar" do + bufsize = 4 + (0..255).each do |i| + (0..bufsize-1).each do |offset| + it "Buffer.put_uchar(#{offset}, #{i}).get_uchar(#{offset}) == #{i}" do + expect(FFI::Buffer.alloc_in(bufsize).put_uchar(offset, i).get_uchar(offset)).to eq(i) + end + end + end +end + +describe "Buffer#put_short" do + bufsize = 4 + [0, 1, 128, 32767].each do |i| + (0..bufsize-2).each do |offset| + it "put_short(#{offset}, #{i}).get_short(#{offset}) == #{i}" do + expect(FFI::Buffer.alloc_in(bufsize).put_short(offset, i).get_short(offset)).to eq(i) + end + end + end +end + +describe "Buffer#put_ushort" do + bufsize = 4 + [ 0, 1, 128, 32767, 65535, 0xfee1, 0xdead, 0xbeef, 0xcafe ].each do |i| + (0..bufsize-2).each do |offset| + it "put_ushort(#{offset}, #{i}).get_ushort(#{offset}) == #{i}" do + expect(FFI::Buffer.alloc_in(bufsize).put_ushort(offset, i).get_ushort(offset)).to eq(i) + end + end + end +end + +describe "Buffer#put_int" do + bufsize = 8 + [0, 1, 128, 32767, 0x7ffffff ].each do |i| + (0..bufsize-4).each do |offset| + it "put_int(#{offset}, #{i}).get_int(#{offset}) == #{i}" do + expect(FFI::Buffer.alloc_in(bufsize).put_int(offset, i).get_int(offset)).to eq(i) + end + end + end +end + +describe "Buffer#put_uint" do + bufsize = 8 + [ 0, 1, 128, 32767, 65535, 0xfee1dead, 0xcafebabe, 0xffffffff ].each do |i| + (0..bufsize-4).each do |offset| + it "put_uint(#{offset}, #{i}).get_uint(#{offset}) == #{i}" do + expect(FFI::Buffer.alloc_in(bufsize).put_uint(offset, i).get_uint(offset)).to eq(i) + end + end + end +end + +describe "Buffer#put_long" do + bufsize = 16 + [0, 1, 128, 32767, 0x7ffffff ].each do |i| + (0..bufsize-FFI::Type::LONG.size).each do |offset| + it "put_long(#{offset}, #{i}).get_long(#{offset}) == #{i}" do + expect(FFI::Buffer.alloc_in(bufsize).put_long(offset, i).get_long(offset)).to eq(i) + end + end + end +end + +describe "Buffer#put_ulong" do + bufsize = 16 + [ 0, 1, 128, 32767, 65535, 0xfee1dead, 0xcafebabe, 0xffffffff ].each do |i| + (0..bufsize-FFI::Type::LONG.size).each do |offset| + it "put_ulong(#{offset}, #{i}).get_ulong(#{offset}) == #{i}" do + expect(FFI::Buffer.alloc_in(bufsize).put_ulong(offset, i).get_ulong(offset)).to eq(i) + end + end + end +end + +describe "Buffer#put_long_long" do + bufsize = 16 + [0, 1, 128, 32767, 0x7ffffffffffffff ].each do |i| + (0..bufsize-8).each do |offset| + it "put_long_long(#{offset}, #{i}).get_long_long(#{offset}) == #{i}" do + expect(FFI::Buffer.alloc_in(bufsize).put_long_long(offset, i).get_long_long(offset)).to eq(i) + end + end + end +end + +describe "Buffer#put_ulong_long" do + bufsize = 16 + [ 0, 1, 128, 32767, 65535, 0xdeadcafebabe, 0x7fffffffffffffff ].each do |i| + (0..bufsize-8).each do |offset| + it "put_ulong_long(#{offset}, #{i}).get_ulong_long(#{offset}) == #{i}" do + expect(FFI::Buffer.alloc_in(bufsize).put_ulong_long(offset, i).get_ulong_long(offset)).to eq(i) + end + end + end +end + +describe "Reading/Writing binary strings" do + it "Buffer#put_bytes" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + buf.put_bytes(0, str); + s2 = buf.get_bytes(0, 11); + expect(s2).to eq(str) + end + + it "Buffer#put_bytes with index and length" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + buf.put_bytes(0, str, 5, 6); + s2 = buf.get_bytes(0, 6); + expect(s2).to eq(str[5..-1]) + end + + it "Buffer#put_bytes with only index" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + buf.put_bytes(0, str, 5); + s2 = buf.get_bytes(0, 6); + expect(s2).to eq(str[5..-1]) + end + + it "Buffer#put_bytes with index > str.length" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + expect { buf.put_bytes(0, str, 12); }.to raise_error + end + + it "Buffer#put_bytes with length > str.length" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + expect { buf.put_bytes(0, str, 0, 12); }.to raise_error + end + + it "Buffer#put_bytes with negative index" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + expect { buf.put_bytes(0, str, -1, 12); }.to raise_error + end + + it "Buffer#write_bytes" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + buf.write_bytes(str) + s2 = buf.get_bytes(0, 11) + expect(s2).to eq(str) + end + + it "Buffer#write_bytes with index and length" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + buf.write_bytes(str, 5, 6) + s2 = buf.get_bytes(0, 6) + expect(s2).to eq(str[5..-1]) + end + + it "Buffer#write_bytes with only index" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + buf.write_bytes(str, 5) + s2 = buf.get_bytes(0, 6) + expect(s2).to eq(str[5..-1]) + end + + it "Buffer#write_bytes with index > str.length" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + expect { buf.write_bytes(str, 12) }.to raise_error + end + + it "Buffer#put_bytes with length > str.length" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + expect { buf.put_bytes(0, str, 0, 12) }.to raise_error + end + + it "Buffer#write_bytes with negative index" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + expect { buf.write_bytes(str, -1, 12) }.to raise_error + end +end + +describe "Reading/Writing ascii strings" do + it "Buffer#put_string with string containing zero byte" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + buf.put_string(0, str); + s2 = buf.get_bytes(0, 11); + expect(s2).to eq(str) + end + + it "Buffer#get_string with string containing zero byte" do + str = "hello\0world" + buf = FFI::Buffer.new 1024 + buf.put_bytes(0, str); + s2 = buf.get_string(0, 11); + expect(s2).to eq("hello") + end + + it "Buffer#put_string without length should NUL terminate" do + str = "hello" + buf = FFI::Buffer.new 1024 + buf.put_string(0, str); + s2 = buf.get_bytes(0, 6); + expect(s2).to eq("hello\0") + end +end + +describe "Buffer#put_pointer" do + it "put_pointer(0, p).get_pointer(0) == p" do + p = FFI::MemoryPointer.new :ulong_long + p.put_uint(0, 0xdeadbeef) + buf = FFI::Buffer.alloc_inout 8 + p2 = buf.put_pointer(0, p).get_pointer(0) + expect(p2).not_to be_nil + expect(p2).to eq(p) + expect(p2.get_uint(0)).to eq(0xdeadbeef) + end +end + +describe "Buffer#size" do + it "should return size" do + buf = FFI::Buffer.new 14 + expect(buf.size).to eq(14) + end +end + +describe "Buffer#initialize" do + it "with block should execute block" do + block_executed = false + FFI::Buffer.new(:pointer) do |ptr| + block_executed = true + end + expect(block_executed).to be true + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/callback_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/callback_spec.rb new file mode 100644 index 0000000..bc9b55a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/callback_spec.rb @@ -0,0 +1,773 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "Callback" do +# module LibC +# extend FFI::Library +# callback :qsort_cmp, [ :pointer, :pointer ], :int +# attach_function :qsort, [ :pointer, :int, :int, :qsort_cmp ], :int +# end +# it "arguments get passed correctly" do +# p = MemoryPointer.new(:int, 2) +# p.put_array_of_int32(0, [ 1 , 2 ]) +# args = [] +# cmp = proc do |p1, p2| args.push(p1.get_int(0)); args.push(p2.get_int(0)); 0; end +# # this is a bit dodgey, as it relies on qsort passing the args in order +# LibC.qsort(p, 2, 4, cmp) +# args.should == [ 1, 2 ] +# end +# +# it "Block can be substituted for Callback as last argument" do +# p = MemoryPointer.new(:int, 2) +# p.put_array_of_int32(0, [ 1 , 2 ]) +# args = [] +# # this is a bit dodgey, as it relies on qsort passing the args in order +# LibC.qsort(p, 2, 4) do |p1, p2| +# args.push(p1.get_int(0)) +# args.push(p2.get_int(0)) +# 0 +# end +# args.should == [ 1, 2 ] +# end + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + class S8F32S32 < FFI::Struct + layout :s8, :char, :f32, :float, :s32, :int + end + + callback :cbVrS8, [ ], :char + callback :cbVrU8, [ ], :uchar + callback :cbVrS16, [ ], :short + callback :cbVrU16, [ ], :ushort + callback :cbVrS32, [ ], :int + callback :cbVrU32, [ ], :uint + callback :cbVrL, [ ], :long + callback :cbVrUL, [ ], :ulong + callback :cbVrS64, [ ], :long_long + callback :cbVrU64, [ ], :ulong_long + callback :cbVrP, [], :pointer + callback :cbVrZ, [], :bool + callback :cbCrV, [ :char ], :void + callback :cbSrV, [ :short ], :void + callback :cbIrV, [ :int ], :void + callback :cbLrV, [ :long ], :void + callback :cbULrV, [ :ulong ], :void + callback :cbLrV, [ :long_long ], :void + callback :cbVrT, [ ], S8F32S32.by_value + callback :cbTrV, [ S8F32S32.by_value ], :void + callback :cbYrV, [ S8F32S32.ptr ], :void + callback :cbVrY, [ ], S8F32S32.ptr + + attach_function :testCallbackVrS8, :testClosureVrB, [ :cbVrS8 ], :char + attach_function :testCallbackVrU8, :testClosureVrB, [ :cbVrU8 ], :uchar + attach_function :testCallbackVrS16, :testClosureVrS, [ :cbVrS16 ], :short + attach_function :testCallbackVrU16, :testClosureVrS, [ :cbVrU16 ], :ushort + attach_function :testCallbackVrS32, :testClosureVrI, [ :cbVrS32 ], :int + attach_function :testCallbackVrU32, :testClosureVrI, [ :cbVrU32 ], :uint + attach_function :testCallbackVrL, :testClosureVrL, [ :cbVrL ], :long + attach_function :testCallbackVrZ, :testClosureVrZ, [ :cbVrZ ], :bool + attach_function :testCallbackVrUL, :testClosureVrL, [ :cbVrUL ], :ulong + attach_function :testCallbackVrS64, :testClosureVrLL, [ :cbVrS64 ], :long_long + attach_function :testCallbackVrU64, :testClosureVrLL, [ :cbVrU64 ], :ulong_long + attach_function :testCallbackVrP, :testClosureVrP, [ :cbVrP ], :pointer + attach_function :testCallbackVrY, :testClosureVrP, [ :cbVrY ], S8F32S32.ptr + attach_function :testCallbackVrT, :testClosureVrT, [ :cbVrT ], S8F32S32.by_value + attach_function :testCallbackTrV, :testClosureTrV, [ :cbTrV, S8F32S32.ptr ], :void + attach_variable :cbVrS8, :gvar_pointer, :cbVrS8 + attach_variable :pVrS8, :gvar_pointer, :pointer + attach_function :testGVarCallbackVrS8, :testClosureVrB, [ :pointer ], :char + attach_function :testOptionalCallbackCrV, :testOptionalClosureBrV, [ :cbCrV, :char ], :void + + end + + it "returning :char (0)" do + expect(LibTest.testCallbackVrS8 { 0 }).to eq(0) + end + + it "returning :char (127)" do + expect(LibTest.testCallbackVrS8 { 127 }).to eq(127) + end + + it "returning :char (-128)" do + expect(LibTest.testCallbackVrS8 { -128 }).to eq(-128) + end + # test wrap around + it "returning :char (128)" do + expect(LibTest.testCallbackVrS8 { 128 }).to eq(-128) + end + + it "returning :char (255)" do + expect(LibTest.testCallbackVrS8 { 0xff }).to eq(-1) + end + + it "returning :uchar (0)" do + expect(LibTest.testCallbackVrU8 { 0 }).to eq(0) + end + + it "returning :uchar (0xff)" do + expect(LibTest.testCallbackVrU8 { 0xff }).to eq(0xff) + end + + it "returning :uchar (-1)" do + expect(LibTest.testCallbackVrU8 { -1 }).to eq(0xff) + end + + it "returning :uchar (128)" do + expect(LibTest.testCallbackVrU8 { 128 }).to eq(128) + end + + it "returning :uchar (-128)" do + expect(LibTest.testCallbackVrU8 { -128 }).to eq(128) + end + + it "returning :short (0)" do + expect(LibTest.testCallbackVrS16 { 0 }).to eq(0) + end + + it "returning :short (0x7fff)" do + expect(LibTest.testCallbackVrS16 { 0x7fff }).to eq(0x7fff) + end + # test wrap around + it "returning :short (0x8000)" do + expect(LibTest.testCallbackVrS16 { 0x8000 }).to eq(-0x8000) + end + + it "returning :short (0xffff)" do + expect(LibTest.testCallbackVrS16 { 0xffff }).to eq(-1) + end + + it "returning :ushort (0)" do + expect(LibTest.testCallbackVrU16 { 0 }).to eq(0) + end + + it "returning :ushort (0x7fff)" do + expect(LibTest.testCallbackVrU16 { 0x7fff }).to eq(0x7fff) + end + + it "returning :ushort (0x8000)" do + expect(LibTest.testCallbackVrU16 { 0x8000 }).to eq(0x8000) + end + + it "returning :ushort (0xffff)" do + expect(LibTest.testCallbackVrU16 { 0xffff }).to eq(0xffff) + end + + it "returning :ushort (-1)" do + expect(LibTest.testCallbackVrU16 { -1 }).to eq(0xffff) + end + + it "returning :int (0)" do + expect(LibTest.testCallbackVrS32 { 0 }).to eq(0) + end + + it "returning :int (0x7fffffff)" do + expect(LibTest.testCallbackVrS32 { 0x7fffffff }).to eq(0x7fffffff) + end + # test wrap around + it "returning :int (-0x80000000)" do + expect(LibTest.testCallbackVrS32 { -0x80000000 }).to eq(-0x80000000) + end + + it "returning :int (-1)" do + expect(LibTest.testCallbackVrS32 { -1 }).to eq(-1) + end + + it "returning :uint (0)" do + expect(LibTest.testCallbackVrU32 { 0 }).to eq(0) + end + + it "returning :uint (0x7fffffff)" do + expect(LibTest.testCallbackVrU32 { 0x7fffffff }).to eq(0x7fffffff) + end + # test wrap around + it "returning :uint (0x80000000)" do + expect(LibTest.testCallbackVrU32 { 0x80000000 }).to eq(0x80000000) + end + + it "returning :uint (0xffffffff)" do + expect(LibTest.testCallbackVrU32 { 0xffffffff }).to eq(0xffffffff) + end + + it "returning :uint (-1)" do + expect(LibTest.testCallbackVrU32 { -1 }).to eq(0xffffffff) + end + + it "returning :long (0)" do + expect(LibTest.testCallbackVrL { 0 }).to eq(0) + end + + it "returning :long (0x7fffffff)" do + expect(LibTest.testCallbackVrL { 0x7fffffff }).to eq(0x7fffffff) + end + # test wrap around + it "returning :long (-0x80000000)" do + expect(LibTest.testCallbackVrL { -0x80000000 }).to eq(-0x80000000) + end + + it "returning :long (-1)" do + expect(LibTest.testCallbackVrL { -1 }).to eq(-1) + end + + it "returning :ulong (0)" do + expect(LibTest.testCallbackVrUL { 0 }).to eq(0) + end + + it "returning :ulong (0x7fffffff)" do + expect(LibTest.testCallbackVrUL { 0x7fffffff }).to eq(0x7fffffff) + end + # test wrap around + it "returning :ulong (0x80000000)" do + expect(LibTest.testCallbackVrUL { 0x80000000 }).to eq(0x80000000) + end + + it "returning :ulong (0xffffffff)" do + expect(LibTest.testCallbackVrUL { 0xffffffff }).to eq(0xffffffff) + end + + it "Callback returning :ulong (-1)" do + if FFI::Platform::LONG_SIZE == 32 + expect(LibTest.testCallbackVrUL { -1 }).to eq(0xffffffff) + else + expect(LibTest.testCallbackVrUL { -1 }).to eq(0xffffffffffffffff) + end + end + + it "returning :long_long (0)" do + expect(LibTest.testCallbackVrS64 { 0 }).to eq(0) + end + + it "returning :long_long (0x7fffffffffffffff)" do + expect(LibTest.testCallbackVrS64 { 0x7fffffffffffffff }).to eq(0x7fffffffffffffff) + end + # test wrap around + it "returning :long_long (-0x8000000000000000)" do + expect(LibTest.testCallbackVrS64 { -0x8000000000000000 }).to eq(-0x8000000000000000) + end + + it "returning :long_long (-1)" do + expect(LibTest.testCallbackVrS64 { -1 }).to eq(-1) + end + + it "returning bool" do + expect(LibTest.testCallbackVrZ { true }).to be true + end + + it "returning :pointer (nil)" do + expect(LibTest.testCallbackVrP { nil }).to be_null + end + + it "returning :pointer (MemoryPointer)" do + p = FFI::MemoryPointer.new :long + expect(LibTest.testCallbackVrP { p }).to eq(p) + end + + it "returning struct by value" do + s = LibTest::S8F32S32.new + s[:s8] = 0x12 + s[:s32] = 0x1eefbeef + s[:f32] = 1.234567 + ret = LibTest.testCallbackVrT { s } + expect(ret[:s8]).to eq(s[:s8]) + expect(ret[:f32]).to eq(s[:f32]) + expect(ret[:s32]).to eq(s[:s32]) + + end + + it "struct by value parameter" do + s = LibTest::S8F32S32.new + s[:s8] = 0x12 + s[:s32] = 0x1eefbeef + s[:f32] = 1.234567 + s2 = LibTest::S8F32S32.new + + LibTest.testCallbackTrV(s) do |struct| + s2[:s8] = struct[:s8] + s2[:f32] = struct[:f32] + s2[:s32] = struct[:s32] + end + + expect(s2[:s8]).to eql 0x12 + expect(s2[:s32]).to eql 0x1eefbeef + expect(s2[:f32]).to be_within(0.0000001).of 1.234567 + end + + + it "global variable" do + proc = Proc.new { 0x1e } + LibTest.cbVrS8 = proc + expect(LibTest.testGVarCallbackVrS8(LibTest.pVrS8)).to eq(0x1e) + end + + describe "When the callback is considered optional by the underlying library" do + it "should handle receiving 'nil' in place of the closure" do + expect(LibTest.testOptionalCallbackCrV(nil, 13)).to be_nil + end + end + + describe 'when inlined' do + it 'could be anonymous' do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :testAnonymousCallbackVrS8, :testClosureVrB, [ callback([ ], :char) ], :char + end + expect(LibTest.testAnonymousCallbackVrS8 { 0 }).to eq(0) + end + end + + describe "as return value" do + + it "should not blow up when a callback is defined that returns a callback" do + expect(module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + callback :cb_return_type_1, [ :short ], :short + callback :cb_lookup_1, [ :short ], :cb_return_type_1 + attach_function :testReturnsCallback_1, :testReturnsClosure, [ :cb_lookup_1, :short ], :cb_return_type_1 + end).to be_an_instance_of FFI::Function + end + + it "should return a callback" do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + callback :cb_return_type, [ :int ], :int + callback :cb_lookup, [ ], :cb_return_type + attach_function :testReturnsCallback, :testReturnsClosure, [ :cb_lookup, :int ], :int + end + + lookup_proc_called = false + return_proc_called = false + + return_proc = Proc.new do |a| + return_proc_called = true + a * 2 + end + lookup_proc = Proc.new do + lookup_proc_called = true + return_proc + end + + val = LibTest.testReturnsCallback(lookup_proc, 0x1234) + expect(val).to eq(0x1234 * 2) + expect(lookup_proc_called).to be true + expect(return_proc_called).to be true + end + + it "should return a method callback" do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + callback :cb_return_type, [ :int ], :int + callback :cb_lookup, [ ], :cb_return_type + attach_function :testReturnsCallback_2, :testReturnsClosure, [ :cb_lookup, :int ], :int + end + module MethodCallback + def self.lookup + method(:perform) + end + def self.perform num + num * 2 + end + end + + expect(LibTest.testReturnsCallback_2(MethodCallback.method(:lookup), 0x1234)).to eq(0x2468) + end + + it 'should not blow up when a callback takes a callback as argument' do + expect(module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + callback :cb_argument, [ :int ], :int + callback :cb_with_cb_argument, [ :cb_argument, :int ], :int + attach_function :testCallbackAsArgument_2, :testArgumentClosure, [ :cb_with_cb_argument, :int ], :int + end).to be_an_instance_of FFI::Function + end + it 'should be able to use the callback argument' do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + callback :cb_argument, [ :int ], :int + callback :cb_with_cb_argument, [ :cb_argument, :int ], :int + attach_function :testCallbackAsArgument, :testArgumentClosure, [ :cb_with_cb_argument, :cb_argument, :int ], :int + end + callback_arg_called = false + callback_with_callback_arg_called = false + callback_arg = Proc.new do |val| + callback_arg_called = true + val * 2 + end + callback_with_callback_arg = Proc.new do |cb, val| + callback_with_callback_arg_called = true + cb.call(val) + end + val = LibTest.testCallbackAsArgument(callback_with_callback_arg, callback_arg, 0xff1) + expect(val).to eq(0xff1 * 2) + expect(callback_arg_called).to be true + expect(callback_with_callback_arg_called).to be true + end + it 'function returns callable object' do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + callback :funcptr, [ :int ], :int + attach_function :testReturnsFunctionPointer, [ ], :funcptr + end + f = LibTest.testReturnsFunctionPointer + expect(f.call(3)).to eq(6) + end + end + +end + + +describe "Callback with " do + # + # Test callbacks that take an argument, returning void + # + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + + class S8F32S32 < FFI::Struct + layout :s8, :char, :f32, :float, :s32, :int + end + + callback :cbS8rV, [ :char ], :void + callback :cbU8rV, [ :uchar ], :void + callback :cbS16rV, [ :short ], :void + callback :cbU16rV, [ :ushort ], :void + + callback :cbZrV, [ :bool ], :void + callback :cbS32rV, [ :int ], :void + callback :cbU32rV, [ :uint ], :void + + callback :cbLrV, [ :long ], :void + callback :cbULrV, [ :ulong ], :void + callback :cbArV, [ :string ], :void + callback :cbPrV, [ :pointer], :void + callback :cbYrV, [ S8F32S32.ptr ], :void + + callback :cbS64rV, [ :long_long ], :void + attach_function :testCallbackCrV, :testClosureBrV, [ :cbS8rV, :char ], :void + attach_function :testCallbackU8rV, :testClosureBrV, [ :cbU8rV, :uchar ], :void + attach_function :testCallbackSrV, :testClosureSrV, [ :cbS16rV, :short ], :void + attach_function :testCallbackU16rV, :testClosureSrV, [ :cbU16rV, :ushort ], :void + attach_function :testCallbackZrV, :testClosureZrV, [ :cbZrV, :bool ], :void + attach_function :testCallbackIrV, :testClosureIrV, [ :cbS32rV, :int ], :void + attach_function :testCallbackU32rV, :testClosureIrV, [ :cbU32rV, :uint ], :void + + attach_function :testCallbackLrV, :testClosureLrV, [ :cbLrV, :long ], :void + attach_function :testCallbackULrV, :testClosureULrV, [ :cbULrV, :ulong ], :void + + attach_function :testCallbackLLrV, :testClosureLLrV, [ :cbS64rV, :long_long ], :void + attach_function :testCallbackArV, :testClosurePrV, [ :cbArV, :string ], :void + attach_function :testCallbackPrV, :testClosurePrV, [ :cbPrV, :pointer], :void + attach_function :testCallbackYrV, :testClosurePrV, [ :cbYrV, S8F32S32.in ], :void + end + + it "function with Callback plus another arg should raise error if no arg given" do + expect { LibTest.testCallbackCrV { |*a| }}.to raise_error + end + + it ":char (0) argument" do + v = 0xdeadbeef + LibTest.testCallbackCrV(0) { |i| v = i } + expect(v).to eq(0) + end + + it ":char (127) argument" do + v = 0xdeadbeef + LibTest.testCallbackCrV(127) { |i| v = i } + expect(v).to eq(127) + end + + it ":char (-128) argument" do + v = 0xdeadbeef + LibTest.testCallbackCrV(-128) { |i| v = i } + expect(v).to eq(-128) + end + + it ":char (-1) argument" do + v = 0xdeadbeef + LibTest.testCallbackCrV(-1) { |i| v = i } + expect(v).to eq(-1) + end + + it ":uchar (0) argument" do + v = 0xdeadbeef + LibTest.testCallbackU8rV(0) { |i| v = i } + expect(v).to eq(0) + end + + it ":uchar (127) argument" do + v = 0xdeadbeef + LibTest.testCallbackU8rV(127) { |i| v = i } + expect(v).to eq(127) + end + + it ":uchar (128) argument" do + v = 0xdeadbeef + LibTest.testCallbackU8rV(128) { |i| v = i } + expect(v).to eq(128) + end + + it ":uchar (255) argument" do + v = 0xdeadbeef + LibTest.testCallbackU8rV(255) { |i| v = i } + expect(v).to eq(255) + end + + it ":short (0) argument" do + v = 0xdeadbeef + LibTest.testCallbackSrV(0) { |i| v = i } + expect(v).to eq(0) + end + + it ":short (0x7fff) argument" do + v = 0xdeadbeef + LibTest.testCallbackSrV(0x7fff) { |i| v = i } + expect(v).to eq(0x7fff) + end + + it ":short (-0x8000) argument" do + v = 0xdeadbeef + LibTest.testCallbackSrV(-0x8000) { |i| v = i } + expect(v).to eq(-0x8000) + end + + it ":short (-1) argument" do + v = 0xdeadbeef + LibTest.testCallbackSrV(-1) { |i| v = i } + expect(v).to eq(-1) + end + + it ":ushort (0) argument" do + v = 0xdeadbeef + LibTest.testCallbackU16rV(0) { |i| v = i } + expect(v).to eq(0) + end + + it ":ushort (0x7fff) argument" do + v = 0xdeadbeef + LibTest.testCallbackU16rV(0x7fff) { |i| v = i } + expect(v).to eq(0x7fff) + end + + it ":ushort (0x8000) argument" do + v = 0xdeadbeef + LibTest.testCallbackU16rV(0x8000) { |i| v = i } + expect(v).to eq(0x8000) + end + + it ":ushort (0xffff) argument" do + v = 0xdeadbeef + LibTest.testCallbackU16rV(0xffff) { |i| v = i } + expect(v).to eq(0xffff) + end + + it ":bool (true) argument" do + v = false + LibTest.testCallbackZrV(true) { |i| v = i } + expect(v).to be true + end + + it ":int (0) argument" do + v = 0xdeadbeef + LibTest.testCallbackIrV(0) { |i| v = i } + expect(v).to eq(0) + end + + it ":int (0x7fffffff) argument" do + v = 0xdeadbeef + LibTest.testCallbackIrV(0x7fffffff) { |i| v = i } + expect(v).to eq(0x7fffffff) + end + + it ":int (-0x80000000) argument" do + v = 0xdeadbeef + LibTest.testCallbackIrV(-0x80000000) { |i| v = i } + expect(v).to eq(-0x80000000) + end + + it ":int (-1) argument" do + v = 0xdeadbeef + LibTest.testCallbackIrV(-1) { |i| v = i } + expect(v).to eq(-1) + end + + it ":uint (0) argument" do + v = 0xdeadbeef + LibTest.testCallbackU32rV(0) { |i| v = i } + expect(v).to eq(0) + end + + it ":uint (0x7fffffff) argument" do + v = 0xdeadbeef + LibTest.testCallbackU32rV(0x7fffffff) { |i| v = i } + expect(v).to eq(0x7fffffff) + end + + it ":uint (0x80000000) argument" do + v = 0xdeadbeef + LibTest.testCallbackU32rV(0x80000000) { |i| v = i } + expect(v).to eq(0x80000000) + end + + it ":uint (0xffffffff) argument" do + v = 0xdeadbeef + LibTest.testCallbackU32rV(0xffffffff) { |i| v = i } + expect(v).to eq(0xffffffff) + end + + it ":long (0) argument" do + v = 0xdeadbeef + LibTest.testCallbackLrV(0) { |i| v = i } + expect(v).to eq(0) + end + + it ":long (0x7fffffff) argument" do + v = 0xdeadbeef + LibTest.testCallbackLrV(0x7fffffff) { |i| v = i } + expect(v).to eq(0x7fffffff) + end + + it ":long (-0x80000000) argument" do + v = 0xdeadbeef + LibTest.testCallbackLrV(-0x80000000) { |i| v = i } + expect(v).to eq(-0x80000000) + end + + it ":long (-1) argument" do + v = 0xdeadbeef + LibTest.testCallbackLrV(-1) { |i| v = i } + expect(v).to eq(-1) + end + + it ":ulong (0) argument" do + v = 0xdeadbeef + LibTest.testCallbackULrV(0) { |i| v = i } + expect(v).to eq(0) + end + + it ":ulong (0x7fffffff) argument" do + v = 0xdeadbeef + LibTest.testCallbackULrV(0x7fffffff) { |i| v = i } + expect(v).to eq(0x7fffffff) + end + + it ":ulong (0x80000000) argument" do + v = 0xdeadbeef + LibTest.testCallbackULrV(0x80000000) { |i| v = i } + expect(v).to eq(0x80000000) + end + + it ":ulong (0xffffffff) argument" do + v = 0xdeadbeef + LibTest.testCallbackULrV(0xffffffff) { |i| v = i } + expect(v).to eq(0xffffffff) + end + + it ":long_long (0) argument" do + v = 0xdeadbeef + LibTest.testCallbackLLrV(0) { |i| v = i } + expect(v).to eq(0) + end + + it ":long_long (0x7fffffffffffffff) argument" do + v = 0xdeadbeef + LibTest.testCallbackLLrV(0x7fffffffffffffff) { |i| v = i } + expect(v).to eq(0x7fffffffffffffff) + end + + it ":long_long (-0x8000000000000000) argument" do + v = 0xdeadbeef + LibTest.testCallbackLLrV(-0x8000000000000000) { |i| v = i } + expect(v).to eq(-0x8000000000000000) + end + + it ":long_long (-1) argument" do + v = 0xdeadbeef + LibTest.testCallbackLLrV(-1) { |i| v = i } + expect(v).to eq(-1) + end + + it ":string argument" do + v = nil + LibTest.testCallbackArV("Hello, World") { |i| v = i } + expect(v).to eq("Hello, World") + end + + it ":string (nil) argument" do + v = "Hello, World" + LibTest.testCallbackArV(nil) { |i| v = i } + expect(v).to be_nil + end + + it ":pointer argument" do + v = nil + magic = FFI::Pointer.new(0xdeadbeef) + LibTest.testCallbackPrV(magic) { |i| v = i } + expect(v).to eq(magic) + end + + it ":pointer (nil) argument" do + v = "Hello, World" + LibTest.testCallbackPrV(nil) { |i| v = i } + expect(v).to eq(FFI::Pointer::NULL) + end + + it "struct by reference argument" do + v = nil + magic = LibTest::S8F32S32.new + LibTest.testCallbackYrV(magic) { |i| v = i } + expect(v.class).to eq(magic.class) + expect(v.pointer).to eq(magic.pointer) + end + + it "struct by reference argument with nil value" do + v = LibTest::S8F32S32.new + LibTest.testCallbackYrV(nil) { |i| v = i } + expect(v.is_a?(FFI::Struct)).to be true + expect(v.pointer).to eq(FFI::Pointer::NULL) + end + + it "varargs parameters are rejected" do + expect { + Module.new do + extend FFI::Library + ffi_lib TestLibrary::PATH + callback :cbVrL, [ :varargs ], :long + end + }.to raise_error(ArgumentError) + end + + # + # Test stdcall convention with function and callback. + # This is Windows 32-bit only. + # + if FFI::Platform::OS =~ /windows|cygwin/ && FFI::Platform::ARCH == 'i386' + module LibTestStdcall + extend FFI::Library + ffi_lib TestLibrary::PATH + ffi_convention :stdcall + + callback :cbStdcall, [ :pointer, :long ], :void + attach_function :testCallbackStdcall, 'testClosureStdcall', [ :pointer, :cbStdcall, :long ], :bool + end + + it "stdcall convention" do + v = 0xdeadbeef + po = FFI::MemoryPointer.new :long + pr = proc{|a,i| v = a,i; i } + res = LibTestStdcall.testCallbackStdcall(po, pr, 0x7fffffff) + expect(v).to eq([po, 0x7fffffff]) + expect(res).to be true + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/custom_param_type.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/custom_param_type.rb new file mode 100644 index 0000000..7d9216b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/custom_param_type.rb @@ -0,0 +1,37 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "functions with custom parameter types" do + before :each do + + Custom_enum = Class.new do + extend FFI::DataConverter + ToNativeMap= { :a => 1, :b => 2 } + FromNativeMap = { 1 => :a, 2 => :b } + + def self.native_type + @native_type_called = true + FFI::Type::INT32 + end + + def self.to_native(val, ctx) + @to_native_called = true + ToNativeMap[val] + end + + def self.from_native(val, ctx) + @from_native_called = true + FromNativeMap[val] + end + def self.native_type_called?; @native_type_called; end + def self.from_native_called?; @from_native_called; end + def self.to_native_called?; @to_native_called; end + end + + # FIXME add tests + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/custom_type_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/custom_type_spec.rb new file mode 100644 index 0000000..d9ce2c1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/custom_type_spec.rb @@ -0,0 +1,74 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "functions with custom types" do + class Custom_enum + extend FFI::DataConverter + ToNativeMap= { :a => 1, :b => 2, :c => 3 } + FromNativeMap = { 1 => :a, 2 => :b, 3 => :c } + + def self.native_type + @native_type_called = true + FFI::Type::INT32 + end + + def self.to_native(val, ctx) + @to_native_called = true + ToNativeMap[val] + end + + def self.from_native(val, ctx) + @from_native_called = true + FromNativeMap[val] + end + def self.native_type_called?; @native_type_called; end + def self.from_native_called?; @from_native_called; end + def self.to_native_called?; @to_native_called; end + end + + it "can attach with custom return type" do + expect do + Module.new do + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :ret_s32, [ :int ], Custom_enum + end + end.not_to raise_error + end + + it "should return object of correct type" do + + m = Module.new do + + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :ret_s32, [ :int ], Custom_enum + end + + expect(m.ret_s32(1).is_a?(Symbol)).to be true + end + + it "from_native should be called for result" do + m = Module.new do + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :ret_s32, [ :int ], Custom_enum + end + m.ret_s32(1) + expect(Custom_enum.from_native_called?).to be true + end + + it "to_native should be called for parameter" do + m = Module.new do + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :ret_s32, [ Custom_enum ], :int + end + m.ret_s32(:a) + expect(Custom_enum.to_native_called?).to be true + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/dup_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/dup_spec.rb new file mode 100644 index 0000000..ae6e523 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/dup_spec.rb @@ -0,0 +1,52 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "Pointer#dup" do + it "clone should be independent" do + p1 = FFI::MemoryPointer.new(:char, 1024) + p1.put_string(0, "test123"); + p2 = p1.dup + p1.put_string(0, "deadbeef") + + expect(p2.get_string(0)).to eq("test123") + end + + it "sliced pointer can be cloned" do + p1 = FFI::MemoryPointer.new(:char, 1024) + p1.put_string(0, "test123"); + p2 = p1[1].dup + + # first char will be excised + expect(p2.get_string(0)).to eq("est123") + expect(p1.get_string(0)).to eq("test123") + end + + it "sliced pointer when cloned is independent" do + p1 = FFI::MemoryPointer.new(:char, 1024) + p1.put_string(0, "test123"); + p2 = p1[1].dup + + p1.put_string(0, "deadbeef") + # first char will be excised + expect(p2.get_string(0)).to eq("est123") + end +end + + +describe "Struct#dup" do + it "clone should be independent" do + s = Class.new(FFI::Struct) do + layout :i, :int + end + s1 = s.new + s1[:i] = 0x12345 + s2 = s1.dup + s1[:i] = 0x98765 + expect(s2[:i]).to eq(0x12345) + expect(s1[:i]).to eq(0x98765) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/enum_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/enum_spec.rb new file mode 100644 index 0000000..55ff13a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/enum_spec.rb @@ -0,0 +1,423 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +module TestEnum0 + extend FFI::Library +end + +module TestEnum1 + extend FFI::Library + ffi_lib TestLibrary::PATH + + enum [:c1, :c2, :c3, :c4] + enum [:c5, 42, :c6, :c7, :c8] + enum [:c9, 42, :c10, :c11, 4242, :c12] + enum [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242] + + attach_function :test_untagged_enum, [:int], :int +end + +module TestEnum3 + extend FFI::Library + ffi_lib TestLibrary::PATH + + enum :enum_type1, [:c1, :c2, :c3, :c4] + enum :enum_type2, [:c5, 42, :c6, :c7, :c8] + enum :enum_type3, [:c9, 42, :c10, :c11, 4242, :c12] + enum :enum_type4, [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242] + + attach_function :test_tagged_typedef_enum1, [:enum_type1], :enum_type1 + attach_function :test_tagged_typedef_enum2, [:enum_type2], :enum_type2 + attach_function :test_tagged_typedef_enum3, [:enum_type3], :enum_type3 + attach_function :test_tagged_typedef_enum4, [:enum_type4], :enum_type4 +end + +module TestEnum4 + extend FFI::Library + ffi_lib TestLibrary::PATH + + enum [:c1, :c2, :c3, :c4] + enum :enum_type1, [:c5, 0x42, :c6, :c7, :c8] + enum :enum_type2, [:c9, 0x42, :c10, :c11, 0x4242, :c12] + enum :enum_type3, [:c13, 0x42, :c14, 0x4242, :c15, 0x42424242, :c16, 0x4242424242424242] + enum FFI::Type::UINT16, :enum_type4, [:c17, 0x42, :c18, :c19, :c20] + enum FFI::Type::UINT32, :enum_type5, [:c21, 0x42, :c22, :c23, 0x4242, :c24] + enum FFI::Type::UINT64, :enum_type6, [:c25, 0x42, :c26, 0x4242, :c27, 0x42424242, :c28, 0x4242424242424242] + enum FFI::Type::UINT64, [:c29, 0x4242424242424242, :c30, :c31, :c32] + + attach_function :test_untagged_nonint_enum, [:uint8], :uint8 + attach_function :test_tagged_nonint_enum1, [:uint16], :uint16 + attach_function :test_tagged_nonint_enum2, [:uint32], :uint32 + attach_function :test_tagged_nonint_enum3, [:uint64], :uint64 + attach_function :test_tagged_nonint_enum4, :test_tagged_nonint_enum1, [:enum_type4], :enum_type4 + attach_function :test_tagged_nonint_enum5, :test_tagged_nonint_enum2, [:enum_type5], :enum_type5 + attach_function :test_tagged_nonint_enum6, :test_tagged_nonint_enum3, [:enum_type6], :enum_type6 +end + +describe "A library with no enum defined" do + it "returns nil when asked for an enum" do + expect(TestEnum0.enum_type(:foo)).to be_nil + end +end + +describe "An untagged enum" do + it "constants can be used as function parameters and return value" do + expect(TestEnum1.test_untagged_enum(:c1)).to eq(0) + expect(TestEnum1.test_untagged_enum(:c2)).to eq(1) + expect(TestEnum1.test_untagged_enum(:c3)).to eq(2) + expect(TestEnum1.test_untagged_enum(:c4)).to eq(3) + expect(TestEnum1.test_untagged_enum(:c5)).to eq(42) + expect(TestEnum1.test_untagged_enum(:c6)).to eq(43) + expect(TestEnum1.test_untagged_enum(:c7)).to eq(44) + expect(TestEnum1.test_untagged_enum(:c8)).to eq(45) + expect(TestEnum1.test_untagged_enum(:c9)).to eq(42) + expect(TestEnum1.test_untagged_enum(:c10)).to eq(43) + expect(TestEnum1.test_untagged_enum(:c11)).to eq(4242) + expect(TestEnum1.test_untagged_enum(:c12)).to eq(4243) + expect(TestEnum1.test_untagged_enum(:c13)).to eq(42) + expect(TestEnum1.test_untagged_enum(:c14)).to eq(4242) + expect(TestEnum1.test_untagged_enum(:c15)).to eq(424242) + expect(TestEnum1.test_untagged_enum(:c16)).to eq(42424242) + expect(TestEnum4.test_untagged_nonint_enum(:c1)).to eq(0) + expect(TestEnum4.test_untagged_nonint_enum(:c2)).to eq(1) + expect(TestEnum4.test_untagged_nonint_enum(:c3)).to eq(2) + expect(TestEnum4.test_untagged_nonint_enum(:c4)).to eq(3) + expect(TestEnum4.test_tagged_nonint_enum3(:c29)).to eq(0x4242424242424242) + expect(TestEnum4.test_tagged_nonint_enum3(:c30)).to eq(0x4242424242424243) + expect(TestEnum4.test_tagged_nonint_enum3(:c31)).to eq(0x4242424242424244) + expect(TestEnum4.test_tagged_nonint_enum3(:c32)).to eq(0x4242424242424245) + end +end + +describe "A tagged typedef enum" do + it "is accessible through its tag" do + expect(TestEnum3.enum_type(:enum_type1)).not_to be_nil + expect(TestEnum3.enum_type(:enum_type2)).not_to be_nil + expect(TestEnum3.enum_type(:enum_type3)).not_to be_nil + expect(TestEnum3.enum_type(:enum_type4)).not_to be_nil + expect(TestEnum4.enum_type(:enum_type1)).not_to be_nil + expect(TestEnum4.enum_type(:enum_type2)).not_to be_nil + expect(TestEnum4.enum_type(:enum_type3)).not_to be_nil + expect(TestEnum4.enum_type(:enum_type4)).not_to be_nil + expect(TestEnum4.enum_type(:enum_type5)).not_to be_nil + expect(TestEnum4.enum_type(:enum_type6)).not_to be_nil + end + + it "contains enum constants" do + expect(TestEnum3.enum_type(:enum_type1).symbols.length).to eq(4) + expect(TestEnum3.enum_type(:enum_type2).symbols.length).to eq(4) + expect(TestEnum3.enum_type(:enum_type3).symbols.length).to eq(4) + expect(TestEnum3.enum_type(:enum_type4).symbols.length).to eq(4) + expect(TestEnum4.enum_type(:enum_type1).symbols.length).to eq(4) + expect(TestEnum4.enum_type(:enum_type2).symbols.length).to eq(4) + expect(TestEnum4.enum_type(:enum_type3).symbols.length).to eq(4) + expect(TestEnum4.enum_type(:enum_type4).symbols.length).to eq(4) + expect(TestEnum4.enum_type(:enum_type5).symbols.length).to eq(4) + expect(TestEnum4.enum_type(:enum_type6).symbols.length).to eq(4) + end + + it "constants can be used as function parameters and return value" do + expect(TestEnum3.test_tagged_typedef_enum1(:c1)).to be :c1 + expect(TestEnum3.test_tagged_typedef_enum1(:c2)).to be :c2 + expect(TestEnum3.test_tagged_typedef_enum1(:c3)).to be :c3 + expect(TestEnum3.test_tagged_typedef_enum1(:c4)).to be :c4 + expect(TestEnum3.test_tagged_typedef_enum2(:c5)).to be :c5 + expect(TestEnum3.test_tagged_typedef_enum2(:c6)).to be :c6 + expect(TestEnum3.test_tagged_typedef_enum2(:c7)).to be :c7 + expect(TestEnum3.test_tagged_typedef_enum2(:c8)).to be :c8 + expect(TestEnum3.test_tagged_typedef_enum3(:c9)).to be :c9 + expect(TestEnum3.test_tagged_typedef_enum3(:c10)).to be :c10 + expect(TestEnum3.test_tagged_typedef_enum3(:c11)).to be :c11 + expect(TestEnum3.test_tagged_typedef_enum3(:c12)).to be :c12 + expect(TestEnum3.test_tagged_typedef_enum4(:c13)).to be :c13 + expect(TestEnum3.test_tagged_typedef_enum4(:c14)).to be :c14 + expect(TestEnum3.test_tagged_typedef_enum4(:c15)).to be :c15 + expect(TestEnum3.test_tagged_typedef_enum4(:c16)).to be :c16 + expect(TestEnum4.test_tagged_nonint_enum1(:c5)).to eq(0x42) + expect(TestEnum4.test_tagged_nonint_enum1(:c6)).to eq(0x43) + expect(TestEnum4.test_tagged_nonint_enum1(:c7)).to eq(0x44) + expect(TestEnum4.test_tagged_nonint_enum1(:c8)).to eq(0x45) + expect(TestEnum4.test_tagged_nonint_enum2(:c9)).to eq(0x42) + expect(TestEnum4.test_tagged_nonint_enum2(:c10)).to eq(0x43) + expect(TestEnum4.test_tagged_nonint_enum2(:c11)).to eq(0x4242) + expect(TestEnum4.test_tagged_nonint_enum2(:c12)).to eq(0x4243) + expect(TestEnum4.test_tagged_nonint_enum3(:c13)).to eq(0x42) + expect(TestEnum4.test_tagged_nonint_enum3(:c14)).to eq(0x4242) + expect(TestEnum4.test_tagged_nonint_enum3(:c15)).to eq(0x42424242) + expect(TestEnum4.test_tagged_nonint_enum3(:c16)).to eq(0x4242424242424242) + expect(TestEnum4.test_tagged_nonint_enum4(:c17)).to eq(:c17) + expect(TestEnum4.test_tagged_nonint_enum4(:c18)).to eq(:c18) + expect(TestEnum4.test_tagged_nonint_enum4(:c19)).to eq(:c19) + expect(TestEnum4.test_tagged_nonint_enum4(:c20)).to eq(:c20) + expect(TestEnum4.test_tagged_nonint_enum5(:c21)).to eq(:c21) + expect(TestEnum4.test_tagged_nonint_enum5(:c22)).to eq(:c22) + expect(TestEnum4.test_tagged_nonint_enum5(:c23)).to eq(:c23) + expect(TestEnum4.test_tagged_nonint_enum5(:c24)).to eq(:c24) + expect(TestEnum4.test_tagged_nonint_enum6(:c25)).to eq(:c25) + expect(TestEnum4.test_tagged_nonint_enum6(:c26)).to eq(:c26) + expect(TestEnum4.test_tagged_nonint_enum6(:c27)).to eq(:c27) + expect(TestEnum4.test_tagged_nonint_enum6(:c28)).to eq(:c28) + end + + it "integers can be used instead of constants" do + expect(TestEnum3.test_tagged_typedef_enum1(0)).to be :c1 + expect(TestEnum3.test_tagged_typedef_enum1(1)).to be :c2 + expect(TestEnum3.test_tagged_typedef_enum1(2)).to be :c3 + expect(TestEnum3.test_tagged_typedef_enum1(3)).to be :c4 + expect(TestEnum3.test_tagged_typedef_enum2(42)).to be :c5 + expect(TestEnum3.test_tagged_typedef_enum2(43)).to be :c6 + expect(TestEnum3.test_tagged_typedef_enum2(44)).to be :c7 + expect(TestEnum3.test_tagged_typedef_enum2(45)).to be :c8 + expect(TestEnum3.test_tagged_typedef_enum3(42)).to be :c9 + expect(TestEnum3.test_tagged_typedef_enum3(43)).to be :c10 + expect(TestEnum3.test_tagged_typedef_enum3(4242)).to be :c11 + expect(TestEnum3.test_tagged_typedef_enum3(4243)).to be :c12 + expect(TestEnum3.test_tagged_typedef_enum4(42)).to be :c13 + expect(TestEnum3.test_tagged_typedef_enum4(4242)).to be :c14 + expect(TestEnum3.test_tagged_typedef_enum4(424242)).to be :c15 + expect(TestEnum3.test_tagged_typedef_enum4(42424242)).to be :c16 + expect(TestEnum4.test_tagged_nonint_enum4(0x42)).to eq(:c17) + expect(TestEnum4.test_tagged_nonint_enum4(0x43)).to eq(:c18) + expect(TestEnum4.test_tagged_nonint_enum4(0x44)).to eq(:c19) + expect(TestEnum4.test_tagged_nonint_enum4(0x45)).to eq(:c20) + expect(TestEnum4.test_tagged_nonint_enum5(0x42)).to eq(:c21) + expect(TestEnum4.test_tagged_nonint_enum5(0x43)).to eq(:c22) + expect(TestEnum4.test_tagged_nonint_enum5(0x4242)).to eq(:c23) + expect(TestEnum4.test_tagged_nonint_enum5(0x4243)).to eq(:c24) + expect(TestEnum4.test_tagged_nonint_enum6(0x42)).to eq(:c25) + expect(TestEnum4.test_tagged_nonint_enum6(0x4242)).to eq(:c26) + expect(TestEnum4.test_tagged_nonint_enum6(0x42424242)).to eq(:c27) + expect(TestEnum4.test_tagged_nonint_enum6(0x4242424242424242)).to eq(:c28) + end +end + +describe "All enums" do + it "have autonumbered constants when defined with names only" do + expect(TestEnum1.enum_value(:c1)).to eq(0) + expect(TestEnum1.enum_value(:c2)).to eq(1) + expect(TestEnum1.enum_value(:c3)).to eq(2) + expect(TestEnum1.enum_value(:c4)).to eq(3) + + expect(TestEnum3.enum_value(:c1)).to eq(0) + expect(TestEnum3.enum_value(:c2)).to eq(1) + expect(TestEnum3.enum_value(:c3)).to eq(2) + expect(TestEnum3.enum_value(:c4)).to eq(3) + + expect(TestEnum4.enum_value(:c1)).to eq(0) + expect(TestEnum4.enum_value(:c2)).to eq(1) + expect(TestEnum4.enum_value(:c3)).to eq(2) + expect(TestEnum4.enum_value(:c4)).to eq(3) + end + + it "can have an explicit first constant and autonumbered subsequent constants" do + expect(TestEnum1.enum_value(:c5)).to eq(42) + expect(TestEnum1.enum_value(:c6)).to eq(43) + expect(TestEnum1.enum_value(:c7)).to eq(44) + expect(TestEnum1.enum_value(:c8)).to eq(45) + + expect(TestEnum3.enum_value(:c5)).to eq(42) + expect(TestEnum3.enum_value(:c6)).to eq(43) + expect(TestEnum3.enum_value(:c7)).to eq(44) + expect(TestEnum3.enum_value(:c8)).to eq(45) + + expect(TestEnum4.enum_value(:c5)).to eq(0x42) + expect(TestEnum4.enum_value(:c6)).to eq(0x43) + expect(TestEnum4.enum_value(:c7)).to eq(0x44) + expect(TestEnum4.enum_value(:c8)).to eq(0x45) + + expect(TestEnum4.enum_value(:c29)).to eq(0x4242424242424242) + expect(TestEnum4.enum_value(:c30)).to eq(0x4242424242424243) + expect(TestEnum4.enum_value(:c31)).to eq(0x4242424242424244) + expect(TestEnum4.enum_value(:c32)).to eq(0x4242424242424245) + end + + it "can have a mix of explicit and autonumbered constants" do + expect(TestEnum1.enum_value(:c9)).to eq(42) + expect(TestEnum1.enum_value(:c10)).to eq(43) + expect(TestEnum1.enum_value(:c11)).to eq(4242) + expect(TestEnum1.enum_value(:c12)).to eq(4243) + + expect(TestEnum3.enum_value(:c9)).to eq(42) + expect(TestEnum3.enum_value(:c10)).to eq(43) + expect(TestEnum3.enum_value(:c11)).to eq(4242) + expect(TestEnum3.enum_value(:c12)).to eq(4243) + + expect(TestEnum4.enum_value(:c9)).to eq(0x42) + expect(TestEnum4.enum_value(:c10)).to eq(0x43) + expect(TestEnum4.enum_value(:c11)).to eq(0x4242) + expect(TestEnum4.enum_value(:c12)).to eq(0x4243) + + expect(TestEnum4.enum_value(:c21)).to eq(0x42) + expect(TestEnum4.enum_value(:c22)).to eq(0x43) + expect(TestEnum4.enum_value(:c23)).to eq(0x4242) + expect(TestEnum4.enum_value(:c24)).to eq(0x4243) + end + + it "can have all its constants explicitely valued" do + expect(TestEnum1.enum_value(:c13)).to eq(42) + expect(TestEnum1.enum_value(:c14)).to eq(4242) + expect(TestEnum1.enum_value(:c15)).to eq(424242) + expect(TestEnum1.enum_value(:c16)).to eq(42424242) + + expect(TestEnum3.enum_value(:c13)).to eq(42) + expect(TestEnum3.enum_value(:c14)).to eq(4242) + expect(TestEnum3.enum_value(:c15)).to eq(424242) + expect(TestEnum3.enum_value(:c16)).to eq(42424242) + + expect(TestEnum4.enum_value(:c13)).to eq(0x42) + expect(TestEnum4.enum_value(:c14)).to eq(0x4242) + expect(TestEnum4.enum_value(:c15)).to eq(0x42424242) + expect(TestEnum4.enum_value(:c16)).to eq(0x4242424242424242) + + expect(TestEnum4.enum_value(:c25)).to eq(0x42) + expect(TestEnum4.enum_value(:c26)).to eq(0x4242) + expect(TestEnum4.enum_value(:c27)).to eq(0x42424242) + expect(TestEnum4.enum_value(:c28)).to eq(0x4242424242424242) + end + + it "return the constant corresponding to a specific value" do + enum = TestEnum3.enum_type(:enum_type1) + expect(enum[0]).to be :c1 + expect(enum[1]).to be :c2 + expect(enum[2]).to be :c3 + expect(enum[3]).to be :c4 + + enum = TestEnum3.enum_type(:enum_type2) + expect(enum[42]).to be :c5 + expect(enum[43]).to be :c6 + expect(enum[44]).to be :c7 + expect(enum[45]).to be :c8 + + enum = TestEnum3.enum_type(:enum_type3) + expect(enum[42]).to be :c9 + expect(enum[43]).to be :c10 + expect(enum[4242]).to be :c11 + expect(enum[4243]).to be :c12 + + enum = TestEnum3.enum_type(:enum_type4) + expect(enum[42]).to be :c13 + expect(enum[4242]).to be :c14 + expect(enum[424242]).to be :c15 + expect(enum[42424242]).to be :c16 + + enum = TestEnum4.enum_type(:enum_type1) + expect(enum[0x42]).to eq(:c5) + expect(enum[0x43]).to eq(:c6) + expect(enum[0x44]).to eq(:c7) + expect(enum[0x45]).to eq(:c8) + + enum = TestEnum4.enum_type(:enum_type2) + expect(enum[0x42]).to eq(:c9) + expect(enum[0x43]).to eq(:c10) + expect(enum[0x4242]).to eq(:c11) + expect(enum[0x4243]).to eq(:c12) + + enum = TestEnum4.enum_type(:enum_type3) + expect(enum[0x42]).to eq(:c13) + expect(enum[0x4242]).to eq(:c14) + expect(enum[0x42424242]).to eq(:c15) + expect(enum[0x4242424242424242]).to eq(:c16) + + enum = TestEnum4.enum_type(:enum_type4) + expect(enum[0x42]).to eq(:c17) + expect(enum[0x43]).to eq(:c18) + expect(enum[0x44]).to eq(:c19) + expect(enum[0x45]).to eq(:c20) + + enum = TestEnum4.enum_type(:enum_type5) + expect(enum[0x42]).to eq(:c21) + expect(enum[0x43]).to eq(:c22) + expect(enum[0x4242]).to eq(:c23) + expect(enum[0x4243]).to eq(:c24) + + enum = TestEnum4.enum_type(:enum_type6) + expect(enum[0x42]).to eq(:c25) + expect(enum[0x4242]).to eq(:c26) + expect(enum[0x42424242]).to eq(:c27) + expect(enum[0x4242424242424242]).to eq(:c28) + end + + it "return nil for values that don't have a symbol" do + enum = TestEnum3.enum_type(:enum_type1) + expect(enum[-1]).to be_nil + expect(enum[4]).to be_nil + + enum = TestEnum3.enum_type(:enum_type2) + expect(enum[0]).to be_nil + expect(enum[41]).to be_nil + expect(enum[46]).to be_nil + + enum = TestEnum3.enum_type(:enum_type3) + expect(enum[0]).to be_nil + expect(enum[41]).to be_nil + expect(enum[44]).to be_nil + expect(enum[4241]).to be_nil + expect(enum[4244]).to be_nil + + enum = TestEnum3.enum_type(:enum_type4) + expect(enum[0]).to be_nil + expect(enum[41]).to be_nil + expect(enum[43]).to be_nil + expect(enum[4241]).to be_nil + expect(enum[4243]).to be_nil + expect(enum[424241]).to be_nil + expect(enum[424243]).to be_nil + expect(enum[42424241]).to be_nil + expect(enum[42424243]).to be_nil + + enum = TestEnum4.enum_type(:enum_type1) + expect(enum[0x0]).to be_nil + expect(enum[0x41]).to be_nil + expect(enum[0x46]).to be_nil + + enum = TestEnum4.enum_type(:enum_type2) + expect(enum[0x0]).to be_nil + expect(enum[0x41]).to be_nil + expect(enum[0x44]).to be_nil + expect(enum[0x4241]).to be_nil + expect(enum[0x4244]).to be_nil + + enum = TestEnum4.enum_type(:enum_type3) + expect(enum[0x0]).to be_nil + expect(enum[0x41]).to be_nil + expect(enum[0x43]).to be_nil + expect(enum[0x4241]).to be_nil + expect(enum[0x4243]).to be_nil + expect(enum[0x42424241]).to be_nil + expect(enum[0x42424243]).to be_nil + expect(enum[0x4242424242424241]).to be_nil + expect(enum[0x4242424242424243]).to be_nil + + enum = TestEnum4.enum_type(:enum_type4) + expect(enum[0x0]).to be_nil + expect(enum[0x41]).to be_nil + expect(enum[0x46]).to be_nil + + enum = TestEnum4.enum_type(:enum_type5) + expect(enum[0x0]).to be_nil + expect(enum[0x41]).to be_nil + expect(enum[0x44]).to be_nil + expect(enum[0x4241]).to be_nil + expect(enum[0x4244]).to be_nil + + enum = TestEnum4.enum_type(:enum_type6) + expect(enum[0x0]).to be_nil + expect(enum[0x41]).to be_nil + expect(enum[0x43]).to be_nil + expect(enum[0x4241]).to be_nil + expect(enum[0x4243]).to be_nil + expect(enum[0x42424241]).to be_nil + expect(enum[0x42424243]).to be_nil + expect(enum[0x4242424242424241]).to be_nil + expect(enum[0x4242424242424243]).to be_nil + end + + it "duplicate enum keys rejected" do + expect { enum [ :a, 0xfee1dead, :b, 0xdeadbeef, :a, 0 ] }.to raise_error + expect { enum FFI::Type::UINT64, [ :a, 0xfee1dead, :b, 0xdeadbeef, :a, 0 ] }.to raise_error + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/errno_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/errno_spec.rb new file mode 100644 index 0000000..61cbda2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/errno_spec.rb @@ -0,0 +1,20 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "FFI.errno" do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :setLastError, [ :int ], :void + end + + it "FFI.errno contains errno from last function" do + LibTest.setLastError(0) + LibTest.setLastError(0x12345678) + expect(FFI.errno).to eq(0x12345678) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/ffi_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/ffi_spec.rb new file mode 100644 index 0000000..bb93f37 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/ffi_spec.rb @@ -0,0 +1,28 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "FFI" do + + describe ".map_library_name" do + + let(:prefix) { FFI::Platform::LIBPREFIX } + let(:suffix) { FFI::Platform::LIBSUFFIX } + + it "should add platform library extension if not present" do + expect(FFI.map_library_name("#{prefix}dummy")).to eq("#{prefix}dummy.#{suffix}") + end + + it "should add platform library extension even if lib suffix is present in name" do + expect(FFI.map_library_name("#{prefix}dummy_with_#{suffix}")).to eq("#{prefix}dummy_with_#{suffix}.#{suffix}") + end + + it "should return Platform::LIBC when called with 'c'" do + expect(FFI.map_library_name('c')).to eq(FFI::Library::LIBC) + end + + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/Benchmark.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/Benchmark.c new file mode 100644 index 0000000..55a7380 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/Benchmark.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ +#include +#include + +void returnVoid() { + +} + +void returnVoidI(int arg) { + +} +int returnInt() { + return 0; +} + +int returnIntI(int arg) { + return arg; +} + +typedef int8_t s8; +typedef uint8_t u8; +typedef int16_t s16; +typedef uint16_t u16; +typedef int32_t s32; +typedef uint32_t u32; +typedef int64_t s64; +typedef uint64_t u64; +typedef float f32; +typedef double f64; +typedef void v; +typedef char* S; +typedef void* P; + +#define B6(R, T1, T2, T3, T4, T5, T6) R bench_##T1##T2##T3##T4##T5##T6##_##R(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) {} +#define B5(R, T1, T2, T3, T4, T5) R bench_##T1##T2##T3##T4##T5##_##R(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) {} +#define B4(R, T1, T2, T3, T4) R bench_##T1##T2##T3##T4##_##R(T1 a1, T2 a2, T3 a3, T4 a4) {} +#define B3(R, T1, T2, T3) R bench_##T1##T2##T3##_##R(T1 a1, T2 a2, T3 a3) {} +#define B2(R, T1, T2) R bench_##T1##T2##_##R(T1 a1, T2 a2) {} +#define B1(R, T1) R bench_##T1##_##R(T1 a1) {} +#define BrV(T) B1(v, T); B2(v, T, T); B3(v, T, T, T); B4(v, T, T, T, T); B5(v, T, T, T, T, T); B6(v, T, T, T, T, T, T); +BrV(u32); +BrV(s32); +BrV(s64); +BrV(u64); +BrV(f32); +BrV(f64); +BrV(S); +BrV(P); diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/BoolTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/BoolTest.c new file mode 100644 index 0000000..04cb6c6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/BoolTest.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2007 Wayne Meissner. + * Copyright (c) 2009 Aman Gupta. + * + * All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include + +bool +bool_return_true() +{ + return true; +} + +bool +bool_return_false() +{ + return false; +} + +bool +bool_return_val(bool value) +{ + return value; +} + +bool +bool_reverse_val(bool value) +{ + return value ? false : true; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/BufferTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/BufferTest.c new file mode 100644 index 0000000..3e95ebc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/BufferTest.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + + +#define MEMSET(buf, value, size) do { \ + int i; for (i = 0; i < size; ++i) buf[i] = value; \ +} while(0) +#define MEMCPY(dst, src, size) do { \ + int i; for (i = 0; i < size; ++i) dst[i] = src[i]; \ +} while(0) + +#define FILL(JTYPE, CTYPE) \ +void fill##JTYPE##Buffer(CTYPE* buf, CTYPE value, int size) { MEMSET(buf, value, size); } + +#define COPY(JTYPE, CTYPE) \ +void copy##JTYPE##Buffer(CTYPE* dst, CTYPE* src, int size) { MEMCPY(dst, src, size); } + +#define FUNC(JTYPE, CTYPE) \ + FILL(JTYPE, CTYPE); \ + COPY(JTYPE, CTYPE) + +FUNC(Byte, char); +FUNC(Short, short); +FUNC(Int, int); +FUNC(Long, long long); +FUNC(Float, float); +FUNC(Double, double); + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/ClosureTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/ClosureTest.c new file mode 100644 index 0000000..dfeabde --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/ClosureTest.c @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#ifndef _WIN32 +# include +#else +# include +# include +#endif + +#define R(T, rtype) rtype testClosureVr##T(rtype (*closure)(void)) { \ + return closure != NULL ? (*closure)() : (rtype) 0; \ +} + +#define P(T, ptype) void testClosure##T##rV(void (*closure)(ptype), ptype a1) { \ + if (closure != NULL) (*closure)(a1); \ +} + +void testClosureVrV(void (*closure)(void)) +{ + (*closure)(); +} + +R(Z, bool); +R(B, char); +R(S, short); +R(I, int); +R(L, long); +R(J, long long); +R(LL, long long); +R(F, float); +R(D, double); +R(P, const void*); + + +P(Z, bool); +P(B, char); +P(S, short); +P(I, int); +P(L, long); +P(J, long long); +P(LL, long long); +P(F, float); +P(D, double); +P(P, const void*); +P(UL, unsigned long); + +#if defined(_WIN32) && !defined(_WIN64) +bool __stdcall testClosureStdcall(long *a1, void __stdcall(*closure)(void *, long), long a2) { \ + void* sp_pre; + void* sp_post; + + asm volatile (" movl %%esp,%0" : "=g" (sp_pre)); + (*closure)(a1, a2); + asm volatile (" movl %%esp,%0" : "=g" (sp_post)); + + /* %esp before pushing parameters on the stack and after the call returns + * should be equal, if both sides respects the stdcall convention */ + return sp_pre == sp_post; +} +#endif + +void testOptionalClosureBrV(void (*closure)(char), char a1) +{ + if (closure) { + (*closure)(a1); + } +} + + +struct ThreadVrV { + void (*closure)(void); + int count; +}; + +static void * +threadVrV(void *arg) +{ + struct ThreadVrV* t = (struct ThreadVrV *) arg; + + int i; + for (i = 0; i < t->count; i++) { + (*t->closure)(); + } + + return NULL; +} + +void testThreadedClosureVrV(void (*closure)(void), int n) +{ + struct ThreadVrV arg = {closure, n}; +#ifndef _WIN32 + pthread_t t; + pthread_create(&t, NULL, threadVrV, &arg); + pthread_join(t, NULL); +#else + HANDLE hThread = (HANDLE) _beginthread((void (*)(void *))threadVrV, 0, &arg); + WaitForSingleObject(hThread, INFINITE); +#endif +} + +struct s8f32s32 { + char s8; + float f32; + int s32; +}; + +// Takes a struct argument +void testClosureTrV(void (*closure)(struct s8f32s32 s), struct s8f32s32* s) +{ + (*closure)(*s); +} + +// Returns a struct value +struct s8f32s32 testClosureVrT(struct s8f32s32 (*closure)()) +{ + return (*closure)(); +} + +typedef int (*returnTypeClosure_t)(int) ; +typedef returnTypeClosure_t (*lookupClosure_t)(); + +int testReturnsClosure(lookupClosure_t lookup, int val) +{ + returnTypeClosure_t func = lookup ? (*lookup)() : NULL; + return func ? (*func)(val) : 0; +} + +static int multiplyByTwo(int value) +{ + return value * 2; +} + +returnTypeClosure_t testReturnsFunctionPointer() +{ + return multiplyByTwo; +} + +typedef int (*argumentClosure_t)(int); +typedef int (*withArgumentClosure_t)(argumentClosure_t, int); + +int testArgumentClosure(withArgumentClosure_t closure_with, argumentClosure_t closure_arg, int val) +{ + return (*closure_with)(closure_arg, val); +} + + +// +// These macros produce functions of the form: +// testClosureBIrV(void (*closure)(char, int), char a1, int a2) {} +// +#define C2_(J1, J2, N1, N2) \ +void testClosure##J1##J2##rV(void (*closure)(N1, N2), N1 a1, N2 a2) \ +{ \ + if (closure != NULL) (*closure)(a1, a2); \ +} + +#define C2(J, N) \ + C2_(B, J, char, N) \ + C2_(S, J, short, N) \ + C2_(I, J, int, N) \ + C2_(LL, J, long long, N) \ + C2_(F, J, float, N) \ + C2_(D, J, double, N) \ + + +C2(B, char); +C2(S, short); +C2(I, int); +C2(LL, long long); +C2(F, float); +C2(D, double); + +#define C3_(J1, J2, J3, N1, N2, N3) \ +void testClosure##J1##J2##J3##rV(void (*closure)(N1, N2, N3), N1 a1, N2 a2, N3 a3) \ +{ \ + (*closure)(a1, a2, a3); \ +} + + +#define C3(J, N) \ + C3_(B, J, B, char, N, char) \ + C3_(S, J, S, short, N, short) \ + C3_(I, J, I, int, N, int) \ + C3_(LL, J, LL, long long, N, long long) \ + C3_(F, J, F, float, N, float) \ + C3_(D, J, D, double, N, double) \ + +C3(B, char); +C3(S, short); +C3(I, int); +C3(LL, long long); +C3(F, float); +C3(D, double); +C3_(B, S, I, char, short, int); +C3_(B, S, LL, char, short, long long); +C3_(LL, S, B, long long, short, char); +C3_(LL, B, S, long long, char, short); + + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/EnumTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/EnumTest.c new file mode 100644 index 0000000..4bf8d23 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/EnumTest.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ +#include + +int test_untagged_enum(int val) { + return val; +} + +int test_untagged_typedef_enum(int val) { + return val; +} + +uint8_t test_untagged_nonint_enum(uint8_t val) { + return val; +} + +uint16_t test_tagged_nonint_enum1(uint16_t val) { + return val; +} + +uint32_t test_tagged_nonint_enum2(uint32_t val) { + return val; +} + +uint64_t test_tagged_nonint_enum3(uint64_t val) { + return val; +} + +typedef enum {c1, c2, c3, c4} enum_type1; +enum_type1 test_tagged_typedef_enum1(enum_type1 val) { + return val; +} + +typedef enum {c5 = 42, c6, c7, c8} enum_type2; +enum_type2 test_tagged_typedef_enum2(enum_type2 val) { + return val; +} + +typedef enum {c9 = 42, c10, c11 = 4242, c12} enum_type3; +enum_type3 test_tagged_typedef_enum3(enum_type3 val) { + return val; +} + +typedef enum {c13 = 42, c14 = 4242, c15 = 424242, c16 = 42424242} enum_type4; +enum_type4 test_tagged_typedef_enum4(enum_type4 val) { + return val; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/FunctionTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/FunctionTest.c new file mode 100644 index 0000000..1dd9185 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/FunctionTest.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#ifdef _WIN32 +#include +#endif + +#ifndef _WIN32 +#include +#include +#include +#include +#endif + +#include "PipeHelper.h" + +int testAdd(int a, int b) +{ + return a + b; +}; + +int testFunctionAdd(int a, int b, int (*f)(int, int)) +{ + return f(a, b); +}; + +struct testBlockingData { + FD_TYPE pipe1[2]; + FD_TYPE pipe2[2]; +}; + +struct testBlockingData *testBlockingOpen() +{ + struct testBlockingData *self = malloc(sizeof(struct testBlockingData)); + + if( pipeHelperCreatePipe(self->pipe1) == -1 ) return NULL; + if( pipeHelperCreatePipe(self->pipe2) == -1 ) return NULL; + return self; +} + +char testBlockingWR(struct testBlockingData *self, char c) { + if( pipeHelperWriteChar(self->pipe1[1], c) != 1) + return 0; + return pipeHelperReadChar(self->pipe2[0], 10); +} + +char testBlockingRW(struct testBlockingData *self, char c) { + char d = pipeHelperReadChar(self->pipe1[0], 10); + if( pipeHelperWriteChar(self->pipe2[1], c) != 1) + return 0; + return d; +} + +void testBlockingClose(struct testBlockingData *self) { + pipeHelperClosePipe(self->pipe1[0]); + pipeHelperClosePipe(self->pipe1[1]); + pipeHelperClosePipe(self->pipe2[0]); + pipeHelperClosePipe(self->pipe2[1]); + free(self); +} + +static int sum_varargs(va_list args) { + char sum = 0; + int arg; + while ((arg = va_arg(args, int)) != 0) { + sum += arg; + } + va_end(args); + return sum; +} + +/* Write c to pipe1 and return the value read from pipe2, or 0 if there’s + * an error such as a timeout, or if c does not equal the sum of the + * zero-terminated list of char arguments. */ +char testBlockingWRva(struct testBlockingData *self, char c, ...) { + va_list args; + va_start(args, c); + if (sum_varargs(args) != c) { + return 0; + } + + if( pipeHelperWriteChar(self->pipe1[1], c) != 1) + return 0; + return pipeHelperReadChar(self->pipe2[0], 10); +} + +char testBlockingRWva(struct testBlockingData *self, char c, ...) { + va_list args; + va_start(args, c); + if (sum_varargs(args) != c) { + return 0; + } + + char d = pipeHelperReadChar(self->pipe1[0], 10); + if( pipeHelperWriteChar(self->pipe2[1], c) != 1) + return 0; + return d; +} + +struct async_data { + void (*fn)(int); + int value; +}; + +static void* asyncThreadCall(void *data) +{ + struct async_data* d = (struct async_data *) data; + if (d != NULL && d->fn != NULL) { + (*d->fn)(d->value); + } + + return NULL; +} + +void testAsyncCallback(void (*fn)(int), int value) +{ +#ifndef _WIN32 + pthread_t t; + struct async_data d; + d.fn = fn; + d.value = value; + pthread_create(&t, NULL, asyncThreadCall, &d); + pthread_join(t, NULL); +#else + (*fn)(value); +#endif +} + +#if defined(_WIN32) && !defined(_WIN64) +struct StructUCDP { + unsigned char a1; + double a2; + void *a3; +}; + +void __stdcall testStdcallManyParams(long *a1, char a2, short int a3, int a4, __int64 a5, + struct StructUCDP a6, struct StructUCDP *a7, float a8, double a9) { +} +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/GNUmakefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/GNUmakefile new file mode 100644 index 0000000..d730419 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/GNUmakefile @@ -0,0 +1,149 @@ +# -*- makefile -*- + +ifeq ($(OS),) + BUILD_OS := $(shell uname -s | tr '[:upper:]' '[:lower:]') + OS := $(BUILD_OS) +endif + +ifeq ($(CPU),) + CPU := $(shell uname -m | sed -e 's/i[345678]86/i386/') +endif + +PLATFORM = $(CPU)-$(OS) + +ifeq ($(OS), sunos) + OS = solaris +endif + +SRC_DIR = . +BUILD_DIR ?= . +TEST_BUILD_DIR = . +# Set defaults to unix (linux/solaris/bsd) +PREFIX = lib +LIBEXT ?= so +LIBNAME = $(PREFIX)test.$(LIBEXT) + +export MACOSX_DEPLOYMENT_TARGET=10.4 + +CCACHE := $(strip $(realpath $(shell which ccache 2> /dev/null))) + +TEST_SRCS = $(wildcard $(SRC_DIR)/*.c) +TEST_OBJS := $(patsubst $(SRC_DIR)/%.c, $(TEST_BUILD_DIR)/%.o, $(TEST_SRCS)) + +# +# Compiler/linker flags from: +# http://weblogs.java.net/blog/kellyohair/archive/2006/01/compilation_of_1.html +JFLAGS = -fno-omit-frame-pointer -fno-strict-aliasing +OFLAGS = -O2 $(JFLAGS) +WFLAGS = -W -Wall -Wno-unused -Wno-parentheses +PICFLAGS = -fPIC +SOFLAGS = -shared +LDFLAGS += $(SOFLAGS) + +IFLAGS = -I"$(BUILD_DIR)" +CFLAGS = $(OFLAGS) $(WFLAGS) $(IFLAGS) $(PICFLAGS) -D_REENTRANT + +ifneq ($(strip $(findstring $(OS), win32, mingw, cygwin)),) + # For cygwin => win32-native builds, strip out cygwin deps + ifneq ($(findstring cygwin, $(BUILD_OS)),) + CC += -mno-cygwin -mwin32 + LDFLAGS += -mno-cygwin -Wl,--add-stdcall-alias + endif + PICFLAGS= + LIBEXT=dll + CC = gcc +endif + +ifeq ($(OS), darwin) + ifneq ($(findstring $(CPU),ppc),) + ARCHFLAGS += -arch ppc + endif + ifneq ($(findstring $(CPU),i386 x86_64),) + ARCHFLAGS += -arch i386 -arch x86_64 + endif + CFLAGS += $(ARCHFLAGS) -DTARGET_RT_MAC_CFM=0 + CFLAGS += -fno-common + LDFLAGS = $(ARCHFLAGS) -dynamiclib + # link against the universal libraries on ppc machines + LDFLAGS += -L$(MACSDK)/usr/lib + LIBEXT = dylib + FFI_CFLAGS += -isysroot $(MACSDK) + PICFLAGS = + SOFLAGS = +endif + +ifeq ($(OS), linux) + SOFLAGS += -Wl,-soname,$(LIBNAME) +endif + +ifeq ($(OS), solaris) + CC = /usr/sfw/bin/gcc -std=c99 + LD = /usr/ccs/bin/ld + SOFLAGS = -shared -static-libgcc +endif + +ifeq ($(OS), aix) + LIBEXT = a + SOFLAGS = -shared -static-libgcc + PICFLAGS += -pthread +endif + +ifneq ($(findstring bsd, $(OS)),) + SOFLAGS = -shared -static-libgcc + CFLAGS += -pthread + LDFLAGS += -pthread +endif + +ifeq ($(CPU), i386) + MODEL = 32 +endif + +ifeq ($(CPU), sparcv9) + MODEL = 64 +endif + +ifeq ($(CPU), amd64) + MODEL = 64 +endif + +ifeq ($(CPU), x86_64) + MODEL = 64 +endif + +ifeq ($(CPU), ppc64) + MODEL = 64 +endif + +ifeq ($(CPU), powerpc64) + MODEL = 64 +endif + +MODELFLAG = +ifneq ($(MODEL),) + MODELFLAG = -m$(MODEL) +endif + +# On platforms (linux, solaris) that support both 32bit and 64bit, force building for one or the other +ifneq ($(or $(findstring linux, $(OS)), $(findstring solaris, $(OS))),) + # Change the CC/LD instead of CFLAGS/LDFLAGS, incase other things in the flags + # makes the libffi build choke + CC += $(MODELFLAG) + LD += $(MODELFLAG) +endif + +LIBTEST = $(LIBNAME) + +all: $(LIBTEST) + +$(TEST_BUILD_DIR)/%.o : $(SRC_DIR)/%.c + @mkdir -p $(@D) + $(CCACHE) $(CC) $(CFLAGS) -c $< -o $@ + +$(LIBTEST): $(TEST_OBJS) + $(CC) -o $@ $(LDFLAGS) $(TEST_OBJS) -lm + +clean:: + # nothing to do - ant will delete the build dir + +debug:: + @echo "SRCS=$(TEST_SRCS)" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/GlobalVariable.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/GlobalVariable.c new file mode 100644 index 0000000..39c12a2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/GlobalVariable.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include + +typedef int8_t s8; +typedef uint8_t u8; +typedef int16_t s16; +typedef uint16_t u16; +typedef int32_t s32; +typedef uint32_t u32; +typedef int64_t s64; +typedef uint64_t u64; +typedef signed long sL; +typedef unsigned long uL; +typedef float f32; +typedef double f64; +#if !defined(__OpenBSD__) +typedef unsigned long ulong; +#endif +typedef void* pointer; +typedef void* P; + +#define GVAR(T) \ + extern T gvar_##T; \ + T gvar_##T = (T) -1; \ + T gvar_##T##_get() { return gvar_##T; }; \ + void gvar_##T##_set(T v) { gvar_##T = v; } + +GVAR(s8); +GVAR(u8); +GVAR(s16); +GVAR(u16); +GVAR(s32); +GVAR(u32); +GVAR(s64); +GVAR(u64); +GVAR(long); +GVAR(ulong); +GVAR(pointer); + +struct gstruct { + long data; +}; + +struct gstruct gvar_gstruct = { -1 }; + +struct gstruct* +gvar_gstruct_get(void) +{ + return &gvar_gstruct; +} + +void +gvar_gstruct_set(const struct gstruct* val) +{ + gvar_gstruct = *val; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/LastErrorTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/LastErrorTest.c new file mode 100644 index 0000000..02ce4a8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/LastErrorTest.c @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#if defined(_WIN32) || defined(__WIN32__) +# include +#else +# include +#endif + +int setLastError(int error) { +#if defined(_WIN32) || defined(__WIN32__) + SetLastError(error); +#else + errno = error; +#endif + return -1; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/NumberTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/NumberTest.c new file mode 100644 index 0000000..3fa25a8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/NumberTest.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#include +#include + +#if defined(__sparc) && defined(__sun__) + #define fix_mem_access __asm("ta 6") +#else + #define fix_mem_access +#endif + +typedef int8_t s8; +typedef uint8_t u8; +typedef int16_t s16; +typedef uint16_t u16; +typedef int32_t s32; +typedef uint32_t u32; +typedef int64_t s64; +typedef uint64_t u64; +typedef signed long sL; +typedef unsigned long uL; +typedef float f32; +typedef double f64; +typedef long double f128; +#if !defined(__OpenBSD__) +typedef unsigned long ulong; +#endif + +#define ADD(T) T add_##T(T arg1, T arg2) { return arg1 + arg2; } +#define SUB(T) T sub_##T(T arg1, T arg2) { return arg1 - arg2; } +#define MUL(T) T mul_##T(T arg1, T arg2) { return arg1 * arg2; } +#define DIV(T) T div_##T(T arg1, T arg2) { return arg1 / arg2; } +#define RET(T) T ret_##T(T arg1) { return arg1; } +#define SET(T) static T T##_;void set_##T(T arg1) { T##_ = arg1; } +#define GET(T) T get_##T() { return T##_; } +typedef char* ptr; +#define TEST(T) ADD(T) SUB(T) MUL(T) DIV(T) RET(T) SET(T) GET(T) +TEST(s8); +TEST(u8); +TEST(s16); +TEST(u16); +TEST(s32); +TEST(u32); +TEST(s64); +TEST(u64); +TEST(float); +TEST(double); +TEST(long); +TEST(ulong); +TEST(f128); + +#define ADD2(R, T1, T2) R add_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 + arg2; } +#define SUB2(R, T1, T2) R sub_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 - arg2; } +#define MUL2(R, T1, T2) R mul_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 * arg2; } +#define DIV2(R, T1, T2) R div_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 / arg2; } + +#define T2__(R, T1, T2) ADD2(R, T1, T2) SUB2(R, T1, T2) MUL2(R, T1, T2) DIV2(R, T1, T2) +#define T2_(R, T1) \ + T2__(R, T1, s8) T2__(R, T1, u8) \ + T2__(R, T1, s16) T2__(R, T1, u16) \ + T2__(R, T1, s32) T2__(R, T1, u32) \ + T2__(R, T1, sL) T2__(R, T1, uL) \ + T2__(R, T1, s64) T2__(R, T1, u64) \ + +#define TEST2(R) \ + T2_(R, s8) T2_(R, u8) T2_(R, s16) T2_(R, u16) T2_(R, s32) T2_(R, u32) \ + T2_(R, sL) T2_(R, uL) T2_(R, s64) T2_(R, u64) + +#ifdef notyet +TEST2(s32) +TEST2(u32) +TEST2(s64) +TEST2(u64) +#endif + +#define ADD3(R, T1, T2, T3) R add_##T1##T2##T3##_##R(T1 arg1, T2 arg2, T3 arg3) { return arg1 + arg2 + arg3; } +#define pack_f32(buf, v) do { float f = v; memcpy((buf), &f, sizeof(f)); } while(0) +#define pack_f64(buf, v) do { double f = v; memcpy((buf), &f, sizeof(f)); } while(0) +#define pack_int(buf, v) do { *(buf) = v; } while(0) +#define pack_s8 pack_int +#define pack_u8 pack_int +#define pack_s16 pack_int +#define pack_u16 pack_int +#define pack_s32 pack_int +#define pack_u32 pack_int +#define pack_s64 pack_int +#define pack_u64 pack_int +#define pack_sL pack_int +#define pack_uL pack_int + +#define PACK3(R, T1, T2, T3) void pack_##T1##T2##T3##_##R(T1 arg1, T2 arg2, T3 arg3, R* r) { \ + fix_mem_access; \ + pack_##T1(&r[0], arg1); \ + pack_##T2(&r[1], arg2); \ + pack_##T3(&r[2], arg3); \ +} + +#define T3___(R, T1, T2, T3) PACK3(R, T1, T2, T3) /* SUB2(R, T1, T2) MUL2(R, T1, T2) DIV2(R, T1, T2) */ +#define T3__(R, T1, T2) \ + T3___(R, T1, T2, s8) T3___(R, T1, T2, u8) \ + T3___(R, T1, T2, s16) T3___(R, T1, T2, u16) \ + T3___(R, T1, T2, s32) T3___(R, T1, T2, u32) \ + T3___(R, T1, T2, sL) T3___(R, T1, T2, uL) \ + T3___(R, T1, T2, s64) T3___(R, T1, T2, u64) \ + T3___(R, T1, T2, f32) T3___(R, T1, T2, f64) \ + +#define T3_(R, T1) \ + T3__(R, T1, s8) T3__(R, T1, u8) \ + T3__(R, T1, s16) T3__(R, T1, u16) \ + T3__(R, T1, s32) T3__(R, T1, u32) \ + T3__(R, T1, sL) T3__(R, T1, uL) \ + T3__(R, T1, s64) T3__(R, T1, u64) \ + T3__(R, T1, f32) T3__(R, T1, f64) \ + +#define TEST3(R) \ + T3_(R, s8) T3_(R, u8) T3_(R, s16) T3_(R, u16) T3_(R, s32) T3_(R, u32) \ + T3_(R, sL) T3_(R, uL) T3_(R, s64) T3_(R, u64) T3_(R, f32) T3_(R, f64) + +TEST3(s64) + +void +foo6(intptr_t i1, intptr_t i2, intptr_t i3, intptr_t i4, intptr_t i5, intptr_t i6) { } + +void +foo5(intptr_t i1, intptr_t i2, intptr_t i3, intptr_t i4, intptr_t i5) { } + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelper.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelper.h new file mode 100644 index 0000000..4a02111 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelper.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2015 Lars Kanis. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#ifndef PIPEHELPER_H +#define PIPEHELPER_H + +#ifdef _WIN32 +#define FD_TYPE HANDLE +#else +#define FD_TYPE int +#endif + +int pipeHelperCreatePipe(FD_TYPE pipefd[2]); +char pipeHelperReadChar(FD_TYPE fd, int timeout); +int pipeHelperWriteChar(FD_TYPE fd, char c); +void pipeHelperClosePipe(FD_TYPE fd); + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperPosix.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperPosix.c new file mode 100644 index 0000000..c1252b4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperPosix.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015 Lars Kanis. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#ifndef _WIN32 +#include +#include +#include "PipeHelper.h" + +int pipeHelperCreatePipe(FD_TYPE pipefd[2]) +{ + return pipe(pipefd); +} + +char pipeHelperReadChar(FD_TYPE fd, int timeout) +{ + char d; + struct timeval time = {timeout, 0}; // timeout after x seconds + fd_set read_fds; + FD_ZERO(&read_fds); + FD_SET(fd, &read_fds); + + if(select(fd + 1, &read_fds, NULL, NULL, &time) <= 0) + return 0; + + if( read(fd, &d, 1) != 1) + return 0; + return d; +} + +int pipeHelperWriteChar(FD_TYPE fd, char c) +{ + return write(fd, &c, 1); +} + +void pipeHelperClosePipe(FD_TYPE fd) { + close(fd); +} +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperWindows.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperWindows.c new file mode 100644 index 0000000..470bacc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperWindows.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#ifdef _WIN32 +#include +#include "PipeHelper.h" + +int pipeHelperCreatePipe(FD_TYPE pipefd[2]) +{ + char name[ MAX_PATH ]; + static int pipe_idx = 0; + sprintf( name, "\\\\.\\Pipe\\pipeHelper-%u-%i", + (unsigned int)GetCurrentProcessId(), pipe_idx++ ); + + pipefd[0] = CreateNamedPipe( name, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE | PIPE_WAIT, + 1, // Number of pipes + 5, // Out buffer size + 5, // In buffer size + 60 * 1000, // Timeout in ms + NULL ); + if(pipefd[0] == INVALID_HANDLE_VALUE) + return -1; + + pipefd[1] = CreateFile( name, GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if(pipefd[1] == INVALID_HANDLE_VALUE) { + CloseHandle( pipefd[0] ); + return -1; + } + return 0; +} + +char pipeHelperReadChar(FD_TYPE fd, int timeout) +{ + char d; + OVERLAPPED ovl; + ZeroMemory(&ovl, sizeof(ovl)); + ovl.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + if( ReadFile(fd, &d, 1, NULL, &ovl) == 0) { + DWORD recvd = 0;; + DWORD res = WaitForSingleObject(ovl.hEvent, timeout * 1000); + if( res != WAIT_OBJECT_0 ) { + CloseHandle(ovl.hEvent); + return 0; + } + if( GetOverlappedResult(fd, &ovl, &recvd, FALSE) == 0 ) { + CloseHandle(ovl.hEvent); + return 0; + } + } + CloseHandle(ovl.hEvent); + return d; +} + +int pipeHelperWriteChar(FD_TYPE fd, char c) +{ + DWORD written; + return WriteFile(fd, &c, 1, &written, NULL) == 0 ? 0 : 1; +} + +void pipeHelperClosePipe(FD_TYPE fd) { + CloseHandle(fd); +} + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PointerTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PointerTest.c new file mode 100644 index 0000000..7237ab2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/PointerTest.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#include +#include +#include +#include +typedef void* ptr; +typedef void* pointer; +#ifdef _WIN32 +typedef char* caddr_t; +#endif + +#define RET(T) T ptr_ret_##T(void* arg1, int offset) { \ + T tmp; memcpy(&tmp, (caddr_t) arg1 + offset, sizeof(tmp)); return tmp; \ +} +#define SET(T) void ptr_set_##T(void* arg1, int offset, T value) { \ + memcpy((caddr_t) arg1 + offset, &value, sizeof(value)); \ +} +#define TEST(T) SET(T) RET(T) + +TEST(int8_t); +TEST(int16_t); +TEST(int32_t); +TEST(int64_t); +TEST(float); +TEST(double); +TEST(pointer); + +void* +ptr_return_array_element(void **ptrArray, int arrayIndex) +{ + return ptrArray[arrayIndex]; +} + +void +ptr_set_array_element(void **ptrArray, int arrayIndex, void *value) +{ + ptrArray[arrayIndex] = value; +} + +void* +ptr_malloc(int size) +{ + return calloc(1, size); +} +void +ptr_free(void* ptr) +{ + free(ptr); +} + +void* +ptr_from_address(uintptr_t addr) +{ + return (void *) addr; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/ReferenceTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/ReferenceTest.c new file mode 100644 index 0000000..d1dd88b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/ReferenceTest.c @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include + +#define REF(T) void ref_##T(T arg, T* result) { *result = arg; } +#define ADD(T) void ref_add_##T(T arg1, T arg2, T* result) { *result = arg1 + arg2; } +#define SUB(T) void ref_sub_##T(T arg1, T arg2, T* result) { *result = arg1 - arg2; } +#define MUL(T) void ref_mul_##T(T arg1, T arg2, T* result) { *result = arg1 * arg2; } +#define DIV(T) void ref_div_##T(T arg1, T arg2, T* result) { *result = arg1 / arg2; } +#define TEST(T) ADD(T) SUB(T) MUL(T) DIV(T) REF(T) + +TEST(int8_t); +TEST(int16_t); +TEST(int32_t); +TEST(int64_t); +TEST(float); +TEST(double); + + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/StringTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/StringTest.c new file mode 100644 index 0000000..292242b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/StringTest.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include + +int +string_equals(const char* s1, const char* s2) +{ + return strcmp(s1, s2) == 0; +} + +void +string_set(char* s1, const char* s2) +{ + strcpy(s1, s2); +} +void +string_concat(char* dst, const char* src) +{ + strcat(dst, src); +} +void +string_dummy(char* dummy) +{ +} +const char* +string_null(void) +{ + return NULL; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/StructTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/StructTest.c new file mode 100644 index 0000000..25683d3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/StructTest.c @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2007 Wayne Meissner. + * Copyright (c) 2009 Andrea Fazzi . + * + * All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#include +#include +#include +#include + +typedef char s8; +typedef short s16; +typedef int s32; +typedef long long s64; +typedef float f32; +typedef double f64; + +typedef struct bugged_struct { + unsigned char visible; + unsigned int x; + unsigned int y; + short rx; + short ry; + unsigned char order; + unsigned char size; +} bugged_struct_t; + +unsigned int +bugged_struct_size() { + return sizeof(bugged_struct_t); +} + +struct test1 { + char b; + short s; + int i; + long long j; + long l; + float f; + double d; + char string[32]; +}; + +struct struct_with_array { + char c; + int a[5]; +}; + +struct nested { + int i; +}; + +struct container { + char first; + struct nested s; +}; + +int +struct_align_nested_struct(struct container* a) { return a->s.i; } + +void* +struct_field_array(struct struct_with_array* s) { return &s->a; } + +struct container* +struct_make_container_struct(int i) +{ + static struct container cs; + memset(&cs, 0, sizeof(cs)); + cs.first = 1; + cs.s.i = i; + return &cs; +} + +#define T(x, type) \ + type struct_field_##type(struct test1* t) { return t->x; } \ + struct type##_align { char first; type value; }; \ + type struct_align_##type(struct type##_align* a) { return a->value; } + +T(b, s8); +T(s, s16); +T(i, s32); +T(j, s64); +T(f, f32); +T(d, f64); +T(l, long); + +void +struct_set_string(struct test1* t, char* s) +{ + strcpy(t->string, s); +} + +struct test1* +struct_make_struct(char b, short s, int i, long long ll, float f, double d) +{ + static struct test1 t; + memset(&t, 0, sizeof(t)); + t.b = b; + t.s = s; + t.i = i; + t.j = ll; + t.f = f; + t.d = d; + return &t; +} + +typedef int (*add_cb)(int a1, int a2); +typedef int (*sub_cb)(int a1, int a2); +struct test2 { + add_cb add_callback; + sub_cb sub_callback; +}; + +int +struct_call_add_cb(struct test2* t, int a1, int a2) +{ + return t->add_callback(a1, a2); +} + +int +struct_call_sub_cb(struct test2* t, int a1, int a2) +{ + return t->sub_callback(a1, a2); +} + + +struct struct_with_array* +struct_make_struct_with_array(int a_0, int a_1, int a_2, int a_3, int a_4) +{ + static struct struct_with_array s; + + memset(&s, 0, sizeof(s)); + + s.a[0] = a_0; + s.a[1] = a_1; + s.a[2] = a_2; + s.a[3] = a_3; + s.a[4] = a_4; + + return &s; + +} + +struct s8s32 { + char s8; + int s32; +}; + +struct s8s32 +struct_return_s8s32() +{ + struct s8s32 s; + s.s8 = 0x7f; + s.s32 = 0x12345678; + + return s; +} + +struct s8s32 +struct_s8s32_set(char s8, int s32) +{ + struct s8s32 s; + + s.s8 = s8; + s.s32 = s32; + + return s; +} + +int +struct_s8s32_get_s8(struct s8s32 s) +{ + return s.s8; +} + +int +struct_s8s32_get_s32(struct s8s32 s) +{ + return s.s32; +} + +struct s8s32 +struct_s8s32_ret_s8s32(struct s8s32 s) +{ + return s; +} + +// Pass a struct and an int arg, ensure the int arg is passed correctly +int +struct_s8s32_s32_ret_s32(struct s8s32 s, int s32) +{ + return s32; +} + +// Pass a struct and a long long arg, ensure the long long arg is passed correctly +long long +struct_s8s32_s64_ret_s64(struct s8s32 s, long long s64) +{ + return s64; +} + +// Pass a struct and a long long arg, ensure the long long arg is passed correctly +int +struct_s32_ptr_s32_s8s32_ret_s32(int s32a, void *ptr, int s32b, struct s8s32 s) +{ + if (ptr != NULL) *(struct s8s32 *) ptr = s; + return s.s32; +} + +// Pass a char *, copy into buffer length struct +struct struct_string { + char *bytes; + int len; +}; + +struct struct_string +struct_varargs_ret_struct_string(int len, ...) +{ + struct struct_string ss; + va_list vl; + char* cp = NULL; + + va_start(vl, len); + + ss.len = len; + ss.bytes = va_arg(vl, char *); + if (ss.bytes != NULL) { + cp = malloc(strlen(ss.bytes) + 1); + strcpy(cp, ss.bytes); + ss.bytes = cp; + } + + va_end(vl); + + return ss; +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/UnionTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/UnionTest.c new file mode 100644 index 0000000..0929a31 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/UnionTest.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#include +#include +#include + +typedef char s8; +typedef short s16; +typedef int s32; +typedef long long s64; +typedef float f32; +typedef double f64; + +typedef union union_test { + char b; + short s; + int i; + long long j; + long l; + float f; + double d; + s8 a[10]; +} union_test_t; + +#define T(x, type) \ + type union_align_##type(union_test_t* u) { return u->x; } \ + union_test_t* union_make_union_with_##type(type value) { static union_test_t u; u.x = value; return &u; } + +T(b, s8); +T(s, s16); +T(i, s32); +T(j, s64); +T(f, f32); +T(d, f64); +T(l, long); + +unsigned int union_size() { return sizeof(union_test_t); } diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/VariadicTest.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/VariadicTest.c new file mode 100644 index 0000000..2f3d801 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/VariadicTest.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2007 Wayne Meissner. All rights reserved. + * + * For licensing, see LICENSE.SPECS + */ + +#include +#include +#include +#include +#include + +typedef int8_t s8; +typedef uint8_t u8; +typedef int16_t s16; +typedef uint16_t u16; +typedef int32_t s32; +typedef uint32_t u32; +typedef int64_t s64; +typedef uint64_t u64; +typedef signed long sL; +typedef unsigned long uL; +typedef float F; +typedef double D; + +void pack_varargs(s64* buf, const char* fmt, ...) +{ + va_list ap; + int c; + double d; + va_start(ap, fmt); + while ((c = *fmt++)) { + switch (c) { + case 'c': + case 's': + case 'i': + *buf++ = va_arg(ap, s32); + break; + case 'l': + *buf++ = va_arg(ap, long); + break; + case 'j': + *buf++ = va_arg(ap, s64); + break; + case 'f': + case 'd': + d = va_arg(ap, double); + memcpy(buf++, &d, sizeof(d)); + break; + case 'C': + case 'S': + case 'I': + *buf++ = va_arg(ap, u32); + break; + case 'L': + *buf++ = va_arg(ap, unsigned long); + break; + } + } + va_end(ap); +} + +int pack_varargs2(s64* buf, int retval, const char* fmt, ...) +{ + va_list ap; + int c; + double d; + va_start(ap, fmt); + while ((c = *fmt++)) { + switch (c) { + case 'c': + case 's': + case 'i': + *buf++ = va_arg(ap, s32); + break; + case 'l': + *buf++ = va_arg(ap, long); + break; + case 'j': + *buf++ = va_arg(ap, s64); + break; + case 'f': + case 'd': + d = va_arg(ap, double); + memcpy(buf++, &d, sizeof(d)); + break; + case 'C': + case 'S': + case 'I': + *buf++ = va_arg(ap, u32); + break; + case 'L': + *buf++ = va_arg(ap, unsigned long); + break; + } + } + va_end(ap); + return retval + 1; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/classes.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/classes.rb new file mode 100644 index 0000000..581768c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/classes.rb @@ -0,0 +1,438 @@ +module FFISpecs + # + # Callback fixtures + # + module LibTest + callback :cbVrS8, [ ], :char + callback :cbVrU8, [ ], :uchar + callback :cbVrS16, [ ], :short + callback :cbVrU16, [ ], :ushort + callback :cbVrS32, [ ], :int + callback :cbVrU32, [ ], :uint + callback :cbVrL, [ ], :long + callback :cbVrUL, [ ], :ulong + callback :cbVrS64, [ ], :long_long + callback :cbVrU64, [ ], :ulong_long + callback :cbVrP, [], :pointer + callback :cbCrV, [ :char ], :void + callback :cbSrV, [ :short ], :void + callback :cbIrV, [ :int ], :void + callback :cbLrV, [ :long ], :void + callback :cbULrV, [ :ulong ], :void + callback :cbLrV, [ :long_long ], :void + + attach_function :testCallbackVrS8, :testClosureVrB, [ :cbVrS8 ], :char + attach_function :testCallbackVrU8, :testClosureVrB, [ :cbVrU8 ], :uchar + attach_function :testCallbackVrS16, :testClosureVrS, [ :cbVrS16 ], :short + attach_function :testCallbackVrU16, :testClosureVrS, [ :cbVrU16 ], :ushort + attach_function :testCallbackVrS32, :testClosureVrI, [ :cbVrS32 ], :int + attach_function :testCallbackVrU32, :testClosureVrI, [ :cbVrU32 ], :uint + attach_function :testCallbackVrL, :testClosureVrL, [ :cbVrL ], :long + attach_function :testCallbackVrUL, :testClosureVrL, [ :cbVrUL ], :ulong + attach_function :testCallbackVrS64, :testClosureVrLL, [ :cbVrS64 ], :long_long + attach_function :testCallbackVrU64, :testClosureVrLL, [ :cbVrU64 ], :ulong_long + attach_function :testCallbackVrP, :testClosureVrP, [ :cbVrP ], :pointer + attach_function :testCallbackCrV, :testClosureBrV, [ :cbCrV, :char ], :void + attach_variable :cbVrS8, :gvar_pointer, :cbVrS8 + attach_variable :pVrS8, :gvar_pointer, :pointer + attach_function :testGVarCallbackVrS8, :testClosureVrB, [ :pointer ], :char + attach_function :testOptionalCallbackCrV, :testOptionalClosureBrV, [ :cbCrV, :char ], :void + + attach_function :testCallbackVrS8, :testClosureVrB, [ callback([ ], :char) ], :char + + callback :cb_return_type, [ :int ], :int + callback :cb_lookup, [ ], :cb_return_type + attach_function :testReturnsCallback, :testReturnsClosure, [ :cb_lookup, :int ], :int + + callback :funcptr, [ :int ], :int + attach_function :testReturnsFunctionPointer, [ ], :funcptr + + callback :cbS8rV, [ :char ], :void + callback :cbU8rV, [ :uchar ], :void + callback :cbS16rV, [ :short ], :void + callback :cbU16rV, [ :ushort ], :void + + callback :cbS32rV, [ :int ], :void + callback :cbU32rV, [ :uint ], :void + + callback :cbLrV, [ :long ], :void + callback :cbULrV, [ :ulong ], :void + + callback :cbS64rV, [ :long_long ], :void + attach_function :testCallbackCrV, :testClosureBrV, [ :cbS8rV, :char ], :void + attach_function :testCallbackU8rV, :testClosureBrV, [ :cbU8rV, :uchar ], :void + attach_function :testCallbackSrV, :testClosureSrV, [ :cbS16rV, :short ], :void + attach_function :testCallbackU16rV, :testClosureSrV, [ :cbU16rV, :ushort ], :void + attach_function :testCallbackIrV, :testClosureIrV, [ :cbS32rV, :int ], :void + attach_function :testCallbackU32rV, :testClosureIrV, [ :cbU32rV, :uint ], :void + + attach_function :testCallbackLrV, :testClosureLrV, [ :cbLrV, :long ], :void + attach_function :testCallbackULrV, :testClosureULrV, [ :cbULrV, :ulong ], :void + + attach_function :testCallbackLLrV, :testClosureLLrV, [ :cbS64rV, :long_long ], :void + end + + # + # Enum fixtures + # + module TestEnum0 + extend FFI::Library + end + + module TestEnum1 + extend FFI::Library + ffi_lib LIBRARY + + enum [:c1, :c2, :c3, :c4] + enum [:c5, 42, :c6, :c7, :c8] + enum [:c9, 42, :c10, :c11, 4242, :c12] + enum [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242] + + attach_function :test_untagged_enum, [:int], :int + end + + module TestEnum3 + extend FFI::Library + ffi_lib LIBRARY + + enum :enum_type1, [:c1, :c2, :c3, :c4] + enum :enum_type2, [:c5, 42, :c6, :c7, :c8] + enum :enum_type3, [:c9, 42, :c10, :c11, 4242, :c12] + enum :enum_type4, [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242] + + attach_function :test_tagged_typedef_enum1, [:enum_type1], :enum_type1 + attach_function :test_tagged_typedef_enum2, [:enum_type2], :enum_type2 + attach_function :test_tagged_typedef_enum3, [:enum_type3], :enum_type3 + attach_function :test_tagged_typedef_enum4, [:enum_type4], :enum_type4 + end + + # + # Errno fixtures + # + module LibTest + attach_function :setLastError, [ :int ], :void + end + + # + # ManagedStruct fixtures + # + module LibTest + attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer + end + + class NoRelease < ManagedStruct + layout :i, :int + end + + class WhatClassAmI < ManagedStruct + layout :i, :int + def self.release; end + end + + class PleaseReleaseMe < ManagedStruct + layout :i, :int + @@count = 0 + def self.release + @@count += 1 + end + def self.wait_gc(count) + loop = 5 + while loop > 0 && @@count < count + loop -= 1 + if RUBY_PLATFORM =~ /java/ + require 'java' + java.lang.System.gc + else + GC.start + end + sleep 0.05 if @@count < count + end + end + end + + # + # Number fixtures + # + module LibTest + attach_function :ret_s8, [ :char ], :char + attach_function :ret_u8, [ :uchar ], :uchar + attach_function :ret_s16, [ :short ], :short + attach_function :ret_u16, [ :ushort ], :ushort + attach_function :ret_s32, [ :int ], :int + attach_function :ret_u32, [ :uint ], :uint + attach_function :ret_s64, [ :long_long ], :long_long + attach_function :ret_u64, [ :ulong_long ], :ulong_long + attach_function :ret_long, [ :long ], :long + attach_function :ret_ulong, [ :ulong ], :ulong + attach_function :set_s8, [ :char ], :void + attach_function :get_s8, [ ], :char + attach_function :set_float, [ :float ], :void + attach_function :get_float, [ ], :float + attach_function :set_double, [ :double ], :void + attach_function :get_double, [ ], :double + end + + PACK_VALUES = { + 's8' => [ 0x12 ], + 'u8' => [ 0x34 ], + 's16' => [ 0x5678 ], + 'u16' => [ 0x9abc ], + 's32' => [ 0x7654321f ], + 'u32' => [ 0xfee1babe ], + 'sL' => [ 0x1f2e3d4c ], + 'uL' => [ 0xf7e8d9ca ], + 's64' => [ 0x1eafdeadbeefa1b2 ], + #'f32' => [ 1.234567 ], # TODO: Why is this disabled? + 'f64' => [ 9.87654321 ] + } + + TYPE_MAP = { + 's8' => :char, 'u8' => :uchar, 's16' => :short, 'u16' => :ushort, + 's32' => :int, 'u32' => :uint, 's64' => :long_long, 'u64' => :ulong_long, + 'sL' => :long, 'uL' => :ulong, 'f32' => :float, 'f64' => :double + } + TYPES = TYPE_MAP.keys + + module LibTest + [ 's32', 'u32', 's64', 'u64' ].each do |rt| + TYPES.each do |t1| + TYPES.each do |t2| + TYPES.each do |t3| + begin + attach_function "pack_#{t1}#{t2}#{t3}_#{rt}", + [ TYPE_MAP[t1], TYPE_MAP[t2], TYPE_MAP[t3], :buffer_out ], :void + rescue FFI::NotFoundError + end + end + end + end + end + end + + # + # Pointer fixtures + # + module LibTest + attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int + attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer + attach_function :ptr_set_pointer, [ :pointer, :int, :pointer ], :void + end + + class ToPtrTest + def initialize(ptr) + @ptr = ptr + end + def to_ptr + @ptr + end + end + + require 'delegate' + class PointerDelegate < DelegateClass(FFI::Pointer) + def initialize(ptr) + super + @ptr = ptr + end + def to_ptr + @ptr + end + end + + class AutoPointerTestHelper + @@count = 0 + def self.release + @@count += 1 if @@count > 0 + end + def self.reset + @@count = 0 + end + def self.gc_everything(count) + loop = 5 + while @@count < count && loop > 0 + loop -= 1 + if RUBY_PLATFORM =~ /java/ + require "java" + java.lang.System.gc + else + GC.start + end + sleep 0.05 unless @@count == count + end + @@count = 0 + end + def self.finalizer + self.method(:release).to_proc + end + end + + # + # String fixtures + # + module LibTest + attach_function :ptr_ret_pointer, [ :pointer, :int], :string + attach_function :string_equals, [ :string, :string ], :int + attach_function :string_dummy, [ :string ], :void + end + + # + # Struct initialize fixtures + # + class StructWithInitialize < FFI::Struct + layout :string, :string + attr_accessor :magic + def initialize + super + self.magic = 42 + end + end + + # + # Struct fixtures + # + StructTypes = { + 's8' => :char, + 's16' => :short, + 's32' => :int, + 's64' => :long_long, + 'long' => :long, + 'f32' => :float, + 'f64' => :double + } + + module LibTest + attach_function :ptr_ret_pointer, [ :pointer, :int], :string + attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int + attach_function :ptr_from_address, [ :ulong ], :pointer + attach_function :string_equals, [ :string, :string ], :int + [ 's8', 's16', 's32', 's64', 'f32', 'f64', 'long' ].each do |t| + attach_function "struct_align_#{t}", [ :pointer ], StructTypes[t] + end + end + + class PointerMember < FFI::Struct + layout :pointer, :pointer + end + + class StringMember < FFI::Struct + layout :string, :string + end + + module CallbackMember + extend FFI::Library + ffi_lib LIBRARY + callback :add, [ :int, :int ], :int + callback :sub, [ :int, :int ], :int + + class TestStruct < FFI::Struct + layout :add, :add, + :sub, :sub + end + + attach_function :struct_call_add_cb, [TestStruct, :int, :int], :int + attach_function :struct_call_sub_cb, [TestStruct, :int, :int], :int + end + + module LibTest + class NestedStruct < FFI::Struct + layout :i, :int + end + + class ContainerStruct < FFI::Struct + layout :first, :char, :ns, NestedStruct + end + + attach_function :struct_align_nested_struct, [ :pointer ], :int + attach_function :struct_make_container_struct, [ :int ], :pointer + + class StructWithArray < FFI::Struct + layout :first, :char, :a, [:int, 5] + end + + attach_function :struct_make_struct_with_array, [:int, :int, :int, :int, :int], :pointer + attach_function :struct_field_array, [:pointer], :pointer + + class BuggedStruct < FFI::Struct + layout :visible, :uchar, + :x, :uint, + :y, :uint, + :rx, :short, + :ry, :short, + :order, :uchar, + :size, :uchar + end + + attach_function :bugged_struct_size, [], :uint + end + + module StructCustomTypedef + extend FFI::Library + ffi_lib LIBRARY + typedef :uint, :fubar3_t + + class S < FFI::Struct + layout :a, :fubar3_t + end + end + + # + # Union fixtures + # + module LibTest + Types = { + 's8' => [:char, :c, 1], + 's16' => [:short, :s, 0xff0], + 's32' => [:int, :i, 0xff00], + 's64' => [:long_long, :j, 0xffff00], + 'long' => [:long, :l, 0xffff], + 'f32' => [:float, :f, 1.0001], + 'f64' => [:double, :d, 1.000000001] + } + + class TestUnion < FFI::Union + layout( :a, [:char, 10], + :i, :int, + :f, :float, + :d, :double, + :s, :short, + :l, :long, + :j, :long_long, + :c, :char ) + end + + Types.keys.each do |k| + attach_function "union_align_#{k}", [ :pointer ], Types[k][0] + attach_function "union_make_union_with_#{k}", [ Types[k][0] ], :pointer + end + + attach_function :union_size, [], :uint + end + + # + # Variadic fixtures + # + module LibTest + attach_function :pack_varargs, [ :buffer_out, :string, :varargs ], :void + end + + module Varargs + PACK_VALUES = { + 'c' => [ 0x12 ], + 'C' => [ 0x34 ], + 's' => [ 0x5678 ], + 'S' => [ 0x9abc ], + 'i' => [ 0x7654321f ], + 'I' => [ 0xfee1babe ], + 'l' => [ 0x1f2e3d4c ], + 'L' => [ 0xf7e8d9ca ], + 'j' => [ 0x1eafdeadbeefa1b2 ], + 'f' => [ 1.23456789 ], + 'd' => [ 9.87654321 ] + } + + TYPE_MAP = { + 'c' => :char, 'C' => :uchar, 's' => :short, 'S' => :ushort, + 'i' => :int, 'I' => :uint, 'j' => :long_long, 'J' => :ulong_long, + 'l' => :long, 'L' => :ulong, 'f' => :float, 'd' => :double + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/function_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/function_spec.rb new file mode 100644 index 0000000..dd4d2ea --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/function_spec.rb @@ -0,0 +1,97 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe FFI::Function do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :testFunctionAdd, [:int, :int, :pointer], :int + end + before do + @libtest = FFI::DynamicLibrary.open(TestLibrary::PATH, + FFI::DynamicLibrary::RTLD_LAZY | FFI::DynamicLibrary::RTLD_GLOBAL) + end + + it 'is initialized with a signature and a block' do + fn = FFI::Function.new(:int, []) { 5 } + expect(fn.call).to eql 5 + end + + it 'raises an error when passing a wrong signature' do + expect { FFI::Function.new([], :int).new { } }.to raise_error TypeError + end + + it 'returns a native pointer' do + expect(FFI::Function.new(:int, []) { }).to be_a_kind_of FFI::Pointer + end + + it 'can be used as callback from C passing to it a block' do + function_add = FFI::Function.new(:int, [:int, :int]) { |a, b| a + b } + expect(LibTest.testFunctionAdd(10, 10, function_add)).to eq(20) + end + + it 'can be used as callback from C passing to it a Proc object' do + function_add = FFI::Function.new(:int, [:int, :int], Proc.new { |a, b| a + b }) + expect(LibTest.testFunctionAdd(10, 10, function_add)).to eq(20) + end + + it 'can be used to wrap an existing function pointer' do + expect(FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd')).call(10, 10)).to eq(20) + end + + it 'can be attached to a module' do + module Foo; end + fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd')) + fp.attach(Foo, 'add') + expect(Foo.add(10, 10)).to eq(20) + end + + it 'can be used to extend an object' do + fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd')) + foo = Object.new + class << foo + def singleton_class + class << self; self; end + end + end + fp.attach(foo.singleton_class, 'add') + expect(foo.add(10, 10)).to eq(20) + end + + it 'can wrap a blocking function' do + fpOpen = FFI::Function.new(:pointer, [ ], @libtest.find_function('testBlockingOpen')) + fpRW = FFI::Function.new(:char, [ :pointer, :char ], @libtest.find_function('testBlockingRW'), :blocking => true) + fpWR = FFI::Function.new(:char, [ :pointer, :char ], @libtest.find_function('testBlockingWR'), :blocking => true) + fpClose = FFI::Function.new(:void, [ :pointer ], @libtest.find_function('testBlockingClose')) + handle = fpOpen.call + expect(handle).not_to be_null + begin + thWR = Thread.new { fpWR.call(handle, 63) } + thRW = Thread.new { fpRW.call(handle, 64) } + expect(thWR.value).to eq(64) + expect(thRW.value).to eq(63) + ensure + fpClose.call(handle) + end + end + + it 'autorelease flag is set to true by default' do + fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd')) + expect(fp.autorelease?).to be true + end + + it 'can explicity free itself' do + fp = FFI::Function.new(:int, []) { } + fp.free + expect { fp.free }.to raise_error RuntimeError + end + + it 'can\'t explicity free itself if not previously allocated' do + fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd')) + expect { fp.free }.to raise_error RuntimeError + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/io_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/io_spec.rb new file mode 100644 index 0000000..22c238a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/io_spec.rb @@ -0,0 +1,16 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +if false # disabled for #390 + describe "FFI::IO.for_fd" do + it "produces an IO wrapping the specified file descriptor" do + expect do + FFI::IO.for_fd(2, "r") + end.to_not raise_error + end + end +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/library_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/library_spec.rb new file mode 100644 index 0000000..c4900d3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/library_spec.rb @@ -0,0 +1,286 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "Library" do + describe ".enum_value" do + m = Module.new do + extend FFI::Library + enum :something, [:one, :two] + end + + it "should return a value for a valid key" do + expect(m.enum_value(:one)).to eq(0) + expect(m.enum_value(:two)).to eq(1) + end + + it "should return nil for an invalid key" do + expect(m.enum_value(:three)).to be nil + end + end + + describe "#ffi_convention" do + it "defaults to :default" do + m = Module.new do + extend FFI::Library + end + expect(m.ffi_convention).to eq(:default) + end + + it "should be settable" do + m = Module.new do + extend FFI::Library + end + + expect(m.ffi_convention).to eq(:default) + m.ffi_convention :stdcall + expect(m.ffi_convention).to eq(:stdcall) + end + end + + if FFI::Platform::OS =~ /windows|cygwin/ && FFI::Platform::ARCH == 'i386' + module LibTestStdcall + extend FFI::Library + ffi_lib TestLibrary::PATH + ffi_convention :stdcall + + class StructUCDP < FFI::Struct + layout :a1, :uchar, + :a2, :double, + :a3, :pointer + end + + attach_function :testStdcallManyParams, [ :pointer, :int8, :int16, :int32, :int64, + StructUCDP.by_value, StructUCDP.by_ref, :float, :double ], :void + end + + it "adds stdcall decoration: testStdcallManyParams@64" do + s = LibTestStdcall::StructUCDP.new + po = FFI::MemoryPointer.new :long + LibTestStdcall.testStdcallManyParams po, 1, 2, 3, 4, s, s, 1.0, 2.0 + end + end + + describe "ffi_lib" do + it "empty name list should raise error" do + expect { + Module.new do |m| + m.extend FFI::Library + ffi_lib + end + }.to raise_error(LoadError) + end + + end + + unless RbConfig::CONFIG['target_os'] =~ /mswin|mingw/ + it "attach_function with no library specified" do + expect { + Module.new do |m| + m.extend FFI::Library + attach_function :getpid, [ ], :uint + end + }.to raise_error + end + + it "attach_function :getpid from this process" do + expect { + expect(Module.new do |m| + m.extend FFI::Library + ffi_lib FFI::Library::CURRENT_PROCESS + attach_function :getpid, [ ], :uint + end.getpid).to eq(Process.pid) + }.not_to raise_error + end + + it "loads library using symbol" do + expect { + expect(Module.new do |m| + m.extend FFI::Library + ffi_lib :c + attach_function :getpid, [ ], :uint + end.getpid).to eq(Process.pid) + }.not_to raise_error + end + + it "attach_function :getpid from [ 'c', 'libc.so.6'] " do + expect { + expect(Module.new do |m| + m.extend FFI::Library + ffi_lib [ 'c', 'libc.so.6' ] + attach_function :getpid, [ ], :uint + end.getpid).to eq(Process.pid) + }.not_to raise_error + end + + it "attach_function :getpid from [ 'libc.so.6', 'c' ] " do + expect { + expect(Module.new do |m| + m.extend FFI::Library + ffi_lib [ 'libc.so.6', 'c' ] + attach_function :getpid, [ ], :uint + end.getpid).to eq(Process.pid) + }.not_to raise_error + end + + it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef', nil, 'c' ] " do + expect { + expect(Module.new do |m| + m.extend FFI::Library + ffi_lib [ 'libfubar.so.0xdeadbeef', nil, 'c' ] + attach_function :getpid, [ ], :uint + end.getpid).to eq(Process.pid) + }.not_to raise_error + end + + it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef' ] " do + expect { + expect(Module.new do |m| + m.extend FFI::Library + ffi_lib 'libfubar.so.0xdeadbeef' + attach_function :getpid, [ ], :uint + end.getpid).to eq(Process.pid) + }.to raise_error(LoadError) + end + + it "attach_function :bool_return_true from [ File.expand_path(#{TestLibrary::PATH.inspect}) ]" do + mod = Module.new do |m| + m.extend FFI::Library + ffi_lib File.expand_path(TestLibrary::PATH) + attach_function :bool_return_true, [ ], :bool + end + expect(mod.bool_return_true).to be true + end + end + + def gvar_lib(name, type) + Module.new do |m| + m.extend FFI::Library + ffi_lib TestLibrary::PATH + attach_variable :gvar, "gvar_#{name}", type + attach_function :get, "gvar_#{name}_get", [], type + attach_function :set, "gvar_#{name}_set", [ type ], :void + end + end + + def gvar_test(name, type, val) + lib = gvar_lib(name, type) + lib.set(val) + expect(lib.gvar).to eq(val) + lib.set(0) + lib.gvar = val + expect(lib.get).to eq(val) + end + + [ 0, 127, -128, -1 ].each do |i| + it ":char variable" do + gvar_test("s8", :char, i) + end + end + + [ 0, 0x7f, 0x80, 0xff ].each do |i| + it ":uchar variable" do + gvar_test("u8", :uchar, i) + end + end + + [ 0, 0x7fff, -0x8000, -1 ].each do |i| + it ":short variable" do + gvar_test("s16", :short, i) + end + end + + [ 0, 0x7fff, 0x8000, 0xffff ].each do |i| + it ":ushort variable" do + gvar_test("u16", :ushort, i) + end + end + + [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i| + it ":int variable" do + gvar_test("s32", :int, i) + end + end + + [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i| + it ":uint variable" do + gvar_test("u32", :uint, i) + end + end + + [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i| + it ":long_long variable" do + gvar_test("s64", :long_long, i) + end + end + + [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i| + it ":ulong_long variable" do + gvar_test("u64", :ulong_long, i) + end + end + + if FFI::Platform::LONG_SIZE == 32 + [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i| + it ":long variable" do + gvar_test("long", :long, i) + end + end + + [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i| + it ":ulong variable" do + gvar_test("ulong", :ulong, i) + end + end + else + [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i| + it ":long variable" do + gvar_test("long", :long, i) + end + end + + [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i| + it ":ulong variable" do + gvar_test("ulong", :ulong, i) + end + end + end + + it "Pointer variable" do + lib = gvar_lib("pointer", :pointer) + val = FFI::MemoryPointer.new :long + lib.set(val) + expect(lib.gvar).to eq(val) + lib.set(nil) + lib.gvar = val + expect(lib.get).to eq(val) + end + + [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i| + it "structure" do + class GlobalStruct < FFI::Struct + layout :data, :long + end + + lib = Module.new do |m| + m.extend FFI::Library + ffi_lib TestLibrary::PATH + attach_variable :gvar, "gvar_gstruct", GlobalStruct + attach_function :get, "gvar_gstruct_get", [], GlobalStruct + attach_function :set, "gvar_gstruct_set", [ GlobalStruct ], :void + end + + val = GlobalStruct.new + val[:data] = i + lib.set(val) + expect(lib.gvar[:data]).to eq(i) + val[:data] = 0 + lib.gvar[:data] = i + val = GlobalStruct.new(lib.get) + expect(val[:data]).to eq(i) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/long_double.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/long_double.rb new file mode 100644 index 0000000..b16613b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/long_double.rb @@ -0,0 +1,30 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) +require 'bigdecimal' + +describe ":long_double arguments and return values" do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :add_f128, [ :long_double, :long_double ], :long_double + attach_function :ret_f128, [ :long_double ], :long_double + end + + it "returns first parameter" do + expect(LibTest.ret_f128(0.1)).to be_within(0.01).of(0.1) + end + + it "returns first parameter with high precision" do + ld = BigDecimal.new("1.234567890123456789") + tolerance = BigDecimal.new("0.0000000000000000001") + expect(LibTest.ret_f128(ld)).to be_within(tolerance).of(ld) + end + + it "add two long double numbers" do + expect(LibTest.add_f128(0.1, 0.2)).to be_within(0.01).of(0.3) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/managed_struct_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/managed_struct_spec.rb new file mode 100644 index 0000000..f11c67a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/managed_struct_spec.rb @@ -0,0 +1,68 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "Managed Struct" do + include FFI + module ManagedStructTestLib + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer + end + + it "should raise an error if release() is not defined" do + class NoRelease < FFI::ManagedStruct ; layout :i, :int; end + expect { NoRelease.new(ManagedStructTestLib.ptr_from_address(0x12345678)) }.to raise_error(NoMethodError) + end + + it "should be the right class" do + class WhatClassAmI < FFI::ManagedStruct + layout :i, :int + def self.release + end + end + + expect(WhatClassAmI.new(ManagedStructTestLib.ptr_from_address(0x12345678)).class).to eq(WhatClassAmI) + end + + it "should build with self reference" do + class ClassWithSelfRef < FFI::ManagedStruct + layout :data, self.ptr + def self.release + end + end + + expect(ClassWithSelfRef.new(ManagedStructTestLib.ptr_from_address(0x12345678)).class).to eq(ClassWithSelfRef) + end + + # see #427 + it "should release memory properly", :broken => true do + class PleaseReleaseMe < FFI::ManagedStruct + layout :i, :int + @@count = 0 + def self.release + @@count += 1 + end + def self.wait_gc(count) + loop = 5 + while loop > 0 && @@count < count + loop -= 1 + TestLibrary.force_gc + sleep 0.05 if @@count < count + end + end + end + + loop_count = 30 + wiggle_room = 5 + + expect(PleaseReleaseMe).to receive(:release).at_least(loop_count-wiggle_room).times + loop_count.times do + PleaseReleaseMe.new(ManagedStructTestLib.ptr_from_address(0x12345678)) + end + PleaseReleaseMe.wait_gc loop_count + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/memorypointer_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/memorypointer_spec.rb new file mode 100644 index 0000000..d819f35 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/memorypointer_spec.rb @@ -0,0 +1,78 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +MemoryPointer = FFI::MemoryPointer + +describe "MemoryPointer#total" do + it "MemoryPointer.new(:char, 1).total == 1" do + expect(MemoryPointer.new(:char, 1).total).to eq 1 + end + + it "MemoryPointer.new(:short, 1).total == 2" do + expect(MemoryPointer.new(:short, 1).total).to eq 2 + end + + it "MemoryPointer.new(:int, 1).total == 4" do + expect(MemoryPointer.new(:int, 1).total).to eq 4 + end + + it "MemoryPointer.new(:long_long, 1).total == 8" do + expect(MemoryPointer.new(:long_long, 1).total).to eq 8 + end + + it "MemoryPointer.new(1024).total == 1024" do + expect(MemoryPointer.new(1024).total).to eq 1024 + end +end +describe "MemoryPointer#read_array_of_long" do + it "foo" do + ptr = MemoryPointer.new(:long, 1024) + ptr[0].write_long 1234 + ptr[1].write_long 5678 + l = ptr.read_array_of_long(2) + expect(l[0]).to eq 1234 + expect(l[1]).to eq 5678 + end +end +describe "MemoryPointer argument" do + module Ptr + extend FFI::Library + ffi_lib FFI::Platform::LIBC + attach_function :memset, [ :pointer, :int, :ulong ], :pointer + attach_function :memcpy, [ :pointer, :pointer, :ulong ], :pointer + end + + it "Pointer passed correctly" do + p = MemoryPointer.new :int, 1 + ret = Ptr.memset(p, 0, p.total) + expect(ret).to eq p + end + + it "Data passed to native function" do + p = MemoryPointer.new :int, 1 + p2 = MemoryPointer.new :int, 1 + p2.put_int(0, 0x5eadbeef) + Ptr.memcpy(p, p2, p.total) + expect(p.get_int(0)).to eq p2.get_int(0) + expect(p2.get_int(0)).not_to eql 0 + end +end +describe "MemoryPointer return value" do + module Stdio + extend FFI::Library + ffi_lib FFI::Platform::LIBC + attach_function :fopen, [ :string, :string ], :pointer + attach_function :fclose, [ :pointer ], :int + attach_function :fwrite, [ :pointer, :ulong, :ulong, :string ], :ulong + end + + it "fopen returns non-nil" do + fp = Stdio.fopen("/dev/null", "w") + expect(fp).to_not be_nil + expect(Stdio.fclose(fp)).to eq 0 unless fp.nil? or fp.null? + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/number_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/number_spec.rb new file mode 100644 index 0000000..acb9562 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/number_spec.rb @@ -0,0 +1,247 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "Function with primitive integer arguments" do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :ret_s8, [ :char ], :char + attach_function :ret_u8, [ :uchar ], :uchar + attach_function :ret_s16, [ :short ], :short + attach_function :ret_u16, [ :ushort ], :ushort + attach_function :ret_s32, [ :int ], :int + attach_function :ret_u32, [ :uint ], :uint + attach_function :ret_s64, [ :long_long ], :long_long + attach_function :ret_u64, [ :ulong_long ], :ulong_long + attach_function :ret_long, [ :long ], :long + attach_function :ret_ulong, [ :ulong ], :ulong + attach_function :set_s8, [ :char ], :void + attach_function :get_s8, [ ], :char + attach_function :set_float, [ :float ], :void + attach_function :get_float, [ ], :float + attach_function :set_double, [ :double ], :void + attach_function :get_double, [ ], :double + end + + it "int8.size" do + expect(FFI::TYPE_INT8.size).to eq(1) + end + + it "uint8.size" do + expect(FFI::TYPE_UINT8.size).to eq(1) + end + + it "int16.size" do + expect(FFI::TYPE_INT16.size).to eq(2) + end + + it "uint16.size" do + expect(FFI::TYPE_UINT16.size).to eq(2) + end + + it "int32.size" do + expect(FFI::TYPE_INT32.size).to eq(4) + end + + it "uint32.size" do + expect(FFI::TYPE_UINT32.size).to eq(4) + end + + it "int64.size" do + expect(FFI::TYPE_INT64.size).to eq(8) + end + + it "uint64.size" do + expect(FFI::TYPE_UINT64.size).to eq(8) + end + + it "float.size" do + expect(FFI::TYPE_FLOAT32.size).to eq(4) + end + + it "double.size" do + expect(FFI::TYPE_FLOAT64.size).to eq(8) + end + [ 0, 127, -128, -1 ].each do |i| + it ":char call(:char (#{i}))" do + expect(LibTest.ret_s8(i)).to eq(i) + end + end + [ 0, 0x7f, 0x80, 0xff ].each do |i| + it ":uchar call(:uchar (#{i}))" do + expect(LibTest.ret_u8(i)).to eq(i) + end + end + [ 0, 0x7fff, -0x8000, -1 ].each do |i| + it ":short call(:short (#{i}))" do + expect(LibTest.ret_s16(i)).to eq(i) + end + end + [ 0, 0x7fff, 0x8000, 0xffff ].each do |i| + it ":ushort call(:ushort (#{i}))" do + expect(LibTest.ret_u16(i)).to eq(i) + end + end + [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i| + it ":int call(:int (#{i}))" do + expect(LibTest.ret_s32(i)).to eq(i) + end + end + [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i| + it ":uint call(:uint (#{i}))" do + expect(LibTest.ret_u32(i)).to eq(i) + end + end + [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i| + it ":long_long call(:long_long (#{i}))" do + expect(LibTest.ret_s64(i)).to eq(i) + end + end + [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i| + it ":ulong_long call(:ulong_long (#{i}))" do + expect(LibTest.ret_u64(i)).to eq(i) + end + end + if FFI::Platform::LONG_SIZE == 32 + [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i| + it ":long call(:long (#{i}))" do + expect(LibTest.ret_long(i)).to eq(i) + end + end + [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i| + it ":ulong call(:ulong (#{i}))" do + expect(LibTest.ret_ulong(i)).to eq(i) + end + end + else + [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i| + it ":long call(:long (#{i}))" do + expect(LibTest.ret_long(i)).to eq(i) + end + end + [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i| + it ":ulong call(:ulong (#{i}))" do + expect(LibTest.ret_ulong(i)).to eq(i) + end + end + [ 0.0, 0.1, 1.1, 1.23 ].each do |f| + it ":float call(:double (#{f}))" do + LibTest.set_float(f) + expect((LibTest.get_float - f).abs).to be < 0.001 + end + end + [ 0.0, 0.1, 1.1, 1.23 ].each do |f| + it ":double call(:double (#{f}))" do + LibTest.set_double(f) + expect((LibTest.get_double - f).abs).to be < 0.001 + end + end + end +end +describe "Integer parameter range checking" do + [ 128, -129 ].each do |i| + it ":char call(:char (#{i}))" do + expect { expect(LibTest.ret_int8_t(i)).to eq(i) }.to raise_error + end + end + [ -1, 256 ].each do |i| + it ":uchar call(:uchar (#{i}))" do + expect { expect(LibTest.ret_u_int8_t(i)).to eq(i) }.to raise_error + end + end + [ 0x8000, -0x8001 ].each do |i| + it ":short call(:short (#{i}))" do + expect { expect(LibTest.ret_int16_t(i)).to eq(i) }.to raise_error + end + end + [ -1, 0x10000 ].each do |i| + it ":ushort call(:ushort (#{i}))" do + expect { expect(LibTest.ret_u_int16_t(i)).to eq(i) }.to raise_error + end + end + [ 0x80000000, -0x80000001 ].each do |i| + it ":int call(:int (#{i}))" do + expect { expect(LibTest.ret_int32_t(i)).to eq(i) }.to raise_error + end + end + [ -1, 0x100000000 ].each do |i| + it ":ushort call(:ushort (#{i}))" do + expect { expect(LibTest.ret_u_int32_t(i)).to eq(i) }.to raise_error + end + end +end +describe "Three different size Integer arguments" do + TYPE_MAP = { + 's8' => :char, 'u8' => :uchar, 's16' => :short, 'u16' => :ushort, + 's32' => :int, 'u32' => :uint, 's64' => :long_long, 'u64' => :ulong_long, + 'sL' => :long, 'uL' => :ulong, 'f32' => :float, 'f64' => :double + } + TYPES = TYPE_MAP.keys + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + + + [ 's32', 'u32', 's64', 'u64' ].each do |rt| + TYPES.each do |t1| + TYPES.each do |t2| + TYPES.each do |t3| + begin + attach_function "pack_#{t1}#{t2}#{t3}_#{rt}", + [ TYPE_MAP[t1], TYPE_MAP[t2], TYPE_MAP[t3], :buffer_out ], :void + rescue FFI::NotFoundError + end + end + end + end + end + end + + PACK_VALUES = { + 's8' => [ 0x12 ], + 'u8' => [ 0x34 ], + 's16' => [ 0x5678 ], + 'u16' => [ 0x9abc ], + 's32' => [ 0x7654321f ], + 'u32' => [ 0xfee1babe ], + 'sL' => [ 0x1f2e3d4c ], + 'uL' => [ 0xf7e8d9ca ], + 's64' => [ 0x1eafdeadbeefa1b2 ], +# 'f32' => [ 1.234567 ], + 'f64' => [ 9.87654321 ] + } + + def verify(p, off, t, v) + if t == 'f32' + expect(p.get_float32(off)).to eq(v) + elsif t == 'f64' + expect(p.get_float64(off)).to eq(v) + else + expect(p.get_int64(off)).to eq(v) + end + end + + PACK_VALUES.keys.each do |t1| + PACK_VALUES.keys.each do |t2| + PACK_VALUES.keys.each do |t3| + PACK_VALUES[t1].each do |v1| + PACK_VALUES[t2].each do |v2| + PACK_VALUES[t3].each do |v3| + it "call(#{TYPE_MAP[t1]} (#{v1}), #{TYPE_MAP[t2]} (#{v2}), #{TYPE_MAP[t3]} (#{v3}))" do + p = FFI::Buffer.new :long_long, 3 + LibTest.send("pack_#{t1}#{t2}#{t3}_s64", v1, v2, v3, p) + verify(p, 0, t1, v1) + verify(p, 8, t2, v2) + verify(p, 16, t3, v3) + end + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/platform_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/platform_spec.rb new file mode 100644 index 0000000..7c56719 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/platform_spec.rb @@ -0,0 +1,114 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "FFI::Platform::LIBSUFFIX" do + case OS + when "linux" + it "returns 'so'" do + expect(FFI::Platform::LIBSUFFIX).to eq('so') + end + when "windows" + it "returns 'dll'" do + expect(FFI::Platform::LIBSUFFIX).to eq('dll') + end + when "darwin" + it "returns 'dylib'" do + expect(FFI::Platform::LIBSUFFIX).to eq('dylib') + end + end +end + +describe "FFI::Platform::IS_WINDOWS" do + case OS + when "linux" + it "returns false" do + expect(FFI::Platform::IS_WINDOWS).to be false + end + when "windows" + it "returns true" do + expect(FFI::Platform::IS_WINDOWS).to be true + end + when "darwin" + it "returns false" do + expect(FFI::Platform::IS_WINDOWS).to be false + end + end +end + +describe "FFI::Platform::ARCH" do + it "returns the architecture type" do + expect(FFI::Platform::ARCH).to eq(CPU) + end +end + +describe "FFI::Platform::OS" do + case OS + when "linux" + it "returns 'linux' as a string" do + expect(FFI::Platform::OS).to eq('linux') + end + when "windows" + it "returns 'windows' as a string" do + expect(FFI::Platform::OS).to eq('windows') + end + when "darwin" + it "returns 'darwin' as a string" do + expect(FFI::Platform::OS).to eq('darwin') + end + end +end + +describe "FFI::Platform.windows?" do + case OS + when "linux" + it "returns false" do + expect(FFI::Platform.windows?).to be false + end + when "windows" + it "returns true" do + expect(FFI::Platform.windows?).to be true + end + when "darwin" + it "returns false" do + expect(FFI::Platform.windows?).to be false + end + end +end + +describe "FFI::Platform.mac?" do + case OS + when "linux" + it "returns false" do + expect(FFI::Platform.mac?).to be false + end + when "windows" + it "returns false" do + expect(FFI::Platform.mac?).to be false + end + when "darwin" + it "returns true" do + expect(FFI::Platform.mac?).to be true + end + end +end + +describe "FFI::Platform.unix?" do + case OS + when "linux" + it "returns true" do + expect(FFI::Platform.unix?).to be true + end + when "windows" + it "returns false" do + expect(FFI::Platform.unix?).to be false + end + when "darwin" + it "returns true" do + expect(FFI::Platform.unix?).to be true + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/pointer_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/pointer_spec.rb new file mode 100644 index 0000000..bc981e6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/pointer_spec.rb @@ -0,0 +1,285 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) +require 'delegate' + +module PointerTestLib + extend FFI::Library + ffi_lib TestLibrary::PATH + begin + attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int + rescue FFI::NotFoundError + # NetBSD uses #define instead of typedef for these + attach_function :ptr_ret_int32_t, :ptr_ret___int32_t, [ :pointer, :int ], :int + end + attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer + attach_function :ptr_set_pointer, [ :pointer, :int, :pointer ], :void + attach_function :ptr_ret_pointer, [ :pointer, :int ], :pointer +end +describe "Pointer" do + include FFI + class ToPtrTest + def initialize(ptr) + @ptr = ptr + end + def to_ptr + @ptr + end + end + + it "Any object implementing #to_ptr can be passed as a :pointer parameter" do + memory = FFI::MemoryPointer.new :long_long + magic = 0x12345678 + memory.put_int32(0, magic) + tp = ToPtrTest.new(memory) + expect(PointerTestLib.ptr_ret_int32_t(tp, 0)).to eq(magic) + end + class PointerDelegate < DelegateClass(FFI::Pointer) + def initialize(ptr) + @ptr = ptr + end + def to_ptr + @ptr + end + end + + it "A DelegateClass(Pointer) can be passed as a :pointer parameter" do + memory = FFI::MemoryPointer.new :long_long + magic = 0x12345678 + memory.put_int32(0, magic) + ptr = PointerDelegate.new(memory) + expect(PointerTestLib.ptr_ret_int32_t(ptr, 0)).to eq(magic) + end + + it "Fixnum cannot be used as a Pointer argument" do + expect { PointerTestLib.ptr_ret_int32(0, 0) }.to raise_error + end + + it "Bignum cannot be used as a Pointer argument" do + expect { PointerTestLib.ptr_ret_int32(0xfee1deadbeefcafebabe, 0) }.to raise_error + end + + it "#to_ptr" do + memory = FFI::MemoryPointer.new :pointer + expect(memory.to_ptr).to eq(memory) + + expect(FFI::Pointer::NULL.to_ptr).to eq(FFI::Pointer::NULL) + end + + describe "pointer type methods" do + + it "#read_pointer" do + memory = FFI::MemoryPointer.new :pointer + PointerTestLib.ptr_set_pointer(memory, 0, PointerTestLib.ptr_from_address(0xdeadbeef)) + expect(memory.read_pointer.address).to eq(0xdeadbeef) + end + + it "#write_pointer" do + memory = FFI::MemoryPointer.new :pointer + memory.write_pointer(PointerTestLib.ptr_from_address(0xdeadbeef)) + expect(PointerTestLib.ptr_ret_pointer(memory, 0).address).to eq(0xdeadbeef) + end + + it "#read_array_of_pointer" do + values = [0x12345678, 0xfeedf00d, 0xdeadbeef] + memory = FFI::MemoryPointer.new :pointer, values.size + values.each_with_index do |address, j| + PointerTestLib.ptr_set_pointer(memory, j * FFI.type_size(:pointer), PointerTestLib.ptr_from_address(address)) + end + array = memory.read_array_of_pointer(values.size) + values.each_with_index do |address, j| + expect(array[j].address).to eq(address) + end + end + + end + + describe 'NULL' do + it 'should be obtained using Pointer::NULL constant' do + null_ptr = FFI::Pointer::NULL + expect(null_ptr).to be_null + end + it 'should be obtained passing address 0 to constructor' do + expect(FFI::Pointer.new(0)).to be_null + end + it 'should raise an error when attempting read/write operations on it' do + null_ptr = FFI::Pointer::NULL + expect { null_ptr.read_int }.to raise_error(FFI::NullPointerError) + expect { null_ptr.write_int(0xff1) }.to raise_error(FFI::NullPointerError) + end + it 'returns true when compared with nil' do + expect((FFI::Pointer::NULL == nil)).to be true + end + end + + it "Pointer.size returns sizeof pointer on platform" do + expect(FFI::Pointer.size).to eq((FFI::Platform::ADDRESS_SIZE / 8)) + end + + describe "#slice" do + before(:each) do + @mptr = FFI::MemoryPointer.new(:char, 12) + @mptr.put_uint(0, 0x12345678) + @mptr.put_uint(4, 0xdeadbeef) + end + + it "contents of sliced pointer matches original pointer at offset" do + expect(@mptr.slice(4, 4).get_uint(0)).to eq(0xdeadbeef) + end + + it "modifying sliced pointer is reflected in original pointer" do + @mptr.slice(4, 4).put_uint(0, 0xfee1dead) + expect(@mptr.get_uint(4)).to eq(0xfee1dead) + end + + it "access beyond bounds should raise IndexError" do + expect { @mptr.slice(4, 4).get_int(4) }.to raise_error(IndexError) + end + end + + describe "#type_size" do + it "should be same as FFI.type_size(type)" do + expect(FFI::MemoryPointer.new(:int, 1).type_size).to eq(FFI.type_size(:int)) + end + end +end + +describe "AutoPointer" do + loop_count = 30 + wiggle_room = 5 # GC rarely cleans up all objects. we can get most of them, and that's enough to determine if the basic functionality is working. + magic = 0x12345678 + + class AutoPointerTestHelper + @@count = 0 + def self.release + @@count += 1 if @@count > 0 + end + def self.reset + @@count = 0 + end + def self.gc_everything(count) + loop = 5 + while @@count < count && loop > 0 + loop -= 1 + TestLibrary.force_gc + sleep 0.05 unless @@count == count + end + @@count = 0 + end + def self.finalizer + self.method(:release).to_proc + end + end + class AutoPointerSubclass < FFI::AutoPointer + def self.release(ptr); end + end + + # see #427 + it "cleanup via default release method", :broken => true do + expect(AutoPointerSubclass).to receive(:release).at_least(loop_count-wiggle_room).times + AutoPointerTestHelper.reset + loop_count.times do + # note that if we called + # AutoPointerTestHelper.method(:release).to_proc inline, we'd + # have a reference to the pointer and it would never get GC'd. + AutoPointerSubclass.new(PointerTestLib.ptr_from_address(magic)) + end + AutoPointerTestHelper.gc_everything loop_count + end + + # see #427 + it "cleanup when passed a proc", :broken => true do + # NOTE: passing a proc is touchy, because it's so easy to create a memory leak. + # + # specifically, if we made an inline call to + # + # AutoPointerTestHelper.method(:release).to_proc + # + # we'd have a reference to the pointer and it would + # never get GC'd. + expect(AutoPointerTestHelper).to receive(:release).at_least(loop_count-wiggle_room).times + AutoPointerTestHelper.reset + loop_count.times do + FFI::AutoPointer.new(PointerTestLib.ptr_from_address(magic), + AutoPointerTestHelper.finalizer) + end + AutoPointerTestHelper.gc_everything loop_count + end + + # see #427 + it "cleanup when passed a method", :broken => true do + expect(AutoPointerTestHelper).to receive(:release).at_least(loop_count-wiggle_room).times + AutoPointerTestHelper.reset + loop_count.times do + FFI::AutoPointer.new(PointerTestLib.ptr_from_address(magic), + AutoPointerTestHelper.method(:release)) + end + AutoPointerTestHelper.gc_everything loop_count + end + + it "can be used as the return type of a function" do + expect do + Module.new do + extend FFI::Library + ffi_lib TestLibrary::PATH + class CustomAutoPointer < FFI::AutoPointer + def self.release(ptr); end + end + attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], CustomAutoPointer + end + end.not_to raise_error + end + + describe "#new" do + it "MemoryPointer argument raises TypeError" do + expect { FFI::AutoPointer.new(FFI::MemoryPointer.new(:int))}.to raise_error(::TypeError) + end + it "AutoPointer argument raises TypeError" do + expect { AutoPointerSubclass.new(AutoPointerSubclass.new(PointerTestLib.ptr_from_address(0))) }.to raise_error(::TypeError) + end + it "Buffer argument raises TypeError" do + expect { FFI::AutoPointer.new(FFI::Buffer.new(:int))}.to raise_error(::TypeError) + end + + end + + describe "#autorelease?" do + ptr_class = Class.new(FFI::AutoPointer) do + def self.release(ptr); end + end + + it "should be true by default" do + expect(ptr_class.new(FFI::Pointer.new(0xdeadbeef)).autorelease?).to be true + end + + it "should return false when autorelease=(false)" do + ptr = ptr_class.new(FFI::Pointer.new(0xdeadbeef)) + ptr.autorelease = false + expect(ptr.autorelease?).to be false + end + end + + describe "#type_size" do + ptr_class = Class.new(FFI::AutoPointer) do + def self.release(ptr); end + end + + it "type_size of AutoPointer should match wrapped Pointer" do + aptr = ptr_class.new(FFI::Pointer.new(:int, 0xdeadbeef)) + expect(aptr.type_size).to eq(FFI.type_size(:int)) + end + + it "[] offset should match wrapped Pointer" do + mptr = FFI::MemoryPointer.new(:int, 1024) + aptr = ptr_class.new(FFI::Pointer.new(:int, mptr)) + aptr[0].write_uint(0xfee1dead) + aptr[1].write_uint(0xcafebabe) + expect(mptr[0].read_uint).to eq(0xfee1dead) + expect(mptr[1].read_uint).to eq(0xcafebabe) + end + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/attach_function_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/attach_function_spec.rb new file mode 100644 index 0000000..7593662 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/attach_function_spec.rb @@ -0,0 +1,34 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +unless FFI::Platform.windows? + class Timeval < FFI::Struct + layout :tv_sec, :ulong, 0, :tv_usec, :ulong, 4 + end + + module LibC + extend FFI::Library + ffi_lib FFI::Library::LIBC + + attach_function :gettimeofday, [:pointer, :pointer], :int + end + + describe FFI::Library, "#attach_function" do + it "correctly returns a value for gettimeofday" do + t = Timeval.new + time = LibC.gettimeofday(t.pointer, nil) + expect(time).to be_kind_of(Integer) + end + + it "correctly populates a struct for gettimeofday" do + t = Timeval.new + LibC.gettimeofday(t.pointer, nil) + expect(t[:tv_sec]).to be_kind_of(Numeric) + expect(t[:tv_usec]).to be_kind_of(Numeric) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/memory_pointer_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/memory_pointer_spec.rb new file mode 100644 index 0000000..a869d8c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/memory_pointer_spec.rb @@ -0,0 +1,194 @@ +# coding: utf-8 +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +module CTest + extend FFI::Library + ffi_lib FFI::Library::LIBC + + attach_function :strcat, [:pointer, :pointer], :pointer +end + +describe "MemoryPointer" do + it "makes a pointer from a string" do + m = FFI::MemoryPointer.from_string("FFI is Awesome") + expect(m.total).to eq(15) + expect(m.type_size).to eq(1) + end + + it "does not make a pointer from non-strings" do + expect { FFI::MemoryPointer.from_string(nil) }.to raise_error(TypeError) + end + + it "makes a pointer from a string with multibyte characters" do + m = FFI::MemoryPointer.from_string("ã±ã‚“ã ") + expect(m.total).to eq(10) + expect(m.type_size).to eq(1) + end + + it "reads back a string" do + m = FFI::MemoryPointer.from_string("FFI is Awesome") + expect(m.read_string).to eq("FFI is Awesome") + end + + it "makes a pointer for a certain number of bytes" do + m = FFI::MemoryPointer.new(8) + m.write_array_of_int([1,2]) + expect(m.read_array_of_int(2)).to eq([1,2]) + end + + it "allows access to an element of the pointer (as an array)" do + m = FFI::MemoryPointer.new(:int, 2) + m.write_array_of_int([1,2]) + expect(m[0].read_int).to eq(1) + expect(m[1].read_int).to eq(2) + end + + it "allows writing as an int" do + m = FFI::MemoryPointer.new(:int) + m.write_int(1) + expect(m.read_int).to eq(1) + expect(m.read :int).to eq(1) + expect(m.read FFI::Type::INT).to eq(1) + end + + it "allows writing as a sized int" do + m = FFI::MemoryPointer.new(:uint32) + m.write_uint32(1) + expect(m.read_uint32).to eq(1) + expect(m.read :uint32).to eq(1) + expect(m.read FFI::Type::UINT32).to eq(1) + + m = FFI::MemoryPointer.new(:uint32) + m.write :uint32, 1 + expect(m.read :uint32).to eq(1) + + m = FFI::MemoryPointer.new(:int64) + m.write_int64(1) + expect(m.read_int64).to eq(1) + expect(m.read :int64).to eq(1) + expect(m.read FFI::Type::INT64).to eq(1) + + m = FFI::MemoryPointer.new(:int64) + m.write :int64, 1 + expect(m.read :int64).to eq(1) + end + + it "allows writing as a long" do + m = FFI::MemoryPointer.new(:long) + m.write_long(10) + expect(m.read_long).to eq(10) + expect(m.read :long).to eq(10) + expect(m.read FFI::Type::LONG).to eq(10) + + m.write :long, 10 + expect(m.read :long).to eq(10) + end + + it "allows writing as a size_t" do + m = FFI::MemoryPointer.new(:size_t) + m.write(:size_t, 10) + expect(m.read :size_t).to eq(10) + end + + it "allows writing as a bool" do + m = FFI::MemoryPointer.new(:bool) + m.write(:bool, true) + expect(m.read :bool).to eq(true) + expect(m.read FFI::Type::BOOL).to eq(true) + + m.write(:bool, false) + expect(m.read :bool).to eq(false) + expect(m.read FFI::Type::BOOL).to eq(false) + end + + it "allows writing a custom typedef" do + FFI.typedef :uint, :fubar_t + FFI.typedef :size_t, :fubar2_t + + m = FFI::MemoryPointer.new(:fubar_t) + m.write(:fubar_t, 10) + expect(m.read :fubar_t).to eq(10) + + m = FFI::MemoryPointer.new(:fubar2_t) + m.write(:fubar2_t, 10) + expect(m.read :fubar2_t).to eq(10) + end + + it "raises an error if you try to read an undefined type" do + m = FFI::MemoryPointer.new(:long) + expect { m.read(:undefined_type) }.to raise_error(ArgumentError) + end + + it "raises an error if you try putting a long into a pointer of size 1" do + m = FFI::MemoryPointer.new(1) + expect { m.write_long(10) }.to raise_error + end + + it "raises an error if you try putting an int into a pointer of size 1" do + m = FFI::MemoryPointer.new(1) + expect { m.write_int(10) }.to raise_error + end +# it "does not raise IndexError for opaque pointers" do +# m = FFI::MemoryPointer.new(8) +# p2 = FFI::MemoryPointer.new(1024) +# m.write_long(p2.address) +# p = m.read_pointer +# lambda { p.write_int(10) }.should_not raise_error +# end + + it "makes a pointer for a certain type" do + m = FFI::MemoryPointer.new(:int) + m.write_int(10) + expect(m.read_int).to eq(10) + end + + it "makes a memory pointer for a number of a certain type" do + m = FFI::MemoryPointer.new(:int, 2) + m.write_array_of_int([1,2]) + expect(m.read_array_of_int(2)).to eq([1,2]) + end + + it "makes a pointer for an object responding to #size" do + m = FFI::MemoryPointer.new(Struct.new(:size).new(8)) + m.write_array_of_int([1,2]) + expect(m.read_array_of_int(2)).to eq([1,2]) + end + + it "makes a pointer for a number of an object responding to #size" do + m = FFI::MemoryPointer.new(Struct.new(:size).new(4), 2) + m.write_array_of_int([1,2]) + expect(m.read_array_of_int(2)).to eq([1,2]) + end + + it "MemoryPointer#address returns correct value" do + m = FFI::MemoryPointer.new(:long_long) + magic = 0x12345678 + m.write_long(magic) + expect(m.read_pointer.address).to eq(magic) + end + + it "MemoryPointer#null? returns true for zero value" do + m = FFI::MemoryPointer.new(:long_long) + m.write_long(0) + expect(m.read_pointer.null?).to be true + end + + it "MemoryPointer#null? returns false for non-zero value" do + m = FFI::MemoryPointer.new(:long_long) + m.write_long(0x12345678) + expect(m.read_pointer.null?).to be false + end + + it "initialize with block should execute block" do + block_executed = false + FFI::MemoryPointer.new(:pointer) do |ptr| + block_executed = true + end + expect(block_executed).to be true + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/spec_helper.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/spec_helper.rb new file mode 100644 index 0000000..6e009d8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/spec_helper.rb @@ -0,0 +1,6 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "../spec_helper")) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/struct_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/struct_spec.rb new file mode 100644 index 0000000..a7ed85b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/rbx/struct_spec.rb @@ -0,0 +1,18 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +class Timeval < FFI::Struct + layout :tv_sec, :ulong, 0, :tv_usec, :ulong, 4 +end + +describe FFI::Struct do + it "allows setting fields" do + t = Timeval.new + t[:tv_sec] = 12 + expect(t[:tv_sec]).to eq(12) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/spec_helper.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/spec_helper.rb new file mode 100644 index 0000000..0c173e4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/spec_helper.rb @@ -0,0 +1,93 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require 'rbconfig' +require 'fileutils' +require 'ffi' + +RSpec.configure do |c| + c.filter_run_excluding :broken => true +end + +CPU = case RbConfig::CONFIG['host_cpu'].downcase + when /i[3456]86/ + # Darwin always reports i686, even when running in 64bit mode + if RbConfig::CONFIG['host_os'] =~ /darwin/ && 0xfee1deadbeef.is_a?(Fixnum) + "x86_64" + else + "i386" + end + + when /amd64|x86_64/ + "x86_64" + + when /ppc64|powerpc64/ + "powerpc64" + + when /ppc|powerpc/ + "powerpc" + + when /^arm/ + "arm" + + else + RbConfig::CONFIG['host_cpu'] + end + +OS = case RbConfig::CONFIG['host_os'].downcase + when /linux/ + "linux" + when /darwin/ + "darwin" + when /freebsd/ + "freebsd" + when /openbsd/ + "openbsd" + when /sunos|solaris/ + "solaris" + when /mswin|mingw/ + "win32" + else + RbConfig::CONFIG['host_os'].downcase + end + +def compile_library(path, lib) + + dir = File.expand_path(path, File.dirname(__FILE__)) + lib = "#{dir}/#{lib}" + if !File.exist?(lib) + output = nil + FileUtils.cd(dir) do + output = system(*%{#{system('which gmake >/dev/null') && 'gmake' || 'make'} CPU=#{CPU} OS=#{OS} }.tap{|x| puts x.inspect}) + end + + if $?.exitstatus != 0 + puts "ERROR:\n#{output}" + raise "Unable to compile \"#{lib}\"" + end + end + + lib +end + +require "ffi" + +module TestLibrary + PATH = compile_library("fixtures", "libtest.#{FFI::Platform::LIBSUFFIX}") + + def self.force_gc + if RUBY_PLATFORM =~ /java/ + java.lang.System.gc + elsif defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx' + GC.run(true) + else + GC.start + end + end +end +module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/string_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/string_spec.rb new file mode 100644 index 0000000..fac11f0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/string_spec.rb @@ -0,0 +1,118 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) +describe "String tests" do + include FFI + module StrLibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :ptr_ret_pointer, [ :pointer, :int], :string + attach_function :string_equals, [ :string, :string ], :int + attach_function :string_dummy, [ :string ], :void + attach_function :string_null, [ ], :string + end + + it "MemoryPointer#get_string returns a tainted string" do + mp = FFI::MemoryPointer.new 1024 + mp.put_string(0, "test\0") + str = mp.get_string(0) + expect(str.tainted?).to be true + end + + it "String returned by a method is tainted" do + mp = FFI::MemoryPointer.new :pointer + sp = FFI::MemoryPointer.new 1024 + sp.put_string(0, "test") + mp.put_pointer(0, sp) + str = StrLibTest.ptr_ret_pointer(mp, 0) + expect(str).to eq("test") + expect(str).to be_tainted + end + + it "Poison null byte raises error" do + s = "123\0abc" + expect { StrLibTest.string_equals(s, s) }.to raise_error + end + + it "Tainted String parameter should throw a SecurityError" do + $SAFE = 1 + str = "test" + str.taint + begin + expect(LibTest.string_equals(str, str)).to be false + rescue SecurityError + end + end if false + it "casts nil as NULL pointer" do + expect(StrLibTest.string_dummy(nil)).to be_nil + end + + it "return nil for NULL char*" do + expect(StrLibTest.string_null).to be_nil + end + + it "reads an array of strings until encountering a NULL pointer" do + strings = ["foo", "bar", "baz", "testing", "ffi"] + ptrary = FFI::MemoryPointer.new(:pointer, 6) + ary = strings.inject([]) do |a, str| + f = FFI::MemoryPointer.new(1024) + f.put_string(0, str) + a << f + end + ary.insert(3, nil) + ptrary.write_array_of_pointer(ary) + expect(ptrary.get_array_of_string(0)).to eq(["foo", "bar", "baz"]) + end + + it "reads an array of strings of the size specified, substituting nil when a pointer is NULL" do + strings = ["foo", "bar", "baz", "testing", "ffi"] + ptrary = FFI::MemoryPointer.new(:pointer, 6) + ary = strings.inject([]) do |a, str| + f = FFI::MemoryPointer.new(1024) + f.put_string(0, str) + a << f + end + ary.insert(2, nil) + ptrary.write_array_of_pointer(ary) + expect(ptrary.get_array_of_string(0, 4)).to eq(["foo", "bar", nil, "baz"]) + end + + it "reads an array of strings, taking a memory offset parameter" do + strings = ["foo", "bar", "baz", "testing", "ffi"] + ptrary = FFI::MemoryPointer.new(:pointer, 5) + ary = strings.inject([]) do |a, str| + f = FFI::MemoryPointer.new(1024) + f.put_string(0, str) + a << f + end + ptrary.write_array_of_pointer(ary) + expect(ptrary.get_array_of_string(2 * FFI.type_size(:pointer), 3)).to eq(["baz", "testing", "ffi"]) + end + + it "raises an IndexError when trying to read an array of strings out of bounds" do + strings = ["foo", "bar", "baz", "testing", "ffi"] + ptrary = FFI::MemoryPointer.new(:pointer, 5) + ary = strings.inject([]) do |a, str| + f = FFI::MemoryPointer.new(1024) + f.put_string(0, str) + a << f + end + ptrary.write_array_of_pointer(ary) + expect { ptrary.get_array_of_string(0, 6) }.to raise_error + end + + it "raises an IndexError when trying to read an array of strings using a negative offset" do + strings = ["foo", "bar", "baz", "testing", "ffi"] + ptrary = FFI::MemoryPointer.new(:pointer, 5) + ary = strings.inject([]) do |a, str| + f = FFI::MemoryPointer.new(1024) + f.put_string(0, str) + a << f + end + ptrary.write_array_of_pointer(ary) + expect { ptrary.get_array_of_string(-1) }.to raise_error + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/strptr_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/strptr_spec.rb new file mode 100644 index 0000000..a6400f4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/strptr_spec.rb @@ -0,0 +1,50 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "functions returning :strptr" do + + it "can attach function with :strptr return type" do + expect do + Module.new do + extend FFI::Library + ffi_lib FFI::Library::LIBC + if !FFI::Platform.windows? + attach_function :strdup, [ :string ], :strptr + else + attach_function :_strdup, [ :string ], :strptr + end + end + end.not_to raise_error + end + + module StrPtr + extend FFI::Library + ffi_lib FFI::Library::LIBC + attach_function :free, [ :pointer ], :void + if !FFI::Platform.windows? + attach_function :strdup, [ :string ], :strptr + else + attach_function :strdup, :_strdup, [ :string ], :strptr + end + end + + it "should return [ String, Pointer ]" do + result = StrPtr.strdup("test") + expect(result[0].is_a?(String)).to be true + expect(result[1].is_a?(FFI::Pointer)).to be true + end + + it "should return the correct value" do + result = StrPtr.strdup("test") + expect(result[0]).to eq("test") + end + + it "should return non-NULL pointer" do + result = StrPtr.strdup("test") + expect(result[1]).not_to be_null + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_by_ref_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_by_ref_spec.rb new file mode 100644 index 0000000..0858423 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_by_ref_spec.rb @@ -0,0 +1,43 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe FFI::Struct, ' by_ref' do + before :all do + @struct_class = struct_class = Class.new(FFI::Struct) do + layout :a, :pointer + end + + @api = Module.new do + extend FFI::Library + ffi_lib TestLibrary::PATH + fn = FFI::Type::POINTER.size == FFI::Type::LONG.size ? :ret_ulong : :ret_u64 + attach_function :struct_test, fn, [ struct_class.by_ref ], :pointer + end + end + + it "should accept instances of exact struct class" do + s = @struct_class.new + expect(@api.struct_test(s)).to eq(s.pointer) + end + + it "should accept nil" do + expect(@api.struct_test(nil)).to be_null + end + + it "should reject other types" do + expect { expect(@api.struct_test('test')).to be_nil }.to raise_error(TypeError) + end + + it "should reject instances of other struct classes" do + other_class = Class.new(FFI::Struct) do + layout :a, :pointer + end + + expect { @api.struct_test(other_class.new) }.to raise_error(TypeError) + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_callback_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_callback_spec.rb new file mode 100644 index 0000000..7cab301 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_callback_spec.rb @@ -0,0 +1,69 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe FFI::Struct, ' with inline callback functions' do + it 'should be able to define inline callback field' do + expect(module CallbackMember1 + extend FFI::Library + ffi_lib TestLibrary::PATH + DUMMY_CB = callback :dummy_cb, [ :int ], :int + class TestStruct < FFI::Struct + layout \ + :add, callback([ :int, :int ], :int), + :sub, callback([ :int, :int ], :int), + :cb_with_cb_parameter, callback([ DUMMY_CB, :int ], :int) + end + attach_function :struct_call_add_cb, [TestStruct, :int, :int], :int + attach_function :struct_call_sub_cb, [TestStruct, :int, :int], :int + end).to be_an_instance_of FFI::Function + end + + it 'should take methods as callbacks' do + module CallbackMember2 + extend FFI::Library + ffi_lib TestLibrary::PATH + class TestStruct < FFI::Struct + layout \ + :add, callback([ :int, :int ], :int), + :sub, callback([ :int, :int ], :int) + end + attach_function :struct_call_add_cb, [TestStruct, :int, :int], :int + attach_function :struct_call_sub_cb, [TestStruct, :int, :int], :int + end + module StructCallbacks + def self.add a, b + a+b + end + end + + ts = CallbackMember2::TestStruct.new + ts[:add] = StructCallbacks.method(:add) + + expect(CallbackMember2.struct_call_add_cb(ts, 1, 2)).to eq(3) + end + + it 'should return callable object from []' do + module CallbackMember3 + extend FFI::Library + ffi_lib TestLibrary::PATH + class TestStruct < FFI::Struct + layout \ + :add, callback([ :int, :int ], :int), + :sub, callback([ :int, :int ], :int) + end + attach_function :struct_call_add_cb, [TestStruct, :int, :int], :int + attach_function :struct_call_sub_cb, [TestStruct, :int, :int], :int + end + + s = CallbackMember3::TestStruct.new + add = Proc.new { |a,b| a+b} + s[:add] = add + fn = s[:add] + expect(fn.respond_to?(:call)).to be true + expect(fn.call(1, 2)).to eq(3) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_initialize_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_initialize_spec.rb new file mode 100644 index 0000000..beb2477 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_initialize_spec.rb @@ -0,0 +1,35 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe FFI::Struct, ' with an initialize function' do + it "should call the initialize function" do + class StructWithInitialize < FFI::Struct + layout :string, :string + attr_accessor :magic + def initialize + super + self.magic = 42 + end + end + expect(StructWithInitialize.new.magic).to eq(42) + end +end + +describe FFI::ManagedStruct, ' with an initialize function' do + it "should call the initialize function" do + class ManagedStructWithInitialize < FFI::ManagedStruct + layout :string, :string + attr_accessor :magic + def initialize + super FFI::MemoryPointer.new(:pointer).put_int(0, 0x1234).get_pointer(0) + self.magic = 42 + end + def self.release;end + end + expect(ManagedStructWithInitialize.new.magic).to eq(42) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_packed_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_packed_spec.rb new file mode 100644 index 0000000..8132be7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_packed_spec.rb @@ -0,0 +1,50 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe FFI::Struct do + it "packed :char followed by :int should have size of 5" do + expect(Class.new(FFI::Struct) do + packed + layout :c, :char, :i, :int + end.size).to eq(5) + end + + it "packed :char followed by :int should have alignment of 1" do + expect(Class.new(FFI::Struct) do + packed + layout :c, :char, :i, :int + end.alignment).to eq(1) + end + + it "packed(2) :char followed by :int should have size of 6" do + expect(Class.new(FFI::Struct) do + packed 2 + layout :c, :char, :i, :int + end.size).to eq(6) + end + + it "packed(2) :char followed by :int should have alignment of 2" do + expect(Class.new(FFI::Struct) do + packed 2 + layout :c, :char, :i, :int + end.alignment).to eq(2) + end + + it "packed :short followed by int should have size of 6" do + expect(Class.new(FFI::Struct) do + packed + layout :s, :short, :i, :int + end.size).to eq(6) + end + + it "packed :short followed by int should have alignment of 1" do + expect(Class.new(FFI::Struct) do + packed + layout :s, :short, :i, :int + end.alignment).to eq(1) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_spec.rb new file mode 100644 index 0000000..9110d92 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/struct_spec.rb @@ -0,0 +1,886 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "Struct aligns fields correctly" do + it "char, followed by an int" do + pending("not supported in 1.8") if RUBY_VERSION =~ /^1\.8\..*/ + class CIStruct < FFI::Struct + layout :c => :char, :i => :int + end + expect(CIStruct.size).to eq(8) + end + + it "short, followed by an int" do + pending("not supported in 1.8") if RUBY_VERSION =~ /^1\.8\..*/ + class SIStruct < FFI::Struct + layout :s => :short, :i => :int + end + expect(SIStruct.size).to eq(8) + end + + it "int, followed by an int" do + pending("not supported in 1.8") if RUBY_VERSION =~ /^1\.8\..*/ + class IIStruct < FFI::Struct + layout :i1 => :int, :i => :int + end + expect(IIStruct.size).to eq(8) + end + + it "long long, followed by an int" do + pending("not supported in 1.8") if RUBY_VERSION =~ /^1\.8\..*/ + class LLIStruct < FFI::Struct + layout :l => :long_long, :i => :int + end + expect(LLIStruct.size).to eq(FFI::TYPE_UINT64.alignment == 4 ? 12 : 16) + end +end + +describe "Struct tests" do + StructTypes = { + 's8' => :char, + 's16' => :short, + 's32' => :int, + 's64' => :long_long, + 'long' => :long, + 'f32' => :float, + 'f64' => :double + } + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + attach_function :ptr_ret_pointer, [ :pointer, :int], :string + begin + attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int + rescue FFI::NotFoundError + # NetBSD uses #define instead of typedef for these + attach_function :ptr_ret_int32_t, :ptr_ret___int32_t, [ :pointer, :int ], :int + end + attach_function :ptr_from_address, [ :ulong ], :pointer + attach_function :string_equals, [ :string, :string ], :int + [ 's8', 's16', 's32', 's64', 'f32', 'f64', 'long' ].each do |t| + attach_function "struct_align_#{t}", [ :pointer ], StructTypes[t] + end + end + class PointerMember < FFI::Struct + layout :pointer, :pointer + end + class StringMember < FFI::Struct + layout :string, :string + end + + it "Struct#[:pointer]" do + magic = 0x12345678 + mp = FFI::MemoryPointer.new :long + mp.put_long(0, magic) + smp = FFI::MemoryPointer.new :pointer + smp.put_pointer(0, mp) + s = PointerMember.new smp + expect(s[:pointer]).to eq(mp) + end + + it "Struct#[:pointer].nil? for NULL value" do + magic = 0x12345678 + mp = FFI::MemoryPointer.new :long + mp.put_long(0, magic) + smp = FFI::MemoryPointer.new :pointer + smp.put_pointer(0, nil) + s = PointerMember.new smp + expect(s[:pointer].null?).to be true + end + + it "Struct#[:pointer]=" do + magic = 0x12345678 + mp = FFI::MemoryPointer.new :long + mp.put_long(0, magic) + smp = FFI::MemoryPointer.new :pointer + s = PointerMember.new smp + s[:pointer] = mp + expect(smp.get_pointer(0)).to eq(mp) + end + + it "Struct#[:pointer]=struct" do + smp = FFI::MemoryPointer.new :pointer + s = PointerMember.new smp + expect { s[:pointer] = s }.not_to raise_error Exception + expect { s[:pointer].nil? }.not_to raise_error Exception + end + + it "Struct#[:pointer]=nil" do + smp = FFI::MemoryPointer.new :pointer + s = PointerMember.new smp + s[:pointer] = nil + expect(smp.get_pointer(0)).to be_null + end + + it "Struct#[:string]" do + magic = "test" + mp = FFI::MemoryPointer.new 1024 + mp.put_string(0, magic) + smp = FFI::MemoryPointer.new :pointer + smp.put_pointer(0, mp) + s = StringMember.new smp + expect(s[:string]).to eq(magic) + end + + it "Struct#[:string].nil? for NULL value" do + smp = FFI::MemoryPointer.new :pointer + smp.put_pointer(0, nil) + s = StringMember.new smp + expect(s[:string]).to be_nil + end + + it "Struct#layout works with :name, :type pairs" do + class PairLayout < FFI::Struct + layout :a, :int, :b, :long_long + end + ll_off = (FFI::TYPE_UINT64.alignment == 4 ? 4 : 8) + expect(PairLayout.size).to eq((ll_off + 8)) + mp = FFI::MemoryPointer.new(PairLayout.size) + s = PairLayout.new mp + s[:a] = 0x12345678 + expect(mp.get_int(0)).to eq(0x12345678) + s[:b] = 0xfee1deadbeef + expect(mp.get_int64(ll_off)).to eq(0xfee1deadbeef) + end + + it "Struct#layout works with :name, :type, offset tuples" do + class PairLayout < FFI::Struct + layout :a, :int, 0, :b, :long_long, 4 + end + expect(PairLayout.size).to eq((FFI::TYPE_UINT64.alignment == 4 ? 12 : 16)) + mp = FFI::MemoryPointer.new(PairLayout.size) + s = PairLayout.new mp + s[:a] = 0x12345678 + expect(mp.get_int(0)).to eq(0x12345678) + s[:b] = 0xfee1deadbeef + expect(mp.get_int64(4)).to eq(0xfee1deadbeef) + end + + it "Struct#layout works with mixed :name,:type and :name,:type,offset" do + class MixedLayout < FFI::Struct + layout :a, :int, :b, :long_long, 4 + end + expect(MixedLayout.size).to eq((FFI::TYPE_UINT64.alignment == 4 ? 12 : 16)) + mp = FFI::MemoryPointer.new(MixedLayout.size) + s = MixedLayout.new mp + s[:a] = 0x12345678 + expect(mp.get_int(0)).to eq(0x12345678) + s[:b] = 0xfee1deadbeef + expect(mp.get_int64(4)).to eq(0xfee1deadbeef) + end + + rb_maj, rb_min = RUBY_VERSION.split('.') + if rb_maj.to_i >= 1 && rb_min.to_i >= 9 || RUBY_PLATFORM =~ /java/ + it "Struct#layout withs with a hash of :name => type" do + class HashLayout < FFI::Struct + layout :a => :int, :b => :long_long + end + ll_off = (FFI::TYPE_UINT64.alignment == 4 ? 4 : 8) + expect(HashLayout.size).to eq(ll_off + 8) + mp = FFI::MemoryPointer.new(HashLayout.size) + s = HashLayout.new mp + s[:a] = 0x12345678 + expect(mp.get_int(0)).to eq(0x12345678) + s[:b] = 0xfee1deadbeef + expect(mp.get_int64(ll_off)).to eq(0xfee1deadbeef) + end + end + + it "subclass overrides initialize without calling super" do + class InitializeWithoutSuper < FFI::Struct + layout :a, :int, :b, :long_long, :d, [:double, 2] + + def initialize(a, b) + self[:a] = a + self[:b] = b + self[:d][0] = 1.2 + self[:d][1] = 3.4 + end + + end + s = InitializeWithoutSuper.new(0x1eefbeef, 0xdeadcafebabe) + expect(s[:a]).to eq(0x1eefbeef) + expect(s[:b]).to eq(0xdeadcafebabe) + end + + it "Can use Struct subclass as parameter type" do + expect(module StructParam + extend FFI::Library + ffi_lib TestLibrary::PATH + class TestStruct < FFI::Struct + layout :c, :char + end + attach_function :struct_field_s8, [ TestStruct.in ], :char + end).to be_an_instance_of FFI::Function + end + + it "Can use Struct subclass as IN parameter type" do + expect(module StructParam2 + extend FFI::Library + ffi_lib TestLibrary::PATH + class TestStruct < FFI::Struct + layout :c, :char + end + attach_function :struct_field_s8, [ TestStruct.in ], :char + end).to be_an_instance_of FFI::Function + end + + it "Can use Struct subclass as OUT parameter type" do + expect(module StructParam3 + extend FFI::Library + ffi_lib TestLibrary::PATH + class TestStruct < FFI::Struct + layout :c, :char + end + attach_function :struct_field_s8, [ TestStruct.out ], :char + end).to be_an_instance_of FFI::Function + end + + it "can be passed directly as a :pointer parameter" do + class TestStruct < FFI::Struct + layout :i, :int + end + s = TestStruct.new + s[:i] = 0x12 + expect(LibTest.ptr_ret_int32_t(s, 0)).to eq(0x12) + end + + it ":char member aligned correctly" do + class AlignChar < FFI::Struct + layout :c, :char, :v, :char + end + s = AlignChar.new + s[:v] = 0x12 + expect(LibTest.struct_align_s8(s.pointer)).to eq(0x12) + end + + it ":short member aligned correctly" do + class AlignShort < FFI::Struct + layout :c, :char, :v, :short + end + s = AlignShort.alloc_in + s[:v] = 0x1234 + expect(LibTest.struct_align_s16(s.pointer)).to eq(0x1234) + end + + it ":int member aligned correctly" do + class AlignInt < FFI::Struct + layout :c, :char, :v, :int + end + s = AlignInt.alloc_in + s[:v] = 0x12345678 + expect(LibTest.struct_align_s32(s.pointer)).to eq(0x12345678) + end + + it ":long_long member aligned correctly" do + class AlignLongLong < FFI::Struct + layout :c, :char, :v, :long_long + end + s = AlignLongLong.alloc_in + s[:v] = 0x123456789abcdef0 + expect(LibTest.struct_align_s64(s.pointer)).to eq(0x123456789abcdef0) + end + + it ":long member aligned correctly" do + class AlignLong < FFI::Struct + layout :c, :char, :v, :long + end + s = AlignLong.alloc_in + s[:v] = 0x12345678 + expect(LibTest.struct_align_long(s.pointer)).to eq(0x12345678) + end + + it ":float member aligned correctly" do + class AlignFloat < FFI::Struct + layout :c, :char, :v, :float + end + s = AlignFloat.alloc_in + s[:v] = 1.23456 + expect((LibTest.struct_align_f32(s.pointer) - 1.23456).abs).to be < 0.00001 + end + + it ":double member aligned correctly" do + class AlignDouble < FFI::Struct + layout :c, :char, :v, :double + end + s = AlignDouble.alloc_in + s[:v] = 1.23456789 + expect((LibTest.struct_align_f64(s.pointer) - 1.23456789).abs).to be < 0.00000001 + end + + it ":ulong, :pointer struct" do + class ULPStruct < FFI::Struct + layout :ul, :ulong, :p, :pointer + end + s = ULPStruct.alloc_in + s[:ul] = 0xdeadbeef + s[:p] = LibTest.ptr_from_address(0x12345678) + expect(s.pointer.get_ulong(0)).to eq(0xdeadbeef) + end + def test_num_field(type, v) + klass = Class.new(FFI::Struct) + klass.layout :v, type, :dummy, :long + + s = klass.new + s[:v] = v + expect(s.pointer.send("get_#{type.to_s}", 0)).to eq(v) + s.pointer.send("put_#{type.to_s}", 0, 0) + expect(s[:v]).to eq(0) + end + def self.int_field_test(type, values) + values.each do |v| + it "#{type} field r/w (#{v.to_s(16)})" do + test_num_field(type, v) + end + end + end + int_field_test(:char, [ 0, 127, -128, -1 ]) + int_field_test(:uchar, [ 0, 0x7f, 0x80, 0xff ]) + int_field_test(:short, [ 0, 0x7fff, -0x8000, -1 ]) + int_field_test(:ushort, [ 0, 0x7fff, 0x8000, 0xffff ]) + int_field_test(:int, [ 0, 0x7fffffff, -0x80000000, -1 ]) + int_field_test(:uint, [ 0, 0x7fffffff, 0x80000000, 0xffffffff ]) + int_field_test(:long_long, [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ]) + int_field_test(:ulong_long, [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ]) + if FFI::Platform::LONG_SIZE == 32 + int_field_test(:long, [ 0, 0x7fffffff, -0x80000000, -1 ]) + int_field_test(:ulong, [ 0, 0x7fffffff, 0x80000000, 0xffffffff ]) + else + int_field_test(:long, [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ]) + int_field_test(:ulong, [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ]) + end + + it ":float field r/w" do + klass = Class.new(FFI::Struct) + klass.layout :v, :float, :dummy, :long + + s = klass.new + value = 1.23456 + s[:v] = value + expect((s.pointer.get_float(0) - value).abs).to be < 0.0001 + end + + it ":double field r/w" do + klass = Class.new(FFI::Struct) + klass.layout :v, :double, :dummy, :long + + s = klass.new + value = 1.23456 + s[:v] = value + expect((s.pointer.get_double(0) - value).abs).to be < 0.0001 + end + module EnumFields + extend FFI::Library + TestEnum = enum :test_enum, [:c1, 10, :c2, 20, :c3, 30, :c4, 40] + class TestStruct < FFI::Struct + layout :a, :int, :c, :test_enum, + :d, [ TestEnum, TestEnum.symbols.length ] + end + end + + it ":enum field r/w" do + s = EnumFields::TestStruct.new + s[:c] = :c3 + + expect(s.pointer.get_uint(FFI::Type::INT32.size)).to eq(30) + expect(s[:c]).to eq(:c3) + end + + it "array of :enum field" do + s = EnumFields::TestStruct.new + EnumFields::TestEnum.symbols.each_with_index do |val, i| + s[:d][i] = val + end + + EnumFields::TestEnum.symbols.each_with_index do |val, i| + expect(s.pointer.get_uint(FFI::Type::INT32.size * (2 + i))).to eq(EnumFields::TestEnum[val]) + end + + s[:d].each_with_index do |val, i| + expect(val).to eq(EnumFields::TestEnum.symbols[i]) + end + end + + module CallbackMember + extend FFI::Library + ffi_lib TestLibrary::PATH + callback :add, [ :int, :int ], :int + callback :sub, [ :int, :int ], :int + class TestStruct < FFI::Struct + layout :add, :add, + :sub, :sub + end + attach_function :struct_call_add_cb, [TestStruct.in, :int, :int], :int + attach_function :struct_call_sub_cb, [TestStruct.in, :int, :int], :int + end + + it "Can have CallbackInfo struct field" do + s = CallbackMember::TestStruct.new + add_proc = lambda { |a, b| a+b } + sub_proc = lambda { |a, b| a-b } + s[:add] = add_proc + s[:sub] = sub_proc + expect(CallbackMember.struct_call_add_cb(s, 40, 2)).to eq(42) + expect(CallbackMember.struct_call_sub_cb(s, 44, 2)).to eq(42) + end + + it "Can return its members as a list" do + class TestStruct < FFI::Struct + layout :a, :int, :b, :int, :c, :int + end + expect(TestStruct.members).to include(:a, :b, :c) + end + + it "Can return its instance members and values as lists" do + class TestStruct < FFI::Struct + layout :a, :int, :b, :int, :c, :int + end + s = TestStruct.new + expect(s.members).to include(:a, :b, :c) + s[:a] = 1 + s[:b] = 2 + s[:c] = 3 + expect(s.values).to include(1, 2, 3) + end + + it 'should return an ordered field/offset pairs array' do + class TestStruct < FFI::Struct + layout :a, :int, :b, :int, :c, :int + end + s = TestStruct.new + expect(s.offsets).to eq([[:a, 0], [:b, 4], [:c, 8]]) + expect(TestStruct.offsets).to eq([[:a, 0], [:b, 4], [:c, 8]]) + end + + it "Struct#offset_of returns offset of field within struct" do + class TestStruct < FFI::Struct + layout :a, :int, :b, :int, :c, :int + end + expect(TestStruct.offset_of(:a)).to eq(0) + expect(TestStruct.offset_of(:b)).to eq(4) + expect(TestStruct.offset_of(:c)).to eq(8) + end +end + +describe FFI::Struct, ".layout" do + module FFISpecs + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + begin + attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int + rescue FFI::NotFoundError + # NetBSD uses #define instead of typedef for these + attach_function :ptr_ret_int32_t, :ptr_ret___int32_t, [ :pointer, :int ], :int + end + end + end + + describe "when derived class is not assigned to any constant" do + it "resolves a built-in type" do + klass = Class.new FFI::Struct + klass.layout :number, :int + + instance = klass.new + instance[:number] = 0xA1 + expect(FFISpecs::LibTest.ptr_ret_int32_t(instance, 0)).to eq(0xA1) + end + end + + describe "when derived class is assigned to a constant" do + it "resolves a built-in type" do + class FFISpecs::TestStruct < FFI::Struct + layout :number, :int + end + + instance = FFISpecs::TestStruct.new + instance[:number] = 0xA1 + expect(FFISpecs::LibTest.ptr_ret_int32_t(instance, 0)).to eq(0xA1) + end + + it "resolves a type from the enclosing module" do + module FFISpecs::LibTest + typedef :uint, :custom_int + + class TestStruct < FFI::Struct + layout :number, :custom_int + end + end + + instance = FFISpecs::LibTest::TestStruct.new + instance[:number] = 0xA1 + expect(FFISpecs::LibTest.ptr_ret_int32_t(instance, 0)).to eq(0xA1) + end + end +end + +describe FFI::Struct, ' with a nested struct field' do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + class NestedStruct < FFI::Struct + layout :i, :int + end + class ContainerStruct < FFI::Struct + layout :first, :char, :ns, NestedStruct + end + attach_function :struct_align_nested_struct, [ :pointer ], :int + attach_function :struct_make_container_struct, [ :int ], :pointer + end + before do + @cs = LibTest::ContainerStruct.new + end + + it 'should align correctly nested struct field' do + @cs[:ns][:i] = 123 + expect(LibTest.struct_align_nested_struct(@cs.to_ptr)).to eq(123) + end + + it 'should correctly calculate Container size (in bytes)' do + expect(LibTest::ContainerStruct.size).to eq(8) + end + + it 'should return a Struct object when the field is accessed' do + expect(@cs[:ns].is_a?(FFI::Struct)).to be true + end + + it 'should read a value from memory' do + @cs = LibTest::ContainerStruct.new(LibTest.struct_make_container_struct(123)) + expect(@cs[:ns][:i]).to eq(123) + end + + it 'should write a value to memory' do + @cs = LibTest::ContainerStruct.new(LibTest.struct_make_container_struct(123)) + @cs[:ns][:i] = 456 + expect(LibTest.struct_align_nested_struct(@cs.to_ptr)).to eq(456) + end + + it 'should be able to assign struct instance to nested field' do + cs = LibTest::ContainerStruct.new(LibTest.struct_make_container_struct(123)) + ns = LibTest::NestedStruct.new + ns[:i] = 567 + cs[:ns] = ns + expect(cs[:ns][:i]).to eq(567) + expect(LibTest.struct_align_nested_struct(cs.to_ptr)).to eq(567) + end +end + +describe FFI::Struct, ' with a nested array of structs' do + module InlineArrayOfStructs + extend FFI::Library + ffi_lib TestLibrary::PATH + class NestedStruct < FFI::Struct + layout :i, :int + end + class ContainerStruct < FFI::Struct + layout :first, :char, :ns, [ NestedStruct, 1 ] + end + attach_function :struct_align_nested_struct, [ :pointer ], :int + attach_function :struct_make_container_struct, [ :int ], :pointer + end + + before do + @cs = InlineArrayOfStructs::ContainerStruct.new + end + + it 'should align correctly nested struct field' do + @cs[:ns][0][:i] = 123 + expect(InlineArrayOfStructs.struct_align_nested_struct(@cs.to_ptr)).to eq(123) + end + + it 'should correctly calculate Container size (in bytes)' do + expect(InlineArrayOfStructs::ContainerStruct.size).to eq(8) + end + + it 'should return a Struct object when the field is accessed' do + expect(@cs[:ns][0].is_a?(FFI::Struct)).to be true + end + + it 'should read a value from memory' do + @cs = InlineArrayOfStructs::ContainerStruct.new(InlineArrayOfStructs.struct_make_container_struct(123)) + expect(@cs[:ns][0][:i]).to eq(123) + end + + it 'should write a value to memory' do + @cs = InlineArrayOfStructs::ContainerStruct.new(InlineArrayOfStructs.struct_make_container_struct(123)) + @cs[:ns][0][:i] = 456 + expect(InlineArrayOfStructs.struct_align_nested_struct(@cs.to_ptr)).to eq(456) + end + + it 'should support Enumerable#each' do + @cs = InlineArrayOfStructs::ContainerStruct.new(InlineArrayOfStructs.struct_make_container_struct(123)) + ints = [] + @cs[:ns].each { |s| ints << s[:i] } + expect(ints[0]).to eq(123) + end +end + +describe FFI::Struct, ' by value' do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + + class S8S32 < FFI::Struct + layout :s8, :char, :s32, :int + end + + class StructString < FFI::Struct + layout :bytes, :string, :len, :int + end + + attach_function :struct_return_s8s32, [ ], S8S32.by_value + attach_function :struct_s8s32_set, [ :char, :int ], S8S32.by_value + attach_function :struct_s8s32_get_s8, [ S8S32.by_value ], :char + attach_function :struct_s8s32_get_s32, [ S8S32.by_value ], :int + attach_function :struct_s8s32_s32_ret_s32, [ S8S32.by_value, :int ], :int + attach_function :struct_s8s32_s64_ret_s64, [ S8S32.by_value, :long_long ], :long_long + attach_function :struct_s8s32_ret_s8s32, [ S8S32.by_value ], S8S32.by_value + attach_function :struct_s32_ptr_s32_s8s32_ret_s32, [ :int, :pointer, :int, S8S32.by_value ], :int + attach_function :struct_varargs_ret_struct_string, [ :int, :varargs ], StructString.by_value + end + + it 'return using pre-set values' do + s = LibTest.struct_return_s8s32 + expect(s[:s8]).to eq(0x7f) + expect(s[:s32]).to eq(0x12345678) + end + + it 'return using passed in values' do + s = LibTest.struct_s8s32_set(123, 456789) + expect(s[:s8]).to eq(123) + expect(s[:s32]).to eq(456789) + end + + it 'parameter' do + s = LibTest::S8S32.new + s[:s8] = 0x12 + s[:s32] = 0x34567890 + expect(LibTest.struct_s8s32_get_s8(s)).to eq(0x12) + expect(LibTest.struct_s8s32_get_s32(s)).to eq(0x34567890) + end + + it 'parameter with following s32' do + s = LibTest::S8S32.new + s[:s8] = 0x12 + s[:s32] = 0x34567890 + + expect(LibTest.struct_s8s32_s32_ret_s32(s, 0x1eefdead)).to eq(0x1eefdead) + end + + # it 'parameter with following s64' do + # s = LibTest::S8S64.new + # s[:s8] = 0x12 + # s[:s64] = 0x34567890 + # + # + # LibTest.struct_s8s64_s64_ret_s64(s, 0x1eefdead1eefdead).should == 0x1eefdead1eefdead + # end + + it 'parameter with preceding s32,ptr,s32' do + s = LibTest::S8S32.new + s[:s8] = 0x12 + s[:s32] = 0x34567890 + out = LibTest::S8S32.new + expect(LibTest.struct_s32_ptr_s32_s8s32_ret_s32(0x1000000, out, 0x1eafbeef, s)).to eq(0x34567890) + expect(out[:s8]).to eq(s[:s8]) + expect(out[:s32]).to eq(s[:s32]) + end + + it 'parameter with preceding s32,string,s32' do + s = LibTest::S8S32.new + s[:s8] = 0x12 + s[:s32] = 0x34567890 + out = 0.chr * 32 + expect(LibTest.struct_s32_ptr_s32_s8s32_ret_s32(0x1000000, out, 0x1eafbeef, s)).to eq(0x34567890) + end + + it 'parameter, returning struct by value' do + s = LibTest::S8S32.new + s[:s8] = 0x12 + s[:s32] = 0x34567890 + + ret = LibTest.struct_s8s32_ret_s8s32(s) + expect(ret[:s8]).to eq(s[:s8]) + expect(ret[:s32]).to eq(s[:s32]) + end + + it 'varargs returning a struct' do + string = "test" + s = LibTest.struct_varargs_ret_struct_string(4, :string, string) + expect(s[:len]).to eq(string.length) + expect(s[:bytes]).to eq(string) + end +end + +describe FFI::Struct, ' with an array field' do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + class StructWithArray < FFI::Struct + layout :first, :char, :a, [:int, 5] + end + attach_function :struct_make_struct_with_array, [:int, :int, :int, :int, :int], :pointer + attach_function :struct_field_array, [:pointer], :pointer + end + before do + @s = LibTest::StructWithArray.new + end + + it 'should correctly calculate StructWithArray size (in bytes)' do + expect(LibTest::StructWithArray.size).to eq(24) + end + + it 'should read values from memory' do + @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4)) + expect(@s[:a].to_a).to eq([0, 1, 2, 3, 4]) + end +# it 'should cache array object for successive calls' do +# @s[:a].object_id.should == @s[:a].object_id +# end + + it 'should return the number of elements in the array field' do + @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4)) + expect(@s[:a].size).to eq(5) + end + + it 'should allow iteration through the array elements' do + @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4)) + @s[:a].each_with_index { |elem, i| expect(elem).to eq(i) } + end + + it 'should return the pointer to the array' do + @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4)) + expect(@s[:a].to_ptr).to eq(LibTest::struct_field_array(@s.to_ptr)) + end +end + +describe 'BuggedStruct' do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + class BuggedStruct < FFI::Struct + layout :visible, :uchar, + :x, :uint, + :y, :uint, + :rx, :short, + :ry, :short, + :order, :uchar, + :size, :uchar + end + attach_function :bugged_struct_size, [], :uint + end + + it 'should return its correct size' do + expect(LibTest::BuggedStruct.size).to eq(LibTest.bugged_struct_size) + end + + it "offsets within struct should be correct" do + expect(LibTest::BuggedStruct.offset_of(:visible)).to eq(0) + expect(LibTest::BuggedStruct.offset_of(:x)).to eq(4) + expect(LibTest::BuggedStruct.offset_of(:y)).to eq(8) + expect(LibTest::BuggedStruct.offset_of(:rx)).to eq(12) + expect(LibTest::BuggedStruct.offset_of(:ry)).to eq(14) + expect(LibTest::BuggedStruct.offset_of(:order)).to eq(16) + expect(LibTest::BuggedStruct.offset_of(:size)).to eq(17) + end + + it 'should return correct field/offset pairs' do + expect(LibTest::BuggedStruct.offsets.sort do |a, b| + a[1] <=> b[1] + end).to eq([[:visible, 0], [:x, 4], [:y, 8], [:rx, 12], [:ry, 14], [:order, 16], [:size, 17]]) + end +end + +describe "Struct allocation" do + it "MemoryPointer.new(Struct, 2)" do + class S < FFI::Struct + layout :i, :uint + end + p = FFI::MemoryPointer.new(S, 2) + expect(p.total).to eq(8) + expect(p.type_size).to eq(4) + p.put_uint(4, 0xdeadbeef) + expect(S.new(p[1])[:i]).to eq(0xdeadbeef) + expect(p[1].address).to eq((p[0].address + 4)) + end + + it "Buffer.new(Struct, 2)" do + class S < FFI::Struct + layout :i, :uint + end + p = FFI::Buffer.new(S, 2) + expect(p.total).to eq(8) + expect(p.type_size).to eq(4) + p.put_uint(4, 0xdeadbeef) + expect(S.new(p[1])[:i]).to eq(0xdeadbeef) + end + + it "null? should be true when initialized with NULL pointer" do + class S < FFI::Struct + layout :i, :uint + end + expect(S.new(FFI::Pointer::NULL)).to be_null + end + + it "null? should be false when initialized with non-NULL pointer" do + class S < FFI::Struct + layout :i, :uint + end + expect(S.new(FFI::MemoryPointer.new(S))).not_to be_null + end + + it "supports :bool as a struct member" do + expect do + c = Class.new(FFI::Struct) do + layout :b, :bool + end + struct = c.new + struct[:b] = ! struct[:b] + end.not_to raise_error Exception + end + +end + +describe "variable-length arrays" do + it "zero length array should be accepted as last field" do + expect { + Class.new(FFI::Struct) do + layout :count, :int, :data, [ :char, 0 ] + end + }.not_to raise_error Exception + end + + it "zero length array before last element should raise error" do + expect { + Class.new(FFI::Struct) do + layout :data, [ :char, 0 ], :count, :int + end + }.to raise_error + end + + it "can access elements of array" do + struct_class = Class.new(FFI::Struct) do + layout :count, :int, :data, [ :long, 0 ] + end + s = struct_class.new(FFI::MemoryPointer.new(1024)) + s[:data][0] = 0x1eadbeef + s[:data][1] = 0x12345678 + expect(s[:data][0]).to eq(0x1eadbeef) + expect(s[:data][1]).to eq(0x12345678) + end + + it "non-variable length array is bounds checked" do + struct_class = Class.new(FFI::Struct) do + layout :count, :int, :data, [ :long, 1 ] + end + s = struct_class.new(FFI::MemoryPointer.new(1024)) + s[:data][0] = 0x1eadbeef + expect { s[:data][1] = 0x12345678 }.to raise_error + expect(s[:data][0]).to eq(0x1eadbeef) + expect { expect(s[:data][1]).to == 0x12345678 }.to raise_error + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/typedef_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/typedef_spec.rb new file mode 100644 index 0000000..d73247f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/typedef_spec.rb @@ -0,0 +1,91 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) +describe "Custom type definitions" do + it "attach_function with custom typedef" do + module CustomTypedef + extend FFI::Library + ffi_lib TestLibrary::PATH + typedef :uint, :fubar_t + attach_function :ret_u32, [ :fubar_t ], :fubar_t + end + expect(CustomTypedef.ret_u32(0x12345678)).to eq(0x12345678) + end + + it "variadic invoker with custom typedef" do + module VariadicCustomTypedef + extend FFI::Library + ffi_lib TestLibrary::PATH + typedef :uint, :fubar_t + attach_function :pack_varargs, [ :buffer_out, :string, :varargs ], :void + end + buf = FFI::Buffer.new :uint, 10 + VariadicCustomTypedef.pack_varargs(buf, "i", :fubar_t, 0x12345678) + expect(buf.get_int64(0)).to eq(0x12345678) + end + + it "Callback with custom typedef parameter" do + module CallbackCustomTypedef + extend FFI::Library + ffi_lib TestLibrary::PATH + typedef :uint, :fubar3_t + callback :cbIrV, [ :fubar3_t ], :void + attach_function :testCallbackU32rV, :testClosureIrV, [ :cbIrV, :fubar3_t ], :void + end + i = 0 + CallbackCustomTypedef.testCallbackU32rV(0xdeadbeef) { |v| i = v } + expect(i).to eq(0xdeadbeef) + end + module StructCustomTypedef + extend FFI::Library + ffi_lib TestLibrary::PATH + typedef :uint, :fubar3_t + class S < FFI::Struct + layout :a, :fubar3_t + end + end + + it "Struct with custom typedef field" do + s = StructCustomTypedef::S.new + s[:a] = 0x12345678 + expect(s.pointer.get_uint(0)).to eq(0x12345678) + end + + it "attach_function after a typedef should not reject normal types" do + expect do + Module.new do + extend FFI::Library + # enum() will insert a custom typedef called :foo for the enum + enum :foo, [ :a, :b ] + typedef :int, :bar + + ffi_lib TestLibrary::PATH + begin + attach_function :ptr_ret_int32_t, [ :string, :foo ], :bar + rescue FFI::NotFoundError + # NetBSD uses #define instead of typedef for these + attach_function :ptr_ret_int32_t, :ptr_ret___int32_t, [ :string, :foo ], :bar + end + end + end.not_to raise_error + end + + it "detects the correct type for size_t" do + expect do + Module.new do + extend FFI::Library + ffi_lib "c" + if FFI::Platform.windows? + # _read() is a function of msvcrt.dll + attach_function :_read, [:int, :pointer, :uint], :int + else + # read(2) is a standard UNIX function + attach_function :read, [:int, :pointer, :size_t], :ssize_t + end + end + end.not_to raise_error + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/union_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/union_spec.rb new file mode 100644 index 0000000..45bf7ec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/union_spec.rb @@ -0,0 +1,67 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +module LibTest + Types = { + 's8' => [:char, :c, 1], + 's16' => [:short, :s, 0xff0], + 's32' => [:int, :i, 0xff00], + 's64' => [:long_long, :j, 0xffff00], + 'long' => [:long, :l, 0xffff], + 'f32' => [:float, :f, 1.0001], + 'f64' => [:double, :d, 1.000000001] + } + class TestUnion < FFI::Union + layout( :a, [:char, 10], + :i, :int, + :f, :float, + :d, :double, + :s, :short, + :l, :long, + :j, :long_long, + :c, :char ) + end + Types.keys.each do |k| + attach_function "union_align_#{k}", [ :pointer ], Types[k][0] + attach_function "union_make_union_with_#{k}", [ Types[k][0] ], :pointer + end + attach_function :union_size, [], :uint +end + +describe 'Union' do + before do + @u = LibTest::TestUnion.new + end + + it 'should place all the fields at offset 0' do + expect(LibTest::TestUnion.members.all? { |m| LibTest::TestUnion.offset_of(m) == 0 }).to be true + end + LibTest::Types.each do |k, type| + it "should correctly align/write a #{type[0]} value" do + @u[type[1]] = type[2] + if k == 'f32' or k == 'f64' + expect((@u[type[1]] - LibTest.send("union_align_#{k}", @u.to_ptr)).abs).to be < 0.00001 + else + expect(@u[type[1]]).to eq(LibTest.send("union_align_#{k}", @u.to_ptr)) + end + end + end + LibTest::Types.each do |k, type| + it "should read a #{type[0]} value from memory" do + @u = LibTest::TestUnion.new(LibTest.send("union_make_union_with_#{k}", type[2])) + if k == 'f32' or k == 'f64' + expect((@u[type[1]] - type[2]).abs).to be < 0.00001 + else + expect(@u[type[1]]).to eq(type[2]) + end + end + end + + it 'should return a size equals to the size of the biggest field' do + expect(LibTest::TestUnion.size).to eq(LibTest.union_size) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/variadic_spec.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/variadic_spec.rb new file mode 100644 index 0000000..0c7292e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/ffi/variadic_spec.rb @@ -0,0 +1,132 @@ +# +# This file is part of ruby-ffi. +# For licensing, see LICENSE.SPECS +# + +require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper")) + +describe "Function with variadic arguments" do + module LibTest + extend FFI::Library + ffi_lib TestLibrary::PATH + enum :enum_type1, [:c1, :c2] + enum :enum_type2, [:c3, 42, :c4] + attach_function :pack_varargs, [ :buffer_out, :string, :varargs ], :void + attach_function :pack_varargs2, [ :buffer_out, :enum_type1, :string, :varargs ], :enum_type1 + + attach_function :testBlockingOpen, [ ], :pointer + attach_function :testBlockingRWva, [ :pointer, :char, :varargs ], :char, :blocking => true + attach_function :testBlockingWRva, [ :pointer, :char, :varargs ], :char, :blocking => true + attach_function :testBlockingClose, [ :pointer ], :void + end + + it "takes enum arguments" do + buf = FFI::Buffer.new :long_long, 2 + LibTest.pack_varargs(buf, "ii", :int, :c3, :int, :c4) + expect(buf.get_int64(0)).to eq(42) + expect(buf.get_int64(8)).to eq(43) + end + + it "returns symbols for enums" do + buf = FFI::Buffer.new :long_long, 2 + expect(LibTest.pack_varargs2(buf, :c1, "ii", :int, :c3, :int, :c4)).to eq(:c2) + end + + it 'can wrap a blocking function with varargs' do + pending("not supported in 1.8") if RUBY_VERSION =~ /^1\.8\..*/ + handle = LibTest.testBlockingOpen + expect(handle).not_to be_null + begin + thWR = Thread.new { LibTest.testBlockingWRva(handle, 63, :int, 40, :int, 23, :int, 0) } + thRW = Thread.new { LibTest.testBlockingRWva(handle, 64, :int, 40, :int, 24, :int, 0) } + expect(thWR.value).to eq(64) + expect(thRW.value).to eq(63) + ensure + LibTest.testBlockingClose(handle) + end + end + + [ 0, 127, -128, -1 ].each do |i| + it "call variadic with (:char (#{i})) argument" do + buf = FFI::Buffer.new :long_long + LibTest.pack_varargs(buf, "c", :char, i) + expect(buf.get_int64(0)).to eq(i) + end + end + + [ 0, 0x7f, 0x80, 0xff ].each do |i| + it "call variadic with (:uchar (#{i})) argument" do + buf = FFI::Buffer.new :long_long + LibTest.pack_varargs(buf, "C", :uchar, i) + expect(buf.get_int64(0)).to eq(i) + end + end + + [ 0, 1.234567, 9.87654321 ].each do |v| + it "call variadic with (:float (#{v})) argument" do + buf = FFI::Buffer.new :long_long + LibTest.pack_varargs(buf, "f", :float, v.to_f) + expect(buf.get_float64(0)).to eq(v) + end + end + + [ 0, 1.234567, 9.87654321 ].each do |v| + it "call variadic with (:double (#{v})) argument" do + buf = FFI::Buffer.new :long_long + LibTest.pack_varargs(buf, "f", :double, v.to_f) + expect(buf.get_float64(0)).to eq(v) + end + end + + module Varargs + PACK_VALUES = { + 'c' => [ 0x12 ], + 'C' => [ 0x34 ], + 's' => [ 0x5678 ], + 'S' => [ 0x9abc ], + 'i' => [ 0x7654321f ], + 'I' => [ 0xfee1babe ], + 'l' => [ 0x1f2e3d4c ], + 'L' => [ 0xf7e8d9ca ], + 'j' => [ 0x1eafdeadbeefa1b2 ], + 'f' => [ 1.23456789 ], + 'd' => [ 9.87654321 ] + } + + TYPE_MAP = { + 'c' => :char, 'C' => :uchar, 's' => :short, 'S' => :ushort, + 'i' => :int, 'I' => :uint, 'j' => :long_long, 'J' => :ulong_long, + 'l' => :long, 'L' => :ulong, 'f' => :float, 'd' => :double + } + end + + def verify(p, off, v) + if v.kind_of?(Float) + expect(p.get_float64(off)).to eq(v) + else + expect(p.get_int64(off)).to eq(v) + end + end + + Varargs::PACK_VALUES.keys.each do |t1| + Varargs::PACK_VALUES.keys.each do |t2| + Varargs::PACK_VALUES.keys.each do |t3| + Varargs::PACK_VALUES[t1].each do |v1| + Varargs::PACK_VALUES[t2].each do |v2| + Varargs::PACK_VALUES[t3].each do |v3| + fmt = "#{t1}#{t2}#{t3}" + params = [ Varargs::TYPE_MAP[t1], v1, Varargs::TYPE_MAP[t2], v2, Varargs::TYPE_MAP[t3], v3 ] + it "call(#{fmt}, #{params.join(',')})" do + buf = FFI::Buffer.new :long_long, 3 + LibTest.pack_varargs(buf, fmt, *params) + verify(buf, 0, v1) + verify(buf, 8, v2) + verify(buf, 16, v3) + end + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/spec.opts b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/spec.opts new file mode 100644 index 0000000..60a0245 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/spec/spec.opts @@ -0,0 +1,4 @@ +--color +-w +--format +documentation diff --git a/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Gemfile b/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Gemfile new file mode 100644 index 0000000..ea587c7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Gemfile @@ -0,0 +1,24 @@ +# ---------------------------------------------------------------------------- +# Frozen-string-literal: true +# Copyright: 2015-2016 Jordon Bedwell - MIT License +# Encoding: utf-8 +# ---------------------------------------------------------------------------- + +source "https://rubygems.org" +gem "rake", :require => false +gemspec + +group :test do + gem "rspec-helpers", :require => false + gem "codeclimate-test-reporter", :require => false + gem "luna-rspec-formatters", :require => false + gem "rspec", :require => false +end + +group :development do + gem "luna-rubocop-formatters", :require => false + gem "rubocop", :github => "bbatsov/rubocop", :require => false + gem "pry", { + :require => false + } +end diff --git a/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/LICENSE b/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/LICENSE new file mode 100644 index 0000000..e603a78 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2016 Jordon Bedwell + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Rakefile b/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Rakefile new file mode 100644 index 0000000..1c929e5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Rakefile @@ -0,0 +1,13 @@ +# ---------------------------------------------------------------------------- +# Frozen-string-literal: true +# Copyright: 2015-2016 Jordon Bedwell - MIT License +# Encoding: utf-8 +# ---------------------------------------------------------------------------- + +$LOAD_PATH.unshift(File.expand_path("../lib", __FILE__)) +require "luna/rubocop/rake/task" +require "rspec/core/rake_task" + +task :default => [:spec] +RSpec::Core::RakeTask.new :spec +task :test => :spec diff --git a/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb b/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb new file mode 100644 index 0000000..fc694cf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb @@ -0,0 +1,202 @@ +# ---------------------------------------------------------------------------- +# Frozen-string-literal: true +# Copyright: 2015-2016 Jordon Bedwell - MIT License +# Encoding: utf-8 +# ---------------------------------------------------------------------------- + +require "forwardable/extended/version" +require "forwardable" + +module Forwardable + module Extended + + # ------------------------------------------------------------------------ + # Make our methods private on the class, there is no reason for public. + # ------------------------------------------------------------------------ + + def self.extended(klass) + instance_methods.each do |method| + klass.private_class_method( + method + ) + end + end + + # ------------------------------------------------------------------------ + # Delegate using a Rails-like interface. + # ------------------------------------------------------------------------ + + def rb_delegate(method, to: nil, alias_of: method, **kwd) + raise ArgumentError, "to must be provided" unless to + def_delegator( + to, alias_of, method, **kwd + ) + end + + # ------------------------------------------------------------------------ + # Delegate a method to a hash and key. + # ------------------------------------------------------------------------ + + def def_hash_delegator(hash, method, key: method, **kwd) + prefix, suffix, wrap = prepare_delegate(**kwd) + + if suffix + method = method.to_s.gsub( + /\?$/, "" + ) + end + + class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 9 + def #{method}#{suffix}(*args) + #{wrap}( + #{prefix}#{hash}[#{key.inspect}] + ) + + rescue Exception + if !Forwardable.debug && $@ && $@.respond_to?(:delete_if) + $@.delete_if do |source| + source =~ %r"#{Regexp.escape(__FILE__)}"o + end + end + + raise + end + STR + end + + # ------------------------------------------------------------------------ + # Delegate a method to an instance variable. + # ------------------------------------------------------------------------ + + def def_ivar_delegator(ivar, alias_ = ivar, **kwd) + prefix, suffix, wrap = prepare_delegate(**kwd) + + if suffix + alias_ = alias_.to_s.gsub( + /\?$/, "" + ) + end + + class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 9 + def #{alias_.to_s.gsub(/\A@/, "")}#{suffix} + #{wrap}( + #{prefix}#{ivar} + ) + + rescue Exception + if !Forwardable.debug && $@ && $@.respond_to?(:delete_if) + $@.delete_if do |source| + source =~ %r"#{Regexp.escape(__FILE__)}"o + end + end + + raise + end + STR + end + + # ------------------------------------------------------------------------ + # Like def_delegator but allows you to send args and do other stuff. + # ------------------------------------------------------------------------ + + def def_modern_delegator(accessor, method, alias_ = method, args: \ + { :before => [], :after => [] }, **kwd) + + prefix, suffix, wrap = prepare_delegate(**kwd) + args = { :before => args } unless args.is_a?(Hash) + b = [args[:before]].flatten.compact.map(&:to_s).join(", ") + a = [args[ :after]].flatten.compact.map(&:to_s).join(", ") + b = b + ", " unless args[:before].nil? || args[:before].empty? + a = ", " + a unless args[ :after].nil? || args[ :after].empty? + alias_ = alias_.to_s.gsub(/\?$/, "") if suffix + + class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 10 + def #{alias_}#{suffix}(*args, &block) + #{wrap}(#{prefix}#{accessor}.send( + #{method.inspect}, #{b}*args#{a}, &block + )) + + rescue Exception + if !Forwardable.debug && $@ && $@.respond_to?(:delete_if) + $@.delete_if do |source| + source =~ %r"#{Regexp.escape(__FILE__)}"o + end + end + + raise + end + STR + end + + # ------------------------------------------------------------------------ + # Wraps around traditional delegation and modern delegation. + # ------------------------------------------------------------------------ + + def def_delegator(accessor, method, alias_ = method, **kwd) + kwd, alias_ = alias_, method if alias_.is_a?(Hash) && !kwd.any? + + if alias_.is_a?(Hash) || !kwd.any? + Forwardable.instance_method(:def_delegator).bind(self) \ + .call(accessor, method, alias_) + + elsif !kwd[:type] + def_modern_delegator( + accessor, method, alias_, **kwd + ) + + else + raise ArgumentError, "Alias not supported." if alias_ != method + send("def_#{kwd[:type]}_delegator", accessor, method, **kwd.tap do |obj| + obj.delete(:type) + end) + end + end + + # ------------------------------------------------------------------------ + # Create multiple delegates at once. + # ------------------------------------------------------------------------ + + def def_delegators(accessor, *methods) + kwd = methods.shift if methods.first.is_a?(Hash) + kwd = methods.pop if methods. last.is_a?(Hash) + kwd = {} unless kwd + + methods.each do |method| + def_delegator accessor, method, **kwd + end + end + + # ------------------------------------------------------------------------ + # Prepares a delegate and it's few arguments. + # ------------------------------------------------------------------------ + + private + def prepare_delegate(wrap: nil, bool: false) + prefix = (bool == :reverse ? "!!!" : "!!") if bool + wrap = "self.class.new" if wrap.is_a?(TrueClass) + suffix = "?" if bool + + return [ + prefix, suffix, wrap + ] + end + + # ------------------------------------------------------------------------ + + private + def delegate_debug(str) + if Forwardable.debug && !Forwardable.debug.is_a?(TrueClass) + then Forwardable.debug.debug( + str + ) + + elsif Forwardable.debug + $stdout.puts( + "\n# ------\n\n", str + ) + end + + str + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb b/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb new file mode 100644 index 0000000..0639375 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb @@ -0,0 +1,9 @@ +# Frozen-string-literal: true +# Copyright: 2015-2016 Jordon Bedwell - MIT License +# Encoding: utf-8 + +module Forwardable + module Extended + VERSION = "2.6.0" + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/.gitignore b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/.gitignore new file mode 100644 index 0000000..d20f94b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/.gitignore @@ -0,0 +1,11 @@ +tmp +*.bundle +*.gem +*.o +*.so +*.bundle +*.jar +*.swp +Makefile +tags +*.rbc diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/.gitmodules b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/.gitmodules new file mode 100644 index 0000000..6c289a3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/.gitmodules @@ -0,0 +1,6 @@ +[submodule "http-parser"] + path = ext/ruby_http_parser/vendor/http-parser + url = git://github.com/joyent/http-parser.git +[submodule "http-parser-java"] + path = ext/ruby_http_parser/vendor/http-parser-java + url = git://github.com/tmm1/http-parser.java diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Gemfile b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Gemfile new file mode 100644 index 0000000..851fabc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org' +gemspec diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Gemfile.lock b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Gemfile.lock new file mode 100644 index 0000000..c880187 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Gemfile.lock @@ -0,0 +1,39 @@ +PATH + remote: . + specs: + http_parser.rb (0.6.0.beta.2) + +GEM + remote: https://rubygems.org/ + specs: + benchmark_suite (0.8.0) + diff-lcs (1.1.2) + ffi (1.0.11) + ffi (1.0.11-java) + json (1.8.0) + json (1.8.0-java) + rake (0.9.2) + rake-compiler (0.7.9) + rake + rspec (2.4.0) + rspec-core (~> 2.4.0) + rspec-expectations (~> 2.4.0) + rspec-mocks (~> 2.4.0) + rspec-core (2.4.0) + rspec-expectations (2.4.0) + diff-lcs (~> 1.1.2) + rspec-mocks (2.4.0) + yajl-ruby (1.1.0) + +PLATFORMS + java + ruby + +DEPENDENCIES + benchmark_suite + ffi + http_parser.rb! + json (>= 1.4.6) + rake-compiler (>= 0.7.9) + rspec (>= 2.0.1) + yajl-ruby (>= 0.8.1) diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/LICENSE-MIT b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/LICENSE-MIT new file mode 100644 index 0000000..35f0bf0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/LICENSE-MIT @@ -0,0 +1,20 @@ +Copyright 2009,2010 Marc-André Cournoyer +Copyright 2010,2011 Aman Gupta + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/README.md b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/README.md new file mode 100644 index 0000000..35dad45 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/README.md @@ -0,0 +1,90 @@ +# http_parser.rb + +A simple callback-based HTTP request/response parser for writing http +servers, clients and proxies. + +This gem is built on top of [joyent/http-parser](http://github.com/joyent/http-parser) and its java port [http-parser/http-parser.java](http://github.com/http-parser/http-parser.java). + +## Supported Platforms + +This gem aims to work on all major Ruby platforms, including: + +- MRI 1.8 and 1.9 +- Rubinius +- JRuby +- win32 + +## Usage + +```ruby +require "http/parser" + +parser = Http::Parser.new + +parser.on_headers_complete = proc do + p parser.http_version + + p parser.http_method # for requests + p parser.request_url + + p parser.status_code # for responses + + p parser.headers +end + +parser.on_body = proc do |chunk| + # One chunk of the body + p chunk +end + +parser.on_message_complete = proc do |env| + # Headers and body is all parsed + puts "Done!" +end +``` + +# Feed raw data from the socket to the parser +`parser << raw_data` + +## Advanced Usage + +### Accept callbacks on an object + +```ruby +module MyHttpConnection + def connection_completed + @parser = Http::Parser.new(self) + end + + def receive_data(data) + @parser << data + end + + def on_message_begin + @headers = nil + @body = '' + end + + def on_headers_complete(headers) + @headers = headers + end + + def on_body(chunk) + @body << chunk + end + + def on_message_complete + p [@headers, @body] + end +end +``` + +### Stop parsing after headers + +```ruby +parser = Http::Parser.new +parser.on_headers_complete = proc{ :stop } + +offset = parser << request_data +body = request_data[offset..-1] +``` diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Rakefile b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Rakefile new file mode 100644 index 0000000..150f652 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/Rakefile @@ -0,0 +1,6 @@ +# load tasks +Dir['tasks/*.rake'].sort.each { |f| load f } + +# default task +task :compile => :submodules +task :default => [:compile, :spec] diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/bench/standalone.rb b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/bench/standalone.rb new file mode 100755 index 0000000..6b4dcb6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/bench/standalone.rb @@ -0,0 +1,23 @@ +#!/usr/bin/env ruby +$:.unshift File.dirname(__FILE__) + "/../lib" +require "rubygems" +require "http/parser" +require "benchmark/ips" + +request = <<-REQUEST +GET / HTTP/1.1 +Host: www.example.com +Connection: keep-alive +User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.78 S +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Encoding: gzip,deflate,sdch +Accept-Language: en-US,en;q=0.8 +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 + +REQUEST +request.gsub!(/\n/m, "\r\n") + +Benchmark.ips do |ips| + ips.report("instance") { Http::Parser.new } + ips.report("parsing") { Http::Parser.new << request } +end diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/bench/thin.rb b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/bench/thin.rb new file mode 100644 index 0000000..fe0dd6d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/bench/thin.rb @@ -0,0 +1,58 @@ +$:.unshift File.dirname(__FILE__) + "/../lib" +require "rubygems" +require "thin_parser" +require "http_parser" +require "benchmark" +require "stringio" + +data = "POST /postit HTTP/1.1\r\n" + + "Host: localhost:3000\r\n" + + "User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9\r\n" + + "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n" + + "Accept-Language: en-us,en;q=0.5\r\n" + + "Accept-Encoding: gzip,deflate\r\n" + + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" + + "Keep-Alive: 300\r\n" + + "Connection: keep-alive\r\n" + + "Content-Type: text/html\r\n" + + "Content-Length: 37\r\n" + + "\r\n" + + "name=marc&email=macournoyer@gmail.com" + +def thin(data) + env = {"rack.input" => StringIO.new} + Thin::HttpParser.new.execute(env, data, 0) + env +end + +def http_parser(data) + body = StringIO.new + env = nil + + parser = HTTP::RequestParser.new + parser.on_headers_complete = proc { |e| env = e } + parser.on_body = proc { |c| body << c } + parser << data + + env["rack-input"] = body + env +end + +# p thin(data) +# p http_parser(data) + +TESTS = 30_000 +Benchmark.bmbm do |results| + results.report("thin:") { TESTS.times { thin data } } + results.report("http-parser:") { TESTS.times { http_parser data } } +end + +# On my MBP core duo 2.2Ghz +# Rehearsal ------------------------------------------------ +# thin: 1.470000 0.000000 1.470000 ( 1.474737) +# http-parser: 1.270000 0.020000 1.290000 ( 1.292758) +# --------------------------------------- total: 2.760000sec +# +# user system total real +# thin: 1.150000 0.030000 1.180000 ( 1.173767) +# http-parser: 1.250000 0.010000 1.260000 ( 1.263796) diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.RUBYARCHDIR.time b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.RUBYARCHDIR.time new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.gitignore b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.gitignore new file mode 100644 index 0000000..cb899d1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.gitignore @@ -0,0 +1 @@ +ryah_http_parser.* diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/RubyHttpParserService.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/RubyHttpParserService.java new file mode 100644 index 0000000..2ea3e8e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/RubyHttpParserService.java @@ -0,0 +1,18 @@ +import java.io.IOException; + +import org.jruby.Ruby; +import org.jruby.RubyClass; +import org.jruby.RubyModule; +import org.jruby.runtime.load.BasicLibraryService; + +import org.ruby_http_parser.*; + +public class RubyHttpParserService implements BasicLibraryService { + public boolean basicLoad(final Ruby runtime) throws IOException { + RubyModule mHTTP = runtime.defineModule("HTTP"); + RubyClass cParser = mHTTP.defineClassUnder("Parser", runtime.getObject(), RubyHttpParser.ALLOCATOR); + cParser.defineAnnotatedMethods(RubyHttpParser.class); + cParser.defineClassUnder("Error", runtime.getClass("IOError"),runtime.getClass("IOError").getAllocator()); + return true; + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ext_help.h b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ext_help.h new file mode 100644 index 0000000..a919dff --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ext_help.h @@ -0,0 +1,18 @@ +#ifndef ext_help_h +#define ext_help_h + +#define RAISE_NOT_NULL(T) if(T == NULL) rb_raise(rb_eArgError, "NULL found for " # T " when shouldn't be."); +#define DATA_GET(from,type,name) Data_Get_Struct(from,type,name); RAISE_NOT_NULL(name); +#define REQUIRE_TYPE(V, T) if(TYPE(V) != T) rb_raise(rb_eTypeError, "Wrong argument type for " # V " required " # T); + +/* for compatibility with Ruby 1.8.5, which doesn't declare RSTRING_PTR */ +#ifndef RSTRING_PTR +#define RSTRING_PTR(s) (RSTRING(s)->ptr) +#endif + +/* for compatibility with Ruby 1.8.5, which doesn't declare RSTRING_LEN */ +#ifndef RSTRING_LEN +#define RSTRING_LEN(s) (RSTRING(s)->len) +#endif + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/extconf.rb b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/extconf.rb new file mode 100644 index 0000000..d2f6e51 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/extconf.rb @@ -0,0 +1,24 @@ +require 'mkmf' + +# check out code if it hasn't been already +if Dir[File.expand_path('../vendor/http-parser/*', __FILE__)].empty? + Dir.chdir(File.expand_path('../../../', __FILE__)) do + xsystem 'git submodule init' + xsystem 'git submodule update' + end +end + +# mongrel and http-parser both define http_parser_(init|execute), so we +# rename functions in http-parser before using them. +vendor_dir = File.expand_path('../vendor/http-parser/', __FILE__) +src_dir = File.expand_path('../', __FILE__) +%w[ http_parser.c http_parser.h ].each do |file| + File.open(File.join(src_dir, "ryah_#{file}"), 'w'){ |f| + f.write File.read(File.join(vendor_dir, file)).gsub('http_parser', 'ryah_http_parser') + } +end + +$CFLAGS << " -I#{src_dir}" + +dir_config("ruby_http_parser") +create_makefile("ruby_http_parser") diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java new file mode 100644 index 0000000..ac586a9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java @@ -0,0 +1,495 @@ +package org.ruby_http_parser; + +import http_parser.HTTPException; +import http_parser.HTTPMethod; +import http_parser.HTTPParser; +import http_parser.lolevel.HTTPCallback; +import http_parser.lolevel.HTTPDataCallback; +import http_parser.lolevel.ParserSettings; + +import java.nio.ByteBuffer; + +import org.jcodings.Encoding; +import org.jcodings.specific.UTF8Encoding; +import org.jruby.Ruby; +import org.jruby.RubyArray; +import org.jruby.RubyClass; +import org.jruby.RubyHash; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.RubyString; +import org.jruby.RubySymbol; +import org.jruby.anno.JRubyMethod; +import org.jruby.exceptions.RaiseException; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; + +public class RubyHttpParser extends RubyObject { + + @JRubyMethod(name = "strict?", module = true) + public static IRubyObject strict(IRubyObject recv) { + return recv.getRuntime().newBoolean(true); + } + + public static ObjectAllocator ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyHttpParser(runtime, klass); + } + }; + + byte[] fetchBytes(ByteBuffer b, int pos, int len) { + byte[] by = new byte[len]; + int saved = b.position(); + b.position(pos); + b.get(by); + b.position(saved); + return by; + } + + public class StopException extends RuntimeException { + } + + private Ruby runtime; + private HTTPParser parser; + private ParserSettings settings; + + private RubyClass eParserError; + + private RubyHash headers; + + private IRubyObject on_message_begin; + private IRubyObject on_headers_complete; + private IRubyObject on_body; + private IRubyObject on_message_complete; + + private IRubyObject requestUrl; + private IRubyObject requestPath; + private IRubyObject queryString; + private IRubyObject fragment; + + private IRubyObject header_value_type; + private IRubyObject upgradeData; + + private IRubyObject callback_object; + + private boolean completed; + + private byte[] _current_header; + private byte[] _last_header; + + private static final Encoding UTF8 = UTF8Encoding.INSTANCE; + + public RubyHttpParser(final Ruby runtime, RubyClass clazz) { + super(runtime, clazz); + + this.runtime = runtime; + this.eParserError = (RubyClass) runtime.getModule("HTTP").getClass("Parser").getConstant("Error"); + + this.on_message_begin = null; + this.on_headers_complete = null; + this.on_body = null; + this.on_message_complete = null; + + this.callback_object = null; + + this.completed = false; + + this.header_value_type = runtime.getModule("HTTP").getClass("Parser") + .getInstanceVariable("@default_header_value_type"); + + initSettings(); + init(); + } + + private void initSettings() { + this.settings = new ParserSettings(); + + this.settings.on_url = new HTTPDataCallback() { + public int cb(http_parser.lolevel.HTTPParser p, ByteBuffer buf, int pos, int len) { + byte[] data = fetchBytes(buf, pos, len); + if (runtime.is1_9() || runtime.is2_0()) { + ((RubyString) requestUrl).cat(data, 0, data.length, UTF8); + } else { + ((RubyString) requestUrl).cat(data); + } + return 0; + } + }; + + this.settings.on_header_field = new HTTPDataCallback() { + public int cb(http_parser.lolevel.HTTPParser p, ByteBuffer buf, int pos, int len) { + byte[] data = fetchBytes(buf, pos, len); + + if (_current_header == null) + _current_header = data; + else { + byte[] tmp = new byte[_current_header.length + data.length]; + System.arraycopy(_current_header, 0, tmp, 0, _current_header.length); + System.arraycopy(data, 0, tmp, _current_header.length, data.length); + _current_header = tmp; + } + + return 0; + } + }; + final RubySymbol arraysSym = runtime.newSymbol("arrays"); + final RubySymbol mixedSym = runtime.newSymbol("mixed"); + final RubySymbol stopSym = runtime.newSymbol("stop"); + final RubySymbol resetSym = runtime.newSymbol("reset"); + this.settings.on_header_value = new HTTPDataCallback() { + public int cb(http_parser.lolevel.HTTPParser p, ByteBuffer buf, int pos, int len) { + byte[] data = fetchBytes(buf, pos, len); + ThreadContext context = headers.getRuntime().getCurrentContext(); + IRubyObject key, val; + int new_field = 0; + + if (_current_header != null) { + new_field = 1; + _last_header = _current_header; + _current_header = null; + } + + key = RubyString.newString(runtime, new ByteList(_last_header, UTF8, false)); + val = headers.op_aref(context, key); + + if (new_field == 1) { + if (val.isNil()) { + if (header_value_type == arraysSym) { + headers.op_aset(context, key, + RubyArray.newArrayLight(runtime, RubyString.newStringLight(runtime, 10, UTF8))); + } else { + headers.op_aset(context, key, RubyString.newStringLight(runtime, 10, UTF8)); + } + } else { + if (header_value_type == mixedSym) { + if (val instanceof RubyString) { + headers.op_aset(context, key, + RubyArray.newArrayLight(runtime, val, RubyString.newStringLight(runtime, 10, UTF8))); + } else { + ((RubyArray) val).add(RubyString.newStringLight(runtime, 10, UTF8)); + } + } else if (header_value_type == arraysSym) { + ((RubyArray) val).add(RubyString.newStringLight(runtime, 10, UTF8)); + } else { + if (runtime.is1_9() || runtime.is2_0()) { + ((RubyString) val).cat(',', UTF8).cat(' ', UTF8); + } else { + ((RubyString) val).cat(',').cat(' '); + } + } + } + val = headers.op_aref(context, key); + } + + if (val instanceof RubyArray) { + val = ((RubyArray) val).entry(-1); + } + + if (runtime.is1_9() || runtime.is2_0()) { + ((RubyString) val).cat(data, 0, data.length, UTF8); + } else { + ((RubyString) val).cat(data); + } + + return 0; + } + }; + + this.settings.on_message_begin = new HTTPCallback() { + public int cb(http_parser.lolevel.HTTPParser p) { + headers = new RubyHash(runtime); + + if (runtime.is1_9() || runtime.is2_0()) { + requestUrl = RubyString.newEmptyString(runtime, UTF8); + requestPath = RubyString.newEmptyString(runtime, UTF8); + queryString = RubyString.newEmptyString(runtime, UTF8); + fragment = RubyString.newEmptyString(runtime, UTF8); + upgradeData = RubyString.newEmptyString(runtime, UTF8); + } else { + requestUrl = RubyString.newEmptyString(runtime); + requestPath = RubyString.newEmptyString(runtime); + queryString = RubyString.newEmptyString(runtime); + fragment = RubyString.newEmptyString(runtime); + upgradeData = RubyString.newEmptyString(runtime); + } + + IRubyObject ret = runtime.getNil(); + + if (callback_object != null) { + if (((RubyObject) callback_object).respondsTo("on_message_begin")) { + ThreadContext context = callback_object.getRuntime().getCurrentContext(); + ret = callback_object.callMethod(context, "on_message_begin"); + } + } else if (on_message_begin != null) { + ThreadContext context = on_message_begin.getRuntime().getCurrentContext(); + ret = on_message_begin.callMethod(context, "call"); + } + + if (ret == stopSym) { + throw new StopException(); + } else { + return 0; + } + } + }; + this.settings.on_message_complete = new HTTPCallback() { + public int cb(http_parser.lolevel.HTTPParser p) { + IRubyObject ret = runtime.getNil(); + + completed = true; + + if (callback_object != null) { + if (((RubyObject) callback_object).respondsTo("on_message_complete")) { + ThreadContext context = callback_object.getRuntime().getCurrentContext(); + ret = callback_object.callMethod(context, "on_message_complete"); + } + } else if (on_message_complete != null) { + ThreadContext context = on_message_complete.getRuntime().getCurrentContext(); + ret = on_message_complete.callMethod(context, "call"); + } + + if (ret == stopSym) { + throw new StopException(); + } else { + return 0; + } + } + }; + this.settings.on_headers_complete = new HTTPCallback() { + public int cb(http_parser.lolevel.HTTPParser p) { + IRubyObject ret = runtime.getNil(); + + if (callback_object != null) { + if (((RubyObject) callback_object).respondsTo("on_headers_complete")) { + ThreadContext context = callback_object.getRuntime().getCurrentContext(); + ret = callback_object.callMethod(context, "on_headers_complete", headers); + } + } else if (on_headers_complete != null) { + ThreadContext context = on_headers_complete.getRuntime().getCurrentContext(); + ret = on_headers_complete.callMethod(context, "call", headers); + } + + if (ret == stopSym) { + throw new StopException(); + } else if (ret == resetSym) { + return 1; + } else { + return 0; + } + } + }; + this.settings.on_body = new HTTPDataCallback() { + public int cb(http_parser.lolevel.HTTPParser p, ByteBuffer buf, int pos, int len) { + IRubyObject ret = runtime.getNil(); + byte[] data = fetchBytes(buf, pos, len); + + if (callback_object != null) { + if (((RubyObject) callback_object).respondsTo("on_body")) { + ThreadContext context = callback_object.getRuntime().getCurrentContext(); + ret = callback_object.callMethod(context, "on_body", + RubyString.newString(runtime, new ByteList(data, UTF8, false))); + } + } else if (on_body != null) { + ThreadContext context = on_body.getRuntime().getCurrentContext(); + ret = on_body.callMethod(context, "call", RubyString.newString(runtime, new ByteList(data, UTF8, false))); + } + + if (ret == stopSym) { + throw new StopException(); + } else { + return 0; + } + } + }; + } + + private void init() { + this.parser = new HTTPParser(); + this.parser.HTTP_PARSER_STRICT = true; + this.headers = null; + + this.requestUrl = runtime.getNil(); + this.requestPath = runtime.getNil(); + this.queryString = runtime.getNil(); + this.fragment = runtime.getNil(); + + this.upgradeData = runtime.getNil(); + } + + @JRubyMethod(name = "initialize") + public IRubyObject initialize() { + return this; + } + + @JRubyMethod(name = "initialize") + public IRubyObject initialize(IRubyObject arg) { + callback_object = arg; + return initialize(); + } + + @JRubyMethod(name = "initialize") + public IRubyObject initialize(IRubyObject arg, IRubyObject arg2) { + header_value_type = arg2; + return initialize(arg); + } + + @JRubyMethod(name = "on_message_begin=") + public IRubyObject set_on_message_begin(IRubyObject cb) { + on_message_begin = cb; + return cb; + } + + @JRubyMethod(name = "on_headers_complete=") + public IRubyObject set_on_headers_complete(IRubyObject cb) { + on_headers_complete = cb; + return cb; + } + + @JRubyMethod(name = "on_body=") + public IRubyObject set_on_body(IRubyObject cb) { + on_body = cb; + return cb; + } + + @JRubyMethod(name = "on_message_complete=") + public IRubyObject set_on_message_complete(IRubyObject cb) { + on_message_complete = cb; + return cb; + } + + @JRubyMethod(name = "<<") + public IRubyObject execute(IRubyObject data) { + RubyString str = (RubyString) data; + ByteList byteList = str.getByteList(); + ByteBuffer buf = ByteBuffer.wrap(byteList.getUnsafeBytes(), byteList.getBegin(), byteList.getRealSize()); + boolean stopped = false; + + try { + this.parser.execute(this.settings, buf); + } catch (HTTPException e) { + throw new RaiseException(runtime, eParserError, e.getMessage(), true); + } catch (StopException e) { + stopped = true; + } + + if (parser.getUpgrade()) { + byte[] upData = fetchBytes(buf, buf.position(), buf.limit() - buf.position()); + if (runtime.is1_9() || runtime.is2_0()) { + ((RubyString) upgradeData).cat(upData, 0, upData.length, UTF8); + } else { + ((RubyString) upgradeData).cat(upData); + } + } else if (buf.hasRemaining() && !completed) { + if (!stopped) + throw new RaiseException(runtime, eParserError, "Could not parse data entirely", true); + } + + return RubyNumeric.int2fix(runtime, buf.position()); + } + + @JRubyMethod(name = "keep_alive?") + public IRubyObject shouldKeepAlive() { + return runtime.newBoolean(parser.shouldKeepAlive()); + } + + @JRubyMethod(name = "upgrade?") + public IRubyObject shouldUpgrade() { + return runtime.newBoolean(parser.getUpgrade()); + } + + @JRubyMethod(name = "http_major") + public IRubyObject httpMajor() { + if (parser.getMajor() == 0 && parser.getMinor() == 0) + return runtime.getNil(); + else + return RubyNumeric.int2fix(runtime, parser.getMajor()); + } + + @JRubyMethod(name = "http_minor") + public IRubyObject httpMinor() { + if (parser.getMajor() == 0 && parser.getMinor() == 0) + return runtime.getNil(); + else + return RubyNumeric.int2fix(runtime, parser.getMinor()); + } + + @JRubyMethod(name = "http_version") + public IRubyObject httpVersion() { + if (parser.getMajor() == 0 && parser.getMinor() == 0) + return runtime.getNil(); + else + return runtime.newArray(httpMajor(), httpMinor()); + } + + @JRubyMethod(name = "http_method") + public IRubyObject httpMethod() { + HTTPMethod method = parser.getHTTPMethod(); + if (method != null) + return runtime.newString(new String(method.bytes)); + else + return runtime.getNil(); + } + + @JRubyMethod(name = "status_code") + public IRubyObject statusCode() { + int code = parser.getStatusCode(); + if (code != 0) + return RubyNumeric.int2fix(runtime, code); + else + return runtime.getNil(); + } + + @JRubyMethod(name = "headers") + public IRubyObject getHeaders() { + return headers == null ? runtime.getNil() : headers; + } + + @JRubyMethod(name = "request_url") + public IRubyObject getRequestUrl() { + return requestUrl == null ? runtime.getNil() : requestUrl; + } + + @JRubyMethod(name = "request_path") + public IRubyObject getRequestPath() { + return requestPath == null ? runtime.getNil() : requestPath; + } + + @JRubyMethod(name = "query_string") + public IRubyObject getQueryString() { + return queryString == null ? runtime.getNil() : queryString; + } + + @JRubyMethod(name = "fragment") + public IRubyObject getFragment() { + return fragment == null ? runtime.getNil() : fragment; + } + + @JRubyMethod(name = "header_value_type") + public IRubyObject getHeaderValueType() { + return header_value_type == null ? runtime.getNil() : header_value_type; + } + + @JRubyMethod(name = "header_value_type=") + public IRubyObject set_header_value_type(IRubyObject val) { + String valString = val.toString(); + if (valString != "mixed" && valString != "arrays" && valString != "strings") { + throw runtime.newArgumentError("Invalid header value type"); + } + header_value_type = val; + return val; + } + + @JRubyMethod(name = "upgrade_data") + public IRubyObject upgradeData() { + return upgradeData == null ? runtime.getNil() : upgradeData; + } + + @JRubyMethod(name = "reset!") + public IRubyObject reset() { + init(); + return runtime.getTrue(); + } + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ruby_http_parser.c b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ruby_http_parser.c new file mode 100644 index 0000000..5650652 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ruby_http_parser.c @@ -0,0 +1,515 @@ +#include "ruby.h" +#include "ext_help.h" +#include "ryah_http_parser.h" + +#define GET_WRAPPER(N, from) ParserWrapper *N = (ParserWrapper *)(from)->data; +#define HASH_CAT(h, k, ptr, len) \ + do { \ + VALUE __v = rb_hash_aref(h, k); \ + if (__v != Qnil) { \ + rb_str_cat(__v, ptr, len); \ + } else { \ + rb_hash_aset(h, k, rb_str_new(ptr, len)); \ + } \ + } while(0) + +typedef struct ParserWrapper { + ryah_http_parser parser; + + VALUE request_url; + + VALUE headers; + + VALUE upgrade_data; + + VALUE on_message_begin; + VALUE on_headers_complete; + VALUE on_body; + VALUE on_message_complete; + + VALUE callback_object; + VALUE stopped; + VALUE completed; + + VALUE header_value_type; + + VALUE last_field_name; + VALUE curr_field_name; + + enum ryah_http_parser_type type; +} ParserWrapper; + +void ParserWrapper_init(ParserWrapper *wrapper) { + ryah_http_parser_init(&wrapper->parser, wrapper->type); + wrapper->parser.status_code = 0; + wrapper->parser.http_major = 0; + wrapper->parser.http_minor = 0; + + wrapper->request_url = Qnil; + + wrapper->upgrade_data = Qnil; + + wrapper->headers = Qnil; + wrapper->completed = Qfalse; + + wrapper->last_field_name = Qnil; + wrapper->curr_field_name = Qnil; +} + +void ParserWrapper_mark(void *data) { + if(data) { + ParserWrapper *wrapper = (ParserWrapper *) data; + rb_gc_mark_maybe(wrapper->request_url); + rb_gc_mark_maybe(wrapper->upgrade_data); + rb_gc_mark_maybe(wrapper->headers); + rb_gc_mark_maybe(wrapper->on_message_begin); + rb_gc_mark_maybe(wrapper->on_headers_complete); + rb_gc_mark_maybe(wrapper->on_body); + rb_gc_mark_maybe(wrapper->on_message_complete); + rb_gc_mark_maybe(wrapper->callback_object); + rb_gc_mark_maybe(wrapper->last_field_name); + rb_gc_mark_maybe(wrapper->curr_field_name); + } +} + +void ParserWrapper_free(void *data) { + if(data) { + free(data); + } +} + +static VALUE cParser; +static VALUE cRequestParser; +static VALUE cResponseParser; + +static VALUE eParserError; + +static ID Icall; +static ID Ion_message_begin; +static ID Ion_headers_complete; +static ID Ion_body; +static ID Ion_message_complete; + +static VALUE Sstop; +static VALUE Sreset; +static VALUE Sarrays; +static VALUE Sstrings; +static VALUE Smixed; + +/** Callbacks **/ + +int on_message_begin(ryah_http_parser *parser) { + GET_WRAPPER(wrapper, parser); + + wrapper->request_url = rb_str_new2(""); + wrapper->headers = rb_hash_new(); + wrapper->upgrade_data = rb_str_new2(""); + + VALUE ret = Qnil; + + if (wrapper->callback_object != Qnil && rb_respond_to(wrapper->callback_object, Ion_message_begin)) { + ret = rb_funcall(wrapper->callback_object, Ion_message_begin, 0); + } else if (wrapper->on_message_begin != Qnil) { + ret = rb_funcall(wrapper->on_message_begin, Icall, 0); + } + + if (ret == Sstop) { + wrapper->stopped = Qtrue; + return -1; + } else { + return 0; + } +} + +int on_url(ryah_http_parser *parser, const char *at, size_t length) { + GET_WRAPPER(wrapper, parser); + rb_str_cat(wrapper->request_url, at, length); + return 0; +} + +int on_header_field(ryah_http_parser *parser, const char *at, size_t length) { + GET_WRAPPER(wrapper, parser); + + if (wrapper->curr_field_name == Qnil) { + wrapper->last_field_name = Qnil; + wrapper->curr_field_name = rb_str_new(at, length); + } else { + rb_str_cat(wrapper->curr_field_name, at, length); + } + + return 0; +} + +int on_header_value(ryah_http_parser *parser, const char *at, size_t length) { + GET_WRAPPER(wrapper, parser); + + int new_field = 0; + VALUE current_value; + + if (wrapper->last_field_name == Qnil) { + new_field = 1; + wrapper->last_field_name = wrapper->curr_field_name; + wrapper->curr_field_name = Qnil; + } + + current_value = rb_hash_aref(wrapper->headers, wrapper->last_field_name); + + if (new_field == 1) { + if (current_value == Qnil) { + if (wrapper->header_value_type == Sarrays) { + rb_hash_aset(wrapper->headers, wrapper->last_field_name, rb_ary_new3(1, rb_str_new2(""))); + } else { + rb_hash_aset(wrapper->headers, wrapper->last_field_name, rb_str_new2("")); + } + } else { + if (wrapper->header_value_type == Smixed) { + if (TYPE(current_value) == T_STRING) { + rb_hash_aset(wrapper->headers, wrapper->last_field_name, rb_ary_new3(2, current_value, rb_str_new2(""))); + } else { + rb_ary_push(current_value, rb_str_new2("")); + } + } else if (wrapper->header_value_type == Sarrays) { + rb_ary_push(current_value, rb_str_new2("")); + } else { + rb_str_cat(current_value, ", ", 2); + } + } + current_value = rb_hash_aref(wrapper->headers, wrapper->last_field_name); + } + + if (TYPE(current_value) == T_ARRAY) { + current_value = rb_ary_entry(current_value, -1); + } + + rb_str_cat(current_value, at, length); + + return 0; +} + +int on_headers_complete(ryah_http_parser *parser) { + GET_WRAPPER(wrapper, parser); + + VALUE ret = Qnil; + + if (wrapper->callback_object != Qnil && rb_respond_to(wrapper->callback_object, Ion_headers_complete)) { + ret = rb_funcall(wrapper->callback_object, Ion_headers_complete, 1, wrapper->headers); + } else if (wrapper->on_headers_complete != Qnil) { + ret = rb_funcall(wrapper->on_headers_complete, Icall, 1, wrapper->headers); + } + + if (ret == Sstop) { + wrapper->stopped = Qtrue; + return -1; + } else if (ret == Sreset){ + return 1; + } else { + return 0; + } +} + +int on_body(ryah_http_parser *parser, const char *at, size_t length) { + GET_WRAPPER(wrapper, parser); + + VALUE ret = Qnil; + + if (wrapper->callback_object != Qnil && rb_respond_to(wrapper->callback_object, Ion_body)) { + ret = rb_funcall(wrapper->callback_object, Ion_body, 1, rb_str_new(at, length)); + } else if (wrapper->on_body != Qnil) { + ret = rb_funcall(wrapper->on_body, Icall, 1, rb_str_new(at, length)); + } + + if (ret == Sstop) { + wrapper->stopped = Qtrue; + return -1; + } else { + return 0; + } +} + +int on_message_complete(ryah_http_parser *parser) { + GET_WRAPPER(wrapper, parser); + + VALUE ret = Qnil; + wrapper->completed = Qtrue; + + if (wrapper->callback_object != Qnil && rb_respond_to(wrapper->callback_object, Ion_message_complete)) { + ret = rb_funcall(wrapper->callback_object, Ion_message_complete, 0); + } else if (wrapper->on_message_complete != Qnil) { + ret = rb_funcall(wrapper->on_message_complete, Icall, 0); + } + + if (ret == Sstop) { + wrapper->stopped = Qtrue; + return -1; + } else { + return 0; + } +} + +static ryah_http_parser_settings settings = { + .on_message_begin = on_message_begin, + .on_url = on_url, + .on_header_field = on_header_field, + .on_header_value = on_header_value, + .on_headers_complete = on_headers_complete, + .on_body = on_body, + .on_message_complete = on_message_complete +}; + +VALUE Parser_alloc_by_type(VALUE klass, enum ryah_http_parser_type type) { + ParserWrapper *wrapper = ALLOC_N(ParserWrapper, 1); + wrapper->type = type; + wrapper->parser.data = wrapper; + + wrapper->on_message_begin = Qnil; + wrapper->on_headers_complete = Qnil; + wrapper->on_body = Qnil; + wrapper->on_message_complete = Qnil; + + wrapper->callback_object = Qnil; + + ParserWrapper_init(wrapper); + + return Data_Wrap_Struct(klass, ParserWrapper_mark, ParserWrapper_free, wrapper); +} + +VALUE Parser_alloc(VALUE klass) { + return Parser_alloc_by_type(klass, HTTP_BOTH); +} + +VALUE RequestParser_alloc(VALUE klass) { + return Parser_alloc_by_type(klass, HTTP_REQUEST); +} + +VALUE ResponseParser_alloc(VALUE klass) { + return Parser_alloc_by_type(klass, HTTP_RESPONSE); +} + +VALUE Parser_strict_p(VALUE klass) { + return HTTP_PARSER_STRICT == 1 ? Qtrue : Qfalse; +} + +VALUE Parser_initialize(int argc, VALUE *argv, VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->header_value_type = rb_iv_get(CLASS_OF(self), "@default_header_value_type"); + + if (argc == 1) { + wrapper->callback_object = argv[0]; + } + + if (argc == 2) { + wrapper->callback_object = argv[0]; + wrapper->header_value_type = argv[1]; + } + + return self; +} + +VALUE Parser_execute(VALUE self, VALUE data) { + ParserWrapper *wrapper = NULL; + + Check_Type(data, T_STRING); + char *ptr = RSTRING_PTR(data); + long len = RSTRING_LEN(data); + + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->stopped = Qfalse; + size_t nparsed = ryah_http_parser_execute(&wrapper->parser, &settings, ptr, len); + + if (wrapper->parser.upgrade) { + if (RTEST(wrapper->stopped)) + nparsed += 1; + + rb_str_cat(wrapper->upgrade_data, ptr + nparsed, len - nparsed); + + } else if (nparsed != (size_t)len) { + if (!RTEST(wrapper->stopped) && !RTEST(wrapper->completed)) + rb_raise(eParserError, "Could not parse data entirely (%zu != %zu)", nparsed, len); + else + nparsed += 1; // error states fail on the current character + } + + return INT2FIX(nparsed); +} + +VALUE Parser_set_on_message_begin(VALUE self, VALUE callback) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->on_message_begin = callback; + return callback; +} + +VALUE Parser_set_on_headers_complete(VALUE self, VALUE callback) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->on_headers_complete = callback; + return callback; +} + +VALUE Parser_set_on_body(VALUE self, VALUE callback) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->on_body = callback; + return callback; +} + +VALUE Parser_set_on_message_complete(VALUE self, VALUE callback) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->on_message_complete = callback; + return callback; +} + +VALUE Parser_keep_alive_p(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + return http_should_keep_alive(&wrapper->parser) == 1 ? Qtrue : Qfalse; +} + +VALUE Parser_upgrade_p(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + return wrapper->parser.upgrade ? Qtrue : Qfalse; +} + +VALUE Parser_http_version(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + if (wrapper->parser.http_major == 0 && wrapper->parser.http_minor == 0) + return Qnil; + else + return rb_ary_new3(2, INT2FIX(wrapper->parser.http_major), INT2FIX(wrapper->parser.http_minor)); +} + +VALUE Parser_http_major(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + if (wrapper->parser.http_major == 0 && wrapper->parser.http_minor == 0) + return Qnil; + else + return INT2FIX(wrapper->parser.http_major); +} + +VALUE Parser_http_minor(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + if (wrapper->parser.http_major == 0 && wrapper->parser.http_minor == 0) + return Qnil; + else + return INT2FIX(wrapper->parser.http_minor); +} + +VALUE Parser_http_method(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + if (wrapper->parser.type == HTTP_REQUEST) + return rb_str_new2(http_method_str(wrapper->parser.method)); + else + return Qnil; +} + +VALUE Parser_status_code(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + if (wrapper->parser.status_code) + return INT2FIX(wrapper->parser.status_code); + else + return Qnil; +} + +#define DEFINE_GETTER(name) \ + VALUE Parser_##name(VALUE self) { \ + ParserWrapper *wrapper = NULL; \ + DATA_GET(self, ParserWrapper, wrapper); \ + return wrapper->name; \ + } + +DEFINE_GETTER(request_url); +DEFINE_GETTER(headers); +DEFINE_GETTER(upgrade_data); +DEFINE_GETTER(header_value_type); + +VALUE Parser_set_header_value_type(VALUE self, VALUE val) { + if (val != Sarrays && val != Sstrings && val != Smixed) { + rb_raise(rb_eArgError, "Invalid header value type"); + } + + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + wrapper->header_value_type = val; + return wrapper->header_value_type; +} + +VALUE Parser_reset(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + ParserWrapper_init(wrapper); + + return Qtrue; +} + +void Init_ruby_http_parser() { + VALUE mHTTP = rb_define_module("HTTP"); + cParser = rb_define_class_under(mHTTP, "Parser", rb_cObject); + cRequestParser = rb_define_class_under(mHTTP, "RequestParser", cParser); + cResponseParser = rb_define_class_under(mHTTP, "ResponseParser", cParser); + + eParserError = rb_define_class_under(cParser, "Error", rb_eIOError); + Icall = rb_intern("call"); + Ion_message_begin = rb_intern("on_message_begin"); + Ion_headers_complete = rb_intern("on_headers_complete"); + Ion_body = rb_intern("on_body"); + Ion_message_complete = rb_intern("on_message_complete"); + Sstop = ID2SYM(rb_intern("stop")); + Sreset = ID2SYM(rb_intern("reset")); + + Sarrays = ID2SYM(rb_intern("arrays")); + Sstrings = ID2SYM(rb_intern("strings")); + Smixed = ID2SYM(rb_intern("mixed")); + + rb_define_alloc_func(cParser, Parser_alloc); + rb_define_alloc_func(cRequestParser, RequestParser_alloc); + rb_define_alloc_func(cResponseParser, ResponseParser_alloc); + + rb_define_singleton_method(cParser, "strict?", Parser_strict_p, 0); + rb_define_method(cParser, "initialize", Parser_initialize, -1); + + rb_define_method(cParser, "on_message_begin=", Parser_set_on_message_begin, 1); + rb_define_method(cParser, "on_headers_complete=", Parser_set_on_headers_complete, 1); + rb_define_method(cParser, "on_body=", Parser_set_on_body, 1); + rb_define_method(cParser, "on_message_complete=", Parser_set_on_message_complete, 1); + rb_define_method(cParser, "<<", Parser_execute, 1); + + rb_define_method(cParser, "keep_alive?", Parser_keep_alive_p, 0); + rb_define_method(cParser, "upgrade?", Parser_upgrade_p, 0); + + rb_define_method(cParser, "http_version", Parser_http_version, 0); + rb_define_method(cParser, "http_major", Parser_http_major, 0); + rb_define_method(cParser, "http_minor", Parser_http_minor, 0); + + rb_define_method(cParser, "http_method", Parser_http_method, 0); + rb_define_method(cParser, "status_code", Parser_status_code, 0); + + rb_define_method(cParser, "request_url", Parser_request_url, 0); + rb_define_method(cParser, "headers", Parser_headers, 0); + rb_define_method(cParser, "upgrade_data", Parser_upgrade_data, 0); + rb_define_method(cParser, "header_value_type", Parser_header_value_type, 0); + rb_define_method(cParser, "header_value_type=", Parser_set_header_value_type, 1); + + rb_define_method(cParser, "reset!", Parser_reset, 0); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/.gitkeep b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/AUTHORS b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/AUTHORS new file mode 100644 index 0000000..abe99de --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/AUTHORS @@ -0,0 +1,32 @@ +# Authors ordered by first contribution. +Ryan Dahl +Jeremy Hinegardner +Sergey Shepelev +Joe Damato +tomika +Phoenix Sol +Cliff Frey +Ewen Cheslack-Postava +Santiago Gala +Tim Becker +Jeff Terrace +Ben Noordhuis +Nathan Rajlich +Mark Nottingham +Aman Gupta +Tim Becker +Sean Cunningham +Peter Griess +Salman Haq +Cliff Frey +Jon Kolb +Fouad Mardini +Paul Querna +Felix Geisendörfer +koichik +Andre Caron +Ivo Raisr +James McLaughlin +David Gwynne +LE ROUX Thomas +Randy Rizun diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/LICENSE-MIT b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/LICENSE-MIT new file mode 100644 index 0000000..a0ae8dc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/LICENSE-MIT @@ -0,0 +1,48 @@ +Copyright 2010 Tim Becker + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +--- END OF LICENSE + +This code mainly based on code with the following license: + + +http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright +Igor Sysoev. + +Additional changes are licensed under the same terms as NGINX and +copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/README.md b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/README.md new file mode 100644 index 0000000..0a6a432 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/README.md @@ -0,0 +1,183 @@ +HTTP Parser +=========== + +This is a parser for HTTP written in Java, based quite heavily on +the Ryan Dahl's C Version: `http-parser` available here: + + http://github.com/ry/http-parser + +It parses both requests and responses. The parser is designed to be used +in performance HTTP applications. + +Features: + + * No dependencies (probably won't be able to keep it up) + * Handles persistent streams (keep-alive). + * Decodes chunked encoding. + * Upgrade support + +The parser extracts the following information from HTTP messages: + + * Header fields and values + * Content-Length + * Request method + * Response status code + * Transfer-Encoding + * HTTP version + * Request URL + * Message body + +Building +-------- + +use `ant compile|test|jar` + +Usage +----- + + TODO: in the present form, usage of the Java version of the parser + shouldn't be too difficult to figure out for someone familiar with the + C version. + + More documentation will follow shortly, in case you're looking for an + easy to use http library, this lib is probably not what you are + looking for anyway ... + + All text after this paragraph (and most of the text above it) are from + the original C version of the README and are currently only here for + reference. In case you encounter any difficulties, find bugs, need + help or have suggestions, feel free to contact me at + (tim.becker@kuriositaet.de). + + +One `http_parser` object is used per TCP connection. Initialize the struct +using `http_parser_init()` and set the callbacks. That might look something +like this for a request parser: + + http_parser_settings settings; + settings.on_path = my_path_callback; + settings.on_header_field = my_header_field_callback; + /* ... */ + + http_parser *parser = malloc(sizeof(http_parser)); + http_parser_init(parser, HTTP_REQUEST); + parser->data = my_socket; + +When data is received on the socket execute the parser and check for errors. + + size_t len = 80*1024, nparsed; + char buf[len]; + ssize_t recved; + + recved = recv(fd, buf, len, 0); + + if (recved < 0) { + /* Handle error. */ + } + + /* Start up / continue the parser. + * Note we pass recved==0 to signal that EOF has been recieved. + */ + nparsed = http_parser_execute(parser, &settings, buf, recved); + + if (parser->upgrade) { + /* handle new protocol */ + } else if (nparsed != recved) { + /* Handle error. Usually just close the connection. */ + } + +HTTP needs to know where the end of the stream is. For example, sometimes +servers send responses without Content-Length and expect the client to +consume input (for the body) until EOF. To tell http_parser about EOF, give +`0` as the forth parameter to `http_parser_execute()`. Callbacks and errors +can still be encountered during an EOF, so one must still be prepared +to receive them. + +Scalar valued message information such as `status_code`, `method`, and the +HTTP version are stored in the parser structure. This data is only +temporally stored in `http_parser` and gets reset on each new message. If +this information is needed later, copy it out of the structure during the +`headers_complete` callback. + +The parser decodes the transfer-encoding for both requests and responses +transparently. That is, a chunked encoding is decoded before being sent to +the on_body callback. + + +The Special Problem of Upgrade +------------------------------ + +HTTP supports upgrading the connection to a different protocol. An +increasingly common example of this is the Web Socket protocol which sends +a request like + + GET /demo HTTP/1.1 + Upgrade: WebSocket + Connection: Upgrade + Host: example.com + Origin: http://example.com + WebSocket-Protocol: sample + +followed by non-HTTP data. + +(See http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75 for more +information the Web Socket protocol.) + +To support this, the parser will treat this as a normal HTTP message without a +body. Issuing both on_headers_complete and on_message_complete callbacks. However +http_parser_execute() will stop parsing at the end of the headers and return. + +The user is expected to check if `parser->upgrade` has been set to 1 after +`http_parser_execute()` returns. Non-HTTP data begins at the buffer supplied +offset by the return value of `http_parser_execute()`. + + +Callbacks +--------- + +During the `http_parser_execute()` call, the callbacks set in +`http_parser_settings` will be executed. The parser maintains state and +never looks behind, so buffering the data is not necessary. If you need to +save certain data for later usage, you can do that from the callbacks. + +There are two types of callbacks: + +* notification `typedef int (*http_cb) (http_parser*);` + Callbacks: on_message_begin, on_headers_complete, on_message_complete. +* data `typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);` + Callbacks: (requests only) on_uri, + (common) on_header_field, on_header_value, on_body; + +Callbacks must return 0 on success. Returning a non-zero value indicates +error to the parser, making it exit immediately. + +In case you parse HTTP message in chunks (i.e. `read()` request line +from socket, parse, read half headers, parse, etc) your data callbacks +may be called more than once. Http-parser guarantees that data pointer is only +valid for the lifetime of callback. You can also `read()` into a heap allocated +buffer to avoid copying memory around if this fits your application. + +Reading headers may be a tricky task if you read/parse headers partially. +Basically, you need to remember whether last header callback was field or value +and apply following logic: + + (on_header_field and on_header_value shortened to on_h_*) + ------------------------ ------------ -------------------------------------------- + | State (prev. callback) | Callback | Description/action | + ------------------------ ------------ -------------------------------------------- + | nothing (first call) | on_h_field | Allocate new buffer and copy callback data | + | | | into it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_field | New header started. | + | | | Copy current name,value buffers to headers | + | | | list and allocate new buffer for new name | + ------------------------ ------------ -------------------------------------------- + | field | on_h_field | Previous name continues. Reallocate name | + | | | buffer and append callback data to it | + ------------------------ ------------ -------------------------------------------- + | field | on_h_value | Value for current header started. Allocate | + | | | new buffer and copy callback data to it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_value | Value continues. Reallocate value buffer | + | | | and append callback data to it | + ------------------------ ------------ -------------------------------------------- diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/TODO b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/TODO new file mode 100644 index 0000000..eb46a08 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/TODO @@ -0,0 +1,28 @@ +decide how to handle errs per default: + - ry: "set state to dead", return `read` + - current: call on_error w/ details, if no on_error handler set, + throw Exception, else call on_error and behave like orig... + +some tests from test.c left to port + (scan ...) +documentation + +hi level callback interface +eventloop +state() as a function (?) + - perhaps, the idea being to be able to log/debug better... +more tests + - in particular, port available c tests +impl bits of servlet api. + +DONE + +Sun Jul 18 12:19:18 CEST 2010 + +error handling + - consider callback based error handling and the current highlevel + "nice" logging moved to high level http impl. + - use Exceptions "ProtocolException"? + +better testing + - no junit to avoid dependencies diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/build.xml b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/build.xml new file mode 100755 index 0000000..d2c6af4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/build.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.c b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.c new file mode 100644 index 0000000..e961ae8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.c @@ -0,0 +1,2175 @@ +/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev + * + * Additional changes are licensed under the same terms as NGINX and + * copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include +#include +#include +#include +#include +#include + +#ifndef ULLONG_MAX +# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */ +#endif + +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef ARRAY_SIZE +# define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +#endif + +#ifndef BIT_AT +# define BIT_AT(a, i) \ + (!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \ + (1 << ((unsigned int) (i) & 7)))) +#endif + +#ifndef ELEM_AT +# define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v)) +#endif + +#define SET_ERRNO(e) \ +do { \ + parser->http_errno = (e); \ +} while(0) + + +/* Run the notify callback FOR, returning ER if it fails */ +#define CALLBACK_NOTIFY_(FOR, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (settings->on_##FOR) { \ + if (0 != settings->on_##FOR(parser)) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + \ + /* We either errored above or got paused; get out */ \ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ + return (ER); \ + } \ + } \ +} while (0) + +/* Run the notify callback FOR and consume the current byte */ +#define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1) + +/* Run the notify callback FOR and don't consume the current byte */ +#define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data) + +/* Run data callback FOR with LEN bytes, returning ER if it fails */ +#define CALLBACK_DATA_(FOR, LEN, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (FOR##_mark) { \ + if (settings->on_##FOR) { \ + if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + \ + /* We either errored above or got paused; get out */ \ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ + return (ER); \ + } \ + } \ + FOR##_mark = NULL; \ + } \ +} while (0) + +/* Run the data callback FOR and consume the current byte */ +#define CALLBACK_DATA(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1) + +/* Run the data callback FOR and don't consume the current byte */ +#define CALLBACK_DATA_NOADVANCE(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data) + +/* Set the mark FOR; non-destructive if mark is already set */ +#define MARK(FOR) \ +do { \ + if (!FOR##_mark) { \ + FOR##_mark = p; \ + } \ +} while (0) + + +#define PROXY_CONNECTION "proxy-connection" +#define CONNECTION "connection" +#define CONTENT_LENGTH "content-length" +#define TRANSFER_ENCODING "transfer-encoding" +#define UPGRADE "upgrade" +#define CHUNKED "chunked" +#define KEEP_ALIVE "keep-alive" +#define CLOSE "close" + + +static const char *method_strings[] = + { +#define XX(num, name, string) #string, + HTTP_METHOD_MAP(XX) +#undef XX + }; + + +/* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ +static const char tokens[256] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0, '!', 0, '#', '$', '%', '&', '\'', +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 0, 0, '*', '+', 0, '-', '.', 0, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + '0', '1', '2', '3', '4', '5', '6', '7', +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + '8', '9', 0, 0, 0, 0, 0, 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 'x', 'y', 'z', 0, 0, 0, '^', '_', +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 'x', 'y', 'z', 0, '|', 0, '~', 0 }; + + +static const int8_t unhex[256] = + {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-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, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + }; + + +#if HTTP_PARSER_STRICT +# define T(v) 0 +#else +# define T(v) v +#endif + + +static const uint8_t normal_url_char[32] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0 | T(2) | 0 | 0 | T(16) | 0 | 0 | 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0 | 2 | 4 | 0 | 16 | 32 | 64 | 128, +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, }; + +#undef T + +enum state + { s_dead = 1 /* important that this is > 0 */ + + , s_start_req_or_res + , s_res_or_resp_H + , s_start_res + , s_res_H + , s_res_HT + , s_res_HTT + , s_res_HTTP + , s_res_first_http_major + , s_res_http_major + , s_res_first_http_minor + , s_res_http_minor + , s_res_first_status_code + , s_res_status_code + , s_res_status + , s_res_line_almost_done + + , s_start_req + + , s_req_method + , s_req_spaces_before_url + , s_req_schema + , s_req_schema_slash + , s_req_schema_slash_slash + , s_req_server_start + , s_req_server + , s_req_server_with_at + , s_req_path + , s_req_query_string_start + , s_req_query_string + , s_req_fragment_start + , s_req_fragment + , s_req_http_start + , s_req_http_H + , s_req_http_HT + , s_req_http_HTT + , s_req_http_HTTP + , s_req_first_http_major + , s_req_http_major + , s_req_first_http_minor + , s_req_http_minor + , s_req_line_almost_done + + , s_header_field_start + , s_header_field + , s_header_value_start + , s_header_value + , s_header_value_lws + + , s_header_almost_done + + , s_chunk_size_start + , s_chunk_size + , s_chunk_parameters + , s_chunk_size_almost_done + + , s_headers_almost_done + , s_headers_done + + /* Important: 's_headers_done' must be the last 'header' state. All + * states beyond this must be 'body' states. It is used for overflow + * checking. See the PARSING_HEADER() macro. + */ + + , s_chunk_data + , s_chunk_data_almost_done + , s_chunk_data_done + + , s_body_identity + , s_body_identity_eof + + , s_message_done + }; + + +#define PARSING_HEADER(state) (state <= s_headers_done) + + +enum header_states + { h_general = 0 + , h_C + , h_CO + , h_CON + + , h_matching_connection + , h_matching_proxy_connection + , h_matching_content_length + , h_matching_transfer_encoding + , h_matching_upgrade + + , h_connection + , h_content_length + , h_transfer_encoding + , h_upgrade + + , h_matching_transfer_encoding_chunked + , h_matching_connection_keep_alive + , h_matching_connection_close + + , h_transfer_encoding_chunked + , h_connection_keep_alive + , h_connection_close + }; + +enum http_host_state + { + s_http_host_dead = 1 + , s_http_userinfo_start + , s_http_userinfo + , s_http_host_start + , s_http_host_v6_start + , s_http_host + , s_http_host_v6 + , s_http_host_v6_end + , s_http_host_port_start + , s_http_host_port +}; + +/* Macros for character classes; depends on strict-mode */ +#define CR '\r' +#define LF '\n' +#define LOWER(c) (unsigned char)(c | 0x20) +#define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z') +#define IS_NUM(c) ((c) >= '0' && (c) <= '9') +#define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c)) +#define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f')) +#define IS_MARK(c) ((c) == '-' || (c) == '_' || (c) == '.' || \ + (c) == '!' || (c) == '~' || (c) == '*' || (c) == '\'' || (c) == '(' || \ + (c) == ')') +#define IS_USERINFO_CHAR(c) (IS_ALPHANUM(c) || IS_MARK(c) || (c) == '%' || \ + (c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \ + (c) == '$' || (c) == ',') + +#if HTTP_PARSER_STRICT +#define TOKEN(c) (tokens[(unsigned char)c]) +#define IS_URL_CHAR(c) (BIT_AT(normal_url_char, (unsigned char)c)) +#define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-') +#else +#define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c]) +#define IS_URL_CHAR(c) \ + (BIT_AT(normal_url_char, (unsigned char)c) || ((c) & 0x80)) +#define IS_HOST_CHAR(c) \ + (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_') +#endif + + +#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res) + + +#if HTTP_PARSER_STRICT +# define STRICT_CHECK(cond) \ +do { \ + if (cond) { \ + SET_ERRNO(HPE_STRICT); \ + goto error; \ + } \ +} while (0) +# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead) +#else +# define STRICT_CHECK(cond) +# define NEW_MESSAGE() start_state +#endif + + +/* Map errno values to strings for human-readable output */ +#define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s }, +static struct { + const char *name; + const char *description; +} http_strerror_tab[] = { + HTTP_ERRNO_MAP(HTTP_STRERROR_GEN) +}; +#undef HTTP_STRERROR_GEN + +int http_message_needs_eof(const http_parser *parser); + +/* Our URL parser. + * + * This is designed to be shared by http_parser_execute() for URL validation, + * hence it has a state transition + byte-for-byte interface. In addition, it + * is meant to be embedded in http_parser_parse_url(), which does the dirty + * work of turning state transitions URL components for its API. + * + * This function should only be invoked with non-space characters. It is + * assumed that the caller cares about (and can detect) the transition between + * URL and non-URL states by looking for these. + */ +static enum state +parse_url_char(enum state s, const char ch) +{ + if (ch == ' ' || ch == '\r' || ch == '\n') { + return s_dead; + } + +#if HTTP_PARSER_STRICT + if (ch == '\t' || ch == '\f') { + return s_dead; + } +#endif + + switch (s) { + case s_req_spaces_before_url: + /* Proxied requests are followed by scheme of an absolute URI (alpha). + * All methods except CONNECT are followed by '/' or '*'. + */ + + if (ch == '/' || ch == '*') { + return s_req_path; + } + + if (IS_ALPHA(ch)) { + return s_req_schema; + } + + break; + + case s_req_schema: + if (IS_ALPHA(ch)) { + return s; + } + + if (ch == ':') { + return s_req_schema_slash; + } + + break; + + case s_req_schema_slash: + if (ch == '/') { + return s_req_schema_slash_slash; + } + + break; + + case s_req_schema_slash_slash: + if (ch == '/') { + return s_req_server_start; + } + + break; + + case s_req_server_with_at: + if (ch == '@') { + return s_dead; + } + + /* FALLTHROUGH */ + case s_req_server_start: + case s_req_server: + if (ch == '/') { + return s_req_path; + } + + if (ch == '?') { + return s_req_query_string_start; + } + + if (ch == '@') { + return s_req_server_with_at; + } + + if (IS_USERINFO_CHAR(ch) || ch == '[' || ch == ']') { + return s_req_server; + } + + break; + + case s_req_path: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + return s_req_query_string_start; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_query_string_start: + case s_req_query_string: + if (IS_URL_CHAR(ch)) { + return s_req_query_string; + } + + switch (ch) { + case '?': + /* allow extra '?' in query string */ + return s_req_query_string; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_fragment_start: + if (IS_URL_CHAR(ch)) { + return s_req_fragment; + } + + switch (ch) { + case '?': + return s_req_fragment; + + case '#': + return s; + } + + break; + + case s_req_fragment: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + case '#': + return s; + } + + break; + + default: + break; + } + + /* We should never fall out of the switch above unless there's an error */ + return s_dead; +} + +size_t http_parser_execute (http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len) +{ + char c, ch; + int8_t unhex_val; + const char *p = data; + const char *header_field_mark = 0; + const char *header_value_mark = 0; + const char *url_mark = 0; + const char *body_mark = 0; + + /* We're in an error state. Don't bother doing anything. */ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + return 0; + } + + if (len == 0) { + switch (parser->state) { + case s_body_identity_eof: + /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if + * we got paused. + */ + CALLBACK_NOTIFY_NOADVANCE(message_complete); + return 0; + + case s_dead: + case s_start_req_or_res: + case s_start_res: + case s_start_req: + return 0; + + default: + SET_ERRNO(HPE_INVALID_EOF_STATE); + return 1; + } + } + + + if (parser->state == s_header_field) + header_field_mark = data; + if (parser->state == s_header_value) + header_value_mark = data; + switch (parser->state) { + case s_req_path: + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + case s_req_server: + case s_req_server_with_at: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + url_mark = data; + break; + } + + for (p=data; p != data + len; p++) { + ch = *p; + + if (PARSING_HEADER(parser->state)) { + ++parser->nread; + /* Buffer overflow attack */ + if (parser->nread > HTTP_MAX_HEADER_SIZE) { + SET_ERRNO(HPE_HEADER_OVERFLOW); + goto error; + } + } + + reexecute_byte: + switch (parser->state) { + + case s_dead: + /* this state is used after a 'Connection: close' message + * the parser will error out if it reads another message + */ + if (ch == CR || ch == LF) + break; + + SET_ERRNO(HPE_CLOSED_CONNECTION); + goto error; + + case s_start_req_or_res: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + if (ch == 'H') { + parser->state = s_res_or_resp_H; + + CALLBACK_NOTIFY(message_begin); + } else { + parser->type = HTTP_REQUEST; + parser->state = s_start_req; + goto reexecute_byte; + } + + break; + } + + case s_res_or_resp_H: + if (ch == 'T') { + parser->type = HTTP_RESPONSE; + parser->state = s_res_HT; + } else { + if (ch != 'E') { + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + parser->type = HTTP_REQUEST; + parser->method = HTTP_HEAD; + parser->index = 2; + parser->state = s_req_method; + } + break; + + case s_start_res: + { + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + switch (ch) { + case 'H': + parser->state = s_res_H; + break; + + case CR: + case LF: + break; + + default: + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + CALLBACK_NOTIFY(message_begin); + break; + } + + case s_res_H: + STRICT_CHECK(ch != 'T'); + parser->state = s_res_HT; + break; + + case s_res_HT: + STRICT_CHECK(ch != 'T'); + parser->state = s_res_HTT; + break; + + case s_res_HTT: + STRICT_CHECK(ch != 'P'); + parser->state = s_res_HTTP; + break; + + case s_res_HTTP: + STRICT_CHECK(ch != '/'); + parser->state = s_res_first_http_major; + break; + + case s_res_first_http_major: + if (ch < '0' || ch > '9') { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + parser->state = s_res_http_major; + break; + + /* major HTTP version or dot */ + case s_res_http_major: + { + if (ch == '.') { + parser->state = s_res_first_http_minor; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major *= 10; + parser->http_major += ch - '0'; + + if (parser->http_major > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* first digit of minor HTTP version */ + case s_res_first_http_minor: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + parser->state = s_res_http_minor; + break; + + /* minor HTTP version or end of request line */ + case s_res_http_minor: + { + if (ch == ' ') { + parser->state = s_res_first_status_code; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor *= 10; + parser->http_minor += ch - '0'; + + if (parser->http_minor > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + case s_res_first_status_code: + { + if (!IS_NUM(ch)) { + if (ch == ' ') { + break; + } + + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + parser->status_code = ch - '0'; + parser->state = s_res_status_code; + break; + } + + case s_res_status_code: + { + if (!IS_NUM(ch)) { + switch (ch) { + case ' ': + parser->state = s_res_status; + break; + case CR: + parser->state = s_res_line_almost_done; + break; + case LF: + parser->state = s_header_field_start; + break; + default: + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + break; + } + + parser->status_code *= 10; + parser->status_code += ch - '0'; + + if (parser->status_code > 999) { + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + + break; + } + + case s_res_status: + /* the human readable status. e.g. "NOT FOUND" + * we are not humans so just ignore this */ + if (ch == CR) { + parser->state = s_res_line_almost_done; + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + break; + } + break; + + case s_res_line_almost_done: + STRICT_CHECK(ch != LF); + parser->state = s_header_field_start; + CALLBACK_NOTIFY(status_complete); + break; + + case s_start_req: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + if (!IS_ALPHA(ch)) { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + parser->method = (enum http_method) 0; + parser->index = 1; + switch (ch) { + case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break; + case 'D': parser->method = HTTP_DELETE; break; + case 'G': parser->method = HTTP_GET; break; + case 'H': parser->method = HTTP_HEAD; break; + case 'L': parser->method = HTTP_LOCK; break; + case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ break; + case 'N': parser->method = HTTP_NOTIFY; break; + case 'O': parser->method = HTTP_OPTIONS; break; + case 'P': parser->method = HTTP_POST; + /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ + break; + case 'R': parser->method = HTTP_REPORT; break; + case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break; + case 'T': parser->method = HTTP_TRACE; break; + case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break; + default: + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + parser->state = s_req_method; + + CALLBACK_NOTIFY(message_begin); + + break; + } + + case s_req_method: + { + const char *matcher; + if (ch == '\0') { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + matcher = method_strings[parser->method]; + if (ch == ' ' && matcher[parser->index] == '\0') { + parser->state = s_req_spaces_before_url; + } else if (ch == matcher[parser->index]) { + ; /* nada */ + } else if (parser->method == HTTP_CONNECT) { + if (parser->index == 1 && ch == 'H') { + parser->method = HTTP_CHECKOUT; + } else if (parser->index == 2 && ch == 'P') { + parser->method = HTTP_COPY; + } else { + goto error; + } + } else if (parser->method == HTTP_MKCOL) { + if (parser->index == 1 && ch == 'O') { + parser->method = HTTP_MOVE; + } else if (parser->index == 1 && ch == 'E') { + parser->method = HTTP_MERGE; + } else if (parser->index == 1 && ch == '-') { + parser->method = HTTP_MSEARCH; + } else if (parser->index == 2 && ch == 'A') { + parser->method = HTTP_MKACTIVITY; + } else { + goto error; + } + } else if (parser->method == HTTP_SUBSCRIBE) { + if (parser->index == 1 && ch == 'E') { + parser->method = HTTP_SEARCH; + } else { + goto error; + } + } else if (parser->index == 1 && parser->method == HTTP_POST) { + if (ch == 'R') { + parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */ + } else if (ch == 'U') { + parser->method = HTTP_PUT; /* or HTTP_PURGE */ + } else if (ch == 'A') { + parser->method = HTTP_PATCH; + } else { + goto error; + } + } else if (parser->index == 2) { + if (parser->method == HTTP_PUT) { + if (ch == 'R') parser->method = HTTP_PURGE; + } else if (parser->method == HTTP_UNLOCK) { + if (ch == 'S') parser->method = HTTP_UNSUBSCRIBE; + } + } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') { + parser->method = HTTP_PROPPATCH; + } else { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + ++parser->index; + break; + } + + case s_req_spaces_before_url: + { + if (ch == ' ') break; + + MARK(url); + if (parser->method == HTTP_CONNECT) { + parser->state = s_req_server_start; + } + + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + + break; + } + + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + { + switch (ch) { + /* No whitespace allowed here */ + case ' ': + case CR: + case LF: + SET_ERRNO(HPE_INVALID_URL); + goto error; + default: + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + + break; + } + + case s_req_server: + case s_req_server_with_at: + case s_req_path: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + { + switch (ch) { + case ' ': + parser->state = s_req_http_start; + CALLBACK_DATA(url); + break; + case CR: + case LF: + parser->http_major = 0; + parser->http_minor = 9; + parser->state = (ch == CR) ? + s_req_line_almost_done : + s_header_field_start; + CALLBACK_DATA(url); + break; + default: + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + break; + } + + case s_req_http_start: + switch (ch) { + case 'H': + parser->state = s_req_http_H; + break; + case ' ': + break; + default: + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + break; + + case s_req_http_H: + STRICT_CHECK(ch != 'T'); + parser->state = s_req_http_HT; + break; + + case s_req_http_HT: + STRICT_CHECK(ch != 'T'); + parser->state = s_req_http_HTT; + break; + + case s_req_http_HTT: + STRICT_CHECK(ch != 'P'); + parser->state = s_req_http_HTTP; + break; + + case s_req_http_HTTP: + STRICT_CHECK(ch != '/'); + parser->state = s_req_first_http_major; + break; + + /* first digit of major HTTP version */ + case s_req_first_http_major: + if (ch < '1' || ch > '9') { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + parser->state = s_req_http_major; + break; + + /* major HTTP version or dot */ + case s_req_http_major: + { + if (ch == '.') { + parser->state = s_req_first_http_minor; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major *= 10; + parser->http_major += ch - '0'; + + if (parser->http_major > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* first digit of minor HTTP version */ + case s_req_first_http_minor: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + parser->state = s_req_http_minor; + break; + + /* minor HTTP version or end of request line */ + case s_req_http_minor: + { + if (ch == CR) { + parser->state = s_req_line_almost_done; + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + break; + } + + /* XXX allow spaces after digit? */ + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor *= 10; + parser->http_minor += ch - '0'; + + if (parser->http_minor > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* end of request line */ + case s_req_line_almost_done: + { + if (ch != LF) { + SET_ERRNO(HPE_LF_EXPECTED); + goto error; + } + + parser->state = s_header_field_start; + break; + } + + case s_header_field_start: + { + if (ch == CR) { + parser->state = s_headers_almost_done; + break; + } + + if (ch == LF) { + /* they might be just sending \n instead of \r\n so this would be + * the second \n to denote the end of headers*/ + parser->state = s_headers_almost_done; + goto reexecute_byte; + } + + c = TOKEN(ch); + + if (!c) { + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + MARK(header_field); + + parser->index = 0; + parser->state = s_header_field; + + switch (c) { + case 'c': + parser->header_state = h_C; + break; + + case 'p': + parser->header_state = h_matching_proxy_connection; + break; + + case 't': + parser->header_state = h_matching_transfer_encoding; + break; + + case 'u': + parser->header_state = h_matching_upgrade; + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_field: + { + c = TOKEN(ch); + + if (c) { + switch (parser->header_state) { + case h_general: + break; + + case h_C: + parser->index++; + parser->header_state = (c == 'o' ? h_CO : h_general); + break; + + case h_CO: + parser->index++; + parser->header_state = (c == 'n' ? h_CON : h_general); + break; + + case h_CON: + parser->index++; + switch (c) { + case 'n': + parser->header_state = h_matching_connection; + break; + case 't': + parser->header_state = h_matching_content_length; + break; + default: + parser->header_state = h_general; + break; + } + break; + + /* connection */ + + case h_matching_connection: + parser->index++; + if (parser->index > sizeof(CONNECTION)-1 + || c != CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* proxy-connection */ + + case h_matching_proxy_connection: + parser->index++; + if (parser->index > sizeof(PROXY_CONNECTION)-1 + || c != PROXY_CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(PROXY_CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* content-length */ + + case h_matching_content_length: + parser->index++; + if (parser->index > sizeof(CONTENT_LENGTH)-1 + || c != CONTENT_LENGTH[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONTENT_LENGTH)-2) { + parser->header_state = h_content_length; + } + break; + + /* transfer-encoding */ + + case h_matching_transfer_encoding: + parser->index++; + if (parser->index > sizeof(TRANSFER_ENCODING)-1 + || c != TRANSFER_ENCODING[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) { + parser->header_state = h_transfer_encoding; + } + break; + + /* upgrade */ + + case h_matching_upgrade: + parser->index++; + if (parser->index > sizeof(UPGRADE)-1 + || c != UPGRADE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(UPGRADE)-2) { + parser->header_state = h_upgrade; + } + break; + + case h_connection: + case h_content_length: + case h_transfer_encoding: + case h_upgrade: + if (ch != ' ') parser->header_state = h_general; + break; + + default: + assert(0 && "Unknown header_state"); + break; + } + break; + } + + if (ch == ':') { + parser->state = s_header_value_start; + CALLBACK_DATA(header_field); + break; + } + + if (ch == CR) { + parser->state = s_header_almost_done; + CALLBACK_DATA(header_field); + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + CALLBACK_DATA(header_field); + break; + } + + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + case s_header_value_start: + { + if (ch == ' ' || ch == '\t') break; + + MARK(header_value); + + parser->state = s_header_value; + parser->index = 0; + + if (ch == CR) { + parser->header_state = h_general; + parser->state = s_header_almost_done; + CALLBACK_DATA(header_value); + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + CALLBACK_DATA(header_value); + break; + } + + c = LOWER(ch); + + switch (parser->header_state) { + case h_upgrade: + parser->flags |= F_UPGRADE; + parser->header_state = h_general; + break; + + case h_transfer_encoding: + /* looking for 'Transfer-Encoding: chunked' */ + if ('c' == c) { + parser->header_state = h_matching_transfer_encoding_chunked; + } else { + parser->header_state = h_general; + } + break; + + case h_content_length: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = ch - '0'; + break; + + case h_connection: + /* looking for 'Connection: keep-alive' */ + if (c == 'k') { + parser->header_state = h_matching_connection_keep_alive; + /* looking for 'Connection: close' */ + } else if (c == 'c') { + parser->header_state = h_matching_connection_close; + } else { + parser->header_state = h_general; + } + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_value: + { + + if (ch == CR) { + parser->state = s_header_almost_done; + CALLBACK_DATA(header_value); + break; + } + + if (ch == LF) { + parser->state = s_header_almost_done; + CALLBACK_DATA_NOADVANCE(header_value); + goto reexecute_byte; + } + + c = LOWER(ch); + + switch (parser->header_state) { + case h_general: + break; + + case h_connection: + case h_transfer_encoding: + assert(0 && "Shouldn't get here."); + break; + + case h_content_length: + { + uint64_t t; + + if (ch == ' ') break; + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + t = parser->content_length; + t *= 10; + t += ch - '0'; + + /* Overflow? */ + if (t < parser->content_length || t == ULLONG_MAX) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = t; + break; + } + + /* Transfer-Encoding: chunked */ + case h_matching_transfer_encoding_chunked: + parser->index++; + if (parser->index > sizeof(CHUNKED)-1 + || c != CHUNKED[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CHUNKED)-2) { + parser->header_state = h_transfer_encoding_chunked; + } + break; + + /* looking for 'Connection: keep-alive' */ + case h_matching_connection_keep_alive: + parser->index++; + if (parser->index > sizeof(KEEP_ALIVE)-1 + || c != KEEP_ALIVE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(KEEP_ALIVE)-2) { + parser->header_state = h_connection_keep_alive; + } + break; + + /* looking for 'Connection: close' */ + case h_matching_connection_close: + parser->index++; + if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CLOSE)-2) { + parser->header_state = h_connection_close; + } + break; + + case h_transfer_encoding_chunked: + case h_connection_keep_alive: + case h_connection_close: + if (ch != ' ') parser->header_state = h_general; + break; + + default: + parser->state = s_header_value; + parser->header_state = h_general; + break; + } + break; + } + + case s_header_almost_done: + { + STRICT_CHECK(ch != LF); + + parser->state = s_header_value_lws; + + switch (parser->header_state) { + case h_connection_keep_alive: + parser->flags |= F_CONNECTION_KEEP_ALIVE; + break; + case h_connection_close: + parser->flags |= F_CONNECTION_CLOSE; + break; + case h_transfer_encoding_chunked: + parser->flags |= F_CHUNKED; + break; + default: + break; + } + + break; + } + + case s_header_value_lws: + { + if (ch == ' ' || ch == '\t') + parser->state = s_header_value_start; + else + { + parser->state = s_header_field_start; + goto reexecute_byte; + } + break; + } + + case s_headers_almost_done: + { + STRICT_CHECK(ch != LF); + + if (parser->flags & F_TRAILING) { + /* End of a chunked request */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + break; + } + + parser->state = s_headers_done; + + /* Set this here so that on_headers_complete() callbacks can see it */ + parser->upgrade = + (parser->flags & F_UPGRADE || parser->method == HTTP_CONNECT); + + /* Here we call the headers_complete callback. This is somewhat + * different than other callbacks because if the user returns 1, we + * will interpret that as saying that this message has no body. This + * is needed for the annoying case of recieving a response to a HEAD + * request. + * + * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so + * we have to simulate it by handling a change in errno below. + */ + if (settings->on_headers_complete) { + switch (settings->on_headers_complete(parser)) { + case 0: + break; + + case 1: + parser->flags |= F_SKIPBODY; + break; + + default: + SET_ERRNO(HPE_CB_headers_complete); + return p - data; /* Error */ + } + } + + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + return p - data; + } + + goto reexecute_byte; + } + + case s_headers_done: + { + STRICT_CHECK(ch != LF); + + parser->nread = 0; + + /* Exit, the rest of the connect is in a different protocol. */ + if (parser->upgrade) { + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + return (p - data) + 1; + } + + if (parser->flags & F_SKIPBODY) { + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else if (parser->flags & F_CHUNKED) { + /* chunked encoding - ignore Content-Length header */ + parser->state = s_chunk_size_start; + } else { + if (parser->content_length == 0) { + /* Content-Length header given but zero: Content-Length: 0\r\n */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else if (parser->content_length != ULLONG_MAX) { + /* Content-Length header given and non-zero */ + parser->state = s_body_identity; + } else { + if (parser->type == HTTP_REQUEST || + !http_message_needs_eof(parser)) { + /* Assume content-length 0 - read the next */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else { + /* Read body until EOF */ + parser->state = s_body_identity_eof; + } + } + } + + break; + } + + case s_body_identity: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* The difference between advancing content_length and p is because + * the latter will automaticaly advance on the next loop iteration. + * Further, if content_length ends up at 0, we want to see the last + * byte again for our message complete callback. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + parser->state = s_message_done; + + /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte. + * + * The alternative to doing this is to wait for the next byte to + * trigger the data callback, just as in every other case. The + * problem with this is that this makes it difficult for the test + * harness to distinguish between complete-on-EOF and + * complete-on-length. It's not clear that this distinction is + * important for applications, but let's keep it for now. + */ + CALLBACK_DATA_(body, p - body_mark + 1, p - data); + goto reexecute_byte; + } + + break; + } + + /* read until EOF */ + case s_body_identity_eof: + MARK(body); + p = data + len - 1; + + break; + + case s_message_done: + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + break; + + case s_chunk_size_start: + { + assert(parser->nread == 1); + assert(parser->flags & F_CHUNKED); + + unhex_val = unhex[(unsigned char)ch]; + if (unhex_val == -1) { + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + parser->content_length = unhex_val; + parser->state = s_chunk_size; + break; + } + + case s_chunk_size: + { + uint64_t t; + + assert(parser->flags & F_CHUNKED); + + if (ch == CR) { + parser->state = s_chunk_size_almost_done; + break; + } + + unhex_val = unhex[(unsigned char)ch]; + + if (unhex_val == -1) { + if (ch == ';' || ch == ' ') { + parser->state = s_chunk_parameters; + break; + } + + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + t = parser->content_length; + t *= 16; + t += unhex_val; + + /* Overflow? */ + if (t < parser->content_length || t == ULLONG_MAX) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = t; + break; + } + + case s_chunk_parameters: + { + assert(parser->flags & F_CHUNKED); + /* just ignore this shit. TODO check for overflow */ + if (ch == CR) { + parser->state = s_chunk_size_almost_done; + break; + } + break; + } + + case s_chunk_size_almost_done: + { + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + + parser->nread = 0; + + if (parser->content_length == 0) { + parser->flags |= F_TRAILING; + parser->state = s_header_field_start; + } else { + parser->state = s_chunk_data; + } + break; + } + + case s_chunk_data: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->flags & F_CHUNKED); + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* See the explanation in s_body_identity for why the content + * length and data pointers are managed this way. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + parser->state = s_chunk_data_almost_done; + } + + break; + } + + case s_chunk_data_almost_done: + assert(parser->flags & F_CHUNKED); + assert(parser->content_length == 0); + STRICT_CHECK(ch != CR); + parser->state = s_chunk_data_done; + CALLBACK_DATA(body); + break; + + case s_chunk_data_done: + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + parser->nread = 0; + parser->state = s_chunk_size_start; + break; + + default: + assert(0 && "unhandled state"); + SET_ERRNO(HPE_INVALID_INTERNAL_STATE); + goto error; + } + } + + /* Run callbacks for any marks that we have leftover after we ran our of + * bytes. There should be at most one of these set, so it's OK to invoke + * them in series (unset marks will not result in callbacks). + * + * We use the NOADVANCE() variety of callbacks here because 'p' has already + * overflowed 'data' and this allows us to correct for the off-by-one that + * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p' + * value that's in-bounds). + */ + + assert(((header_field_mark ? 1 : 0) + + (header_value_mark ? 1 : 0) + + (url_mark ? 1 : 0) + + (body_mark ? 1 : 0)) <= 1); + + CALLBACK_DATA_NOADVANCE(header_field); + CALLBACK_DATA_NOADVANCE(header_value); + CALLBACK_DATA_NOADVANCE(url); + CALLBACK_DATA_NOADVANCE(body); + + return len; + +error: + if (HTTP_PARSER_ERRNO(parser) == HPE_OK) { + SET_ERRNO(HPE_UNKNOWN); + } + + return (p - data); +} + + +/* Does the parser need to see an EOF to find the end of the message? */ +int +http_message_needs_eof (const http_parser *parser) +{ + if (parser->type == HTTP_REQUEST) { + return 0; + } + + /* See RFC 2616 section 4.4 */ + if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ + parser->status_code == 204 || /* No Content */ + parser->status_code == 304 || /* Not Modified */ + parser->flags & F_SKIPBODY) { /* response to a HEAD request */ + return 0; + } + + if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) { + return 0; + } + + return 1; +} + + +int +http_should_keep_alive (const http_parser *parser) +{ + if (parser->http_major > 0 && parser->http_minor > 0) { + /* HTTP/1.1 */ + if (parser->flags & F_CONNECTION_CLOSE) { + return 0; + } + } else { + /* HTTP/1.0 or earlier */ + if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { + return 0; + } + } + + return !http_message_needs_eof(parser); +} + + +const char * +http_method_str (enum http_method m) +{ + return ELEM_AT(method_strings, m, ""); +} + + +void +http_parser_init (http_parser *parser, enum http_parser_type t) +{ + void *data = parser->data; /* preserve application data */ + memset(parser, 0, sizeof(*parser)); + parser->data = data; + parser->type = t; + parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res)); + parser->http_errno = HPE_OK; +} + +const char * +http_errno_name(enum http_errno err) { + assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); + return http_strerror_tab[err].name; +} + +const char * +http_errno_description(enum http_errno err) { + assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); + return http_strerror_tab[err].description; +} + +static enum http_host_state +http_parse_host_char(enum http_host_state s, const char ch) { + switch(s) { + case s_http_userinfo: + case s_http_userinfo_start: + if (ch == '@') { + return s_http_host_start; + } + + if (IS_USERINFO_CHAR(ch)) { + return s_http_userinfo; + } + break; + + case s_http_host_start: + if (ch == '[') { + return s_http_host_v6_start; + } + + if (IS_HOST_CHAR(ch)) { + return s_http_host; + } + + break; + + case s_http_host: + if (IS_HOST_CHAR(ch)) { + return s_http_host; + } + + /* FALLTHROUGH */ + case s_http_host_v6_end: + if (ch == ':') { + return s_http_host_port_start; + } + + break; + + case s_http_host_v6: + if (ch == ']') { + return s_http_host_v6_end; + } + + /* FALLTHROUGH */ + case s_http_host_v6_start: + if (IS_HEX(ch) || ch == ':' || ch == '.') { + return s_http_host_v6; + } + + break; + + case s_http_host_port: + case s_http_host_port_start: + if (IS_NUM(ch)) { + return s_http_host_port; + } + + break; + + default: + break; + } + return s_http_host_dead; +} + +static int +http_parse_host(const char * buf, struct http_parser_url *u, int found_at) { + enum http_host_state s; + + const char *p; + size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len; + + u->field_data[UF_HOST].len = 0; + + s = found_at ? s_http_userinfo_start : s_http_host_start; + + for (p = buf + u->field_data[UF_HOST].off; p < buf + buflen; p++) { + enum http_host_state new_s = http_parse_host_char(s, *p); + + if (new_s == s_http_host_dead) { + return 1; + } + + switch(new_s) { + case s_http_host: + if (s != s_http_host) { + u->field_data[UF_HOST].off = p - buf; + } + u->field_data[UF_HOST].len++; + break; + + case s_http_host_v6: + if (s != s_http_host_v6) { + u->field_data[UF_HOST].off = p - buf; + } + u->field_data[UF_HOST].len++; + break; + + case s_http_host_port: + if (s != s_http_host_port) { + u->field_data[UF_PORT].off = p - buf; + u->field_data[UF_PORT].len = 0; + u->field_set |= (1 << UF_PORT); + } + u->field_data[UF_PORT].len++; + break; + + case s_http_userinfo: + if (s != s_http_userinfo) { + u->field_data[UF_USERINFO].off = p - buf ; + u->field_data[UF_USERINFO].len = 0; + u->field_set |= (1 << UF_USERINFO); + } + u->field_data[UF_USERINFO].len++; + break; + + default: + break; + } + s = new_s; + } + + /* Make sure we don't end somewhere unexpected */ + switch (s) { + case s_http_host_start: + case s_http_host_v6_start: + case s_http_host_v6: + case s_http_host_port_start: + case s_http_userinfo: + case s_http_userinfo_start: + return 1; + default: + break; + } + + return 0; +} + +int +http_parser_parse_url(const char *buf, size_t buflen, int is_connect, + struct http_parser_url *u) +{ + enum state s; + const char *p; + enum http_parser_url_fields uf, old_uf; + int found_at = 0; + + u->port = u->field_set = 0; + s = is_connect ? s_req_server_start : s_req_spaces_before_url; + uf = old_uf = UF_MAX; + + for (p = buf; p < buf + buflen; p++) { + s = parse_url_char(s, *p); + + /* Figure out the next field that we're operating on */ + switch (s) { + case s_dead: + return 1; + + /* Skip delimeters */ + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + case s_req_query_string_start: + case s_req_fragment_start: + continue; + + case s_req_schema: + uf = UF_SCHEMA; + break; + + case s_req_server_with_at: + found_at = 1; + + /* FALLTROUGH */ + case s_req_server: + uf = UF_HOST; + break; + + case s_req_path: + uf = UF_PATH; + break; + + case s_req_query_string: + uf = UF_QUERY; + break; + + case s_req_fragment: + uf = UF_FRAGMENT; + break; + + default: + assert(!"Unexpected state"); + return 1; + } + + /* Nothing's changed; soldier on */ + if (uf == old_uf) { + u->field_data[uf].len++; + continue; + } + + u->field_data[uf].off = p - buf; + u->field_data[uf].len = 1; + + u->field_set |= (1 << uf); + old_uf = uf; + } + + /* host must be present if there is a schema */ + /* parsing http:///toto will fail */ + if ((u->field_set & ((1 << UF_SCHEMA) | (1 << UF_HOST))) != 0) { + if (http_parse_host(buf, u, found_at) != 0) { + return 1; + } + } + + /* CONNECT requests can only contain "hostname:port" */ + if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) { + return 1; + } + + if (u->field_set & (1 << UF_PORT)) { + /* Don't bother with endp; we've already validated the string */ + unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10); + + /* Ports have a max value of 2^16 */ + if (v > 0xffff) { + return 1; + } + + u->port = (uint16_t) v; + } + + return 0; +} + +void +http_parser_pause(http_parser *parser, int paused) { + /* Users should only be pausing/unpausing a parser that is not in an error + * state. In non-debug builds, there's not much that we can do about this + * other than ignore it. + */ + if (HTTP_PARSER_ERRNO(parser) == HPE_OK || + HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) { + SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK); + } else { + assert(0 && "Attempting to pause parser in error state"); + } +} + +int +http_body_is_final(const struct http_parser *parser) { + return parser->state == s_message_done; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.gyp b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.gyp new file mode 100644 index 0000000..c6eada7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.gyp @@ -0,0 +1,79 @@ +# This file is used with the GYP meta build system. +# http://code.google.com/p/gyp/ +# To build try this: +# svn co http://gyp.googlecode.com/svn/trunk gyp +# ./gyp/gyp -f make --depth=`pwd` http_parser.gyp +# ./out/Debug/test +{ + 'target_defaults': { + 'default_configuration': 'Debug', + 'configurations': { + # TODO: hoist these out and put them somewhere common, because + # RuntimeLibrary MUST MATCH across the entire project + 'Debug': { + 'defines': [ 'DEBUG', '_DEBUG' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 1, # static debug + }, + }, + }, + 'Release': { + 'defines': [ 'NDEBUG' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 0, # static release + }, + }, + } + }, + 'msvs_settings': { + 'VCCLCompilerTool': { + }, + 'VCLibrarianTool': { + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'conditions': [ + ['OS == "win"', { + 'defines': [ + 'WIN32' + ], + }] + ], + }, + + 'targets': [ + { + 'target_name': 'http_parser', + 'type': 'static_library', + 'include_dirs': [ '.' ], + 'direct_dependent_settings': { + 'include_dirs': [ '.' ], + }, + 'defines': [ 'HTTP_PARSER_STRICT=0' ], + 'sources': [ './http_parser.c', ], + 'conditions': [ + ['OS=="win"', { + 'msvs_settings': { + 'VCCLCompilerTool': { + # Compile as C++. http_parser.c is actually C99, but C++ is + # close enough in this case. + 'CompileAs': 2, + }, + }, + }] + ], + }, + + { + 'target_name': 'test', + 'type': 'executable', + 'dependencies': [ 'http_parser' ], + 'sources': [ 'test.c' ] + } + ] +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.h b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.h new file mode 100644 index 0000000..2fff4bd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.h @@ -0,0 +1,304 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#ifndef http_parser_h +#define http_parser_h +#ifdef __cplusplus +extern "C" { +#endif + +#define HTTP_PARSER_VERSION_MAJOR 2 +#define HTTP_PARSER_VERSION_MINOR 0 + +#include +#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600) +#include +#include +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +#include +#endif + +/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run + * faster + */ +#ifndef HTTP_PARSER_STRICT +# define HTTP_PARSER_STRICT 1 +#endif + +/* Maximium header size allowed */ +#define HTTP_MAX_HEADER_SIZE (80*1024) + + +typedef struct http_parser http_parser; +typedef struct http_parser_settings http_parser_settings; + + +/* Callbacks should return non-zero to indicate an error. The parser will + * then halt execution. + * + * The one exception is on_headers_complete. In a HTTP_RESPONSE parser + * returning '1' from on_headers_complete will tell the parser that it + * should not expect a body. This is used when receiving a response to a + * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding: + * chunked' headers that indicate the presence of a body. + * + * http_data_cb does not return data chunks. It will be call arbitrarally + * many times for each string. E.G. you might get 10 callbacks for "on_url" + * each providing just a few characters more data. + */ +typedef int (*http_data_cb) (http_parser*, const char *at, size_t length); +typedef int (*http_cb) (http_parser*); + + +/* Request Methods */ +#define HTTP_METHOD_MAP(XX) \ + XX(0, DELETE, DELETE) \ + XX(1, GET, GET) \ + XX(2, HEAD, HEAD) \ + XX(3, POST, POST) \ + XX(4, PUT, PUT) \ + /* pathological */ \ + XX(5, CONNECT, CONNECT) \ + XX(6, OPTIONS, OPTIONS) \ + XX(7, TRACE, TRACE) \ + /* webdav */ \ + XX(8, COPY, COPY) \ + XX(9, LOCK, LOCK) \ + XX(10, MKCOL, MKCOL) \ + XX(11, MOVE, MOVE) \ + XX(12, PROPFIND, PROPFIND) \ + XX(13, PROPPATCH, PROPPATCH) \ + XX(14, SEARCH, SEARCH) \ + XX(15, UNLOCK, UNLOCK) \ + /* subversion */ \ + XX(16, REPORT, REPORT) \ + XX(17, MKACTIVITY, MKACTIVITY) \ + XX(18, CHECKOUT, CHECKOUT) \ + XX(19, MERGE, MERGE) \ + /* upnp */ \ + XX(20, MSEARCH, M-SEARCH) \ + XX(21, NOTIFY, NOTIFY) \ + XX(22, SUBSCRIBE, SUBSCRIBE) \ + XX(23, UNSUBSCRIBE, UNSUBSCRIBE) \ + /* RFC-5789 */ \ + XX(24, PATCH, PATCH) \ + XX(25, PURGE, PURGE) \ + +enum http_method + { +#define XX(num, name, string) HTTP_##name = num, + HTTP_METHOD_MAP(XX) +#undef XX + }; + + +enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }; + + +/* Flag values for http_parser.flags field */ +enum flags + { F_CHUNKED = 1 << 0 + , F_CONNECTION_KEEP_ALIVE = 1 << 1 + , F_CONNECTION_CLOSE = 1 << 2 + , F_TRAILING = 1 << 3 + , F_UPGRADE = 1 << 4 + , F_SKIPBODY = 1 << 5 + }; + + +/* Map for errno-related constants + * + * The provided argument should be a macro that takes 2 arguments. + */ +#define HTTP_ERRNO_MAP(XX) \ + /* No error */ \ + XX(OK, "success") \ + \ + /* Callback-related errors */ \ + XX(CB_message_begin, "the on_message_begin callback failed") \ + XX(CB_status_complete, "the on_status_complete callback failed") \ + XX(CB_url, "the on_url callback failed") \ + XX(CB_header_field, "the on_header_field callback failed") \ + XX(CB_header_value, "the on_header_value callback failed") \ + XX(CB_headers_complete, "the on_headers_complete callback failed") \ + XX(CB_body, "the on_body callback failed") \ + XX(CB_message_complete, "the on_message_complete callback failed") \ + \ + /* Parsing-related errors */ \ + XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \ + XX(HEADER_OVERFLOW, \ + "too many header bytes seen; overflow detected") \ + XX(CLOSED_CONNECTION, \ + "data received after completed connection: close message") \ + XX(INVALID_VERSION, "invalid HTTP version") \ + XX(INVALID_STATUS, "invalid HTTP status code") \ + XX(INVALID_METHOD, "invalid HTTP method") \ + XX(INVALID_URL, "invalid URL") \ + XX(INVALID_HOST, "invalid host") \ + XX(INVALID_PORT, "invalid port") \ + XX(INVALID_PATH, "invalid path") \ + XX(INVALID_QUERY_STRING, "invalid query string") \ + XX(INVALID_FRAGMENT, "invalid fragment") \ + XX(LF_EXPECTED, "LF character expected") \ + XX(INVALID_HEADER_TOKEN, "invalid character in header") \ + XX(INVALID_CONTENT_LENGTH, \ + "invalid character in content-length header") \ + XX(INVALID_CHUNK_SIZE, \ + "invalid character in chunk size header") \ + XX(INVALID_CONSTANT, "invalid constant string") \ + XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\ + XX(STRICT, "strict mode assertion failed") \ + XX(PAUSED, "parser is paused") \ + XX(UNKNOWN, "an unknown error occurred") + + +/* Define HPE_* values for each errno value above */ +#define HTTP_ERRNO_GEN(n, s) HPE_##n, +enum http_errno { + HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) +}; +#undef HTTP_ERRNO_GEN + + +/* Get an http_errno value from an http_parser */ +#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno) + + +struct http_parser { + /** PRIVATE **/ + unsigned char type : 2; /* enum http_parser_type */ + unsigned char flags : 6; /* F_* values from 'flags' enum; semi-public */ + unsigned char state; /* enum state from http_parser.c */ + unsigned char header_state; /* enum header_state from http_parser.c */ + unsigned char index; /* index into current matcher */ + + uint32_t nread; /* # bytes read in various scenarios */ + uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */ + + /** READ-ONLY **/ + unsigned short http_major; + unsigned short http_minor; + unsigned short status_code; /* responses only */ + unsigned char method; /* requests only */ + unsigned char http_errno : 7; + + /* 1 = Upgrade header was present and the parser has exited because of that. + * 0 = No upgrade header present. + * Should be checked when http_parser_execute() returns in addition to + * error checking. + */ + unsigned char upgrade : 1; + + /** PUBLIC **/ + void *data; /* A pointer to get hook to the "connection" or "socket" object */ +}; + + +struct http_parser_settings { + http_cb on_message_begin; + http_data_cb on_url; + http_cb on_status_complete; + http_data_cb on_header_field; + http_data_cb on_header_value; + http_cb on_headers_complete; + http_data_cb on_body; + http_cb on_message_complete; +}; + + +enum http_parser_url_fields + { UF_SCHEMA = 0 + , UF_HOST = 1 + , UF_PORT = 2 + , UF_PATH = 3 + , UF_QUERY = 4 + , UF_FRAGMENT = 5 + , UF_USERINFO = 6 + , UF_MAX = 7 + }; + + +/* Result structure for http_parser_parse_url(). + * + * Callers should index into field_data[] with UF_* values iff field_set + * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and + * because we probably have padding left over), we convert any port to + * a uint16_t. + */ +struct http_parser_url { + uint16_t field_set; /* Bitmask of (1 << UF_*) values */ + uint16_t port; /* Converted UF_PORT string */ + + struct { + uint16_t off; /* Offset into buffer in which field starts */ + uint16_t len; /* Length of run in buffer */ + } field_data[UF_MAX]; +}; + + +void http_parser_init(http_parser *parser, enum http_parser_type type); + + +size_t http_parser_execute(http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len); + + +/* If http_should_keep_alive() in the on_headers_complete or + * on_message_complete callback returns 0, then this should be + * the last message on the connection. + * If you are the server, respond with the "Connection: close" header. + * If you are the client, close the connection. + */ +int http_should_keep_alive(const http_parser *parser); + +/* Returns a string version of the HTTP method. */ +const char *http_method_str(enum http_method m); + +/* Return a string name of the given error */ +const char *http_errno_name(enum http_errno err); + +/* Return a string description of the given error */ +const char *http_errno_description(enum http_errno err); + +/* Parse a URL; return nonzero on failure */ +int http_parser_parse_url(const char *buf, size_t buflen, + int is_connect, + struct http_parser_url *u); + +/* Pause or un-pause the parser; a nonzero value pauses */ +void http_parser_pause(http_parser *parser, int paused); + +/* Checks if this is the final chunk of the body. */ +int http_body_is_final(const http_parser *parser); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/Http-parser.java.iml b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/Http-parser.java.iml new file mode 100644 index 0000000..741121a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/Http-parser.java.iml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/FieldData.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/FieldData.java new file mode 100644 index 0000000..774179f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/FieldData.java @@ -0,0 +1,41 @@ +package http_parser; + +public class FieldData { + public int off; + public int len; + + public FieldData(){} + + public FieldData(int off, int len){ + this.off = off; + this.len = len; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + FieldData fieldData = (FieldData) o; + + if (len != fieldData.len) return false; + if (off != fieldData.off) return false; + + return true; + } + + @Override + public int hashCode() { + int result = off; + result = 31 * result + len; + return result; + } + + @Override + public String toString() { + return "FieldData{" + + "off=" + off + + ", len=" + len + + '}'; + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPCallback.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPCallback.java new file mode 100644 index 0000000..5380b0f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPCallback.java @@ -0,0 +1,8 @@ +package http_parser; + +public abstract class HTTPCallback implements http_parser.lolevel.HTTPCallback{ + public int cb (http_parser.lolevel.HTTPParser parser) { + return this.cb((HTTPParser)parser); + } + public abstract int cb (HTTPParser parser); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPDataCallback.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPDataCallback.java new file mode 100644 index 0000000..bfe576f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPDataCallback.java @@ -0,0 +1,34 @@ +package http_parser; + +import java.nio.ByteBuffer; + +public abstract class HTTPDataCallback implements http_parser.lolevel.HTTPDataCallback{ + /* + Very raw and extremly foolhardy! DANGER! + The whole Buffer concept is difficult enough to grasp as it is, + we pass in a buffer with an arbitrary position. + + The interesting data is located at position pos and is len + bytes long. + + The contract of this callback is that the buffer is + returned in the state that it was passed in, so implementing + this require good citizenship, you'll need to remember the current + position, change the position to get at the data you're interested + in and then set the position back to how you found it... + + Therefore: there is an abstract implementation that implements + cb as described above, and provides a new callback + with signature @see cb(byte[], int, int) + */ + public int cb(http_parser.lolevel.HTTPParser p, ByteBuffer buf, int pos, int len) { + byte [] by = new byte[len]; + int saved = buf.position(); + buf.position(pos); + buf.get(by); + buf.position(saved); + return cb((HTTPParser)p, by, 0, len); + } + + public abstract int cb(HTTPParser p, byte[] by, int pos, int len); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPErrorCallback.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPErrorCallback.java new file mode 100644 index 0000000..a74206e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPErrorCallback.java @@ -0,0 +1,12 @@ +package http_parser; + + +import java.nio.ByteBuffer; + +public abstract class HTTPErrorCallback implements http_parser.lolevel.HTTPErrorCallback{ + public void cb (http_parser.lolevel.HTTPParser parser, String mes, ByteBuffer buf, int initial_position) { + this.cb((HTTPParser)parser, Util.error(mes, buf, initial_position)); + } + + public abstract void cb(HTTPParser parser, String error); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPException.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPException.java new file mode 100644 index 0000000..9ccaf14 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPException.java @@ -0,0 +1,9 @@ +package http_parser; + +@SuppressWarnings("serial") +public class HTTPException extends RuntimeException { + +public HTTPException(String mes) { + super(mes); + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPMethod.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPMethod.java new file mode 100644 index 0000000..7c080c1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPMethod.java @@ -0,0 +1,107 @@ +package http_parser; + +import java.nio.charset.Charset; + +public enum HTTPMethod { + HTTP_DELETE("DELETE")// = 0 + , HTTP_GET("GET") + , HTTP_HEAD("HEAD") + , HTTP_POST("POST") + , HTTP_PUT("PUT") + , HTTP_PATCH("PATCH") + /* pathological */ + , HTTP_CONNECT("CONNECT") + , HTTP_OPTIONS("OPTIONS") + , HTTP_TRACE("TRACE") + /* webdav */ + , HTTP_COPY("COPY") + , HTTP_LOCK("LOCK") + , HTTP_MKCOL("MKCOL") + , HTTP_MOVE("MOVE") + , HTTP_PROPFIND("PROPFIND") + , HTTP_PROPPATCH("PROPPATCH") + , HTTP_UNLOCK("UNLOCK") + , HTTP_REPORT("REPORT") + , HTTP_MKACTIVITY("MKACTIVITY") + , HTTP_CHECKOUT("CHECKOUT") + , HTTP_MERGE("MERGE") + , HTTP_MSEARCH("M-SEARCH") + , HTTP_NOTIFY("NOTIFY") + , HTTP_SUBSCRIBE("SUBSCRIBE") + , HTTP_UNSUBSCRIBE("UNSUBSCRIBE") + , HTTP_PURGE("PURGE") + ; + + private static Charset ASCII; + static { + ASCII = Charset.forName("US-ASCII");; + } + public byte[] bytes; + + HTTPMethod(String name) { + // good grief, Charlie Brown, the following is necessary because + // java is retarded: + // illegal reference to static field from initializer + // this.bytes = name.getBytes(ASCII); + // yet it's not illegal to reference static fields from + // methods called from initializer. + init(name); + } + public static HTTPMethod parse(String s) { + if ("HTTP_DELETE".equalsIgnoreCase(s)) {return HTTP_DELETE;} + else if ("DELETE".equalsIgnoreCase(s)) {return HTTP_DELETE;} + else if ("HTTP_GET".equalsIgnoreCase(s)) {return HTTP_GET;} + else if ("GET".equalsIgnoreCase(s)) {return HTTP_GET;} + else if ("HTTP_HEAD".equalsIgnoreCase(s)) {return HTTP_HEAD;} + else if ("HEAD".equalsIgnoreCase(s)) {return HTTP_HEAD;} + else if ("HTTP_POST".equalsIgnoreCase(s)) {return HTTP_POST;} + else if ("POST".equalsIgnoreCase(s)) {return HTTP_POST;} + else if ("HTTP_PUT".equalsIgnoreCase(s)) {return HTTP_PUT;} + else if ("PUT".equalsIgnoreCase(s)) {return HTTP_PUT;} + else if ("HTTP_PATCH".equalsIgnoreCase(s)) {return HTTP_PATCH;} + else if ("PATCH".equalsIgnoreCase(s)) {return HTTP_PATCH;} + else if ("HTTP_CONNECT".equalsIgnoreCase(s)) {return HTTP_CONNECT;} + else if ("CONNECT".equalsIgnoreCase(s)) {return HTTP_CONNECT;} + else if ("HTTP_OPTIONS".equalsIgnoreCase(s)) {return HTTP_OPTIONS;} + else if ("OPTIONS".equalsIgnoreCase(s)) {return HTTP_OPTIONS;} + else if ("HTTP_TRACE".equalsIgnoreCase(s)) {return HTTP_TRACE;} + else if ("TRACE".equalsIgnoreCase(s)) {return HTTP_TRACE;} + else if ("HTTP_COPY".equalsIgnoreCase(s)) {return HTTP_COPY;} + else if ("COPY".equalsIgnoreCase(s)) {return HTTP_COPY;} + else if ("HTTP_LOCK".equalsIgnoreCase(s)) {return HTTP_LOCK;} + else if ("LOCK".equalsIgnoreCase(s)) {return HTTP_LOCK;} + else if ("HTTP_MKCOL".equalsIgnoreCase(s)) {return HTTP_MKCOL;} + else if ("MKCOL".equalsIgnoreCase(s)) {return HTTP_MKCOL;} + else if ("HTTP_MOVE".equalsIgnoreCase(s)) {return HTTP_MOVE;} + else if ("MOVE".equalsIgnoreCase(s)) {return HTTP_MOVE;} + else if ("HTTP_PROPFIND".equalsIgnoreCase(s)){return HTTP_PROPFIND;} + else if ("PROPFIND".equalsIgnoreCase(s)) {return HTTP_PROPFIND;} + else if ("HTTP_PROPPATCH".equalsIgnoreCase(s)){return HTTP_PROPPATCH;} + else if ("PROPPATCH".equalsIgnoreCase(s)) {return HTTP_PROPPATCH;} + else if ("HTTP_UNLOCK".equalsIgnoreCase(s)) {return HTTP_UNLOCK;} + else if ("UNLOCK".equalsIgnoreCase(s)) {return HTTP_UNLOCK;} + else if ("HTTP_REPORT".equalsIgnoreCase(s)) {return HTTP_REPORT;} + else if ("REPORT".equalsIgnoreCase(s)){return HTTP_REPORT;} + else if ("HTTP_MKACTIVITY".equalsIgnoreCase(s)) {return HTTP_MKACTIVITY;} + else if ("MKACTIVITY".equalsIgnoreCase(s)){return HTTP_MKACTIVITY;} + else if ("HTTP_CHECKOUT".equalsIgnoreCase(s)) {return HTTP_CHECKOUT;} + else if ("CHECKOUT".equalsIgnoreCase(s)){return HTTP_CHECKOUT;} + else if ("HTTP_MERGE".equalsIgnoreCase(s)) {return HTTP_MERGE;} + else if ("MERGE".equalsIgnoreCase(s)){return HTTP_MERGE;} + else if ("HTTP_MSEARCH".equalsIgnoreCase(s)) {return HTTP_MSEARCH;} + else if ("M-SEARCH".equalsIgnoreCase(s)) {return HTTP_MSEARCH;} + else if ("HTTP_NOTIFY".equalsIgnoreCase(s)) {return HTTP_NOTIFY;} + else if ("NOTIFY".equalsIgnoreCase(s)) {return HTTP_NOTIFY;} + else if ("HTTP_SUBSCRIBE".equalsIgnoreCase(s)) {return HTTP_SUBSCRIBE;} + else if ("SUBSCRIBE".equalsIgnoreCase(s)) {return HTTP_SUBSCRIBE;} + else if ("HTTP_UNSUBSCRIBE".equalsIgnoreCase(s)) {return HTTP_UNSUBSCRIBE;} + else if ("UNSUBSCRIBE".equalsIgnoreCase(s)) {return HTTP_UNSUBSCRIBE;} + else if ("PATCH".equalsIgnoreCase(s)) {return HTTP_PATCH;} + else if ("PURGE".equalsIgnoreCase(s)) {return HTTP_PURGE;} + else {return null;} + } + void init (String name) { + ASCII = null == ASCII ? Charset.forName("US-ASCII") : ASCII; + this.bytes = name.getBytes(ASCII); + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParser.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParser.java new file mode 100644 index 0000000..7ab4fb4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParser.java @@ -0,0 +1,36 @@ +package http_parser; + +import java.nio.ByteBuffer; + +public class HTTPParser extends http_parser.lolevel.HTTPParser { + + public HTTPParser() { super(); } + public HTTPParser(ParserType type) { super(type); } + + public int getMajor() { + return super.http_major; + } + + public int getMinor() { + return super.http_minor; + } + + public int getStatusCode() { + return super.status_code; + } + + public HTTPMethod getHTTPMethod() { + return super.method; + } + + public boolean getUpgrade() { + return super.upgrade; + } + + public boolean shouldKeepAlive() { + return super.http_should_keep_alive(); + } + public void execute(ParserSettings settings, ByteBuffer data) { + this.execute(settings.getLoLevelSettings(), data); + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParserUrl.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParserUrl.java new file mode 100644 index 0000000..d371634 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParserUrl.java @@ -0,0 +1,76 @@ +package http_parser; + +import http_parser.lolevel.*; +import http_parser.lolevel.HTTPParser; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.util.Arrays; + +/** + */ +public class HTTPParserUrl { + + public int field_set; + public int port; + + public FieldData[] field_data = new FieldData[]{ + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0) + }; //UF_MAX + + public HTTPParserUrl(){} + + public HTTPParserUrl(int field_set, int port, FieldData[] field_data){ + this.field_set = field_set; + this.port = port; + this.field_data = field_data; + } + + public String getFieldValue(HTTPParser.UrlFields field, ByteBuffer data) throws UnsupportedEncodingException { + FieldData fd = this.field_data[field.getIndex()]; + if(fd.off == 0 & fd.len == 0) return ""; + byte[] dst = new byte[fd.len]; + int current_pos = data.position(); + data.position(fd.off); + data.get(dst,0,fd.len); + data.position(current_pos); + String v = new String(dst, "UTF8"); + return v; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + HTTPParserUrl that = (HTTPParserUrl) o; + + if (field_set != that.field_set) return false; + if (port != that.port) return false; + if (!Arrays.equals(field_data, that.field_data)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = field_set; + result = 31 * result + port; + result = 31 * result + Arrays.hashCode(field_data); + return result; + } + + @Override + public String toString() { + return "HTTPParserUrl{" + + "field_set=" + field_set + + ", port=" + port + + ", field_data=" + (field_data == null ? null : Arrays.asList(field_data)) + + '}'; + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserSettings.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserSettings.java new file mode 100644 index 0000000..9a5e6e9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserSettings.java @@ -0,0 +1,256 @@ +package http_parser; + + + +import primitive.collection.ByteList; + +public class ParserSettings extends http_parser.lolevel.ParserSettings { + + public HTTPCallback on_message_begin; + public HTTPDataCallback on_path; + public HTTPDataCallback on_query_string; + public HTTPDataCallback on_url; + public HTTPDataCallback on_fragment; + public HTTPCallback on_status_complete; + public HTTPDataCallback on_header_field; + public HTTPDataCallback on_header_value; + + public HTTPCallback on_headers_complete; + public HTTPDataCallback on_body; + public HTTPCallback on_message_complete; + + public HTTPErrorCallback on_error; + + private HTTPCallback _on_message_begin; + private HTTPDataCallback _on_path; + private HTTPDataCallback _on_query_string; + private HTTPDataCallback _on_url; + private HTTPDataCallback _on_fragment; + private HTTPCallback _on_status_complete; + private HTTPDataCallback _on_header_field; + private HTTPDataCallback _on_header_value; + private HTTPCallback _on_headers_complete; + private HTTPDataCallback _on_body; + private HTTPCallback _on_message_complete; + private HTTPErrorCallback _on_error; + + private http_parser.lolevel.ParserSettings settings; + + protected ByteList field = new ByteList(); + protected ByteList value = new ByteList(); + protected ByteList body = new ByteList(); + + public ParserSettings() { + this.settings = new http_parser.lolevel.ParserSettings(); + createMirrorCallbacks(); + attachCallbacks(); + } + + protected http_parser.lolevel.ParserSettings getLoLevelSettings() { + return this.settings; + } + + private void createMirrorCallbacks() { + this._on_message_begin = new HTTPCallback() { + public int cb(HTTPParser p) { + if (null != ParserSettings.this.on_message_begin) { + return ParserSettings.this.on_message_begin.cb(p); + } + return 0; + } + }; + this._on_path = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + if (null != ParserSettings.this.on_path) { + return ParserSettings.this.on_path.cb(p, by, pos, len); + } + return 0; + } + }; + this._on_query_string = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + if (null != ParserSettings.this.on_query_string) { + return ParserSettings.this.on_query_string.cb(p, by, pos, len); + } + return 0; + } + }; + this._on_url = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + if (null != ParserSettings.this.on_url) { + return ParserSettings.this.on_url.cb(p, by, pos, len); + } + return 0; + } + }; + this._on_fragment = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + if (null != ParserSettings.this.on_fragment) { + return ParserSettings.this.on_fragment.cb(p, by, pos, len); + } + return 0; + } + }; + this._on_status_complete = new HTTPCallback() { + @Override + public int cb(HTTPParser p) { + if (null != ParserSettings.this.on_status_complete) { + return ParserSettings.this.on_status_complete.cb(p); + } + return 0; + } + }; + this._on_error = new HTTPErrorCallback() { + @Override + public void cb(HTTPParser parser, String error) { + if (null != ParserSettings.this.on_error) { + ParserSettings.this.on_error.cb(parser, error); + } else { + throw new HTTPException(error); + } + + } + }; + + + +// (on_header_field and on_header_value shortened to on_h_*) +// ------------------------ ------------ -------------------------------------------- +// | State (prev. callback) | Callback | Description/action | +// ------------------------ ------------ -------------------------------------------- +// | nothing (first call) | on_h_field | Allocate new buffer and copy callback data | +// | | | into it | +// ------------------------ ------------ -------------------------------------------- +// | value | on_h_field | New header started. | +// | | | Copy current name,value buffers to headers | +// | | | list and allocate new buffer for new name | +// ------------------------ ------------ -------------------------------------------- +// | field | on_h_field | Previous name continues. Reallocate name | +// | | | buffer and append callback data to it | +// ------------------------ ------------ -------------------------------------------- +// | field | on_h_value | Value for current header started. Allocate | +// | | | new buffer and copy callback data to it | +// ------------------------ ------------ -------------------------------------------- +// | value | on_h_value | Value continues. Reallocate value buffer | +// | | | and append callback data to it | +// ------------------------ ------------ -------------------------------------------- + this._on_header_field = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + // previous value complete, call on_value with full value, reset value. + if (0 != ParserSettings.this.value.size()) { + // check we're even interested... + if (null != ParserSettings.this.on_header_value) { + byte [] valueArr = ParserSettings.this.value.toArray(); + int ret = ParserSettings.this.on_header_value.cb(p, valueArr, 0, valueArr.length); + if (0 != ret) { + return ret; + } + ParserSettings.this.value.clear(); + } + } + + if (null == ParserSettings.this.on_header_field) { + return 0; + } + + ParserSettings.this.field.addAll(by); + return 0; + } + }; + this._on_header_value = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + + // previous field complete, call on_field with full field value, reset field. + if (0 != ParserSettings.this.field.size()) { + // check we're even interested... + if (null != ParserSettings.this.on_header_field) { + byte [] fieldArr = ParserSettings.this.field.toArray(); + int ret = ParserSettings.this.on_header_field.cb(p, fieldArr, 0, fieldArr.length); + if (0 != ret) { + return ret; + } + ParserSettings.this.field.clear(); + } + } + + if (null == ParserSettings.this.on_header_value) { + return 0; + } + ParserSettings.this.value.addAll(by); + return 0; + } + }; + this._on_headers_complete = new HTTPCallback() { + @Override + public int cb(HTTPParser parser) { + // is there an uncompleted value ... ? + if (0 != ParserSettings.this.value.size()) { + // check we're even interested... + if (null != ParserSettings.this.on_header_value) { + byte [] valueArr = ParserSettings.this.value.toArray(); + int ret = ParserSettings.this.on_header_value.cb(parser, valueArr, 0, valueArr.length); + if (0 != ret) { + return ret; + } + ParserSettings.this.value.clear(); + } + } + if (null != ParserSettings.this.on_headers_complete) { + return ParserSettings.this.on_headers_complete.cb(parser); + } + return 0; + } + + }; + this._on_body = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + if (null != ParserSettings.this.on_body) { + ParserSettings.this.body.addAll(by, pos, len); + } + return 0; + } + }; + + this._on_message_complete = new HTTPCallback() { + @Override + public int cb(HTTPParser parser) { + if (null != ParserSettings.this.on_body) { + byte [] body = ParserSettings.this.body.toArray(); + int ret = ParserSettings.this.on_body.cb(parser, body, 0, body.length); + if (0!=ret) { + return ret; + } + ParserSettings.this.body.clear(); + } + if (null != ParserSettings.this.on_message_complete) { + return ParserSettings.this.on_message_complete.cb(parser); + } + return 0; + } + }; + + } + + private void attachCallbacks() { + // these are certainly set, because we mirror them ... + this.settings.on_message_begin = this._on_message_begin; + this.settings.on_path = this._on_path; + this.settings.on_query_string = this._on_query_string; + this.settings.on_url = this._on_url; + this.settings.on_fragment = this._on_fragment; + this.settings.on_status_complete = this._on_status_complete; + this.settings.on_header_field = this._on_header_field; + this.settings.on_header_value = this._on_header_value; + this.settings.on_headers_complete = this._on_headers_complete; + this.settings.on_body = this._on_body; + this.settings.on_message_complete = this._on_message_complete; + this.settings.on_error = this._on_error; + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserType.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserType.java new file mode 100644 index 0000000..a51f5b4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserType.java @@ -0,0 +1,13 @@ +package http_parser; + +public enum ParserType { +HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH; + + public static ParserType parse(String s) { + if ("HTTP_REQUEST".equalsIgnoreCase(s)) { return HTTP_REQUEST; } + else if ("HTTP_RESPONSE".equalsIgnoreCase(s)) { return HTTP_RESPONSE; } + else if ("HTTP_BOTH".equalsIgnoreCase(s)) { return HTTP_BOTH; } + else { return null; } + } +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/Util.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/Util.java new file mode 100644 index 0000000..575003a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/Util.java @@ -0,0 +1,111 @@ +package http_parser; + +import java.nio.ByteBuffer; + +public class Util { +// public static String toString(http_parser.lolevel.HTTPParser p) { +// StringBuilder builder = new StringBuilder(); +// +// // the stuff up to the break is ephermeral and only meaningful +// // while the parser is parsing. In general, this method is +// // probably only useful during debugging. +// +// builder.append("state :"); builder.append(p.state); builder.append("\n"); +// builder.append("header_state :"); builder.append(p.header_state); builder.append("\n"); +// builder.append("strict :"); builder.append(p.strict); builder.append("\n"); +// builder.append("index :"); builder.append(p.index); builder.append("\n"); +// builder.append("flags :"); builder.append(p.flags); builder.append("\n"); +// builder.append("nread :"); builder.append(p.nread); builder.append("\n"); +// builder.append("content_length :"); builder.append(p.content_length); builder.append("\n"); +// +// +// builder.append("type :"); builder.append(p.type); builder.append("\n"); +// builder.append("http_major :"); builder.append(p.http_major); builder.append("\n"); +// builder.append("http_minor :"); builder.append(p.http_minor); builder.append("\n"); +// builder.append("status_code :"); builder.append(p.status_code); builder.append("\n"); +// builder.append("method :"); builder.append(p.method); builder.append("\n"); +// builder.append("upgrade :"); builder.append(p.upgrade); builder.append("\n"); +// +// return builder.toString(); +// +// } + + public static String error (String mes, ByteBuffer b, int beginning) { + // the error message should look like this: + // + // Bla expected something, but it's not there (mes) + // GEt / HTTP 1_1 + // ............^. + // + // |----------------- 72 -------------------------| + + // This is ridiculously complicated and probably riddled with + // off-by-one errors, should be moved into high level interface. + // TODO. + + // also: need to keep track of the initial buffer position in + // execute so that we don't screw up any `mark()` that may have + // been set outside of our control to be nice. + + final int mes_width = 72; + int p = b.position(); // error position + int end = b.limit(); // this is the end + int m = end - beginning; // max mes length + + StringBuilder builder = new StringBuilder(); + int p_adj = p; + + byte [] orig = new byte[0]; + if (m <= mes_width) { + orig = new byte[m]; + b.position(beginning); + b.get(orig, 0, m); + p_adj = p-beginning; + + + } else { + // we'll need to trim bit off the beginning and/or end + orig = new byte[mes_width]; + // three possibilities: + // a.) plenty of stuff around p + // b.) plenty of stuff in front of p + // c.) plenty of stuff behind p + // CAN'T be not enough stuff aorund p in total, because + // m>meswidth (see if to this else) + + int before = p-beginning; + int after = end - p; + if ( (before > mes_width/2) && (after > mes_width/2)) { + // plenty of stuff in front of and behind error + p_adj = mes_width/2; + b.position(p - mes_width/2); + b.get(orig, 0, mes_width); + } else if (before <= mes_width/2) { + // take all of the begining. + b.position(beginning); + // and as much of the rest as possible + + b.get(orig, 0, mes_width); + + } else { + // plenty of stuff before + before = end-mes_width; + b.position(before); + p_adj = p - before; + b.get(orig, 0, mes_width); + } + } + + builder.append(new String(orig)); + builder.append("\n"); + for (int i = 0; i!= p_adj; ++i) { + builder.append("."); + } + builder.append("^"); + + + b.position(p); // restore position + return builder.toString(); + + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPCallback.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPCallback.java new file mode 100644 index 0000000..95c29b3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPCallback.java @@ -0,0 +1,5 @@ +package http_parser.lolevel; + +public interface HTTPCallback { + public int cb (HTTPParser parser); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPDataCallback.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPDataCallback.java new file mode 100644 index 0000000..6cad156 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPDataCallback.java @@ -0,0 +1,25 @@ +package http_parser.lolevel; + +import java.nio.ByteBuffer; + +public interface HTTPDataCallback { + /* + very raw and extremly foolhardy! DANGER! + The whole Buffer concept is difficult enough to grasp as it is, + we pass in a buffer with an arbitrary position. + + The interesting data is located at position pos and is len + bytes long. + + The contract of this callback is that the buffer is + returned in the state that it was passed in, so implementing + this require good citizenship, you'll need to remember the current + position, change the position to get at the data you're interested + in and then set the position back to how you found it... + + //TODO: there should be an abstract implementation that implements + cb as described above, marks it final an provides a new callback + with signature cb(byte[], int, int) + */ + public int cb(HTTPParser p, ByteBuffer buf, int pos, int len); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPErrorCallback.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPErrorCallback.java new file mode 100644 index 0000000..d38d9d4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPErrorCallback.java @@ -0,0 +1,7 @@ +package http_parser.lolevel; + +import java.nio.ByteBuffer; + +public interface HTTPErrorCallback { + public void cb (HTTPParser parser, String mes, ByteBuffer buf, int initial_position); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPParser.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPParser.java new file mode 100644 index 0000000..42022ec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPParser.java @@ -0,0 +1,2161 @@ +package http_parser.lolevel; + +import java.nio.ByteBuffer; +import http_parser.HTTPException; +import http_parser.HTTPMethod; +import http_parser.HTTPParserUrl; +import http_parser.ParserType; +import static http_parser.lolevel.HTTPParser.C.*; +import static http_parser.lolevel.HTTPParser.State.*; + +public class HTTPParser { + /* lots of unsigned chars here, not sure what + to about them, `bytes` in java suck... */ + + ParserType type; + State state; + HState header_state; + boolean strict; + + int index; + int flags; // TODO + + int nread; + long content_length; + + int p_start; // updated each call to execute to indicate where the buffer was before we began calling it. + + /** READ-ONLY **/ + public int http_major; + public int http_minor; + public int status_code; /* responses only */ + public HTTPMethod method; /* requests only */ + + /* true = Upgrade header was present and the parser has exited because of that. + * false = No upgrade header present. + * Should be checked when http_parser_execute() returns in addition to + * error checking. + */ + public boolean upgrade; + + /** PUBLIC **/ + // TODO : this is used in c to maintain application state. + // is this even necessary? we have state in java ? + // consider + // Object data; /* A pointer to get hook to the "connection" or "socket" object */ + + + /* + * technically we could combine all of these (except for url_mark) into one + * variable, saving stack space, but it seems more clear to have them + * separated. + */ + int header_field_mark = -1; + int header_value_mark = -1; + int url_mark = -1; + int body_mark = -1; + + /** + * Construct a Parser for ParserType.HTTP_BOTH, meaning it + * determines whether it's parsing a request or a response. + */ + public HTTPParser() { + this(ParserType.HTTP_BOTH); + } + + /** + * Construct a Parser and initialise it to parse either + * requests or responses. + */ + public HTTPParser(ParserType type) { + this.type = type; + switch(type) { + case HTTP_REQUEST: + this.state = State.start_req; + break; + case HTTP_RESPONSE: + this.state = State.start_res; + break; + case HTTP_BOTH: + this.state = State.start_req_or_res; + break; + default: + throw new HTTPException("can't happen, invalid ParserType enum"); + } + } + + /* + * Utility to facilitate System.out.println style debugging (the way god intended) + */ + static void p(Object o) {System.out.println(o);} + + /** Comment from C version follows + * + * Our URL parser. + * + * This is designed to be shared by http_parser_execute() for URL validation, + * hence it has a state transition + byte-for-byte interface. In addition, it + * is meant to be embedded in http_parser_parse_url(), which does the dirty + * work of turning state transitions URL components for its API. + * + * This function should only be invoked with non-space characters. It is + * assumed that the caller cares about (and can detect) the transition between + * URL and non-URL states by looking for these. + */ + public State parse_url_char(byte ch) { + + int chi = ch & 0xff; // utility, ch without signedness for table lookups. + + if(SPACE == ch){ + throw new HTTPException("space as url char"); + } + + switch(state) { + case req_spaces_before_url: + /* Proxied requests are followed by scheme of an absolute URI (alpha). + * All methods except CONNECT are followed by '/' or '*'. + */ + if(SLASH == ch || STAR == ch){ + return req_path; + } + if(isAtoZ(ch)){ + return req_schema; + } + break; + case req_schema: + if(isAtoZ(ch)){ + return req_schema; + } + if(COLON == ch){ + return req_schema_slash; + } + break; + case req_schema_slash: + if(SLASH == ch){ + return req_schema_slash_slash; + } + break; + case req_schema_slash_slash: + if(SLASH == ch){ + return req_host_start; + } + break; + case req_host_start: + if (ch == (byte)'[') { + return req_host_v6_start; + } + if (isHostChar(ch)) { + return req_host; + } + break; + + case req_host: + if (isHostChar(ch)) { + return req_host; + } + + /* FALLTHROUGH */ + case req_host_v6_end: + switch (ch) { + case ':': + return req_port_start; + case '/': + return req_path; + case '?': + return req_query_string_start; + } + break; + + case req_host_v6: + if (ch == ']') { + return req_host_v6_end; + } + + /* FALLTHROUGH */ + case req_host_v6_start: + if (isHex(ch) || ch == ':') { + return req_host_v6; + } + break; + + case req_port: + switch (ch) { + case '/': + return req_path; + case '?': + return req_query_string_start; + } + + /* FALLTHROUGH */ + case req_port_start: + if (isDigit(ch)) { + return req_port; + } + break; + + case req_path: + if (isNormalUrlChar(chi)) { + return req_path; + } + switch (ch) { + case '?': + return req_query_string_start; + case '#': + return req_fragment_start; + } + + break; + + case req_query_string_start: + case req_query_string: + if (isNormalUrlChar(chi)) { + return req_query_string; + } + + switch (ch) { + case '?': + /* allow extra '?' in query string */ + return req_query_string; + + case '#': + return req_fragment_start; + } + + break; + + case req_fragment_start: + if (isNormalUrlChar(chi)) { + return req_fragment; + } + switch (ch) { + case '?': + return req_fragment; + + case '#': + return req_fragment_start; + } + break; + + case req_fragment: + if (isNormalUrlChar(ch)) { + return req_fragment; + } + + switch (ch) { + case '?': + case '#': + return req_fragment; + } + + break; + default: + break; + } + + /* We should never fall out of the switch above unless there's an error */ + return dead; + } + + /** Execute the parser with the currently available data contained in + * the buffer. The buffers position() and limit() need to be set + * correctly (obviously) and a will be updated approriately when the + * method returns to reflect the consumed data. + */ + public int execute(ParserSettings settings, ByteBuffer data) { + + int p = data.position(); + this.p_start = p; // this is used for pretty printing errors. + // and returning the amount of processed bytes. + + + // In case the headers don't provide information about the content + // length, `execute` needs to be called with an empty buffer to + // indicate that all the data has been send be the client/server, + // else there is no way of knowing the message is complete. + int len = (data.limit() - data.position()); + if (0 == len) { +// if (State.body_identity_eof == state) { +// settings.call_on_message_complete(this); +// } + switch (state) { + case body_identity_eof: + settings.call_on_message_complete(this); + return data.position() - this.p_start; + + case dead: + case start_req_or_res: + case start_res: + case start_req: + return data.position() - this.p_start; + + default: + // should we really consider this an error!? + throw new HTTPException("empty bytes! "+state); // error + } + } + + + // in case the _previous_ call to the parser only has data to get to + // the middle of certain fields, we need to update marks to point at + // the beginning of the current buffer. + switch (state) { + case header_field: + header_field_mark = p; + break; + case header_value: + header_value_mark = p; + break; + case req_path: + case req_schema: + case req_schema_slash: + case req_schema_slash_slash: + case req_host_start: + case req_host_v6_start: + case req_host_v6: + case req_host_v6_end: + case req_host: + case req_port_start: + case req_port: + case req_query_string_start: + case req_query_string: + case req_fragment_start: + case req_fragment: + url_mark = p; + break; + } + boolean reexecute = false; + int pe = 0; + byte ch = 0; + int chi = 0; + byte c = -1; + int to_read = 0; + + // this is where the work gets done, traverse the available data... + while (data.position() != data.limit() || reexecute) { +// p(state + ": r: " + reexecute + " :: " +p ); + + if(!reexecute){ + p = data.position(); + pe = data.limit(); + ch = data.get(); // the current character to process. + chi = ch & 0xff; // utility, ch without signedness for table lookups. + c = -1; // utility variably used for up- and downcasing etc. + to_read = 0; // used to keep track of how much of body, etc. is left to read + + if (parsing_header(state)) { + ++nread; + if (nread > HTTP_MAX_HEADER_SIZE) { + return error(settings, "possible buffer overflow", data); + } + } + } + reexecute = false; +// p(state + " ::: " + ch + " : " + (((CR == ch) || (LF == ch)) ? ch : ("'" + (char)ch + "'")) +": "+p ); + + switch (state) { + /* + * this state is used after a 'Connection: close' message + * the parser will error out if it reads another message + */ + case dead: + if (CR == ch || LF == ch){ + break; + } + return error(settings, "Connection already closed", data); + + + + case start_req_or_res: + if (CR == ch || LF == ch){ + break; + } + flags = 0; + content_length = -1; + + if (H == ch) { + state = State.res_or_resp_H; + } else { + type = ParserType.HTTP_REQUEST; + method = start_req_method_assign(ch); + if (null == method) { + return error(settings, "invalid method", data); + } + index = 1; + state = State.req_method; + } + settings.call_on_message_begin(this); + break; + + + + case res_or_resp_H: + if (T == ch) { + type = ParserType.HTTP_RESPONSE; + state = State.res_HT; + } else { + if (E != ch) { + return error(settings, "not E", data); + } + type = ParserType.HTTP_REQUEST; + method = HTTPMethod.HTTP_HEAD; + index = 2; + state = State.req_method; + } + break; + + + + case start_res: + flags = 0; + content_length = -1; + + switch(ch) { + case H: + state = State.res_H; + break; + case CR: + case LF: + break; + default: + return error(settings, "Not H or CR/LF", data); + } + + settings.call_on_message_begin(this); + break; + + + + case res_H: + if (strict && T != ch) { + return error(settings, "Not T", data); + } + state = State.res_HT; + break; + case res_HT: + if (strict && T != ch) { +return error(settings, "Not T2", data); + } + state = State.res_HTT; + break; + case res_HTT: + if (strict && P != ch) { +return error(settings, "Not P", data); + } + state = State.res_HTTP; + break; + case res_HTTP: + if (strict && SLASH != ch) { +return error(settings, "Not '/'", data); + } + state = State.res_first_http_major; + break; + + + + case res_first_http_major: + if (!isDigit(ch)) { +return error(settings, "Not a digit", data); + } + http_major = (int) ch - 0x30; + state = State.res_http_major; + break; + + /* major HTTP version or dot */ + case res_http_major: + if (DOT == ch) { + state = State.res_first_http_minor; + break; + } + if (!isDigit(ch)) { +return error(settings, "Not a digit", data); + } + http_major *= 10; + http_major += (ch - 0x30); + + if (http_major > 999) { +return error(settings, "invalid http major version: ", data); + } + break; + + /* first digit of minor HTTP version */ + case res_first_http_minor: + if (!isDigit(ch)) { +return error(settings, "Not a digit", data); + } + http_minor = (int)ch - 0x30; + state = State.res_http_minor; + break; + + /* minor HTTP version or end of request line */ + case res_http_minor: + if (SPACE == ch) { + state = State.res_first_status_code; + break; + } + if (!isDigit(ch)) { +return error(settings, "Not a digit", data); + } + http_minor *= 10; + http_minor += (ch - 0x30); + if (http_minor > 999) { +return error(settings, "invalid http minor version: ", data); + } + break; + + + + case res_first_status_code: + if (!isDigit(ch)) { + if (SPACE == ch) { + break; + } +return error(settings, "Not a digit (status code)", data); + } + status_code = (int)ch - 0x30; + state = State.res_status_code; + break; + + case res_status_code: + if (!isDigit(ch)) { + switch(ch) { + case SPACE: + state = State.res_status; + break; + case CR: + state = State.res_line_almost_done; + break; + case LF: + state = State.header_field_start; + break; + default: +return error(settings, "not a valid status code", data); + } + break; + } + status_code *= 10; + status_code += (int)ch - 0x30; + if (status_code > 999) { +return error(settings, "ridiculous status code:", data); + } + + if (status_code > 99) { + settings.call_on_status_complete(this); + } + break; + + case res_status: + /* the human readable status. e.g. "NOT FOUND" + * we are not humans so just ignore this + * we are not men, we are devo. */ + + if (CR == ch) { + state = State.res_line_almost_done; + break; + } + if (LF == ch) { + state = State.header_field_start; + break; + } + break; + + case res_line_almost_done: + if (strict && LF != ch) { +return error(settings, "not LF", data); + } + state = State.header_field_start; + break; + + + + case start_req: + if (CR==ch || LF == ch) { + break; + } + flags = 0; + content_length = -1; + + if(!isAtoZ(ch)){ + return error(settings, "invalid method", data); + } + + method = start_req_method_assign(ch); + if (null == method) { + return error(settings, "invalid method", data); + } + index = 1; + state = State.req_method; + + settings.call_on_message_begin(this); + break; + + + + case req_method: + if (0 == ch) { + return error(settings, "NULL in method", data); + } + + byte [] arr = method.bytes; + + if (SPACE == ch && index == arr.length) { + state = State.req_spaces_before_url; + } else if (arr[index] == ch) { + // wuhu! + } else if (HTTPMethod.HTTP_CONNECT == method) { + if (1 == index && H == ch) { + method = HTTPMethod.HTTP_CHECKOUT; + } else if (2 == index && P == ch) { + method = HTTPMethod.HTTP_COPY; + } + } else if (HTTPMethod.HTTP_MKCOL == method) { + if (1 == index && O == ch) { + method = HTTPMethod.HTTP_MOVE; + } else if (1 == index && E == ch) { + method = HTTPMethod.HTTP_MERGE; + } else if (1 == index && DASH == ch) { /* M-SEARCH */ + method = HTTPMethod.HTTP_MSEARCH; + } else if (2 == index && A == ch) { + method = HTTPMethod.HTTP_MKACTIVITY; + } + } else if (1 == index && HTTPMethod.HTTP_POST == method) { + if(R == ch) { + method = HTTPMethod.HTTP_PROPFIND; /* or HTTP_PROPPATCH */ + }else if(U == ch){ + method = HTTPMethod.HTTP_PUT; /* or HTTP_PURGE */ + }else if(A == ch){ + method = HTTPMethod.HTTP_PATCH; + } + } else if (2 == index) { + if(HTTPMethod.HTTP_PUT == method) { + if(R == ch){ + method = HTTPMethod.HTTP_PURGE; + } + }else if(HTTPMethod.HTTP_UNLOCK == method){ + if(S == ch){ + method = HTTPMethod.HTTP_UNSUBSCRIBE; + } + } + }else if(4 == index && HTTPMethod.HTTP_PROPFIND == method && P == ch){ + method = HTTPMethod.HTTP_PROPPATCH; + } else { + return error(settings, "Invalid HTTP method", data); + } + + ++index; + break; + + + + /******************* URL *******************/ + case req_spaces_before_url: + if (SPACE == ch) { + break; + } + url_mark = p; + if(HTTPMethod.HTTP_CONNECT == method){ + state = req_host_start; + } + + state = parse_url_char(ch); + if(state == dead){ + return error(settings, "Invalid something", data); + } + break; + + + case req_schema: + case req_schema_slash: + case req_schema_slash_slash: + case req_host_start: + case req_host_v6_start: + case req_host_v6: + case req_port_start: + switch (ch) { + /* No whitespace allowed here */ + case SPACE: + case CR: + case LF: + return error(settings, "unexpected char in path", data); + default: + state = parse_url_char(ch); + if(dead == state){ + return error(settings, "unexpected char in path", data); + } + } + break; + + case req_host: + case req_host_v6_end: + case req_port: + case req_path: + case req_query_string_start: + case req_query_string: + case req_fragment_start: + case req_fragment: + switch (ch) { + case SPACE: + settings.call_on_url(this, data, url_mark, p-url_mark); + settings.call_on_path(this, data, url_mark, p - url_mark); + url_mark = -1; + state = State.req_http_start; + break; + case CR: + case LF: + http_major = 0; + http_minor = 9; + state = (CR == ch) ? req_line_almost_done : header_field_start; + settings.call_on_url(this, data, url_mark, p-url_mark); //TODO check params!!! + settings.call_on_path(this, data, url_mark, p-url_mark); + url_mark = -1; + break; + default: + state = parse_url_char(ch); + if(dead == state){ + return error(settings, "unexpected char in path", data); + } + } + break; + /******************* URL *******************/ + + + + /******************* HTTP 1.1 *******************/ + case req_http_start: + switch (ch) { + case H: + state = State.req_http_H; + break; + case SPACE: + break; + default: + return error(settings, "error in req_http_H", data); + } + break; + + case req_http_H: + if (strict && T != ch) { + return error(settings, "unexpected char", data); + } + state = State.req_http_HT; + break; + + case req_http_HT: + if (strict && T != ch) { + return error(settings, "unexpected char", data); + } + state = State.req_http_HTT; + break; + + case req_http_HTT: + if (strict && P != ch) { + return error(settings, "unexpected char", data); + } + state = State.req_http_HTTP; + break; + + case req_http_HTTP: + if (strict && SLASH != ch) { + return error(settings, "unexpected char", data); + } + state = req_first_http_major; + break; + + /* first digit of major HTTP version */ + case req_first_http_major: + if (!isDigit(ch)) { +return error(settings, "non digit in http major", data); + } + http_major = (int)ch - 0x30; + state = State.req_http_major; + break; + + /* major HTTP version or dot */ + case req_http_major: + if (DOT == ch) { + state = State.req_first_http_minor; + break; + } + + if (!isDigit(ch)) { +return error(settings, "non digit in http major", data); + } + + http_major *= 10; + http_major += (int)ch - 0x30; + + if (http_major > 999) { +return error(settings, "ridiculous http major", data); + }; + break; + + /* first digit of minor HTTP version */ + case req_first_http_minor: + if (!isDigit(ch)) { +return error(settings, "non digit in http minor", data); + } + http_minor = (int)ch - 0x30; + state = State.req_http_minor; + break; + + case req_http_minor: + if (ch == CR) { + state = State.req_line_almost_done; + break; + } + + if (ch == LF) { + state = State.header_field_start; + break; + } + + /* XXX allow spaces after digit? */ + + if (!isDigit(ch)) { +return error(settings, "non digit in http minor", data); + } + + http_minor *= 10; + http_minor += (int)ch - 0x30; + + + if (http_minor > 999) { +return error(settings, "ridiculous http minor", data); + }; + + break; + + /* end of request line */ + case req_line_almost_done: + { + if (ch != LF) { +return error(settings, "missing LF after request line", data); + } + state = header_field_start; + break; + } + + /******************* HTTP 1.1 *******************/ + + + + /******************* Header *******************/ + case header_field_start: + { + if (ch == CR) { + state = headers_almost_done; + break; + } + + if (ch == LF) { + /* they might be just sending \n instead of \r\n so this would be + * the second \n to denote the end of headers*/ + state = State.headers_almost_done; + reexecute = true; + break; + } + + c = token(ch); + + if (0 == c) { + return error(settings, "invalid char in header:", data); + } + + header_field_mark = p; + + index = 0; + state = State.header_field; + + switch (c) { + case C: + header_state = HState.C; + break; + + case P: + header_state = HState.matching_proxy_connection; + break; + + case T: + header_state = HState.matching_transfer_encoding; + break; + + case U: + header_state = HState.matching_upgrade; + break; + + default: + header_state = HState.general; + break; + } + break; + } + + + + case header_field: + { + c = token(ch); + if (0 != c) { + switch (header_state) { + case general: + break; + + case C: + index++; + header_state = (O == c ? HState.CO : HState.general); + break; + + case CO: + index++; + header_state = (N == c ? HState.CON : HState.general); + break; + + case CON: + index++; + switch (c) { + case N: + header_state = HState.matching_connection; + break; + case T: + header_state = HState.matching_content_length; + break; + default: + header_state = HState.general; + break; + } + break; + + /* connection */ + + case matching_connection: + index++; + if (index > CONNECTION.length || c != CONNECTION[index]) { + header_state = HState.general; + } else if (index == CONNECTION.length-1) { + header_state = HState.connection; + } + break; + + /* proxy-connection */ + + case matching_proxy_connection: + index++; + if (index > PROXY_CONNECTION.length || c != PROXY_CONNECTION[index]) { + header_state = HState.general; + } else if (index == PROXY_CONNECTION.length-1) { + header_state = HState.connection; + } + break; + + /* content-length */ + + case matching_content_length: + index++; + if (index > CONTENT_LENGTH.length || c != CONTENT_LENGTH[index]) { + header_state = HState.general; + } else if (index == CONTENT_LENGTH.length-1) { + header_state = HState.content_length; + } + break; + + /* transfer-encoding */ + + case matching_transfer_encoding: + index++; + if (index > TRANSFER_ENCODING.length || c != TRANSFER_ENCODING[index]) { + header_state = HState.general; + } else if (index == TRANSFER_ENCODING.length-1) { + header_state = HState.transfer_encoding; + } + break; + + /* upgrade */ + + case matching_upgrade: + index++; + if (index > UPGRADE.length || c != UPGRADE[index]) { + header_state = HState.general; + } else if (index == UPGRADE.length-1) { + header_state = HState.upgrade; + } + break; + + case connection: + case content_length: + case transfer_encoding: + case upgrade: + if (SPACE != ch) header_state = HState.general; + break; + + default: +return error(settings, "Unknown Header State", data); + } // switch: header_state + break; + } // 0 != c + + if (COLON == ch) { + settings.call_on_header_field(this, data, header_field_mark, p-header_field_mark); + header_field_mark = -1; + + state = State.header_value_start; + break; + } + + if (CR == ch) { + state = State.header_almost_done; + settings.call_on_header_field(this, data, header_field_mark, p-header_field_mark); + + header_field_mark = -1; + break; + } + + if (ch == LF) { + settings.call_on_header_field(this, data, header_field_mark, p-header_field_mark); + header_field_mark = -1; + + state = State.header_field_start; + break; + } + +return error(settings, "invalid header field", data); + } + + + + case header_value_start: + { + if ((SPACE == ch) || (TAB == ch)) break; + + header_value_mark = p; + + state = State.header_value; + index = 0; + + + if (CR == ch) { + settings.call_on_header_value(this, data, header_value_mark, p-header_value_mark); + header_value_mark = -1; + + header_state = HState.general; + state = State.header_almost_done; + break; + } + + if (LF == ch) { + settings.call_on_header_value(this, data, header_value_mark, p-header_value_mark); + header_value_mark = -1; + + state = State.header_field_start; + break; + } + + + c = upper(ch); + + switch (header_state) { + case upgrade: + flags |= F_UPGRADE; + header_state = HState.general; + break; + + case transfer_encoding: + /* looking for 'Transfer-Encoding: chunked' */ + if (C == c) { + header_state = HState.matching_transfer_encoding_chunked; + } else { + header_state = HState.general; + } + break; + + case content_length: + if (!isDigit(ch)) { +return error(settings, "Content-Length not numeric", data); + } + content_length = (int)ch - 0x30; + break; + + case connection: + /* looking for 'Connection: keep-alive' */ + if (K == c) { + header_state = HState.matching_connection_keep_alive; + /* looking for 'Connection: close' */ + } else if (C == c) { + header_state = HState.matching_connection_close; + } else { + header_state = HState.general; + } + break; + + default: + header_state = HState.general; + break; + } + break; + } // header value start + + + + case header_value: + { + + if (CR == ch) { + settings.call_on_header_value(this, data, header_value_mark, p-header_value_mark); + header_value_mark = -1; + + state = State.header_almost_done; + break; + } + + if (LF == ch) { + settings.call_on_header_value(this, data, header_value_mark, p-header_value_mark); + header_value_mark = -1; + state = header_almost_done; + reexecute = true; + break; + } + + c = upper(ch); + switch (header_state) { + case general: + break; + + case connection: + case transfer_encoding: +return error(settings, "Shouldn't be here", data); + + case content_length: + if (SPACE == ch) { + break; + } + if (!isDigit(ch)) { +return error(settings, "Content-Length not numeric", data); + } + + long t = content_length; + t *= 10; + t += (long)ch - 0x30; + + /* Overflow? */ + // t will wrap and become negative ... + if (t < content_length) { + return error(settings, "Invalid content length", data); + } + content_length = t; + break; + + /* Transfer-Encoding: chunked */ + case matching_transfer_encoding_chunked: + index++; + if (index > CHUNKED.length || c != CHUNKED[index]) { + header_state = HState.general; + } else if (index == CHUNKED.length-1) { + header_state = HState.transfer_encoding_chunked; + } + break; + + /* looking for 'Connection: keep-alive' */ + case matching_connection_keep_alive: + index++; + if (index > KEEP_ALIVE.length || c != KEEP_ALIVE[index]) { + header_state = HState.general; + } else if (index == KEEP_ALIVE.length-1) { + header_state = HState.connection_keep_alive; + } + break; + + /* looking for 'Connection: close' */ + case matching_connection_close: + index++; + if (index > CLOSE.length || c != CLOSE[index]) { + header_state = HState.general; + } else if (index == CLOSE.length-1) { + header_state = HState.connection_close; + } + break; + + case transfer_encoding_chunked: + case connection_keep_alive: + case connection_close: + if (SPACE != ch) header_state = HState.general; + break; + + default: + state = State.header_value; + header_state = HState.general; + break; + } + break; + } // header_value + + + + case header_almost_done: + if (!header_almost_done(ch)) { + return error(settings, "incorrect header ending, expecting LF", data); + } + break; + + case header_value_lws: + if (SPACE == ch || TAB == ch ){ + state = header_value_start; + } else { + state = header_field_start; + reexecute = true; + } + break; + + case headers_almost_done: + if (LF != ch) { + return error(settings, "header not properly completed", data); + } + if (0 != (flags & F_TRAILING)) { + /* End of a chunked request */ + state = new_message(); + settings.call_on_headers_complete(this); + settings.call_on_message_complete(this); + break; + } + + state = headers_done; + + if (0 != (flags & F_UPGRADE) || HTTPMethod.HTTP_CONNECT == method) { + upgrade = true; + } + + /* Here we call the headers_complete callback. This is somewhat + * different than other callbacks because if the user returns 1, we + * will interpret that as saying that this message has no body. This + * is needed for the annoying case of recieving a response to a HEAD + * request. + */ + + /* (responses to HEAD request contain a CONTENT-LENGTH header + * but no content) + * + * Consider what to do here: I don't like the idea of the callback + * interface having a different contract in the case of HEAD + * responses. The alternatives would be either to: + * + * a.) require the header_complete callback to implement a different + * interface or + * + * b.) provide an overridden execute(bla, bla, boolean + * parsingHeader) implementation ... + */ + + /*TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO */ + if (null != settings.on_headers_complete) { + settings.call_on_headers_complete(this); + //return; + } + + // if (null != settings.on_headers_complete) { + // switch (settings.on_headers_complete.cb(parser)) { + // case 0: + // break; + // + // case 1: + // flags |= F_SKIPBODY; + // break; + // + // default: + // return p - data; /* Error */ // TODO // RuntimeException ? + // } + // } + reexecute = true; + break; + + case headers_done: + if (strict && (LF != ch)) { + return error(settings, "STRICT CHECK", data); //TODO correct error msg + } + + nread = 0; + + // Exit, the rest of the connect is in a different protocol. + if (upgrade) { + state = new_message(); + settings.call_on_message_complete(this); + return data.position()-this.p_start; + } + + if (0 != (flags & F_SKIPBODY)) { + state = new_message(); + settings.call_on_message_complete(this); + } else if (0 != (flags & F_CHUNKED)) { + /* chunked encoding - ignore Content-Length header */ + state = State.chunk_size_start; + } else { + if (content_length == 0) { + /* Content-Length header given but zero: Content-Length: 0\r\n */ + state = new_message(); + settings.call_on_message_complete(this); + } else if (content_length != -1) { + /* Content-Length header given and non-zero */ + state = State.body_identity; + } else { + if (type == ParserType.HTTP_REQUEST || !http_message_needs_eof()) { + /* Assume content-length 0 - read the next */ + state = new_message(); + settings.call_on_message_complete(this); + } else { + /* Read body until EOF */ + state = State.body_identity_eof; + } + } + } + + break; + /******************* Header *******************/ + + + + + /******************* Body *******************/ + case body_identity: + to_read = min(pe - p, content_length); //TODO change to use buffer? + body_mark = p; + + if (to_read > 0) { + settings.call_on_body(this, data, p, to_read); + data.position(p+to_read); + content_length -= to_read; + + if (content_length == 0) { + state = message_done; + reexecute = true; + } + } + break; + + + + case body_identity_eof: + to_read = pe - p; // TODO change to use buffer ? + if (to_read > 0) { + settings.call_on_body(this, data, p, to_read); + data.position(p+to_read); + } + break; + + case message_done: + state = new_message(); + settings.call_on_message_complete(this); + break; + /******************* Body *******************/ + + + + /******************* Chunk *******************/ + case chunk_size_start: + if (1 != this.nread) { +return error(settings, "nread != 1 (chunking)", data); + + } + if (0 == (flags & F_CHUNKED)) { +return error(settings, "not chunked", data); + } + + c = UNHEX[chi]; + if (c == -1) { +return error(settings, "invalid hex char in chunk content length", data); + } + content_length = c; + state = State.chunk_size; + break; + + + + case chunk_size: + if (0 == (flags & F_CHUNKED)) { + return error(settings, "not chunked", data); + } + + if (CR == ch) { + state = State.chunk_size_almost_done; + break; + } + + c = UNHEX[chi]; + + if (c == -1) { + if (SEMI == ch || SPACE == ch) { + state = State.chunk_parameters; + break; + } + return error(settings, "invalid hex char in chunk content length", data); + } + long t = content_length; + + t *= 16; + t += c; + if(t < content_length){ + return error(settings, "invalid content length", data); + } + content_length = t; + break; + + + + case chunk_parameters: + if (0 == (flags & F_CHUNKED)) { +return error(settings, "not chunked", data); + } + /* just ignore this shit. TODO check for overflow */ + if (CR == ch) { + state = State.chunk_size_almost_done; + break; + } + break; + + + + case chunk_size_almost_done: + if (0 == (flags & F_CHUNKED)) { +return error(settings, "not chunked", data); + } + if (strict && LF != ch) { +return error(settings, "expected LF at end of chunk size", data); + } + + this.nread = 0; + + if (0 == content_length) { + flags |= F_TRAILING; + state = State.header_field_start; + } else { + state = State.chunk_data; + } + break; + + + + case chunk_data: + //TODO Apply changes from C version for s_chunk_data + if (0 == (flags & F_CHUNKED)) { + return error(settings, "not chunked", data); + } + + to_read = min(pe-p, content_length); + if (to_read > 0) { + settings.call_on_body(this, data, p, to_read); + data.position(p+to_read); + } + + if (to_read == content_length) { + state = State.chunk_data_almost_done; + } + + content_length -= to_read; + break; + + + + case chunk_data_almost_done: + if (0 == (flags & F_CHUNKED)) { +return error(settings, "not chunked", data); + } + if (strict && CR != ch) { +return error(settings, "chunk data terminated incorrectly, expected CR", data); + } + state = State.chunk_data_done; + //TODO CALLBACK_DATA(body) + // settings.call_on_body(this, data,p,?); + break; + + + + case chunk_data_done: + if (0 == (flags & F_CHUNKED)) { +return error(settings, "not chunked", data); + } + if (strict && LF != ch) { +return error(settings, "chunk data terminated incorrectly, expected LF", data); + } + state = State.chunk_size_start; + break; + /******************* Chunk *******************/ + + + + default: +return error(settings, "unhandled state", data); + + } // switch + } // while + + p = data.position(); + + + /* Reaching this point assumes that we only received part of a + * message, inform the callbacks about the progress made so far*/ + + settings.call_on_header_field(this, data, header_field_mark, p-header_field_mark); + settings.call_on_header_value(this, data, header_value_mark, p-header_value_mark); + settings.call_on_url (this, data, url_mark, p-url_mark); + settings.call_on_path (this, data, url_mark, p-url_mark); + + return data.position()-this.p_start; + } // execute + + int error (ParserSettings settings, String mes, ByteBuffer data) { + settings.call_on_error(this, mes, data, this.p_start); + this.state = State.dead; + return data.position()-this.p_start; + } + + public boolean http_message_needs_eof() { + if(type == ParserType.HTTP_REQUEST){ + return false; + } + /* See RFC 2616 section 4.4 */ + if ((status_code / 100 == 1) || /* 1xx e.g. Continue */ + (status_code == 204) || /* No Content */ + (status_code == 304) || /* Not Modified */ + (flags & F_SKIPBODY) != 0) { /* response to a HEAD request */ + return false; + } + if ((flags & F_CHUNKED) != 0 || content_length != -1) { + return false; + } + + return true; + } + + /* If http_should_keep_alive() in the on_headers_complete or + * on_message_complete callback returns true, then this will be should be + * the last message on the connection. + * If you are the server, respond with the "Connection: close" header. + * If you are the client, close the connection. + */ + public boolean http_should_keep_alive() { + if (http_major > 0 && http_minor > 0) { + /* HTTP/1.1 */ + if ( 0 != (flags & F_CONNECTION_CLOSE) ) { + return false; + } + } else { + /* HTTP/1.0 or earlier */ + if ( 0 == (flags & F_CONNECTION_KEEP_ALIVE) ) { + return false; + } + } + return !http_message_needs_eof(); + } + + public int parse_url(ByteBuffer data, boolean is_connect, HTTPParserUrl u) { + + UrlFields uf = UrlFields.UF_MAX; + UrlFields old_uf = UrlFields.UF_MAX; + u.port = 0; + u.field_set = 0; + state = (is_connect ? State.req_host_start : State.req_spaces_before_url); + int p_init = data.position(); + int p = 0; + byte ch = 0; + while (data.position() != data.limit()) { + p = data.position(); + ch = data.get(); + state = parse_url_char(ch); + switch(state) { + case dead: + return 1; + + /* Skip delimeters */ + case req_schema_slash: + case req_schema_slash_slash: + case req_host_start: + case req_host_v6_start: + case req_host_v6_end: + case req_port_start: + case req_query_string_start: + case req_fragment_start: + continue; + + case req_schema: + uf = UrlFields.UF_SCHEMA; + break; + + case req_host: + case req_host_v6: + uf = UrlFields.UF_HOST; + break; + + case req_port: + uf = UrlFields.UF_PORT; + break; + + case req_path: + uf = UrlFields.UF_PATH; + break; + + case req_query_string: + uf = UrlFields.UF_QUERY; + break; + + case req_fragment: + uf = UrlFields.UF_FRAGMENT; + break; + + default: + return 1; + } + /* Nothing's changed; soldier on */ + if (uf == old_uf) { + u.field_data[uf.getIndex()].len++; + continue; + } + + u.field_data[uf.getIndex()].off = p - p_init; + u.field_data[uf.getIndex()].len = 1; + + u.field_set |= (1 << uf.getIndex()); + old_uf = uf; + + } + + /* CONNECT requests can only contain "hostname:port" */ + if (is_connect && u.field_set != ((1 << UrlFields.UF_HOST.getIndex())|(1 << UrlFields.UF_PORT.getIndex()))) { + return 1; + } + + /* Make sure we don't end somewhere unexpected */ + switch (state) { + case req_host_v6_start: + case req_host_v6: + case req_host_v6_end: + case req_host: + case req_port_start: + return 1; + default: + break; + } + + if (0 != (u.field_set & (1 << UrlFields.UF_PORT.getIndex()))) { + /* Don't bother with endp; we've already validated the string */ + int v = strtoi(data, p_init + u.field_data[UrlFields.UF_PORT.getIndex()].off); + + /* Ports have a max value of 2^16 */ + if (v > 0xffff) { + return 1; + } + + u.port = v; + } + + return 0; + } + + //hacky reimplementation of srttoul, tailored for our simple needs + //we only need to parse port val, so no negative values etc + int strtoi(ByteBuffer data, int start_pos) { + data.position(start_pos); + byte ch; + String str = ""; + while(data.position() < data.limit()) { + ch = data.get(); + if(Character.isWhitespace((char)ch)){ + continue; + } + if(isDigit(ch)){ + str = str + (char)ch; //TODO replace with something less hacky + }else{ + break; + } + } + return Integer.parseInt(str); + } + + boolean isDigit(byte b) { + if (b >= 0x30 && b <=0x39) { + return true; + } + return false; + } + + boolean isHex(byte b) { + return isDigit(b) || (lower(b) >= 0x61 /*a*/ && lower(b) <= 0x66 /*f*/); + } + + boolean isAtoZ(byte b) { + byte c = lower(b); + return (c>= 0x61 /*a*/ && c <= 0x7a /*z*/); + } + + + byte lower (byte b) { + return (byte)(b|0x20); + } + + byte upper(byte b) { + char c = (char)(b); + return (byte)Character.toUpperCase(c); + } + + byte token(byte b) { + if(!strict){ + return (b == (byte)' ') ? (byte)' ' : (byte)tokens[b] ; + }else{ + return (byte)tokens[b]; + } + } + + boolean isHostChar(byte ch){ + if(!strict){ + return (isAtoZ(ch)) || isDigit(ch) || DOT == ch || DASH == ch || UNDER == ch ; + }else{ + return (isAtoZ(ch)) || isDigit(ch) || DOT == ch || DASH == ch; + } + } + + boolean isNormalUrlChar(int chi) { + if(!strict){ + return (chi > 0x80) || normal_url_char[chi]; + }else{ + return normal_url_char[chi]; + } + } + + HTTPMethod start_req_method_assign(byte c){ + switch (c) { + case C: return HTTPMethod.HTTP_CONNECT; /* or COPY, CHECKOUT */ + case D: return HTTPMethod.HTTP_DELETE; + case G: return HTTPMethod.HTTP_GET; + case H: return HTTPMethod.HTTP_HEAD; + case L: return HTTPMethod.HTTP_LOCK; + case M: return HTTPMethod.HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ + case N: return HTTPMethod.HTTP_NOTIFY; + case O: return HTTPMethod.HTTP_OPTIONS; + case P: return HTTPMethod.HTTP_POST; /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ + case R: return HTTPMethod.HTTP_REPORT; + case S: return HTTPMethod.HTTP_SUBSCRIBE; + case T: return HTTPMethod.HTTP_TRACE; + case U: return HTTPMethod.HTTP_UNLOCK; /* or UNSUBSCRIBE */ + } + return null; // ugh. + } + + boolean header_almost_done(byte ch) { + if (strict && LF != ch) { + return false; + } + + state = State.header_value_lws; + // TODO java enums support some sort of bitflag mechanism !? + switch (header_state) { + case connection_keep_alive: + flags |= F_CONNECTION_KEEP_ALIVE; + break; + case connection_close: + flags |= F_CONNECTION_CLOSE; + break; + case transfer_encoding_chunked: + flags |= F_CHUNKED; + break; + default: + break; + } + return true; + } + +// boolean headers_almost_done (byte ch, ParserSettings settings) { +// } // headers_almost_done + + + final int min (int a, int b) { + return a < b ? a : b; + } + + final int min (int a, long b) { + return a < b ? a : (int)b; + } + + /* probably not the best place to hide this ... */ + public boolean HTTP_PARSER_STRICT; + State new_message() { + if (HTTP_PARSER_STRICT){ + return http_should_keep_alive() ? start_state() : State.dead; + } else { + return start_state(); + } + + } + + State start_state() { + return type == ParserType.HTTP_REQUEST ? State.start_req : State.start_res; + } + + + boolean parsing_header(State state) { + + switch (state) { + case chunk_data : + case chunk_data_almost_done : + case chunk_data_done : + case body_identity : + case body_identity_eof : + case message_done : + return false; + + } + return true; + } + + /* "Dial C for Constants" */ + static class C { + static final int HTTP_MAX_HEADER_SIZE = 80 * 1024; + + static final int F_CHUNKED = 1 << 0; + static final int F_CONNECTION_KEEP_ALIVE = 1 << 1; + static final int F_CONNECTION_CLOSE = 1 << 2; + static final int F_TRAILING = 1 << 3; + static final int F_UPGRADE = 1 << 4; + static final int F_SKIPBODY = 1 << 5; + + static final byte [] UPCASE = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x2f, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x38,0x39,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x41,0x42,0x43,0x44,0x45,0x46,0x47, 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, 0x58,0x59,0x5a,0x00,0x00,0x00,0x00,0x5f, + 0x00,0x41,0x42,0x43,0x44,0x45,0x46,0x47, 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, 0x58,0x59,0x5a,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + }; + static final byte [] CONNECTION = { + 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, + }; + static final byte [] PROXY_CONNECTION = { + 0x50, 0x52, 0x4f, 0x58, 0x59, 0x2d, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, + }; + static final byte [] CONTENT_LENGTH = { + 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x2d, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, + }; + static final byte [] TRANSFER_ENCODING = { + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x2d, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, + }; + static final byte [] UPGRADE = { + 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, + }; + static final byte [] CHUNKED = { + 0x43, 0x48, 0x55, 0x4e, 0x4b, 0x45, 0x44, + }; + static final byte [] KEEP_ALIVE = { + 0x4b, 0x45, 0x45, 0x50, 0x2d, 0x41, 0x4c, 0x49, 0x56, 0x45, + }; + static final byte [] CLOSE = { + 0x43, 0x4c, 0x4f, 0x53, 0x45, + }; + + /* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ + + static final char [] tokens = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0, '!', 0, '#', '$', '%', '&', '\'', +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 0, 0, '*', '+', 0, '-', '.', 0 , +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + '0', '1', '2', '3', '4', '5', '6', '7', +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + '8', '9', 0, 0, 0, 0, 0, 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 0, 'A', 'B', 'C', 'D', 'E', 'F', 'G', +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 'X', 'Y', 'Z', 0, 0, 0, 0, '_', +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + 0, 'A', 'B', 'C', 'D', 'E', 'F', 'G', +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 'X', 'Y', 'Z', 0, '|', 0, '~', 0, +/* hi bit set, not 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, }; + + static final byte [] UNHEX = + { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-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, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + }; + + static final boolean [] normal_url_char = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + false, false, false, false, false, false, false, false, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + false, false, false, false, false, false, false, false, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + false, false, false, false, false, false, false, false, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + false, false, false, false, false, false, false, false, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + false, true, true, false, true, true, true, true, +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + true, true, true, true, true, true, true, true, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + true, true, true, true, true, true, true, true, +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + true, true, true, true, true, true, true, false, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + true, true, true, true, true, true, true, true, +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + true, true, true, true, true, true, true, true, +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + true, true, true, true, true, true, true, true, +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + true, true, true, true, true, true, true, true, +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + true, true, true, true, true, true, true, true, +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + true, true, true, true, true, true, true, true, +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + true, true, true, true, true, true, true, true, +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + true, true, true, true, true, true, true, false, + +/* hi bit set, not ascii */ +/* Remainder of non-ASCII range are accepted as-is to support implicitly UTF-8 + * encoded paths. This is out of spec, but clients generate this and most other + * HTTP servers support it. We should, too. */ + + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + + }; + + public static final byte A = 0x41; + public static final byte B = 0x42; + public static final byte C = 0x43; + public static final byte D = 0x44; + public static final byte E = 0x45; + public static final byte F = 0x46; + public static final byte G = 0x47; + public static final byte H = 0x48; + public static final byte I = 0x49; + public static final byte J = 0x4a; + public static final byte K = 0x4b; + public static final byte L = 0x4c; + public static final byte M = 0x4d; + public static final byte N = 0x4e; + public static final byte O = 0x4f; + public static final byte P = 0x50; + public static final byte Q = 0x51; + public static final byte R = 0x52; + public static final byte S = 0x53; + public static final byte T = 0x54; + public static final byte U = 0x55; + public static final byte V = 0x56; + public static final byte W = 0x57; + public static final byte X = 0x58; + public static final byte Y = 0x59; + public static final byte Z = 0x5a; + public static final byte UNDER = 0x5f; + public static final byte CR = 0x0d; + public static final byte LF = 0x0a; + public static final byte DOT = 0x2e; + public static final byte SPACE = 0x20; + public static final byte TAB = 0x09; + public static final byte SEMI = 0x3b; + public static final byte COLON = 0x3a; + public static final byte HASH = 0x23; + public static final byte QMARK = 0x3f; + public static final byte SLASH = 0x2f; + public static final byte DASH = 0x2d; + public static final byte STAR = 0x2a; + public static final byte NULL = 0x00; + } + + enum State { + + dead + + , start_req_or_res + , res_or_resp_H + , start_res + , res_H + , res_HT + , res_HTT + , res_HTTP + , res_first_http_major + , res_http_major + , res_first_http_minor + , res_http_minor + , res_first_status_code + , res_status_code + , res_status + , res_line_almost_done + + , start_req + + , req_method + , req_spaces_before_url + , req_schema + , req_schema_slash + , req_schema_slash_slash + , req_host_start + , req_host_v6_start + , req_host_v6 + , req_host_v6_end + , req_host + , req_port_start + , req_port + , req_path + , req_query_string_start + , req_query_string + , req_fragment_start + , req_fragment + , req_http_start + , req_http_H + , req_http_HT + , req_http_HTT + , req_http_HTTP + , req_first_http_major + , req_http_major + , req_first_http_minor + , req_http_minor + , req_line_almost_done + + , header_field_start + , header_field + , header_value_start + , header_value + , header_value_lws + + , header_almost_done + + , chunk_size_start + , chunk_size + , chunk_parameters + , chunk_size_almost_done + + , headers_almost_done + , headers_done +// This space intentionally not left blank, comment from c, for orientation... +// the c version uses <= s_header_almost_done in java, we list the states explicitly +// in `parsing_header()` +/* Important: 's_headers_done' must be the last 'header' state. All + * states beyond this must be 'body' states. It is used for overflow + * checking. See the PARSING_HEADER() macro. + */ + , chunk_data + , chunk_data_almost_done + , chunk_data_done + + , body_identity + , body_identity_eof + , message_done + + } + enum HState { + general + , C + , CO + , CON + + , matching_connection + , matching_proxy_connection + , matching_content_length + , matching_transfer_encoding + , matching_upgrade + + , connection + , content_length + , transfer_encoding + , upgrade + + , matching_transfer_encoding_chunked + , matching_connection_keep_alive + , matching_connection_close + + , transfer_encoding_chunked + , connection_keep_alive + , connection_close + } + public enum UrlFields { + UF_SCHEMA(0) + , UF_HOST(1) + , UF_PORT(2) + , UF_PATH(3) + , UF_QUERY(4) + , UF_FRAGMENT(5) + , UF_MAX(6); + + + private final int index; + + private UrlFields(int index) { + this.index = index; + } + public int getIndex() { + return index; + } + + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/ParserSettings.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/ParserSettings.java new file mode 100644 index 0000000..1ebdd4f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/ParserSettings.java @@ -0,0 +1,83 @@ +package http_parser.lolevel; +import java.nio.ByteBuffer; +import http_parser.HTTPException; +public class ParserSettings { + + public HTTPCallback on_message_begin; + public HTTPDataCallback on_path; + public HTTPDataCallback on_query_string; + public HTTPDataCallback on_url; + public HTTPDataCallback on_fragment; + public HTTPCallback on_status_complete; + public HTTPDataCallback on_header_field; + public HTTPDataCallback on_header_value; + public HTTPCallback on_headers_complete; + public HTTPDataCallback on_body; + public HTTPCallback on_message_complete; + public HTTPErrorCallback on_error; + + void call_on_message_begin (HTTPParser p) { + call_on(on_message_begin, p); + } + + void call_on_message_complete (HTTPParser p) { + call_on(on_message_complete, p); + } + + // this one is a little bit different: + // the current `position` of the buffer is the location of the + // error, `ini_pos` indicates where the position of + // the buffer when it was passed to the `execute` method of the parser, i.e. + // using this information and `limit` we'll know all the valid data + // in the buffer around the error we can use to print pretty error + // messages. + void call_on_error (HTTPParser p, String mes, ByteBuffer buf, int ini_pos) { + if (null != on_error) { + on_error.cb(p, mes, buf, ini_pos); + return; + } + // if on_error gets called it MUST throw an exception, else the parser + // will attempt to continue parsing, which it can't because it's + // in an invalid state. + throw new HTTPException(mes); + } + + void call_on_header_field (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_header_field, p, buf, pos, len); + } + void call_on_query_string (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_query_string, p, buf, pos, len); + } + void call_on_fragment (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_fragment, p, buf, pos, len); + } + void call_on_status_complete(HTTPParser p) { + call_on(on_status_complete, p); + } + void call_on_path (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_path, p, buf, pos, len); + } + void call_on_header_value (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_header_value, p, buf, pos, len); + } + void call_on_url (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_url, p, buf, pos, len); + } + void call_on_body(HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_body, p, buf, pos, len); + } + void call_on_headers_complete(HTTPParser p) { + call_on(on_headers_complete, p); + } + void call_on (HTTPCallback cb, HTTPParser p) { + // cf. CALLBACK2 macro + if (null != cb) { + cb.cb(p); + } + } + void call_on (HTTPDataCallback cb, HTTPParser p, ByteBuffer buf, int pos, int len) { + if (null != cb && -1 != pos) { + cb.cb(p,buf,pos,len); + } + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Message.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Message.java new file mode 100644 index 0000000..62f0a0e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Message.java @@ -0,0 +1,374 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.io.*; +import java.util.*; + +import http_parser.HTTPMethod; +import http_parser.HTTPParserUrl; +import http_parser.ParserType; +import http_parser.lolevel.TestLoaderNG.Header; +import http_parser.lolevel.TestLoaderNG.LastHeader; + +import primitive.collection.ByteList; + +import static http_parser.lolevel.Util.str; + +public class Message { + String name; + byte [] raw; + ParserType type; + HTTPMethod method; + int status_code; + String request_path; // byte [] ? + String request_url; + String fragment ; + String query_string; + byte [] body; + int body_size; + int num_headers; + LastHeader last_header_element; + Map header; + List

      headers; + boolean should_keep_alive; + + byte[] upgrade; + boolean upgrade() { + return null != upgrade; + } + + int http_major; + int http_minor; + + boolean message_begin_called; + boolean headers_complete_called; + boolean message_complete_called; + boolean message_complete_on_eof; + + + Map parsed_header; + String currHField; + String currHValue; + byte [] pbody; + int num_called; + + public String toString() { + StringBuilder b = new StringBuilder(); + b.append("NAME: "); b.append(name);b.append("\n"); + b.append("type: "); b.append(type);b.append("\n"); + b.append("method: "); b.append(method);b.append("\n"); + b.append("status_code: "); b.append(status_code);b.append("\n"); + b.append("request_path: "); b.append(request_path);b.append("\n"); + b.append("request_url: "); b.append(request_url);b.append("\n"); + b.append("fragment: "); b.append(fragment);b.append("\n"); + b.append("query_string: "); b.append(query_string);b.append("\n"); + b.append("body:\n"); b.append(new String(body));b.append("\n"); + b.append("should_keep_alive: "); b.append(should_keep_alive);b.append("\n"); + b.append("upgrade: "); b.append(upgrade);b.append("\n"); + b.append("http_major: "); b.append(http_major);b.append("\n"); + b.append("http_minor: "); b.append(http_minor);b.append("\n"); + b.append("message_complete_called: "); b.append(message_complete_called);b.append("\n"); + return b.toString(); + } + + Message () { + this.header = new HashMap(); + this.headers = new LinkedList
      (); + reset(); + } + /* + *prepare this Test Instance for reuse. + * */ + void reset () { + this.parsed_header = new HashMap(); + this.pbody = null; + this.num_called = 0; + + } + void check (boolean val, String mes) { + if (!val) { + //p(name+" : "+mes); + throw new RuntimeException(name+" : "+mes); + } + } + + + HTTPDataCallback getCB (final String value, final String mes, final TestSettings settings) { + return new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len){ + // if ("url".equals(mes)){ + // p("pos"+pos); + // p("len"+len); + // if (8==pos && 5 == len && "connect request".equals(name)) { + // //throw new RuntimeException(name); + // } + // } + //String str = str(b, pos, len); + ByteList list = settings.map.get(mes); + for (int i=0; i!=len; ++i) { + list.add(b.get(pos+i)); + } + //settings.map.put(mes, prev_val + str); + //check(value.equals(str), "incorrect "+mes+": "+str); + if (-1 == pos) { + throw new RuntimeException("he?"); + } + return 0; + } + }; + } + + void execute () { + p(name); + ByteBuffer buf = ByteBuffer.wrap(raw); + HTTPParser p = new HTTPParser(); + TestSettings s = settings(); + + + + p.execute(s, buf); + if (!p.upgrade) { + // call execute again, else parser can't know message is done + // if no content length is set. + p.execute(s, buf); + } + if (!s.success) { + throw new RuntimeException("Test: "+name+" failed"); + } + } // execute + + void execute_permutations() { + /* + |-|---------------| + |--|--------------| + |---|-------------| + (...) + |---------------|-| + |-----------------| + */ + p(name); + for (int i = 2; i != raw.length; ++i) { + // p(i); + HTTPParser p = new HTTPParser(); + TestSettings s = settings(); + ByteBuffer buf = ByteBuffer.wrap(raw); + int olimit = buf.limit(); + buf.limit(i); + + parse(p,s,buf); + if (!p.upgrade) { + buf.position(i); + buf.limit(olimit); + + parse(p,s,buf); + if (!p.upgrade) { + parse(p,s,buf); + } else { + if (!upgrade()) { + throw new RuntimeException("Test:"+name+"parsed as upgrade, is not"); + } + } + + } else { + if (!upgrade()) { + throw new RuntimeException("Test:"+name+"parsed as upgrade, is not"); + } + } + if (!s.success) { + p(this); + throw new RuntimeException("Test: "+name+" failed"); + } + reset(); + } + //System.exit(0); + } // execute_permutations + void parse(HTTPParser p, ParserSettings s, ByteBuffer b) { + //p("About to parse: "+b.position() + "->" + b.limit()); + p.execute(s, b); + } + + TestSettings settings() { + final TestSettings s = new TestSettings(); + s.on_url = getCB(request_url, "url", s); + s.on_message_begin = new HTTPCallback() { + public int cb (HTTPParser p) { + message_begin_called = true; + return -1; + } + }; + s.on_header_field = new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len){ + if (null != currHValue && null == currHField) { + throw new RuntimeException(name+": shouldn't happen"); + } + if (null != currHField) { + if (null == currHValue) { + currHField += str(b,pos,len); + return 0; + } else { + parsed_header.put(currHField, currHValue); + currHField = null; + currHValue = null; + } + } + currHField = str(b,pos,len); + return 0; + } + }; + s.on_header_value = new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len){ + if (null == currHField) { + throw new RuntimeException(name+" :shouldn't happen field"); + } + if (null == currHValue) { + currHValue = str(b,pos,len); + } else { + currHValue += str(b, pos, len); + } + return 0; + } + }; + s.on_headers_complete = new HTTPCallback() { + public int cb (HTTPParser p) { + headers_complete_called = true; + String parsed_path = null; + String parsed_query = null; + String parsed_url = null; + String parsed_frag = null; + + try { + parsed_url = new String(s.map.get("url").toArray(), "UTF8"); + + HTTPParserUrl u = new HTTPParserUrl(); + HTTPParser pp = new HTTPParser(); + ByteBuffer data = Util.buffer(parsed_url); + pp.parse_url(data,false, u); + + parsed_path = u.getFieldValue(HTTPParser.UrlFields.UF_PATH, data); + parsed_query = u.getFieldValue(HTTPParser.UrlFields.UF_QUERY, data); + parsed_frag = u.getFieldValue(HTTPParser.UrlFields.UF_FRAGMENT, data); + + } catch (java.io.UnsupportedEncodingException uee) { + throw new RuntimeException(uee); + } + + if (!request_path.equals(parsed_path)) { + throw new RuntimeException(name+": invalid path: "+parsed_path+" should be: "+request_path); + } + if (!query_string.equals(parsed_query)) { + throw new RuntimeException(name+": invalid query: "+parsed_query+" should be: "+query_string); + } + if (!request_url.equals(parsed_url)) { + throw new RuntimeException(">"+name+"<: invalid url: >"+parsed_url+"< should be: >"+request_url+"<"); + } + if (!fragment.equals(parsed_frag)) { + throw new RuntimeException(name+": invalid fragement: "+parsed_frag+" should be: "+fragment); + } + if (null != currHValue || null != currHField) { + if (null == currHField || null == currHValue) { + throw new RuntimeException("shouldn't happen"); + } + } + if (null != currHField) { + //p(currHField); + //p(">"+currHValue+"<"); + parsed_header.put(currHField, currHValue); + currHField = null; + currHValue = null; + } + + + return 0; + } + }; + // s.on_headers_complete = new HTTPCallback() { + // public int cb (HTTPParser p) { + // p("Complete:"+name); + // return 0; + // } + // }; + + s.on_body = new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len){ + int l = pbody == null ? len : len + pbody.length; + int off = pbody == null ? 0 : pbody.length; + byte [] nbody = new byte[l]; + + if (null != pbody) { + System.arraycopy(pbody, 0, nbody, 0, pbody.length); + } + + int saved = b.position(); + b.position(pos); + b.get(nbody, off, len); + b.position(saved); + pbody = nbody; + return 0; + } + }; + + s.on_message_complete = new HTTPCallback() { + public int cb(HTTPParser p) { + message_complete_called = true; + num_called += 1; + if ( p.http_minor != http_minor + || p.http_major != http_major + || p.status_code != status_code ) { + + throw new RuntimeException("major/minor/status_code mismatch"); + } + + //check headers + + if (header.keySet().size() != parsed_header.keySet().size()) { + p(parsed_header); + throw new RuntimeException(name+": different amount of headers"); + } + for (String key : header.keySet()) { + String pvalue = parsed_header.get(key); + if (!header.get(key).equals(pvalue)) { + throw new RuntimeException(name+" : different values for :"+key+" is >"+pvalue+"< should: >"+header.get(key)+"<"); + } + } + //check body + if (null == pbody && (null == body || body.length == 0 || body.length == 1)) { + s.success = true; + return 0; + } + if (null == pbody) { + throw new RuntimeException(name+": no body, should be: "+new String(body)); + } + if (pbody.length != body.length) { + p(pbody.length); + p(body.length); + p(new String(pbody)); + p(new String(body)); + throw new RuntimeException(name+": incorrect body length"); + } + for (int i = 0 ; i!= body.length; ++i) { + if (pbody[i] != body[i]) { + throw new RuntimeException("different body"); + } + } + s.success = true; + return 0; + } + }; + return s; + } // settings + static void p(Object o) { + System.out.println(o); + } + + static class TestSettings extends ParserSettings { + public boolean success; + Map map; + TestSettings () { + map = new HashMap(); + map.put("path", new ByteList()); + map.put("query_string", new ByteList()); + map.put("url", new ByteList()); + map.put("fragment", new ByteList()); + } + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/ParseUrl.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/ParseUrl.java new file mode 100644 index 0000000..0e74021 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/ParseUrl.java @@ -0,0 +1,51 @@ +package http_parser.lolevel; + +import http_parser.HTTPParserUrl; +import static http_parser.lolevel.Util.*; + +public class ParseUrl { + public static void test(int i) { + HTTPParserUrl u = new HTTPParserUrl(); + HTTPParser p = new HTTPParser(); + Url test = Url.URL_TESTS[i]; +// System.out.println(":: " + test.name); + int rv = p.parse_url(Util.buffer(test.url),test.is_connect,u); + UnitTest.check_equals(rv, test.rv); + if(test.rv == 0){ + UnitTest.check_equals(u, test.u); + } + + } + public static void test() { + p(ParseUrl.class); + + for (int i = 0; i < Url.URL_TESTS.length; i++) { + test(i); + } + } + + static void usage() { + p("usage: [jre] http_parser.lolevel.ParseUrl [i]"); + p(" i : optional test case id"); + p("---------------------------------------------"); + p("Test Cases:"); + for (int i =0; i!= Url.URL_TESTS.length; ++i) { + p(" "+i+": "+Url.URL_TESTS[i].name); + } + } + + public static void main (String [] args) { + if (0 == args.length) { + test(); + } else { + try { + int i = Integer.parseInt(args[0]); + test(i); + } catch (Throwable t) { + t.printStackTrace(); + usage(); + } + + } + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Requests.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Requests.java new file mode 100644 index 0000000..4367bbb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Requests.java @@ -0,0 +1,69 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.util.*; + +import static http_parser.lolevel.Util.*; +import http_parser.*; + +import primitive.collection.ByteList; + +public class Requests { + + static void test_simple(String req, boolean should_pass) { + HTTPParser parser = new HTTPParser(ParserType.HTTP_REQUEST); + ByteBuffer buf = buffer(req); + boolean passed = false; + int read = 0; + try { + parser.execute(Util.SETTINGS_NULL, buf); + passed = (read == req.length()); + read = parser.execute(Util.SETTINGS_NULL, Util.empty()); + passed &= (0 == read); + } catch (Throwable t) { + passed = false; + } + check(passed == should_pass); + } + static void simple_tests() { + test_simple("hello world", false); + test_simple("GET / HTP/1.1\r\n\r\n", false); + + test_simple("ASDF / HTTP/1.1\r\n\r\n", false); + test_simple("PROPPATCHA / HTTP/1.1\r\n\r\n", false); + test_simple("GETA / HTTP/1.1\r\n\r\n", false); + } + + public static void test () { + p(Requests.class); + simple_tests(); + + List all = TestLoaderNG.load("tests.dumped"); + List requests = new LinkedList(); + for (Message m : all) { + if (ParserType.HTTP_REQUEST == m.type) { + requests.add(m); + } + } + for (Message m : requests) { + test_message(m); + } + + for (int i = 0; i!= requests.size(); ++i) { + if (!requests.get(i).should_keep_alive) continue; + for (int j = 0; j!=requests.size(); ++j) { + if (!requests.get(j).should_keep_alive) continue; + for (int k = 0; k!= requests.size(); ++k) { + test_multiple3(requests.get(i), requests.get(j), requests.get(k)); + } + } + } + + // postpone test_scan + + } + + + + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Responses.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Responses.java new file mode 100644 index 0000000..1cb71dc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Responses.java @@ -0,0 +1,52 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.util.*; + +import static http_parser.lolevel.Util.*; +import http_parser.*; + +import primitive.collection.ByteList; + +public class Responses { + + + + public static void test () { + p(Responses.class); + List all = TestLoaderNG.load("tests.dumped"); + List responses = new LinkedList(); + for (Message m : all) { + if (ParserType.HTTP_RESPONSE == m.type) { + responses.add(m); + } + } + for (Message m : responses) { + test_message(m); + } + + for (int i = 0; i!= responses.size(); ++i) { + if (!responses.get(i).should_keep_alive) continue; + for (int j = 0; j!=responses.size(); ++j) { + if (!responses.get(j).should_keep_alive) continue; + for (int k = 0; k!= responses.size(); ++k) { + test_multiple3(responses.get(i), responses.get(j), responses.get(k)); + } + } + } + + // not sure what test_message_count_body does that test_message doesn't... + // Message m = find(responses, "404 no headers no body"); + // test_message_count_body(m); + // m = find(responses, "200 trailing space on chunked body"); + // test_message_count_body(m); + + // TODO test very large chunked response + + // test_scan is more or less the same as test_permutations, will implement later... + } + + + + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Test.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Test.java new file mode 100644 index 0000000..6c35898 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Test.java @@ -0,0 +1,16 @@ +package http_parser.lolevel; + + +public class Test { + public static void main (String [] args) { + UnitTest.test(); + TestHeaderOverflowError.test(); + TestNoOverflowLongBody.test(); + Responses.test(); + ParseUrl.test(); + Requests.test(); + Upgrade.test(); + WrongContentLength.test(); + } + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestHeaderOverflowError.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestHeaderOverflowError.java new file mode 100644 index 0000000..ee47903 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestHeaderOverflowError.java @@ -0,0 +1,48 @@ +package http_parser.lolevel; + +import java.nio.*; + +import static http_parser.lolevel.Util.*; + +public class TestHeaderOverflowError { + + public static void test (http_parser.ParserType type) { + HTTPParser parser = new HTTPParser(type); + ByteBuffer buf = getBytes(type); + + int numbytes = buf.limit(); + + parser.execute(Util.SETTINGS_NULL, buf); + + check(numbytes == buf.position()); + + buf = buffer("header-key: header-value\r\n"); + numbytes = buf.limit(); + for (int i = 0; i!= 1000; ++i) { + parser.execute(Util.SETTINGS_NULL, buf); + check(numbytes == buf.position()); + + buf.rewind(); + + } + } + + static ByteBuffer getBytes (http_parser.ParserType type) { + if (http_parser.ParserType.HTTP_BOTH == type) { + throw new RuntimeException("only HTTP_REQUEST and HTTP_RESPONSE"); + } + + if (http_parser.ParserType.HTTP_REQUEST == type) { + return buffer("GET / HTTP/1.1\r\n"); + } + return buffer("HTTP/1.0 200 OK\r\n"); + } + + public static void test () { + p(TestHeaderOverflowError.class); + test(http_parser.ParserType.HTTP_REQUEST); + test(http_parser.ParserType.HTTP_RESPONSE); + } + + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestLoaderNG.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestLoaderNG.java new file mode 100644 index 0000000..329485d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestLoaderNG.java @@ -0,0 +1,212 @@ +package http_parser.lolevel; +// name : 200 trailing space on chunked body +// raw : "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n25 \r\nThis is the data in the first chunk\r\n\r\n1C\r\nand this is the second one\r\n\r\n0 \r\n\r\n" +// type : HTTP_RESPONSE +// method: HTTP_DELETE +// status code :200 +// request_path: +// request_url : +// fragment : +// query_string: +// body :"This is the data in the first chunk\r\nand this is the second one\r\n" +// body_size :65 +// header_0 :{ "Content-Type": "text/plain"} +// header_1 :{ "Transfer-Encoding": "chunked"} +// should_keep_alive :1 +// upgrade :0 +// http_major :1 +// http_minor :1 + + +import java.io.FileReader; +import java.io.BufferedReader; +import java.io.StringReader; +import java.io.Reader; +import java.io.Reader; +import java.io.IOException; + +import java.util.*; +import java.util.regex.*; + +import java.nio.ByteBuffer; + +import http_parser.HTTPMethod; +import http_parser.ParserType; + +public class TestLoaderNG { + String fn; + public TestLoaderNG(String filename) { + this.fn = filename; + } + static void p(Object o) { + System.out.println(o); + } + public static List load (String fn) { + List list = null; + try { + BufferedReader buf = new BufferedReader(new FileReader(fn)); + list = load(buf); + } catch (Throwable t) { + throw new RuntimeException(t); + } + return list; + + } + public static Message parse (String message) { + List list = load(new BufferedReader(new StringReader(message))); + if (null == list || 0 == list.size() ) { + return null; + } + return list.get(0); + } + + public static List load (BufferedReader buf) { + List list = new LinkedList(); + String line = null; + Message curr = new Message(); + Pattern pattern = Pattern.compile("(\\S+)\\s*:(.*)"); + try { + while (null != (line = buf.readLine()) ){ + if ("".equals(line.trim())) { + list.add (curr); + curr = new Message(); + continue; + } + Matcher m = pattern.matcher(line); + if (m.matches()) { + // you can not be fucking serious!? + // this has got to be the most retarded regex + // interface in the history of the world ... + // (though I'm sure there's worse c++ regexp libs...) + MatchResult r = m.toMatchResult(); + String key = r.group(1).trim(); + String value = r.group(2).trim(); + if ("name".equals(key)) {curr.name = value;} + else if ("raw".equals(key)) {curr.raw = toByteArray(value);} //! + else if ("type".equals(key)) {curr.type = ParserType.parse(value);} + else if ("method".equals(key)) {curr.method = HTTPMethod.parse(value);} + else if ("status_code".equals(key)) {curr.status_code = Integer.parseInt(value);} + else if ("request_path".equals(key)) {curr.request_path = value;} + else if ("request_url".equals(key)) {curr.request_url = value;} + + else if ("fragment".equals(key)) {curr.fragment = value;} + else if ("query_string".equals(key)) {curr.query_string = value;} + else if ("body".equals(key)) {curr.body = toByteArray(value);} //! + else if ("body_size".equals(key)) {curr.body_size = Integer.parseInt(value);} + else if (key.startsWith("header")) { + String [] h = getHeader(value); + curr.header.put(h[0], h[1]); + } + else if ("should_keep_alive".equals(key)) + {curr.should_keep_alive = (1 == Integer.parseInt(value));} + else if ("upgrade".equals(key)) { curr.upgrade = toByteArray(value);} + else if ("http_major".equals(key)) {curr.http_major = Integer.parseInt(value);} + else if ("http_minor".equals(key)) {curr.http_minor = Integer.parseInt(value);} + } else { + p("WTF?"+line); + } + + } + } catch (Throwable t) { + throw new RuntimeException(t); + } + return list; + } + + static String [] getHeader(String value) { + // { "Host": "0.0.0.0=5000"} + Pattern p = Pattern.compile("\\{ ?\"([^\"]*)\": ?\"(.*)\"}"); + Matcher m = p.matcher(value); + if (!m.matches()) { + p(value); + throw new RuntimeException("something wrong"); + } + String [] result = new String[2]; + MatchResult r = m.toMatchResult(); + result[0] = r.group(1).trim(); + result[1] = r.group(2); //.trim(); + return result; + } + + static final byte BSLASH = 0x5c; + static final byte QUOT = 0x22; + static final byte CR = 0x0d; + static final byte LF = 0x0a; + static final byte n = 0x6e; + static final byte r = 0x72; + + static final Byte[] JAVA_GENERICS_ROCK_HARD = new Byte[0]; + + + static byte [] toByteArray (String quotedString) { + ArrayList bytes = new ArrayList(); + String s = quotedString.substring(1, quotedString.length()-1); + byte [] byts = s.getBytes(java.nio.charset.Charset.forName("UTF8")); + boolean escaped = false; + for (byte b : byts) { + switch (b) { + case BSLASH: + escaped = true; + break; + case n: + if (escaped) { + bytes.add(LF); + escaped = false; + } else { + bytes.add(b); + } + break; + case r: + if (escaped) { + escaped = false; + bytes.add(CR); + } else { + bytes.add(b); + } + break; + case QUOT: + escaped = false; + bytes.add(QUOT); + break; + default: + bytes.add(b); + } + + } + + byts = new byte[bytes.size()]; + int i = 0; + for (Byte b : bytes) { + byts[i++]=b; + } + return byts; + } + + public static void main(String [] args) throws Throwable { + //TestLoaderNG l = new TestLoaderNG(args[0]); + List ts = load(args[0]); + for (Message t : ts) { +// for (int i =0; i!= t.raw.length; ++i) { +// p(i+":"+t.raw[i]); +// } +// try { + t.execute_permutations(); +// } catch (Throwable th) { +// p("failed: "+t.name); +// } + t.execute(); + // System.exit(0); + } + } + + class Header { + String field; + String value; + } + enum LastHeader { + NONE + ,FIELD + ,VALUE + } + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestNoOverflowLongBody.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestNoOverflowLongBody.java new file mode 100644 index 0000000..13d8ea0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestNoOverflowLongBody.java @@ -0,0 +1,62 @@ +package http_parser.lolevel; + +import java.nio.*; + +import static http_parser.lolevel.Util.*; + +public class TestNoOverflowLongBody { + + public static void test (http_parser.ParserType type, int len) { + HTTPParser parser = new HTTPParser(type); + ByteBuffer buf = getBytes(type, len); + + int buflen = buf.limit(); + + parser.execute(Util.SETTINGS_NULL, buf); + + check(buflen == buf.position()); + + buf = buffer("a"); + buflen = buf.limit(); + + for (int i = 0; i!= len; ++i) { + parser.execute(Util.SETTINGS_NULL, buf); + check(buflen == buf.position()); + buf.rewind(); + } + + buf = getBytes(type, len); + buflen = buf.limit(); + + parser.execute(Util.SETTINGS_NULL, buf); + + check(buflen == buf.position()); + + } + + static ByteBuffer getBytes (http_parser.ParserType type, int length) { + if (http_parser.ParserType.HTTP_BOTH == type) { + throw new RuntimeException("only HTTP_REQUEST and HTTP_RESPONSE"); + } + + String template = "%s\r\nConnection: Keep-Alive\r\nContent-Length: %d\r\n\r\n"; + String str = null; + if (http_parser.ParserType.HTTP_REQUEST == type) { + str = String.format(template, "GET / HTTP/1.1", length); + } else { + str = String.format(template, "HTTP/1.0 200 OK", length); + } + return buffer(str); + } + + public static void test () { + p(TestNoOverflowLongBody.class); + test(http_parser.ParserType.HTTP_REQUEST, 1000); + test(http_parser.ParserType.HTTP_REQUEST, 100000); + test(http_parser.ParserType.HTTP_RESPONSE, 1000); + test(http_parser.ParserType.HTTP_RESPONSE, 100000); + } + + + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/UnitTest.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/UnitTest.java new file mode 100644 index 0000000..4159980 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/UnitTest.java @@ -0,0 +1,117 @@ +package http_parser.lolevel; + +import java.nio.ByteBuffer; +import http_parser.HTTPException; +import http_parser.Util; + +public class UnitTest { + + static void p(Object o) {System.out.println(o);} + + public static void testErrorFormat() { + String bla = "This has an error in position 10 (the n in 'an')"; + ByteBuffer buf = ByteBuffer.wrap(bla.getBytes()); + buf.position(10); + + String mes = +"This has an error in position 10 (the n in 'an')\n" + +"..........^"; + + check_equals(mes, Util.error ("test error", buf, 0)); + + + bla = "123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J"; + buf = ByteBuffer.wrap(bla.getBytes()); + buf.position(50); + mes = +"56789B123456789C123456789D123456789E123456789F123456789G123456789H123456\n"+ +"....................................^"; + check_equals(mes, Util.error("test trim right and left", buf, 0)); + + + buf.position(5); + mes = +"123456789A123456789B123456789C123456789D123456789E123456789F123456789G12\n"+ +".....^"; + check_equals(mes, Util.error("test trim right", buf, 0)); + + + int limit = buf.limit(); + buf.limit(10); + mes = +"123456789A\n"+ +".....^"; + check_equals(mes, Util.error("all before, not enough after", buf, 0)); + + + + buf.limit(limit); + buf.position(90); + mes = +"9C123456789D123456789E123456789F123456789G123456789H123456789I123456789J\n"+ +"..............................................................^"; + check_equals(mes, Util.error("test trim left", buf, 10)); + } + + + // Test that the error callbacks are properly called. + public static void testErrorCallback () { + String nothttp = "THis is certainly not valid HTTP"; + ByteBuffer buf = ByteBuffer.wrap(nothttp.getBytes()); + + ParserSettings s = new ParserSettings(); + s.on_error = new HTTPErrorCallback() { + public void cb (HTTPParser p, String mes, ByteBuffer buf, int pos) { + throw new HTTPException(mes); + } + }; // err callback + + + HTTPParser p = new HTTPParser(); + try { + p.execute(s, buf); + } catch (HTTPException e) { + check_equals("Invalid HTTP method", e.getMessage()); + } + + buf = ByteBuffer.wrap("GET / HTTP 1.10000".getBytes()); + p = new HTTPParser(); + try { + p.execute(s, buf); + } catch (HTTPException e) { + check_equals("ridiculous http minor", e.getMessage()); + } + + // if no error handler is defined, behave just like the above... + ParserSettings s0 = new ParserSettings(); + + buf = ByteBuffer.wrap("THis is certainly not valid HTTP".getBytes()); + p = new HTTPParser(); + try { + p.execute(s0, buf); + } catch (HTTPException e) { + check_equals("Invalid HTTP method", e.getMessage()); + } + + buf = ByteBuffer.wrap("GET / HTTP 1.10000".getBytes()); + p = new HTTPParser(); + try { + p.execute(s0, buf); + } catch (HTTPException e) { + check_equals("ridiculous http minor", e.getMessage()); + } + } + + static void check_equals(Object supposed2be, Object is) { + if (!supposed2be.equals(is)) { + throw new RuntimeException(is + " is supposed to be "+supposed2be); + } + } + + + public static void test () { + p(UnitTest.class); + testErrorFormat(); + testErrorCallback(); + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Upgrade.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Upgrade.java new file mode 100644 index 0000000..9af3d4a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Upgrade.java @@ -0,0 +1,27 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.util.*; + +import http_parser.ParserType; + +import static http_parser.lolevel.Util.*; + +public class Upgrade { + static final String upgrade = "GET /demo HTTP/1.1\r\n" + + "Connection: Upgrade\r\n" + + "Upgrade: WebSocket\r\n\r\n" + + "third key data"; + static void test () { + p(Upgrade.class); + HTTPParser parser = new HTTPParser(ParserType.HTTP_REQUEST); + ByteBuffer buf = buffer(upgrade); + + int read = parser.execute(Util.SETTINGS_NULL, buf); + check (63 == read); + String s = str(buf); + check ("third key data".equals(str(buf))); + + } + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Url.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Url.java new file mode 100644 index 0000000..35469d1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Url.java @@ -0,0 +1,127 @@ +package http_parser.lolevel; + +import http_parser.FieldData; +import http_parser.HTTPParserUrl; + +import static http_parser.HTTPParserUrl.*; +import static http_parser.lolevel.HTTPParser.*; + +/** + */ +public class Url { + + public static Url[] URL_TESTS = new Url[]{ + new Url("proxy request", "http://hostname/", false, + new HTTPParserUrl( + (1 << UrlFields.UF_SCHEMA.getIndex()) | (1 << UrlFields.UF_HOST.getIndex()) | (1 << UrlFields.UF_PATH.getIndex()), + 0, + new FieldData[]{ + new FieldData(0,4), + new FieldData(7,8), + new FieldData(0,0), + new FieldData(15,1), + new FieldData(0,0), + new FieldData(0,0) + }), + 0), + new Url("CONNECT request", "hostname:443", true, + new HTTPParserUrl( + (1 << UrlFields.UF_HOST.getIndex()) | (1 << UrlFields.UF_PORT.getIndex()), + 443, + new FieldData[]{ + new FieldData(0,0), + new FieldData(0,8), + new FieldData(9,3), + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0) + }), + 0), + new Url("proxy ipv6 request", "http://[1:2::3:4]/", false, + new HTTPParserUrl( + (1 << UrlFields.UF_SCHEMA.getIndex()) | (1 << UrlFields.UF_HOST.getIndex()) | (1 << UrlFields.UF_PATH.getIndex()), + 0, + new FieldData[]{ + new FieldData(0,4), + new FieldData(8,8), + new FieldData(0,0), + new FieldData(17,1), + new FieldData(0,0), + new FieldData(0,0) + }), + 0), + new Url("CONNECT ipv6 address", "[1:2::3:4]:443", true, + new HTTPParserUrl( + (1 << UrlFields.UF_HOST.getIndex()) | (1 << UrlFields.UF_PORT.getIndex()), + 443, + new FieldData[]{ + new FieldData(0,0), + new FieldData(1,8), + new FieldData(11,3), + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0) + }), + 0), + new Url("extra ? in query string", + "http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css,fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css,fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css", + false, + new HTTPParserUrl( + (1 << UrlFields.UF_SCHEMA.getIndex()) | + (1 << UrlFields.UF_HOST.getIndex()) | + (1 << UrlFields.UF_PATH.getIndex()) | + (1 << UrlFields.UF_QUERY.getIndex()), + 0, + new FieldData[]{ + new FieldData(0,4), + new FieldData(7,10), + new FieldData(0,0), + new FieldData(17,12), + new FieldData(30,187), + new FieldData(0,0) + }), + 0), + new Url("proxy empty host", + "http://:443/", + false, + null, + 1), + new Url("proxy empty port", + "http://hostname:/", + false, + null, + 1), + new Url("CONNECT empty host", + ":443", + true, + null, + 1), + new Url("CONNECT empty port", + "hostname:", + true, + null, + 1), + new Url("CONNECT with extra bits", + "hostname:443/", + true, + null, + 1), + + }; + + String name; + String url; + boolean is_connect; + HTTPParserUrl u; + int rv; + + public Url(String name, String url, boolean is_connect, HTTPParserUrl u, int rv) { + this.name = name; + this.url = url; + this.is_connect = is_connect; + this.u = u; + this.rv = rv; + } + + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Util.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Util.java new file mode 100644 index 0000000..c73d9e6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Util.java @@ -0,0 +1,236 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.util.*; + +import primitive.collection.ByteList; + +import http_parser.*; + +public class Util { + + static final ParserSettings SETTINGS_NULL = new ParserSettings(); + + static String str (ByteBuffer b, int pos, int len) { + byte [] by = new byte[len]; + int saved = b.position(); + b.position(pos); + b.get(by); + b.position(saved); + return new String(by); + } + static String str (ByteBuffer b) { + int len = b.limit() - b.position(); + byte [] by = new byte[len]; + int saved = b.position(); + b.get(by); + b.position(saved); + return new String(by); + } + + static ByteBuffer buffer(String str) { + return ByteBuffer.wrap(str.getBytes()); + } + + static ByteBuffer empty() { + return ByteBuffer.wrap(new byte[0]); + } + + static void check(boolean betterBtrue) { + if (!betterBtrue) { + throw new RuntimeException("!"); + } + } + static void check (int should, int is) { + if (should != is) { + throw new RuntimeException("should be: "+should+" is:"+is); + } + } + + static void test_message(Message mes) { + int raw_len = mes.raw.length; + for (int msg1len = 0; msg1len != raw_len; ++msg1len) { + mes.reset(); + ByteBuffer msg1 = ByteBuffer.wrap(mes.raw, 0, msg1len); + ByteBuffer msg2 = ByteBuffer.wrap(mes.raw, msg1len, mes.raw.length - msg1len); + + HTTPParser parser = new HTTPParser(mes.type); + ParserSettings settings = mes.settings(); + + int read = 0; + if (msg1len !=0) { + read = parser.execute(settings, msg1); + if (mes.upgrade() && parser.upgrade) { + // Messages have a settings() that checks itself... + check(1 == mes.num_called); + continue; + } + check(read == msg1len); + } + + read = parser.execute(settings, msg2); + if (mes.upgrade() && parser.upgrade) { + check(1 == mes.num_called); + continue; + } + + check( mes.raw.length - msg1len, read); + + ByteBuffer empty = Util.empty(); + read = parser.execute(settings, empty); + + if (mes.upgrade() && parser.upgrade) { + check(1 == mes.num_called); + continue; + } + check(empty.position() == empty.limit()); + check(0 == read); + check(1 == mes.num_called); + + } + } + + static void test_multiple3(Message r1, Message r2, Message r3) { + int message_count = 1; + if (!r1.upgrade()) { + message_count++; + if (!r2.upgrade()) { + message_count++; + } + } + boolean has_upgrade = (message_count < 3 || r3.upgrade()); + + ByteList blist = new ByteList(); + blist.addAll(r1.raw); + blist.addAll(r2.raw); + blist.addAll(r3.raw); + + byte [] raw = blist.toArray(); + ByteBuffer buf = ByteBuffer.wrap(raw); + + Util.Settings settings = Util.settings(); + HTTPParser parser = new HTTPParser(r1.type); + + int read = parser.execute(settings, buf); + if (has_upgrade && parser.upgrade) { + raw = upgrade_message_fix(raw, read, r1,r2,r3); + check(settings.numCalled == message_count); + return; + } + + check(read == raw.length); + + buf = Util.empty(); + read = parser.execute(settings, buf); + if (has_upgrade && parser.upgrade) { + check(settings.numCalled == message_count); + return; + } + + check(0 == read); + check(settings.numCalled == message_count); + } + + /* Given a sequence of bytes and the number of these that we were able to + * parse, verify that upgrade bodies are correct. + */ + static byte [] upgrade_message_fix(byte[] body, int nread, Message... msgs) { + int off = 0; + for (Message m : msgs) { + off += m.raw.length; + if (m.upgrade()) { + off -= m.upgrade.length; + // Original C: + // Check the portion of the response after its specified upgrade + // if (!check_str_eq(m, "upgrade", body + off, body + nread)) { + // abort(); + // } + // to me, this seems to be equivalent to comparing off and nread ... + check (off, nread); + + // Original C: + // Fix up the response so that message_eq() will verify the beginning + // of the upgrade */ + // + // *(body + nread + strlen(m->upgrade)) = '\0'; + // This only shortens body so the strlen check passes. + return new byte[off]; + + } + } + return null; + } +//upgrade_message_fix(char *body, const size_t nread, const size_t nmsgs, ...) { +// va_list ap; +// size_t i; +// size_t off = 0; +// +// va_start(ap, nmsgs); +// +// for (i = 0; i < nmsgs; i++) { +// struct message *m = va_arg(ap, struct message *); +// +// off += strlen(m->raw); +// +// if (m->upgrade) { +// off -= strlen(m->upgrade); +// +// /* Check the portion of the response after its specified upgrade */ +// if (!check_str_eq(m, "upgrade", body + off, body + nread)) { +// abort(); +// } +// +// /* Fix up the response so that message_eq() will verify the beginning +// * of the upgrade */ +// *(body + nread + strlen(m->upgrade)) = '\0'; +// messages[num_messages -1 ].upgrade = body + nread; +// +// va_end(ap); +// return; +// } +// } +// +// va_end(ap); +// printf("\n\n*** Error: expected a message with upgrade ***\n"); +// +// abort(); +//} + static void p (Object o) { + System.out.println(o); + } + + static Settings settings() { + return new Settings(); + } + static Message find(List list, String name) { + for (Message m : list) { + if (name.equals(m.name)) { + return m; + } + } + return null; + } + + static class Settings extends ParserSettings { + public int numCalled; + public int bodyCount; + Settings() { + this.on_message_complete = new HTTPCallback() { + public int cb (HTTPParser parser) { + numCalled++; + return 0; + } + }; + this.on_body = new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len) { + bodyCount += len; + return 0; + } + }; + } + + int numCalled () { + return this.numCalled; + } + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/WrongContentLength.java b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/WrongContentLength.java new file mode 100644 index 0000000..fc8f081 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/WrongContentLength.java @@ -0,0 +1,59 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.util.*; + +import http_parser.ParserType; + +import static http_parser.lolevel.Util.*; + +public class WrongContentLength { + static final String contentLength = "GET / HTTP/1.0\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "hello" + + "hello_again"; + static void test () { + p(WrongContentLength.class); + HTTPParser parser = new HTTPParser(ParserType.HTTP_REQUEST); + ByteBuffer buf = buffer(contentLength); + + Settings settings = new Settings(); + + int read = parser.execute(settings, buf); + check (settings.msg_cmplt_called); + check ("invalid method".equals(settings.err)); + + } + public static void main(String [] args) { + test(); + } + + static class Settings extends ParserSettings { + public int bodyCount; + public boolean msg_cmplt_called; + public String err; + Settings () { + this.on_message_complete = new HTTPCallback () { + public int cb (HTTPParser p) { + check (5 == bodyCount); + msg_cmplt_called = true; + return 0; + } + }; + this.on_body = new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len) { + bodyCount += len; + check ("hello".equals(str(b, pos, len))); + return 0; + } + }; + this.on_error = new HTTPErrorCallback() { + public void cb (HTTPParser p, String mes, ByteBuffer b, int i) { + err = mes; + } + }; + } + } + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/test.c b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/test.c new file mode 100644 index 0000000..3840747 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/test.c @@ -0,0 +1,3425 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include +#include +#include +#include /* rand */ +#include +#include + +#undef TRUE +#define TRUE 1 +#undef FALSE +#define FALSE 0 + +#define MAX_HEADERS 13 +#define MAX_ELEMENT_SIZE 2048 + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +static http_parser *parser; + +struct message { + const char *name; // for debugging purposes + const char *raw; + enum http_parser_type type; + enum http_method method; + int status_code; + char request_path[MAX_ELEMENT_SIZE]; + char request_url[MAX_ELEMENT_SIZE]; + char fragment[MAX_ELEMENT_SIZE]; + char query_string[MAX_ELEMENT_SIZE]; + char body[MAX_ELEMENT_SIZE]; + size_t body_size; + const char *host; + const char *userinfo; + uint16_t port; + int num_headers; + enum { NONE=0, FIELD, VALUE } last_header_element; + char headers [MAX_HEADERS][2][MAX_ELEMENT_SIZE]; + int should_keep_alive; + + const char *upgrade; // upgraded body + + unsigned short http_major; + unsigned short http_minor; + + int message_begin_cb_called; + int headers_complete_cb_called; + int message_complete_cb_called; + int message_complete_on_eof; + int body_is_final; +}; + +static int currently_parsing_eof; + +static struct message messages[5]; +static int num_messages; +static http_parser_settings *current_pause_parser; + +/* * R E Q U E S T S * */ +const struct message requests[] = +#define CURL_GET 0 +{ {.name= "curl get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.1\r\n" + "User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 3 + ,.headers= + { { "User-Agent", "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1" } + , { "Host", "0.0.0.0=5000" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define FIREFOX_GET 1 +, {.name= "firefox get" + ,.type= HTTP_REQUEST + ,.raw= "GET /favicon.ico HTTP/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\n" + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" + "Accept-Language: en-us,en;q=0.5\r\n" + "Accept-Encoding: gzip,deflate\r\n" + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" + "Keep-Alive: 300\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/favicon.ico" + ,.request_url= "/favicon.ico" + ,.num_headers= 8 + ,.headers= + { { "Host", "0.0.0.0=5000" } + , { "User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0" } + , { "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" } + , { "Accept-Language", "en-us,en;q=0.5" } + , { "Accept-Encoding", "gzip,deflate" } + , { "Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7" } + , { "Keep-Alive", "300" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define DUMBFUCK 2 +, {.name= "dumbfuck" + ,.type= HTTP_REQUEST + ,.raw= "GET /dumbfuck HTTP/1.1\r\n" + "aaaaaaaaaaaaa:++++++++++\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/dumbfuck" + ,.request_url= "/dumbfuck" + ,.num_headers= 1 + ,.headers= + { { "aaaaaaaaaaaaa", "++++++++++" } + } + ,.body= "" + } + +#define FRAGMENT_IN_URI 3 +, {.name= "fragment in url" + ,.type= HTTP_REQUEST + ,.raw= "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "page=1" + ,.fragment= "posts-17408" + ,.request_path= "/forums/1/topics/2375" + /* XXX request url does include fragment? */ + ,.request_url= "/forums/1/topics/2375?page=1#posts-17408" + ,.num_headers= 0 + ,.body= "" + } + +#define GET_NO_HEADERS_NO_BODY 4 +, {.name= "get no headers no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_no_headers_no_body/world HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_no_headers_no_body/world" + ,.request_url= "/get_no_headers_no_body/world" + ,.num_headers= 0 + ,.body= "" + } + +#define GET_ONE_HEADER_NO_BODY 5 +, {.name= "get one header no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_one_header_no_body HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_one_header_no_body" + ,.request_url= "/get_one_header_no_body" + ,.num_headers= 1 + ,.headers= + { { "Accept" , "*/*" } + } + ,.body= "" + } + +#define GET_FUNKY_CONTENT_LENGTH 6 +, {.name= "get funky content length body hello" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_funky_content_length_body_hello HTTP/1.0\r\n" + "conTENT-Length: 5\r\n" + "\r\n" + "HELLO" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_funky_content_length_body_hello" + ,.request_url= "/get_funky_content_length_body_hello" + ,.num_headers= 1 + ,.headers= + { { "conTENT-Length" , "5" } + } + ,.body= "HELLO" + } + +#define POST_IDENTITY_BODY_WORLD 7 +, {.name= "post identity body world" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_identity_body_world?q=search#hey HTTP/1.1\r\n" + "Accept: */*\r\n" + "Transfer-Encoding: identity\r\n" + "Content-Length: 5\r\n" + "\r\n" + "World" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "q=search" + ,.fragment= "hey" + ,.request_path= "/post_identity_body_world" + ,.request_url= "/post_identity_body_world?q=search#hey" + ,.num_headers= 3 + ,.headers= + { { "Accept", "*/*" } + , { "Transfer-Encoding", "identity" } + , { "Content-Length", "5" } + } + ,.body= "World" + } + +#define POST_CHUNKED_ALL_YOUR_BASE 8 +, {.name= "post - chunked body: all your base are belong to us" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_chunked_all_your_base HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "1e\r\nall your base are belong to us\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/post_chunked_all_your_base" + ,.request_url= "/post_chunked_all_your_base" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding" , "chunked" } + } + ,.body= "all your base are belong to us" + } + +#define TWO_CHUNKS_MULT_ZERO_END 9 +, {.name= "two chunks ; triple zero ending" + ,.type= HTTP_REQUEST + ,.raw= "POST /two_chunks_mult_zero_end HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "000\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/two_chunks_mult_zero_end" + ,.request_url= "/two_chunks_mult_zero_end" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + } + +#define CHUNKED_W_TRAILING_HEADERS 10 +, {.name= "chunked with trailing headers. blech." + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_trailing_headers HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "0\r\n" + "Vary: *\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_trailing_headers" + ,.request_url= "/chunked_w_trailing_headers" + ,.num_headers= 3 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Vary", "*" } + , { "Content-Type", "text/plain" } + } + ,.body= "hello world" + } + +#define CHUNKED_W_BULLSHIT_AFTER_LENGTH 11 +, {.name= "with bullshit after the length" + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_bullshit_after_length HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5; ihatew3;whatthefuck=aretheseparametersfor\r\nhello\r\n" + "6; blahblah; blah\r\n world\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_bullshit_after_length" + ,.request_url= "/chunked_w_bullshit_after_length" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + } + +#define WITH_QUOTES 12 +, {.name= "with quotes" + ,.type= HTTP_REQUEST + ,.raw= "GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=\"bar\"" + ,.fragment= "" + ,.request_path= "/with_\"stupid\"_quotes" + ,.request_url= "/with_\"stupid\"_quotes?foo=\"bar\"" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define APACHEBENCH_GET 13 +/* The server receiving this request SHOULD NOT wait for EOF + * to know that content-length == 0. + * How to represent this in a unit test? message_complete_on_eof + * Compare with NO_CONTENT_LENGTH_RESPONSE. + */ +, {.name = "apachebench get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.0\r\n" + "Host: 0.0.0.0:5000\r\n" + "User-Agent: ApacheBench/2.3\r\n" + "Accept: */*\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 3 + ,.headers= { { "Host", "0.0.0.0:5000" } + , { "User-Agent", "ApacheBench/2.3" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define QUERY_URL_WITH_QUESTION_MARK_GET 14 +/* Some clients include '?' characters in query strings. + */ +, {.name = "query url with question mark" + ,.type= HTTP_REQUEST + ,.raw= "GET /test.cgi?foo=bar?baz HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=bar?baz" + ,.fragment= "" + ,.request_path= "/test.cgi" + ,.request_url= "/test.cgi?foo=bar?baz" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define PREFIX_NEWLINE_GET 15 +/* Some clients, especially after a POST in a keep-alive connection, + * will send an extra CRLF before the next request + */ +, {.name = "newline prefix get" + ,.type= HTTP_REQUEST + ,.raw= "\r\nGET /test HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define UPGRADE_REQUEST 16 +, {.name = "upgrade request" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Host: example.com\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" + "Sec-WebSocket-Protocol: sample\r\n" + "Upgrade: WebSocket\r\n" + "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" + "Origin: http://example.com\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.num_headers= 7 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Host", "example.com" } + , { "Connection", "Upgrade" } + , { "Sec-WebSocket-Key2", "12998 5 Y3 1 .P00" } + , { "Sec-WebSocket-Protocol", "sample" } + , { "Upgrade", "WebSocket" } + , { "Sec-WebSocket-Key1", "4 @1 46546xW%0l 1 5" } + , { "Origin", "http://example.com" } + } + ,.body= "" + } + +#define CONNECT_REQUEST 17 +, {.name = "connect request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + "some data\r\n" + "and yet even more data" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "0-home0.netscape.com:443" + ,.num_headers= 2 + ,.upgrade="some data\r\nand yet even more data" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#define REPORT_REQ 18 +, {.name= "report request" + ,.type= HTTP_REQUEST + ,.raw= "REPORT /test HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_REPORT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define NO_HTTP_VERSION 19 +, {.name= "request with no http version" + ,.type= HTTP_REQUEST + ,.raw= "GET /\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 0 + ,.http_minor= 9 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define MSEARCH_REQ 20 +, {.name= "m-search request" + ,.type= HTTP_REQUEST + ,.raw= "M-SEARCH * HTTP/1.1\r\n" + "HOST: 239.255.255.250:1900\r\n" + "MAN: \"ssdp:discover\"\r\n" + "ST: \"ssdp:all\"\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_MSEARCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "*" + ,.request_url= "*" + ,.num_headers= 3 + ,.headers= { { "HOST", "239.255.255.250:1900" } + , { "MAN", "\"ssdp:discover\"" } + , { "ST", "\"ssdp:all\"" } + } + ,.body= "" + } + +#define LINE_FOLDING_IN_HEADER 21 +, {.name= "line folding in header value" + ,.type= HTTP_REQUEST + ,.raw= "GET / HTTP/1.1\r\n" + "Line1: abc\r\n" + "\tdef\r\n" + " ghi\r\n" + "\t\tjkl\r\n" + " mno \r\n" + "\t \tqrs\r\n" + "Line2: \t line2\t\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 2 + ,.headers= { { "Line1", "abcdefghijklmno qrs" } + , { "Line2", "line2\t" } + } + ,.body= "" + } + + +#define QUERY_TERMINATED_HOST 22 +, {.name= "host terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org?hail=all" + ,.host= "hypnotoad.org" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define QUERY_TERMINATED_HOSTPORT 23 +, {.name= "host:port terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234?hail=all" + ,.host= "hypnotoad.org" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define SPACE_TERMINATED_HOSTPORT 24 +, {.name= "host:port terminated by a space" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234" + ,.host= "hypnotoad.org" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define PATCH_REQ 25 +, {.name = "PATCH request" + ,.type= HTTP_REQUEST + ,.raw= "PATCH /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/example\r\n" + "If-Match: \"e0023aa4e\"\r\n" + "Content-Length: 10\r\n" + "\r\n" + "cccccccccc" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PATCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.num_headers= 4 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/example" } + , { "If-Match", "\"e0023aa4e\"" } + , { "Content-Length", "10" } + } + ,.body= "cccccccccc" + } + +#define CONNECT_CAPS_REQUEST 26 +, {.name = "connect caps request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "HOME0.NETSCAPE.COM:443" + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#if !HTTP_PARSER_STRICT +#define UTF8_PATH_REQ 27 +, {.name= "utf-8 path request" + ,.type= HTTP_REQUEST + ,.raw= "GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\n" + "Host: github.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "q=1" + ,.fragment= "narf" + ,.request_path= "/δ¶/δt/pope" + ,.request_url= "/δ¶/δt/pope?q=1#narf" + ,.num_headers= 1 + ,.headers= { {"Host", "github.com" } + } + ,.body= "" + } + +#define HOSTNAME_UNDERSCORE 28 +, {.name = "hostname underscore" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT home_0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "home_0.netscape.com:443" + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } +#endif /* !HTTP_PARSER_STRICT */ + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_NO_CONNECTION_CLOSE 29 +, {.name = "eat CRLF between requests, no \"Connection: close\" header" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 3 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + } + ,.body= "q=42" + } + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_WITH_CONNECTION_CLOSE 30 +, {.name = "eat CRLF between requests even if \"Connection: close\" is set" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "Connection: close\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE /* input buffer isn't empty when on_message_complete is called */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 4 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + , { "Connection", "close" } + } + ,.body= "q=42" + } + +#define PURGE_REQ 31 +, {.name = "PURGE request" + ,.type= HTTP_REQUEST + ,.raw= "PURGE /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PURGE + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.num_headers= 1 + ,.headers= { { "Host", "www.example.com" } } + ,.body= "" + } + +#define SEARCH_REQ 32 +, {.name = "SEARCH request" + ,.type= HTTP_REQUEST + ,.raw= "SEARCH / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_SEARCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 1 + ,.headers= { { "Host", "www.example.com" } } + ,.body= "" + } + +#define PROXY_WITH_BASIC_AUTH 33 +, {.name= "host:port and basic_auth" + ,.type= HTTP_REQUEST + ,.raw= "GET http://a%12:b!&*$@hypnotoad.org:1234/toto HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.fragment= "" + ,.request_path= "/toto" + ,.request_url= "http://a%12:b!&*$@hypnotoad.org:1234/toto" + ,.host= "hypnotoad.org" + ,.userinfo= "a%12:b!&*$" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + + +, {.name= NULL } /* sentinel */ +}; + +/* * R E S P O N S E S * */ +const struct message responses[] = +#define GOOGLE_301 0 +{ {.name= "google 301" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301 Moved Permanently\r\n" + "Location: http://www.google.com/\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Date: Sun, 26 Apr 2009 11:11:49 GMT\r\n" + "Expires: Tue, 26 May 2009 11:11:49 GMT\r\n" + "X-$PrototypeBI-Version: 1.6.0.3\r\n" /* $ char in header field */ + "Cache-Control: public, max-age=2592000\r\n" + "Server: gws\r\n" + "Content-Length: 219 \r\n" + "\r\n" + "\n" + "301 Moved\n" + "

      301 Moved

      \n" + "The document has moved\n" + "
      here.\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.num_headers= 8 + ,.headers= + { { "Location", "http://www.google.com/" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Date", "Sun, 26 Apr 2009 11:11:49 GMT" } + , { "Expires", "Tue, 26 May 2009 11:11:49 GMT" } + , { "X-$PrototypeBI-Version", "1.6.0.3" } + , { "Cache-Control", "public, max-age=2592000" } + , { "Server", "gws" } + , { "Content-Length", "219 " } + } + ,.body= "\n" + "301 Moved\n" + "

      301 Moved

      \n" + "The document has moved\n" + "here.\r\n" + "\r\n" + } + +#define NO_CONTENT_LENGTH_RESPONSE 1 +/* The client should wait for the server's EOF. That is, when content-length + * is not specified, and "Connection: close", the end of body is specified + * by the EOF. + * Compare with APACHEBENCH_GET + */ +, {.name= "no content-length response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 04 Aug 2009 07:59:32 GMT\r\n" + "Server: Apache\r\n" + "X-Powered-By: Servlet/2.5 JSP/2.1\r\n" + "Content-Type: text/xml; charset=utf-8\r\n" + "Connection: close\r\n" + "\r\n" + "\n" + "\n" + " \n" + " \n" + " SOAP-ENV:Client\n" + " Client Error\n" + " \n" + " \n" + "" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 5 + ,.headers= + { { "Date", "Tue, 04 Aug 2009 07:59:32 GMT" } + , { "Server", "Apache" } + , { "X-Powered-By", "Servlet/2.5 JSP/2.1" } + , { "Content-Type", "text/xml; charset=utf-8" } + , { "Connection", "close" } + } + ,.body= "\n" + "\n" + " \n" + " \n" + " SOAP-ENV:Client\n" + " Client Error\n" + " \n" + " \n" + "" + } + +#define NO_HEADERS_NO_BODY_404 2 +, {.name= "404 no headers no body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 404 Not Found\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 404 + ,.num_headers= 0 + ,.headers= {} + ,.body_size= 0 + ,.body= "" + } + +#define NO_REASON_PHRASE 3 +, {.name= "301 no response phrase" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301\r\n\r\n" + ,.should_keep_alive = FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define TRAILING_SPACE_ON_CHUNKED_BODY 4 +, {.name="200 trailing space on chunked body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "25 \r\n" + "This is the data in the first chunk\r\n" + "\r\n" + "1C\r\n" + "and this is the second one\r\n" + "\r\n" + "0 \r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/plain" } + , {"Transfer-Encoding", "chunked" } + } + ,.body_size = 37+28 + ,.body = + "This is the data in the first chunk\r\n" + "and this is the second one\r\n" + + } + +#define NO_CARRIAGE_RET 5 +, {.name="no carriage ret" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\n" + "Content-Type: text/html; charset=utf-8\n" + "Connection: close\n" + "\n" + "these headers are from http://news.ycombinator.com/" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/html; charset=utf-8" } + , {"Connection", "close" } + } + ,.body= "these headers are from http://news.ycombinator.com/" + } + +#define PROXY_CONNECTION 6 +, {.name="proxy connection" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Content-Length: 11\r\n" + "Proxy-Connection: close\r\n" + "Date: Thu, 31 Dec 2009 20:55:48 +0000\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 4 + ,.headers= + { {"Content-Type", "text/html; charset=UTF-8" } + , {"Content-Length", "11" } + , {"Proxy-Connection", "close" } + , {"Date", "Thu, 31 Dec 2009 20:55:48 +0000"} + } + ,.body= "hello world" + } + +#define UNDERSTORE_HEADER_KEY 7 + // shown by + // curl -o /dev/null -v "http://ad.doubleclick.net/pfadx/DARTSHELLCONFIGXML;dcmt=text/xml;" +, {.name="underscore header key" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: DCLK-AdSvr\r\n" + "Content-Type: text/xml\r\n" + "Content-Length: 0\r\n" + "DCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 4 + ,.headers= + { {"Server", "DCLK-AdSvr" } + , {"Content-Type", "text/xml" } + , {"Content-Length", "0" } + , {"DCLK_imp", "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o" } + } + ,.body= "" + } + +#define BONJOUR_MADAME_FR 8 +/* The client should not merge two headers fields when the first one doesn't + * have a value. + */ +, {.name= "bonjourmadame.fr" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 301 Moved Permanently\r\n" + "Date: Thu, 03 Jun 2010 09:56:32 GMT\r\n" + "Server: Apache/2.2.3 (Red Hat)\r\n" + "Cache-Control: public\r\n" + "Pragma: \r\n" + "Location: http://www.bonjourmadame.fr/\r\n" + "Vary: Accept-Encoding\r\n" + "Content-Length: 0\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 301 + ,.num_headers= 9 + ,.headers= + { { "Date", "Thu, 03 Jun 2010 09:56:32 GMT" } + , { "Server", "Apache/2.2.3 (Red Hat)" } + , { "Cache-Control", "public" } + , { "Pragma", "" } + , { "Location", "http://www.bonjourmadame.fr/" } + , { "Vary", "Accept-Encoding" } + , { "Content-Length", "0" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define RES_FIELD_UNDERSCORE 9 +/* Should handle spaces in header fields */ +, {.name= "field underscore" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 28 Sep 2010 01:14:13 GMT\r\n" + "Server: Apache\r\n" + "Cache-Control: no-cache, must-revalidate\r\n" + "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n" + ".et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\n" + "Vary: Accept-Encoding\r\n" + "_eep-Alive: timeout=45\r\n" /* semantic value ignored */ + "_onnection: Keep-Alive\r\n" /* semantic value ignored */ + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/html\r\n" + "Connection: close\r\n" + "\r\n" + "0\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 11 + ,.headers= + { { "Date", "Tue, 28 Sep 2010 01:14:13 GMT" } + , { "Server", "Apache" } + , { "Cache-Control", "no-cache, must-revalidate" } + , { "Expires", "Mon, 26 Jul 1997 05:00:00 GMT" } + , { ".et-Cookie", "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com" } + , { "Vary", "Accept-Encoding" } + , { "_eep-Alive", "timeout=45" } + , { "_onnection", "Keep-Alive" } + , { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/html" } + , { "Connection", "close" } + } + ,.body= "" + } + +#define NON_ASCII_IN_STATUS_LINE 10 +/* Should handle non-ASCII in status line */ +, {.name= "non-ASCII in status line" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 500 Oriëntatieprobleem\r\n" + "Date: Fri, 5 Nov 2010 23:07:12 GMT+2\r\n" + "Content-Length: 0\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 500 + ,.num_headers= 3 + ,.headers= + { { "Date", "Fri, 5 Nov 2010 23:07:12 GMT+2" } + , { "Content-Length", "0" } + , { "Connection", "close" } + } + ,.body= "" + } + +#define HTTP_VERSION_0_9 11 +/* Should handle HTTP/0.9 */ +, {.name= "http version 0.9" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/0.9 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 0 + ,.http_minor= 9 + ,.status_code= 200 + ,.num_headers= 0 + ,.headers= + {} + ,.body= "" + } + +#define NO_CONTENT_LENGTH_NO_TRANSFER_ENCODING_RESPONSE 12 +/* The client should wait for the server's EOF. That is, when neither + * content-length nor transfer-encoding is specified, the end of body + * is specified by the EOF. + */ +, {.name= "neither content-length nor transfer-encoding response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Content-Type", "text/plain" } + } + ,.body= "hello world" + } + +#define NO_BODY_HTTP10_KA_200 13 +, {.name= "HTTP/1.0 with keep-alive and EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 200 OK\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP10_KA_204 14 +, {.name= "HTTP/1.0 with keep-alive and a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 204 No content\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 204 + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_200 15 +, {.name= "HTTP/1.1 with an EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_204 16 +, {.name= "HTTP/1.1 with a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_NOKA_204 17 +, {.name= "HTTP/1.1 with a 204 status and keep-alive disabled" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.num_headers= 1 + ,.headers= + { { "Connection", "close" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_CHUNKED_200 18 +, {.name= "HTTP/1.1 with chunked endocing and a 200 response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body_size= 0 + ,.body= "" + } + +#if !HTTP_PARSER_STRICT +#define SPACE_IN_FIELD_RES 19 +/* Should handle spaces in header fields */ +, {.name= "field space" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: Microsoft-IIS/6.0\r\n" + "X-Powered-By: ASP.NET\r\n" + "en-US Content-Type: text/xml\r\n" /* this is the problem */ + "Content-Type: text/xml\r\n" + "Content-Length: 16\r\n" + "Date: Fri, 23 Jul 2010 18:45:38 GMT\r\n" + "Connection: keep-alive\r\n" + "\r\n" + "hello" /* fake body */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 7 + ,.headers= + { { "Server", "Microsoft-IIS/6.0" } + , { "X-Powered-By", "ASP.NET" } + , { "en-US Content-Type", "text/xml" } + , { "Content-Type", "text/xml" } + , { "Content-Length", "16" } + , { "Date", "Fri, 23 Jul 2010 18:45:38 GMT" } + , { "Connection", "keep-alive" } + } + ,.body= "hello" + } +#endif /* !HTTP_PARSER_STRICT */ + +, {.name= NULL } /* sentinel */ +}; + +/* strnlen() is a POSIX.2008 addition. Can't rely on it being available so + * define it ourselves. + */ +size_t +strnlen(const char *s, size_t maxlen) +{ + const char *p; + + p = memchr(s, '\0', maxlen); + if (p == NULL) + return maxlen; + + return p - s; +} + +size_t +strlncat(char *dst, size_t len, const char *src, size_t n) +{ + size_t slen; + size_t dlen; + size_t rlen; + size_t ncpy; + + slen = strnlen(src, n); + dlen = strnlen(dst, len); + + if (dlen < len) { + rlen = len - dlen; + ncpy = slen < rlen ? slen : (rlen - 1); + memcpy(dst + dlen, src, ncpy); + dst[dlen + ncpy] = '\0'; + } + + assert(len > slen + dlen); + return slen + dlen; +} + +size_t +strlcat(char *dst, const char *src, size_t len) +{ + return strlncat(dst, len, src, (size_t) -1); +} + +size_t +strlncpy(char *dst, size_t len, const char *src, size_t n) +{ + size_t slen; + size_t ncpy; + + slen = strnlen(src, n); + + if (len > 0) { + ncpy = slen < len ? slen : (len - 1); + memcpy(dst, src, ncpy); + dst[ncpy] = '\0'; + } + + assert(len > slen); + return slen; +} + +size_t +strlcpy(char *dst, const char *src, size_t len) +{ + return strlncpy(dst, len, src, (size_t) -1); +} + +int +request_url_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + strlncat(messages[num_messages].request_url, + sizeof(messages[num_messages].request_url), + buf, + len); + return 0; +} + +int +status_complete_cb (http_parser *p) { + assert(p == parser); + p->data++; + return 0; +} + +int +header_field_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + struct message *m = &messages[num_messages]; + + if (m->last_header_element != FIELD) + m->num_headers++; + + strlncat(m->headers[m->num_headers-1][0], + sizeof(m->headers[m->num_headers-1][0]), + buf, + len); + + m->last_header_element = FIELD; + + return 0; +} + +int +header_value_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + struct message *m = &messages[num_messages]; + + strlncat(m->headers[m->num_headers-1][1], + sizeof(m->headers[m->num_headers-1][1]), + buf, + len); + + m->last_header_element = VALUE; + + return 0; +} + +void +check_body_is_final (const http_parser *p) +{ + if (messages[num_messages].body_is_final) { + fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " + "on last on_body callback call " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + messages[num_messages].body_is_final = http_body_is_final(p); +} + +int +body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + strlncat(messages[num_messages].body, + sizeof(messages[num_messages].body), + buf, + len); + messages[num_messages].body_size += len; + check_body_is_final(p); + // printf("body_cb: '%s'\n", requests[num_messages].body); + return 0; +} + +int +count_body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + assert(buf); + messages[num_messages].body_size += len; + check_body_is_final(p); + return 0; +} + +int +message_begin_cb (http_parser *p) +{ + assert(p == parser); + messages[num_messages].message_begin_cb_called = TRUE; + return 0; +} + +int +headers_complete_cb (http_parser *p) +{ + assert(p == parser); + messages[num_messages].method = parser->method; + messages[num_messages].status_code = parser->status_code; + messages[num_messages].http_major = parser->http_major; + messages[num_messages].http_minor = parser->http_minor; + messages[num_messages].headers_complete_cb_called = TRUE; + messages[num_messages].should_keep_alive = http_should_keep_alive(parser); + return 0; +} + +int +message_complete_cb (http_parser *p) +{ + assert(p == parser); + if (messages[num_messages].should_keep_alive != http_should_keep_alive(parser)) + { + fprintf(stderr, "\n\n *** Error http_should_keep_alive() should have same " + "value in both on_message_complete and on_headers_complete " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + + if (messages[num_messages].body_size && + http_body_is_final(p) && + !messages[num_messages].body_is_final) + { + fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " + "on last on_body callback call " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + + messages[num_messages].message_complete_cb_called = TRUE; + + messages[num_messages].message_complete_on_eof = currently_parsing_eof; + + num_messages++; + return 0; +} + +/* These dontcall_* callbacks exist so that we can verify that when we're + * paused, no additional callbacks are invoked */ +int +dontcall_message_begin_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_begin() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_field() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_value() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_request_url() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_body_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_body_cb() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_headers_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_headers_complete() called on paused " + "parser ***\n\n"); + abort(); +} + +int +dontcall_message_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_complete() called on paused " + "parser ***\n\n"); + abort(); +} + +static http_parser_settings settings_dontcall = + {.on_message_begin = dontcall_message_begin_cb + ,.on_header_field = dontcall_header_field_cb + ,.on_header_value = dontcall_header_value_cb + ,.on_url = dontcall_request_url_cb + ,.on_body = dontcall_body_cb + ,.on_headers_complete = dontcall_headers_complete_cb + ,.on_message_complete = dontcall_message_complete_cb + }; + +/* These pause_* callbacks always pause the parser and just invoke the regular + * callback that tracks content. Before returning, we overwrite the parser + * settings to point to the _dontcall variety so that we can verify that + * the pause actually did, you know, pause. */ +int +pause_message_begin_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_begin_cb(p); +} + +int +pause_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_field_cb(p, buf, len); +} + +int +pause_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_value_cb(p, buf, len); +} + +int +pause_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return request_url_cb(p, buf, len); +} + +int +pause_body_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return body_cb(p, buf, len); +} + +int +pause_headers_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return headers_complete_cb(p); +} + +int +pause_message_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_complete_cb(p); +} + +static http_parser_settings settings_pause = + {.on_message_begin = pause_message_begin_cb + ,.on_header_field = pause_header_field_cb + ,.on_header_value = pause_header_value_cb + ,.on_url = pause_request_url_cb + ,.on_body = pause_body_cb + ,.on_headers_complete = pause_headers_complete_cb + ,.on_message_complete = pause_message_complete_cb + }; + +static http_parser_settings settings = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_body = body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + }; + +static http_parser_settings settings_count_body = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_body = count_body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + }; + +static http_parser_settings settings_null = + {.on_message_begin = 0 + ,.on_header_field = 0 + ,.on_header_value = 0 + ,.on_url = 0 + ,.on_body = 0 + ,.on_headers_complete = 0 + ,.on_message_complete = 0 + }; + +void +parser_init (enum http_parser_type type) +{ + num_messages = 0; + + assert(parser == NULL); + + parser = malloc(sizeof(http_parser)); + + http_parser_init(parser, type); + + memset(&messages, 0, sizeof messages); + +} + +void +parser_free () +{ + assert(parser); + free(parser); + parser = NULL; +} + +size_t parse (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(parser, &settings, buf, len); + return nparsed; +} + +size_t parse_count_body (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(parser, &settings_count_body, buf, len); + return nparsed; +} + +size_t parse_pause (const char *buf, size_t len) +{ + size_t nparsed; + http_parser_settings s = settings_pause; + + currently_parsing_eof = (len == 0); + current_pause_parser = &s; + nparsed = http_parser_execute(parser, current_pause_parser, buf, len); + return nparsed; +} + +static inline int +check_str_eq (const struct message *m, + const char *prop, + const char *expected, + const char *found) { + if ((expected == NULL) != (found == NULL)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %s\n", (expected == NULL) ? "NULL" : expected); + printf(" found %s\n", (found == NULL) ? "NULL" : found); + return 0; + } + if (expected != NULL && 0 != strcmp(expected, found)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected '%s'\n", expected); + printf(" found '%s'\n", found); + return 0; + } + return 1; +} + +static inline int +check_num_eq (const struct message *m, + const char *prop, + int expected, + int found) { + if (expected != found) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %d\n", expected); + printf(" found %d\n", found); + return 0; + } + return 1; +} + +#define MESSAGE_CHECK_STR_EQ(expected, found, prop) \ + if (!check_str_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_NUM_EQ(expected, found, prop) \ + if (!check_num_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_URL_EQ(u, expected, found, prop, fn) \ +do { \ + char ubuf[256]; \ + \ + if ((u)->field_set & (1 << (fn))) { \ + memcpy(ubuf, (found)->request_url + (u)->field_data[(fn)].off, \ + (u)->field_data[(fn)].len); \ + ubuf[(u)->field_data[(fn)].len] = '\0'; \ + } else { \ + ubuf[0] = '\0'; \ + } \ + \ + check_str_eq(expected, #prop, expected->prop, ubuf); \ +} while(0) + +int +message_eq (int index, const struct message *expected) +{ + int i; + struct message *m = &messages[index]; + + MESSAGE_CHECK_NUM_EQ(expected, m, http_major); + MESSAGE_CHECK_NUM_EQ(expected, m, http_minor); + + if (expected->type == HTTP_REQUEST) { + MESSAGE_CHECK_NUM_EQ(expected, m, method); + } else { + MESSAGE_CHECK_NUM_EQ(expected, m, status_code); + } + + MESSAGE_CHECK_NUM_EQ(expected, m, should_keep_alive); + MESSAGE_CHECK_NUM_EQ(expected, m, message_complete_on_eof); + + assert(m->message_begin_cb_called); + assert(m->headers_complete_cb_called); + assert(m->message_complete_cb_called); + + + MESSAGE_CHECK_STR_EQ(expected, m, request_url); + + /* Check URL components; we can't do this w/ CONNECT since it doesn't + * send us a well-formed URL. + */ + if (*m->request_url && m->method != HTTP_CONNECT) { + struct http_parser_url u; + + if (http_parser_parse_url(m->request_url, strlen(m->request_url), 0, &u)) { + fprintf(stderr, "\n\n*** failed to parse URL %s ***\n\n", + m->request_url); + abort(); + } + + if (expected->host) { + MESSAGE_CHECK_URL_EQ(&u, expected, m, host, UF_HOST); + } + + if (expected->userinfo) { + MESSAGE_CHECK_URL_EQ(&u, expected, m, userinfo, UF_USERINFO); + } + + m->port = (u.field_set & (1 << UF_PORT)) ? + u.port : 0; + + MESSAGE_CHECK_URL_EQ(&u, expected, m, query_string, UF_QUERY); + MESSAGE_CHECK_URL_EQ(&u, expected, m, fragment, UF_FRAGMENT); + MESSAGE_CHECK_URL_EQ(&u, expected, m, request_path, UF_PATH); + MESSAGE_CHECK_NUM_EQ(expected, m, port); + } + + if (expected->body_size) { + MESSAGE_CHECK_NUM_EQ(expected, m, body_size); + } else { + MESSAGE_CHECK_STR_EQ(expected, m, body); + } + + MESSAGE_CHECK_NUM_EQ(expected, m, num_headers); + + int r; + for (i = 0; i < m->num_headers; i++) { + r = check_str_eq(expected, "header field", expected->headers[i][0], m->headers[i][0]); + if (!r) return 0; + r = check_str_eq(expected, "header value", expected->headers[i][1], m->headers[i][1]); + if (!r) return 0; + } + + MESSAGE_CHECK_STR_EQ(expected, m, upgrade); + + return 1; +} + +/* Given a sequence of varargs messages, return the number of them that the + * parser should successfully parse, taking into account that upgraded + * messages prevent all subsequent messages from being parsed. + */ +size_t +count_parsed_messages(const size_t nmsgs, ...) { + size_t i; + va_list ap; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + if (m->upgrade) { + va_end(ap); + return i + 1; + } + } + + va_end(ap); + return nmsgs; +} + +/* Given a sequence of bytes and the number of these that we were able to + * parse, verify that upgrade bodies are correct. + */ +void +upgrade_message_fix(char *body, const size_t nread, const size_t nmsgs, ...) { + va_list ap; + size_t i; + size_t off = 0; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + off += strlen(m->raw); + + if (m->upgrade) { + off -= strlen(m->upgrade); + + /* Check the portion of the response after its specified upgrade */ + if (!check_str_eq(m, "upgrade", body + off, body + nread)) { + abort(); + } + + /* Fix up the response so that message_eq() will verify the beginning + * of the upgrade */ + *(body + nread + strlen(m->upgrade)) = '\0'; + messages[num_messages -1 ].upgrade = body + nread; + + va_end(ap); + return; + } + } + + va_end(ap); + printf("\n\n*** Error: expected a message with upgrade ***\n"); + + abort(); +} + +static void +print_error (const char *raw, size_t error_location) +{ + fprintf(stderr, "\n*** %s ***\n\n", + http_errno_description(HTTP_PARSER_ERRNO(parser))); + + int this_line = 0, char_len = 0; + size_t i, j, len = strlen(raw), error_location_line = 0; + for (i = 0; i < len; i++) { + if (i == error_location) this_line = 1; + switch (raw[i]) { + case '\r': + char_len = 2; + fprintf(stderr, "\\r"); + break; + + case '\n': + char_len = 2; + fprintf(stderr, "\\n\n"); + + if (this_line) goto print; + + error_location_line = 0; + continue; + + default: + char_len = 1; + fputc(raw[i], stderr); + break; + } + if (!this_line) error_location_line += char_len; + } + + fprintf(stderr, "[eof]\n"); + + print: + for (j = 0; j < error_location_line; j++) { + fputc(' ', stderr); + } + fprintf(stderr, "^\n\nerror location: %u\n", (unsigned int)error_location); +} + +void +test_preserve_data (void) +{ + char my_data[] = "application-specific data"; + http_parser parser; + parser.data = my_data; + http_parser_init(&parser, HTTP_REQUEST); + if (parser.data != my_data) { + printf("\n*** parser.data not preserved accross http_parser_init ***\n\n"); + abort(); + } +} + +struct url_test { + const char *name; + const char *url; + int is_connect; + struct http_parser_url u; + int rv; +}; + +const struct url_test url_tests[] = +{ {.name="proxy request" + ,.url="http://hostname/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 15, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="proxy request with port" + ,.url="http://hostname:444/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PORT) | (1 << UF_PATH) + ,.port=444 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 8 } /* UF_HOST */ + ,{ 16, 3 } /* UF_PORT */ + ,{ 19, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT request" + ,.url="hostname:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 0, 8 } /* UF_HOST */ + ,{ 9, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT request but not connect" + ,.url="hostname:443" + ,.is_connect=0 + ,.rv=1 + } + +, {.name="proxy ipv6 request" + ,.url="http://[1:2::3:4]/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 17, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="proxy ipv6 request with port" + ,.url="http://[1:2::3:4]:67/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PORT) | (1 << UF_PATH) + ,.port=67 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 8 } /* UF_HOST */ + ,{ 18, 2 } /* UF_PORT */ + ,{ 20, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT ipv6 address" + ,.url="[1:2::3:4]:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 1, 8 } /* UF_HOST */ + ,{ 11, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="ipv4 in ipv6 address" + ,.url="http://[2001:0000:0000:0000:0000:0000:1.9.1.1]/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 37 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 46, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="extra ? in query string" + ,.url="http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css," + "fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css," + "fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css" + ,.is_connect=0 + ,.u= + {.field_set=(1<field_set, u->port); + for (i = 0; i < UF_MAX; i++) { + if ((u->field_set & (1 << i)) == 0) { + printf("\tfield_data[%u]: unset\n", i); + continue; + } + + printf("\tfield_data[%u]: off: %u len: %u part: \"%.*s\n\"", + i, + u->field_data[i].off, + u->field_data[i].len, + u->field_data[i].len, + url + u->field_data[i].off); + } +} + +void +test_parse_url (void) +{ + struct http_parser_url u; + const struct url_test *test; + unsigned int i; + int rv; + + for (i = 0; i < (sizeof(url_tests) / sizeof(url_tests[0])); i++) { + test = &url_tests[i]; + memset(&u, 0, sizeof(u)); + + rv = http_parser_parse_url(test->url, + strlen(test->url), + test->is_connect, + &u); + + if (test->rv == 0) { + if (rv != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + abort(); + } + + if (memcmp(&u, &test->u, sizeof(u)) != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" failed ***\n", + test->url, test->name); + + printf("target http_parser_url:\n"); + dump_url(test->url, &test->u); + printf("result http_parser_url:\n"); + dump_url(test->url, &u); + + abort(); + } + } else { + /* test->rv != 0 */ + if (rv == 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + abort(); + } + } + } +} + +void +test_method_str (void) +{ + assert(0 == strcmp("GET", http_method_str(HTTP_GET))); + assert(0 == strcmp("", http_method_str(1337))); +} + +void +test_message (const struct message *message) +{ + size_t raw_len = strlen(message->raw); + size_t msg1len; + for (msg1len = 0; msg1len < raw_len; msg1len++) { + parser_init(message->type); + + size_t read; + const char *msg1 = message->raw; + const char *msg2 = msg1 + msg1len; + size_t msg2len = raw_len - msg1len; + + if (msg1len) { + read = parse(msg1, msg1len); + + if (message->upgrade && parser->upgrade) { + messages[num_messages - 1].upgrade = msg1 + read; + goto test; + } + + if (read != msg1len) { + print_error(msg1, read); + abort(); + } + } + + + read = parse(msg2, msg2len); + + if (message->upgrade && parser->upgrade) { + messages[num_messages - 1].upgrade = msg2 + read; + goto test; + } + + if (read != msg2len) { + print_error(msg2, read); + abort(); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(message->raw, read); + abort(); + } + + test: + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + abort(); + } + + if(!message_eq(0, message)) abort(); + + parser_free(); + } +} + +void +test_message_count_body (const struct message *message) +{ + parser_init(message->type); + + size_t read; + size_t l = strlen(message->raw); + size_t i, toread; + size_t chunk = 4024; + + for (i = 0; i < l; i+= chunk) { + toread = MIN(l-i, chunk); + read = parse_count_body(message->raw + i, toread); + if (read != toread) { + print_error(message->raw, read); + abort(); + } + } + + + read = parse_count_body(NULL, 0); + if (read != 0) { + print_error(message->raw, read); + abort(); + } + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + abort(); + } + + if(!message_eq(0, message)) abort(); + + parser_free(); +} + +void +test_simple (const char *buf, enum http_errno err_expected) +{ + parser_init(HTTP_REQUEST); + + size_t parsed; + int pass; + enum http_errno err; + + parsed = parse(buf, strlen(buf)); + pass = (parsed == strlen(buf)); + err = HTTP_PARSER_ERRNO(parser); + parsed = parse(NULL, 0); + pass &= (parsed == 0); + + parser_free(); + + /* In strict mode, allow us to pass with an unexpected HPE_STRICT as + * long as the caller isn't expecting success. + */ +#if HTTP_PARSER_STRICT + if (err_expected != err && err_expected != HPE_OK && err != HPE_STRICT) { +#else + if (err_expected != err) { +#endif + fprintf(stderr, "\n*** test_simple expected %s, but saw %s ***\n\n%s\n", + http_errno_name(err_expected), http_errno_name(err), buf); + abort(); + } +} + +void +test_header_overflow_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? "GET / HTTP/1.1\r\n" : "HTTP/1.0 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "header-key: header-value\r\n"; + size_t buflen = strlen(buf); + + int i; + for (i = 0; i < 10000; i++) { + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + //fprintf(stderr, "error found on iter %d\n", i); + assert(HTTP_PARSER_ERRNO(&parser) == HPE_HEADER_OVERFLOW); + return; + } + } + + fprintf(stderr, "\n*** Error expected but none in header overflow test ***\n"); + abort(); +} + +static void +test_content_length_overflow (const char *buf, size_t buflen, int expect_ok) +{ + http_parser parser; + http_parser_init(&parser, HTTP_RESPONSE); + http_parser_execute(&parser, &settings_null, buf, buflen); + + if (expect_ok) + assert(HTTP_PARSER_ERRNO(&parser) == HPE_OK); + else + assert(HTTP_PARSER_ERRNO(&parser) == HPE_INVALID_CONTENT_LENGTH); +} + +void +test_header_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Content-Length: " #size "\r\n" \ + "\r\n" + const char a[] = X(18446744073709551614); /* 2^64-2 */ + const char b[] = X(18446744073709551615); /* 2^64-1 */ + const char c[] = X(18446744073709551616); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_chunk_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Transfer-Encoding: chunked\r\n" \ + "\r\n" \ + #size "\r\n" \ + "..." + const char a[] = X(FFFFFFFFFFFFFFFE); /* 2^64-2 */ + const char b[] = X(FFFFFFFFFFFFFFFF); /* 2^64-1 */ + const char c[] = X(10000000000000000); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_no_overflow_long_body (int req, size_t length) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + size_t i; + char buf1[3000]; + size_t buf1len = sprintf(buf1, "%s\r\nConnection: Keep-Alive\r\nContent-Length: %lu\r\n\r\n", + req ? "POST / HTTP/1.0" : "HTTP/1.0 200 OK", (unsigned long)length); + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) + goto err; + + for (i = 0; i < length; i++) { + char foo = 'a'; + parsed = http_parser_execute(&parser, &settings_null, &foo, 1); + if (parsed != 1) + goto err; + } + + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) goto err; + return; + + err: + fprintf(stderr, + "\n*** error in test_no_overflow_long_body %s of length %lu ***\n", + req ? "REQUEST" : "RESPONSE", + (unsigned long)length); + abort(); +} + +void +test_multiple3 (const struct message *r1, const struct message *r2, const struct message *r3) +{ + int message_count = count_parsed_messages(3, r1, r2, r3); + + char total[ strlen(r1->raw) + + strlen(r2->raw) + + strlen(r3->raw) + + 1 + ]; + total[0] = '\0'; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + parser_init(r1->type); + + size_t read; + + read = parse(total, strlen(total)); + + if (parser->upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + goto test; + } + + if (read != strlen(total)) { + print_error(total, read); + abort(); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(total, read); + abort(); + } + +test: + + if (message_count != num_messages) { + fprintf(stderr, "\n\n*** Parser didn't see 3 messages only %d *** \n", num_messages); + abort(); + } + + if (!message_eq(0, r1)) abort(); + if (message_count > 1 && !message_eq(1, r2)) abort(); + if (message_count > 2 && !message_eq(2, r3)) abort(); + + parser_free(); +} + +/* SCAN through every possible breaking to make sure the + * parser can handle getting the content in any chunks that + * might come from the socket + */ +void +test_scan (const struct message *r1, const struct message *r2, const struct message *r3) +{ + char total[80*1024] = "\0"; + char buf1[80*1024] = "\0"; + char buf2[80*1024] = "\0"; + char buf3[80*1024] = "\0"; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + size_t read; + + int total_len = strlen(total); + + int total_ops = 2 * (total_len - 1) * (total_len - 2) / 2; + int ops = 0 ; + + size_t buf1_len, buf2_len, buf3_len; + int message_count = count_parsed_messages(3, r1, r2, r3); + + int i,j,type_both; + for (type_both = 0; type_both < 2; type_both ++ ) { + for (j = 2; j < total_len; j ++ ) { + for (i = 1; i < j; i ++ ) { + + if (ops % 1000 == 0) { + printf("\b\b\b\b%3.0f%%", 100 * (float)ops /(float)total_ops); + fflush(stdout); + } + ops += 1; + + parser_init(type_both ? HTTP_BOTH : r1->type); + + buf1_len = i; + strlncpy(buf1, sizeof(buf1), total, buf1_len); + buf1[buf1_len] = 0; + + buf2_len = j - i; + strlncpy(buf2, sizeof(buf1), total+i, buf2_len); + buf2[buf2_len] = 0; + + buf3_len = total_len - j; + strlncpy(buf3, sizeof(buf1), total+j, buf3_len); + buf3[buf3_len] = 0; + + read = parse(buf1, buf1_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len) { + print_error(buf1, read); + goto error; + } + + read += parse(buf2, buf2_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len + buf2_len) { + print_error(buf2, read); + goto error; + } + + read += parse(buf3, buf3_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len + buf2_len + buf3_len) { + print_error(buf3, read); + goto error; + } + + parse(NULL, 0); + +test: + if (parser->upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + } + + if (message_count != num_messages) { + fprintf(stderr, "\n\nParser didn't see %d messages only %d\n", + message_count, num_messages); + goto error; + } + + if (!message_eq(0, r1)) { + fprintf(stderr, "\n\nError matching messages[0] in test_scan.\n"); + goto error; + } + + if (message_count > 1 && !message_eq(1, r2)) { + fprintf(stderr, "\n\nError matching messages[1] in test_scan.\n"); + goto error; + } + + if (message_count > 2 && !message_eq(2, r3)) { + fprintf(stderr, "\n\nError matching messages[2] in test_scan.\n"); + goto error; + } + + parser_free(); + } + } + } + puts("\b\b\b\b100%"); + return; + + error: + fprintf(stderr, "i=%d j=%d\n", i, j); + fprintf(stderr, "buf1 (%u) %s\n\n", (unsigned int)buf1_len, buf1); + fprintf(stderr, "buf2 (%u) %s\n\n", (unsigned int)buf2_len , buf2); + fprintf(stderr, "buf3 (%u) %s\n", (unsigned int)buf3_len, buf3); + abort(); +} + +// user required to free the result +// string terminated by \0 +char * +create_large_chunked_message (int body_size_in_kb, const char* headers) +{ + int i; + size_t wrote = 0; + size_t headers_len = strlen(headers); + size_t bufsize = headers_len + (5+1024+2)*body_size_in_kb + 6; + char * buf = malloc(bufsize); + + memcpy(buf, headers, headers_len); + wrote += headers_len; + + for (i = 0; i < body_size_in_kb; i++) { + // write 1kb chunk into the body. + memcpy(buf + wrote, "400\r\n", 5); + wrote += 5; + memset(buf + wrote, 'C', 1024); + wrote += 1024; + strcpy(buf + wrote, "\r\n"); + wrote += 2; + } + + memcpy(buf + wrote, "0\r\n\r\n", 6); + wrote += 6; + assert(wrote == bufsize); + + return buf; +} + +void +test_status_complete (void) +{ + parser_init(HTTP_RESPONSE); + parser->data = 0; + http_parser_settings settings = settings_null; + settings.on_status_complete = status_complete_cb; + + char *response = "don't mind me, just a simple response"; + http_parser_execute(parser, &settings, response, strlen(response)); + assert(parser->data == (void*)0); // the status_complete callback was never called + assert(parser->http_errno == HPE_INVALID_CONSTANT); // the errno for an invalid status line +} + +/* Verify that we can pause parsing at any of the bytes in the + * message and still get the result that we're expecting. */ +void +test_message_pause (const struct message *msg) +{ + char *buf = (char*) msg->raw; + size_t buflen = strlen(msg->raw); + size_t nread; + + parser_init(msg->type); + + do { + nread = parse_pause(buf, buflen); + + // We can only set the upgrade buffer once we've gotten our message + // completion callback. + if (messages[0].message_complete_cb_called && + msg->upgrade && + parser->upgrade) { + messages[0].upgrade = buf + nread; + goto test; + } + + if (nread < buflen) { + + // Not much do to if we failed a strict-mode check + if (HTTP_PARSER_ERRNO(parser) == HPE_STRICT) { + parser_free(); + return; + } + + assert (HTTP_PARSER_ERRNO(parser) == HPE_PAUSED); + } + + buf += nread; + buflen -= nread; + http_parser_pause(parser, 0); + } while (buflen > 0); + + nread = parse_pause(NULL, 0); + assert (nread == 0); + +test: + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", msg->name); + abort(); + } + + if(!message_eq(0, msg)) abort(); + + parser_free(); +} + +int +main (void) +{ + parser = NULL; + int i, j, k; + int request_count; + int response_count; + + printf("sizeof(http_parser) = %u\n", (unsigned int)sizeof(http_parser)); + + for (request_count = 0; requests[request_count].name; request_count++); + for (response_count = 0; responses[response_count].name; response_count++); + + //// API + test_preserve_data(); + test_parse_url(); + test_method_str(); + + //// OVERFLOW CONDITIONS + + test_header_overflow_error(HTTP_REQUEST); + test_no_overflow_long_body(HTTP_REQUEST, 1000); + test_no_overflow_long_body(HTTP_REQUEST, 100000); + + test_header_overflow_error(HTTP_RESPONSE); + test_no_overflow_long_body(HTTP_RESPONSE, 1000); + test_no_overflow_long_body(HTTP_RESPONSE, 100000); + + test_header_content_length_overflow_error(); + test_chunk_content_length_overflow_error(); + + //// RESPONSES + + for (i = 0; i < response_count; i++) { + test_message(&responses[i]); + } + + for (i = 0; i < response_count; i++) { + test_message_pause(&responses[i]); + } + + for (i = 0; i < response_count; i++) { + if (!responses[i].should_keep_alive) continue; + for (j = 0; j < response_count; j++) { + if (!responses[j].should_keep_alive) continue; + for (k = 0; k < response_count; k++) { + test_multiple3(&responses[i], &responses[j], &responses[k]); + } + } + } + + test_message_count_body(&responses[NO_HEADERS_NO_BODY_404]); + test_message_count_body(&responses[TRAILING_SPACE_ON_CHUNKED_BODY]); + + // test very large chunked response + { + char * msg = create_large_chunked_message(31337, + "HTTP/1.0 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/plain\r\n" + "\r\n"); + struct message large_chunked = + {.name= "large chunked" + ,.type= HTTP_RESPONSE + ,.raw= msg + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/plain" } + } + ,.body_size= 31337*1024 + }; + test_message_count_body(&large_chunked); + free(msg); + } + + + + printf("response scan 1/2 "); + test_scan( &responses[TRAILING_SPACE_ON_CHUNKED_BODY] + , &responses[NO_BODY_HTTP10_KA_204] + , &responses[NO_REASON_PHRASE] + ); + + printf("response scan 2/2 "); + test_scan( &responses[BONJOUR_MADAME_FR] + , &responses[UNDERSTORE_HEADER_KEY] + , &responses[NO_CARRIAGE_RET] + ); + + puts("responses okay"); + + + /// REQUESTS + + test_simple("hello world", HPE_INVALID_METHOD); + test_simple("GET / HTP/1.1\r\n\r\n", HPE_INVALID_VERSION); + + + test_simple("ASDF / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + test_simple("PROPPATCHA / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + test_simple("GETA / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + + // Well-formed but incomplete + test_simple("GET / HTTP/1.1\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 6\r\n" + "\r\n" + "fooba", + HPE_OK); + + static const char *all_methods[] = { + "DELETE", + "GET", + "HEAD", + "POST", + "PUT", + //"CONNECT", //CONNECT can't be tested like other methods, it's a tunnel + "OPTIONS", + "TRACE", + "COPY", + "LOCK", + "MKCOL", + "MOVE", + "PROPFIND", + "PROPPATCH", + "UNLOCK", + "REPORT", + "MKACTIVITY", + "CHECKOUT", + "MERGE", + "M-SEARCH", + "NOTIFY", + "SUBSCRIBE", + "UNSUBSCRIBE", + "PATCH", + 0 }; + const char **this_method; + for (this_method = all_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_OK); + } + + static const char *bad_methods[] = { + "C******", + "M****", + 0 }; + for (this_method = bad_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_UNKNOWN); + } + + const char *dumbfuck2 = + "GET / HTTP/1.1\r\n" + "X-SSL-Bullshit: -----BEGIN CERTIFICATE-----\r\n" + "\tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx\r\n" + "\tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT\r\n" + "\tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu\r\n" + "\tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV\r\n" + "\tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV\r\n" + "\tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB\r\n" + "\tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF\r\n" + "\tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR\r\n" + "\tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL\r\n" + "\t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP\r\n" + "\tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR\r\n" + "\twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG\r\n" + "\tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgHTTPAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs\r\n" + "\tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD\r\n" + "\tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj\r\n" + "\tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj\r\n" + "\taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG\r\n" + "\t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE\r\n" + "\tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO\r\n" + "\tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1\r\n" + "\tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0\r\n" + "\tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD\r\n" + "\tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv\r\n" + "\tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3\r\n" + "\tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8\r\n" + "\tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk\r\n" + "\thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK\r\n" + "\twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu\r\n" + "\tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3\r\n" + "\tRA==\r\n" + "\t-----END CERTIFICATE-----\r\n" + "\r\n"; + test_simple(dumbfuck2, HPE_OK); + +#if 0 + // NOTE(Wed Nov 18 11:57:27 CET 2009) this seems okay. we just read body + // until EOF. + // + // no content-length + // error if there is a body without content length + const char *bad_get_no_headers_no_body = "GET /bad_get_no_headers_no_body/world HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + "HELLO"; + test_simple(bad_get_no_headers_no_body, 0); +#endif + /* TODO sending junk and large headers gets rejected */ + + + /* check to make sure our predefined requests are okay */ + for (i = 0; requests[i].name; i++) { + test_message(&requests[i]); + } + + for (i = 0; i < request_count; i++) { + test_message_pause(&requests[i]); + } + + for (i = 0; i < request_count; i++) { + if (!requests[i].should_keep_alive) continue; + for (j = 0; j < request_count; j++) { + if (!requests[j].should_keep_alive) continue; + for (k = 0; k < request_count; k++) { + test_multiple3(&requests[i], &requests[j], &requests[k]); + } + } + } + + printf("request scan 1/4 "); + test_scan( &requests[GET_NO_HEADERS_NO_BODY] + , &requests[GET_ONE_HEADER_NO_BODY] + , &requests[GET_NO_HEADERS_NO_BODY] + ); + + printf("request scan 2/4 "); + test_scan( &requests[POST_CHUNKED_ALL_YOUR_BASE] + , &requests[POST_IDENTITY_BODY_WORLD] + , &requests[GET_FUNKY_CONTENT_LENGTH] + ); + + printf("request scan 3/4 "); + test_scan( &requests[TWO_CHUNKS_MULT_ZERO_END] + , &requests[CHUNKED_W_TRAILING_HEADERS] + , &requests[CHUNKED_W_BULLSHIT_AFTER_LENGTH] + ); + + printf("request scan 4/4 "); + test_scan( &requests[QUERY_URL_WITH_QUESTION_MARK_GET] + , &requests[PREFIX_NEWLINE_GET ] + , &requests[CONNECT_REQUEST] + ); + + test_status_complete(); + + puts("requests okay"); + + return 0; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.dumped b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.dumped new file mode 100644 index 0000000..038bb52 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.dumped @@ -0,0 +1,845 @@ +name :curl get +raw :"GET /test HTTP/1.1\r\nUser-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\nHost: 0.0.0.0=5000\r\nAccept: */*\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/test +request_url :/test +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "User-Agent": "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1"} +header_1 :{ "Host": "0.0.0.0=5000"} +header_2 :{ "Accept": "*/*"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :firefox get +raw :"GET /favicon.ico HTTP/1.1\r\nHost: 0.0.0.0=5000\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/favicon.ico +request_url :/favicon.ico +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Host": "0.0.0.0=5000"} +header_1 :{ "User-Agent": "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0"} +header_2 :{ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"} +header_3 :{ "Accept-Language": "en-us,en;q=0.5"} +header_4 :{ "Accept-Encoding": "gzip,deflate"} +header_5 :{ "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7"} +header_6 :{ "Keep-Alive": "300"} +header_7 :{ "Connection": "keep-alive"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :dumbfuck +raw :"GET /dumbfuck HTTP/1.1\r\naaaaaaaaaaaaa:++++++++++\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/dumbfuck +request_url :/dumbfuck +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "aaaaaaaaaaaaa": "++++++++++"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :fragment in url +raw :"GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/forums/1/topics/2375 +request_url :/forums/1/topics/2375?page=1#posts-17408 +fragment :posts-17408 +query_string:page=1 +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :get no headers no body +raw :"GET /get_no_headers_no_body/world HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/get_no_headers_no_body/world +request_url :/get_no_headers_no_body/world +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :get one header no body +raw :"GET /get_one_header_no_body HTTP/1.1\r\nAccept: */*\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/get_one_header_no_body +request_url :/get_one_header_no_body +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Accept": "*/*"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :get funky content length body hello +raw :"GET /get_funky_content_length_body_hello HTTP/1.0\r\nconTENT-Length: 5\r\n\r\nHELLO" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/get_funky_content_length_body_hello +request_url :/get_funky_content_length_body_hello +fragment : +query_string: +body :"HELLO" +body_size :0 +header_0 :{ "conTENT-Length": "5"} +should_keep_alive :0 +http_major :1 +http_minor :0 + +name :post identity body world +raw :"POST /post_identity_body_world?q=search#hey HTTP/1.1\r\nAccept: */*\r\nTransfer-Encoding: identity\r\nContent-Length: 5\r\n\r\nWorld" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/post_identity_body_world +request_url :/post_identity_body_world?q=search#hey +fragment :hey +query_string:q=search +body :"World" +body_size :0 +header_0 :{ "Accept": "*/*"} +header_1 :{ "Transfer-Encoding": "identity"} +header_2 :{ "Content-Length": "5"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :post - chunked body: all your base are belong to us +raw :"POST /post_chunked_all_your_base HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n1e\r\nall your base are belong to us\r\n0\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/post_chunked_all_your_base +request_url :/post_chunked_all_your_base +fragment : +query_string: +body :"all your base are belong to us" +body_size :0 +header_0 :{ "Transfer-Encoding": "chunked"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :two chunks ; triple zero ending +raw :"POST /two_chunks_mult_zero_end HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n6\r\n world\r\n000\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/two_chunks_mult_zero_end +request_url :/two_chunks_mult_zero_end +fragment : +query_string: +body :"hello world" +body_size :0 +header_0 :{ "Transfer-Encoding": "chunked"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :chunked with trailing headers. blech. +raw :"POST /chunked_w_trailing_headers HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n6\r\n world\r\n0\r\nVary: *\r\nContent-Type: text/plain\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/chunked_w_trailing_headers +request_url :/chunked_w_trailing_headers +fragment : +query_string: +body :"hello world" +body_size :0 +header_0 :{ "Transfer-Encoding": "chunked"} +header_1 :{ "Vary": "*"} +header_2 :{ "Content-Type": "text/plain"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :with bullshit after the length +raw :"POST /chunked_w_bullshit_after_length HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5; ihatew3;whatthefuck=aretheseparametersfor\r\nhello\r\n6; blahblah; blah\r\n world\r\n0\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/chunked_w_bullshit_after_length +request_url :/chunked_w_bullshit_after_length +fragment : +query_string: +body :"hello world" +body_size :0 +header_0 :{ "Transfer-Encoding": "chunked"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :with quotes +raw :"GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/with_"stupid"_quotes +request_url :/with_"stupid"_quotes?foo="bar" +fragment : +query_string:foo="bar" +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :apachebench get +raw :"GET /test HTTP/1.0\r\nHost: 0.0.0.0:5000\r\nUser-Agent: ApacheBench/2.3\r\nAccept: */*\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/test +request_url :/test +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Host": "0.0.0.0:5000"} +header_1 :{ "User-Agent": "ApacheBench/2.3"} +header_2 :{ "Accept": "*/*"} +should_keep_alive :0 +http_major :1 +http_minor :0 + +name :query url with question mark +raw :"GET /test.cgi?foo=bar?baz HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/test.cgi +request_url :/test.cgi?foo=bar?baz +fragment : +query_string:foo=bar?baz +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :newline prefix get +raw :"\r\nGET /test HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/test +request_url :/test +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :upgrade request +raw :"GET /demo HTTP/1.1\r\nHost: example.com\r\nConnection: Upgrade\r\nSec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\nSec-WebSocket-Protocol: sample\r\nUpgrade: WebSocket\r\nSec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\nOrigin: http://example.com\r\n\r\nHot diggity dogg" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/demo +request_url :/demo +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Host": "example.com"} +header_1 :{ "Connection": "Upgrade"} +header_2 :{ "Sec-WebSocket-Key2": "12998 5 Y3 1 .P00"} +header_3 :{ "Sec-WebSocket-Protocol": "sample"} +header_4 :{ "Upgrade": "WebSocket"} +header_5 :{ "Sec-WebSocket-Key1": "4 @1 46546xW%0l 1 5"} +header_6 :{ "Origin": "http://example.com"} +should_keep_alive :1 +upgrade :"Hot diggity dogg" +http_major :1 +http_minor :1 + +name :connect request +raw :"CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\nsome data\r\nand yet even more data" +type :HTTP_REQUEST +method: HTTP_CONNECT +status_code :0 +request_path: +request_url :0-home0.netscape.com:443 +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "User-agent": "Mozilla/1.1N"} +header_1 :{ "Proxy-authorization": "basic aGVsbG86d29ybGQ="} +should_keep_alive :0 +upgrade :"some data\r\nand yet even more data" +http_major :1 +http_minor :0 + +name :report request +raw :"REPORT /test HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_REPORT +status_code :0 +request_path:/test +request_url :/test +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :request with no http version +raw :"GET /\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/ +request_url :/ +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :0 +http_major :0 +http_minor :9 + +name :m-search request +raw :"M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nST: \"ssdp:all\"\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_MSEARCH +status_code :0 +request_path:* +request_url :* +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "HOST": "239.255.255.250:1900"} +header_1 :{ "MAN": ""ssdp:discover""} +header_2 :{ "ST": ""ssdp:all""} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :line folding in header value +raw :"GET / HTTP/1.1\r\nLine1: abc\r\n def\r\n ghi\r\n jkl\r\n mno \r\n qrs\r\nLine2: line2 \r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/ +request_url :/ +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Line1": "abcdefghijklmno qrs"} +header_1 :{ "Line2": "line2 "} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :host terminated by a query string +raw :"GET http://hypnotoad.org?hail=all HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path: +request_url :http://hypnotoad.org?hail=all +fragment : +query_string:hail=all +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :host:port terminated by a query string +raw :"GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path: +request_url :http://hypnotoad.org:1234?hail=all +fragment : +query_string:hail=all +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :host:port terminated by a space +raw :"GET http://hypnotoad.org:1234 HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path: +request_url :http://hypnotoad.org:1234 +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :PATCH request +raw :"PATCH /file.txt HTTP/1.1\r\nHost: www.example.com\r\nContent-Type: application/example\r\nIf-Match: \"e0023aa4e\"\r\nContent-Length: 10\r\n\r\ncccccccccc" +type :HTTP_REQUEST +method: UNKNOWN +status_code :0 +request_path:/file.txt +request_url :/file.txt +fragment : +query_string: +body :"cccccccccc" +body_size :0 +header_0 :{ "Host": "www.example.com"} +header_1 :{ "Content-Type": "application/example"} +header_2 :{ "If-Match": ""e0023aa4e""} +header_3 :{ "Content-Length": "10"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :connect caps request +raw :"CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_CONNECT +status_code :0 +request_path: +request_url :HOME0.NETSCAPE.COM:443 +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "User-agent": "Mozilla/1.1N"} +header_1 :{ "Proxy-authorization": "basic aGVsbG86d29ybGQ="} +should_keep_alive :0 +upgrade :"" +http_major :1 +http_minor :0 + +name :eat CRLF between requests, no "Connection: close" header +raw :"POST / HTTP/1.1\r\nHost: www.example.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 4\r\n\r\nq=42\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/ +request_url :/ +fragment : +query_string: +body :"q=42" +body_size :0 +header_0 :{ "Host": "www.example.com"} +header_1 :{ "Content-Type": "application/x-www-form-urlencoded"} +header_2 :{ "Content-Length": "4"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :eat CRLF between requests even if "Connection: close" is set +raw :"POST / HTTP/1.1\r\nHost: www.example.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 4\r\nConnection: close\r\n\r\nq=42\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/ +request_url :/ +fragment : +query_string: +body :"q=42" +body_size :0 +header_0 :{ "Host": "www.example.com"} +header_1 :{ "Content-Type": "application/x-www-form-urlencoded"} +header_2 :{ "Content-Length": "4"} +header_3 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :PURGE request +raw :"PURGE /file.txt HTTP/1.1\r\nHost: www.example.com\r\n\r\n" +type :HTTP_REQUEST +method: UNKNOWN +status_code :0 +request_path:/file.txt +request_url :/file.txt +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Host": "www.example.com"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :google 301 +raw :"HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.google.com/\r\nContent-Type: text/html; charset=UTF-8\r\nDate: Sun, 26 Apr 2009 11:11:49 GMT\r\nExpires: Tue, 26 May 2009 11:11:49 GMT\r\nX-$PrototypeBI-Version: 1.6.0.3\r\nCache-Control: public, max-age=2592000\r\nServer: gws\r\nContent-Length: 219 \r\n\r\n\n301 Moved\n

      301 Moved

      \nThe document has moved\nhere.\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :301 +request_path: +request_url : +fragment : +query_string: +body :"\n301 Moved\n

      301 Moved

      \nThe document has moved\nhere.\r\n\r\n" +body_size :0 +header_0 :{ "Location": "http://www.google.com/"} +header_1 :{ "Content-Type": "text/html; charset=UTF-8"} +header_2 :{ "Date": "Sun, 26 Apr 2009 11:11:49 GMT"} +header_3 :{ "Expires": "Tue, 26 May 2009 11:11:49 GMT"} +header_4 :{ "X-$PrototypeBI-Version": "1.6.0.3"} +header_5 :{ "Cache-Control": "public, max-age=2592000"} +header_6 :{ "Server": "gws"} +header_7 :{ "Content-Length": "219 "} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :no content-length response +raw :"HTTP/1.1 200 OK\r\nDate: Tue, 04 Aug 2009 07:59:32 GMT\r\nServer: Apache\r\nX-Powered-By: Servlet/2.5 JSP/2.1\r\nContent-Type: text/xml; charset=utf-8\r\nConnection: close\r\n\r\n\n\n \n \n SOAP-ENV:Client\n Client Error\n \n \n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"\n\n \n \n SOAP-ENV:Client\n Client Error\n \n \n" +body_size :0 +header_0 :{ "Date": "Tue, 04 Aug 2009 07:59:32 GMT"} +header_1 :{ "Server": "Apache"} +header_2 :{ "X-Powered-By": "Servlet/2.5 JSP/2.1"} +header_3 :{ "Content-Type": "text/xml; charset=utf-8"} +header_4 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :404 no headers no body +raw :"HTTP/1.1 404 Not Found\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :404 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :301 no response phrase +raw :"HTTP/1.1 301\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :301 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :200 trailing space on chunked body +raw :"HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n25 \r\nThis is the data in the first chunk\r\n\r\n1C\r\nand this is the second one\r\n\r\n0 \r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"This is the data in the first chunk\r\nand this is the second one\r\n" +body_size :65 +header_0 :{ "Content-Type": "text/plain"} +header_1 :{ "Transfer-Encoding": "chunked"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :no carriage ret +raw :"HTTP/1.1 200 OK\nContent-Type: text/html; charset=utf-8\nConnection: close\n\nthese headers are from http://news.ycombinator.com/" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"these headers are from http://news.ycombinator.com/" +body_size :0 +header_0 :{ "Content-Type": "text/html; charset=utf-8"} +header_1 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :proxy connection +raw :"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Length: 11\r\nProxy-Connection: close\r\nDate: Thu, 31 Dec 2009 20:55:48 +0000\r\n\r\nhello world" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"hello world" +body_size :0 +header_0 :{ "Content-Type": "text/html; charset=UTF-8"} +header_1 :{ "Content-Length": "11"} +header_2 :{ "Proxy-Connection": "close"} +header_3 :{ "Date": "Thu, 31 Dec 2009 20:55:48 +0000"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :underscore header key +raw :"HTTP/1.1 200 OK\r\nServer: DCLK-AdSvr\r\nContent-Type: text/xml\r\nContent-Length: 0\r\nDCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Server": "DCLK-AdSvr"} +header_1 :{ "Content-Type": "text/xml"} +header_2 :{ "Content-Length": "0"} +header_3 :{ "DCLK_imp": "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :bonjourmadame.fr +raw :"HTTP/1.0 301 Moved Permanently\r\nDate: Thu, 03 Jun 2010 09:56:32 GMT\r\nServer: Apache/2.2.3 (Red Hat)\r\nCache-Control: public\r\nPragma: \r\nLocation: http://www.bonjourmadame.fr/\r\nVary: Accept-Encoding\r\nContent-Length: 0\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: keep-alive\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :301 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Date": "Thu, 03 Jun 2010 09:56:32 GMT"} +header_1 :{ "Server": "Apache/2.2.3 (Red Hat)"} +header_2 :{ "Cache-Control": "public"} +header_3 :{ "Pragma": ""} +header_4 :{ "Location": "http://www.bonjourmadame.fr/"} +header_5 :{ "Vary": "Accept-Encoding"} +header_6 :{ "Content-Length": "0"} +header_7 :{ "Content-Type": "text/html; charset=UTF-8"} +header_8 :{ "Connection": "keep-alive"} +should_keep_alive :1 +http_major :1 +http_minor :0 + +name :field underscore +raw :"HTTP/1.1 200 OK\r\nDate: Tue, 28 Sep 2010 01:14:13 GMT\r\nServer: Apache\r\nCache-Control: no-cache, must-revalidate\r\nExpires: Mon, 26 Jul 1997 05:00:00 GMT\r\n.et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\nVary: Accept-Encoding\r\n_eep-Alive: timeout=45\r\n_onnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n0\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Date": "Tue, 28 Sep 2010 01:14:13 GMT"} +header_1 :{ "Server": "Apache"} +header_2 :{ "Cache-Control": "no-cache, must-revalidate"} +header_3 :{ "Expires": "Mon, 26 Jul 1997 05:00:00 GMT"} +header_4 :{ ".et-Cookie": "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com"} +header_5 :{ "Vary": "Accept-Encoding"} +header_6 :{ "_eep-Alive": "timeout=45"} +header_7 :{ "_onnection": "Keep-Alive"} +header_8 :{ "Transfer-Encoding": "chunked"} +header_9 :{ "Content-Type": "text/html"} +header_10 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :non-ASCII in status line +raw :"HTTP/1.1 500 Oriëntatieprobleem\r\nDate: Fri, 5 Nov 2010 23:07:12 GMT+2\r\nContent-Length: 0\r\nConnection: close\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :500 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Date": "Fri, 5 Nov 2010 23:07:12 GMT+2"} +header_1 :{ "Content-Length": "0"} +header_2 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :http version 0.9 +raw :"HTTP/0.9 200 OK\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :0 +http_major :0 +http_minor :9 + +name :neither content-length nor transfer-encoding response +raw :"HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nhello world" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"hello world" +body_size :0 +header_0 :{ "Content-Type": "text/plain"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :HTTP/1.0 with keep-alive and EOF-terminated 200 status +raw :"HTTP/1.0 200 OK\r\nConnection: keep-alive\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Connection": "keep-alive"} +should_keep_alive :0 +http_major :1 +http_minor :0 + +name :HTTP/1.0 with keep-alive and a 204 status +raw :"HTTP/1.0 204 No content\r\nConnection: keep-alive\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :204 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Connection": "keep-alive"} +should_keep_alive :1 +http_major :1 +http_minor :0 + +name :HTTP/1.1 with an EOF-terminated 200 status +raw :"HTTP/1.1 200 OK\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :HTTP/1.1 with a 204 status +raw :"HTTP/1.1 204 No content\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :204 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :HTTP/1.1 with a 204 status and keep-alive disabled +raw :"HTTP/1.1 204 No content\r\nConnection: close\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :204 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :HTTP/1.1 with chunked endocing and a 200 response +raw :"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Transfer-Encoding": "chunked"} +should_keep_alive :1 +http_major :1 +http_minor :1 + diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.utf8 b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.utf8 new file mode 100644 index 0000000..5266159 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.utf8 @@ -0,0 +1,17 @@ +name :utf-8 path request +raw :"GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\nHost: github.com\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/δ¶/δt/pope +request_url :/δ¶/δt/pope?q=1#narf +fragment :narf +query_string:q=1 +body :"" +body_size :0 +header_0 :{ "Host": "github.com"} +should_keep_alive :1 +upgrade :0 +http_major :1 +http_minor :1 + diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/byte_constants.rb b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/byte_constants.rb new file mode 100644 index 0000000..1604890 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/byte_constants.rb @@ -0,0 +1,6 @@ + +"A".upto("Z") {|c| + puts "public static final byte #{c} = 0x#{c[0].to_s(16)};" +} + + diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/const_char.rb b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/const_char.rb new file mode 100644 index 0000000..84f9699 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/const_char.rb @@ -0,0 +1,13 @@ + + +def printbytes str +str.each_byte { |b| + print "0x#{b.to_s(16)}, " +} +end + +if $0 == __FILE__ + printf "static final byte [] #{ARGV[0]} = {\n" + printbytes ARGV[0] + printf "\n};\n" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/lowcase.rb b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/lowcase.rb new file mode 100644 index 0000000..13960cb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/lowcase.rb @@ -0,0 +1,15 @@ + + +0.upto(255) { |i| + printf "\n" if i%16 == 0 + printf " " if i%8 == 0 + s = ("" << i) + if s =~ /[A-Z0-9\-_\/ ]/ + print "0x#{i.to_s(16)}," + elsif s =~ /[a-z]/ + print "0x#{s.upcase[0].to_s(16)}," + else + print "0x00," + end + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/parse_tests.rb b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/parse_tests.rb new file mode 100644 index 0000000..683adb9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/parse_tests.rb @@ -0,0 +1,33 @@ + + + + +# name : 200 trailing space on chunked body +# raw : "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n25 \r\nThis is the data in the first chunk\r\n\r\n1C\r\nand this is the second one\r\n\r\n0 \r\n\r\n" +# type : HTTP_RESPONSE +# method: HTTP_DELETE +# status code :200 +# request_path: +# request_url : +# fragment : +# query_string: +# body :"This is the data in the first chunk\r\nand this is the second one\r\n" +# body_size :65 +# header_0 :{ "Content-Type": "text/plain"} +# header_1 :{ "Transfer-Encoding": "chunked"} +# should_keep_alive :1 +# upgrade :0 +# http_major :1 +# http_minor :1 + + +class ParserTest + attr_accessor :name + attr_accessor :raw + attr_accessor :type + attr_accessor :method + attr_accessor :status_code + attr_accessor :request_path + attr_accessor :method +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/AUTHORS b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/AUTHORS new file mode 100644 index 0000000..abe99de --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/AUTHORS @@ -0,0 +1,32 @@ +# Authors ordered by first contribution. +Ryan Dahl +Jeremy Hinegardner +Sergey Shepelev +Joe Damato +tomika +Phoenix Sol +Cliff Frey +Ewen Cheslack-Postava +Santiago Gala +Tim Becker +Jeff Terrace +Ben Noordhuis +Nathan Rajlich +Mark Nottingham +Aman Gupta +Tim Becker +Sean Cunningham +Peter Griess +Salman Haq +Cliff Frey +Jon Kolb +Fouad Mardini +Paul Querna +Felix Geisendörfer +koichik +Andre Caron +Ivo Raisr +James McLaughlin +David Gwynne +LE ROUX Thomas +Randy Rizun diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/CONTRIBUTIONS b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/CONTRIBUTIONS new file mode 100644 index 0000000..11ba31e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/CONTRIBUTIONS @@ -0,0 +1,4 @@ +Contributors must agree to the Contributor License Agreement before patches +can be accepted. + +http://spreadsheets2.google.com/viewform?hl=en&formkey=dDJXOGUwbzlYaWM4cHN1MERwQS1CSnc6MQ diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/LICENSE-MIT b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/LICENSE-MIT new file mode 100644 index 0000000..58010b3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/LICENSE-MIT @@ -0,0 +1,23 @@ +http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright +Igor Sysoev. + +Additional changes are licensed under the same terms as NGINX and +copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/README.md b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/README.md new file mode 100644 index 0000000..700c3ac --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/README.md @@ -0,0 +1,178 @@ +HTTP Parser +=========== + +This is a parser for HTTP messages written in C. It parses both requests and +responses. The parser is designed to be used in performance HTTP +applications. It does not make any syscalls nor allocations, it does not +buffer data, it can be interrupted at anytime. Depending on your +architecture, it only requires about 40 bytes of data per message +stream (in a web server that is per connection). + +Features: + + * No dependencies + * Handles persistent streams (keep-alive). + * Decodes chunked encoding. + * Upgrade support + * Defends against buffer overflow attacks. + +The parser extracts the following information from HTTP messages: + + * Header fields and values + * Content-Length + * Request method + * Response status code + * Transfer-Encoding + * HTTP version + * Request URL + * Message body + + +Usage +----- + +One `http_parser` object is used per TCP connection. Initialize the struct +using `http_parser_init()` and set the callbacks. That might look something +like this for a request parser: + + http_parser_settings settings; + settings.on_path = my_path_callback; + settings.on_header_field = my_header_field_callback; + /* ... */ + + http_parser *parser = malloc(sizeof(http_parser)); + http_parser_init(parser, HTTP_REQUEST); + parser->data = my_socket; + +When data is received on the socket execute the parser and check for errors. + + size_t len = 80*1024, nparsed; + char buf[len]; + ssize_t recved; + + recved = recv(fd, buf, len, 0); + + if (recved < 0) { + /* Handle error. */ + } + + /* Start up / continue the parser. + * Note we pass recved==0 to signal that EOF has been recieved. + */ + nparsed = http_parser_execute(parser, &settings, buf, recved); + + if (parser->upgrade) { + /* handle new protocol */ + } else if (nparsed != recved) { + /* Handle error. Usually just close the connection. */ + } + +HTTP needs to know where the end of the stream is. For example, sometimes +servers send responses without Content-Length and expect the client to +consume input (for the body) until EOF. To tell http_parser about EOF, give +`0` as the forth parameter to `http_parser_execute()`. Callbacks and errors +can still be encountered during an EOF, so one must still be prepared +to receive them. + +Scalar valued message information such as `status_code`, `method`, and the +HTTP version are stored in the parser structure. This data is only +temporally stored in `http_parser` and gets reset on each new message. If +this information is needed later, copy it out of the structure during the +`headers_complete` callback. + +The parser decodes the transfer-encoding for both requests and responses +transparently. That is, a chunked encoding is decoded before being sent to +the on_body callback. + + +The Special Problem of Upgrade +------------------------------ + +HTTP supports upgrading the connection to a different protocol. An +increasingly common example of this is the Web Socket protocol which sends +a request like + + GET /demo HTTP/1.1 + Upgrade: WebSocket + Connection: Upgrade + Host: example.com + Origin: http://example.com + WebSocket-Protocol: sample + +followed by non-HTTP data. + +(See http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75 for more +information the Web Socket protocol.) + +To support this, the parser will treat this as a normal HTTP message without a +body. Issuing both on_headers_complete and on_message_complete callbacks. However +http_parser_execute() will stop parsing at the end of the headers and return. + +The user is expected to check if `parser->upgrade` has been set to 1 after +`http_parser_execute()` returns. Non-HTTP data begins at the buffer supplied +offset by the return value of `http_parser_execute()`. + + +Callbacks +--------- + +During the `http_parser_execute()` call, the callbacks set in +`http_parser_settings` will be executed. The parser maintains state and +never looks behind, so buffering the data is not necessary. If you need to +save certain data for later usage, you can do that from the callbacks. + +There are two types of callbacks: + +* notification `typedef int (*http_cb) (http_parser*);` + Callbacks: on_message_begin, on_headers_complete, on_message_complete. +* data `typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);` + Callbacks: (requests only) on_uri, + (common) on_header_field, on_header_value, on_body; + +Callbacks must return 0 on success. Returning a non-zero value indicates +error to the parser, making it exit immediately. + +In case you parse HTTP message in chunks (i.e. `read()` request line +from socket, parse, read half headers, parse, etc) your data callbacks +may be called more than once. Http-parser guarantees that data pointer is only +valid for the lifetime of callback. You can also `read()` into a heap allocated +buffer to avoid copying memory around if this fits your application. + +Reading headers may be a tricky task if you read/parse headers partially. +Basically, you need to remember whether last header callback was field or value +and apply following logic: + + (on_header_field and on_header_value shortened to on_h_*) + ------------------------ ------------ -------------------------------------------- + | State (prev. callback) | Callback | Description/action | + ------------------------ ------------ -------------------------------------------- + | nothing (first call) | on_h_field | Allocate new buffer and copy callback data | + | | | into it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_field | New header started. | + | | | Copy current name,value buffers to headers | + | | | list and allocate new buffer for new name | + ------------------------ ------------ -------------------------------------------- + | field | on_h_field | Previous name continues. Reallocate name | + | | | buffer and append callback data to it | + ------------------------ ------------ -------------------------------------------- + | field | on_h_value | Value for current header started. Allocate | + | | | new buffer and copy callback data to it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_value | Value continues. Reallocate value buffer | + | | | and append callback data to it | + ------------------------ ------------ -------------------------------------------- + + +Parsing URLs +------------ + +A simplistic zero-copy URL parser is provided as `http_parser_parse_url()`. +Users of this library may wish to use it to parse URLs constructed from +consecutive `on_url` callbacks. + +See examples of reading in headers: + +* [partial example](http://gist.github.com/155877) in C +* [from http-parser tests](http://github.com/ry/http-parser/blob/37a0ff8928fb0d83cec0d0d8909c5a4abcd221af/test.c#L403) in C +* [from Node library](http://github.com/ry/node/blob/842eaf446d2fdcb33b296c67c911c32a0dabc747/src/http.js#L284) in Javascript diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.c b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.c new file mode 100644 index 0000000..f2ca661 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.c @@ -0,0 +1,2058 @@ +/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev + * + * Additional changes are licensed under the same terms as NGINX and + * copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include +#include +#include +#include +#include +#include + +#ifndef ULLONG_MAX +# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */ +#endif + +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + + +#if HTTP_PARSER_DEBUG +#define SET_ERRNO(e) \ +do { \ + parser->http_errno = (e); \ + parser->error_lineno = __LINE__; \ +} while (0) +#else +#define SET_ERRNO(e) \ +do { \ + parser->http_errno = (e); \ +} while(0) +#endif + + +/* Run the notify callback FOR, returning ER if it fails */ +#define CALLBACK_NOTIFY_(FOR, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (settings->on_##FOR) { \ + if (0 != settings->on_##FOR(parser)) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + \ + /* We either errored above or got paused; get out */ \ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ + return (ER); \ + } \ + } \ +} while (0) + +/* Run the notify callback FOR and consume the current byte */ +#define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1) + +/* Run the notify callback FOR and don't consume the current byte */ +#define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data) + +/* Run data callback FOR with LEN bytes, returning ER if it fails */ +#define CALLBACK_DATA_(FOR, LEN, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (FOR##_mark) { \ + if (settings->on_##FOR) { \ + if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + \ + /* We either errored above or got paused; get out */ \ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ + return (ER); \ + } \ + } \ + FOR##_mark = NULL; \ + } \ +} while (0) + +/* Run the data callback FOR and consume the current byte */ +#define CALLBACK_DATA(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1) + +/* Run the data callback FOR and don't consume the current byte */ +#define CALLBACK_DATA_NOADVANCE(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data) + +/* Set the mark FOR; non-destructive if mark is already set */ +#define MARK(FOR) \ +do { \ + if (!FOR##_mark) { \ + FOR##_mark = p; \ + } \ +} while (0) + + +#define PROXY_CONNECTION "proxy-connection" +#define CONNECTION "connection" +#define CONTENT_LENGTH "content-length" +#define TRANSFER_ENCODING "transfer-encoding" +#define UPGRADE "upgrade" +#define CHUNKED "chunked" +#define KEEP_ALIVE "keep-alive" +#define CLOSE "close" + + +static const char *method_strings[] = + { "DELETE" + , "GET" + , "HEAD" + , "POST" + , "PUT" + , "CONNECT" + , "OPTIONS" + , "TRACE" + , "COPY" + , "LOCK" + , "MKCOL" + , "MOVE" + , "PROPFIND" + , "PROPPATCH" + , "UNLOCK" + , "REPORT" + , "MKACTIVITY" + , "CHECKOUT" + , "MERGE" + , "M-SEARCH" + , "NOTIFY" + , "SUBSCRIBE" + , "UNSUBSCRIBE" + , "PATCH" + , "PURGE" + }; + + +/* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ +static const char tokens[256] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0, '!', 0, '#', '$', '%', '&', '\'', +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 0, 0, '*', '+', 0, '-', '.', 0, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + '0', '1', '2', '3', '4', '5', '6', '7', +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + '8', '9', 0, 0, 0, 0, 0, 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 'x', 'y', 'z', 0, 0, 0, '^', '_', +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 'x', 'y', 'z', 0, '|', 0, '~', 0 }; + + +static const int8_t unhex[256] = + {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-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, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + }; + + +static const uint8_t normal_url_char[256] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0, 1, 1, 0, 1, 1, 1, 1, +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + 1, 1, 1, 1, 1, 1, 1, 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 1, 1, 1, 1, 1, 1, 1, 0, }; + + +enum state + { s_dead = 1 /* important that this is > 0 */ + + , s_start_req_or_res + , s_res_or_resp_H + , s_start_res + , s_res_H + , s_res_HT + , s_res_HTT + , s_res_HTTP + , s_res_first_http_major + , s_res_http_major + , s_res_first_http_minor + , s_res_http_minor + , s_res_first_status_code + , s_res_status_code + , s_res_status + , s_res_line_almost_done + + , s_start_req + + , s_req_method + , s_req_spaces_before_url + , s_req_schema + , s_req_schema_slash + , s_req_schema_slash_slash + , s_req_host_start + , s_req_host_v6_start + , s_req_host_v6 + , s_req_host_v6_end + , s_req_host + , s_req_port_start + , s_req_port + , s_req_path + , s_req_query_string_start + , s_req_query_string + , s_req_fragment_start + , s_req_fragment + , s_req_http_start + , s_req_http_H + , s_req_http_HT + , s_req_http_HTT + , s_req_http_HTTP + , s_req_first_http_major + , s_req_http_major + , s_req_first_http_minor + , s_req_http_minor + , s_req_line_almost_done + + , s_header_field_start + , s_header_field + , s_header_value_start + , s_header_value + , s_header_value_lws + + , s_header_almost_done + + , s_chunk_size_start + , s_chunk_size + , s_chunk_parameters + , s_chunk_size_almost_done + + , s_headers_almost_done + , s_headers_done + + /* Important: 's_headers_done' must be the last 'header' state. All + * states beyond this must be 'body' states. It is used for overflow + * checking. See the PARSING_HEADER() macro. + */ + + , s_chunk_data + , s_chunk_data_almost_done + , s_chunk_data_done + + , s_body_identity + , s_body_identity_eof + + , s_message_done + }; + + +#define PARSING_HEADER(state) (state <= s_headers_done) + + +enum header_states + { h_general = 0 + , h_C + , h_CO + , h_CON + + , h_matching_connection + , h_matching_proxy_connection + , h_matching_content_length + , h_matching_transfer_encoding + , h_matching_upgrade + + , h_connection + , h_content_length + , h_transfer_encoding + , h_upgrade + + , h_matching_transfer_encoding_chunked + , h_matching_connection_keep_alive + , h_matching_connection_close + + , h_transfer_encoding_chunked + , h_connection_keep_alive + , h_connection_close + }; + + +/* Macros for character classes; depends on strict-mode */ +#define CR '\r' +#define LF '\n' +#define LOWER(c) (unsigned char)(c | 0x20) +#define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z') +#define IS_NUM(c) ((c) >= '0' && (c) <= '9') +#define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c)) +#define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f')) + +#if HTTP_PARSER_STRICT +#define TOKEN(c) (tokens[(unsigned char)c]) +#define IS_URL_CHAR(c) (normal_url_char[(unsigned char) (c)]) +#define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-') +#else +#define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c]) +#define IS_URL_CHAR(c) \ + (normal_url_char[(unsigned char) (c)] || ((c) & 0x80)) +#define IS_HOST_CHAR(c) \ + (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_') +#endif + + +#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res) + + +#if HTTP_PARSER_STRICT +# define STRICT_CHECK(cond) \ +do { \ + if (cond) { \ + SET_ERRNO(HPE_STRICT); \ + goto error; \ + } \ +} while (0) +# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead) +#else +# define STRICT_CHECK(cond) +# define NEW_MESSAGE() start_state +#endif + + +/* Map errno values to strings for human-readable output */ +#define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s }, +static struct { + const char *name; + const char *description; +} http_strerror_tab[] = { + HTTP_ERRNO_MAP(HTTP_STRERROR_GEN) +}; +#undef HTTP_STRERROR_GEN + +int http_message_needs_eof(http_parser *parser); + +/* Our URL parser. + * + * This is designed to be shared by http_parser_execute() for URL validation, + * hence it has a state transition + byte-for-byte interface. In addition, it + * is meant to be embedded in http_parser_parse_url(), which does the dirty + * work of turning state transitions URL components for its API. + * + * This function should only be invoked with non-space characters. It is + * assumed that the caller cares about (and can detect) the transition between + * URL and non-URL states by looking for these. + */ +static enum state +parse_url_char(enum state s, const char ch) +{ + assert(!isspace(ch)); + + switch (s) { + case s_req_spaces_before_url: + /* Proxied requests are followed by scheme of an absolute URI (alpha). + * All methods except CONNECT are followed by '/' or '*'. + */ + + if (ch == '/' || ch == '*') { + return s_req_path; + } + + if (IS_ALPHA(ch)) { + return s_req_schema; + } + + break; + + case s_req_schema: + if (IS_ALPHA(ch)) { + return s; + } + + if (ch == ':') { + return s_req_schema_slash; + } + + break; + + case s_req_schema_slash: + if (ch == '/') { + return s_req_schema_slash_slash; + } + + break; + + case s_req_schema_slash_slash: + if (ch == '/') { + return s_req_host_start; + } + + break; + + case s_req_host_start: + if (ch == '[') { + return s_req_host_v6_start; + } + + if (IS_HOST_CHAR(ch)) { + return s_req_host; + } + + break; + + case s_req_host: + if (IS_HOST_CHAR(ch)) { + return s_req_host; + } + + /* FALLTHROUGH */ + case s_req_host_v6_end: + switch (ch) { + case ':': + return s_req_port_start; + + case '/': + return s_req_path; + + case '?': + return s_req_query_string_start; + } + + break; + + case s_req_host_v6: + if (ch == ']') { + return s_req_host_v6_end; + } + + /* FALLTHROUGH */ + case s_req_host_v6_start: + if (IS_HEX(ch) || ch == ':') { + return s_req_host_v6; + } + break; + + case s_req_port: + switch (ch) { + case '/': + return s_req_path; + + case '?': + return s_req_query_string_start; + } + + /* FALLTHROUGH */ + case s_req_port_start: + if (IS_NUM(ch)) { + return s_req_port; + } + + break; + + case s_req_path: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + return s_req_query_string_start; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_query_string_start: + case s_req_query_string: + if (IS_URL_CHAR(ch)) { + return s_req_query_string; + } + + switch (ch) { + case '?': + /* allow extra '?' in query string */ + return s_req_query_string; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_fragment_start: + if (IS_URL_CHAR(ch)) { + return s_req_fragment; + } + + switch (ch) { + case '?': + return s_req_fragment; + + case '#': + return s; + } + + break; + + case s_req_fragment: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + case '#': + return s; + } + + break; + + default: + break; + } + + /* We should never fall out of the switch above unless there's an error */ + return s_dead; +} + +size_t http_parser_execute (http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len) +{ + char c, ch; + int8_t unhex_val; + const char *p = data; + const char *header_field_mark = 0; + const char *header_value_mark = 0; + const char *url_mark = 0; + const char *body_mark = 0; + + /* We're in an error state. Don't bother doing anything. */ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + return 0; + } + + if (len == 0) { + switch (parser->state) { + case s_body_identity_eof: + /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if + * we got paused. + */ + CALLBACK_NOTIFY_NOADVANCE(message_complete); + return 0; + + case s_dead: + case s_start_req_or_res: + case s_start_res: + case s_start_req: + return 0; + + default: + SET_ERRNO(HPE_INVALID_EOF_STATE); + return 1; + } + } + + + if (parser->state == s_header_field) + header_field_mark = data; + if (parser->state == s_header_value) + header_value_mark = data; + switch (parser->state) { + case s_req_path: + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_host_start: + case s_req_host_v6_start: + case s_req_host_v6: + case s_req_host_v6_end: + case s_req_host: + case s_req_port_start: + case s_req_port: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + url_mark = data; + break; + } + + for (p=data; p != data + len; p++) { + ch = *p; + + if (PARSING_HEADER(parser->state)) { + ++parser->nread; + /* Buffer overflow attack */ + if (parser->nread > HTTP_MAX_HEADER_SIZE) { + SET_ERRNO(HPE_HEADER_OVERFLOW); + goto error; + } + } + + reexecute_byte: + switch (parser->state) { + + case s_dead: + /* this state is used after a 'Connection: close' message + * the parser will error out if it reads another message + */ + if (ch == CR || ch == LF) + break; + + SET_ERRNO(HPE_CLOSED_CONNECTION); + goto error; + + case s_start_req_or_res: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + if (ch == 'H') { + parser->state = s_res_or_resp_H; + + CALLBACK_NOTIFY(message_begin); + } else { + parser->type = HTTP_REQUEST; + parser->state = s_start_req; + goto reexecute_byte; + } + + break; + } + + case s_res_or_resp_H: + if (ch == 'T') { + parser->type = HTTP_RESPONSE; + parser->state = s_res_HT; + } else { + if (ch != 'E') { + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + parser->type = HTTP_REQUEST; + parser->method = HTTP_HEAD; + parser->index = 2; + parser->state = s_req_method; + } + break; + + case s_start_res: + { + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + switch (ch) { + case 'H': + parser->state = s_res_H; + break; + + case CR: + case LF: + break; + + default: + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + CALLBACK_NOTIFY(message_begin); + break; + } + + case s_res_H: + STRICT_CHECK(ch != 'T'); + parser->state = s_res_HT; + break; + + case s_res_HT: + STRICT_CHECK(ch != 'T'); + parser->state = s_res_HTT; + break; + + case s_res_HTT: + STRICT_CHECK(ch != 'P'); + parser->state = s_res_HTTP; + break; + + case s_res_HTTP: + STRICT_CHECK(ch != '/'); + parser->state = s_res_first_http_major; + break; + + case s_res_first_http_major: + if (ch < '0' || ch > '9') { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + parser->state = s_res_http_major; + break; + + /* major HTTP version or dot */ + case s_res_http_major: + { + if (ch == '.') { + parser->state = s_res_first_http_minor; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major *= 10; + parser->http_major += ch - '0'; + + if (parser->http_major > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* first digit of minor HTTP version */ + case s_res_first_http_minor: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + parser->state = s_res_http_minor; + break; + + /* minor HTTP version or end of request line */ + case s_res_http_minor: + { + if (ch == ' ') { + parser->state = s_res_first_status_code; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor *= 10; + parser->http_minor += ch - '0'; + + if (parser->http_minor > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + case s_res_first_status_code: + { + if (!IS_NUM(ch)) { + if (ch == ' ') { + break; + } + + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + parser->status_code = ch - '0'; + parser->state = s_res_status_code; + break; + } + + case s_res_status_code: + { + if (!IS_NUM(ch)) { + switch (ch) { + case ' ': + parser->state = s_res_status; + break; + case CR: + parser->state = s_res_line_almost_done; + break; + case LF: + parser->state = s_header_field_start; + break; + default: + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + break; + } + + parser->status_code *= 10; + parser->status_code += ch - '0'; + + if (parser->status_code > 999) { + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + + break; + } + + case s_res_status: + /* the human readable status. e.g. "NOT FOUND" + * we are not humans so just ignore this */ + if (ch == CR) { + parser->state = s_res_line_almost_done; + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + break; + } + break; + + case s_res_line_almost_done: + STRICT_CHECK(ch != LF); + parser->state = s_header_field_start; + break; + + case s_start_req: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + if (!IS_ALPHA(ch)) { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + parser->method = (enum http_method) 0; + parser->index = 1; + switch (ch) { + case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break; + case 'D': parser->method = HTTP_DELETE; break; + case 'G': parser->method = HTTP_GET; break; + case 'H': parser->method = HTTP_HEAD; break; + case 'L': parser->method = HTTP_LOCK; break; + case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ break; + case 'N': parser->method = HTTP_NOTIFY; break; + case 'O': parser->method = HTTP_OPTIONS; break; + case 'P': parser->method = HTTP_POST; + /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ + break; + case 'R': parser->method = HTTP_REPORT; break; + case 'S': parser->method = HTTP_SUBSCRIBE; break; + case 'T': parser->method = HTTP_TRACE; break; + case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break; + default: + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + parser->state = s_req_method; + + CALLBACK_NOTIFY(message_begin); + + break; + } + + case s_req_method: + { + const char *matcher; + if (ch == '\0') { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + matcher = method_strings[parser->method]; + if (ch == ' ' && matcher[parser->index] == '\0') { + parser->state = s_req_spaces_before_url; + } else if (ch == matcher[parser->index]) { + ; /* nada */ + } else if (parser->method == HTTP_CONNECT) { + if (parser->index == 1 && ch == 'H') { + parser->method = HTTP_CHECKOUT; + } else if (parser->index == 2 && ch == 'P') { + parser->method = HTTP_COPY; + } else { + goto error; + } + } else if (parser->method == HTTP_MKCOL) { + if (parser->index == 1 && ch == 'O') { + parser->method = HTTP_MOVE; + } else if (parser->index == 1 && ch == 'E') { + parser->method = HTTP_MERGE; + } else if (parser->index == 1 && ch == '-') { + parser->method = HTTP_MSEARCH; + } else if (parser->index == 2 && ch == 'A') { + parser->method = HTTP_MKACTIVITY; + } else { + goto error; + } + } else if (parser->index == 1 && parser->method == HTTP_POST) { + if (ch == 'R') { + parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */ + } else if (ch == 'U') { + parser->method = HTTP_PUT; /* or HTTP_PURGE */ + } else if (ch == 'A') { + parser->method = HTTP_PATCH; + } else { + goto error; + } + } else if (parser->index == 2) { + if (parser->method == HTTP_PUT) { + if (ch == 'R') parser->method = HTTP_PURGE; + } else if (parser->method == HTTP_UNLOCK) { + if (ch == 'S') parser->method = HTTP_UNSUBSCRIBE; + } + } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') { + parser->method = HTTP_PROPPATCH; + } else { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + ++parser->index; + break; + } + + case s_req_spaces_before_url: + { + if (ch == ' ') break; + + MARK(url); + if (parser->method == HTTP_CONNECT) { + parser->state = s_req_host_start; + } + + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + + break; + } + + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_host_start: + case s_req_host_v6_start: + case s_req_host_v6: + case s_req_port_start: + { + switch (ch) { + /* No whitespace allowed here */ + case ' ': + case CR: + case LF: + SET_ERRNO(HPE_INVALID_URL); + goto error; + default: + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + + break; + } + + case s_req_host: + case s_req_host_v6_end: + case s_req_port: + case s_req_path: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + { + switch (ch) { + case ' ': + parser->state = s_req_http_start; + CALLBACK_DATA(url); + break; + case CR: + case LF: + parser->http_major = 0; + parser->http_minor = 9; + parser->state = (ch == CR) ? + s_req_line_almost_done : + s_header_field_start; + CALLBACK_DATA(url); + break; + default: + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + break; + } + + case s_req_http_start: + switch (ch) { + case 'H': + parser->state = s_req_http_H; + break; + case ' ': + break; + default: + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + break; + + case s_req_http_H: + STRICT_CHECK(ch != 'T'); + parser->state = s_req_http_HT; + break; + + case s_req_http_HT: + STRICT_CHECK(ch != 'T'); + parser->state = s_req_http_HTT; + break; + + case s_req_http_HTT: + STRICT_CHECK(ch != 'P'); + parser->state = s_req_http_HTTP; + break; + + case s_req_http_HTTP: + STRICT_CHECK(ch != '/'); + parser->state = s_req_first_http_major; + break; + + /* first digit of major HTTP version */ + case s_req_first_http_major: + if (ch < '1' || ch > '9') { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + parser->state = s_req_http_major; + break; + + /* major HTTP version or dot */ + case s_req_http_major: + { + if (ch == '.') { + parser->state = s_req_first_http_minor; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major *= 10; + parser->http_major += ch - '0'; + + if (parser->http_major > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* first digit of minor HTTP version */ + case s_req_first_http_minor: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + parser->state = s_req_http_minor; + break; + + /* minor HTTP version or end of request line */ + case s_req_http_minor: + { + if (ch == CR) { + parser->state = s_req_line_almost_done; + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + break; + } + + /* XXX allow spaces after digit? */ + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor *= 10; + parser->http_minor += ch - '0'; + + if (parser->http_minor > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* end of request line */ + case s_req_line_almost_done: + { + if (ch != LF) { + SET_ERRNO(HPE_LF_EXPECTED); + goto error; + } + + parser->state = s_header_field_start; + break; + } + + case s_header_field_start: + { + if (ch == CR) { + parser->state = s_headers_almost_done; + break; + } + + if (ch == LF) { + /* they might be just sending \n instead of \r\n so this would be + * the second \n to denote the end of headers*/ + parser->state = s_headers_almost_done; + goto reexecute_byte; + } + + c = TOKEN(ch); + + if (!c) { + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + MARK(header_field); + + parser->index = 0; + parser->state = s_header_field; + + switch (c) { + case 'c': + parser->header_state = h_C; + break; + + case 'p': + parser->header_state = h_matching_proxy_connection; + break; + + case 't': + parser->header_state = h_matching_transfer_encoding; + break; + + case 'u': + parser->header_state = h_matching_upgrade; + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_field: + { + c = TOKEN(ch); + + if (c) { + switch (parser->header_state) { + case h_general: + break; + + case h_C: + parser->index++; + parser->header_state = (c == 'o' ? h_CO : h_general); + break; + + case h_CO: + parser->index++; + parser->header_state = (c == 'n' ? h_CON : h_general); + break; + + case h_CON: + parser->index++; + switch (c) { + case 'n': + parser->header_state = h_matching_connection; + break; + case 't': + parser->header_state = h_matching_content_length; + break; + default: + parser->header_state = h_general; + break; + } + break; + + /* connection */ + + case h_matching_connection: + parser->index++; + if (parser->index > sizeof(CONNECTION)-1 + || c != CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* proxy-connection */ + + case h_matching_proxy_connection: + parser->index++; + if (parser->index > sizeof(PROXY_CONNECTION)-1 + || c != PROXY_CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(PROXY_CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* content-length */ + + case h_matching_content_length: + parser->index++; + if (parser->index > sizeof(CONTENT_LENGTH)-1 + || c != CONTENT_LENGTH[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONTENT_LENGTH)-2) { + parser->header_state = h_content_length; + } + break; + + /* transfer-encoding */ + + case h_matching_transfer_encoding: + parser->index++; + if (parser->index > sizeof(TRANSFER_ENCODING)-1 + || c != TRANSFER_ENCODING[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) { + parser->header_state = h_transfer_encoding; + } + break; + + /* upgrade */ + + case h_matching_upgrade: + parser->index++; + if (parser->index > sizeof(UPGRADE)-1 + || c != UPGRADE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(UPGRADE)-2) { + parser->header_state = h_upgrade; + } + break; + + case h_connection: + case h_content_length: + case h_transfer_encoding: + case h_upgrade: + if (ch != ' ') parser->header_state = h_general; + break; + + default: + assert(0 && "Unknown header_state"); + break; + } + break; + } + + if (ch == ':') { + parser->state = s_header_value_start; + CALLBACK_DATA(header_field); + break; + } + + if (ch == CR) { + parser->state = s_header_almost_done; + CALLBACK_DATA(header_field); + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + CALLBACK_DATA(header_field); + break; + } + + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + case s_header_value_start: + { + if (ch == ' ' || ch == '\t') break; + + MARK(header_value); + + parser->state = s_header_value; + parser->index = 0; + + if (ch == CR) { + parser->header_state = h_general; + parser->state = s_header_almost_done; + CALLBACK_DATA(header_value); + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + CALLBACK_DATA(header_value); + break; + } + + c = LOWER(ch); + + switch (parser->header_state) { + case h_upgrade: + parser->flags |= F_UPGRADE; + parser->header_state = h_general; + break; + + case h_transfer_encoding: + /* looking for 'Transfer-Encoding: chunked' */ + if ('c' == c) { + parser->header_state = h_matching_transfer_encoding_chunked; + } else { + parser->header_state = h_general; + } + break; + + case h_content_length: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = ch - '0'; + break; + + case h_connection: + /* looking for 'Connection: keep-alive' */ + if (c == 'k') { + parser->header_state = h_matching_connection_keep_alive; + /* looking for 'Connection: close' */ + } else if (c == 'c') { + parser->header_state = h_matching_connection_close; + } else { + parser->header_state = h_general; + } + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_value: + { + + if (ch == CR) { + parser->state = s_header_almost_done; + CALLBACK_DATA(header_value); + break; + } + + if (ch == LF) { + parser->state = s_header_almost_done; + CALLBACK_DATA_NOADVANCE(header_value); + goto reexecute_byte; + } + + c = LOWER(ch); + + switch (parser->header_state) { + case h_general: + break; + + case h_connection: + case h_transfer_encoding: + assert(0 && "Shouldn't get here."); + break; + + case h_content_length: + { + uint64_t t; + + if (ch == ' ') break; + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + t = parser->content_length; + t *= 10; + t += ch - '0'; + + /* Overflow? */ + if (t < parser->content_length || t == ULLONG_MAX) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = t; + break; + } + + /* Transfer-Encoding: chunked */ + case h_matching_transfer_encoding_chunked: + parser->index++; + if (parser->index > sizeof(CHUNKED)-1 + || c != CHUNKED[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CHUNKED)-2) { + parser->header_state = h_transfer_encoding_chunked; + } + break; + + /* looking for 'Connection: keep-alive' */ + case h_matching_connection_keep_alive: + parser->index++; + if (parser->index > sizeof(KEEP_ALIVE)-1 + || c != KEEP_ALIVE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(KEEP_ALIVE)-2) { + parser->header_state = h_connection_keep_alive; + } + break; + + /* looking for 'Connection: close' */ + case h_matching_connection_close: + parser->index++; + if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CLOSE)-2) { + parser->header_state = h_connection_close; + } + break; + + case h_transfer_encoding_chunked: + case h_connection_keep_alive: + case h_connection_close: + if (ch != ' ') parser->header_state = h_general; + break; + + default: + parser->state = s_header_value; + parser->header_state = h_general; + break; + } + break; + } + + case s_header_almost_done: + { + STRICT_CHECK(ch != LF); + + parser->state = s_header_value_lws; + + switch (parser->header_state) { + case h_connection_keep_alive: + parser->flags |= F_CONNECTION_KEEP_ALIVE; + break; + case h_connection_close: + parser->flags |= F_CONNECTION_CLOSE; + break; + case h_transfer_encoding_chunked: + parser->flags |= F_CHUNKED; + break; + default: + break; + } + + break; + } + + case s_header_value_lws: + { + if (ch == ' ' || ch == '\t') + parser->state = s_header_value_start; + else + { + parser->state = s_header_field_start; + goto reexecute_byte; + } + break; + } + + case s_headers_almost_done: + { + STRICT_CHECK(ch != LF); + + if (parser->flags & F_TRAILING) { + /* End of a chunked request */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + break; + } + + parser->state = s_headers_done; + + /* Set this here so that on_headers_complete() callbacks can see it */ + parser->upgrade = + (parser->flags & F_UPGRADE || parser->method == HTTP_CONNECT); + + /* Here we call the headers_complete callback. This is somewhat + * different than other callbacks because if the user returns 1, we + * will interpret that as saying that this message has no body. This + * is needed for the annoying case of recieving a response to a HEAD + * request. + * + * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so + * we have to simulate it by handling a change in errno below. + */ + if (settings->on_headers_complete) { + switch (settings->on_headers_complete(parser)) { + case 0: + break; + + case 1: + parser->flags |= F_SKIPBODY; + break; + + default: + SET_ERRNO(HPE_CB_headers_complete); + return p - data; /* Error */ + } + } + + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + return p - data; + } + + goto reexecute_byte; + } + + case s_headers_done: + { + STRICT_CHECK(ch != LF); + + parser->nread = 0; + + /* Exit, the rest of the connect is in a different protocol. */ + if (parser->upgrade) { + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + return (p - data) + 1; + } + + if (parser->flags & F_SKIPBODY) { + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else if (parser->flags & F_CHUNKED) { + /* chunked encoding - ignore Content-Length header */ + parser->state = s_chunk_size_start; + } else { + if (parser->content_length == 0) { + /* Content-Length header given but zero: Content-Length: 0\r\n */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else if (parser->content_length != ULLONG_MAX) { + /* Content-Length header given and non-zero */ + parser->state = s_body_identity; + } else { + if (parser->type == HTTP_REQUEST || + !http_message_needs_eof(parser)) { + /* Assume content-length 0 - read the next */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else { + /* Read body until EOF */ + parser->state = s_body_identity_eof; + } + } + } + + break; + } + + case s_body_identity: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* The difference between advancing content_length and p is because + * the latter will automaticaly advance on the next loop iteration. + * Further, if content_length ends up at 0, we want to see the last + * byte again for our message complete callback. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + parser->state = s_message_done; + + /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte. + * + * The alternative to doing this is to wait for the next byte to + * trigger the data callback, just as in every other case. The + * problem with this is that this makes it difficult for the test + * harness to distinguish between complete-on-EOF and + * complete-on-length. It's not clear that this distinction is + * important for applications, but let's keep it for now. + */ + CALLBACK_DATA_(body, p - body_mark + 1, p - data); + goto reexecute_byte; + } + + break; + } + + /* read until EOF */ + case s_body_identity_eof: + MARK(body); + p = data + len - 1; + + break; + + case s_message_done: + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + break; + + case s_chunk_size_start: + { + assert(parser->nread == 1); + assert(parser->flags & F_CHUNKED); + + unhex_val = unhex[(unsigned char)ch]; + if (unhex_val == -1) { + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + parser->content_length = unhex_val; + parser->state = s_chunk_size; + break; + } + + case s_chunk_size: + { + uint64_t t; + + assert(parser->flags & F_CHUNKED); + + if (ch == CR) { + parser->state = s_chunk_size_almost_done; + break; + } + + unhex_val = unhex[(unsigned char)ch]; + + if (unhex_val == -1) { + if (ch == ';' || ch == ' ') { + parser->state = s_chunk_parameters; + break; + } + + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + t = parser->content_length; + t *= 16; + t += unhex_val; + + /* Overflow? */ + if (t < parser->content_length || t == ULLONG_MAX) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = t; + break; + } + + case s_chunk_parameters: + { + assert(parser->flags & F_CHUNKED); + /* just ignore this shit. TODO check for overflow */ + if (ch == CR) { + parser->state = s_chunk_size_almost_done; + break; + } + break; + } + + case s_chunk_size_almost_done: + { + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + + parser->nread = 0; + + if (parser->content_length == 0) { + parser->flags |= F_TRAILING; + parser->state = s_header_field_start; + } else { + parser->state = s_chunk_data; + } + break; + } + + case s_chunk_data: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->flags & F_CHUNKED); + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* See the explanation in s_body_identity for why the content + * length and data pointers are managed this way. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + parser->state = s_chunk_data_almost_done; + } + + break; + } + + case s_chunk_data_almost_done: + assert(parser->flags & F_CHUNKED); + assert(parser->content_length == 0); + STRICT_CHECK(ch != CR); + parser->state = s_chunk_data_done; + CALLBACK_DATA(body); + break; + + case s_chunk_data_done: + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + parser->nread = 0; + parser->state = s_chunk_size_start; + break; + + default: + assert(0 && "unhandled state"); + SET_ERRNO(HPE_INVALID_INTERNAL_STATE); + goto error; + } + } + + /* Run callbacks for any marks that we have leftover after we ran our of + * bytes. There should be at most one of these set, so it's OK to invoke + * them in series (unset marks will not result in callbacks). + * + * We use the NOADVANCE() variety of callbacks here because 'p' has already + * overflowed 'data' and this allows us to correct for the off-by-one that + * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p' + * value that's in-bounds). + */ + + assert(((header_field_mark ? 1 : 0) + + (header_value_mark ? 1 : 0) + + (url_mark ? 1 : 0) + + (body_mark ? 1 : 0)) <= 1); + + CALLBACK_DATA_NOADVANCE(header_field); + CALLBACK_DATA_NOADVANCE(header_value); + CALLBACK_DATA_NOADVANCE(url); + CALLBACK_DATA_NOADVANCE(body); + + return len; + +error: + if (HTTP_PARSER_ERRNO(parser) == HPE_OK) { + SET_ERRNO(HPE_UNKNOWN); + } + + return (p - data); +} + + +/* Does the parser need to see an EOF to find the end of the message? */ +int +http_message_needs_eof (http_parser *parser) +{ + if (parser->type == HTTP_REQUEST) { + return 0; + } + + /* See RFC 2616 section 4.4 */ + if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ + parser->status_code == 204 || /* No Content */ + parser->status_code == 304 || /* Not Modified */ + parser->flags & F_SKIPBODY) { /* response to a HEAD request */ + return 0; + } + + if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) { + return 0; + } + + return 1; +} + + +int +http_should_keep_alive (http_parser *parser) +{ + if (parser->http_major > 0 && parser->http_minor > 0) { + /* HTTP/1.1 */ + if (parser->flags & F_CONNECTION_CLOSE) { + return 0; + } + } else { + /* HTTP/1.0 or earlier */ + if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { + return 0; + } + } + + return !http_message_needs_eof(parser); +} + + +const char * http_method_str (enum http_method m) +{ + return method_strings[m]; +} + + +void +http_parser_init (http_parser *parser, enum http_parser_type t) +{ + void *data = parser->data; /* preserve application data */ + memset(parser, 0, sizeof(*parser)); + parser->data = data; + parser->type = t; + parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res)); + parser->http_errno = HPE_OK; +} + +const char * +http_errno_name(enum http_errno err) { + assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); + return http_strerror_tab[err].name; +} + +const char * +http_errno_description(enum http_errno err) { + assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); + return http_strerror_tab[err].description; +} + +int +http_parser_parse_url(const char *buf, size_t buflen, int is_connect, + struct http_parser_url *u) +{ + enum state s; + const char *p; + enum http_parser_url_fields uf, old_uf; + + u->port = u->field_set = 0; + s = is_connect ? s_req_host_start : s_req_spaces_before_url; + uf = old_uf = UF_MAX; + + for (p = buf; p < buf + buflen; p++) { + s = parse_url_char(s, *p); + + /* Figure out the next field that we're operating on */ + switch (s) { + case s_dead: + return 1; + + /* Skip delimeters */ + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_host_start: + case s_req_host_v6_start: + case s_req_host_v6_end: + case s_req_port_start: + case s_req_query_string_start: + case s_req_fragment_start: + continue; + + case s_req_schema: + uf = UF_SCHEMA; + break; + + case s_req_host: + case s_req_host_v6: + uf = UF_HOST; + break; + + case s_req_port: + uf = UF_PORT; + break; + + case s_req_path: + uf = UF_PATH; + break; + + case s_req_query_string: + uf = UF_QUERY; + break; + + case s_req_fragment: + uf = UF_FRAGMENT; + break; + + default: + assert(!"Unexpected state"); + return 1; + } + + /* Nothing's changed; soldier on */ + if (uf == old_uf) { + u->field_data[uf].len++; + continue; + } + + u->field_data[uf].off = p - buf; + u->field_data[uf].len = 1; + + u->field_set |= (1 << uf); + old_uf = uf; + } + + /* CONNECT requests can only contain "hostname:port" */ + if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) { + return 1; + } + + /* Make sure we don't end somewhere unexpected */ + switch (s) { + case s_req_host_v6_start: + case s_req_host_v6: + case s_req_host_v6_end: + case s_req_host: + case s_req_port_start: + return 1; + default: + break; + } + + if (u->field_set & (1 << UF_PORT)) { + /* Don't bother with endp; we've already validated the string */ + unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10); + + /* Ports have a max value of 2^16 */ + if (v > 0xffff) { + return 1; + } + + u->port = (uint16_t) v; + } + + return 0; +} + +void +http_parser_pause(http_parser *parser, int paused) { + /* Users should only be pausing/unpausing a parser that is not in an error + * state. In non-debug builds, there's not much that we can do about this + * other than ignore it. + */ + if (HTTP_PARSER_ERRNO(parser) == HPE_OK || + HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) { + SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK); + } else { + assert(0 && "Attempting to pause parser in error state"); + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.gyp b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.gyp new file mode 100644 index 0000000..c6eada7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.gyp @@ -0,0 +1,79 @@ +# This file is used with the GYP meta build system. +# http://code.google.com/p/gyp/ +# To build try this: +# svn co http://gyp.googlecode.com/svn/trunk gyp +# ./gyp/gyp -f make --depth=`pwd` http_parser.gyp +# ./out/Debug/test +{ + 'target_defaults': { + 'default_configuration': 'Debug', + 'configurations': { + # TODO: hoist these out and put them somewhere common, because + # RuntimeLibrary MUST MATCH across the entire project + 'Debug': { + 'defines': [ 'DEBUG', '_DEBUG' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 1, # static debug + }, + }, + }, + 'Release': { + 'defines': [ 'NDEBUG' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 0, # static release + }, + }, + } + }, + 'msvs_settings': { + 'VCCLCompilerTool': { + }, + 'VCLibrarianTool': { + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'conditions': [ + ['OS == "win"', { + 'defines': [ + 'WIN32' + ], + }] + ], + }, + + 'targets': [ + { + 'target_name': 'http_parser', + 'type': 'static_library', + 'include_dirs': [ '.' ], + 'direct_dependent_settings': { + 'include_dirs': [ '.' ], + }, + 'defines': [ 'HTTP_PARSER_STRICT=0' ], + 'sources': [ './http_parser.c', ], + 'conditions': [ + ['OS=="win"', { + 'msvs_settings': { + 'VCCLCompilerTool': { + # Compile as C++. http_parser.c is actually C99, but C++ is + # close enough in this case. + 'CompileAs': 2, + }, + }, + }] + ], + }, + + { + 'target_name': 'test', + 'type': 'executable', + 'dependencies': [ 'http_parser' ], + 'sources': [ 'test.c' ] + } + ] +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.h b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.h new file mode 100644 index 0000000..78b3701 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.h @@ -0,0 +1,312 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#ifndef http_parser_h +#define http_parser_h +#ifdef __cplusplus +extern "C" { +#endif + +#define HTTP_PARSER_VERSION_MAJOR 1 +#define HTTP_PARSER_VERSION_MINOR 0 + +#include +#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600) +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; + +typedef unsigned int size_t; +typedef int ssize_t; +#else +#include +#endif + +/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run + * faster + */ +#ifndef HTTP_PARSER_STRICT +# define HTTP_PARSER_STRICT 1 +#endif + +/* Compile with -DHTTP_PARSER_DEBUG=1 to add extra debugging information to + * the error reporting facility. + */ +#ifndef HTTP_PARSER_DEBUG +# define HTTP_PARSER_DEBUG 0 +#endif + + +/* Maximium header size allowed */ +#define HTTP_MAX_HEADER_SIZE (80*1024) + + +typedef struct http_parser http_parser; +typedef struct http_parser_settings http_parser_settings; +typedef struct http_parser_result http_parser_result; + + +/* Callbacks should return non-zero to indicate an error. The parser will + * then halt execution. + * + * The one exception is on_headers_complete. In a HTTP_RESPONSE parser + * returning '1' from on_headers_complete will tell the parser that it + * should not expect a body. This is used when receiving a response to a + * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding: + * chunked' headers that indicate the presence of a body. + * + * http_data_cb does not return data chunks. It will be call arbitrarally + * many times for each string. E.G. you might get 10 callbacks for "on_path" + * each providing just a few characters more data. + */ +typedef int (*http_data_cb) (http_parser*, const char *at, size_t length); +typedef int (*http_cb) (http_parser*); + + +/* Request Methods */ +enum http_method + { HTTP_DELETE = 0 + , HTTP_GET + , HTTP_HEAD + , HTTP_POST + , HTTP_PUT + /* pathological */ + , HTTP_CONNECT + , HTTP_OPTIONS + , HTTP_TRACE + /* webdav */ + , HTTP_COPY + , HTTP_LOCK + , HTTP_MKCOL + , HTTP_MOVE + , HTTP_PROPFIND + , HTTP_PROPPATCH + , HTTP_UNLOCK + /* subversion */ + , HTTP_REPORT + , HTTP_MKACTIVITY + , HTTP_CHECKOUT + , HTTP_MERGE + /* upnp */ + , HTTP_MSEARCH + , HTTP_NOTIFY + , HTTP_SUBSCRIBE + , HTTP_UNSUBSCRIBE + /* RFC-5789 */ + , HTTP_PATCH + , HTTP_PURGE + }; + + +enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }; + + +/* Flag values for http_parser.flags field */ +enum flags + { F_CHUNKED = 1 << 0 + , F_CONNECTION_KEEP_ALIVE = 1 << 1 + , F_CONNECTION_CLOSE = 1 << 2 + , F_TRAILING = 1 << 3 + , F_UPGRADE = 1 << 4 + , F_SKIPBODY = 1 << 5 + }; + + +/* Map for errno-related constants + * + * The provided argument should be a macro that takes 2 arguments. + */ +#define HTTP_ERRNO_MAP(XX) \ + /* No error */ \ + XX(OK, "success") \ + \ + /* Callback-related errors */ \ + XX(CB_message_begin, "the on_message_begin callback failed") \ + XX(CB_url, "the on_url callback failed") \ + XX(CB_header_field, "the on_header_field callback failed") \ + XX(CB_header_value, "the on_header_value callback failed") \ + XX(CB_headers_complete, "the on_headers_complete callback failed") \ + XX(CB_body, "the on_body callback failed") \ + XX(CB_message_complete, "the on_message_complete callback failed") \ + \ + /* Parsing-related errors */ \ + XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \ + XX(HEADER_OVERFLOW, \ + "too many header bytes seen; overflow detected") \ + XX(CLOSED_CONNECTION, \ + "data received after completed connection: close message") \ + XX(INVALID_VERSION, "invalid HTTP version") \ + XX(INVALID_STATUS, "invalid HTTP status code") \ + XX(INVALID_METHOD, "invalid HTTP method") \ + XX(INVALID_URL, "invalid URL") \ + XX(INVALID_HOST, "invalid host") \ + XX(INVALID_PORT, "invalid port") \ + XX(INVALID_PATH, "invalid path") \ + XX(INVALID_QUERY_STRING, "invalid query string") \ + XX(INVALID_FRAGMENT, "invalid fragment") \ + XX(LF_EXPECTED, "LF character expected") \ + XX(INVALID_HEADER_TOKEN, "invalid character in header") \ + XX(INVALID_CONTENT_LENGTH, \ + "invalid character in content-length header") \ + XX(INVALID_CHUNK_SIZE, \ + "invalid character in chunk size header") \ + XX(INVALID_CONSTANT, "invalid constant string") \ + XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\ + XX(STRICT, "strict mode assertion failed") \ + XX(PAUSED, "parser is paused") \ + XX(UNKNOWN, "an unknown error occurred") + + +/* Define HPE_* values for each errno value above */ +#define HTTP_ERRNO_GEN(n, s) HPE_##n, +enum http_errno { + HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) +}; +#undef HTTP_ERRNO_GEN + + +/* Get an http_errno value from an http_parser */ +#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno) + +/* Get the line number that generated the current error */ +#if HTTP_PARSER_DEBUG +#define HTTP_PARSER_ERRNO_LINE(p) ((p)->error_lineno) +#else +#define HTTP_PARSER_ERRNO_LINE(p) 0 +#endif + + +struct http_parser { + /** PRIVATE **/ + unsigned char type : 2; /* enum http_parser_type */ + unsigned char flags : 6; /* F_* values from 'flags' enum; semi-public */ + unsigned char state; /* enum state from http_parser.c */ + unsigned char header_state; /* enum header_state from http_parser.c */ + unsigned char index; /* index into current matcher */ + + uint32_t nread; /* # bytes read in various scenarios */ + uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */ + + /** READ-ONLY **/ + unsigned short http_major; + unsigned short http_minor; + unsigned short status_code; /* responses only */ + unsigned char method; /* requests only */ + unsigned char http_errno : 7; + + /* 1 = Upgrade header was present and the parser has exited because of that. + * 0 = No upgrade header present. + * Should be checked when http_parser_execute() returns in addition to + * error checking. + */ + unsigned char upgrade : 1; + +#if HTTP_PARSER_DEBUG + uint32_t error_lineno; +#endif + + /** PUBLIC **/ + void *data; /* A pointer to get hook to the "connection" or "socket" object */ +}; + + +struct http_parser_settings { + http_cb on_message_begin; + http_data_cb on_url; + http_data_cb on_header_field; + http_data_cb on_header_value; + http_cb on_headers_complete; + http_data_cb on_body; + http_cb on_message_complete; +}; + + +enum http_parser_url_fields + { UF_SCHEMA = 0 + , UF_HOST = 1 + , UF_PORT = 2 + , UF_PATH = 3 + , UF_QUERY = 4 + , UF_FRAGMENT = 5 + , UF_MAX = 6 + }; + + +/* Result structure for http_parser_parse_url(). + * + * Callers should index into field_data[] with UF_* values iff field_set + * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and + * because we probably have padding left over), we convert any port to + * a uint16_t. + */ +struct http_parser_url { + uint16_t field_set; /* Bitmask of (1 << UF_*) values */ + uint16_t port; /* Converted UF_PORT string */ + + struct { + uint16_t off; /* Offset into buffer in which field starts */ + uint16_t len; /* Length of run in buffer */ + } field_data[UF_MAX]; +}; + + +void http_parser_init(http_parser *parser, enum http_parser_type type); + + +size_t http_parser_execute(http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len); + + +/* If http_should_keep_alive() in the on_headers_complete or + * on_message_complete callback returns true, then this will be should be + * the last message on the connection. + * If you are the server, respond with the "Connection: close" header. + * If you are the client, close the connection. + */ +int http_should_keep_alive(http_parser *parser); + +/* Returns a string version of the HTTP method. */ +const char *http_method_str(enum http_method m); + +/* Return a string name of the given error */ +const char *http_errno_name(enum http_errno err); + +/* Return a string description of the given error */ +const char *http_errno_description(enum http_errno err); + +/* Parse a URL; return nonzero on failure */ +int http_parser_parse_url(const char *buf, size_t buflen, + int is_connect, + struct http_parser_url *u); + +/* Pause or un-pause the parser; a nonzero value pauses */ +void http_parser_pause(http_parser *parser, int paused); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/test.c b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/test.c new file mode 100644 index 0000000..184ba24 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/test.c @@ -0,0 +1,2876 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include +#include +#include +#include /* rand */ +#include +#include + +#undef TRUE +#define TRUE 1 +#undef FALSE +#define FALSE 0 + +#define MAX_HEADERS 13 +#define MAX_ELEMENT_SIZE 500 + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +static http_parser *parser; + +struct message { + const char *name; // for debugging purposes + const char *raw; + enum http_parser_type type; + enum http_method method; + int status_code; + char request_path[MAX_ELEMENT_SIZE]; + char request_url[MAX_ELEMENT_SIZE]; + char fragment[MAX_ELEMENT_SIZE]; + char query_string[MAX_ELEMENT_SIZE]; + char body[MAX_ELEMENT_SIZE]; + size_t body_size; + uint16_t port; + int num_headers; + enum { NONE=0, FIELD, VALUE } last_header_element; + char headers [MAX_HEADERS][2][MAX_ELEMENT_SIZE]; + int should_keep_alive; + + const char *upgrade; // upgraded body + + unsigned short http_major; + unsigned short http_minor; + + int message_begin_cb_called; + int headers_complete_cb_called; + int message_complete_cb_called; + int message_complete_on_eof; +}; + +static int currently_parsing_eof; + +static struct message messages[5]; +static int num_messages; +static http_parser_settings *current_pause_parser; + +/* * R E Q U E S T S * */ +const struct message requests[] = +#define CURL_GET 0 +{ {.name= "curl get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.1\r\n" + "User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 3 + ,.headers= + { { "User-Agent", "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1" } + , { "Host", "0.0.0.0=5000" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define FIREFOX_GET 1 +, {.name= "firefox get" + ,.type= HTTP_REQUEST + ,.raw= "GET /favicon.ico HTTP/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\n" + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" + "Accept-Language: en-us,en;q=0.5\r\n" + "Accept-Encoding: gzip,deflate\r\n" + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" + "Keep-Alive: 300\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/favicon.ico" + ,.request_url= "/favicon.ico" + ,.num_headers= 8 + ,.headers= + { { "Host", "0.0.0.0=5000" } + , { "User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0" } + , { "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" } + , { "Accept-Language", "en-us,en;q=0.5" } + , { "Accept-Encoding", "gzip,deflate" } + , { "Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7" } + , { "Keep-Alive", "300" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define DUMBFUCK 2 +, {.name= "dumbfuck" + ,.type= HTTP_REQUEST + ,.raw= "GET /dumbfuck HTTP/1.1\r\n" + "aaaaaaaaaaaaa:++++++++++\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/dumbfuck" + ,.request_url= "/dumbfuck" + ,.num_headers= 1 + ,.headers= + { { "aaaaaaaaaaaaa", "++++++++++" } + } + ,.body= "" + } + +#define FRAGMENT_IN_URI 3 +, {.name= "fragment in url" + ,.type= HTTP_REQUEST + ,.raw= "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "page=1" + ,.fragment= "posts-17408" + ,.request_path= "/forums/1/topics/2375" + /* XXX request url does include fragment? */ + ,.request_url= "/forums/1/topics/2375?page=1#posts-17408" + ,.num_headers= 0 + ,.body= "" + } + +#define GET_NO_HEADERS_NO_BODY 4 +, {.name= "get no headers no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_no_headers_no_body/world HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_no_headers_no_body/world" + ,.request_url= "/get_no_headers_no_body/world" + ,.num_headers= 0 + ,.body= "" + } + +#define GET_ONE_HEADER_NO_BODY 5 +, {.name= "get one header no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_one_header_no_body HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_one_header_no_body" + ,.request_url= "/get_one_header_no_body" + ,.num_headers= 1 + ,.headers= + { { "Accept" , "*/*" } + } + ,.body= "" + } + +#define GET_FUNKY_CONTENT_LENGTH 6 +, {.name= "get funky content length body hello" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_funky_content_length_body_hello HTTP/1.0\r\n" + "conTENT-Length: 5\r\n" + "\r\n" + "HELLO" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_funky_content_length_body_hello" + ,.request_url= "/get_funky_content_length_body_hello" + ,.num_headers= 1 + ,.headers= + { { "conTENT-Length" , "5" } + } + ,.body= "HELLO" + } + +#define POST_IDENTITY_BODY_WORLD 7 +, {.name= "post identity body world" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_identity_body_world?q=search#hey HTTP/1.1\r\n" + "Accept: */*\r\n" + "Transfer-Encoding: identity\r\n" + "Content-Length: 5\r\n" + "\r\n" + "World" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "q=search" + ,.fragment= "hey" + ,.request_path= "/post_identity_body_world" + ,.request_url= "/post_identity_body_world?q=search#hey" + ,.num_headers= 3 + ,.headers= + { { "Accept", "*/*" } + , { "Transfer-Encoding", "identity" } + , { "Content-Length", "5" } + } + ,.body= "World" + } + +#define POST_CHUNKED_ALL_YOUR_BASE 8 +, {.name= "post - chunked body: all your base are belong to us" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_chunked_all_your_base HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "1e\r\nall your base are belong to us\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/post_chunked_all_your_base" + ,.request_url= "/post_chunked_all_your_base" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding" , "chunked" } + } + ,.body= "all your base are belong to us" + } + +#define TWO_CHUNKS_MULT_ZERO_END 9 +, {.name= "two chunks ; triple zero ending" + ,.type= HTTP_REQUEST + ,.raw= "POST /two_chunks_mult_zero_end HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "000\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/two_chunks_mult_zero_end" + ,.request_url= "/two_chunks_mult_zero_end" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + } + +#define CHUNKED_W_TRAILING_HEADERS 10 +, {.name= "chunked with trailing headers. blech." + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_trailing_headers HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "0\r\n" + "Vary: *\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_trailing_headers" + ,.request_url= "/chunked_w_trailing_headers" + ,.num_headers= 3 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Vary", "*" } + , { "Content-Type", "text/plain" } + } + ,.body= "hello world" + } + +#define CHUNKED_W_BULLSHIT_AFTER_LENGTH 11 +, {.name= "with bullshit after the length" + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_bullshit_after_length HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5; ihatew3;whatthefuck=aretheseparametersfor\r\nhello\r\n" + "6; blahblah; blah\r\n world\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_bullshit_after_length" + ,.request_url= "/chunked_w_bullshit_after_length" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + } + +#define WITH_QUOTES 12 +, {.name= "with quotes" + ,.type= HTTP_REQUEST + ,.raw= "GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=\"bar\"" + ,.fragment= "" + ,.request_path= "/with_\"stupid\"_quotes" + ,.request_url= "/with_\"stupid\"_quotes?foo=\"bar\"" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define APACHEBENCH_GET 13 +/* The server receiving this request SHOULD NOT wait for EOF + * to know that content-length == 0. + * How to represent this in a unit test? message_complete_on_eof + * Compare with NO_CONTENT_LENGTH_RESPONSE. + */ +, {.name = "apachebench get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.0\r\n" + "Host: 0.0.0.0:5000\r\n" + "User-Agent: ApacheBench/2.3\r\n" + "Accept: */*\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 3 + ,.headers= { { "Host", "0.0.0.0:5000" } + , { "User-Agent", "ApacheBench/2.3" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define QUERY_URL_WITH_QUESTION_MARK_GET 14 +/* Some clients include '?' characters in query strings. + */ +, {.name = "query url with question mark" + ,.type= HTTP_REQUEST + ,.raw= "GET /test.cgi?foo=bar?baz HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=bar?baz" + ,.fragment= "" + ,.request_path= "/test.cgi" + ,.request_url= "/test.cgi?foo=bar?baz" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define PREFIX_NEWLINE_GET 15 +/* Some clients, especially after a POST in a keep-alive connection, + * will send an extra CRLF before the next request + */ +, {.name = "newline prefix get" + ,.type= HTTP_REQUEST + ,.raw= "\r\nGET /test HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define UPGRADE_REQUEST 16 +, {.name = "upgrade request" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Host: example.com\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" + "Sec-WebSocket-Protocol: sample\r\n" + "Upgrade: WebSocket\r\n" + "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" + "Origin: http://example.com\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.num_headers= 7 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Host", "example.com" } + , { "Connection", "Upgrade" } + , { "Sec-WebSocket-Key2", "12998 5 Y3 1 .P00" } + , { "Sec-WebSocket-Protocol", "sample" } + , { "Upgrade", "WebSocket" } + , { "Sec-WebSocket-Key1", "4 @1 46546xW%0l 1 5" } + , { "Origin", "http://example.com" } + } + ,.body= "" + } + +#define CONNECT_REQUEST 17 +, {.name = "connect request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + "some data\r\n" + "and yet even more data" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "0-home0.netscape.com:443" + ,.num_headers= 2 + ,.upgrade="some data\r\nand yet even more data" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#define REPORT_REQ 18 +, {.name= "report request" + ,.type= HTTP_REQUEST + ,.raw= "REPORT /test HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_REPORT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define NO_HTTP_VERSION 19 +, {.name= "request with no http version" + ,.type= HTTP_REQUEST + ,.raw= "GET /\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 0 + ,.http_minor= 9 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define MSEARCH_REQ 20 +, {.name= "m-search request" + ,.type= HTTP_REQUEST + ,.raw= "M-SEARCH * HTTP/1.1\r\n" + "HOST: 239.255.255.250:1900\r\n" + "MAN: \"ssdp:discover\"\r\n" + "ST: \"ssdp:all\"\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_MSEARCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "*" + ,.request_url= "*" + ,.num_headers= 3 + ,.headers= { { "HOST", "239.255.255.250:1900" } + , { "MAN", "\"ssdp:discover\"" } + , { "ST", "\"ssdp:all\"" } + } + ,.body= "" + } + +#define LINE_FOLDING_IN_HEADER 20 +, {.name= "line folding in header value" + ,.type= HTTP_REQUEST + ,.raw= "GET / HTTP/1.1\r\n" + "Line1: abc\r\n" + "\tdef\r\n" + " ghi\r\n" + "\t\tjkl\r\n" + " mno \r\n" + "\t \tqrs\r\n" + "Line2: \t line2\t\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 2 + ,.headers= { { "Line1", "abcdefghijklmno qrs" } + , { "Line2", "line2\t" } + } + ,.body= "" + } + + +#define QUERY_TERMINATED_HOST 21 +, {.name= "host terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org?hail=all" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define QUERY_TERMINATED_HOSTPORT 22 +, {.name= "host:port terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234?hail=all" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define SPACE_TERMINATED_HOSTPORT 23 +, {.name= "host:port terminated by a space" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define PATCH_REQ 24 +, {.name = "PATCH request" + ,.type= HTTP_REQUEST + ,.raw= "PATCH /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/example\r\n" + "If-Match: \"e0023aa4e\"\r\n" + "Content-Length: 10\r\n" + "\r\n" + "cccccccccc" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PATCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.num_headers= 4 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/example" } + , { "If-Match", "\"e0023aa4e\"" } + , { "Content-Length", "10" } + } + ,.body= "cccccccccc" + } + +#define CONNECT_CAPS_REQUEST 25 +, {.name = "connect caps request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "HOME0.NETSCAPE.COM:443" + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#if !HTTP_PARSER_STRICT +#define UTF8_PATH_REQ 26 +, {.name= "utf-8 path request" + ,.type= HTTP_REQUEST + ,.raw= "GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\n" + "Host: github.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "q=1" + ,.fragment= "narf" + ,.request_path= "/δ¶/δt/pope" + ,.request_url= "/δ¶/δt/pope?q=1#narf" + ,.num_headers= 1 + ,.headers= { {"Host", "github.com" } + } + ,.body= "" + } + +#define HOSTNAME_UNDERSCORE 27 +, {.name = "hostname underscore" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT home_0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "home_0.netscape.com:443" + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } +#endif /* !HTTP_PARSER_STRICT */ + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_NO_CONNECTION_CLOSE 28 +, {.name = "eat CRLF between requests, no \"Connection: close\" header" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 3 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + } + ,.body= "q=42" + } + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_WITH_CONNECTION_CLOSE 29 +, {.name = "eat CRLF between requests even if \"Connection: close\" is set" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "Connection: close\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE /* input buffer isn't empty when on_message_complete is called */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 4 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + , { "Connection", "close" } + } + ,.body= "q=42" + } + +#define PURGE_REQ 30 +, {.name = "PURGE request" + ,.type= HTTP_REQUEST + ,.raw= "PURGE /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PURGE + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.num_headers= 1 + ,.headers= { { "Host", "www.example.com" } } + ,.body= "" + } + +, {.name= NULL } /* sentinel */ +}; + +/* * R E S P O N S E S * */ +const struct message responses[] = +#define GOOGLE_301 0 +{ {.name= "google 301" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301 Moved Permanently\r\n" + "Location: http://www.google.com/\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Date: Sun, 26 Apr 2009 11:11:49 GMT\r\n" + "Expires: Tue, 26 May 2009 11:11:49 GMT\r\n" + "X-$PrototypeBI-Version: 1.6.0.3\r\n" /* $ char in header field */ + "Cache-Control: public, max-age=2592000\r\n" + "Server: gws\r\n" + "Content-Length: 219 \r\n" + "\r\n" + "\n" + "301 Moved\n" + "

      301 Moved

      \n" + "The document has moved\n" + "here.\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.num_headers= 8 + ,.headers= + { { "Location", "http://www.google.com/" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Date", "Sun, 26 Apr 2009 11:11:49 GMT" } + , { "Expires", "Tue, 26 May 2009 11:11:49 GMT" } + , { "X-$PrototypeBI-Version", "1.6.0.3" } + , { "Cache-Control", "public, max-age=2592000" } + , { "Server", "gws" } + , { "Content-Length", "219 " } + } + ,.body= "\n" + "301 Moved\n" + "

      301 Moved

      \n" + "The document has moved\n" + "here.\r\n" + "\r\n" + } + +#define NO_CONTENT_LENGTH_RESPONSE 1 +/* The client should wait for the server's EOF. That is, when content-length + * is not specified, and "Connection: close", the end of body is specified + * by the EOF. + * Compare with APACHEBENCH_GET + */ +, {.name= "no content-length response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 04 Aug 2009 07:59:32 GMT\r\n" + "Server: Apache\r\n" + "X-Powered-By: Servlet/2.5 JSP/2.1\r\n" + "Content-Type: text/xml; charset=utf-8\r\n" + "Connection: close\r\n" + "\r\n" + "\n" + "\n" + " \n" + " \n" + " SOAP-ENV:Client\n" + " Client Error\n" + " \n" + " \n" + "" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 5 + ,.headers= + { { "Date", "Tue, 04 Aug 2009 07:59:32 GMT" } + , { "Server", "Apache" } + , { "X-Powered-By", "Servlet/2.5 JSP/2.1" } + , { "Content-Type", "text/xml; charset=utf-8" } + , { "Connection", "close" } + } + ,.body= "\n" + "\n" + " \n" + " \n" + " SOAP-ENV:Client\n" + " Client Error\n" + " \n" + " \n" + "" + } + +#define NO_HEADERS_NO_BODY_404 2 +, {.name= "404 no headers no body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 404 Not Found\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 404 + ,.num_headers= 0 + ,.headers= {} + ,.body_size= 0 + ,.body= "" + } + +#define NO_REASON_PHRASE 3 +, {.name= "301 no response phrase" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301\r\n\r\n" + ,.should_keep_alive = FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define TRAILING_SPACE_ON_CHUNKED_BODY 4 +, {.name="200 trailing space on chunked body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "25 \r\n" + "This is the data in the first chunk\r\n" + "\r\n" + "1C\r\n" + "and this is the second one\r\n" + "\r\n" + "0 \r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/plain" } + , {"Transfer-Encoding", "chunked" } + } + ,.body_size = 37+28 + ,.body = + "This is the data in the first chunk\r\n" + "and this is the second one\r\n" + + } + +#define NO_CARRIAGE_RET 5 +, {.name="no carriage ret" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\n" + "Content-Type: text/html; charset=utf-8\n" + "Connection: close\n" + "\n" + "these headers are from http://news.ycombinator.com/" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/html; charset=utf-8" } + , {"Connection", "close" } + } + ,.body= "these headers are from http://news.ycombinator.com/" + } + +#define PROXY_CONNECTION 6 +, {.name="proxy connection" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Content-Length: 11\r\n" + "Proxy-Connection: close\r\n" + "Date: Thu, 31 Dec 2009 20:55:48 +0000\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 4 + ,.headers= + { {"Content-Type", "text/html; charset=UTF-8" } + , {"Content-Length", "11" } + , {"Proxy-Connection", "close" } + , {"Date", "Thu, 31 Dec 2009 20:55:48 +0000"} + } + ,.body= "hello world" + } + +#define UNDERSTORE_HEADER_KEY 7 + // shown by + // curl -o /dev/null -v "http://ad.doubleclick.net/pfadx/DARTSHELLCONFIGXML;dcmt=text/xml;" +, {.name="underscore header key" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: DCLK-AdSvr\r\n" + "Content-Type: text/xml\r\n" + "Content-Length: 0\r\n" + "DCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 4 + ,.headers= + { {"Server", "DCLK-AdSvr" } + , {"Content-Type", "text/xml" } + , {"Content-Length", "0" } + , {"DCLK_imp", "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o" } + } + ,.body= "" + } + +#define BONJOUR_MADAME_FR 8 +/* The client should not merge two headers fields when the first one doesn't + * have a value. + */ +, {.name= "bonjourmadame.fr" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 301 Moved Permanently\r\n" + "Date: Thu, 03 Jun 2010 09:56:32 GMT\r\n" + "Server: Apache/2.2.3 (Red Hat)\r\n" + "Cache-Control: public\r\n" + "Pragma: \r\n" + "Location: http://www.bonjourmadame.fr/\r\n" + "Vary: Accept-Encoding\r\n" + "Content-Length: 0\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 301 + ,.num_headers= 9 + ,.headers= + { { "Date", "Thu, 03 Jun 2010 09:56:32 GMT" } + , { "Server", "Apache/2.2.3 (Red Hat)" } + , { "Cache-Control", "public" } + , { "Pragma", "" } + , { "Location", "http://www.bonjourmadame.fr/" } + , { "Vary", "Accept-Encoding" } + , { "Content-Length", "0" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define RES_FIELD_UNDERSCORE 9 +/* Should handle spaces in header fields */ +, {.name= "field underscore" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 28 Sep 2010 01:14:13 GMT\r\n" + "Server: Apache\r\n" + "Cache-Control: no-cache, must-revalidate\r\n" + "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n" + ".et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\n" + "Vary: Accept-Encoding\r\n" + "_eep-Alive: timeout=45\r\n" /* semantic value ignored */ + "_onnection: Keep-Alive\r\n" /* semantic value ignored */ + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/html\r\n" + "Connection: close\r\n" + "\r\n" + "0\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 11 + ,.headers= + { { "Date", "Tue, 28 Sep 2010 01:14:13 GMT" } + , { "Server", "Apache" } + , { "Cache-Control", "no-cache, must-revalidate" } + , { "Expires", "Mon, 26 Jul 1997 05:00:00 GMT" } + , { ".et-Cookie", "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com" } + , { "Vary", "Accept-Encoding" } + , { "_eep-Alive", "timeout=45" } + , { "_onnection", "Keep-Alive" } + , { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/html" } + , { "Connection", "close" } + } + ,.body= "" + } + +#define NON_ASCII_IN_STATUS_LINE 10 +/* Should handle non-ASCII in status line */ +, {.name= "non-ASCII in status line" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 500 Oriëntatieprobleem\r\n" + "Date: Fri, 5 Nov 2010 23:07:12 GMT+2\r\n" + "Content-Length: 0\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 500 + ,.num_headers= 3 + ,.headers= + { { "Date", "Fri, 5 Nov 2010 23:07:12 GMT+2" } + , { "Content-Length", "0" } + , { "Connection", "close" } + } + ,.body= "" + } + +#define HTTP_VERSION_0_9 11 +/* Should handle HTTP/0.9 */ +, {.name= "http version 0.9" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/0.9 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 0 + ,.http_minor= 9 + ,.status_code= 200 + ,.num_headers= 0 + ,.headers= + {} + ,.body= "" + } + +#define NO_CONTENT_LENGTH_NO_TRANSFER_ENCODING_RESPONSE 12 +/* The client should wait for the server's EOF. That is, when neither + * content-length nor transfer-encoding is specified, the end of body + * is specified by the EOF. + */ +, {.name= "neither content-length nor transfer-encoding response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Content-Type", "text/plain" } + } + ,.body= "hello world" + } + +#define NO_BODY_HTTP10_KA_200 13 +, {.name= "HTTP/1.0 with keep-alive and EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 200 OK\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP10_KA_204 14 +, {.name= "HTTP/1.0 with keep-alive and a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 204 No content\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 204 + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_200 15 +, {.name= "HTTP/1.1 with an EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_204 16 +, {.name= "HTTP/1.1 with a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_NOKA_204 17 +, {.name= "HTTP/1.1 with a 204 status and keep-alive disabled" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.num_headers= 1 + ,.headers= + { { "Connection", "close" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_CHUNKED_200 18 +, {.name= "HTTP/1.1 with chunked endocing and a 200 response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body_size= 0 + ,.body= "" + } + +#if !HTTP_PARSER_STRICT +#define SPACE_IN_FIELD_RES 19 +/* Should handle spaces in header fields */ +, {.name= "field space" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: Microsoft-IIS/6.0\r\n" + "X-Powered-By: ASP.NET\r\n" + "en-US Content-Type: text/xml\r\n" /* this is the problem */ + "Content-Type: text/xml\r\n" + "Content-Length: 16\r\n" + "Date: Fri, 23 Jul 2010 18:45:38 GMT\r\n" + "Connection: keep-alive\r\n" + "\r\n" + "hello" /* fake body */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 7 + ,.headers= + { { "Server", "Microsoft-IIS/6.0" } + , { "X-Powered-By", "ASP.NET" } + , { "en-US Content-Type", "text/xml" } + , { "Content-Type", "text/xml" } + , { "Content-Length", "16" } + , { "Date", "Fri, 23 Jul 2010 18:45:38 GMT" } + , { "Connection", "keep-alive" } + } + ,.body= "hello" + } +#endif /* !HTTP_PARSER_STRICT */ + +, {.name= NULL } /* sentinel */ +}; + +int +request_url_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + strncat(messages[num_messages].request_url, buf, len); + return 0; +} + +int +header_field_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + struct message *m = &messages[num_messages]; + + if (m->last_header_element != FIELD) + m->num_headers++; + + strncat(m->headers[m->num_headers-1][0], buf, len); + + m->last_header_element = FIELD; + + return 0; +} + +int +header_value_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + struct message *m = &messages[num_messages]; + + strncat(m->headers[m->num_headers-1][1], buf, len); + + m->last_header_element = VALUE; + + return 0; +} + +int +body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + strncat(messages[num_messages].body, buf, len); + messages[num_messages].body_size += len; + // printf("body_cb: '%s'\n", requests[num_messages].body); + return 0; +} + +int +count_body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + assert(buf); + messages[num_messages].body_size += len; + return 0; +} + +int +message_begin_cb (http_parser *p) +{ + assert(p == parser); + messages[num_messages].message_begin_cb_called = TRUE; + return 0; +} + +int +headers_complete_cb (http_parser *p) +{ + assert(p == parser); + messages[num_messages].method = parser->method; + messages[num_messages].status_code = parser->status_code; + messages[num_messages].http_major = parser->http_major; + messages[num_messages].http_minor = parser->http_minor; + messages[num_messages].headers_complete_cb_called = TRUE; + messages[num_messages].should_keep_alive = http_should_keep_alive(parser); + return 0; +} + +int +message_complete_cb (http_parser *p) +{ + assert(p == parser); + if (messages[num_messages].should_keep_alive != http_should_keep_alive(parser)) + { + fprintf(stderr, "\n\n *** Error http_should_keep_alive() should have same " + "value in both on_message_complete and on_headers_complete " + "but it doesn't! ***\n\n"); + assert(0); + exit(1); + } + messages[num_messages].message_complete_cb_called = TRUE; + + messages[num_messages].message_complete_on_eof = currently_parsing_eof; + + num_messages++; + return 0; +} + +/* These dontcall_* callbacks exist so that we can verify that when we're + * paused, no additional callbacks are invoked */ +int +dontcall_message_begin_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_begin() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_field() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_value() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_request_url() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_body_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_body_cb() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_headers_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_headers_complete() called on paused " + "parser ***\n\n"); + exit(1); +} + +int +dontcall_message_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_complete() called on paused " + "parser ***\n\n"); + exit(1); +} + +static http_parser_settings settings_dontcall = + {.on_message_begin = dontcall_message_begin_cb + ,.on_header_field = dontcall_header_field_cb + ,.on_header_value = dontcall_header_value_cb + ,.on_url = dontcall_request_url_cb + ,.on_body = dontcall_body_cb + ,.on_headers_complete = dontcall_headers_complete_cb + ,.on_message_complete = dontcall_message_complete_cb + }; + +/* These pause_* callbacks always pause the parser and just invoke the regular + * callback that tracks content. Before returning, we overwrite the parser + * settings to point to the _dontcall variety so that we can verify that + * the pause actually did, you know, pause. */ +int +pause_message_begin_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_begin_cb(p); +} + +int +pause_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_field_cb(p, buf, len); +} + +int +pause_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_value_cb(p, buf, len); +} + +int +pause_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return request_url_cb(p, buf, len); +} + +int +pause_body_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return body_cb(p, buf, len); +} + +int +pause_headers_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return headers_complete_cb(p); +} + +int +pause_message_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_complete_cb(p); +} + +static http_parser_settings settings_pause = + {.on_message_begin = pause_message_begin_cb + ,.on_header_field = pause_header_field_cb + ,.on_header_value = pause_header_value_cb + ,.on_url = pause_request_url_cb + ,.on_body = pause_body_cb + ,.on_headers_complete = pause_headers_complete_cb + ,.on_message_complete = pause_message_complete_cb + }; + +static http_parser_settings settings = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_body = body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + }; + +static http_parser_settings settings_count_body = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_body = count_body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + }; + +static http_parser_settings settings_null = + {.on_message_begin = 0 + ,.on_header_field = 0 + ,.on_header_value = 0 + ,.on_url = 0 + ,.on_body = 0 + ,.on_headers_complete = 0 + ,.on_message_complete = 0 + }; + +void +parser_init (enum http_parser_type type) +{ + num_messages = 0; + + assert(parser == NULL); + + parser = malloc(sizeof(http_parser)); + + http_parser_init(parser, type); + + memset(&messages, 0, sizeof messages); + +} + +void +parser_free () +{ + assert(parser); + free(parser); + parser = NULL; +} + +size_t parse (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(parser, &settings, buf, len); + return nparsed; +} + +size_t parse_count_body (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(parser, &settings_count_body, buf, len); + return nparsed; +} + +size_t parse_pause (const char *buf, size_t len) +{ + size_t nparsed; + http_parser_settings s = settings_pause; + + currently_parsing_eof = (len == 0); + current_pause_parser = &s; + nparsed = http_parser_execute(parser, current_pause_parser, buf, len); + return nparsed; +} + +static inline int +check_str_eq (const struct message *m, + const char *prop, + const char *expected, + const char *found) { + if ((expected == NULL) != (found == NULL)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %s\n", (expected == NULL) ? "NULL" : expected); + printf(" found %s\n", (found == NULL) ? "NULL" : found); + return 0; + } + if (expected != NULL && 0 != strcmp(expected, found)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected '%s'\n", expected); + printf(" found '%s'\n", found); + return 0; + } + return 1; +} + +static inline int +check_num_eq (const struct message *m, + const char *prop, + int expected, + int found) { + if (expected != found) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %d\n", expected); + printf(" found %d\n", found); + return 0; + } + return 1; +} + +#define MESSAGE_CHECK_STR_EQ(expected, found, prop) \ + if (!check_str_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_NUM_EQ(expected, found, prop) \ + if (!check_num_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_URL_EQ(u, expected, found, prop, fn) \ +do { \ + char ubuf[256]; \ + \ + if ((u)->field_set & (1 << (fn))) { \ + memcpy(ubuf, (found)->request_url + (u)->field_data[(fn)].off, \ + (u)->field_data[(fn)].len); \ + ubuf[(u)->field_data[(fn)].len] = '\0'; \ + } else { \ + ubuf[0] = '\0'; \ + } \ + \ + check_str_eq(expected, #prop, expected->prop, ubuf); \ +} while(0) + +int +message_eq (int index, const struct message *expected) +{ + int i; + struct message *m = &messages[index]; + + MESSAGE_CHECK_NUM_EQ(expected, m, http_major); + MESSAGE_CHECK_NUM_EQ(expected, m, http_minor); + + if (expected->type == HTTP_REQUEST) { + MESSAGE_CHECK_NUM_EQ(expected, m, method); + } else { + MESSAGE_CHECK_NUM_EQ(expected, m, status_code); + } + + MESSAGE_CHECK_NUM_EQ(expected, m, should_keep_alive); + MESSAGE_CHECK_NUM_EQ(expected, m, message_complete_on_eof); + + assert(m->message_begin_cb_called); + assert(m->headers_complete_cb_called); + assert(m->message_complete_cb_called); + + + MESSAGE_CHECK_STR_EQ(expected, m, request_url); + + /* Check URL components; we can't do this w/ CONNECT since it doesn't + * send us a well-formed URL. + */ + if (*m->request_url && m->method != HTTP_CONNECT) { + struct http_parser_url u; + + if (http_parser_parse_url(m->request_url, strlen(m->request_url), 0, &u)) { + fprintf(stderr, "\n\n*** failed to parse URL %s ***\n\n", + m->request_url); + exit(1); + } + + m->port = (u.field_set & (1 << UF_PORT)) ? + u.port : 0; + + MESSAGE_CHECK_URL_EQ(&u, expected, m, query_string, UF_QUERY); + MESSAGE_CHECK_URL_EQ(&u, expected, m, fragment, UF_FRAGMENT); + MESSAGE_CHECK_URL_EQ(&u, expected, m, request_path, UF_PATH); + MESSAGE_CHECK_NUM_EQ(expected, m, port); + } + + if (expected->body_size) { + MESSAGE_CHECK_NUM_EQ(expected, m, body_size); + } else { + MESSAGE_CHECK_STR_EQ(expected, m, body); + } + + MESSAGE_CHECK_NUM_EQ(expected, m, num_headers); + + int r; + for (i = 0; i < m->num_headers; i++) { + r = check_str_eq(expected, "header field", expected->headers[i][0], m->headers[i][0]); + if (!r) return 0; + r = check_str_eq(expected, "header value", expected->headers[i][1], m->headers[i][1]); + if (!r) return 0; + } + + MESSAGE_CHECK_STR_EQ(expected, m, upgrade); + + return 1; +} + +/* Given a sequence of varargs messages, return the number of them that the + * parser should successfully parse, taking into account that upgraded + * messages prevent all subsequent messages from being parsed. + */ +size_t +count_parsed_messages(const size_t nmsgs, ...) { + size_t i; + va_list ap; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + if (m->upgrade) { + va_end(ap); + return i + 1; + } + } + + va_end(ap); + return nmsgs; +} + +/* Given a sequence of bytes and the number of these that we were able to + * parse, verify that upgrade bodies are correct. + */ +void +upgrade_message_fix(char *body, const size_t nread, const size_t nmsgs, ...) { + va_list ap; + size_t i; + size_t off = 0; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + off += strlen(m->raw); + + if (m->upgrade) { + off -= strlen(m->upgrade); + + /* Check the portion of the response after its specified upgrade */ + if (!check_str_eq(m, "upgrade", body + off, body + nread)) { + exit(1); + } + + /* Fix up the response so that message_eq() will verify the beginning + * of the upgrade */ + *(body + nread + strlen(m->upgrade)) = '\0'; + messages[num_messages -1 ].upgrade = body + nread; + + va_end(ap); + return; + } + } + + va_end(ap); + printf("\n\n*** Error: expected a message with upgrade ***\n"); + + exit(1); +} + +static void +print_error (const char *raw, size_t error_location) +{ + fprintf(stderr, "\n*** %s:%d -- %s ***\n\n", + "http_parser.c", HTTP_PARSER_ERRNO_LINE(parser), + http_errno_description(HTTP_PARSER_ERRNO(parser))); + + int this_line = 0, char_len = 0; + size_t i, j, len = strlen(raw), error_location_line = 0; + for (i = 0; i < len; i++) { + if (i == error_location) this_line = 1; + switch (raw[i]) { + case '\r': + char_len = 2; + fprintf(stderr, "\\r"); + break; + + case '\n': + char_len = 2; + fprintf(stderr, "\\n\n"); + + if (this_line) goto print; + + error_location_line = 0; + continue; + + default: + char_len = 1; + fputc(raw[i], stderr); + break; + } + if (!this_line) error_location_line += char_len; + } + + fprintf(stderr, "[eof]\n"); + + print: + for (j = 0; j < error_location_line; j++) { + fputc(' ', stderr); + } + fprintf(stderr, "^\n\nerror location: %u\n", (unsigned int)error_location); +} + +void +test_preserve_data (void) +{ + char my_data[] = "application-specific data"; + http_parser parser; + parser.data = my_data; + http_parser_init(&parser, HTTP_REQUEST); + if (parser.data != my_data) { + printf("\n*** parser.data not preserved accross http_parser_init ***\n\n"); + exit(1); + } +} + +struct url_test { + const char *name; + const char *url; + int is_connect; + struct http_parser_url u; + int rv; +}; + +const struct url_test url_tests[] = +{ {.name="proxy request" + ,.url="http://hostname/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 15, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + } + } + ,.rv=0 + } + +, {.name="CONNECT request" + ,.url="hostname:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 0, 8 } /* UF_HOST */ + ,{ 9, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + } + } + ,.rv=0 + } + +, {.name="proxy ipv6 request" + ,.url="http://[1:2::3:4]/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 17, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + } + } + ,.rv=0 + } + +, {.name="CONNECT ipv6 address" + ,.url="[1:2::3:4]:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 1, 8 } /* UF_HOST */ + ,{ 11, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + } + } + ,.rv=0 + } + +, {.name="extra ? in query string" + ,.url="http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css,fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css,fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css" + ,.is_connect=0 + ,.u= + {.field_set=(1<field_set, u->port); + for (i = 0; i < UF_MAX; i++) { + if ((u->field_set & (1 << i)) == 0) { + printf("\tfield_data[%u]: unset\n", i); + continue; + } + + memcpy(part, url + u->field_data[i].off, u->field_data[i].len); + part[u->field_data[i].len] = '\0'; + + printf("\tfield_data[%u]: off: %u len: %u part: \"%s\"\n", + i, + u->field_data[i].off, + u->field_data[i].len, + part); + } +} + +void +test_parse_url (void) +{ + struct http_parser_url u; + const struct url_test *test; + unsigned int i; + int rv; + + for (i = 0; i < (sizeof(url_tests) / sizeof(url_tests[0])); i++) { + test = &url_tests[i]; + memset(&u, 0, sizeof(u)); + + rv = http_parser_parse_url(test->url, + strlen(test->url), + test->is_connect, + &u); + + if (test->rv == 0) { + if (rv != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + exit(1); + } + + if (memcmp(&u, &test->u, sizeof(u)) != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" failed ***\n", + test->url, test->name); + + printf("target http_parser_url:\n"); + dump_url(test->url, &test->u); + printf("result http_parser_url:\n"); + dump_url(test->url, &u); + + exit(1); + } + } else { + /* test->rv != 0 */ + if (rv == 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + exit(1); + } + } + } +} + +void +test_message (const struct message *message) +{ + size_t raw_len = strlen(message->raw); + size_t msg1len; + for (msg1len = 0; msg1len < raw_len; msg1len++) { + parser_init(message->type); + + size_t read; + const char *msg1 = message->raw; + const char *msg2 = msg1 + msg1len; + size_t msg2len = raw_len - msg1len; + + if (msg1len) { + read = parse(msg1, msg1len); + + if (message->upgrade && parser->upgrade) { + messages[num_messages - 1].upgrade = msg1 + read; + goto test; + } + + if (read != msg1len) { + print_error(msg1, read); + exit(1); + } + } + + + read = parse(msg2, msg2len); + + if (message->upgrade && parser->upgrade) { + messages[num_messages - 1].upgrade = msg2 + read; + goto test; + } + + if (read != msg2len) { + print_error(msg2, read); + exit(1); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(message->raw, read); + exit(1); + } + + test: + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + exit(1); + } + + if(!message_eq(0, message)) exit(1); + + parser_free(); + } +} + +void +test_message_count_body (const struct message *message) +{ + parser_init(message->type); + + size_t read; + size_t l = strlen(message->raw); + size_t i, toread; + size_t chunk = 4024; + + for (i = 0; i < l; i+= chunk) { + toread = MIN(l-i, chunk); + read = parse_count_body(message->raw + i, toread); + if (read != toread) { + print_error(message->raw, read); + exit(1); + } + } + + + read = parse_count_body(NULL, 0); + if (read != 0) { + print_error(message->raw, read); + exit(1); + } + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + exit(1); + } + + if(!message_eq(0, message)) exit(1); + + parser_free(); +} + +void +test_simple (const char *buf, enum http_errno err_expected) +{ + parser_init(HTTP_REQUEST); + + size_t parsed; + int pass; + enum http_errno err; + + parsed = parse(buf, strlen(buf)); + pass = (parsed == strlen(buf)); + err = HTTP_PARSER_ERRNO(parser); + parsed = parse(NULL, 0); + pass &= (parsed == 0); + + parser_free(); + + /* In strict mode, allow us to pass with an unexpected HPE_STRICT as + * long as the caller isn't expecting success. + */ +#if HTTP_PARSER_STRICT + if (err_expected != err && err_expected != HPE_OK && err != HPE_STRICT) { +#else + if (err_expected != err) { +#endif + fprintf(stderr, "\n*** test_simple expected %s, but saw %s ***\n\n%s\n", + http_errno_name(err_expected), http_errno_name(err), buf); + exit(1); + } +} + +void +test_header_overflow_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? "GET / HTTP/1.1\r\n" : "HTTP/1.0 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "header-key: header-value\r\n"; + size_t buflen = strlen(buf); + + int i; + for (i = 0; i < 10000; i++) { + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + //fprintf(stderr, "error found on iter %d\n", i); + assert(HTTP_PARSER_ERRNO(&parser) == HPE_HEADER_OVERFLOW); + return; + } + } + + fprintf(stderr, "\n*** Error expected but none in header overflow test ***\n"); + exit(1); +} + +static void +test_content_length_overflow (const char *buf, size_t buflen, int expect_ok) +{ + http_parser parser; + http_parser_init(&parser, HTTP_RESPONSE); + http_parser_execute(&parser, &settings_null, buf, buflen); + + if (expect_ok) + assert(HTTP_PARSER_ERRNO(&parser) == HPE_OK); + else + assert(HTTP_PARSER_ERRNO(&parser) == HPE_INVALID_CONTENT_LENGTH); +} + +void +test_header_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Content-Length: " #size "\r\n" \ + "\r\n" + const char a[] = X(18446744073709551614); /* 2^64-2 */ + const char b[] = X(18446744073709551615); /* 2^64-1 */ + const char c[] = X(18446744073709551616); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_chunk_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Transfer-Encoding: chunked\r\n" \ + "\r\n" \ + #size "\r\n" \ + "..." + const char a[] = X(FFFFFFFFFFFFFFFE); /* 2^64-2 */ + const char b[] = X(FFFFFFFFFFFFFFFF); /* 2^64-1 */ + const char c[] = X(10000000000000000); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_no_overflow_long_body (int req, size_t length) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + size_t i; + char buf1[3000]; + size_t buf1len = sprintf(buf1, "%s\r\nConnection: Keep-Alive\r\nContent-Length: %zu\r\n\r\n", + req ? "POST / HTTP/1.0" : "HTTP/1.0 200 OK", length); + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) + goto err; + + for (i = 0; i < length; i++) { + char foo = 'a'; + parsed = http_parser_execute(&parser, &settings_null, &foo, 1); + if (parsed != 1) + goto err; + } + + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) goto err; + return; + + err: + fprintf(stderr, + "\n*** error in test_no_overflow_long_body %s of length %zu ***\n", + req ? "REQUEST" : "RESPONSE", + length); + exit(1); +} + +void +test_multiple3 (const struct message *r1, const struct message *r2, const struct message *r3) +{ + int message_count = count_parsed_messages(3, r1, r2, r3); + + char total[ strlen(r1->raw) + + strlen(r2->raw) + + strlen(r3->raw) + + 1 + ]; + total[0] = '\0'; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + parser_init(r1->type); + + size_t read; + + read = parse(total, strlen(total)); + + if (parser->upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + goto test; + } + + if (read != strlen(total)) { + print_error(total, read); + exit(1); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(total, read); + exit(1); + } + +test: + + if (message_count != num_messages) { + fprintf(stderr, "\n\n*** Parser didn't see 3 messages only %d *** \n", num_messages); + exit(1); + } + + if (!message_eq(0, r1)) exit(1); + if (message_count > 1 && !message_eq(1, r2)) exit(1); + if (message_count > 2 && !message_eq(2, r3)) exit(1); + + parser_free(); +} + +/* SCAN through every possible breaking to make sure the + * parser can handle getting the content in any chunks that + * might come from the socket + */ +void +test_scan (const struct message *r1, const struct message *r2, const struct message *r3) +{ + char total[80*1024] = "\0"; + char buf1[80*1024] = "\0"; + char buf2[80*1024] = "\0"; + char buf3[80*1024] = "\0"; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + size_t read; + + int total_len = strlen(total); + + int total_ops = 2 * (total_len - 1) * (total_len - 2) / 2; + int ops = 0 ; + + size_t buf1_len, buf2_len, buf3_len; + int message_count = count_parsed_messages(3, r1, r2, r3); + + int i,j,type_both; + for (type_both = 0; type_both < 2; type_both ++ ) { + for (j = 2; j < total_len; j ++ ) { + for (i = 1; i < j; i ++ ) { + + if (ops % 1000 == 0) { + printf("\b\b\b\b%3.0f%%", 100 * (float)ops /(float)total_ops); + fflush(stdout); + } + ops += 1; + + parser_init(type_both ? HTTP_BOTH : r1->type); + + buf1_len = i; + strncpy(buf1, total, buf1_len); + buf1[buf1_len] = 0; + + buf2_len = j - i; + strncpy(buf2, total+i, buf2_len); + buf2[buf2_len] = 0; + + buf3_len = total_len - j; + strncpy(buf3, total+j, buf3_len); + buf3[buf3_len] = 0; + + read = parse(buf1, buf1_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len) { + print_error(buf1, read); + goto error; + } + + read += parse(buf2, buf2_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len + buf2_len) { + print_error(buf2, read); + goto error; + } + + read += parse(buf3, buf3_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len + buf2_len + buf3_len) { + print_error(buf3, read); + goto error; + } + + parse(NULL, 0); + +test: + if (parser->upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + } + + if (message_count != num_messages) { + fprintf(stderr, "\n\nParser didn't see %d messages only %d\n", + message_count, num_messages); + goto error; + } + + if (!message_eq(0, r1)) { + fprintf(stderr, "\n\nError matching messages[0] in test_scan.\n"); + goto error; + } + + if (message_count > 1 && !message_eq(1, r2)) { + fprintf(stderr, "\n\nError matching messages[1] in test_scan.\n"); + goto error; + } + + if (message_count > 2 && !message_eq(2, r3)) { + fprintf(stderr, "\n\nError matching messages[2] in test_scan.\n"); + goto error; + } + + parser_free(); + } + } + } + puts("\b\b\b\b100%"); + return; + + error: + fprintf(stderr, "i=%d j=%d\n", i, j); + fprintf(stderr, "buf1 (%u) %s\n\n", (unsigned int)buf1_len, buf1); + fprintf(stderr, "buf2 (%u) %s\n\n", (unsigned int)buf2_len , buf2); + fprintf(stderr, "buf3 (%u) %s\n", (unsigned int)buf3_len, buf3); + exit(1); +} + +// user required to free the result +// string terminated by \0 +char * +create_large_chunked_message (int body_size_in_kb, const char* headers) +{ + int i; + size_t wrote = 0; + size_t headers_len = strlen(headers); + size_t bufsize = headers_len + (5+1024+2)*body_size_in_kb + 6; + char * buf = malloc(bufsize); + + memcpy(buf, headers, headers_len); + wrote += headers_len; + + for (i = 0; i < body_size_in_kb; i++) { + // write 1kb chunk into the body. + memcpy(buf + wrote, "400\r\n", 5); + wrote += 5; + memset(buf + wrote, 'C', 1024); + wrote += 1024; + strcpy(buf + wrote, "\r\n"); + wrote += 2; + } + + memcpy(buf + wrote, "0\r\n\r\n", 6); + wrote += 6; + assert(wrote == bufsize); + + return buf; +} + +/* Verify that we can pause parsing at any of the bytes in the + * message and still get the result that we're expecting. */ +void +test_message_pause (const struct message *msg) +{ + char *buf = (char*) msg->raw; + size_t buflen = strlen(msg->raw); + size_t nread; + + parser_init(msg->type); + + do { + nread = parse_pause(buf, buflen); + + // We can only set the upgrade buffer once we've gotten our message + // completion callback. + if (messages[0].message_complete_cb_called && + msg->upgrade && + parser->upgrade) { + messages[0].upgrade = buf + nread; + goto test; + } + + if (nread < buflen) { + + // Not much do to if we failed a strict-mode check + if (HTTP_PARSER_ERRNO(parser) == HPE_STRICT) { + parser_free(); + return; + } + + assert (HTTP_PARSER_ERRNO(parser) == HPE_PAUSED); + } + + buf += nread; + buflen -= nread; + http_parser_pause(parser, 0); + } while (buflen > 0); + + nread = parse_pause(NULL, 0); + assert (nread == 0); + +test: + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", msg->name); + exit(1); + } + + if(!message_eq(0, msg)) exit(1); + + parser_free(); +} + +int +main (void) +{ + parser = NULL; + int i, j, k; + int request_count; + int response_count; + + printf("sizeof(http_parser) = %u\n", (unsigned int)sizeof(http_parser)); + + for (request_count = 0; requests[request_count].name; request_count++); + for (response_count = 0; responses[response_count].name; response_count++); + + //// API + test_preserve_data(); + test_parse_url(); + + //// OVERFLOW CONDITIONS + + test_header_overflow_error(HTTP_REQUEST); + test_no_overflow_long_body(HTTP_REQUEST, 1000); + test_no_overflow_long_body(HTTP_REQUEST, 100000); + + test_header_overflow_error(HTTP_RESPONSE); + test_no_overflow_long_body(HTTP_RESPONSE, 1000); + test_no_overflow_long_body(HTTP_RESPONSE, 100000); + + test_header_content_length_overflow_error(); + test_chunk_content_length_overflow_error(); + + //// RESPONSES + + for (i = 0; i < response_count; i++) { + test_message(&responses[i]); + } + + for (i = 0; i < response_count; i++) { + test_message_pause(&responses[i]); + } + + for (i = 0; i < response_count; i++) { + if (!responses[i].should_keep_alive) continue; + for (j = 0; j < response_count; j++) { + if (!responses[j].should_keep_alive) continue; + for (k = 0; k < response_count; k++) { + test_multiple3(&responses[i], &responses[j], &responses[k]); + } + } + } + + test_message_count_body(&responses[NO_HEADERS_NO_BODY_404]); + test_message_count_body(&responses[TRAILING_SPACE_ON_CHUNKED_BODY]); + + // test very large chunked response + { + char * msg = create_large_chunked_message(31337, + "HTTP/1.0 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/plain\r\n" + "\r\n"); + struct message large_chunked = + {.name= "large chunked" + ,.type= HTTP_RESPONSE + ,.raw= msg + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/plain" } + } + ,.body_size= 31337*1024 + }; + test_message_count_body(&large_chunked); + free(msg); + } + + + + printf("response scan 1/2 "); + test_scan( &responses[TRAILING_SPACE_ON_CHUNKED_BODY] + , &responses[NO_BODY_HTTP10_KA_204] + , &responses[NO_REASON_PHRASE] + ); + + printf("response scan 2/2 "); + test_scan( &responses[BONJOUR_MADAME_FR] + , &responses[UNDERSTORE_HEADER_KEY] + , &responses[NO_CARRIAGE_RET] + ); + + puts("responses okay"); + + + /// REQUESTS + + test_simple("hello world", HPE_INVALID_METHOD); + test_simple("GET / HTP/1.1\r\n\r\n", HPE_INVALID_VERSION); + + + test_simple("ASDF / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + test_simple("PROPPATCHA / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + test_simple("GETA / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + + // Well-formed but incomplete + test_simple("GET / HTTP/1.1\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 6\r\n" + "\r\n" + "fooba", + HPE_OK); + + static const char *all_methods[] = { + "DELETE", + "GET", + "HEAD", + "POST", + "PUT", + //"CONNECT", //CONNECT can't be tested like other methods, it's a tunnel + "OPTIONS", + "TRACE", + "COPY", + "LOCK", + "MKCOL", + "MOVE", + "PROPFIND", + "PROPPATCH", + "UNLOCK", + "REPORT", + "MKACTIVITY", + "CHECKOUT", + "MERGE", + "M-SEARCH", + "NOTIFY", + "SUBSCRIBE", + "UNSUBSCRIBE", + "PATCH", + 0 }; + const char **this_method; + for (this_method = all_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_OK); + } + + static const char *bad_methods[] = { + "C******", + "M****", + 0 }; + for (this_method = bad_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_UNKNOWN); + } + + const char *dumbfuck2 = + "GET / HTTP/1.1\r\n" + "X-SSL-Bullshit: -----BEGIN CERTIFICATE-----\r\n" + "\tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx\r\n" + "\tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT\r\n" + "\tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu\r\n" + "\tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV\r\n" + "\tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV\r\n" + "\tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB\r\n" + "\tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF\r\n" + "\tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR\r\n" + "\tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL\r\n" + "\t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP\r\n" + "\tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR\r\n" + "\twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG\r\n" + "\tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgHTTPAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs\r\n" + "\tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD\r\n" + "\tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj\r\n" + "\tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj\r\n" + "\taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG\r\n" + "\t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE\r\n" + "\tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO\r\n" + "\tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1\r\n" + "\tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0\r\n" + "\tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD\r\n" + "\tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv\r\n" + "\tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3\r\n" + "\tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8\r\n" + "\tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk\r\n" + "\thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK\r\n" + "\twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu\r\n" + "\tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3\r\n" + "\tRA==\r\n" + "\t-----END CERTIFICATE-----\r\n" + "\r\n"; + test_simple(dumbfuck2, HPE_OK); + +#if 0 + // NOTE(Wed Nov 18 11:57:27 CET 2009) this seems okay. we just read body + // until EOF. + // + // no content-length + // error if there is a body without content length + const char *bad_get_no_headers_no_body = "GET /bad_get_no_headers_no_body/world HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + "HELLO"; + test_simple(bad_get_no_headers_no_body, 0); +#endif + /* TODO sending junk and large headers gets rejected */ + + + /* check to make sure our predefined requests are okay */ + for (i = 0; requests[i].name; i++) { + test_message(&requests[i]); + } + + for (i = 0; i < request_count; i++) { + test_message_pause(&requests[i]); + } + + for (i = 0; i < request_count; i++) { + if (!requests[i].should_keep_alive) continue; + for (j = 0; j < request_count; j++) { + if (!requests[j].should_keep_alive) continue; + for (k = 0; k < request_count; k++) { + test_multiple3(&requests[i], &requests[j], &requests[k]); + } + } + } + + printf("request scan 1/4 "); + test_scan( &requests[GET_NO_HEADERS_NO_BODY] + , &requests[GET_ONE_HEADER_NO_BODY] + , &requests[GET_NO_HEADERS_NO_BODY] + ); + + printf("request scan 2/4 "); + test_scan( &requests[POST_CHUNKED_ALL_YOUR_BASE] + , &requests[POST_IDENTITY_BODY_WORLD] + , &requests[GET_FUNKY_CONTENT_LENGTH] + ); + + printf("request scan 3/4 "); + test_scan( &requests[TWO_CHUNKS_MULT_ZERO_END] + , &requests[CHUNKED_W_TRAILING_HEADERS] + , &requests[CHUNKED_W_BULLSHIT_AFTER_LENGTH] + ); + + printf("request scan 4/4 "); + test_scan( &requests[QUERY_URL_WITH_QUESTION_MARK_GET] + , &requests[PREFIX_NEWLINE_GET ] + , &requests[CONNECT_REQUEST] + ); + + puts("requests okay"); + + return 0; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/http_parser.rb.gemspec b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/http_parser.rb.gemspec new file mode 100644 index 0000000..9a406f8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/http_parser.rb.gemspec @@ -0,0 +1,28 @@ +Gem::Specification.new do |s| + s.name = "http_parser.rb" + s.version = "0.6.0" + s.summary = "Simple callback-based HTTP request/response parser" + s.description = "Ruby bindings to http://github.com/ry/http-parser and http://github.com/a2800276/http-parser.java" + + s.authors = ["Marc-Andre Cournoyer", "Aman Gupta"] + s.email = ["macournoyer@gmail.com", "aman@tmm1.net"] + s.license = 'MIT' + + s.homepage = "http://github.com/tmm1/http_parser.rb" + s.files = `git ls-files`.split("\n") + Dir['ext/ruby_http_parser/vendor/**/*'] + + s.require_paths = ["lib"] + s.extensions = ["ext/ruby_http_parser/extconf.rb"] + + s.add_development_dependency 'rake-compiler', '>= 0.7.9' + s.add_development_dependency 'rspec', '>= 2.0.1' + s.add_development_dependency 'json', '>= 1.4.6' + s.add_development_dependency 'benchmark_suite' + s.add_development_dependency 'ffi' + + if RUBY_PLATFORM =~ /java/ + s.add_development_dependency 'jruby-openssl' + else + s.add_development_dependency 'yajl-ruby', '>= 0.8.1' + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/lib/http/parser.rb b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/lib/http/parser.rb new file mode 100644 index 0000000..4881b03 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/lib/http/parser.rb @@ -0,0 +1 @@ +require 'http_parser' diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/lib/http_parser.rb b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/lib/http_parser.rb new file mode 100644 index 0000000..c69f7a0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/lib/http_parser.rb @@ -0,0 +1,21 @@ +$:.unshift File.expand_path('../', __FILE__) +require 'ruby_http_parser' + +Http = HTTP + +module HTTP + class Parser + class << self + attr_reader :default_header_value_type + + def default_header_value_type=(val) + if (val != :mixed && val != :strings && val != :arrays) + raise ArgumentError, "Invalid header value type" + end + @default_header_value_type = val + end + end + end +end + +HTTP::Parser.default_header_value_type = :mixed diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/parser_spec.rb b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/parser_spec.rb new file mode 100644 index 0000000..7134476 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/parser_spec.rb @@ -0,0 +1,350 @@ +require "spec_helper" +require "json" + +describe HTTP::Parser do + before do + @parser = HTTP::Parser.new + + @headers = nil + @body = "" + @started = false + @done = false + + @parser.on_message_begin = proc{ @started = true } + @parser.on_headers_complete = proc { |e| @headers = e } + @parser.on_body = proc { |chunk| @body << chunk } + @parser.on_message_complete = proc{ @done = true } + end + + it "should have initial state" do + @parser.headers.should be_nil + + @parser.http_version.should be_nil + @parser.http_method.should be_nil + @parser.status_code.should be_nil + + @parser.request_url.should be_nil + + @parser.header_value_type.should == :mixed + end + + it "should allow us to set the header value type" do + [:mixed, :arrays, :strings].each do |type| + @parser.header_value_type = type + @parser.header_value_type.should == type + + parser_tmp = HTTP::Parser.new(nil, type) + parser_tmp.header_value_type.should == type + end + end + + it "should allow us to set the default header value type" do + [:mixed, :arrays, :strings].each do |type| + HTTP::Parser.default_header_value_type = type + + parser = HTTP::Parser.new + parser.header_value_type.should == type + end + end + + it "should throw an Argument Error if header value type is invalid" do + proc{ @parser.header_value_type = 'bob' }.should raise_error(ArgumentError) + end + + it "should throw an Argument Error if default header value type is invalid" do + proc{ HTTP::Parser.default_header_value_type = 'bob' }.should raise_error(ArgumentError) + end + + it "should implement basic api" do + @parser << + "GET /test?ok=1 HTTP/1.1\r\n" + + "User-Agent: curl/7.18.0\r\n" + + "Host: 0.0.0.0:5000\r\n" + + "Accept: */*\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "World" + + @started.should be_true + @done.should be_true + + @parser.http_major.should == 1 + @parser.http_minor.should == 1 + @parser.http_version.should == [1,1] + @parser.http_method.should == 'GET' + @parser.status_code.should be_nil + + @parser.request_url.should == '/test?ok=1' + + @parser.headers.should == @headers + @parser.headers['User-Agent'].should == 'curl/7.18.0' + @parser.headers['Host'].should == '0.0.0.0:5000' + + @body.should == "World" + end + + it "should raise errors on invalid data" do + proc{ @parser << "BLAH" }.should raise_error(HTTP::Parser::Error) + end + + it "should abort parser via callback" do + @parser.on_headers_complete = proc { |e| @headers = e; :stop } + + data = + "GET / HTTP/1.0\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "World" + + bytes = @parser << data + + bytes.should == 37 + data[bytes..-1].should == 'World' + + @headers.should == {'Content-Length' => '5'} + @body.should be_empty + @done.should be_false + end + + it "should reset to initial state" do + @parser << "GET / HTTP/1.0\r\n\r\n" + + @parser.http_method.should == 'GET' + @parser.http_version.should == [1,0] + + @parser.request_url.should == '/' + + @parser.reset!.should be_true + + @parser.http_version.should be_nil + @parser.http_method.should be_nil + @parser.status_code.should be_nil + + @parser.request_url.should be_nil + end + + it "should optionally reset parser state on no-body responses" do + @parser.reset!.should be_true + + @head, @complete = 0, 0 + @parser.on_headers_complete = proc {|h| @head += 1; :reset } + @parser.on_message_complete = proc { @complete += 1 } + @parser.on_body = proc {|b| fail } + + head_response = "HTTP/1.1 200 OK\r\nContent-Length:10\r\n\r\n" + + @parser << head_response + @head.should == 1 + @complete.should == 1 + + @parser << head_response + @head.should == 2 + @complete.should == 2 + end + + it "should retain callbacks after reset" do + @parser.reset!.should be_true + + @parser << "GET / HTTP/1.0\r\n\r\n" + @started.should be_true + @headers.should == {} + @done.should be_true + end + + it "should parse headers incrementally" do + request = + "GET / HTTP/1.0\r\n" + + "Header1: value 1\r\n" + + "Header2: value 2\r\n" + + "\r\n" + + while chunk = request.slice!(0,2) and !chunk.empty? + @parser << chunk + end + + @parser.headers.should == { + 'Header1' => 'value 1', + 'Header2' => 'value 2' + } + end + + it "should handle multiple headers using strings" do + @parser.header_value_type = :strings + + @parser << + "GET / HTTP/1.0\r\n" + + "Set-Cookie: PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com\r\n" + + "Set-Cookie: NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly\r\n" + + "\r\n" + + @parser.headers["Set-Cookie"].should == "PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com, NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly" + end + + it "should handle multiple headers using strings" do + @parser.header_value_type = :arrays + + @parser << + "GET / HTTP/1.0\r\n" + + "Set-Cookie: PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com\r\n" + + "Set-Cookie: NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly\r\n" + + "\r\n" + + @parser.headers["Set-Cookie"].should == [ + "PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com", + "NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly" + ] + end + + it "should handle multiple headers using mixed" do + @parser.header_value_type = :mixed + + @parser << + "GET / HTTP/1.0\r\n" + + "Set-Cookie: PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com\r\n" + + "Set-Cookie: NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly\r\n" + + "\r\n" + + @parser.headers["Set-Cookie"].should == [ + "PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com", + "NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly" + ] + end + + it "should handle a single cookie using mixed" do + @parser.header_value_type = :mixed + + @parser << + "GET / HTTP/1.0\r\n" + + "Set-Cookie: PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com\r\n" + + "\r\n" + + @parser.headers["Set-Cookie"].should == "PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com" + end + + it "should support alternative api" do + callbacks = double('callbacks') + callbacks.stub(:on_message_begin){ @started = true } + callbacks.stub(:on_headers_complete){ |e| @headers = e } + callbacks.stub(:on_body){ |chunk| @body << chunk } + callbacks.stub(:on_message_complete){ @done = true } + + @parser = HTTP::Parser.new(callbacks) + @parser << "GET / HTTP/1.0\r\n\r\n" + + @started.should be_true + @headers.should == {} + @body.should == '' + @done.should be_true + end + + it "should ignore extra content beyond specified length" do + @parser << + "GET / HTTP/1.0\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "hello" + + " \n" + + @body.should == 'hello' + @done.should be_true + end + + it 'sets upgrade_data if available' do + @parser << + "GET /demo HTTP/1.1\r\n" + + "Connection: Upgrade\r\n" + + "Upgrade: WebSocket\r\n\r\n" + + "third key data" + + @parser.upgrade?.should be_true + @parser.upgrade_data.should == 'third key data' + end + + it 'sets upgrade_data to blank if un-available' do + @parser << + "GET /demo HTTP/1.1\r\n" + + "Connection: Upgrade\r\n" + + "Upgrade: WebSocket\r\n\r\n" + + @parser.upgrade?.should be_true + @parser.upgrade_data.should == '' + end + + it 'should stop parsing headers when instructed' do + request = "GET /websocket HTTP/1.1\r\n" + + "host: localhost\r\n" + + "connection: Upgrade\r\n" + + "upgrade: websocket\r\n" + + "sec-websocket-key: SD6/hpYbKjQ6Sown7pBbWQ==\r\n" + + "sec-websocket-version: 13\r\n" + + "\r\n" + + @parser.on_headers_complete = proc { |e| :stop } + offset = (@parser << request) + @parser.upgrade?.should be_true + @parser.upgrade_data.should == '' + offset.should == request.length + end + + it "should execute on_body on requests with no content-length" do + @parser.reset!.should be_true + + @head, @complete, @body = 0, 0, 0 + @parser.on_headers_complete = proc {|h| @head += 1 } + @parser.on_message_complete = proc { @complete += 1 } + @parser.on_body = proc {|b| @body += 1 } + + head_response = "HTTP/1.1 200 OK\r\n\r\nstuff" + + @parser << head_response + @parser << '' + @head.should == 1 + @complete.should == 1 + @body.should == 1 + end + + + %w[ request response ].each do |type| + JSON.parse(File.read(File.expand_path("../support/#{type}s.json", __FILE__))).each do |test| + test['headers'] ||= {} + next if !defined?(JRUBY_VERSION) and HTTP::Parser.strict? != test['strict'] + + it "should parse #{type}: #{test['name']}" do + @parser << test['raw'] + + @parser.http_method.should == test['method'] + @parser.keep_alive?.should == test['should_keep_alive'] + + if test.has_key?('upgrade') and test['upgrade'] != 0 + @parser.upgrade?.should be_true + @parser.upgrade_data.should == test['upgrade'] + end + + fields = %w[ + http_major + http_minor + ] + + if test['type'] == 'HTTP_REQUEST' + fields += %w[ + request_url + ] + else + fields += %w[ + status_code + ] + end + + fields.each do |field| + @parser.send(field).should == test[field] + end + + @headers.size.should == test['num_headers'] + @headers.should == test['headers'] + + @body.should == test['body'] + @body.size.should == test['body_size'] if test['body_size'] + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/spec_helper.rb b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/spec_helper.rb new file mode 100644 index 0000000..a4295f9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/spec_helper.rb @@ -0,0 +1 @@ +require "http_parser" diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/support/requests.json b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/support/requests.json new file mode 100644 index 0000000..dbb6e98 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/support/requests.json @@ -0,0 +1,612 @@ +[ + { + "name": "curl get", + "type": "HTTP_REQUEST", + "raw": "GET /test HTTP/1.1\r\nUser-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\nHost: 0.0.0.0=5000\r\nAccept: */*\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/test", + "request_url": "/test", + "num_headers": 3, + "headers": { + "User-Agent": "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1", + "Host": "0.0.0.0=5000", + "Accept": "*/*" + }, + "body": "", + "strict": true + }, + { + "name": "firefox get", + "type": "HTTP_REQUEST", + "raw": "GET /favicon.ico HTTP/1.1\r\nHost: 0.0.0.0=5000\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/favicon.ico", + "request_url": "/favicon.ico", + "num_headers": 8, + "headers": { + "Host": "0.0.0.0=5000", + "User-Agent": "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-us,en;q=0.5", + "Accept-Encoding": "gzip,deflate", + "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", + "Keep-Alive": "300", + "Connection": "keep-alive" + }, + "body": "", + "strict": true + }, + { + "name": "dumbfuck", + "type": "HTTP_REQUEST", + "raw": "GET /dumbfuck HTTP/1.1\r\naaaaaaaaaaaaa:++++++++++\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/dumbfuck", + "request_url": "/dumbfuck", + "num_headers": 1, + "headers": { + "aaaaaaaaaaaaa": "++++++++++" + }, + "body": "", + "strict": true + }, + { + "name": "fragment in url", + "type": "HTTP_REQUEST", + "raw": "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "page=1", + "fragment": "posts-17408", + "request_path": "/forums/1/topics/2375", + "request_url": "/forums/1/topics/2375?page=1#posts-17408", + "num_headers": 0, + "body": "", + "strict": true + }, + { + "name": "get no headers no body", + "type": "HTTP_REQUEST", + "raw": "GET /get_no_headers_no_body/world HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/get_no_headers_no_body/world", + "request_url": "/get_no_headers_no_body/world", + "num_headers": 0, + "body": "", + "strict": true + }, + { + "name": "get one header no body", + "type": "HTTP_REQUEST", + "raw": "GET /get_one_header_no_body HTTP/1.1\r\nAccept: */*\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/get_one_header_no_body", + "request_url": "/get_one_header_no_body", + "num_headers": 1, + "headers": { + "Accept": "*/*" + }, + "body": "", + "strict": true + }, + { + "name": "get funky content length body hello", + "type": "HTTP_REQUEST", + "raw": "GET /get_funky_content_length_body_hello HTTP/1.0\r\nconTENT-Length: 5\r\n\r\nHELLO", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/get_funky_content_length_body_hello", + "request_url": "/get_funky_content_length_body_hello", + "num_headers": 1, + "headers": { + "conTENT-Length": "5" + }, + "body": "HELLO", + "strict": true + }, + { + "name": "post identity body world", + "type": "HTTP_REQUEST", + "raw": "POST /post_identity_body_world?q=search#hey HTTP/1.1\r\nAccept: */*\r\nTransfer-Encoding: identity\r\nContent-Length: 5\r\n\r\nWorld", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "POST", + "query_string": "q=search", + "fragment": "hey", + "request_path": "/post_identity_body_world", + "request_url": "/post_identity_body_world?q=search#hey", + "num_headers": 3, + "headers": { + "Accept": "*/*", + "Transfer-Encoding": "identity", + "Content-Length": "5" + }, + "body": "World", + "strict": true + }, + { + "name": "post - chunked body: all your base are belong to us", + "type": "HTTP_REQUEST", + "raw": "POST /post_chunked_all_your_base HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n1e\r\nall your base are belong to us\r\n0\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "POST", + "query_string": "", + "fragment": "", + "request_path": "/post_chunked_all_your_base", + "request_url": "/post_chunked_all_your_base", + "num_headers": 1, + "headers": { + "Transfer-Encoding": "chunked" + }, + "body": "all your base are belong to us", + "strict": true + }, + { + "name": "two chunks ; triple zero ending", + "type": "HTTP_REQUEST", + "raw": "POST /two_chunks_mult_zero_end HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n6\r\n world\r\n000\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "POST", + "query_string": "", + "fragment": "", + "request_path": "/two_chunks_mult_zero_end", + "request_url": "/two_chunks_mult_zero_end", + "num_headers": 1, + "headers": { + "Transfer-Encoding": "chunked" + }, + "body": "hello world", + "strict": true + }, + { + "name": "chunked with trailing headers. blech.", + "type": "HTTP_REQUEST", + "raw": "POST /chunked_w_trailing_headers HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n6\r\n world\r\n0\r\nVary: *\r\nContent-Type: text/plain\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "POST", + "query_string": "", + "fragment": "", + "request_path": "/chunked_w_trailing_headers", + "request_url": "/chunked_w_trailing_headers", + "num_headers": 3, + "headers": { + "Transfer-Encoding": "chunked", + "Vary": "*", + "Content-Type": "text/plain" + }, + "body": "hello world", + "strict": true + }, + { + "name": "with bullshit after the length", + "type": "HTTP_REQUEST", + "raw": "POST /chunked_w_bullshit_after_length HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5; ihatew3;whatthefuck=aretheseparametersfor\r\nhello\r\n6; blahblah; blah\r\n world\r\n0\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "POST", + "query_string": "", + "fragment": "", + "request_path": "/chunked_w_bullshit_after_length", + "request_url": "/chunked_w_bullshit_after_length", + "num_headers": 1, + "headers": { + "Transfer-Encoding": "chunked" + }, + "body": "hello world", + "strict": true + }, + { + "name": "with quotes", + "type": "HTTP_REQUEST", + "raw": "GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "foo=\"bar\"", + "fragment": "", + "request_path": "/with_\"stupid\"_quotes", + "request_url": "/with_\"stupid\"_quotes?foo=\"bar\"", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "apachebench get", + "type": "HTTP_REQUEST", + "raw": "GET /test HTTP/1.0\r\nHost: 0.0.0.0:5000\r\nUser-Agent: ApacheBench/2.3\r\nAccept: */*\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/test", + "request_url": "/test", + "num_headers": 3, + "headers": { + "Host": "0.0.0.0:5000", + "User-Agent": "ApacheBench/2.3", + "Accept": "*/*" + }, + "body": "", + "strict": true + }, + { + "name": "query url with question mark", + "type": "HTTP_REQUEST", + "raw": "GET /test.cgi?foo=bar?baz HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "foo=bar?baz", + "fragment": "", + "request_path": "/test.cgi", + "request_url": "/test.cgi?foo=bar?baz", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "newline prefix get", + "type": "HTTP_REQUEST", + "raw": "\r\nGET /test HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/test", + "request_url": "/test", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "upgrade request", + "type": "HTTP_REQUEST", + "raw": "GET /demo HTTP/1.1\r\nHost: example.com\r\nConnection: Upgrade\r\nSec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\nSec-WebSocket-Protocol: sample\r\nUpgrade: WebSocket\r\nSec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\nOrigin: http://example.com\r\n\r\nHot diggity dogg", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/demo", + "request_url": "/demo", + "num_headers": 7, + "upgrade": "Hot diggity dogg", + "headers": { + "Host": "example.com", + "Connection": "Upgrade", + "Sec-WebSocket-Key2": "12998 5 Y3 1 .P00", + "Sec-WebSocket-Protocol": "sample", + "Upgrade": "WebSocket", + "Sec-WebSocket-Key1": "4 @1 46546xW%0l 1 5", + "Origin": "http://example.com" + }, + "body": "", + "strict": true + }, + { + "name": "connect request", + "type": "HTTP_REQUEST", + "raw": "CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\nsome data\r\nand yet even more data", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "method": "CONNECT", + "query_string": "", + "fragment": "", + "request_path": "", + "request_url": "0-home0.netscape.com:443", + "num_headers": 2, + "upgrade": "some data\r\nand yet even more data", + "headers": { + "User-agent": "Mozilla/1.1N", + "Proxy-authorization": "basic aGVsbG86d29ybGQ=" + }, + "body": "", + "strict": true + }, + { + "name": "report request", + "type": "HTTP_REQUEST", + "raw": "REPORT /test HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "REPORT", + "query_string": "", + "fragment": "", + "request_path": "/test", + "request_url": "/test", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "request with no http version", + "type": "HTTP_REQUEST", + "raw": "GET /\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 0, + "http_minor": 9, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/", + "request_url": "/", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "m-search request", + "type": "HTTP_REQUEST", + "raw": "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nST: \"ssdp:all\"\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "M-SEARCH", + "query_string": "", + "fragment": "", + "request_path": "*", + "request_url": "*", + "num_headers": 3, + "headers": { + "HOST": "239.255.255.250:1900", + "MAN": "\"ssdp:discover\"", + "ST": "\"ssdp:all\"" + }, + "body": "", + "strict": true + }, + { + "name": "line folding in header value", + "type": "HTTP_REQUEST", + "raw": "GET / HTTP/1.1\r\nLine1: abc\r\n\tdef\r\n ghi\r\n\t\tjkl\r\n mno \r\n\t \tqrs\r\nLine2: \t line2\t\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/", + "request_url": "/", + "num_headers": 2, + "headers": { + "Line1": "abcdefghijklmno qrs", + "Line2": "line2\t" + }, + "body": "", + "strict": true + }, + { + "name": "host terminated by a query string", + "type": "HTTP_REQUEST", + "raw": "GET http://hypnotoad.org?hail=all HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "hail=all", + "fragment": "", + "request_path": "", + "request_url": "http://hypnotoad.org?hail=all", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "host:port terminated by a query string", + "type": "HTTP_REQUEST", + "raw": "GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "hail=all", + "fragment": "", + "request_path": "", + "request_url": "http://hypnotoad.org:1234?hail=all", + "port": 1234, + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "host:port terminated by a space", + "type": "HTTP_REQUEST", + "raw": "GET http://hypnotoad.org:1234 HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "", + "request_url": "http://hypnotoad.org:1234", + "port": 1234, + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "PATCH request", + "type": "HTTP_REQUEST", + "raw": "PATCH /file.txt HTTP/1.1\r\nHost: www.example.com\r\nContent-Type: application/example\r\nIf-Match: \"e0023aa4e\"\r\nContent-Length: 10\r\n\r\ncccccccccc", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "PATCH", + "query_string": "", + "fragment": "", + "request_path": "/file.txt", + "request_url": "/file.txt", + "num_headers": 4, + "headers": { + "Host": "www.example.com", + "Content-Type": "application/example", + "If-Match": "\"e0023aa4e\"", + "Content-Length": "10" + }, + "body": "cccccccccc", + "strict": true + }, + { + "name": "connect caps request", + "type": "HTTP_REQUEST", + "raw": "CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "method": "CONNECT", + "query_string": "", + "fragment": "", + "request_path": "", + "request_url": "HOME0.NETSCAPE.COM:443", + "num_headers": 2, + "upgrade": "", + "headers": { + "User-agent": "Mozilla/1.1N", + "Proxy-authorization": "basic aGVsbG86d29ybGQ=" + }, + "body": "", + "strict": true + }, + { + "name": "utf-8 path request", + "type": "HTTP_REQUEST", + "strict": false, + "raw": "GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\nHost: github.com\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "q=1", + "fragment": "narf", + "request_path": "/δ¶/δt/pope", + "request_url": "/δ¶/δt/pope?q=1#narf", + "num_headers": 1, + "headers": { + "Host": "github.com" + }, + "body": "" + }, + { + "name": "hostname underscore", + "type": "HTTP_REQUEST", + "strict": false, + "raw": "CONNECT home_0.netscape.com:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "method": "CONNECT", + "query_string": "", + "fragment": "", + "request_path": "", + "request_url": "home_0.netscape.com:443", + "num_headers": 2, + "upgrade": "", + "headers": { + "User-agent": "Mozilla/1.1N", + "Proxy-authorization": "basic aGVsbG86d29ybGQ=" + }, + "body": "" + } +] \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/support/responses.json b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/support/responses.json new file mode 100644 index 0000000..6dde20b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/spec/support/responses.json @@ -0,0 +1,375 @@ +[ + { + "name": "google 301", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.google.com/\r\nContent-Type: text/html; charset=UTF-8\r\nDate: Sun, 26 Apr 2009 11:11:49 GMT\r\nExpires: Tue, 26 May 2009 11:11:49 GMT\r\nX-$PrototypeBI-Version: 1.6.0.3\r\nCache-Control: public, max-age=2592000\r\nServer: gws\r\nContent-Length: 219 \r\n\r\n\n301 Moved\n

      301 Moved

      \nThe document has moved\nhere.\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 301, + "num_headers": 8, + "headers": { + "Location": "http://www.google.com/", + "Content-Type": "text/html; charset=UTF-8", + "Date": "Sun, 26 Apr 2009 11:11:49 GMT", + "Expires": "Tue, 26 May 2009 11:11:49 GMT", + "X-$PrototypeBI-Version": "1.6.0.3", + "Cache-Control": "public, max-age=2592000", + "Server": "gws", + "Content-Length": "219 " + }, + "body": "\n301 Moved\n

      301 Moved

      \nThe document has moved\nhere.\r\n\r\n", + "strict": true + }, + { + "name": "no content-length response", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nDate: Tue, 04 Aug 2009 07:59:32 GMT\r\nServer: Apache\r\nX-Powered-By: Servlet/2.5 JSP/2.1\r\nContent-Type: text/xml; charset=utf-8\r\nConnection: close\r\n\r\n\n\n \n \n SOAP-ENV:Client\n Client Error\n \n \n", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 5, + "headers": { + "Date": "Tue, 04 Aug 2009 07:59:32 GMT", + "Server": "Apache", + "X-Powered-By": "Servlet/2.5 JSP/2.1", + "Content-Type": "text/xml; charset=utf-8", + "Connection": "close" + }, + "body": "\n\n \n \n SOAP-ENV:Client\n Client Error\n \n \n", + "strict": true + }, + { + "name": "404 no headers no body", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 404 Not Found\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 404, + "num_headers": 0, + "headers": { + + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "301 no response phrase", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 301\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 301, + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "200 trailing space on chunked body", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n25 \r\nThis is the data in the first chunk\r\n\r\n1C\r\nand this is the second one\r\n\r\n0 \r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 2, + "headers": { + "Content-Type": "text/plain", + "Transfer-Encoding": "chunked" + }, + "body_size": 65, + "body": "This is the data in the first chunk\r\nand this is the second one\r\n", + "strict": true + }, + { + "name": "no carriage ret", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\nContent-Type: text/html; charset=utf-8\nConnection: close\n\nthese headers are from http://news.ycombinator.com/", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 2, + "headers": { + "Content-Type": "text/html; charset=utf-8", + "Connection": "close" + }, + "body": "these headers are from http://news.ycombinator.com/", + "strict": true + }, + { + "name": "proxy connection", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Length: 11\r\nProxy-Connection: close\r\nDate: Thu, 31 Dec 2009 20:55:48 +0000\r\n\r\nhello world", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 4, + "headers": { + "Content-Type": "text/html; charset=UTF-8", + "Content-Length": "11", + "Proxy-Connection": "close", + "Date": "Thu, 31 Dec 2009 20:55:48 +0000" + }, + "body": "hello world", + "strict": true + }, + { + "name": "underscore header key", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nServer: DCLK-AdSvr\r\nContent-Type: text/xml\r\nContent-Length: 0\r\nDCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 4, + "headers": { + "Server": "DCLK-AdSvr", + "Content-Type": "text/xml", + "Content-Length": "0", + "DCLK_imp": "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o" + }, + "body": "", + "strict": true + }, + { + "name": "bonjourmadame.fr", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.0 301 Moved Permanently\r\nDate: Thu, 03 Jun 2010 09:56:32 GMT\r\nServer: Apache/2.2.3 (Red Hat)\r\nCache-Control: public\r\nPragma: \r\nLocation: http://www.bonjourmadame.fr/\r\nVary: Accept-Encoding\r\nContent-Length: 0\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: keep-alive\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "status_code": 301, + "num_headers": 9, + "headers": { + "Date": "Thu, 03 Jun 2010 09:56:32 GMT", + "Server": "Apache/2.2.3 (Red Hat)", + "Cache-Control": "public", + "Pragma": "", + "Location": "http://www.bonjourmadame.fr/", + "Vary": "Accept-Encoding", + "Content-Length": "0", + "Content-Type": "text/html; charset=UTF-8", + "Connection": "keep-alive" + }, + "body": "", + "strict": true + }, + { + "name": "field underscore", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nDate: Tue, 28 Sep 2010 01:14:13 GMT\r\nServer: Apache\r\nCache-Control: no-cache, must-revalidate\r\nExpires: Mon, 26 Jul 1997 05:00:00 GMT\r\n.et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\nVary: Accept-Encoding\r\n_eep-Alive: timeout=45\r\n_onnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n0\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 11, + "headers": { + "Date": "Tue, 28 Sep 2010 01:14:13 GMT", + "Server": "Apache", + "Cache-Control": "no-cache, must-revalidate", + "Expires": "Mon, 26 Jul 1997 05:00:00 GMT", + ".et-Cookie": "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com", + "Vary": "Accept-Encoding", + "_eep-Alive": "timeout=45", + "_onnection": "Keep-Alive", + "Transfer-Encoding": "chunked", + "Content-Type": "text/html", + "Connection": "close" + }, + "body": "", + "strict": true + }, + { + "name": "non-ASCII in status line", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 500 Oriëntatieprobleem\r\nDate: Fri, 5 Nov 2010 23:07:12 GMT+2\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 500, + "num_headers": 3, + "headers": { + "Date": "Fri, 5 Nov 2010 23:07:12 GMT+2", + "Content-Length": "0", + "Connection": "close" + }, + "body": "", + "strict": true + }, + { + "name": "http version 0.9", + "type": "HTTP_RESPONSE", + "raw": "HTTP/0.9 200 OK\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 0, + "http_minor": 9, + "status_code": 200, + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "neither content-length nor transfer-encoding response", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nhello world", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 1, + "headers": { + "Content-Type": "text/plain" + }, + "body": "hello world", + "strict": true + }, + { + "name": "HTTP/1.0 with keep-alive and EOF-terminated 200 status", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.0 200 OK\r\nConnection: keep-alive\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 0, + "status_code": 200, + "num_headers": 1, + "headers": { + "Connection": "keep-alive" + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "HTTP/1.0 with keep-alive and a 204 status", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.0 204 No content\r\nConnection: keep-alive\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "status_code": 204, + "num_headers": 1, + "headers": { + "Connection": "keep-alive" + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "HTTP/1.1 with an EOF-terminated 200 status", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 0, + "headers": { + + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "HTTP/1.1 with a 204 status", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 204 No content\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 204, + "num_headers": 0, + "headers": { + + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "HTTP/1.1 with a 204 status and keep-alive disabled", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 204 No content\r\nConnection: close\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 204, + "num_headers": 1, + "headers": { + "Connection": "close" + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "HTTP/1.1 with chunked endocing and a 200 response", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 1, + "headers": { + "Transfer-Encoding": "chunked" + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "field space", + "type": "HTTP_RESPONSE", + "strict": false, + "raw": "HTTP/1.1 200 OK\r\nServer: Microsoft-IIS/6.0\r\nX-Powered-By: ASP.NET\r\nen-US Content-Type: text/xml\r\nContent-Type: text/xml\r\nContent-Length: 16\r\nDate: Fri, 23 Jul 2010 18:45:38 GMT\r\nConnection: keep-alive\r\n\r\nhello", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 7, + "headers": { + "Server": "Microsoft-IIS/6.0", + "X-Powered-By": "ASP.NET", + "en-US Content-Type": "text/xml", + "Content-Type": "text/xml", + "Content-Length": "16", + "Date": "Fri, 23 Jul 2010 18:45:38 GMT", + "Connection": "keep-alive" + }, + "body": "hello" + } +] \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/compile.rake b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/compile.rake new file mode 100644 index 0000000..22d6f6d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/compile.rake @@ -0,0 +1,42 @@ +require 'rubygems/package_task' +require 'rake/extensiontask' +require 'rake/javaextensiontask' + +def gemspec + @clean_gemspec ||= eval(File.read(File.expand_path('../../http_parser.rb.gemspec', __FILE__))) +end + +Gem::PackageTask.new(gemspec) do |pkg| +end + +if RUBY_PLATFORM =~ /java/ + Rake::JavaExtensionTask.new("ruby_http_parser", gemspec) do |ext| + ext.classpath = File.expand_path('../../ext/ruby_http_parser/vendor/http-parser-java/ext/primitives.jar', __FILE__) + end +else + Rake::ExtensionTask.new("ruby_http_parser", gemspec) do |ext| + unless RUBY_PLATFORM =~ /mswin|mingw/ + ext.cross_compile = true + ext.cross_platform = ['x86-mingw32', 'x86-mswin32-60'] + + # inject 1.8/1.9 pure-ruby entry point + ext.cross_compiling do |spec| + spec.files += ['lib/ruby_http_parser.rb'] + end + end + end +end + +file 'lib/ruby_http_parser.rb' do |t| + File.open(t.name, 'wb') do |f| + f.write <<-eoruby +RUBY_VERSION =~ /(\\d+.\\d+)/ +require "\#{$1}/ruby_http_parser" + eoruby + end + at_exit{ FileUtils.rm t.name if File.exists?(t.name) } +end + +if Rake::Task.task_defined?(:cross) + task :cross => 'lib/ruby_http_parser.rb' +end diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/fixtures.rake b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/fixtures.rake new file mode 100644 index 0000000..b5d36ef --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/fixtures.rake @@ -0,0 +1,71 @@ +desc "Generate test fixtures" +task :fixtures => :submodules do + require 'yajl' + data = File.read File.expand_path('../../ext/ruby_http_parser/vendor/http-parser/test.c', __FILE__) + + %w[ requests responses ].each do |type| + # find test definitions in between requests/responses[]= and .name=NULL + tmp = data[/#{type}\[\]\s*=(.+?),\s*\{\s*\.name=\s*NULL/m, 1] + + # replace first { with a [ (parsing an array of test cases) + tmp.sub!('{','[') + + # replace booleans + tmp.gsub!('TRUE', 'true') + tmp.gsub!('FALSE', 'false') + + # mark strict mode tests + tmp.gsub!(%r|#if\s+!HTTP_PARSER_STRICT(.+?)#endif\s*/\*\s*!HTTP_PARSER_STRICT.+\n|m){ + $1.gsub(/^(.+,\.type= .+)$/, "\\1\n, .strict= false") + } + + # remove macros and comments + tmp.gsub!(/^#(if|elif|endif|define).+$/,'') + tmp.gsub!(/\/\*(.+?)\*\/$/,'') + + # HTTP_* enums become strings + tmp.gsub!(/(= )(HTTP_\w+)/){ + "#{$1}#{$2.sub('MSEARCH','M-SEARCH').dump}" + } + + # join multiline strings for body and raw data + tmp.gsub!(/((body|raw)\s*=)(.+?)(\n\s+[\},])/m){ + before, after = $1, $4 + raw = $3.split("\n").map{ |l| l.strip[1..-2] }.join('') + "#{before} \"#{raw}\" #{after}" + } + + # make headers an array of array tuples + tmp.gsub!(/(\.headers\s*=)(.+?)(\s*,\.)/m){ + before, after = $1, $3 + raw = $2.gsub('{', '[').gsub('}', ']') + "#{before} #{raw} #{after}" + } + + # .name= becomes "name": + tmp.gsub!(/^(.{2,5})\.(\w+)\s*=/){ + "#{$1}#{$2.dump}: " + } + + # evaluate addition expressions + tmp.gsub!(/(body_size\":\s*)(\d+)\+(\d+)/){ + "#{$1}#{$2.to_i+$3.to_i}" + } + + # end result array + tmp << ']' + + # normalize data + results = Yajl.load(tmp, :symbolize_keys => true) + results.map{ |res| + res[:headers] and res[:headers] = Hash[*res[:headers].flatten] + res[:method] and res[:method].gsub!(/^HTTP_/, '') + res[:strict] = true unless res.has_key?(:strict) + } + + # write to a file + File.open("spec/support/#{type}.json", 'w'){ |f| + f.write Yajl.dump(results, :pretty => true) + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/spec.rake b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/spec.rake new file mode 100644 index 0000000..8f5d9ea --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/spec.rake @@ -0,0 +1,5 @@ +require "rspec/core/rake_task" + +RSpec::Core::RakeTask.new do |t| + t.rspec_opts = %w(-fs -c) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/submodules.rake b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/submodules.rake new file mode 100644 index 0000000..d978e9f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/http_parser.rb-0.6.0/tasks/submodules.rake @@ -0,0 +1,7 @@ +desc "Fetch upstream submodules" +task :submodules do + if Dir['ext/ruby_http_parser/vendor/http-parser/*'].empty? + sh 'git submodule init' + sh 'git submodule update' + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/MIT-LICENSE b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/MIT-LICENSE new file mode 100644 index 0000000..ed8e9ee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2008 The Ruby I18n team + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/README.md b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/README.md new file mode 100644 index 0000000..12b8ada --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/README.md @@ -0,0 +1,84 @@ +# Ruby I18n + +[![Build Status](https://api.travis-ci.org/svenfuchs/i18n.svg?branch=master)](https://travis-ci.org/svenfuchs/i18n) + +Ruby Internationalization and localization solution. + +[See the Rails Guide](http://guides.rubyonrails.org/i18n.html) for an example of its usage. (Note: This library can be used independently from Rails.) + +Features: + +* translation and localization +* interpolation of values to translations (Ruby 1.9 compatible syntax) +* pluralization (CLDR compatible) +* customizable transliteration to ASCII +* flexible defaults +* bulk lookup +* lambdas as translation data +* custom key/scope separator +* custom exception handlers +* extensible architecture with a swappable backend + +Pluggable features: + +* Cache +* Pluralization: lambda pluralizers stored as translation data +* Locale fallbacks, RFC4647 compliant (optionally: RFC4646 locale validation) +* [Gettext support](https://github.com/svenfuchs/i18n/wiki/Gettext) +* Translation metadata + +Alternative backends: + +* Chain +* ActiveRecord (optionally: ActiveRecord::Missing and ActiveRecord::StoreProcs) +* KeyValue (uses active_support/json and cannot store procs) + +For more information and lots of resources see [the 'Resources' page on the wiki](https://github.com/svenfuchs/i18n/wiki/Resources). + +## Installation + +``` +gem install i18n +``` + +## Tests + +You can run tests both with + +* `rake test` or just `rake` +* run any test file directly, e.g. `ruby -Ilib:test test/api/simple_test.rb` + +You can run all tests against all Gemfiles with + +* `ruby test/run_all.rb` + +The structure of the test suite is a bit unusual as it uses modules to reuse +particular tests in different test cases. + +The reason for this is that we need to enforce the I18n API across various +combinations of extensions. E.g. the Simple backend alone needs to support +the same API as any combination of feature and/or optimization modules included +to the Simple backend. We test this by reusing the same API defition (implemented +as test methods) in test cases with different setups. + +You can find the test cases that enforce the API in test/api. And you can find +the API definition test methods in test/api/tests. + +All other test cases (e.g. as defined in test/backend, test/core_ext) etc. +follow the usual test setup and should be easy to grok. + +## Authors + +* [Sven Fuchs](http://www.artweb-design.de) +* [Joshua Harvey](http://www.workingwithrails.com/person/759-joshua-harvey) +* [Stephan Soller](http://www.arkanis-development.de) +* [Saimon Moore](http://saimonmoore.net) +* [Matt Aimonetti](https://matt.aimonetti.net/) + +## Contributors + +https://github.com/svenfuchs/i18n/graphs/contributors + +## License + +MIT License. See the included MIT-LICENSE file. diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-3.2.x b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-3.2.x new file mode 100644 index 0000000..50bd10e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-3.2.x @@ -0,0 +1,9 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 3.2.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.0.x b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.0.x new file mode 100644 index 0000000..33e634b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.0.x @@ -0,0 +1,9 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 4.0.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.1.x b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.1.x new file mode 100644 index 0000000..49093b0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.1.x @@ -0,0 +1,9 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 4.1.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.2.x b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.2.x new file mode 100644 index 0000000..8d0dc30 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-4.2.x @@ -0,0 +1,9 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 4.2.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-5.0.x b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-5.0.x new file mode 100644 index 0000000..bddfa47 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-5.0.x @@ -0,0 +1,9 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 5.0.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-5.1.x b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-5.1.x new file mode 100644 index 0000000..b8b1cbf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-5.1.x @@ -0,0 +1,9 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 5.1.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-master b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-master new file mode 100644 index 0000000..0fef909 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/gemfiles/Gemfile.rails-master @@ -0,0 +1,9 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', github: 'rails/rails', branch: 'master' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n.rb new file mode 100644 index 0000000..5400883 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n.rb @@ -0,0 +1,349 @@ +require 'concurrent/map' + +require 'i18n/version' +require 'i18n/exceptions' +require 'i18n/interpolate/ruby' + +module I18n + autoload :Backend, 'i18n/backend' + autoload :Config, 'i18n/config' + autoload :Gettext, 'i18n/gettext' + autoload :Locale, 'i18n/locale' + autoload :Tests, 'i18n/tests' + autoload :Middleware, 'i18n/middleware' + + RESERVED_KEYS = [:scope, :default, :separator, :resolve, :object, :fallback, :fallback_in_progress, :format, :cascade, :throw, :raise, :deep_interpolation] + RESERVED_KEYS_PATTERN = /%\{(#{RESERVED_KEYS.join("|")})\}/ + + + def self.new_double_nested_cache # :nodoc: + Concurrent::Map.new { |h,k| h[k] = Concurrent::Map.new } + end + + module Base + # Gets I18n configuration object. + def config + Thread.current[:i18n_config] ||= I18n::Config.new + end + + # Sets I18n configuration object. + def config=(value) + Thread.current[:i18n_config] = value + end + + # Write methods which delegates to the configuration object + %w(locale backend default_locale available_locales default_separator + exception_handler load_path enforce_available_locales).each do |method| + module_eval <<-DELEGATORS, __FILE__, __LINE__ + 1 + def #{method} + config.#{method} + end + + def #{method}=(value) + config.#{method} = (value) + end + DELEGATORS + end + + # Tells the backend to reload translations. Used in situations like the + # Rails development environment. Backends can implement whatever strategy + # is useful. + def reload! + config.clear_available_locales_set + config.backend.reload! + end + + # Translates, pluralizes and interpolates a given key using a given locale, + # scope, and default, as well as interpolation values. + # + # *LOOKUP* + # + # Translation data is organized as a nested hash using the upper-level keys + # as namespaces. E.g., ActionView ships with the translation: + # :date => {:formats => {:short => "%b %d"}}. + # + # Translations can be looked up at any level of this hash using the key argument + # and the scope option. E.g., in this example I18n.t :date + # returns the whole translations hash {:formats => {:short => "%b %d"}}. + # + # Key can be either a single key or a dot-separated key (both Strings and Symbols + # work). E.g., the short format can be looked up using both: + # I18n.t 'date.formats.short' + # I18n.t :'date.formats.short' + # + # Scope can be either a single key, a dot-separated key or an array of keys + # or dot-separated keys. Keys and scopes can be combined freely. So these + # examples will all look up the same short date format: + # I18n.t 'date.formats.short' + # I18n.t 'formats.short', :scope => 'date' + # I18n.t 'short', :scope => 'date.formats' + # I18n.t 'short', :scope => %w(date formats) + # + # *INTERPOLATION* + # + # Translations can contain interpolation variables which will be replaced by + # values passed to #translate as part of the options hash, with the keys matching + # the interpolation variable names. + # + # E.g., with a translation :foo => "foo %{bar}" the option + # value for the key +bar+ will be interpolated into the translation: + # I18n.t :foo, :bar => 'baz' # => 'foo baz' + # + # *PLURALIZATION* + # + # Translation data can contain pluralized translations. Pluralized translations + # are arrays of singluar/plural versions of translations like ['Foo', 'Foos']. + # + # Note that I18n::Backend::Simple only supports an algorithm for English + # pluralization rules. Other algorithms can be supported by custom backends. + # + # This returns the singular version of a pluralized translation: + # I18n.t :foo, :count => 1 # => 'Foo' + # + # These both return the plural version of a pluralized translation: + # I18n.t :foo, :count => 0 # => 'Foos' + # I18n.t :foo, :count => 2 # => 'Foos' + # + # The :count option can be used both for pluralization and interpolation. + # E.g., with the translation + # :foo => ['%{count} foo', '%{count} foos'], count will + # be interpolated to the pluralized translation: + # I18n.t :foo, :count => 1 # => '1 foo' + # + # *DEFAULTS* + # + # This returns the translation for :foo or default if no translation was found: + # I18n.t :foo, :default => 'default' + # + # This returns the translation for :foo or the translation for :bar if no + # translation for :foo was found: + # I18n.t :foo, :default => :bar + # + # Returns the translation for :foo or the translation for :bar + # or default if no translations for :foo and :bar were found. + # I18n.t :foo, :default => [:bar, 'default'] + # + # *BULK LOOKUP* + # + # This returns an array with the translations for :foo and :bar. + # I18n.t [:foo, :bar] + # + # Can be used with dot-separated nested keys: + # I18n.t [:'baz.foo', :'baz.bar'] + # + # Which is the same as using a scope option: + # I18n.t [:foo, :bar], :scope => :baz + # + # *LAMBDAS* + # + # Both translations and defaults can be given as Ruby lambdas. Lambdas will be + # called and passed the key and options. + # + # E.g. assuming the key :salutation resolves to: + # lambda { |key, options| options[:gender] == 'm' ? "Mr. %{options[:name]}" : "Mrs. %{options[:name]}" } + # + # Then I18n.t(:salutation, :gender => 'w', :name => 'Smith') will result in "Mrs. Smith". + # + # It is recommended to use/implement lambdas in an "idempotent" way. E.g. when + # a cache layer is put in front of I18n.translate it will generate a cache key + # from the argument values passed to #translate. Therefor your lambdas should + # always return the same translations/values per unique combination of argument + # values. + def translate(*args) + options = args.last.is_a?(Hash) ? args.pop.dup : {} + key = args.shift + backend = config.backend + locale = options.delete(:locale) || config.locale + handling = options.delete(:throw) && :throw || options.delete(:raise) && :raise # TODO deprecate :raise + + enforce_available_locales!(locale) + raise I18n::ArgumentError if key.is_a?(String) && key.empty? + + result = catch(:exception) do + if key.is_a?(Array) + key.map { |k| backend.translate(locale, k, options) } + else + backend.translate(locale, key, options) + end + end + result.is_a?(MissingTranslation) ? handle_exception(handling, result, locale, key, options) : result + end + alias :t :translate + + # Wrapper for translate that adds :raise => true. With + # this option, if no translation is found, it will raise I18n::MissingTranslationData + def translate!(key, options={}) + translate(key, options.merge(:raise => true)) + end + alias :t! :translate! + + # Returns true if a translation exists for a given key, otherwise returns false. + def exists?(key, locale = config.locale) + raise I18n::ArgumentError if key.is_a?(String) && key.empty? + config.backend.exists?(locale, key) + end + + # Transliterates UTF-8 characters to ASCII. By default this method will + # transliterate only Latin strings to an ASCII approximation: + # + # I18n.transliterate("Ærøskøbing") + # # => "AEroskobing" + # + # I18n.transliterate("日本語") + # # => "???" + # + # It's also possible to add support for per-locale transliterations. I18n + # expects transliteration rules to be stored at + # i18n.transliterate.rule. + # + # Transliteration rules can either be a Hash or a Proc. Procs must accept a + # single string argument. Hash rules inherit the default transliteration + # rules, while Procs do not. + # + # *Examples* + # + # Setting a Hash in .yml: + # + # i18n: + # transliterate: + # rule: + # ü: "ue" + # ö: "oe" + # + # Setting a Hash using Ruby: + # + # store_translations(:de, :i18n => { + # :transliterate => { + # :rule => { + # "ü" => "ue", + # "ö" => "oe" + # } + # } + # ) + # + # Setting a Proc: + # + # translit = lambda {|string| MyTransliterator.transliterate(string) } + # store_translations(:xx, :i18n => {:transliterate => {:rule => translit}) + # + # Transliterating strings: + # + # I18n.locale = :en + # I18n.transliterate("Jürgen") # => "Jurgen" + # I18n.locale = :de + # I18n.transliterate("Jürgen") # => "Juergen" + # I18n.transliterate("Jürgen", :locale => :en) # => "Jurgen" + # I18n.transliterate("Jürgen", :locale => :de) # => "Juergen" + def transliterate(*args) + options = args.pop.dup if args.last.is_a?(Hash) + key = args.shift + locale = options && options.delete(:locale) || config.locale + handling = options && (options.delete(:throw) && :throw || options.delete(:raise) && :raise) + replacement = options && options.delete(:replacement) + enforce_available_locales!(locale) + config.backend.transliterate(locale, key, replacement) + rescue I18n::ArgumentError => exception + handle_exception(handling, exception, locale, key, options || {}) + end + + # Localizes certain objects, such as dates and numbers to local formatting. + def localize(object, options = nil) + options = options ? options.dup : {} + locale = options.delete(:locale) || config.locale + format = options.delete(:format) || :default + enforce_available_locales!(locale) + config.backend.localize(locale, object, format, options) + end + alias :l :localize + + # Executes block with given I18n.locale set. + def with_locale(tmp_locale = nil) + if tmp_locale + current_locale = self.locale + self.locale = tmp_locale + end + yield + ensure + self.locale = current_locale if tmp_locale + end + + # Merges the given locale, key and scope into a single array of keys. + # Splits keys that contain dots into multiple keys. Makes sure all + # keys are Symbols. + def normalize_keys(locale, key, scope, separator = nil) + separator ||= I18n.default_separator + + keys = [] + keys.concat normalize_key(locale, separator) + keys.concat normalize_key(scope, separator) + keys.concat normalize_key(key, separator) + keys + end + + # Returns true when the passed locale, which can be either a String or a + # Symbol, is in the list of available locales. Returns false otherwise. + def locale_available?(locale) + I18n.config.available_locales_set.include?(locale) + end + + # Raises an InvalidLocale exception when the passed locale is not available. + def enforce_available_locales!(locale) + if config.enforce_available_locales + raise I18n::InvalidLocale.new(locale) if !locale_available?(locale) + end + end + + private + + # Any exceptions thrown in translate will be sent to the @@exception_handler + # which can be a Symbol, a Proc or any other Object unless they're forced to + # be raised or thrown (MissingTranslation). + # + # If exception_handler is a Symbol then it will simply be sent to I18n as + # a method call. A Proc will simply be called. In any other case the + # method #call will be called on the exception_handler object. + # + # Examples: + # + # I18n.exception_handler = :custom_exception_handler # this is the default + # I18n.custom_exception_handler(exception, locale, key, options) # will be called like this + # + # I18n.exception_handler = lambda { |*args| ... } # a lambda + # I18n.exception_handler.call(exception, locale, key, options) # will be called like this + # + # I18n.exception_handler = I18nExceptionHandler.new # an object + # I18n.exception_handler.call(exception, locale, key, options) # will be called like this + def handle_exception(handling, exception, locale, key, options) + case handling + when :raise + raise exception.respond_to?(:to_exception) ? exception.to_exception : exception + when :throw + throw :exception, exception + else + case handler = options[:exception_handler] || config.exception_handler + when Symbol + send(handler, exception, locale, key, options) + else + handler.call(exception, locale, key, options) + end + end + end + + @@normalized_key_cache = I18n.new_double_nested_cache + + def normalize_key(key, separator) + @@normalized_key_cache[separator][key] ||= + case key + when Array + key.map { |k| normalize_key(k, separator) }.flatten + else + keys = key.to_s.split(separator) + keys.delete('') + keys.map! { |k| k.to_sym } + keys + end + end + end + + extend Base +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend.rb new file mode 100644 index 0000000..46ef054 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend.rb @@ -0,0 +1,18 @@ +module I18n + module Backend + autoload :Base, 'i18n/backend/base' + autoload :InterpolationCompiler, 'i18n/backend/interpolation_compiler' + autoload :Cache, 'i18n/backend/cache' + autoload :Cascade, 'i18n/backend/cascade' + autoload :Chain, 'i18n/backend/chain' + autoload :Fallbacks, 'i18n/backend/fallbacks' + autoload :Flatten, 'i18n/backend/flatten' + autoload :Gettext, 'i18n/backend/gettext' + autoload :KeyValue, 'i18n/backend/key_value' + autoload :Memoize, 'i18n/backend/memoize' + autoload :Metadata, 'i18n/backend/metadata' + autoload :Pluralization, 'i18n/backend/pluralization' + autoload :Simple, 'i18n/backend/simple' + autoload :Transliterator, 'i18n/backend/transliterator' + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/base.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/base.rb new file mode 100644 index 0000000..c8bb070 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/base.rb @@ -0,0 +1,230 @@ +require 'yaml' +require 'i18n/core_ext/hash' +require 'i18n/core_ext/kernel/suppress_warnings' + +module I18n + module Backend + module Base + include I18n::Backend::Transliterator + + # Accepts a list of paths to translation files. Loads translations from + # plain Ruby (*.rb) or YAML files (*.yml). See #load_rb and #load_yml + # for details. + def load_translations(*filenames) + filenames = I18n.load_path if filenames.empty? + filenames.flatten.each { |filename| load_file(filename) } + end + + # This method receives a locale, a data hash and options for storing translations. + # Should be implemented + def store_translations(locale, data, options = {}) + raise NotImplementedError + end + + def translate(locale, key, options = {}) + raise InvalidLocale.new(locale) unless locale + entry = lookup(locale, key, options[:scope], options) unless key.nil? + + if entry.nil? && options.key?(:default) + entry = default(locale, key, options[:default], options) + else + entry = resolve(locale, key, entry, options) + end + + if entry.nil? + if (options.key?(:default) && !options[:default].nil?) || !options.key?(:default) + throw(:exception, I18n::MissingTranslation.new(locale, key, options)) + end + end + + entry = entry.dup if entry.is_a?(String) + + count = options[:count] + entry = pluralize(locale, entry, count) if count + + deep_interpolation = options[:deep_interpolation] + values = options.except(*RESERVED_KEYS) + if values + entry = if deep_interpolation + deep_interpolate(locale, entry, values) + else + interpolate(locale, entry, values) + end + end + entry + end + + def exists?(locale, key) + lookup(locale, key) != nil + end + + # Acts the same as +strftime+, but uses a localized version of the + # format string. Takes a key from the date/time formats translations as + # a format argument (e.g., :short in :'date.formats'). + def localize(locale, object, format = :default, options = {}) + if object.nil? && options.include?(:default) + return options[:default] + end + raise ArgumentError, "Object must be a Date, DateTime or Time object. #{object.inspect} given." unless object.respond_to?(:strftime) + + if Symbol === format + key = format + type = object.respond_to?(:sec) ? 'time' : 'date' + options = options.merge(:raise => true, :object => object, :locale => locale) + format = I18n.t(:"#{type}.formats.#{key}", options) + end + + format = translate_localization_format(locale, object, format, options) + object.strftime(format) + end + + # Returns an array of locales for which translations are available + # ignoring the reserved translation meta data key :i18n. + def available_locales + raise NotImplementedError + end + + def reload! + end + + protected + + # The method which actually looks up for the translation in the store. + def lookup(locale, key, scope = [], options = {}) + raise NotImplementedError + end + + # Evaluates defaults. + # If given subject is an Array, it walks the array and returns the + # first translation that can be resolved. Otherwise it tries to resolve + # the translation directly. + def default(locale, object, subject, options = {}) + options = options.dup.reject { |key, value| key == :default } + case subject + when Array + subject.each do |item| + result = resolve(locale, object, item, options) and return result + end and nil + else + resolve(locale, object, subject, options) + end + end + + # Resolves a translation. + # If the given subject is a Symbol, it will be translated with the + # given options. If it is a Proc then it will be evaluated. All other + # subjects will be returned directly. + def resolve(locale, object, subject, options = {}) + return subject if options[:resolve] == false + result = catch(:exception) do + case subject + when Symbol + I18n.translate(subject, options.merge(:locale => locale, :throw => true)) + when Proc + date_or_time = options.delete(:object) || object + resolve(locale, object, subject.call(date_or_time, options)) + else + subject + end + end + result unless result.is_a?(MissingTranslation) + end + + # Picks a translation from a pluralized mnemonic subkey according to English + # pluralization rules : + # - It will pick the :one subkey if count is equal to 1. + # - It will pick the :other subkey otherwise. + # - It will pick the :zero subkey in the special case where count is + # equal to 0 and there is a :zero subkey present. This behaviour is + # not standard with regards to the CLDR pluralization rules. + # Other backends can implement more flexible or complex pluralization rules. + def pluralize(locale, entry, count) + return entry unless entry.is_a?(Hash) && count + + key = :zero if count == 0 && entry.has_key?(:zero) + key ||= count == 1 ? :one : :other + raise InvalidPluralizationData.new(entry, count, key) unless entry.has_key?(key) + entry[key] + end + + # Interpolates values into a given string. + # + # interpolate "file %{file} opened by %%{user}", :file => 'test.txt', :user => 'Mr. X' + # # => "file test.txt opened by %{user}" + def interpolate(locale, string, values = {}) + if string.is_a?(::String) && !values.empty? + I18n.interpolate(string, values) + else + string + end + end + + # Deep interpolation + # + # deep_interpolate { people: { ann: "Ann is %{ann}", john: "John is %{john}" } }, + # ann: 'good', john: 'big' + # #=> { people: { ann: "Ann is good", john: "John is big" } } + def deep_interpolate(locale, data, values = {}) + return data if values.empty? + + case data + when ::String + I18n.interpolate(data, values) + when ::Hash + data.each_with_object({}) do |(k, v), result| + result[k] = deep_interpolate(locale, v, values) + end + when ::Array + data.map do |v| + deep_interpolate(locale, v, values) + end + else + data + end + end + + # Loads a single translations file by delegating to #load_rb or + # #load_yml depending on the file extension and directly merges the + # data to the existing translations. Raises I18n::UnknownFileType + # for all other file extensions. + def load_file(filename) + type = File.extname(filename).tr('.', '').downcase + raise UnknownFileType.new(type, filename) unless respond_to?(:"load_#{type}", true) + data = send(:"load_#{type}", filename) + unless data.is_a?(Hash) + raise InvalidLocaleData.new(filename, 'expects it to return a hash, but does not') + end + data.each { |locale, d| store_translations(locale, d || {}) } + end + + # Loads a plain Ruby translations file. eval'ing the file must yield + # a Hash containing translation data with locales as toplevel keys. + def load_rb(filename) + eval(IO.read(filename), binding, filename) + end + + # Loads a YAML translations file. The data must have locales as + # toplevel keys. + def load_yml(filename) + begin + YAML.load_file(filename) + rescue TypeError, ScriptError, StandardError => e + raise InvalidLocaleData.new(filename, e.inspect) + end + end + + def translate_localization_format(locale, object, format, options) + format.to_s.gsub(/%[aAbBpP]/) do |match| + case match + when '%a' then I18n.t(:"date.abbr_day_names", :locale => locale, :format => format)[object.wday] + when '%A' then I18n.t(:"date.day_names", :locale => locale, :format => format)[object.wday] + when '%b' then I18n.t(:"date.abbr_month_names", :locale => locale, :format => format)[object.mon] + when '%B' then I18n.t(:"date.month_names", :locale => locale, :format => format)[object.mon] + when '%p' then I18n.t(:"time.#{object.hour < 12 ? :am : :pm}", :locale => locale, :format => format).upcase if object.respond_to? :hour + when '%P' then I18n.t(:"time.#{object.hour < 12 ? :am : :pm}", :locale => locale, :format => format).downcase if object.respond_to? :hour + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/cache.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/cache.rb new file mode 100644 index 0000000..1aa6434 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/cache.rb @@ -0,0 +1,114 @@ +# This module allows you to easily cache all responses from the backend - thus +# speeding up the I18n aspects of your application quite a bit. +# +# To enable caching you can simply include the Cache module to the Simple +# backend - or whatever other backend you are using: +# +# I18n::Backend::Simple.send(:include, I18n::Backend::Cache) +# +# You will also need to set a cache store implementation that you want to use: +# +# I18n.cache_store = ActiveSupport::Cache.lookup_store(:memory_store) +# +# You can use any cache implementation you want that provides the same API as +# ActiveSupport::Cache (only the methods #fetch and #write are being used). +# +# The cache_key implementation by default assumes you pass values that return +# a valid key from #hash (see +# http://www.ruby-doc.org/core/classes/Object.html#M000337). However, you can +# configure your own digest method via which responds to #hexdigest (see +# http://ruby-doc.org/stdlib/libdoc/digest/rdoc/index.html): +# +# I18n.cache_key_digest = Digest::MD5.new +# +# If you use a lambda as a default value in your translation like this: +# +# I18n.t(:"date.order", :default => lambda {[:month, :day, :year]}) +# +# Then you will always have a cache miss, because each time this method +# is called the lambda will have a different hash value. If you know +# the result of the lambda is a constant as in the example above, then +# to cache this you can make the lambda a constant, like this: +# +# DEFAULT_DATE_ORDER = lambda {[:month, :day, :year]} +# ... +# I18n.t(:"date.order", :default => DEFAULT_DATE_ORDER) +# +# If the lambda may result in different values for each call then consider +# also using the Memoize backend. +# +module I18n + class << self + @@cache_store = nil + @@cache_namespace = nil + @@cache_key_digest = nil + + def cache_store + @@cache_store + end + + def cache_store=(store) + @@cache_store = store + end + + def cache_namespace + @@cache_namespace + end + + def cache_namespace=(namespace) + @@cache_namespace = namespace + end + + def cache_key_digest + @@cache_key_digest + end + + def cache_key_digest=(key_digest) + @@cache_key_digest = key_digest + end + + def perform_caching? + !cache_store.nil? + end + end + + module Backend + # TODO Should the cache be cleared if new translations are stored? + module Cache + def translate(locale, key, options = {}) + I18n.perform_caching? ? fetch(cache_key(locale, key, options)) { super } : super + end + + protected + + def fetch(cache_key, &block) + result = _fetch(cache_key, &block) + throw(:exception, result) if result.is_a?(MissingTranslation) + result = result.dup if result.frozen? rescue result + result + end + + def _fetch(cache_key, &block) + result = I18n.cache_store.read(cache_key) + return result unless result.nil? + result = catch(:exception, &block) + I18n.cache_store.write(cache_key, result) unless result.is_a?(Proc) + result + end + + def cache_key(locale, key, options) + # This assumes that only simple, native Ruby values are passed to I18n.translate. + "i18n/#{I18n.cache_namespace}/#{locale}/#{digest_item(key)}/#{USE_INSPECT_HASH ? digest_item(options.inspect) : digest_item(options)}" + end + + private + # In Ruby < 1.9 the following is true: { :foo => 1, :bar => 2 }.hash == { :foo => 2, :bar => 1 }.hash + # Therefore we must use the hash of the inspect string instead to avoid cache key colisions. + USE_INSPECT_HASH = RUBY_VERSION <= "1.9" + + def digest_item(key) + I18n.cache_key_digest ? I18n.cache_key_digest.hexdigest(key.to_s) : key.hash + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/cascade.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/cascade.rb new file mode 100644 index 0000000..d8fb1cf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/cascade.rb @@ -0,0 +1,54 @@ +# The Cascade module adds the ability to do cascading lookups to backends that +# are compatible to the Simple backend. +# +# By cascading lookups we mean that for any key that can not be found the +# Cascade module strips one segment off the scope part of the key and then +# tries to look up the key in that scope. +# +# E.g. when a lookup for the key :"foo.bar.baz" does not yield a result then +# the segment :bar will be stripped off the scope part :"foo.bar" and the new +# scope :foo will be used to look up the key :baz. If that does not succeed +# then the remaining scope segment :foo will be omitted, too, and again the +# key :baz will be looked up (now with no scope). +# +# To enable a cascading lookup one passes the :cascade option: +# +# I18n.t(:'foo.bar.baz', :cascade => true) +# +# This will return the first translation found for :"foo.bar.baz", :"foo.baz" +# or :baz in this order. +# +# The cascading lookup takes precedence over resolving any given defaults. +# I.e. defaults will kick in after the cascading lookups haven't succeeded. +# +# This behavior is useful for libraries like ActiveRecord validations where +# the library wants to give users a bunch of more or less fine-grained options +# of scopes for a particular key. +# +# Thanks to Clemens Kofler for the initial idea and implementation! See +# http://github.com/clemens/i18n-cascading-backend + +module I18n + module Backend + module Cascade + def lookup(locale, key, scope = [], options = {}) + return super unless cascade = options[:cascade] + + cascade = { :step => 1 } unless cascade.is_a?(Hash) + step = cascade[:step] || 1 + offset = cascade[:offset] || 1 + separator = options[:separator] || I18n.default_separator + skip_root = cascade.has_key?(:skip_root) ? cascade[:skip_root] : true + + scope = I18n.normalize_keys(nil, key, scope, separator) + key = (scope.slice!(-offset, offset) || []).join(separator) + + begin + result = super + return result unless result.nil? + scope = scope.dup + end while (!scope.empty? || !skip_root) && scope.slice!(-step, step) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/chain.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/chain.rb new file mode 100644 index 0000000..2a45cad --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/chain.rb @@ -0,0 +1,97 @@ +module I18n + module Backend + # Backend that chains multiple other backends and checks each of them when + # a translation needs to be looked up. This is useful when you want to use + # standard translations with a Simple backend but store custom application + # translations in a database or other backends. + # + # To use the Chain backend instantiate it and set it to the I18n module. + # You can add chained backends through the initializer or backends + # accessor: + # + # # preserves the existing Simple backend set to I18n.backend + # I18n.backend = I18n::Backend::Chain.new(I18n::Backend::ActiveRecord.new, I18n.backend) + # + # The implementation assumes that all backends added to the Chain implement + # a lookup method with the same API as Simple backend does. + class Chain + module Implementation + include Base + + attr_accessor :backends + + def initialize(*backends) + self.backends = backends + end + + def reload! + backends.each { |backend| backend.reload! } + end + + def store_translations(locale, data, options = {}) + backends.first.store_translations(locale, data, options) + end + + def available_locales + backends.map { |backend| backend.available_locales }.flatten.uniq + end + + def translate(locale, key, default_options = {}) + namespace = nil + options = default_options.except(:default) + + backends.each do |backend| + catch(:exception) do + options = default_options if backend == backends.last + translation = backend.translate(locale, key, options) + if namespace_lookup?(translation, options) + namespace = _deep_merge(translation, namespace || {}) + elsif !translation.nil? || (options.key?(:default) && options[:default].nil?) + return translation + end + end + end + + return namespace if namespace + throw(:exception, I18n::MissingTranslation.new(locale, key, options)) + end + + def exists?(locale, key) + backends.any? do |backend| + backend.exists?(locale, key) + end + end + + def localize(locale, object, format = :default, options = {}) + backends.each do |backend| + catch(:exception) do + result = backend.localize(locale, object, format, options) and return result + end + end + throw(:exception, I18n::MissingTranslation.new(locale, format, options)) + end + + protected + def namespace_lookup?(result, options) + result.is_a?(Hash) && !options.has_key?(:count) + end + + private + # This is approximately what gets used in ActiveSupport. + # However since we are not guaranteed to run in an ActiveSupport context + # it is wise to have our own copy. We underscore it + # to not pollute the namespace of the including class. + def _deep_merge(hash, other_hash) + copy = hash.dup + other_hash.each_pair do |k,v| + value_from_other = hash[k] + copy[k] = value_from_other.is_a?(Hash) && v.is_a?(Hash) ? _deep_merge(value_from_other, v) : v + end + copy + end + end + + include Implementation + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/fallbacks.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/fallbacks.rb new file mode 100644 index 0000000..a3badae --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/fallbacks.rb @@ -0,0 +1,86 @@ +# I18n locale fallbacks are useful when you want your application to use +# translations from other locales when translations for the current locale are +# missing. E.g. you might want to use :en translations when translations in +# your applications main locale :de are missing. +# +# To enable locale fallbacks you can simply include the Fallbacks module to +# the Simple backend - or whatever other backend you are using: +# +# I18n::Backend::Simple.include(I18n::Backend::Fallbacks) +module I18n + @@fallbacks = nil + + class << self + # Returns the current fallbacks implementation. Defaults to +I18n::Locale::Fallbacks+. + def fallbacks + @@fallbacks ||= I18n::Locale::Fallbacks.new + end + + # Sets the current fallbacks implementation. Use this to set a different fallbacks implementation. + def fallbacks=(fallbacks) + @@fallbacks = fallbacks + end + end + + module Backend + module Fallbacks + # Overwrites the Base backend translate method so that it will try each + # locale given by I18n.fallbacks for the given locale. E.g. for the + # locale :"de-DE" it might try the locales :"de-DE", :de and :en + # (depends on the fallbacks implementation) until it finds a result with + # the given options. If it does not find any result for any of the + # locales it will then throw MissingTranslation as usual. + # + # The default option takes precedence over fallback locales only when + # it's a Symbol. When the default contains a String, Proc or Hash + # it is evaluated last after all the fallback locales have been tried. + def translate(locale, key, options = {}) + return super unless options.fetch(:fallback, true) + return super if options[:fallback_in_progress] + default = extract_non_symbol_default!(options) if options[:default] + + begin + options[:fallback_in_progress] = true + I18n.fallbacks[locale].each do |fallback| + begin + catch(:exception) do + result = super(fallback, key, options) + return result unless result.nil? + end + rescue I18n::InvalidLocale + # we do nothing when the locale is invalid, as this is a fallback anyways. + end + end + ensure + options.delete(:fallback_in_progress) + end + + return if options.key?(:default) && options[:default].nil? + + return super(locale, nil, options.merge(:default => default)) if default + throw(:exception, I18n::MissingTranslation.new(locale, key, options)) + end + + def extract_non_symbol_default!(options) + defaults = [options[:default]].flatten + first_non_symbol_default = defaults.detect{|default| !default.is_a?(Symbol)} + if first_non_symbol_default + options[:default] = defaults[0, defaults.index(first_non_symbol_default)] + end + return first_non_symbol_default + end + + def exists?(locale, key) + I18n.fallbacks[locale].each do |fallback| + begin + return true if super(fallback, key) + rescue I18n::InvalidLocale + # we do nothing when the locale is invalid, as this is a fallback anyways. + end + end + + false + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/flatten.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/flatten.rb new file mode 100644 index 0000000..995c346 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/flatten.rb @@ -0,0 +1,113 @@ +module I18n + module Backend + # This module contains several helpers to assist flattening translations. + # You may want to flatten translations for: + # + # 1) speed up lookups, as in the Memoize backend; + # 2) In case you want to store translations in a data store, as in ActiveRecord backend; + # + # You can check both backends above for some examples. + # This module also keeps all links in a hash so they can be properly resolved when flattened. + module Flatten + SEPARATOR_ESCAPE_CHAR = "\001" + FLATTEN_SEPARATOR = "." + + # normalize_keys the flatten way. This method is significantly faster + # and creates way less objects than the one at I18n.normalize_keys. + # It also handles escaping the translation keys. + def self.normalize_flat_keys(locale, key, scope, separator) + keys = [scope, key].flatten.compact + separator ||= I18n.default_separator + + if separator != FLATTEN_SEPARATOR + keys.map! do |k| + k.to_s.tr("#{FLATTEN_SEPARATOR}#{separator}", + "#{SEPARATOR_ESCAPE_CHAR}#{FLATTEN_SEPARATOR}") + end + end + + keys.join(".") + end + + # Receives a string and escape the default separator. + def self.escape_default_separator(key) #:nodoc: + key.to_s.tr(FLATTEN_SEPARATOR, SEPARATOR_ESCAPE_CHAR) + end + + # Shortcut to I18n::Backend::Flatten.normalize_flat_keys + # and then resolve_links. + def normalize_flat_keys(locale, key, scope, separator) + key = I18n::Backend::Flatten.normalize_flat_keys(locale, key, scope, separator) + resolve_link(locale, key) + end + + # Store flattened links. + def links + @links ||= I18n.new_double_nested_cache + end + + # Flatten keys for nested Hashes by chaining up keys: + # + # >> { "a" => { "b" => { "c" => "d", "e" => "f" }, "g" => "h" }, "i" => "j"}.wind + # => { "a.b.c" => "d", "a.b.e" => "f", "a.g" => "h", "i" => "j" } + # + def flatten_keys(hash, escape, prev_key=nil, &block) + hash.each_pair do |key, value| + key = escape_default_separator(key) if escape + curr_key = [prev_key, key].compact.join(FLATTEN_SEPARATOR).to_sym + yield curr_key, value + flatten_keys(value, escape, curr_key, &block) if value.is_a?(Hash) + end + end + + # Receives a hash of translations (where the key is a locale and + # the value is another hash) and return a hash with all + # translations flattened. + # + # Nested hashes are included in the flattened hash just if subtree + # is true and Symbols are automatically stored as links. + def flatten_translations(locale, data, escape, subtree) + hash = {} + flatten_keys(data, escape) do |key, value| + if value.is_a?(Hash) + hash[key] = value if subtree + else + store_link(locale, key, value) if value.is_a?(Symbol) + hash[key] = value + end + end + hash + end + + protected + + def store_link(locale, key, link) + links[locale.to_sym][key.to_s] = link.to_s + end + + def resolve_link(locale, key) + key, locale = key.to_s, locale.to_sym + links = self.links[locale] + + if links.key?(key) + links[key] + elsif link = find_link(locale, key) + store_link(locale, key, key.gsub(*link)) + else + key + end + end + + def find_link(locale, key) #:nodoc: + links[locale].each_pair do |from, to| + return [from, to] if key[0, from.length] == from + end && nil + end + + def escape_default_separator(key) #:nodoc: + I18n::Backend::Flatten.escape_default_separator(key) + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/gettext.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/gettext.rb new file mode 100644 index 0000000..f41df68 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/gettext.rb @@ -0,0 +1,81 @@ +require 'i18n/gettext' +require 'i18n/gettext/po_parser' + +module I18n + module Backend + # Experimental support for using Gettext po files to store translations. + # + # To use this you can simply include the module to the Simple backend - or + # whatever other backend you are using. + # + # I18n::Backend::Simple.include(I18n::Backend::Gettext) + # + # Now you should be able to include your Gettext translation (*.po) files to + # the +I18n.load_path+ so they're loaded to the backend and you can use them as + # usual: + # + # I18n.load_path += Dir["path/to/locales/*.po"] + # + # Following the Gettext convention this implementation expects that your + # translation files are named by their locales. E.g. the file en.po would + # contain the translations for the English locale. + # + # To translate text you must use one of the translate methods provided by + # I18n::Gettext::Helpers. + # + # include I18n::Gettext::Helpers + # puts _("some string") + # + # Without it strings containing periods (".") will not be translated. + + module Gettext + class PoData < Hash + def set_comment(msgid_or_sym, comment) + # ignore + end + end + + protected + def load_po(filename) + locale = ::File.basename(filename, '.po').to_sym + data = normalize(locale, parse(filename)) + { locale => data } + end + + def parse(filename) + GetText::PoParser.new.parse(::File.read(filename), PoData.new) + end + + def normalize(locale, data) + data.inject({}) do |result, (key, value)| + unless key.nil? || key.empty? + key = key.gsub(I18n::Gettext::CONTEXT_SEPARATOR, '|') + key, value = normalize_pluralization(locale, key, value) if key.index("\000") + + parts = key.split('|').reverse + normalized = parts.inject({}) do |_normalized, part| + { part => _normalized.empty? ? value : _normalized } + end + + result.deep_merge!(normalized) + end + result + end + end + + def normalize_pluralization(locale, key, value) + # FIXME po_parser includes \000 chars that can not be turned into Symbols + key = key.gsub("\000", I18n::Gettext::PLURAL_SEPARATOR).split(I18n::Gettext::PLURAL_SEPARATOR).first + + keys = I18n::Gettext.plural_keys(locale) + values = value.split("\000") + raise "invalid number of plurals: #{values.size}, keys: #{keys.inspect} on #{locale} locale for msgid #{key.inspect} with values #{values.inspect}" if values.size != keys.size + + result = {} + values.each_with_index { |_value, ix| result[keys[ix]] = _value } + [key, result] + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/interpolation_compiler.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/interpolation_compiler.rb new file mode 100644 index 0000000..0e3a603 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/interpolation_compiler.rb @@ -0,0 +1,121 @@ +# The InterpolationCompiler module contains optimizations that can tremendously +# speed up the interpolation process on the Simple backend. +# +# It works by defining a pre-compiled method on stored translation Strings that +# already bring all the knowledge about contained interpolation variables etc. +# so that the actual recurring interpolation will be very fast. +# +# To enable pre-compiled interpolations you can simply include the +# InterpolationCompiler module to the Simple backend: +# +# I18n::Backend::Simple.include(I18n::Backend::InterpolationCompiler) +# +# Note that InterpolationCompiler does not yield meaningful results and consequently +# should not be used with Ruby 1.9 (YARV) but improves performance everywhere else +# (jRuby, Rubinius). +module I18n + module Backend + module InterpolationCompiler + module Compiler + extend self + + TOKENIZER = /(%%\{[^\}]+\}|%\{[^\}]+\})/ + INTERPOLATION_SYNTAX_PATTERN = /(%)?(%\{([^\}]+)\})/ + + def compile_if_an_interpolation(string) + if interpolated_str?(string) + string.instance_eval <<-RUBY_EVAL, __FILE__, __LINE__ + def i18n_interpolate(v = {}) + "#{compiled_interpolation_body(string)}" + end + RUBY_EVAL + end + + string + end + + def interpolated_str?(str) + str.kind_of?(::String) && str =~ INTERPOLATION_SYNTAX_PATTERN + end + + protected + # tokenize("foo %{bar} baz %%{buz}") # => ["foo ", "%{bar}", " baz ", "%%{buz}"] + def tokenize(str) + str.split(TOKENIZER) + end + + def compiled_interpolation_body(str) + tokenize(str).map do |token| + (matchdata = token.match(INTERPOLATION_SYNTAX_PATTERN)) ? handle_interpolation_token(token, matchdata) : escape_plain_str(token) + end.join + end + + def handle_interpolation_token(interpolation, matchdata) + escaped, pattern, key = matchdata.values_at(1, 2, 3) + escaped ? pattern : compile_interpolation_token(key.to_sym) + end + + def compile_interpolation_token(key) + "\#{#{interpolate_or_raise_missing(key)}}" + end + + def interpolate_or_raise_missing(key) + escaped_key = escape_key_sym(key) + RESERVED_KEYS.include?(key) ? reserved_key(escaped_key) : interpolate_key(escaped_key) + end + + def interpolate_key(key) + [direct_key(key), nil_key(key), missing_key(key)].join('||') + end + + def direct_key(key) + "((t = v[#{key}]) && t.respond_to?(:call) ? t.call : t)" + end + + def nil_key(key) + "(v.has_key?(#{key}) && '')" + end + + def missing_key(key) + "I18n.config.missing_interpolation_argument_handler.call(#{key}, v, self)" + end + + def reserved_key(key) + "raise(ReservedInterpolationKey.new(#{key}, self))" + end + + def escape_plain_str(str) + str.gsub(/"|\\|#/) {|x| "\\#{x}"} + end + + def escape_key_sym(key) + # rely on Ruby to do all the hard work :) + key.to_sym.inspect + end + end + + def interpolate(locale, string, values) + if string.respond_to?(:i18n_interpolate) + string.i18n_interpolate(values) + elsif values + super + else + string + end + end + + def store_translations(locale, data, options = {}) + compile_all_strings_in(data) + super + end + + protected + def compile_all_strings_in(data) + data.each_value do |value| + Compiler.compile_if_an_interpolation(value) + compile_all_strings_in(value) if value.kind_of?(Hash) + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/key_value.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/key_value.rb new file mode 100644 index 0000000..a79fc1a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/key_value.rb @@ -0,0 +1,100 @@ +require 'i18n/backend/base' +require 'active_support/json' + +module I18n + module Backend + # This is a basic backend for key value stores. It receives on + # initialization the store, which should respond to three methods: + # + # * store#[](key) - Used to get a value + # * store#[]=(key, value) - Used to set a value + # * store#keys - Used to get all keys + # + # Since these stores only supports string, all values are converted + # to JSON before being stored, allowing it to also store booleans, + # hashes and arrays. However, this store does not support Procs. + # + # As the ActiveRecord backend, Symbols are just supported when loading + # translations from the filesystem or through explicit store translations. + # + # Also, avoid calling I18n.available_locales since it's a somehow + # expensive operation in most stores. + # + # == Example + # + # To setup I18n to use TokyoCabinet in memory is quite straightforward: + # + # require 'rufus/tokyo/cabinet' # gem install rufus-tokyo + # I18n.backend = I18n::Backend::KeyValue.new(Rufus::Tokyo::Cabinet.new('*')) + # + # == Performance + # + # You may make this backend even faster by including the Memoize module. + # However, notice that you should properly clear the cache if you change + # values directly in the key-store. + # + # == Subtrees + # + # In most backends, you are allowed to retrieve part of a translation tree: + # + # I18n.backend.store_translations :en, :foo => { :bar => :baz } + # I18n.t "foo" #=> { :bar => :baz } + # + # This backend supports this feature by default, but it slows down the storage + # of new data considerably and makes hard to delete entries. That said, you are + # allowed to disable the storage of subtrees on initialization: + # + # I18n::Backend::KeyValue.new(@store, false) + # + # This is useful if you are using a KeyValue backend chained to a Simple backend. + class KeyValue + module Implementation + attr_accessor :store + + include Base, Flatten + + def initialize(store, subtrees=true) + @store, @subtrees = store, subtrees + end + + def store_translations(locale, data, options = {}) + escape = options.fetch(:escape, true) + flatten_translations(locale, data, escape, @subtrees).each do |key, value| + key = "#{locale}.#{key}" + + case value + when Hash + if @subtrees && (old_value = @store[key]) + old_value = ActiveSupport::JSON.decode(old_value) + value = old_value.deep_symbolize_keys.deep_merge!(value) if old_value.is_a?(Hash) + end + when Proc + raise "Key-value stores cannot handle procs" + end + + @store[key] = ActiveSupport::JSON.encode(value) unless value.is_a?(Symbol) + end + end + + def available_locales + locales = @store.keys.map { |k| k =~ /\./; $` } + locales.uniq! + locales.compact! + locales.map! { |k| k.to_sym } + locales + end + + protected + + def lookup(locale, key, scope = [], options = {}) + key = normalize_flat_keys(locale, key, scope, options[:separator]) + value = @store["#{locale}.#{key}"] + value = ActiveSupport::JSON.decode(value) if value + value.is_a?(Hash) ? value.deep_symbolize_keys : value + end + end + + include Implementation + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/memoize.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/memoize.rb new file mode 100644 index 0000000..a11bdec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/memoize.rb @@ -0,0 +1,46 @@ +# Memoize module simply memoizes the values returned by lookup using +# a flat hash and can tremendously speed up the lookup process in a backend. +# +# To enable it you can simply include the Memoize module to your backend: +# +# I18n::Backend::Simple.include(I18n::Backend::Memoize) +# +# Notice that it's the responsibility of the backend to define whenever the +# cache should be cleaned. +module I18n + module Backend + module Memoize + def available_locales + @memoized_locales ||= super + end + + def store_translations(locale, data, options = {}) + reset_memoizations!(locale) + super + end + + def reload! + reset_memoizations! + super + end + + protected + + def lookup(locale, key, scope = nil, options = {}) + flat_key = I18n::Backend::Flatten.normalize_flat_keys(locale, + key, scope, options[:separator]).to_sym + flat_hash = memoized_lookup[locale.to_sym] + flat_hash.key?(flat_key) ? flat_hash[flat_key] : (flat_hash[flat_key] = super) + end + + def memoized_lookup + @memoized_lookup ||= I18n.new_double_nested_cache + end + + def reset_memoizations!(locale=nil) + @memoized_locales = nil + (locale ? memoized_lookup[locale.to_sym] : memoized_lookup).clear + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/metadata.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/metadata.rb new file mode 100644 index 0000000..a8d922a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/metadata.rb @@ -0,0 +1,69 @@ +# I18n translation metadata is useful when you want to access information +# about how a translation was looked up, pluralized or interpolated in +# your application. +# +# msg = I18n.t(:message, :default => 'Hi!', :scope => :foo) +# msg.translation_metadata +# # => { :key => :message, :scope => :foo, :default => 'Hi!' } +# +# If a :count option was passed to #translate it will be set to the metadata. +# Likewise, if any interpolation variables were passed they will also be set. +# +# To enable translation metadata you can simply include the Metadata module +# into the Simple backend class - or whatever other backend you are using: +# +# I18n::Backend::Simple.include(I18n::Backend::Metadata) +# +module I18n + module Backend + module Metadata + class << self + def included(base) + Object.class_eval do + def translation_metadata + unless self.frozen? + @translation_metadata ||= {} + else + {} + end + end + + def translation_metadata=(translation_metadata) + @translation_metadata = translation_metadata unless self.frozen? + end + end unless Object.method_defined?(:translation_metadata) + end + end + + def translate(locale, key, options = {}) + metadata = { + :locale => locale, + :key => key, + :scope => options[:scope], + :default => options[:default], + :separator => options[:separator], + :values => options.reject { |name, value| RESERVED_KEYS.include?(name) } + } + with_metadata(metadata) { super } + end + + def interpolate(locale, entry, values = {}) + metadata = entry.translation_metadata.merge(:original => entry) + with_metadata(metadata) { super } + end + + def pluralize(locale, entry, count) + with_metadata(:count => count) { super } + end + + protected + + def with_metadata(metadata, &block) + result = yield + result.translation_metadata = result.translation_metadata.merge(metadata) if result + result + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/pluralization.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/pluralization.rb new file mode 100644 index 0000000..01e68d2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/pluralization.rb @@ -0,0 +1,53 @@ +# I18n Pluralization are useful when you want your application to +# customize pluralization rules. +# +# To enable locale specific pluralizations you can simply include the +# Pluralization module to the Simple backend - or whatever other backend you +# are using. +# +# I18n::Backend::Simple.include(I18n::Backend::Pluralization) +# +# You also need to make sure to provide pluralization algorithms to the +# backend, i.e. include them to your I18n.load_path accordingly. +module I18n + module Backend + module Pluralization + # Overwrites the Base backend translate method so that it will check the + # translation meta data space (:i18n) for a locale specific pluralization + # rule and use it to pluralize the given entry. I.e. the library expects + # pluralization rules to be stored at I18n.t(:'i18n.plural.rule') + # + # Pluralization rules are expected to respond to #call(count) and + # return a pluralization key. Valid keys depend on the translation data + # hash (entry) but it is generally recommended to follow CLDR's style, + # i.e., return one of the keys :zero, :one, :few, :many, :other. + # + # The :zero key is always picked directly when count equals 0 AND the + # translation data has the key :zero. This way translators are free to + # either pick a special :zero translation even for languages where the + # pluralizer does not return a :zero key. + def pluralize(locale, entry, count) + return entry unless entry.is_a?(Hash) and count + + pluralizer = pluralizer(locale) + if pluralizer.respond_to?(:call) + key = count == 0 && entry.has_key?(:zero) ? :zero : pluralizer.call(count) + raise InvalidPluralizationData.new(entry, count, key) unless entry.has_key?(key) + entry[key] + else + super + end + end + + protected + + def pluralizers + @pluralizers ||= {} + end + + def pluralizer(locale) + pluralizers[locale] ||= I18n.t(:'i18n.plural.rule', :locale => locale, :resolve => false) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/simple.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/simple.rb new file mode 100644 index 0000000..00a887b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/simple.rb @@ -0,0 +1,87 @@ +module I18n + module Backend + # A simple backend that reads translations from YAML files and stores them in + # an in-memory hash. Relies on the Base backend. + # + # The implementation is provided by a Implementation module allowing to easily + # extend Simple backend's behavior by including modules. E.g.: + # + # module I18n::Backend::Pluralization + # def pluralize(*args) + # # extended pluralization logic + # super + # end + # end + # + # I18n::Backend::Simple.include(I18n::Backend::Pluralization) + class Simple + (class << self; self; end).class_eval { public :include } + + module Implementation + include Base + + def initialized? + @initialized ||= false + end + + # Stores translations for the given locale in memory. + # This uses a deep merge for the translations hash, so existing + # translations will be overwritten by new ones only at the deepest + # level of the hash. + def store_translations(locale, data, options = {}) + locale = locale.to_sym + translations[locale] ||= {} + data = data.deep_symbolize_keys + translations[locale].deep_merge!(data) + end + + # Get available locales from the translations hash + def available_locales + init_translations unless initialized? + translations.inject([]) do |locales, (locale, data)| + locales << locale unless (data.keys - [:i18n]).empty? + locales + end + end + + # Clean up translations hash and set initialized to false on reload! + def reload! + @initialized = false + @translations = nil + super + end + + protected + + def init_translations + load_translations + @initialized = true + end + + def translations + @translations ||= {} + end + + # Looks up a translation from the translations hash. Returns nil if + # either key is nil, or locale, scope or key do not exist as a key in the + # nested translations hash. Splits keys or scopes containing dots + # into multiple keys, i.e. currency.format is regarded the same as + # %w(currency format). + def lookup(locale, key, scope = [], options = {}) + init_translations unless initialized? + keys = I18n.normalize_keys(locale, key, scope, options[:separator]) + + keys.inject(translations) do |result, _key| + _key = _key.to_sym + return nil unless result.is_a?(Hash) && result.has_key?(_key) + result = result[_key] + result = resolve(locale, _key, result, options.merge(:scope => nil)) if result.is_a?(Symbol) + result + end + end + end + + include Implementation + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/transliterator.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/transliterator.rb new file mode 100644 index 0000000..2617bcf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/backend/transliterator.rb @@ -0,0 +1,106 @@ +# encoding: utf-8 +module I18n + module Backend + module Transliterator + DEFAULT_REPLACEMENT_CHAR = "?" + + # Given a locale and a UTF-8 string, return the locale's ASCII + # approximation for the string. + def transliterate(locale, string, replacement = nil) + @transliterators ||= {} + @transliterators[locale] ||= Transliterator.get I18n.t(:'i18n.transliterate.rule', + :locale => locale, :resolve => false, :default => {}) + @transliterators[locale].transliterate(string, replacement) + end + + # Get a transliterator instance. + def self.get(rule = nil) + if !rule || rule.kind_of?(Hash) + HashTransliterator.new(rule) + elsif rule.kind_of? Proc + ProcTransliterator.new(rule) + else + raise I18n::ArgumentError, "Transliteration rule must be a proc or a hash." + end + end + + # A transliterator which accepts a Proc as its transliteration rule. + class ProcTransliterator + def initialize(rule) + @rule = rule + end + + def transliterate(string, replacement = nil) + @rule.call(string) + end + end + + # A transliterator which accepts a Hash of characters as its translation + # rule. + class HashTransliterator + DEFAULT_APPROXIMATIONS = { + "À"=>"A", "Ã"=>"A", "Â"=>"A", "Ã"=>"A", "Ä"=>"A", "Ã…"=>"A", "Æ"=>"AE", + "Ç"=>"C", "È"=>"E", "É"=>"E", "Ê"=>"E", "Ë"=>"E", "ÃŒ"=>"I", "Ã"=>"I", + "ÃŽ"=>"I", "Ã"=>"I", "Ã"=>"D", "Ñ"=>"N", "Ã’"=>"O", "Ó"=>"O", "Ô"=>"O", + "Õ"=>"O", "Ö"=>"O", "×"=>"x", "Ø"=>"O", "Ù"=>"U", "Ú"=>"U", "Û"=>"U", + "Ü"=>"U", "Ã"=>"Y", "Þ"=>"Th", "ß"=>"ss", "à"=>"a", "á"=>"a", "â"=>"a", + "ã"=>"a", "ä"=>"a", "Ã¥"=>"a", "æ"=>"ae", "ç"=>"c", "è"=>"e", "é"=>"e", + "ê"=>"e", "ë"=>"e", "ì"=>"i", "í"=>"i", "î"=>"i", "ï"=>"i", "ð"=>"d", + "ñ"=>"n", "ò"=>"o", "ó"=>"o", "ô"=>"o", "õ"=>"o", "ö"=>"o", "ø"=>"o", + "ù"=>"u", "ú"=>"u", "û"=>"u", "ü"=>"u", "ý"=>"y", "þ"=>"th", "ÿ"=>"y", + "Ä€"=>"A", "Ä"=>"a", "Ä‚"=>"A", "ă"=>"a", "Ä„"=>"A", "Ä…"=>"a", "Ć"=>"C", + "ć"=>"c", "Ĉ"=>"C", "ĉ"=>"c", "ÄŠ"=>"C", "Ä‹"=>"c", "ÄŒ"=>"C", "Ä"=>"c", + "ÄŽ"=>"D", "Ä"=>"d", "Ä"=>"D", "Ä‘"=>"d", "Ä’"=>"E", "Ä“"=>"e", "Ä”"=>"E", + "Ä•"=>"e", "Ä–"=>"E", "Ä—"=>"e", "Ę"=>"E", "Ä™"=>"e", "Äš"=>"E", "Ä›"=>"e", + "Äœ"=>"G", "Ä"=>"g", "Äž"=>"G", "ÄŸ"=>"g", "Ä "=>"G", "Ä¡"=>"g", "Ä¢"=>"G", + "Ä£"=>"g", "Ĥ"=>"H", "Ä¥"=>"h", "Ħ"=>"H", "ħ"=>"h", "Ĩ"=>"I", "Ä©"=>"i", + "Ī"=>"I", "Ä«"=>"i", "Ĭ"=>"I", "Ä­"=>"i", "Ä®"=>"I", "į"=>"i", "İ"=>"I", + "ı"=>"i", "IJ"=>"IJ", "ij"=>"ij", "Ä´"=>"J", "ĵ"=>"j", "Ķ"=>"K", "Ä·"=>"k", + "ĸ"=>"k", "Ĺ"=>"L", "ĺ"=>"l", "Ä»"=>"L", "ļ"=>"l", "Ľ"=>"L", "ľ"=>"l", + "Ä¿"=>"L", "Å€"=>"l", "Å"=>"L", "Å‚"=>"l", "Ń"=>"N", "Å„"=>"n", "Å…"=>"N", + "ņ"=>"n", "Ň"=>"N", "ň"=>"n", "ʼn"=>"'n", "ÅŠ"=>"NG", "Å‹"=>"ng", + "ÅŒ"=>"O", "Å"=>"o", "ÅŽ"=>"O", "Å"=>"o", "Å"=>"O", "Å‘"=>"o", "Å’"=>"OE", + "Å“"=>"oe", "Å”"=>"R", "Å•"=>"r", "Å–"=>"R", "Å—"=>"r", "Ř"=>"R", "Å™"=>"r", + "Åš"=>"S", "Å›"=>"s", "Åœ"=>"S", "Å"=>"s", "Åž"=>"S", "ÅŸ"=>"s", "Å "=>"S", + "Å¡"=>"s", "Å¢"=>"T", "Å£"=>"t", "Ť"=>"T", "Å¥"=>"t", "Ŧ"=>"T", "ŧ"=>"t", + "Ũ"=>"U", "Å©"=>"u", "Ū"=>"U", "Å«"=>"u", "Ŭ"=>"U", "Å­"=>"u", "Å®"=>"U", + "ů"=>"u", "Ű"=>"U", "ű"=>"u", "Ų"=>"U", "ų"=>"u", "Å´"=>"W", "ŵ"=>"w", + "Ŷ"=>"Y", "Å·"=>"y", "Ÿ"=>"Y", "Ź"=>"Z", "ź"=>"z", "Å»"=>"Z", "ż"=>"z", + "Ž"=>"Z", "ž"=>"z" + }.freeze + + def initialize(rule = nil) + @rule = rule + add_default_approximations + add rule if rule + end + + def transliterate(string, replacement = nil) + replacement ||= DEFAULT_REPLACEMENT_CHAR + string.gsub(/[^\x00-\x7f]/u) do |char| + approximations[char] || replacement + end + end + + private + + def approximations + @approximations ||= {} + end + + def add_default_approximations + DEFAULT_APPROXIMATIONS.each do |key, value| + approximations[key] = value + end + end + + # Add transliteration rules to the approximations hash. + def add(hash) + hash.each do |key, value| + approximations[key.to_s] = value.to_s + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/config.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/config.rb new file mode 100644 index 0000000..fa16667 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/config.rb @@ -0,0 +1,142 @@ +require 'set' + +module I18n + class Config + # The only configuration value that is not global and scoped to thread is :locale. + # It defaults to the default_locale. + def locale + defined?(@locale) && @locale ? @locale : default_locale + end + + # Sets the current locale pseudo-globally, i.e. in the Thread.current hash. + def locale=(locale) + I18n.enforce_available_locales!(locale) + @locale = locale && locale.to_sym + end + + # Returns the current backend. Defaults to +Backend::Simple+. + def backend + @@backend ||= Backend::Simple.new + end + + # Sets the current backend. Used to set a custom backend. + def backend=(backend) + @@backend = backend + end + + # Returns the current default locale. Defaults to :'en' + def default_locale + @@default_locale ||= :en + end + + # Sets the current default locale. Used to set a custom default locale. + def default_locale=(locale) + I18n.enforce_available_locales!(locale) + @@default_locale = locale && locale.to_sym + end + + # Returns an array of locales for which translations are available. + # Unless you explicitely set these through I18n.available_locales= + # the call will be delegated to the backend. + def available_locales + @@available_locales ||= nil + @@available_locales || backend.available_locales + end + + # Caches the available locales list as both strings and symbols in a Set, so + # that we can have faster lookups to do the available locales enforce check. + def available_locales_set #:nodoc: + @@available_locales_set ||= available_locales.inject(Set.new) do |set, locale| + set << locale.to_s << locale.to_sym + end + end + + # Sets the available locales. + def available_locales=(locales) + @@available_locales = Array(locales).map { |locale| locale.to_sym } + @@available_locales = nil if @@available_locales.empty? + @@available_locales_set = nil + end + + # Clears the available locales set so it can be recomputed again after I18n + # gets reloaded. + def clear_available_locales_set #:nodoc: + @@available_locales_set = nil + end + + # Returns the current default scope separator. Defaults to '.' + def default_separator + @@default_separator ||= '.' + end + + # Sets the current default scope separator. + def default_separator=(separator) + @@default_separator = separator + end + + # Returns the current exception handler. Defaults to an instance of + # I18n::ExceptionHandler. + def exception_handler + @@exception_handler ||= ExceptionHandler.new + end + + # Sets the exception handler. + def exception_handler=(exception_handler) + @@exception_handler = exception_handler + end + + # Returns the current handler for situations when interpolation argument + # is missing. MissingInterpolationArgument will be raised by default. + def missing_interpolation_argument_handler + @@missing_interpolation_argument_handler ||= lambda do |missing_key, provided_hash, string| + raise MissingInterpolationArgument.new(missing_key, provided_hash, string) + end + end + + # Sets the missing interpolation argument handler. It can be any + # object that responds to #call. The arguments that will be passed to #call + # are the same as for MissingInterpolationArgument initializer. Use +Proc.new+ + # if you don't care about arity. + # + # == Example: + # You can supress raising an exception and return string instead: + # + # I18n.config.missing_interpolation_argument_handler = Proc.new do |key| + # "#{key} is missing" + # end + def missing_interpolation_argument_handler=(exception_handler) + @@missing_interpolation_argument_handler = exception_handler + end + + # Allow clients to register paths providing translation data sources. The + # backend defines acceptable sources. + # + # E.g. the provided SimpleBackend accepts a list of paths to translation + # files which are either named *.rb and contain plain Ruby Hashes or are + # named *.yml and contain YAML data. So for the SimpleBackend clients may + # register translation files like this: + # I18n.load_path << 'path/to/locale/en.yml' + def load_path + @@load_path ||= [] + end + + # Sets the load path instance. Custom implementations are expected to + # behave like a Ruby Array. + def load_path=(load_path) + @@load_path = load_path + @@available_locales_set = nil + backend.reload! + end + + # Whether or not to verify if locales are in the list of available locales. + # Defaults to true. + @@enforce_available_locales = true + def enforce_available_locales + @@enforce_available_locales + end + + def enforce_available_locales=(enforce_available_locales) + @@enforce_available_locales = enforce_available_locales + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/hash.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/hash.rb new file mode 100644 index 0000000..895f41a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/hash.rb @@ -0,0 +1,29 @@ +class Hash + def slice(*keep_keys) + h = {} + keep_keys.each { |key| h[key] = fetch(key) if has_key?(key) } + h + end unless Hash.method_defined?(:slice) + + def except(*less_keys) + slice(*keys - less_keys) + end unless Hash.method_defined?(:except) + + def deep_symbolize_keys + inject({}) { |result, (key, value)| + value = value.deep_symbolize_keys if value.is_a?(Hash) + result[(key.to_sym rescue key) || key] = value + result + } + end unless Hash.method_defined?(:deep_symbolize_keys) + + # deep_merge_hash! by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809 + MERGER = proc do |key, v1, v2| + Hash === v1 && Hash === v2 ? v1.merge(v2, &MERGER) : v2 + end + + def deep_merge!(data) + merge!(data, &MERGER) + end unless Hash.method_defined?(:deep_merge!) +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/kernel/suppress_warnings.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/kernel/suppress_warnings.rb new file mode 100644 index 0000000..eec1435 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/kernel/suppress_warnings.rb @@ -0,0 +1,8 @@ +module Kernel + def suppress_warnings + original_verbosity, $VERBOSE = $VERBOSE, nil + yield + ensure + $VERBOSE = original_verbosity + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/string/interpolate.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/string/interpolate.rb new file mode 100644 index 0000000..a353310 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/core_ext/string/interpolate.rb @@ -0,0 +1,9 @@ +# This file used to backport the Ruby 1.9 String interpolation syntax to Ruby 1.8. +# +# Since I18n has dropped support to Ruby 1.8, this file is not required anymore, +# however, Rails 3.2 still requires it directly: +# +# https://github.com/rails/rails/blob/3-2-stable/activesupport/lib/active_support/core_ext/string/interpolation.rb#L2 +# +# So we can't just drop the file entirely, which would then break Rails users +# under Ruby 1.9. This file can be removed once Rails 3.2 support is dropped. diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/exceptions.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/exceptions.rb new file mode 100644 index 0000000..7e8b0d6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/exceptions.rb @@ -0,0 +1,104 @@ +require 'cgi' + +module I18n + # Handles exceptions raised in the backend. All exceptions except for + # MissingTranslationData exceptions are re-thrown. When a MissingTranslationData + # was caught the handler returns an error message string containing the key/scope. + # Note that the exception handler is not called when the option :throw was given. + class ExceptionHandler + include Module.new { + def call(exception, locale, key, options) + case exception + when MissingTranslation + exception.message + when Exception + raise exception + else + throw :exception, exception + end + end + } + end + + class ArgumentError < ::ArgumentError; end + + class InvalidLocale < ArgumentError + attr_reader :locale + def initialize(locale) + @locale = locale + super "#{locale.inspect} is not a valid locale" + end + end + + class InvalidLocaleData < ArgumentError + attr_reader :filename + def initialize(filename, exception_message) + @filename, @exception_message = filename, exception_message + super "can not load translations from #{filename}: #{exception_message}" + end + end + + class MissingTranslation < ArgumentError + module Base + attr_reader :locale, :key, :options + + def initialize(locale, key, options = {}) + @key, @locale, @options = key, locale, options.dup + options.each { |k, v| self.options[k] = v.inspect if v.is_a?(Proc) } + end + + def keys + @keys ||= I18n.normalize_keys(locale, key, options[:scope]).tap do |keys| + keys << 'no key' if keys.size < 2 + end + end + + def message + "translation missing: #{keys.join('.')}" + end + alias :to_s :message + + def to_exception + MissingTranslationData.new(locale, key, options) + end + end + + include Base + end + + class MissingTranslationData < ArgumentError + include MissingTranslation::Base + end + + class InvalidPluralizationData < ArgumentError + attr_reader :entry, :count, :key + def initialize(entry, count, key) + @entry, @count, @key = entry, count, key + super "translation data #{entry.inspect} can not be used with :count => #{count}. key '#{key}' is missing." + end + end + + class MissingInterpolationArgument < ArgumentError + attr_reader :key, :values, :string + def initialize(key, values, string) + @key, @values, @string = key, values, string + super "missing interpolation argument #{key.inspect} in #{string.inspect} (#{values.inspect} given)" + end + end + + class ReservedInterpolationKey < ArgumentError + attr_reader :key, :string + def initialize(key, string) + @key, @string = key, string + super "reserved key #{key.inspect} used in #{string.inspect}" + end + end + + class UnknownFileType < ArgumentError + attr_reader :type, :filename + def initialize(type, filename) + @type, @filename = type, filename + super "can not load translations from #{filename}, the file type #{type} is not known" + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext.rb new file mode 100644 index 0000000..392cccd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext.rb @@ -0,0 +1,26 @@ +module I18n + module Gettext + PLURAL_SEPARATOR = "\001" + CONTEXT_SEPARATOR = "\004" + + autoload :Helpers, 'i18n/gettext/helpers' + + @@plural_keys = { :en => [:one, :other] } + + class << self + # returns an array of plural keys for the given locale or the whole hash + # of locale mappings to plural keys so that we can convert from gettext's + # integer-index based style + # TODO move this information to the pluralization module + def plural_keys(*args) + args.empty? ? @@plural_keys : @@plural_keys[args.first] || @@plural_keys[:en] + end + + def extract_scope(msgid, separator) + scope = msgid.to_s.split(separator) + msgid = scope.pop + [scope, msgid] + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext/helpers.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext/helpers.rb new file mode 100644 index 0000000..c97fd34 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext/helpers.rb @@ -0,0 +1,73 @@ +require 'i18n/gettext' + +module I18n + module Gettext + # Implements classical Gettext style accessors. To use this include the + # module to the global namespace or wherever you want to use it. + # + # include I18n::Gettext::Helpers + module Helpers + # Makes dynamic translation messages readable for the gettext parser. + # _(fruit) cannot be understood by the gettext parser. To help the parser find all your translations, + # you can add fruit = N_("Apple") which does not translate, but tells the parser: "Apple" needs translation. + # * msgid: the message id. + # * Returns: msgid. + def N_(msgsid) + msgsid + end + + def gettext(msgid, options = {}) + I18n.t(msgid, { :default => msgid, :separator => '|' }.merge(options)) + end + alias _ gettext + + def sgettext(msgid, separator = '|') + scope, msgid = I18n::Gettext.extract_scope(msgid, separator) + I18n.t(msgid, :scope => scope, :default => msgid, :separator => separator) + end + alias s_ sgettext + + def pgettext(msgctxt, msgid) + separator = I18n::Gettext::CONTEXT_SEPARATOR + sgettext([msgctxt, msgid].join(separator), separator) + end + alias p_ pgettext + + def ngettext(msgid, msgid_plural, n = 1) + nsgettext(msgid, msgid_plural, n) + end + alias n_ ngettext + + # Method signatures: + # nsgettext('Fruits|apple', 'apples', 2) + # nsgettext(['Fruits|apple', 'apples'], 2) + def nsgettext(msgid, msgid_plural, n = 1, separator = '|') + if msgid.is_a?(Array) + msgid, msgid_plural, n, separator = msgid[0], msgid[1], msgid_plural, n + separator = '|' unless separator.is_a?(::String) + end + + scope, msgid = I18n::Gettext.extract_scope(msgid, separator) + default = { :one => msgid, :other => msgid_plural } + I18n.t(msgid, :default => default, :count => n, :scope => scope, :separator => separator) + end + alias ns_ nsgettext + + # Method signatures: + # npgettext('Fruits', 'apple', 'apples', 2) + # npgettext('Fruits', ['apple', 'apples'], 2) + def npgettext(msgctxt, msgid, msgid_plural, n = 1) + separator = I18n::Gettext::CONTEXT_SEPARATOR + + if msgid.is_a?(Array) + msgid_plural, msgid, n = msgid[1], [msgctxt, msgid[0]].join(separator), msgid_plural + else + msgid = [msgctxt, msgid].join(separator) + end + + nsgettext(msgid, msgid_plural, n, separator) + end + alias np_ npgettext + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext/po_parser.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext/po_parser.rb new file mode 100644 index 0000000..547df6a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/gettext/po_parser.rb @@ -0,0 +1,329 @@ +=begin + poparser.rb - Generate a .mo + + Copyright (C) 2003-2009 Masao Mutoh + + You may redistribute it and/or modify it under the same + license terms as Ruby. +=end + +#MODIFIED +# removed include GetText etc +# added stub translation method _(x) +require 'racc/parser' + +module GetText + + class PoParser < Racc::Parser + + def _(x) + x + end + +module_eval <<'..end src/poparser.ry modeval..id7a99570e05', 'src/poparser.ry', 108 + def unescape(orig) + ret = orig.gsub(/\\n/, "\n") + ret.gsub!(/\\t/, "\t") + ret.gsub!(/\\r/, "\r") + ret.gsub!(/\\"/, "\"") + ret + end + + def parse(str, data, ignore_fuzzy = true) + @comments = [] + @data = data + @fuzzy = false + @msgctxt = "" + $ignore_fuzzy = ignore_fuzzy + + str.strip! + @q = [] + until str.empty? do + case str + when /\A\s+/ + str = $' + when /\Amsgctxt/ + @q.push [:MSGCTXT, $&] + str = $' + when /\Amsgid_plural/ + @q.push [:MSGID_PLURAL, $&] + str = $' + when /\Amsgid/ + @q.push [:MSGID, $&] + str = $' + when /\Amsgstr/ + @q.push [:MSGSTR, $&] + str = $' + when /\A\[(\d+)\]/ + @q.push [:PLURAL_NUM, $1] + str = $' + when /\A\#~(.*)/ + $stderr.print _("Warning: obsolete msgid exists.\n") + $stderr.print " #{$&}\n" + @q.push [:COMMENT, $&] + str = $' + when /\A\#(.*)/ + @q.push [:COMMENT, $&] + str = $' + when /\A\"(.*)\"/ + @q.push [:STRING, $1] + str = $' + else + #c = str[0,1] + #@q.push [:STRING, c] + str = str[1..-1] + end + end + @q.push [false, '$end'] + if $DEBUG + @q.each do |a,b| + puts "[#{a}, #{b}]" + end + end + @yydebug = true if $DEBUG + do_parse + + if @comments.size > 0 + @data.set_comment(:last, @comments.join("\n")) + end + @data + end + + def next_token + @q.shift + end + + def on_message(msgid, msgstr) + if msgstr.size > 0 + @data[msgid] = msgstr + @data.set_comment(msgid, @comments.join("\n")) + end + @comments.clear + @msgctxt = "" + end + + def on_comment(comment) + @fuzzy = true if (/fuzzy/ =~ comment) + @comments << comment + end + + +..end src/poparser.ry modeval..id7a99570e05 + +##### racc 1.4.5 generates ### + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 10, :_reduce_none, + 2, 10, :_reduce_none, + 2, 10, :_reduce_none, + 2, 10, :_reduce_none, + 2, 12, :_reduce_5, + 1, 13, :_reduce_none, + 1, 13, :_reduce_none, + 4, 15, :_reduce_8, + 5, 16, :_reduce_9, + 2, 17, :_reduce_10, + 1, 17, :_reduce_none, + 3, 18, :_reduce_12, + 1, 11, :_reduce_13, + 2, 14, :_reduce_14, + 1, 14, :_reduce_15 ] + +racc_reduce_n = 16 + +racc_shift_n = 26 + +racc_action_table = [ + 3, 13, 5, 7, 9, 15, 16, 17, 20, 17, + 13, 17, 13, 13, 11, 17, 23, 20, 13, 17 ] + +racc_action_check = [ + 1, 16, 1, 1, 1, 12, 12, 12, 18, 18, + 7, 14, 15, 9, 3, 19, 20, 21, 23, 25 ] + +racc_action_pointer = [ + nil, 0, nil, 14, nil, nil, nil, 3, nil, 6, + nil, nil, 0, nil, 4, 5, -6, nil, 2, 8, + 8, 11, nil, 11, nil, 12 ] + +racc_action_default = [ + -1, -16, -2, -16, -3, -13, -4, -16, -6, -16, + -7, 26, -16, -15, -5, -16, -16, -14, -16, -8, + -16, -9, -11, -16, -10, -12 ] + +racc_goto_table = [ + 12, 22, 14, 4, 24, 6, 2, 8, 18, 19, + 10, 21, 1, nil, nil, nil, 25 ] + +racc_goto_check = [ + 5, 9, 5, 3, 9, 4, 2, 6, 5, 5, + 7, 8, 1, nil, nil, nil, 5 ] + +racc_goto_pointer = [ + nil, 12, 5, 2, 4, -7, 6, 9, -7, -17 ] + +racc_goto_default = [ + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil ] + +racc_token_table = { + false => 0, + Object.new => 1, + :COMMENT => 2, + :MSGID => 3, + :MSGCTXT => 4, + :MSGID_PLURAL => 5, + :MSGSTR => 6, + :STRING => 7, + :PLURAL_NUM => 8 } + +racc_use_result_var = true + +racc_nt_base = 9 + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ +'$end', +'error', +'COMMENT', +'MSGID', +'MSGCTXT', +'MSGID_PLURAL', +'MSGSTR', +'STRING', +'PLURAL_NUM', +'$start', +'msgfmt', +'comment', +'msgctxt', +'message', +'string_list', +'single_message', +'plural_message', +'msgstr_plural', +'msgstr_plural_line'] + +Racc_debug_parser = true + +##### racc system variables end ##### + + # reduce 0 omitted + + # reduce 1 omitted + + # reduce 2 omitted + + # reduce 3 omitted + + # reduce 4 omitted + +module_eval <<'.,.,', 'src/poparser.ry', 25 + def _reduce_5( val, _values, result ) + @msgctxt = unescape(val[1]) + "\004" + result + end +.,., + + # reduce 6 omitted + + # reduce 7 omitted + +module_eval <<'.,.,', 'src/poparser.ry', 48 + def _reduce_8( val, _values, result ) + if @fuzzy and $ignore_fuzzy + if val[1] != "" + $stderr.print _("Warning: fuzzy message was ignored.\n") + $stderr.print " msgid '#{val[1]}'\n" + else + on_message('', unescape(val[3])) + end + @fuzzy = false + else + on_message(@msgctxt + unescape(val[1]), unescape(val[3])) + end + result = "" + result + end +.,., + +module_eval <<'.,.,', 'src/poparser.ry', 65 + def _reduce_9( val, _values, result ) + if @fuzzy and $ignore_fuzzy + if val[1] != "" + $stderr.print _("Warning: fuzzy message was ignored.\n") + $stderr.print "msgid = '#{val[1]}\n" + else + on_message('', unescape(val[3])) + end + @fuzzy = false + else + on_message(@msgctxt + unescape(val[1]) + "\000" + unescape(val[3]), unescape(val[4])) + end + result = "" + result + end +.,., + +module_eval <<'.,.,', 'src/poparser.ry', 76 + def _reduce_10( val, _values, result ) + if val[0].size > 0 + result = val[0] + "\000" + val[1] + else + result = "" + end + result + end +.,., + + # reduce 11 omitted + +module_eval <<'.,.,', 'src/poparser.ry', 84 + def _reduce_12( val, _values, result ) + result = val[2] + result + end +.,., + +module_eval <<'.,.,', 'src/poparser.ry', 91 + def _reduce_13( val, _values, result ) + on_comment(val[0]) + result + end +.,., + +module_eval <<'.,.,', 'src/poparser.ry', 99 + def _reduce_14( val, _values, result ) + result = val.delete_if{|item| item == ""}.join + result + end +.,., + +module_eval <<'.,.,', 'src/poparser.ry', 103 + def _reduce_15( val, _values, result ) + result = val[0] + result + end +.,., + + def _reduce_none( val, _values, result ) + result + end + + end # class PoParser + +end # module GetText diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/interpolate/ruby.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/interpolate/ruby.rb new file mode 100644 index 0000000..d2fdda7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/interpolate/ruby.rb @@ -0,0 +1,37 @@ +# heavily based on Masao Mutoh's gettext String interpolation extension +# http://github.com/mutoh/gettext/blob/f6566738b981fe0952548c421042ad1e0cdfb31e/lib/gettext/core_ext/string.rb + +module I18n + INTERPOLATION_PATTERN = Regexp.union( + /%%/, + /%\{(\w+)\}/, # matches placeholders like "%{foo}" + /%<(\w+)>(.*?\d*\.?\d*[bBdiouxXeEfgGcps])/ # matches placeholders like "%.d" + ) + + class << self + # Return String or raises MissingInterpolationArgument exception. + # Missing argument's logic is handled by I18n.config.missing_interpolation_argument_handler. + def interpolate(string, values) + raise ReservedInterpolationKey.new($1.to_sym, string) if string =~ RESERVED_KEYS_PATTERN + raise ArgumentError.new('Interpolation values must be a Hash.') unless values.kind_of?(Hash) + interpolate_hash(string, values) + end + + def interpolate_hash(string, values) + string.gsub(INTERPOLATION_PATTERN) do |match| + if match == '%%' + '%' + else + key = ($1 || $2 || match.tr("%{}", "")).to_sym + value = if values.key?(key) + values[key] + else + config.missing_interpolation_argument_handler.call(key, values, string) + end + value = value.call(values) if value.respond_to?(:call) + $3 ? sprintf("%#{$3}", value) : value + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale.rb new file mode 100644 index 0000000..4f9d026 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale.rb @@ -0,0 +1,6 @@ +module I18n + module Locale + autoload :Fallbacks, 'i18n/locale/fallbacks' + autoload :Tag, 'i18n/locale/tag' + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/fallbacks.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/fallbacks.rb new file mode 100644 index 0000000..08bf6f5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/fallbacks.rb @@ -0,0 +1,96 @@ +# Locale Fallbacks +# +# Extends the I18n module to hold a fallbacks instance which is set to an +# instance of I18n::Locale::Fallbacks by default but can be swapped with a +# different implementation. +# +# Locale fallbacks will compute a number of fallback locales for a given locale. +# For example: +# +#
      
      +# I18n.fallbacks[:"es-MX"] # => [:"es-MX", :es, :en] 
      +# +# Locale fallbacks always fall back to +# +# * all parent locales of a given locale (e.g. :es for :"es-MX") first, +# * the current default locales and all of their parents second +# +# The default locales are set to [I18n.default_locale] by default but can be +# set to something else. +# +# One can additionally add any number of additional fallback locales manually. +# These will be added before the default locales to the fallback chain. For +# example: +# +# # using the default locale as default fallback locale +# +# I18n.default_locale = :"en-US" +# I18n.fallbacks = I18n::Locale::Fallbacks.new(:"de-AT" => :"de-DE") +# I18n.fallbacks[:"de-AT"] # => [:"de-AT", :"de-DE", :de, :"en-US", :en] +# +# # using a custom locale as default fallback locale +# +# I18n.fallbacks = I18n::Locale::Fallbacks.new(:"en-GB", :"de-AT" => :de, :"de-CH" => :de) +# I18n.fallbacks[:"de-AT"] # => [:"de-AT", :de, :"en-GB", :en] +# I18n.fallbacks[:"de-CH"] # => [:"de-CH", :de, :"en-GB", :en] +# +# # mapping fallbacks to an existing instance +# +# # people speaking Catalan also speak Spanish as spoken in Spain +# fallbacks = I18n.fallbacks +# fallbacks.map(:ca => :"es-ES") +# fallbacks[:ca] # => [:ca, :"es-ES", :es, :"en-US", :en] +# +# # people speaking Arabian as spoken in Palestine also speak Hebrew as spoken in Israel +# fallbacks.map(:"ar-PS" => :"he-IL") +# fallbacks[:"ar-PS"] # => [:"ar-PS", :ar, :"he-IL", :he, :"en-US", :en] +# fallbacks[:"ar-EG"] # => [:"ar-EG", :ar, :"en-US", :en] +# +# # people speaking Sami as spoken in Finnland also speak Swedish and Finnish as spoken in Finnland +# fallbacks.map(:sms => [:"se-FI", :"fi-FI"]) +# fallbacks[:sms] # => [:sms, :"se-FI", :se, :"fi-FI", :fi, :"en-US", :en] + +module I18n + module Locale + class Fallbacks < Hash + def initialize(*mappings) + @map = {} + map(mappings.pop) if mappings.last.is_a?(Hash) + self.defaults = mappings.empty? ? [I18n.default_locale.to_sym] : mappings + end + + def defaults=(defaults) + @defaults = defaults.map { |default| compute(default, false) }.flatten + end + attr_reader :defaults + + def [](locale) + raise InvalidLocale.new(locale) if locale.nil? + locale = locale.to_sym + super || store(locale, compute(locale)) + end + + def map(mappings) + mappings.each do |from, to| + from, to = from.to_sym, Array(to) + to.each do |_to| + @map[from] ||= [] + @map[from] << _to.to_sym + end + end + end + + protected + + def compute(tags, include_defaults = true, exclude = []) + result = Array(tags).collect do |tag| + tags = I18n::Locale::Tag.tag(tag).self_and_parents.map! { |t| t.to_sym } - exclude + tags.each { |_tag| tags += compute(@map[_tag], false, exclude + tags) if @map[_tag] } + tags + end.flatten + result.push(*defaults) if include_defaults + result.uniq.compact + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag.rb new file mode 100644 index 0000000..a640b44 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag.rb @@ -0,0 +1,28 @@ +# encoding: utf-8 + +module I18n + module Locale + module Tag + autoload :Parents, 'i18n/locale/tag/parents' + autoload :Rfc4646, 'i18n/locale/tag/rfc4646' + autoload :Simple, 'i18n/locale/tag/simple' + + class << self + # Returns the current locale tag implementation. Defaults to +I18n::Locale::Tag::Simple+. + def implementation + @@implementation ||= Simple + end + + # Sets the current locale tag implementation. Use this to set a different locale tag implementation. + def implementation=(implementation) + @@implementation = implementation + end + + # Factory method for locale tags. Delegates to the current locale tag implementation. + def tag(tag) + implementation.tag(tag) + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/parents.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/parents.rb new file mode 100644 index 0000000..ec53060 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/parents.rb @@ -0,0 +1,22 @@ +module I18n + module Locale + module Tag + module Parents + def parent + @parent ||= begin + segs = to_a.compact + segs.length > 1 ? self.class.tag(*segs[0..(segs.length-2)].join('-')) : nil + end + end + + def self_and_parents + @self_and_parents ||= [self] + parents + end + + def parents + @parents ||= ([parent] + (parent ? parent.parents : [])).compact + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/rfc4646.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/rfc4646.rb new file mode 100644 index 0000000..4ce4c75 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/rfc4646.rb @@ -0,0 +1,74 @@ +# RFC 4646/47 compliant Locale tag implementation that parses locale tags to +# subtags such as language, script, region, variant etc. +# +# For more information see by http://en.wikipedia.org/wiki/IETF_language_tag +# +# Rfc4646::Parser does not implement grandfathered tags. + +module I18n + module Locale + module Tag + RFC4646_SUBTAGS = [ :language, :script, :region, :variant, :extension, :privateuse, :grandfathered ] + RFC4646_FORMATS = { :language => :downcase, :script => :capitalize, :region => :upcase, :variant => :downcase } + + class Rfc4646 < Struct.new(*RFC4646_SUBTAGS) + class << self + # Parses the given tag and returns a Tag instance if it is valid. + # Returns false if the given tag is not valid according to RFC 4646. + def tag(tag) + matches = parser.match(tag) + new(*matches) if matches + end + + def parser + @@parser ||= Rfc4646::Parser + end + + def parser=(parser) + @@parser = parser + end + end + + include Parents + + RFC4646_FORMATS.each do |name, format| + define_method(name) { self[name].send(format) unless self[name].nil? } + end + + def to_sym + to_s.to_sym + end + + def to_s + @tag ||= to_a.compact.join("-") + end + + def to_a + members.collect { |attr| self.send(attr) } + end + + module Parser + PATTERN = %r{\A(?: + ([a-z]{2,3}(?:(?:-[a-z]{3}){0,3})?|[a-z]{4}|[a-z]{5,8}) # language + (?:-([a-z]{4}))? # script + (?:-([a-z]{2}|\d{3}))? # region + (?:-([0-9a-z]{5,8}|\d[0-9a-z]{3}))* # variant + (?:-([0-9a-wyz](?:-[0-9a-z]{2,8})+))* # extension + (?:-(x(?:-[0-9a-z]{1,8})+))?| # privateuse subtag + (x(?:-[0-9a-z]{1,8})+)| # privateuse tag + /* ([a-z]{1,3}(?:-[0-9a-z]{2,8}){1,2}) */ # grandfathered + )\z}xi + + class << self + def match(tag) + c = PATTERN.match(tag.to_s).captures + c[0..4] << (c[5].nil? ? c[6] : c[5]) << c[7] # TODO c[7] is grandfathered, throw a NotImplemented exception here? + rescue + false + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/simple.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/simple.rb new file mode 100644 index 0000000..68642a1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/locale/tag/simple.rb @@ -0,0 +1,39 @@ +# Simple Locale tag implementation that computes subtags by simply splitting +# the locale tag at '-' occurences. +module I18n + module Locale + module Tag + class Simple + class << self + def tag(tag) + new(tag) + end + end + + include Parents + + attr_reader :tag + + def initialize(*tag) + @tag = tag.join('-').to_sym + end + + def subtags + @subtags = tag.to_s.split('-').map { |subtag| subtag.to_s } + end + + def to_sym + tag + end + + def to_s + tag.to_s + end + + def to_a + subtags + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/middleware.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/middleware.rb new file mode 100644 index 0000000..67461f7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/middleware.rb @@ -0,0 +1,15 @@ +module I18n + class Middleware + + def initialize(app) + @app = app + end + + def call(env) + @app.call(env) + ensure + Thread.current[:i18n_config] = I18n::Config.new + end + + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests.rb new file mode 100644 index 0000000..554cdef --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests.rb @@ -0,0 +1,12 @@ +module I18n + module Tests + autoload :Basics, 'i18n/tests/basics' + autoload :Defaults, 'i18n/tests/defaults' + autoload :Interpolation, 'i18n/tests/interpolation' + autoload :Link, 'i18n/tests/link' + autoload :Localization, 'i18n/tests/localization' + autoload :Lookup, 'i18n/tests/lookup' + autoload :Pluralization, 'i18n/tests/pluralization' + autoload :Procs, 'i18n/tests/procs' + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/basics.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/basics.rb new file mode 100644 index 0000000..951d7ab --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/basics.rb @@ -0,0 +1,60 @@ +module I18n + module Tests + module Basics + def teardown + I18n.available_locales = nil + end + + test "available_locales returns the locales stored to the backend by default" do + I18n.backend.store_translations('de', :foo => 'bar') + I18n.backend.store_translations('en', :foo => 'foo') + + assert I18n.available_locales.include?(:de) + assert I18n.available_locales.include?(:en) + end + + test "available_locales can be set to something else independently from the actual locale data" do + I18n.backend.store_translations('de', :foo => 'bar') + I18n.backend.store_translations('en', :foo => 'foo') + + I18n.available_locales = :foo + assert_equal [:foo], I18n.available_locales + + I18n.available_locales = [:foo, 'bar'] + assert_equal [:foo, :bar], I18n.available_locales + + I18n.available_locales = nil + assert I18n.available_locales.include?(:de) + assert I18n.available_locales.include?(:en) + end + + test "available_locales memoizes when set explicitely" do + I18n.backend.expects(:available_locales).never + I18n.available_locales = [:foo] + I18n.backend.store_translations('de', :bar => 'baz') + I18n.reload! + assert_equal [:foo], I18n.available_locales + end + + test "available_locales delegates to the backend when not set explicitely" do + original_available_locales_value = I18n.backend.available_locales + I18n.backend.expects(:available_locales).returns(original_available_locales_value).twice + assert_equal I18n.backend.available_locales, I18n.available_locales + end + + test "exists? is implemented by the backend" do + I18n.backend.store_translations(:foo, :bar => 'baz') + assert I18n.exists?(:bar, :foo) + end + + test "storing a nil value as a translation removes it from the available locale data" do + I18n.backend.store_translations(:en, :to_be_deleted => 'bar') + assert_equal 'bar', I18n.t(:to_be_deleted, :default => 'baz') + + I18n.cache_store.clear if I18n.respond_to?(:cache_store) && I18n.cache_store + I18n.backend.store_translations(:en, :to_be_deleted => nil) + assert_equal 'baz', I18n.t(:to_be_deleted, :default => 'baz') + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/defaults.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/defaults.rb new file mode 100644 index 0000000..08f9288 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/defaults.rb @@ -0,0 +1,48 @@ +# encoding: utf-8 + +module I18n + module Tests + module Defaults + def setup + super + I18n.backend.store_translations(:en, :foo => { :bar => 'bar', :baz => 'baz' }) + end + + test "defaults: given nil as a key it returns the given default" do + assert_equal 'default', I18n.t(nil, :default => 'default') + end + + test "defaults: given a symbol as a default it translates the symbol" do + assert_equal 'bar', I18n.t(nil, :default => :'foo.bar') + end + + test "defaults: given a symbol as a default and a scope it stays inside the scope when looking up the symbol" do + assert_equal 'bar', I18n.t(:missing, :default => :bar, :scope => :foo) + end + + test "defaults: given an array as a default it returns the first match" do + assert_equal 'bar', I18n.t(:does_not_exist, :default => [:does_not_exist_2, :'foo.bar']) + end + + test "defaults: given false it returns false" do + assert_equal false, I18n.t(:does_not_exist, :default => false) + end + + test "defaults: given nil it returns nil" do + assert_nil I18n.t(:does_not_exist, :default => nil) + end + + test "defaults: given an array of missing keys it raises a MissingTranslationData exception" do + assert_raise I18n::MissingTranslationData do + I18n.t(:does_not_exist, :default => [:does_not_exist_2, :does_not_exist_3], :raise => true) + end + end + + test "defaults: using a custom scope separator" do + # data must have been stored using the custom separator when using the ActiveRecord backend + I18n.backend.store_translations(:en, { :foo => { :bar => 'bar' } }, { :separator => '|' }) + assert_equal 'bar', I18n.t(nil, :default => :'foo|bar', :separator => '|') + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/interpolation.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/interpolation.rb new file mode 100644 index 0000000..c457b3d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/interpolation.rb @@ -0,0 +1,153 @@ +# encoding: utf-8 + +module I18n + module Tests + module Interpolation + # If no interpolation parameter is not given, I18n should not alter the string. + # This behavior is due to three reasons: + # + # * Checking interpolation keys in all strings hits performance, badly; + # + # * This allows us to retrieve untouched values through I18n. For example + # I could have a middleware that returns I18n lookup results in JSON + # to be processed through Javascript. Leaving the keys untouched allows + # the interpolation to happen at the javascript level; + # + # * Security concerns: if I allow users to translate a web site, they can + # insert %{} in messages causing the I18n lookup to fail in every request. + # + test "interpolation: given no values it does not alter the string" do + assert_equal 'Hi %{name}!', interpolate(:default => 'Hi %{name}!') + end + + test "interpolation: given values it interpolates them into the string" do + assert_equal 'Hi David!', interpolate(:default => 'Hi %{name}!', :name => 'David') + end + + test "interpolation: given a nil value it still interpolates it into the string" do + assert_equal 'Hi !', interpolate(:default => 'Hi %{name}!', :name => nil) + end + + test "interpolation: given a lambda as a value it calls it if the string contains the key" do + assert_equal 'Hi David!', interpolate(:default => 'Hi %{name}!', :name => lambda { |*args| 'David' }) + end + + test "interpolation: given a lambda as a value it does not call it if the string does not contain the key" do + assert_nothing_raised { interpolate(:default => 'Hi!', :name => lambda { |*args| raise 'fail' }) } + end + + test "interpolation: given values but missing a key it raises I18n::MissingInterpolationArgument" do + assert_raise(I18n::MissingInterpolationArgument) do + interpolate(:default => '%{foo}', :bar => 'bar') + end + end + + test "interpolation: it does not raise I18n::MissingInterpolationArgument for escaped variables" do + assert_nothing_raised(I18n::MissingInterpolationArgument) do + assert_equal 'Barr %{foo}', interpolate(:default => '%{bar} %%{foo}', :bar => 'Barr') + end + end + + test "interpolation: it does not change the original, stored translation string" do + I18n.backend.store_translations(:en, :interpolate => 'Hi %{name}!') + assert_equal 'Hi David!', interpolate(:interpolate, :name => 'David') + assert_equal 'Hi Yehuda!', interpolate(:interpolate, :name => 'Yehuda') + end + + test "interpolation: given the translation is in utf-8 it still works" do + assert_equal 'Häi David!', interpolate(:default => 'Häi %{name}!', :name => 'David') + end + + test "interpolation: given the value is in utf-8 it still works" do + assert_equal 'Hi ゆãã²ã‚!', interpolate(:default => 'Hi %{name}!', :name => 'ゆãã²ã‚') + end + + test "interpolation: given the translation and the value are in utf-8 it still works" do + assert_equal 'ã“ã‚“ã«ã¡ã¯ã€ã‚†ãã²ã‚ã•ã‚“!', interpolate(:default => 'ã“ã‚“ã«ã¡ã¯ã€%{name}ã•ã‚“!', :name => 'ゆãã²ã‚') + end + + if Object.const_defined?(:Encoding) + test "interpolation: given a euc-jp translation and a utf-8 value it raises Encoding::CompatibilityError" do + assert_raise(Encoding::CompatibilityError) do + interpolate(:default => euc_jp('ã“ã‚“ã«ã¡ã¯ã€%{name}ã•ã‚“!'), :name => 'ゆãã²ã‚') + end + end + + test "interpolation: given a utf-8 translation and a euc-jp value it raises Encoding::CompatibilityError" do + assert_raise(Encoding::CompatibilityError) do + interpolate(:default => 'ã“ã‚“ã«ã¡ã¯ã€%{name}ã•ã‚“!', :name => euc_jp('ゆãã²ã‚')) + end + end + + test "interpolation: ASCII strings in the backend should be encoded to UTF8 if interpolation options are in UTF8" do + I18n.backend.store_translations 'en', 'encoding' => ('%{who} let me go'.force_encoding("ASCII")) + result = I18n.t 'encoding', :who => "mÃ¥mmÃ¥ miÃ¥" + assert_equal Encoding::UTF_8, result.encoding + end + + test "interpolation: UTF8 strings in the backend are still returned as UTF8 with ASCII interpolation" do + I18n.backend.store_translations 'en', 'encoding' => 'mÃ¥mmÃ¥ miÃ¥ %{what}' + result = I18n.t 'encoding', :what => 'let me go'.force_encoding("ASCII") + assert_equal Encoding::UTF_8, result.encoding + end + + test "interpolation: UTF8 strings in the backend are still returned as UTF8 even with numbers interpolation" do + I18n.backend.store_translations 'en', 'encoding' => '%{count} times: mÃ¥mmÃ¥ miÃ¥' + result = I18n.t 'encoding', :count => 3 + assert_equal Encoding::UTF_8, result.encoding + end + end + + test "interpolation: given a translations containing a reserved key it raises I18n::ReservedInterpolationKey" do + assert_raise(I18n::ReservedInterpolationKey) { interpolate(:default => '%{default}', :foo => :bar) } + assert_raise(I18n::ReservedInterpolationKey) { interpolate(:default => '%{scope}', :foo => :bar) } + assert_raise(I18n::ReservedInterpolationKey) { interpolate(:default => '%{separator}', :foo => :bar) } + end + + test "interpolation: deep interpolation for default string" do + assert_equal 'Hi %{name}!', interpolate(:default => 'Hi %{name}!', :deep_interpolation => true) + end + + test "interpolation: deep interpolation for interpolated string" do + assert_equal 'Hi Ann!', interpolate(:default => 'Hi %{name}!', :name => 'Ann', :deep_interpolation => true) + end + + test "interpolation: deep interpolation for Hash" do + people = { :people => { :ann => 'Ann is %{ann}', :john => 'John is %{john}' } } + interpolated_people = { :people => { :ann => 'Ann is good', :john => 'John is big' } } + assert_equal interpolated_people, interpolate(:default => people, :ann => 'good', :john => 'big', :deep_interpolation => true) + end + + test "interpolation: deep interpolation for Array" do + people = { :people => ['Ann is %{ann}', 'John is %{john}'] } + interpolated_people = { :people => ['Ann is good', 'John is big'] } + assert_equal interpolated_people, interpolate(:default => people, :ann => 'good', :john => 'big', :deep_interpolation => true) + end + + protected + + def capture(stream) + begin + stream = stream.to_s + eval "$#{stream} = StringIO.new" + yield + result = eval("$#{stream}").string + ensure + eval("$#{stream} = #{stream.upcase}") + end + + result + end + + def euc_jp(string) + string.encode!(Encoding::EUC_JP) + end + + def interpolate(*args) + options = args.last.is_a?(Hash) ? args.pop : {} + key = args.pop + I18n.backend.translate('en', key, options) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/link.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/link.rb new file mode 100644 index 0000000..da84a2c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/link.rb @@ -0,0 +1,56 @@ +# encoding: utf-8 + +module I18n + module Tests + module Link + test "linked lookup: if a key resolves to a symbol it looks up the symbol" do + I18n.backend.store_translations 'en', { + :link => :linked, + :linked => 'linked' + } + assert_equal 'linked', I18n.backend.translate('en', :link) + end + + test "linked lookup: if a key resolves to a dot-separated symbol it looks up the symbol" do + I18n.backend.store_translations 'en', { + :link => :"foo.linked", + :foo => { :linked => 'linked' } + } + assert_equal('linked', I18n.backend.translate('en', :link)) + end + + test "linked lookup: if a dot-separated key resolves to a symbol it looks up the symbol" do + I18n.backend.store_translations 'en', { + :foo => { :link => :linked }, + :linked => 'linked' + } + assert_equal('linked', I18n.backend.translate('en', :'foo.link')) + end + + test "linked lookup: if a dot-separated key resolves to a dot-separated symbol it looks up the symbol" do + I18n.backend.store_translations 'en', { + :foo => { :link => :"bar.linked" }, + :bar => { :linked => 'linked' } + } + assert_equal('linked', I18n.backend.translate('en', :'foo.link')) + end + + test "linked lookup: links always refer to the absolute key" do + I18n.backend.store_translations 'en', { + :foo => { :link => :linked, :linked => 'linked in foo' }, + :linked => 'linked absolutely' + } + assert_equal 'linked absolutely', I18n.backend.translate('en', :link, :scope => :foo) + end + + test "linked lookup: a link can resolve to a namespace in the middle of a dot-separated key" do + I18n.backend.store_translations 'en', { + :activemodel => { :errors => { :messages => { :blank => "can't be blank" } } }, + :activerecord => { :errors => { :messages => :"activemodel.errors.messages" } } + } + assert_equal "can't be blank", I18n.t(:"activerecord.errors.messages.blank") + assert_equal "can't be blank", I18n.t(:"activerecord.errors.messages.blank") + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization.rb new file mode 100644 index 0000000..53b1502 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization.rb @@ -0,0 +1,19 @@ +module I18n + module Tests + module Localization + autoload :Date, 'i18n/tests/localization/date' + autoload :DateTime, 'i18n/tests/localization/date_time' + autoload :Time, 'i18n/tests/localization/time' + autoload :Procs, 'i18n/tests/localization/procs' + + def self.included(base) + base.class_eval do + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Procs + include I18n::Tests::Localization::Time + end + end + end + end +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/date.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/date.rb new file mode 100644 index 0000000..fba5fe5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/date.rb @@ -0,0 +1,95 @@ +# encoding: utf-8 + +module I18n + module Tests + module Localization + module Date + def setup + super + setup_date_translations + @date = ::Date.new(2008, 3, 1) + end + + test "localize Date: given the short format it uses it" do + # TODO should be Mrz, shouldn't it? + assert_equal '01. Mar', I18n.l(@date, :format => :short, :locale => :de) + end + + test "localize Date: given the long format it uses it" do + assert_equal '01. März 2008', I18n.l(@date, :format => :long, :locale => :de) + end + + test "localize Date: given the default format it uses it" do + assert_equal '01.03.2008', I18n.l(@date, :format => :default, :locale => :de) + end + + test "localize Date: given a day name format it returns the correct day name" do + assert_equal 'Samstag', I18n.l(@date, :format => '%A', :locale => :de) + end + + test "localize Date: given an abbreviated day name format it returns the correct abbreviated day name" do + assert_equal 'Sa', I18n.l(@date, :format => '%a', :locale => :de) + end + + test "localize Date: given a month name format it returns the correct month name" do + assert_equal 'März', I18n.l(@date, :format => '%B', :locale => :de) + end + + test "localize Date: given an abbreviated month name format it returns the correct abbreviated month name" do + # TODO should be Mrz, shouldn't it? + assert_equal 'Mar', I18n.l(@date, :format => '%b', :locale => :de) + end + + test "localize Date: given an unknown format it does not fail" do + assert_nothing_raised { I18n.l(@date, :format => '%x') } + end + + test "localize Date: does not modify the options hash" do + options = { :format => '%b', :locale => :de } + assert_equal 'Mar', I18n.l(@date, options) + assert_equal({ :format => '%b', :locale => :de }, options) + assert_nothing_raised { I18n.l(@date, options.freeze) } + end + + test "localize Date: given nil with default value it returns default" do + assert_equal 'default', I18n.l(nil, :default => 'default') + end + + test "localize Date: given nil it raises I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.l(nil) } + end + + test "localize Date: given a plain Object it raises I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.l(Object.new) } + end + + test "localize Date: given a format is missing it raises I18n::MissingTranslationData" do + assert_raise(I18n::MissingTranslationData) { I18n.l(@date, :format => :missing) } + end + + test "localize Date: it does not alter the format string" do + assert_equal '01. Februar 2009', I18n.l(::Date.parse('2009-02-01'), :format => :long, :locale => :de) + assert_equal '01. Oktober 2009', I18n.l(::Date.parse('2009-10-01'), :format => :long, :locale => :de) + end + + protected + + def setup_date_translations + I18n.backend.store_translations :de, { + :date => { + :formats => { + :default => "%d.%m.%Y", + :short => "%d. %b", + :long => "%d. %B %Y", + }, + :day_names => %w(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag), + :abbr_day_names => %w(So Mo Di Mi Do Fr Sa), + :month_names => %w(Januar Februar März April Mai Juni Juli August September Oktober November Dezember).unshift(nil), + :abbr_month_names => %w(Jan Feb Mar Apr Mai Jun Jul Aug Sep Okt Nov Dez).unshift(nil) + } + } + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/date_time.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/date_time.rb new file mode 100644 index 0000000..7a30bff --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/date_time.rb @@ -0,0 +1,82 @@ +# encoding: utf-8 + +module I18n + module Tests + module Localization + module DateTime + def setup + super + setup_datetime_translations + @datetime = ::DateTime.new(2008, 3, 1, 6) + @other_datetime = ::DateTime.new(2008, 3, 1, 18) + end + + test "localize DateTime: given the short format it uses it" do + # TODO should be Mrz, shouldn't it? + assert_equal '01. Mar 06:00', I18n.l(@datetime, :format => :short, :locale => :de) + end + + test "localize DateTime: given the long format it uses it" do + assert_equal '01. März 2008 06:00', I18n.l(@datetime, :format => :long, :locale => :de) + end + + test "localize DateTime: given the default format it uses it" do + # TODO should be Mrz, shouldn't it? + assert_equal 'Sa, 01. Mar 2008 06:00:00 +0000', I18n.l(@datetime, :format => :default, :locale => :de) + end + + test "localize DateTime: given a day name format it returns the correct day name" do + assert_equal 'Samstag', I18n.l(@datetime, :format => '%A', :locale => :de) + end + + test "localize DateTime: given an abbreviated day name format it returns the correct abbreviated day name" do + assert_equal 'Sa', I18n.l(@datetime, :format => '%a', :locale => :de) + end + + test "localize DateTime: given a month name format it returns the correct month name" do + assert_equal 'März', I18n.l(@datetime, :format => '%B', :locale => :de) + end + + test "localize DateTime: given an abbreviated month name format it returns the correct abbreviated month name" do + # TODO should be Mrz, shouldn't it? + assert_equal 'Mar', I18n.l(@datetime, :format => '%b', :locale => :de) + end + + test "localize DateTime: given a meridian indicator format it returns the correct meridian indicator" do + assert_equal 'AM', I18n.l(@datetime, :format => '%p', :locale => :de) + assert_equal 'PM', I18n.l(@other_datetime, :format => '%p', :locale => :de) + end + + test "localize DateTime: given a meridian indicator format it returns the correct meridian indicator in downcase" do + assert_equal 'am', I18n.l(@datetime, :format => '%P', :locale => :de) + assert_equal 'pm', I18n.l(@other_datetime, :format => '%P', :locale => :de) + end + + test "localize DateTime: given an unknown format it does not fail" do + assert_nothing_raised { I18n.l(@datetime, :format => '%x') } + end + + test "localize DateTime: given a format is missing it raises I18n::MissingTranslationData" do + assert_raise(I18n::MissingTranslationData) { I18n.l(@datetime, :format => :missing) } + end + + protected + + def setup_datetime_translations + # time translations might have been set up in Tests::Api::Localization::Time + I18n.backend.store_translations :de, { + :time => { + :formats => { + :default => "%a, %d. %b %Y %H:%M:%S %z", + :short => "%d. %b %H:%M", + :long => "%d. %B %Y %H:%M" + }, + :am => 'am', + :pm => 'pm' + } + } + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/procs.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/procs.rb new file mode 100644 index 0000000..de62488 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/procs.rb @@ -0,0 +1,116 @@ +# encoding: utf-8 + +module I18n + module Tests + module Localization + module Procs + test "localize: using day names from lambdas" do + setup_time_proc_translations + time = ::Time.utc(2008, 3, 1, 6, 0) + assert_match(/Суббота/, I18n.l(time, :format => "%A, %d %B", :locale => :ru)) + assert_match(/Ñуббота/, I18n.l(time, :format => "%d %B (%A)", :locale => :ru)) + end + + test "localize: using month names from lambdas" do + setup_time_proc_translations + time = ::Time.utc(2008, 3, 1, 6, 0) + assert_match(/марта/, I18n.l(time, :format => "%d %B %Y", :locale => :ru)) + assert_match(/Март /, I18n.l(time, :format => "%B %Y", :locale => :ru)) + end + + test "localize: using abbreviated day names from lambdas" do + setup_time_proc_translations + time = ::Time.utc(2008, 3, 1, 6, 0) + assert_match(/марта/, I18n.l(time, :format => "%d %b %Y", :locale => :ru)) + assert_match(/март /, I18n.l(time, :format => "%b %Y", :locale => :ru)) + end + + test "localize Date: given a format that resolves to a Proc it calls the Proc with the object" do + setup_time_proc_translations + date = ::Date.new(2008, 3, 1) + assert_equal '[Sat, 01 Mar 2008, {}]', I18n.l(date, :format => :proc, :locale => :ru) + end + + test "localize Date: given a format that resolves to a Proc it calls the Proc with the object and extra options" do + setup_time_proc_translations + date = ::Date.new(2008, 3, 1) + assert_equal '[Sat, 01 Mar 2008, {:foo=>"foo"}]', I18n.l(date, :format => :proc, :foo => 'foo', :locale => :ru) + end + + test "localize DateTime: given a format that resolves to a Proc it calls the Proc with the object" do + setup_time_proc_translations + datetime = ::DateTime.new(2008, 3, 1, 6) + assert_equal '[Sat, 01 Mar 2008 06:00:00 +00:00, {}]', I18n.l(datetime, :format => :proc, :locale => :ru) + end + + test "localize DateTime: given a format that resolves to a Proc it calls the Proc with the object and extra options" do + setup_time_proc_translations + datetime = ::DateTime.new(2008, 3, 1, 6) + assert_equal '[Sat, 01 Mar 2008 06:00:00 +00:00, {:foo=>"foo"}]', I18n.l(datetime, :format => :proc, :foo => 'foo', :locale => :ru) + end + + test "localize Time: given a format that resolves to a Proc it calls the Proc with the object" do + setup_time_proc_translations + time = ::Time.utc(2008, 3, 1, 6, 0) + assert_equal I18n::Tests::Localization::Procs.inspect_args([time, {}]), I18n.l(time, :format => :proc, :locale => :ru) + end + + test "localize Time: given a format that resolves to a Proc it calls the Proc with the object and extra options" do + setup_time_proc_translations + time = ::Time.utc(2008, 3, 1, 6, 0) + options = { :foo => 'foo' } + assert_equal I18n::Tests::Localization::Procs.inspect_args([time, options]), I18n.l(time, options.merge(:format => :proc, :locale => :ru)) + end + + protected + + def self.inspect_args(args) + args = args.map do |arg| + case arg + when ::Time, ::DateTime + arg.strftime('%a, %d %b %Y %H:%M:%S %Z').sub('+0000', '+00:00') + when ::Date + arg.strftime('%a, %d %b %Y') + when Hash + arg.delete(:fallback_in_progress) + arg.inspect + else + arg.inspect + end + end + "[#{args.join(', ')}]" + end + + def setup_time_proc_translations + I18n.backend.store_translations :ru, { + :time => { + :formats => { + :proc => lambda { |*args| I18n::Tests::Localization::Procs.inspect_args(args) } + } + }, + :date => { + :formats => { + :proc => lambda { |*args| I18n::Tests::Localization::Procs.inspect_args(args) } + }, + :'day_names' => lambda { |key, options| + (options[:format] =~ /^%A/) ? + %w(ВоÑкреÑенье Понедельник Вторник Среда Четверг ПÑтница Суббота) : + %w(воÑкреÑенье понедельник вторник Ñреда четверг пÑтница Ñуббота) + }, + :'month_names' => lambda { |key, options| + (options[:format] =~ /(%d|%e)(\s*)?(%B)/) ? + %w(ÑÐ½Ð²Ð°Ñ€Ñ Ñ„ÐµÐ²Ñ€Ð°Ð»Ñ Ð¼Ð°Ñ€Ñ‚Ð° Ð°Ð¿Ñ€ÐµÐ»Ñ Ð¼Ð°Ñ Ð¸ÑŽÐ½Ñ Ð¸ÑŽÐ»Ñ Ð°Ð²Ð³ÑƒÑта ÑентÑÐ±Ñ€Ñ Ð¾ÐºÑ‚ÑÐ±Ñ€Ñ Ð½Ð¾ÑÐ±Ñ€Ñ Ð´ÐµÐºÐ°Ð±Ñ€Ñ).unshift(nil) : + %w(Январь Февраль Март Ðпрель Май Июнь Июль ÐвгуÑÑ‚ СентÑбрь ОктÑбрь ÐоÑбрь Декабрь).unshift(nil) + }, + :'abbr_month_names' => lambda { |key, options| + (options[:format] =~ /(%d|%e)(\s*)(%b)/) ? + %w(Ñнв. февр. марта апр. Ð¼Ð°Ñ Ð¸ÑŽÐ½Ñ Ð¸ÑŽÐ»Ñ Ð°Ð²Ð³. Ñент. окт. ноÑб. дек.).unshift(nil) : + %w(Ñнв. февр. март апр. май июнь июль авг. Ñент. окт. ноÑб. дек.).unshift(nil) + }, + } + } + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/time.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/time.rb new file mode 100644 index 0000000..8bbba43 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/localization/time.rb @@ -0,0 +1,81 @@ +# encoding: utf-8 + +module I18n + module Tests + module Localization + module Time + def setup + super + setup_time_translations + @time = ::Time.utc(2008, 3, 1, 6, 0) + @other_time = ::Time.utc(2008, 3, 1, 18, 0) + end + + test "localize Time: given the short format it uses it" do + # TODO should be Mrz, shouldn't it? + assert_equal '01. Mar 06:00', I18n.l(@time, :format => :short, :locale => :de) + end + + test "localize Time: given the long format it uses it" do + assert_equal '01. März 2008 06:00', I18n.l(@time, :format => :long, :locale => :de) + end + + # TODO Seems to break on Windows because ENV['TZ'] is ignored. What's a better way to do this? + # def test_localize_given_the_default_format_it_uses_it + # assert_equal 'Sa, 01. Mar 2008 06:00:00 +0000', I18n.l(@time, :format => :default, :locale => :de) + # end + + test "localize Time: given a day name format it returns the correct day name" do + assert_equal 'Samstag', I18n.l(@time, :format => '%A', :locale => :de) + end + + test "localize Time: given an abbreviated day name format it returns the correct abbreviated day name" do + assert_equal 'Sa', I18n.l(@time, :format => '%a', :locale => :de) + end + + test "localize Time: given a month name format it returns the correct month name" do + assert_equal 'März', I18n.l(@time, :format => '%B', :locale => :de) + end + + test "localize Time: given an abbreviated month name format it returns the correct abbreviated month name" do + # TODO should be Mrz, shouldn't it? + assert_equal 'Mar', I18n.l(@time, :format => '%b', :locale => :de) + end + + test "localize Time: given a meridian indicator format it returns the correct meridian indicator" do + assert_equal 'AM', I18n.l(@time, :format => '%p', :locale => :de) + assert_equal 'PM', I18n.l(@other_time, :format => '%p', :locale => :de) + end + + test "localize Time: given a meridian indicator format it returns the correct meridian indicator in upcase" do + assert_equal 'am', I18n.l(@time, :format => '%P', :locale => :de) + assert_equal 'pm', I18n.l(@other_time, :format => '%P', :locale => :de) + end + + test "localize Time: given an unknown format it does not fail" do + assert_nothing_raised { I18n.l(@time, :format => '%x') } + end + + test "localize Time: given a format is missing it raises I18n::MissingTranslationData" do + assert_raise(I18n::MissingTranslationData) { I18n.l(@time, :format => :missing) } + end + + protected + + def setup_time_translations + I18n.backend.store_translations :de, { + :time => { + :formats => { + :default => "%a, %d. %b %Y %H:%M:%S %z", + :short => "%d. %b %H:%M", + :long => "%d. %B %Y %H:%M", + }, + :am => 'am', + :pm => 'pm' + } + } + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/lookup.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/lookup.rb new file mode 100644 index 0000000..3b4c843 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/lookup.rb @@ -0,0 +1,81 @@ +# encoding: utf-8 + +module I18n + module Tests + module Lookup + def setup + super + I18n.backend.store_translations(:en, :foo => { :bar => 'bar', :baz => 'baz' }, :falsy => false, :truthy => true, + :string => "a", :array => %w(a b c), :hash => { "a" => "b" }) + end + + test "lookup: it returns a string" do + assert_equal("a", I18n.t(:string)) + end + + test "lookup: it returns hash" do + assert_equal({ :a => "b" }, I18n.t(:hash)) + end + + test "lookup: it returns an array" do + assert_equal(%w(a b c), I18n.t(:array)) + end + + test "lookup: it returns a native true" do + assert I18n.t(:truthy) === true + end + + test "lookup: it returns a native false" do + assert I18n.t(:falsy) === false + end + + test "lookup: given a missing key, no default and no raise option it returns an error message" do + assert_equal "translation missing: en.missing", I18n.t(:missing) + end + + test "lookup: given a missing key, no default and the raise option it raises MissingTranslationData" do + assert_raise(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) } + end + + test "lookup: does not raise an exception if no translation data is present for the given locale" do + assert_nothing_raised { I18n.t(:foo, :locale => :xx) } + end + + test "lookup: does not modify the options hash" do + options = {} + assert_equal "a", I18n.t(:string, options) + assert_equal({}, options) + assert_nothing_raised { I18n.t(:string, options.freeze) } + end + + test "lookup: given an array of keys it translates all of them" do + assert_equal %w(bar baz), I18n.t([:bar, :baz], :scope => [:foo]) + end + + test "lookup: using a custom scope separator" do + # data must have been stored using the custom separator when using the ActiveRecord backend + I18n.backend.store_translations(:en, { :foo => { :bar => 'bar' } }, { :separator => '|' }) + assert_equal 'bar', I18n.t('foo|bar', :separator => '|') + end + + # In fact it probably *should* fail but Rails currently relies on using the default locale instead. + # So we'll stick to this for now until we get it fixed in Rails. + test "lookup: given nil as a locale it does not raise but use the default locale" do + # assert_raise(I18n::InvalidLocale) { I18n.t(:bar, :locale => nil) } + assert_nothing_raised { I18n.t(:bar, :locale => nil) } + end + + test "lookup: a resulting String is not frozen" do + assert !I18n.t(:string).frozen? + end + + test "lookup: a resulting Array is not frozen" do + assert !I18n.t(:array).frozen? + end + + test "lookup: a resulting Hash is not frozen" do + assert !I18n.t(:hash).frozen? + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/pluralization.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/pluralization.rb new file mode 100644 index 0000000..d3319dc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/pluralization.rb @@ -0,0 +1,35 @@ +# encoding: utf-8 + +module I18n + module Tests + module Pluralization + test "pluralization: given 0 it returns the :zero translation if it is defined" do + assert_equal 'zero', I18n.t(:default => { :zero => 'zero' }, :count => 0) + end + + test "pluralization: given 0 it returns the :other translation if :zero is not defined" do + assert_equal 'bars', I18n.t(:default => { :other => 'bars' }, :count => 0) + end + + test "pluralization: given 1 it returns the singular translation" do + assert_equal 'bar', I18n.t(:default => { :one => 'bar' }, :count => 1) + end + + test "pluralization: given 2 it returns the :other translation" do + assert_equal 'bars', I18n.t(:default => { :other => 'bars' }, :count => 2) + end + + test "pluralization: given 3 it returns the :other translation" do + assert_equal 'bars', I18n.t(:default => { :other => 'bars' }, :count => 3) + end + + test "pluralization: given nil it returns the whole entry" do + assert_equal({ :one => 'bar' }, I18n.t(:default => { :one => 'bar' }, :count => nil)) + end + + test "pluralization: given incomplete pluralization data it raises I18n::InvalidPluralizationData" do + assert_raise(I18n::InvalidPluralizationData) { I18n.t(:default => { :one => 'bar' }, :count => 2) } + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/procs.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/procs.rb new file mode 100644 index 0000000..aa2df19 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/tests/procs.rb @@ -0,0 +1,55 @@ +# encoding: utf-8 + +module I18n + module Tests + module Procs + test "lookup: given a translation is a proc it calls the proc with the key and interpolation values" do + I18n.backend.store_translations(:en, :a_lambda => lambda { |*args| I18n::Tests::Procs.filter_args(*args) }) + assert_equal '[:a_lambda, {:foo=>"foo"}]', I18n.t(:a_lambda, :foo => 'foo') + end + + test "defaults: given a default is a Proc it calls it with the key and interpolation values" do + proc = lambda { |*args| I18n::Tests::Procs.filter_args(*args) } + assert_equal '[nil, {:foo=>"foo"}]', I18n.t(nil, :default => proc, :foo => 'foo') + end + + test "defaults: given a default is a key that resolves to a Proc it calls it with the key and interpolation values" do + the_lambda = lambda { |*args| I18n::Tests::Procs.filter_args(*args) } + I18n.backend.store_translations(:en, :a_lambda => the_lambda) + assert_equal '[:a_lambda, {:foo=>"foo"}]', I18n.t(nil, :default => :a_lambda, :foo => 'foo') + assert_equal '[:a_lambda, {:foo=>"foo"}]', I18n.t(nil, :default => [nil, :a_lambda], :foo => 'foo') + end + + test "interpolation: given an interpolation value is a lambda it calls it with key and values before interpolating it" do + proc = lambda { |*args| I18n::Tests::Procs.filter_args(*args) } + assert_match %r(\[\{:foo=>#\}\]), I18n.t(nil, :default => '%{foo}', :foo => proc) + end + + test "interpolation: given a key resolves to a Proc that returns a string then interpolation still works" do + proc = lambda { |*args| "%{foo}: " + I18n::Tests::Procs.filter_args(*args) } + assert_equal 'foo: [nil, {:foo=>"foo"}]', I18n.t(nil, :default => proc, :foo => 'foo') + end + + test "pluralization: given a key resolves to a Proc that returns valid data then pluralization still works" do + proc = lambda { |*args| { :zero => 'zero', :one => 'one', :other => 'other' } } + assert_equal 'zero', I18n.t(:default => proc, :count => 0) + assert_equal 'one', I18n.t(:default => proc, :count => 1) + assert_equal 'other', I18n.t(:default => proc, :count => 2) + end + + test "lookup: given the option :resolve => false was passed it does not resolve proc translations" do + I18n.backend.store_translations(:en, :a_lambda => lambda { |*args| I18n::Tests::Procs.filter_args(*args) }) + assert_equal Proc, I18n.t(:a_lambda, :resolve => false).class + end + + test "lookup: given the option :resolve => false was passed it does not resolve proc default" do + assert_equal Proc, I18n.t(nil, :default => lambda { |*args| I18n::Tests::Procs.filter_args(*args) }, :resolve => false).class + end + + + def self.filter_args(*args) + args.map {|arg| arg.delete(:fallback_in_progress) if arg.is_a?(Hash) ; arg }.inspect + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/version.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/version.rb new file mode 100644 index 0000000..be10a9f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/lib/i18n/version.rb @@ -0,0 +1,3 @@ +module I18n + VERSION = "0.9.1" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/all_features_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/all_features_test.rb new file mode 100644 index 0000000..a1799bd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/all_features_test.rb @@ -0,0 +1,58 @@ +require 'test_helper' + +begin + require 'rubygems' + require 'active_support' +rescue LoadError + puts "not testing with Cache enabled because active_support can not be found" +end + +class I18nAllFeaturesApiTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Metadata + include I18n::Backend::Cache + include I18n::Backend::Cascade + include I18n::Backend::Fallbacks + include I18n::Backend::Pluralization + include I18n::Backend::Memoize + end + + def setup + I18n.backend = I18n::Backend::Chain.new(Backend.new, I18n::Backend::Simple.new) + I18n.cache_store = cache_store + super + end + + def teardown + I18n.cache_store.clear if I18n.cache_store + I18n.cache_store = nil + super + end + + def cache_store + ActiveSupport::Cache.lookup_store(:memory_store) if cache_available? + end + + def cache_available? + defined?(ActiveSupport) && defined?(ActiveSupport::Cache) + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use a Chain backend with an all features backend" do + assert_equal I18n::Backend::Chain, I18n.backend.class + assert_equal Backend, I18n.backend.backends.first.class + end + + # links: test that keys stored on one backend can link to keys stored on another backend +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/cascade_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/cascade_test.rb new file mode 100644 index 0000000..4d9516c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/cascade_test.rb @@ -0,0 +1,28 @@ +require 'test_helper' + +class I18nCascadeApiTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Cascade + end + + def setup + I18n.backend = Backend.new + super + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use a backend with Cascade included" do + assert_equal Backend, I18n.backend.class + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/chain_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/chain_test.rb new file mode 100644 index 0000000..f3dff1b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/chain_test.rb @@ -0,0 +1,24 @@ +require 'test_helper' + +class I18nApiChainTest < I18n::TestCase + def setup + super + I18n.backend = I18n::Backend::Chain.new(I18n::Backend::Simple.new, I18n.backend) + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use the Chain backend" do + assert_equal I18n::Backend::Chain, I18n.backend.class + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/fallbacks_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/fallbacks_test.rb new file mode 100644 index 0000000..e5ca5f2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/fallbacks_test.rb @@ -0,0 +1,30 @@ +require 'test_helper' + +class I18nFallbacksApiTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + end + + def setup + I18n.backend = Backend.new + super + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use a backend with Fallbacks included" do + assert_equal Backend, I18n.backend.class + end + + # links: test that keys stored on one backend can link to keys stored on another backend +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/key_value_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/key_value_test.rb new file mode 100644 index 0000000..4d6cdd8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/key_value_test.rb @@ -0,0 +1,24 @@ +require 'test_helper' + +class I18nKeyValueApiTest < I18n::TestCase + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + # include Tests::Api::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + # include Tests::Api::Localization::Procs + + def setup + I18n.backend = I18n::Backend::KeyValue.new({}) + super + end + + test "make sure we use the KeyValue backend" do + assert_equal I18n::Backend::KeyValue, I18n.backend.class + end +end if I18n::TestCase.key_value? diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/memoize_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/memoize_test.rb new file mode 100644 index 0000000..ed93866 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/memoize_test.rb @@ -0,0 +1,56 @@ +require 'test_helper' + +class I18nMemoizeBackendWithSimpleApiTest < I18n::TestCase + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + class MemoizeBackend < I18n::Backend::Simple + include I18n::Backend::Memoize + end + + def setup + I18n.backend = MemoizeBackend.new + super + end + + test "make sure we use the MemoizeBackend backend" do + assert_equal MemoizeBackend, I18n.backend.class + end +end + +class I18nMemoizeBackendWithKeyValueApiTest < I18n::TestCase + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + + # include I18n::Tests::Procs + # include I18n::Tests::Localization::Procs + + class MemoizeBackend < I18n::Backend::KeyValue + include I18n::Backend::Memoize + end + + def setup + I18n.backend = MemoizeBackend.new({}) + super + end + + test "make sure we use the MemoizeBackend backend" do + assert_equal MemoizeBackend, I18n.backend.class + end +end if I18n::TestCase.key_value? diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/override_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/override_test.rb new file mode 100644 index 0000000..6e1248a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/override_test.rb @@ -0,0 +1,42 @@ +require 'test_helper' + +class I18nOverrideTest < I18n::TestCase + module OverrideInverse + def translate(*args) + super(*args).reverse + end + alias :t :translate + end + + module OverrideSignature + def translate(*args) + args.first + args[1] + end + alias :t :translate + end + + def setup + super + @I18n = I18n.dup + @I18n.backend = I18n::Backend::Simple.new + end + + test "make sure modules can overwrite I18n methods" do + @I18n.extend OverrideInverse + @I18n.backend.store_translations('en', :foo => 'bar') + + assert_equal 'rab', @I18n.translate(:foo, :locale => 'en') + assert_equal 'rab', @I18n.t(:foo, :locale => 'en') + assert_equal 'rab', @I18n.translate!(:foo, :locale => 'en') + assert_equal 'rab', @I18n.t!(:foo, :locale => 'en') + end + + test "make sure modules can overwrite I18n signature" do + exception = catch(:exception) do + @I18n.t('Hello', 'Welcome message on home page', :tokenize => true, :throw => true) + end + assert exception.message + @I18n.extend OverrideSignature + assert_equal 'HelloWelcome message on home page', @I18n.translate('Hello', 'Welcome message on home page', :tokenize => true) # tr8n example + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/pluralization_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/pluralization_test.rb new file mode 100644 index 0000000..53004be --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/pluralization_test.rb @@ -0,0 +1,30 @@ +require 'test_helper' + +class I18nPluralizationApiTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Pluralization + end + + def setup + I18n.backend = Backend.new + super + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use a backend with Pluralization included" do + assert_equal Backend, I18n.backend.class + end + + # links: test that keys stored on one backend can link to keys stored on another backend +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/simple_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/simple_test.rb new file mode 100644 index 0000000..3fd3a42 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/api/simple_test.rb @@ -0,0 +1,28 @@ +require 'test_helper' + +class I18nSimpleBackendApiTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Pluralization + end + + def setup + I18n.backend = I18n::Backend::Simple.new + super + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use the Simple backend" do + assert_equal I18n::Backend::Simple, I18n.backend.class + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/cache_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/cache_test.rb new file mode 100644 index 0000000..3f44a6d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/cache_test.rb @@ -0,0 +1,109 @@ +require 'test_helper' +require 'digest/md5' + +begin + require 'active_support' +rescue LoadError + $stderr.puts "Skipping cache tests using ActiveSupport" +else + +class I18nBackendCacheTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Cache + end + + def setup + I18n.backend = Backend.new + super + I18n.cache_store = ActiveSupport::Cache.lookup_store(:memory_store) + I18n.cache_key_digest = nil + end + + def teardown + super + I18n.cache_store = nil + end + + test "it uses the cache" do + assert I18n.cache_store.is_a?(ActiveSupport::Cache::MemoryStore) + end + + test "translate hits the backend and caches the response" do + I18n.backend.expects(:lookup).returns('Foo') + assert_equal 'Foo', I18n.t(:foo) + + I18n.backend.expects(:lookup).never + assert_equal 'Foo', I18n.t(:foo) + + I18n.backend.expects(:lookup).returns('Bar') + assert_equal 'Bar', I18n.t(:bar) + end + + test "translate returns a cached false response" do + I18n.backend.expects(:lookup).never + I18n.cache_store.expects(:read).returns(false) + assert_equal false, I18n.t(:foo) + end + + test "still raises MissingTranslationData but also caches it" do + assert_raise(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) } + assert_raise(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) } + assert_equal 1, I18n.cache_store.instance_variable_get(:@data).size + + # I18n.backend.expects(:lookup).returns(nil) + # assert_raise(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) } + # I18n.backend.expects(:lookup).never + # assert_raise(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) } + end + + test "uses 'i18n' as a cache key namespace by default" do + assert_equal 0, I18n.backend.send(:cache_key, :en, :foo, {}).index('i18n') + end + + test "adds a custom cache key namespace" do + with_cache_namespace('bar') do + assert_equal 0, I18n.backend.send(:cache_key, :en, :foo, {}).index('i18n/bar/') + end + end + + test "adds locale and hash of key and hash of options" do + options = { :bar=>1 } + options_hash = RUBY_VERSION <= "1.9" ? options.inspect.hash : options.hash + assert_equal "i18n//en/#{:foo.hash}/#{options_hash}", I18n.backend.send(:cache_key, :en, :foo, options) + end + + test "cache_key uses configured digest method" do + md5 = Digest::MD5.new + options = { :bar=>1 } + options_hash = options.inspect + with_cache_key_digest(md5) do + assert_equal "i18n//en/#{md5.hexdigest(:foo.to_s)}/#{md5.hexdigest(options_hash)}", I18n.backend.send(:cache_key, :en, :foo, options) + end + end + + test "keys should not be equal" do + interpolation_values1 = { :foo => 1, :bar => 2 } + interpolation_values2 = { :foo => 2, :bar => 1 } + + key1 = I18n.backend.send(:cache_key, :en, :some_key, interpolation_values1) + key2 = I18n.backend.send(:cache_key, :en, :some_key, interpolation_values2) + + assert key1 != key2 + end + + protected + + def with_cache_namespace(namespace) + I18n.cache_namespace = namespace + yield + I18n.cache_namespace = nil + end + + def with_cache_key_digest(digest) + I18n.cache_key_digest = digest + yield + I18n.cache_key_digest = nil + end +end + +end # AS cache check diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/cascade_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/cascade_test.rb new file mode 100644 index 0000000..1101460 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/cascade_test.rb @@ -0,0 +1,86 @@ +require 'test_helper' + +class I18nBackendCascadeTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Cascade + end + + def setup + super + I18n.backend = Backend.new + store_translations(:en, :foo => 'foo', :bar => { :baz => 'baz' }) + @cascade_options = { :step => 1, :offset => 1, :skip_root => false } + end + + def lookup(key, options = {}) + I18n.t(key, options.merge(:cascade => @cascade_options)) + end + + test "still returns an existing translation as usual" do + assert_equal 'foo', lookup(:foo) + assert_equal 'baz', lookup(:'bar.baz') + end + + test "falls back by cutting keys off the end of the scope" do + assert_equal 'foo', lookup(:foo, :scope => :'missing') + assert_equal 'foo', lookup(:foo, :scope => :'missing.missing') + assert_equal 'baz', lookup(:baz, :scope => :'bar.missing') + assert_equal 'baz', lookup(:baz, :scope => :'bar.missing.missing') + end + + test "raises I18n::MissingTranslationData exception when no translation was found" do + assert_raise(I18n::MissingTranslationData) { lookup(:'foo.missing', :raise => true) } + assert_raise(I18n::MissingTranslationData) { lookup(:'bar.baz.missing', :raise => true) } + assert_raise(I18n::MissingTranslationData) { lookup(:'missing.bar.baz', :raise => true) } + end + + test "cascades before evaluating the default" do + assert_equal 'foo', lookup(:foo, :scope => :missing, :default => 'default') + end + + test "cascades defaults, too" do + assert_equal 'foo', lookup(nil, :default => [:'missing.missing', :'missing.foo']) + end + + test "works with :offset => 2 and a single key" do + @cascade_options[:offset] = 2 + lookup(:foo) + end + + test "assemble required fallbacks for ActiveRecord validation messages" do + store_translations(:en, + :errors => { + :odd => 'errors.odd', + :reply => { :title => { :blank => 'errors.reply.title.blank' }, :taken => 'errors.reply.taken' }, + :topic => { :title => { :format => 'errors.topic.title.format' }, :length => 'errors.topic.length' } + } + ) + assert_equal 'errors.reply.title.blank', lookup(:'errors.reply.title.blank', :default => :'errors.topic.title.blank') + assert_equal 'errors.reply.taken', lookup(:'errors.reply.title.taken', :default => :'errors.topic.title.taken') + assert_equal 'errors.topic.title.format', lookup(:'errors.reply.title.format', :default => :'errors.topic.title.format') + assert_equal 'errors.topic.length', lookup(:'errors.reply.title.length', :default => :'errors.topic.title.length') + assert_equal 'errors.odd', lookup(:'errors.reply.title.odd', :default => :'errors.topic.title.odd') + end + + test "assemble action view translation helper lookup cascade" do + @cascade_options[:offset] = 2 + + store_translations(:en, + :menu => { :show => 'menu.show' }, + :namespace => { + :menu => { :new => 'namespace.menu.new' }, + :controller => { + :menu => { :edit => 'namespace.controller.menu.edit' }, + :action => { + :menu => { :destroy => 'namespace.controller.action.menu.destroy' } + } + } + } + ) + + assert_equal 'menu.show', lookup(:'namespace.controller.action.menu.show') + assert_equal 'namespace.menu.new', lookup(:'namespace.controller.action.menu.new') + assert_equal 'namespace.controller.menu.edit', lookup(:'namespace.controller.action.menu.edit') + assert_equal 'namespace.controller.action.menu.destroy', lookup(:'namespace.controller.action.menu.destroy') + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/chain_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/chain_test.rb new file mode 100644 index 0000000..0b402af --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/chain_test.rb @@ -0,0 +1,91 @@ +require 'test_helper' + +class I18nBackendChainTest < I18n::TestCase + def setup + super + @first = backend(:en => { + :foo => 'Foo', :formats => { + :short => 'short', + :subformats => {:short => 'short'}, + }, + :plural_1 => { :one => '%{count}' }, + :dates => {:a => "A"} + }) + @second = backend(:en => { + :bar => 'Bar', :formats => { + :long => 'long', + :subformats => {:long => 'long'}, + }, + :plural_2 => { :one => 'one' }, + :dates => {:a => "B", :b => "B"} + }) + @chain = I18n.backend = I18n::Backend::Chain.new(@first, @second) + end + + test "looks up translations from the first chained backend" do + assert_equal 'Foo', @first.send(:translations)[:en][:foo] + assert_equal 'Foo', I18n.t(:foo) + end + + test "looks up translations from the second chained backend" do + assert_equal 'Bar', @second.send(:translations)[:en][:bar] + assert_equal 'Bar', I18n.t(:bar) + end + + test "defaults only apply to lookups on the last backend in the chain" do + assert_equal 'Foo', I18n.t(:foo, :default => 'Bah') + assert_equal 'Bar', I18n.t(:bar, :default => 'Bah') + assert_equal 'Bah', I18n.t(:bah, :default => 'Bah') # default kicks in only here + end + + test "default" do + assert_equal 'Fuh', I18n.t(:default => 'Fuh') + assert_equal 'Zero', I18n.t(:default => { :zero => 'Zero' }, :count => 0) + assert_equal({ :zero => 'Zero' }, I18n.t(:default => { :zero => 'Zero' })) + assert_equal 'Foo', I18n.t(:default => :foo) + end + + test 'default is returned if translation is missing' do + assert_equal({}, I18n.t(:'i18n.transliterate.rule', :locale => 'en', :default => {})) + end + + test "namespace lookup collects results from all backends and merges deep hashes" do + assert_equal({:long=>"long", :subformats=>{:long=>"long", :short=>"short"}, :short=>"short"}, I18n.t(:formats)) + end + + test "namespace lookup collects results from all backends and lets leftmost backend take priority" do + assert_equal({ :a => "A", :b => "B" }, I18n.t(:dates)) + end + + test "namespace lookup with only the first backend returning a result" do + assert_equal({ :one => '%{count}' }, I18n.t(:plural_1)) + end + + test "pluralization still works" do + assert_equal '1', I18n.t(:plural_1, :count => 1) + assert_equal 'one', I18n.t(:plural_2, :count => 1) + end + + test "bulk lookup collects results from all backends" do + assert_equal ['Foo', 'Bar'], I18n.t([:foo, :bar]) + assert_equal ['Foo', 'Bar', 'Bah'], I18n.t([:foo, :bar, :bah], :default => 'Bah') + assert_equal [{ + :long=>"long", + :subformats=>{:long=>"long", :short=>"short"}, + :short=>"short"}, {:one=>"one"}, + "Bah"], I18n.t([:formats, :plural_2, :bah], :default => 'Bah') + end + + test "store_translations options are not dropped while transfering to backend" do + @first.expects(:store_translations).with(:foo, {:bar => :baz}, {:option => 'persists'}) + I18n.backend.store_translations :foo, {:bar => :baz}, {:option => 'persists'} + end + + protected + + def backend(translations) + backend = I18n::Backend::Simple.new + translations.each { |locale, data| backend.store_translations(locale, data) } + backend + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/exceptions_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/exceptions_test.rb new file mode 100644 index 0000000..cc22166 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/exceptions_test.rb @@ -0,0 +1,36 @@ +require 'test_helper' + +class I18nBackendExceptionsTest < I18n::TestCase + def setup + super + I18n.backend = I18n::Backend::Simple.new + end + + test "throw message: MissingTranslation message from #translate includes the given scope and full key" do + exception = catch(:exception) do + I18n.t(:'baz.missing', :scope => :'foo.bar', :throw => true) + end + assert_equal "translation missing: en.foo.bar.baz.missing", exception.message + end + + test "exceptions: MissingTranslationData message from #translate includes the given scope and full key" do + begin + I18n.t(:'baz.missing', :scope => :'foo.bar', :raise => true) + rescue I18n::MissingTranslationData => exception + end + assert_equal "translation missing: en.foo.bar.baz.missing", exception.message + end + + test "exceptions: MissingTranslationData message from #localize includes the given scope and full key" do + begin + I18n.l(Time.now, :format => :foo) + rescue I18n::MissingTranslationData => exception + end + assert_equal "translation missing: en.time.formats.foo", exception.message + end + + test "exceptions: MissingInterpolationArgument message includes missing key, provided keys and full string" do + exception = I18n::MissingInterpolationArgument.new('key', {:this => 'was given'}, 'string') + assert_equal 'missing interpolation argument "key" in "string" ({:this=>"was given"} given)', exception.message + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/fallbacks_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/fallbacks_test.rb new file mode 100644 index 0000000..a220c03 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/fallbacks_test.rb @@ -0,0 +1,219 @@ +require 'test_helper' + +class I18nBackendFallbacksTranslateTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + end + + def setup + super + I18n.backend = Backend.new + store_translations(:en, :foo => 'Foo in :en', :bar => 'Bar in :en', :buz => 'Buz in :en', :interpolate => 'Interpolate %{value}') + store_translations(:de, :bar => 'Bar in :de', :baz => 'Baz in :de') + store_translations(:'de-DE', :baz => 'Baz in :de-DE') + store_translations(:'pt-BR', :baz => 'Baz in :pt-BR') + end + + test "still returns an existing translation as usual" do + assert_equal 'Foo in :en', I18n.t(:foo, :locale => :en) + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :de) + assert_equal 'Baz in :de-DE', I18n.t(:baz, :locale => :'de-DE') + end + + test "returns interpolated value if no key provided" do + assert_equal 'Interpolate %{value}', I18n.t(:interpolate) + end + + test "returns the :en translation for a missing :de translation" do + assert_equal 'Foo in :en', I18n.t(:foo, :locale => :de) + end + + test "returns the :de translation for a missing :'de-DE' translation" do + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE') + end + + test "returns the :en translation for translation missing in both :de and :'de-De'" do + assert_equal 'Buz in :en', I18n.t(:buz, :locale => :'de-DE') + end + + test "returns the :de translation for a missing :'de-DE' when :default is a String" do + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => "Default Bar") + assert_equal "Default Bar", I18n.t(:missing_bar, :locale => :'de-DE', :default => "Default Bar") + end + + test "returns the :de translation for a missing :'de-DE' when defaults is a Symbol (which exists in :en)" do + assert_equal "Bar in :de", I18n.t(:bar, :locale => :'de-DE', :default => [:buz]) + end + + test "returns the :'de-DE' default :baz translation for a missing :'de-DE' (which exists in :de)" do + assert_equal "Baz in :de-DE", I18n.t(:bar, :locale => :'de-DE', :default => [:baz]) + end + + test "returns the :de translation for a missing :'de-DE' when :default is a Proc" do + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => Proc.new { "Default Bar" }) + assert_equal "Default Bar", I18n.t(:missing_bar, :locale => :'de-DE', :default => Proc.new { "Default Bar" }) + end + + test "returns the :de translation for a missing :'de-DE' when :default is a Hash" do + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => {}) + assert_equal({}, I18n.t(:missing_bar, :locale => :'de-DE', :default => {})) + end + + test "returns the :de translation for a missing :'de-DE' when :default is nil" do + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => nil) + assert_nil I18n.t(:missing_bar, :locale => :'de-DE', :default => nil) + end + + test "returns the translation missing message if the default is also missing" do + assert_equal 'translation missing: de-DE.missing_bar', I18n.t(:missing_bar, :locale => :'de-DE', :default => [:missing_baz]) + end + + test "returns the :'de-DE' default :baz translation for a missing :'de-DE' when defaults contains Symbol" do + assert_equal 'Baz in :de-DE', I18n.t(:missing_foo, :locale => :'de-DE', :default => [:baz, "Default Bar"]) + end + + test "returns the defaults translation for a missing :'de-DE' when defaults contains a String or Proc before Symbol" do + assert_equal "Default Bar", I18n.t(:missing_foo, :locale => :'de-DE', :default => [:missing_bar, "Default Bar", :baz]) + assert_equal "Default Bar", I18n.t(:missing_foo, :locale => :'de-DE', :default => [:missing_bar, Proc.new { "Default Bar" }, :baz]) + end + + test "returns the default translation for a missing :'de-DE' and existing :de when default is a Hash" do + assert_equal 'Default 6 Bars', I18n.t(:missing_foo, :locale => :'de-DE', :default => [:missing_bar, {:other => "Default %{count} Bars"}, "Default Bar"], :count => 6) + end + + test "returns the default translation for a missing :de translation even when default is a String when fallback is disabled" do + assert_equal 'Default String', I18n.t(:foo, :locale => :de, :default => 'Default String', :fallback => false) + end + + test "raises I18n::MissingTranslationData exception when fallback is disabled even when fallback translation exists" do + assert_raise(I18n::MissingTranslationData) { I18n.t(:foo, :locale => :de, :fallback => false, :raise => true) } + end + + test "raises I18n::MissingTranslationData exception when no translation was found" do + assert_raise(I18n::MissingTranslationData) { I18n.t(:faa, :locale => :en, :raise => true) } + assert_raise(I18n::MissingTranslationData) { I18n.t(:faa, :locale => :de, :raise => true) } + end + + test "should ensure that default is not splitted on new line char" do + assert_equal "Default \n Bar", I18n.t(:missing_bar, :default => "Default \n Bar") + end + + test "should not raise error when enforce_available_locales is true, :'pt' is missing and default is a Symbol" do + I18n.enforce_available_locales = true + begin + assert_equal 'Foo', I18n.t(:'model.attrs.foo', :locale => :'pt-BR', :default => [:'attrs.foo', "Foo"]) + ensure + I18n.enforce_available_locales = false + end + end +end + +class I18nBackendFallbacksLocalizeTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + end + + def setup + super + I18n.backend = Backend.new + store_translations(:en, :date => { :formats => { :en => 'en' }, :day_names => %w(Sunday) }) + store_translations(:de, :date => { :formats => { :de => 'de' } }) + end + + test "still uses an existing format as usual" do + assert_equal 'en', I18n.l(Date.today, :format => :en, :locale => :en) + end + + test "looks up and uses a fallback locale's format for a key missing in the given locale (1)" do + assert_equal 'en', I18n.l(Date.today, :format => :en, :locale => :de) + end + + test "looks up and uses a fallback locale's format for a key missing in the given locale (2)" do + assert_equal 'de', I18n.l(Date.today, :format => :de, :locale => :'de-DE') + end + + test "still uses an existing day name translation as usual" do + assert_equal 'Sunday', I18n.l(Date.new(2010, 1, 3), :format => '%A', :locale => :en) + end + + test "uses a fallback locale's translation for a key missing in the given locale" do + assert_equal 'Sunday', I18n.l(Date.new(2010, 1, 3), :format => '%A', :locale => :de) + end +end + +class I18nBackendFallbacksWithChainTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + end + + class Chain < I18n::Backend::Chain + include I18n::Backend::Fallbacks + end + + def setup + super + backend = Backend.new + backend.store_translations(:de, :foo => 'FOO') + backend.store_translations(:'pt-BR', :foo => 'Baz in :pt-BR') + I18n.backend = Chain.new(I18n::Backend::Simple.new, backend) + end + + test "falls back from de-DE to de when there is no translation for de-DE available" do + assert_equal 'FOO', I18n.t(:foo, :locale => :'de-DE') + end + + test "falls back from de-DE to de when there is no translation for de-DE available when using arrays, too" do + assert_equal ['FOO', 'FOO'], I18n.t([:foo, :foo], :locale => :'de-DE') + end + + test "should not raise error when enforce_available_locales is true, :'pt' is missing and default is a Symbol" do + I18n.enforce_available_locales = true + begin + assert_equal 'Foo', I18n.t(:'model.attrs.foo', :locale => :'pt-BR', :default => [:'attrs.foo', "Foo"]) + ensure + I18n.enforce_available_locales = false + end + end +end + +class I18nBackendFallbacksExistsTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + end + + def setup + super + I18n.backend = Backend.new + store_translations(:en, :foo => 'Foo in :en', :bar => 'Bar in :en') + store_translations(:de, :bar => 'Bar in :de') + store_translations(:'de-DE', :baz => 'Baz in :de-DE') + end + + test "exists? given an existing key will return true" do + assert_equal true, I18n.exists?(:foo) + end + + test "exists? given a non-existing key will return false" do + assert_equal false, I18n.exists?(:bogus) + end + + test "exists? given an existing key and an existing locale will return true" do + assert_equal true, I18n.exists?(:foo, :en) + assert_equal true, I18n.exists?(:bar, :de) + end + + test "exists? given a non-existing key and an existing locale will return false" do + assert_equal false, I18n.exists?(:bogus, :en) + assert_equal false, I18n.exists?(:bogus, :de) + end + + test "exists? should return true given a key which is missing from the given locale and exists in a fallback locale" do + assert_equal true, I18n.exists?(:foo, :de) + assert_equal true, I18n.exists?(:foo, :'de-DE') + end + + test "exists? should return false given a key which is missing from the given locale and all its fallback locales" do + assert_equal false, I18n.exists?(:baz, :de) + assert_equal false, I18n.exists?(:bogus, :'de-DE') + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/interpolation_compiler_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/interpolation_compiler_test.rb new file mode 100644 index 0000000..cffe28f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/interpolation_compiler_test.rb @@ -0,0 +1,118 @@ +require 'test_helper' + +class InterpolationCompilerTest < I18n::TestCase + Compiler = I18n::Backend::InterpolationCompiler::Compiler + + def compile_and_interpolate(str, values = {}) + Compiler.compile_if_an_interpolation(str).i18n_interpolate(values) + end + + def assert_escapes_interpolation_key(expected, malicious_str) + assert_equal(expected, Compiler.send(:escape_key_sym, malicious_str)) + end + + def test_escape_key_properly_escapes + assert_escapes_interpolation_key ':"\""', '"' + assert_escapes_interpolation_key ':"\\\\"', '\\' + assert_escapes_interpolation_key ':"\\\\\""', '\\"' + assert_escapes_interpolation_key ':"\#{}"', '#{}' + assert_escapes_interpolation_key ':"\\\\\#{}"', '\#{}' + end + + def assert_escapes_plain_string(expected, plain_str) + assert_equal expected, Compiler.send(:escape_plain_str, plain_str) + end + + def test_escape_plain_string_properly_escapes + assert_escapes_plain_string '\\"', '"' + assert_escapes_plain_string '\'', '\'' + assert_escapes_plain_string '\\#', '#' + assert_escapes_plain_string '\\#{}', '#{}' + assert_escapes_plain_string '\\\\\\"','\\"' + end + + def test_non_interpolated_strings_or_arrays_dont_get_compiled + ['abc', '\\{a}}', '{a}}', []].each do |obj| + Compiler.compile_if_an_interpolation(obj) + assert_equal false, obj.respond_to?(:i18n_interpolate) + end + end + + def test_interpolated_string_gets_compiled + assert_equal '-A-', compile_and_interpolate('-%{a}-', :a => 'A') + end + + def assert_handles_key(str, key) + assert_equal 'A', compile_and_interpolate(str, key => 'A') + end + + def test_compiles_fancy_keys + assert_handles_key('%{\}', :'\\' ) + assert_handles_key('%{#}', :'#' ) + assert_handles_key('%{#{}', :'#{' ) + assert_handles_key('%{#$SAFE}', :'#$SAFE') + assert_handles_key('%{\000}', :'\000' ) + assert_handles_key('%{\'}', :'\'' ) + assert_handles_key('%{\'\'}', :'\'\'' ) + assert_handles_key('%{a.b}', :'a.b' ) + assert_handles_key('%{ }', :' ' ) + assert_handles_key('%{:}', :':' ) + assert_handles_key("%{:''}", :":''" ) + assert_handles_key('%{:"}', :':"' ) + end + + def test_str_containing_only_escaped_interpolation_is_handled_correctly + assert_equal 'abc %{x}', compile_and_interpolate('abc %%{x}') + end + + def test_handles_weird_strings + assert_equal '#{} a', compile_and_interpolate('#{} %{a}', :a => 'a') + assert_equal '"#{abc}"', compile_and_interpolate('"#{ab%{a}c}"', :a => '' ) + assert_equal 'a}', compile_and_interpolate('%{{a}}', :'{a' => 'a') + assert_equal '"', compile_and_interpolate('"%{a}', :a => '' ) + assert_equal 'a%{a}', compile_and_interpolate('%{a}%%{a}', :a => 'a') + assert_equal '%%{a}', compile_and_interpolate('%%%{a}') + assert_equal '\";eval("a")', compile_and_interpolate('\";eval("%{a}")', :a => 'a') + assert_equal '\";eval("a")', compile_and_interpolate('\";eval("a")%{a}', :a => '' ) + assert_equal "\na", compile_and_interpolate("\n%{a}", :a => 'a') + end + + def test_raises_exception_when_argument_is_missing + assert_raise(I18n::MissingInterpolationArgument) do + compile_and_interpolate('%{first} %{last}', :first => 'first') + end + end + + def test_custom_missing_interpolation_argument_handler + old_handler = I18n.config.missing_interpolation_argument_handler + I18n.config.missing_interpolation_argument_handler = lambda do |key, values, string| + "missing key is #{key}, values are #{values.inspect}, given string is '#{string}'" + end + assert_equal %|first missing key is last, values are {:first=>"first"}, given string is '%{first} %{last}'|, + compile_and_interpolate('%{first} %{last}', :first => 'first') + ensure + I18n.config.missing_interpolation_argument_handler = old_handler + end +end + +class I18nBackendInterpolationCompilerTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::InterpolationCompiler + end + + include I18n::Tests::Interpolation + + def setup + I18n.backend = Backend.new + super + end + + # pre-compile default strings to make sure we are testing I18n::Backend::InterpolationCompiler + def interpolate(*args) + options = args.last.kind_of?(Hash) ? args.last : {} + if default_str = options[:default] + I18n::Backend::InterpolationCompiler::Compiler.compile_if_an_interpolation(default_str) + end + super + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/key_value_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/key_value_test.rb new file mode 100644 index 0000000..097780d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/key_value_test.rb @@ -0,0 +1,43 @@ +require 'test_helper' + +class I18nBackendKeyValueTest < I18n::TestCase + def setup_backend!(subtree=true) + I18n.backend = I18n::Backend::KeyValue.new({}, subtree) + store_translations(:en, :foo => { :bar => 'bar', :baz => 'baz' }) + end + + def assert_flattens(expected, nested, escape=true, subtree=true) + assert_equal expected, I18n.backend.flatten_translations("en", nested, escape, subtree) + end + + test "hash flattening works" do + setup_backend! + assert_flattens( + {:a=>'a', :b=>{:c=>'c', :d=>'d', :f=>{:x=>'x'}}, :"b.f" => {:x=>"x"}, :"b.c"=>"c", :"b.f.x"=>"x", :"b.d"=>"d"}, + {:a=>'a', :b=>{:c=>'c', :d=>'d', :f=>{:x=>'x'}}} + ) + assert_flattens({:a=>{:b =>['a', 'b']}, :"a.b"=>['a', 'b']}, {:a=>{:b =>['a', 'b']}}) + assert_flattens({:"a\001b" => "c"}, {:"a.b" => "c"}) + assert_flattens({:"a.b"=>['a', 'b']}, {:a=>{:b =>['a', 'b']}}, true, false) + assert_flattens({:"a.b" => "c"}, {:"a.b" => "c"}, false) + end + + test "store_translations handle subtrees by default" do + setup_backend! + assert_equal({ :bar => 'bar', :baz => 'baz' }, I18n.t("foo")) + end + + test "store_translations merge subtrees accordingly" do + setup_backend! + store_translations(:en, :foo => { :baz => "BAZ"}) + assert_equal('BAZ', I18n.t("foo.baz")) + assert_equal({ :bar => 'bar', :baz => 'BAZ' }, I18n.t("foo")) + end + + test "store_translations does not handle subtrees if desired" do + setup_backend!(false) + assert_raise I18n::MissingTranslationData do + I18n.t("foo", :raise => true) + end + end +end if I18n::TestCase.key_value? diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/memoize_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/memoize_test.rb new file mode 100644 index 0000000..3448904 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/memoize_test.rb @@ -0,0 +1,79 @@ +require 'test_helper' +# TODO: change back to "require 'backend/simple'" when dropping support to Ruby 1.8.7. +require File.expand_path('../simple_test', __FILE__) + +class I18nBackendMemoizeTest < I18nBackendSimpleTest + module MemoizeSpy + attr_accessor :spy_calls + + def available_locales + self.spy_calls = (self.spy_calls || 0) + 1 + super + end + end + + class MemoizeBackend < I18n::Backend::Simple + include MemoizeSpy + include I18n::Backend::Memoize + end + + def setup + super + I18n.backend = MemoizeBackend.new + end + + def test_memoizes_available_locales + I18n.backend.spy_calls = 0 + assert_equal I18n.available_locales, I18n.available_locales + assert_equal 1, I18n.backend.spy_calls + end + + def test_resets_available_locales_on_reload! + I18n.available_locales + I18n.backend.spy_calls = 0 + I18n.reload! + assert_equal I18n.available_locales, I18n.available_locales + assert_equal 1, I18n.backend.spy_calls + end + + def test_resets_available_locales_on_store_translations + I18n.available_locales + I18n.backend.spy_calls = 0 + I18n.backend.store_translations(:copa, :ca => :bana) + assert_equal I18n.available_locales, I18n.available_locales + assert I18n.available_locales.include?(:copa) + assert_equal 1, I18n.backend.spy_calls + end + + module TestLookup + def lookup(locale, key, scope = [], options = {}) + keys = I18n.normalize_keys(locale, key, scope, options[:separator]) + keys.inspect + end + end + + def test_lookup_concurrent_consistency + backend_impl = Class.new(I18n::Backend::Simple) do + include TestLookup + include I18n::Backend::Memoize + end + backend = backend_impl.new + + memoized_lookup = backend.send(:memoized_lookup) + + assert_equal "[:foo, :scoped, :sample]", backend.translate('foo', scope = [:scoped, :sample]) + + results = [] + 30.times.inject([]) do |memo, i| + memo << Thread.new do + backend.translate('bar', scope); backend.translate(:baz, scope) + end + end.each(&:join) + + memoized_lookup = backend.send(:memoized_lookup) + puts memoized_lookup.inspect if $VERBOSE + assert_equal 3, memoized_lookup.size, "NON-THREAD-SAFE lookup memoization backend: #{memoized_lookup.class}" + # if a plain Hash is used might eventually end up in a weird (inconsistent) state + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/metadata_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/metadata_test.rb new file mode 100644 index 0000000..44612cf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/metadata_test.rb @@ -0,0 +1,48 @@ +require 'test_helper' + +class I18nBackendMetadataTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Metadata + end + + def setup + super + I18n.backend = Backend.new + store_translations(:en, :foo => 'Hi %{name}') + end + + test "translation strings carry metadata" do + translation = I18n.t(:foo, :name => 'David') + assert translation.respond_to?(:translation_metadata) + assert translation.translation_metadata.is_a?(Hash) + end + + test "translate adds the locale to metadata on Strings" do + assert_equal :en, I18n.t(:foo, :name => 'David', :locale => :en).translation_metadata[:locale] + end + + test "translate adds the key to metadata on Strings" do + assert_equal :foo, I18n.t(:foo, :name => 'David').translation_metadata[:key] + end + + test "translate adds the default to metadata on Strings" do + assert_equal 'bar', I18n.t(:foo, :default => 'bar', :name => '').translation_metadata[:default] + end + + test "translation adds the interpolation values to metadata on Strings" do + assert_equal({:name => 'David'}, I18n.t(:foo, :name => 'David').translation_metadata[:values]) + end + + test "interpolation adds the original string to metadata on Strings" do + assert_equal('Hi %{name}', I18n.t(:foo, :name => 'David').translation_metadata[:original]) + end + + test "pluralization adds the count to metadata on Strings" do + assert_equal(1, I18n.t(:missing, :count => 1, :default => { :one => 'foo' }).translation_metadata[:count]) + end + + test "metadata works with frozen values" do + assert_equal(1, I18n.t(:missing, :count => 1, :default => 'foo'.freeze).translation_metadata[:count]) + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/pluralization_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/pluralization_test.rb new file mode 100644 index 0000000..1518efd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/pluralization_test.rb @@ -0,0 +1,45 @@ +require 'test_helper' + +class I18nBackendPluralizationTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Pluralization + include I18n::Backend::Fallbacks + end + + def setup + super + I18n.backend = Backend.new + @rule = lambda { |n| n == 1 ? :one : n == 0 || (2..10).include?(n % 100) ? :few : (11..19).include?(n % 100) ? :many : :other } + store_translations(:xx, :i18n => { :plural => { :rule => @rule } }) + @entry = { :zero => 'zero', :one => 'one', :few => 'few', :many => 'many', :other => 'other' } + end + + test "pluralization picks a pluralizer from :'i18n.pluralize'" do + assert_equal @rule, I18n.backend.send(:pluralizer, :xx) + end + + test "pluralization picks :one for 1" do + assert_equal 'one', I18n.t(:count => 1, :default => @entry, :locale => :xx) + end + + test "pluralization picks :few for 2" do + assert_equal 'few', I18n.t(:count => 2, :default => @entry, :locale => :xx) + end + + test "pluralization picks :many for 11" do + assert_equal 'many', I18n.t(:count => 11, :default => @entry, :locale => :xx) + end + + test "pluralization picks zero for 0 if the key is contained in the data" do + assert_equal 'zero', I18n.t(:count => 0, :default => @entry, :locale => :xx) + end + + test "pluralization picks few for 0 if the key is not contained in the data" do + @entry.delete(:zero) + assert_equal 'few', I18n.t(:count => 0, :default => @entry, :locale => :xx) + end + + test "Fallbacks can pick up rules from fallback locales, too" do + assert_equal @rule, I18n.backend.send(:pluralizer, :'xx-XX') + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/simple_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/simple_test.rb new file mode 100644 index 0000000..4d0c447 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/simple_test.rb @@ -0,0 +1,84 @@ +require 'test_helper' + +class I18nBackendSimpleTest < I18n::TestCase + def setup + super + I18n.backend = I18n::Backend::Simple.new + I18n.load_path = [locales_dir + '/en.yml'] + end + + # useful because this way we can use the backend with no key for interpolation/pluralization + test "simple backend translate: given nil as a key it still interpolations the default value" do + assert_equal "Hi David", I18n.t(nil, :default => "Hi %{name}", :name => "David") + end + + # loading translations + test "simple load_translations: given an unknown file type it raises I18n::UnknownFileType" do + assert_raise(I18n::UnknownFileType) { I18n.backend.load_translations("#{locales_dir}/en.xml") } + end + + test "simple load_translations: given a Ruby file name it does not raise anything" do + assert_nothing_raised { I18n.backend.load_translations("#{locales_dir}/en.rb") } + end + + test "simple load_translations: given no argument, it uses I18n.load_path" do + I18n.backend.load_translations + assert_equal({ :en => { :foo => { :bar => 'baz' } } }, I18n.backend.send(:translations)) + end + + test "simple load_rb: loads data from a Ruby file" do + data = I18n.backend.send(:load_rb, "#{locales_dir}/en.rb") + assert_equal({ :en => { :fuh => { :bah => 'bas' } } }, data) + end + + test "simple load_yml: loads data from a YAML file" do + data = I18n.backend.send(:load_yml, "#{locales_dir}/en.yml") + assert_equal({ 'en' => { 'foo' => { 'bar' => 'baz' } } }, data) + end + + test "simple load_translations: loads data from known file formats" do + I18n.backend = I18n::Backend::Simple.new + I18n.backend.load_translations("#{locales_dir}/en.rb", "#{locales_dir}/en.yml") + expected = { :en => { :fuh => { :bah => "bas" }, :foo => { :bar => "baz" } } } + assert_equal expected, translations + end + + test "simple load_translations: given file names as array it does not raise anything" do + assert_nothing_raised { I18n.backend.load_translations(["#{locales_dir}/en.rb", "#{locales_dir}/en.yml"]) } + end + + # storing translations + + test "simple store_translations: stores translations, ... no, really :-)" do + store_translations :'en', :foo => 'bar' + assert_equal Hash[:'en', {:foo => 'bar'}], translations + end + + test "simple store_translations: deep_merges with existing translations" do + store_translations :'en', :foo => {:bar => 'bar'} + store_translations :'en', :foo => {:baz => 'baz'} + assert_equal Hash[:'en', {:foo => {:bar => 'bar', :baz => 'baz'}}], translations + end + + test "simple store_translations: converts the given locale to a Symbol" do + store_translations 'en', :foo => 'bar' + assert_equal Hash[:'en', {:foo => 'bar'}], translations + end + + test "simple store_translations: converts keys to Symbols" do + store_translations 'en', 'foo' => {'bar' => 'bar', 'baz' => 'baz'} + assert_equal Hash[:'en', {:foo => {:bar => 'bar', :baz => 'baz'}}], translations + end + + # reloading translations + + test "simple reload_translations: unloads translations" do + I18n.backend.reload! + assert_nil translations + end + + test "simple reload_translations: uninitializes the backend" do + I18n.backend.reload! + assert_equal false, I18n.backend.initialized? + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/transliterator_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/transliterator_test.rb new file mode 100644 index 0000000..c40e2bb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/backend/transliterator_test.rb @@ -0,0 +1,84 @@ +# encoding: utf-8 +require 'test_helper' + +class I18nBackendTransliterator < I18n::TestCase + def setup + super + I18n.backend = I18n::Backend::Simple.new + @proc = lambda { |n| n.upcase } + @hash = { "ü" => "ue", "ö" => "oe", "a" => "a" } + @transliterator = I18n::Backend::Transliterator.get + end + + test "transliteration rule can be a proc" do + store_translations(:xx, :i18n => {:transliterate => {:rule => @proc}}) + assert_equal "HELLO", I18n.backend.transliterate(:xx, "hello") + end + + test "transliteration rule can be a hash" do + store_translations(:xx, :i18n => {:transliterate => {:rule => @hash}}) + assert_equal "ue", I18n.backend.transliterate(:xx, "ü") + end + + test "transliteration rule must be a proc or hash" do + store_translations(:xx, :i18n => {:transliterate => {:rule => ""}}) + assert_raise I18n::ArgumentError do + I18n.backend.transliterate(:xx, "ü") + end + end + + test "transliterator defaults to latin => ascii when no rule is given" do + assert_equal "AEroskobing", I18n.backend.transliterate(:xx, "Ærøskøbing") + end + + test "default transliterator should not modify ascii characters" do + (0..127).each do |byte| + char = [byte].pack("U") + assert_equal char, @transliterator.transliterate(char) + end + end + + test "default transliterator correctly transliterates latin characters" do + # create string with range of Unicode's western characters with + # diacritics, excluding the division and multiplication signs which for + # some reason or other are floating in the middle of all the letters. + string = (0xC0..0x17E).to_a.reject {|c| [0xD7, 0xF7].include? c}.pack("U*") + string.split(//) do |char| + assert_match %r{^[a-zA-Z']*$}, @transliterator.transliterate(string) + end + end + + test "should replace non-ASCII chars not in map with a replacement char" do + assert_equal "abc?", @transliterator.transliterate("abcÅ¿") + end + + test "can replace non-ASCII chars not in map with a custom replacement string" do + assert_equal "abc#", @transliterator.transliterate("abcÅ¿", "#") + end + + test "default transliterator raises errors for invalid UTF-8" do + assert_raise ArgumentError do + @transliterator.transliterate("a\x92b") + end + end + + test "I18n.transliterate should transliterate using a default transliterator" do + assert_equal "aeo", I18n.transliterate("áèö") + end + + test "I18n.transliterate should transliterate using a locale" do + store_translations(:xx, :i18n => {:transliterate => {:rule => @hash}}) + assert_equal "ue", I18n.transliterate("ü", :locale => :xx) + end + + test "default transliterator fails with custom rules with uncomposed input" do + char = [117, 776].pack("U*") # "ü" as ASCII "u" plus COMBINING DIAERESIS + transliterator = I18n::Backend::Transliterator.get(@hash) + assert_not_equal "ue", transliterator.transliterate(char) + end + + test "DEFAULT_APPROXIMATIONS is frozen to prevent concurrency issues" do + assert I18n::Backend::Transliterator::HashTransliterator::DEFAULT_APPROXIMATIONS.frozen? + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/core_ext/hash_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/core_ext/hash_test.rb new file mode 100644 index 0000000..f7ebd6f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/core_ext/hash_test.rb @@ -0,0 +1,36 @@ +require 'test_helper' +require 'i18n/core_ext/hash' + +class I18nCoreExtHashInterpolationTest < I18n::TestCase + test "#deep_symbolize_keys" do + hash = { 'foo' => { 'bar' => { 'baz' => 'bar' } } } + expected = { :foo => { :bar => { :baz => 'bar' } } } + assert_equal expected, hash.deep_symbolize_keys + end + + test "#slice" do + hash = { :foo => 'bar', :baz => 'bar' } + expected = { :foo => 'bar' } + assert_equal expected, hash.slice(:foo) + end + + test "#slice non-existent key" do + hash = { :foo => 'bar', :baz => 'bar' } + expected = { :foo => 'bar' } + assert_equal expected, hash.slice(:foo, :not_here) + end + + test "#except" do + hash = { :foo => 'bar', :baz => 'bar' } + expected = { :foo => 'bar' } + assert_equal expected, hash.except(:baz) + end + + test "#deep_merge!" do + hash = { :foo => { :bar => { :baz => 'bar' } }, :baz => 'bar' } + hash.deep_merge!(:foo => { :bar => { :baz => 'foo' } }) + + expected = { :foo => { :bar => { :baz => 'foo' } }, :baz => 'bar' } + assert_equal expected, hash + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/gettext/api_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/gettext/api_test.rb new file mode 100644 index 0000000..2cd157c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/gettext/api_test.rb @@ -0,0 +1,214 @@ +# encoding: utf-8 +require 'test_helper' +require 'i18n/gettext/helpers' + +include I18n::Gettext::Helpers + +class I18nGettextApiTest < I18n::TestCase + def setup + super + I18n.locale = :en + I18n.backend.store_translations :de, { + 'Hi Gettext!' => 'Hallo Gettext!', + 'Sentence 1. Sentence 2.' => 'Satz 1. Satz 2.', + "An apple" => { :one => 'Ein Apfel', :other => '%{count} Äpfel' }, + :special => { "A special apple" => { :one => 'Ein spezieller Apfel', :other => '%{count} spezielle Äpfel' } }, + :foo => { :bar => 'bar-de' }, + 'foo.bar' => 'Foo Bar' + }, :separator => '|' + end + + # N_ + def test_N_returns_original_msg + assert_equal 'foo|bar', N_('foo|bar') + I18n.locale = :de + assert_equal 'Hi Gettext!', N_('Hi Gettext!') + end + + # gettext + def test_gettext_uses_msg_as_default + assert_equal 'Hi Gettext!', _('Hi Gettext!') + end + + def test_gettext_uses_msg_as_key + I18n.locale = :de + assert_equal 'Hallo Gettext!', gettext('Hi Gettext!') + assert_equal 'Hallo Gettext!', _('Hi Gettext!') + end + + def test_gettext_uses_msg_containing_dots_as_default + assert_equal 'Sentence 1. Sentence 2.', gettext('Sentence 1. Sentence 2.') + assert_equal 'Sentence 1. Sentence 2.', _('Sentence 1. Sentence 2.') + end + + def test_gettext_uses_msg_containing_dots_as_key + I18n.locale = :de + assert_equal 'Satz 1. Satz 2.', gettext('Sentence 1. Sentence 2.') + assert_equal 'Satz 1. Satz 2.', _('Sentence 1. Sentence 2.') + end + + # sgettext + def test_sgettext_defaults_to_the_last_token_of_a_scoped_msgid + assert_equal 'bar', sgettext('foo|bar') + assert_equal 'bar', s_('foo|bar') + end + + def test_sgettext_looks_up_a_scoped_translation + I18n.locale = :de + assert_equal 'bar-de', sgettext('foo|bar') + assert_equal 'bar-de', s_('foo|bar') + end + + def test_sgettext_ignores_dots + I18n.locale = :de + assert_equal 'Foo Bar', sgettext('foo.bar') + assert_equal 'Foo Bar', s_('foo.bar') + end + + # pgettext + def test_pgettext_defaults_to_msgid + assert_equal 'bar', pgettext('foo', 'bar') + assert_equal 'bar', p_('foo', 'bar') + end + + def test_pgettext_looks_up_a_scoped_translation + I18n.locale = :de + assert_equal 'bar-de', pgettext('foo', 'bar') + assert_equal 'bar-de', p_('foo', 'bar') + end + + # ngettext + def test_ngettext_looks_up_msg_id_as_default_singular + assert_equal 'An apple', ngettext('An apple', '%{count} apples', 1) + assert_equal 'An apple', n_('An apple', '%{count} apples', 1) + end + + def test_ngettext_looks_up_msg_id_plural_as_default_plural + assert_equal '2 apples', ngettext('An apple', '%{count} apples', 2) + assert_equal '2 apples', n_('An apple', '%{count} apples', 2) + end + + def test_ngettext_looks_up_a_singular + I18n.locale = :de + assert_equal 'Ein Apfel', ngettext('An apple', '%{count} apples', 1) + assert_equal 'Ein Apfel', n_('An apple', '%{count} apples', 1) + end + + def test_ngettext_looks_up_a_plural + I18n.locale = :de + assert_equal '2 Äpfel', ngettext('An apple', '%{count} apples', 2) + assert_equal '2 Äpfel', n_('An apple', '%{count} apples', 2) + end + + def test_ngettext_looks_up_msg_id_as_default_singular_with_alternative_syntax + assert_equal 'An apple', ngettext(['An apple', '%{count} apples'], 1) + assert_equal 'An apple', n_(['An apple', '%{count} apples'], 1) + end + + def test_ngettext_looks_up_msg_id_plural_as_default_plural_with_alternative_syntax + assert_equal '2 apples', ngettext(['An apple', '%{count} apples'], 2) + assert_equal '2 apples', n_(['An apple', '%{count} apples'], 2) + end + + def test_ngettext_looks_up_a_singular_with_alternative_syntax + I18n.locale = :de + assert_equal 'Ein Apfel', ngettext(['An apple', '%{count} apples'], 1) + assert_equal 'Ein Apfel', n_(['An apple', '%{count} apples'], 1) + end + + def test_ngettext_looks_up_a_plural_with_alternative_syntax + I18n.locale = :de + assert_equal '2 Äpfel', ngettext(['An apple', '%{count} apples'], 2) + assert_equal '2 Äpfel', n_(['An apple', '%{count} apples'], 2) + end + + # nsgettext + def test_nsgettext_looks_up_msg_id_as_default_singular + assert_equal 'A special apple', nsgettext('special|A special apple', '%{count} special apples', 1) + assert_equal 'A special apple', ns_('special|A special apple', '%{count} special apples', 1) + end + + def test_nsgettext_looks_up_msg_id_plural_as_default_plural + assert_equal '2 special apples', nsgettext('special|A special apple', '%{count} special apples', 2) + assert_equal '2 special apples', ns_('special|A special apple', '%{count} special apples', 2) + end + + def test_nsgettext_looks_up_a_singular + I18n.locale = :de + assert_equal 'Ein spezieller Apfel', nsgettext('special|A special apple', '%{count} special apples', 1) + assert_equal 'Ein spezieller Apfel', ns_('special|A special apple', '%{count} special apples', 1) + end + + def test_nsgettext_looks_up_a_plural + I18n.locale = :de + assert_equal '2 spezielle Äpfel', nsgettext('special|A special apple', '%{count} special apples', 2) + assert_equal '2 spezielle Äpfel', ns_('special|A special apple', '%{count} special apples', 2) + end + + def test_nsgettext_looks_up_msg_id_as_default_singular_with_alternative_syntax + assert_equal 'A special apple', nsgettext(['special|A special apple', '%{count} special apples'], 1) + assert_equal 'A special apple', ns_(['special|A special apple', '%{count} special apples'], 1) + end + + def test_nsgettext_looks_up_msg_id_plural_as_default_plural_with_alternative_syntax + assert_equal '2 special apples', nsgettext(['special|A special apple', '%{count} special apples'], 2) + assert_equal '2 special apples', ns_(['special|A special apple', '%{count} special apples'], 2) + end + + def test_nsgettext_looks_up_a_singular_with_alternative_syntax + I18n.locale = :de + assert_equal 'Ein spezieller Apfel', nsgettext(['special|A special apple', '%{count} special apples'], 1) + assert_equal 'Ein spezieller Apfel', ns_(['special|A special apple', '%{count} special apples'], 1) + end + + def test_nsgettext_looks_up_a_plural_with_alternative_syntax + I18n.locale = :de + assert_equal '2 spezielle Äpfel', nsgettext(['special|A special apple', '%{count} special apples'], 2) + assert_equal '2 spezielle Äpfel', ns_(['special|A special apple', '%{count} special apples'], 2) + end + + # npgettext + def test_npgettext_looks_up_msg_id_as_default_singular + assert_equal 'A special apple', npgettext('special', 'A special apple', '%{count} special apples', 1) + assert_equal 'A special apple', np_('special', 'A special apple', '%{count} special apples', 1) + end + + def test_npgettext_looks_up_msg_id_plural_as_default_plural + assert_equal '2 special apples', npgettext('special', 'A special apple', '%{count} special apples', 2) + assert_equal '2 special apples', np_('special', 'A special apple', '%{count} special apples', 2) + end + + def test_npgettext_looks_up_a_singular + I18n.locale = :de + assert_equal 'Ein spezieller Apfel', npgettext('special', 'A special apple', '%{count} special apples', 1) + assert_equal 'Ein spezieller Apfel', np_('special', 'A special apple', '%{count} special apples', 1) + end + + def test_npgettext_looks_up_a_plural + I18n.locale = :de + assert_equal '2 spezielle Äpfel', npgettext('special', 'A special apple', '%{count} special apples', 2) + assert_equal '2 spezielle Äpfel', np_('special', 'A special apple', '%{count} special apples', 2) + end + + def test_npgettext_looks_up_msg_id_as_default_singular_with_alternative_syntax + assert_equal 'A special apple', npgettext('special', ['A special apple', '%{count} special apples'], 1) + assert_equal 'A special apple', np_('special', ['A special apple', '%{count} special apples'], 1) + end + + def test_npgettext_looks_up_msg_id_plural_as_default_plural_with_alternative_syntax + assert_equal '2 special apples', npgettext('special', ['A special apple', '%{count} special apples'], 2) + assert_equal '2 special apples', np_('special', ['A special apple', '%{count} special apples'], 2) + end + + def test_npgettext_looks_up_a_singular_with_alternative_syntax + I18n.locale = :de + assert_equal 'Ein spezieller Apfel', npgettext('special', ['A special apple', '%{count} special apples'], 1) + assert_equal 'Ein spezieller Apfel', np_('special', ['A special apple', '%{count} special apples'], 1) + end + + def test_npgettext_looks_up_a_plural_with_alternative_syntax + I18n.locale = :de + assert_equal '2 spezielle Äpfel', npgettext('special', ['A special apple', '%{count} special apples'], 2) + assert_equal '2 spezielle Äpfel', np_('special', ['A special apple', '%{count} special apples'], 2) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/gettext/backend_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/gettext/backend_test.rb new file mode 100644 index 0000000..30254e6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/gettext/backend_test.rb @@ -0,0 +1,92 @@ +# encoding: utf-8 + +require 'test_helper' + +class I18nGettextBackendTest < I18n::TestCase + include I18n::Gettext::Helpers + + class Backend < I18n::Backend::Simple + include I18n::Backend::Gettext + end + + def setup + super + I18n.backend = Backend.new + I18n.locale = :en + I18n.load_path = ["#{locales_dir}/de.po"] + I18n.default_separator = '|' + end + + def test_backend_loads_po_file + I18n.backend.send(:init_translations) + assert I18n.backend.send(:translations)[:de][:"Axis"] + end + + def test_looks_up_a_translation + I18n.locale = :de + assert_equal 'Auto', gettext('car') + end + + def test_uses_default_translation + assert_equal 'car', gettext('car') + end + + def test_looks_up_a_namespaced_translation + I18n.locale = :de + assert_equal 'Räderzahl', sgettext('Car|Wheels count') + assert_equal 'Räderzahl', pgettext('Car', 'Wheels count') + assert_equal 'Räderzahl!', pgettext('New car', 'Wheels count') + end + + def test_uses_namespaced_default_translation + assert_equal 'Wheels count', sgettext('Car|Wheels count') + assert_equal 'Wheels count', pgettext('Car', 'Wheels count') + assert_equal 'Wheels count', pgettext('New car', 'Wheels count') + end + + def test_pluralizes_entry + I18n.locale = :de + assert_equal 'Achse', ngettext('Axis', 'Axis', 1) + assert_equal 'Achsen', ngettext('Axis', 'Axis', 2) + end + + def test_pluralizes_default_entry + assert_equal 'Axis', ngettext('Axis', 'Axis', 1) + assert_equal 'Axis', ngettext('Axis', 'Axis', 2) + end + + def test_pluralizes_namespaced_entry + I18n.locale = :de + assert_equal 'Rad', nsgettext('Car|wheel', 'wheels', 1) + assert_equal 'Räder', nsgettext('Car|wheel', 'wheels', 2) + assert_equal 'Rad', npgettext('Car', 'wheel', 'wheels', 1) + assert_equal 'Räder', npgettext('Car', 'wheel', 'wheels', 2) + assert_equal 'Rad!', npgettext('New car', 'wheel', 'wheels', 1) + assert_equal 'Räder!', npgettext('New car', 'wheel', 'wheels', 2) + end + + def test_pluralizes_namespaced_default_entry + assert_equal 'wheel', nsgettext('Car|wheel', 'wheels', 1) + assert_equal 'wheels', nsgettext('Car|wheel', 'wheels', 2) + assert_equal 'wheel', npgettext('Car', 'wheel', 'wheels', 1) + assert_equal 'wheels', npgettext('Car', 'wheel', 'wheels', 2) + assert_equal 'wheel', npgettext('New car', 'wheel', 'wheels', 1) + assert_equal 'wheels', npgettext('New car', 'wheel', 'wheels', 2) + end + + def test_pluralizes_namespaced_entry_with_alternative_syntax + I18n.locale = :de + assert_equal 'Rad', nsgettext(['Car|wheel', 'wheels'], 1) + assert_equal 'Räder', nsgettext(['Car|wheel', 'wheels'], 2) + assert_equal 'Rad', npgettext('Car', ['wheel', 'wheels'], 1) + assert_equal 'Räder', npgettext('Car', ['wheel', 'wheels'], 2) + assert_equal 'Rad!', npgettext('New car', ['wheel', 'wheels'], 1) + assert_equal 'Räder!', npgettext('New car', ['wheel', 'wheels'], 2) + end + + def test_ngettextpluralizes_entry_with_dots + I18n.locale = :de + assert_equal 'Auf 1 Achse.', n_("On %{count} wheel.", "On %{count} wheels.", 1) + assert_equal 'Auf 2 Achsen.', n_("On %{count} wheel.", "On %{count} wheels.", 2) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/exceptions_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/exceptions_test.rb new file mode 100644 index 0000000..84e1c8f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/exceptions_test.rb @@ -0,0 +1,117 @@ +require 'test_helper' + +class I18nExceptionsTest < I18n::TestCase + def test_invalid_locale_stores_locale + force_invalid_locale + rescue I18n::ArgumentError => exception + assert_nil exception.locale + end + + test "passing an invalid locale raises an InvalidLocale exception" do + force_invalid_locale do |exception| + assert_equal 'nil is not a valid locale', exception.message + end + end + + test "MissingTranslation can be initialized without options" do + exception = I18n::MissingTranslation.new(:en, 'foo') + assert_equal({}, exception.options) + end + + test "MissingTranslationData exception stores locale, key and options" do + force_missing_translation_data do |exception| + assert_equal 'de', exception.locale + assert_equal :foo, exception.key + assert_equal({:scope => :bar}, exception.options) + end + end + + test "MissingTranslationData message contains the locale and scoped key" do + force_missing_translation_data do |exception| + assert_equal 'translation missing: de.bar.foo', exception.message + end + end + + test "InvalidPluralizationData stores entry, count and key" do + force_invalid_pluralization_data do |exception| + assert_equal({:other => "bar"}, exception.entry) + assert_equal 1, exception.count + assert_equal :one, exception.key + end + end + + test "InvalidPluralizationData message contains count, data and missing key" do + force_invalid_pluralization_data do |exception| + assert_match '1', exception.message + assert_match '{:other=>"bar"}', exception.message + assert_match 'one', exception.message + end + end + + test "MissingInterpolationArgument stores key and string" do + assert_raise(I18n::MissingInterpolationArgument) { force_missing_interpolation_argument } + force_missing_interpolation_argument do |exception| + assert_equal :bar, exception.key + assert_equal "%{bar}", exception.string + end + end + + test "MissingInterpolationArgument message contains the missing and given arguments" do + force_missing_interpolation_argument do |exception| + assert_equal 'missing interpolation argument :bar in "%{bar}" ({:baz=>"baz"} given)', exception.message + end + end + + test "ReservedInterpolationKey stores key and string" do + force_reserved_interpolation_key do |exception| + assert_equal :scope, exception.key + assert_equal "%{scope}", exception.string + end + end + + test "ReservedInterpolationKey message contains the reserved key" do + force_reserved_interpolation_key do |exception| + assert_equal 'reserved key :scope used in "%{scope}"', exception.message + end + end + + test "MissingTranslationData#new can be initialized with just two arguments" do + assert I18n::MissingTranslationData.new('en', 'key') + end + + private + + def force_invalid_locale + I18n.translate(:foo, :locale => nil) + rescue I18n::ArgumentError => e + block_given? ? yield(e) : raise(e) + end + + def force_missing_translation_data(options = {}) + store_translations('de', :bar => nil) + I18n.translate(:foo, options.merge(:scope => :bar, :locale => :de)) + rescue I18n::ArgumentError => e + block_given? ? yield(e) : raise(e) + end + + def force_invalid_pluralization_data + store_translations('de', :foo => { :other => 'bar' }) + I18n.translate(:foo, :count => 1, :locale => :de) + rescue I18n::ArgumentError => e + block_given? ? yield(e) : raise(e) + end + + def force_missing_interpolation_argument + store_translations('de', :foo => "%{bar}") + I18n.translate(:foo, :baz => 'baz', :locale => :de) + rescue I18n::ArgumentError => e + block_given? ? yield(e) : raise(e) + end + + def force_reserved_interpolation_key + store_translations('de', :foo => "%{scope}") + I18n.translate(:foo, :baz => 'baz', :locale => :de) + rescue I18n::ArgumentError => e + block_given? ? yield(e) : raise(e) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/gettext_plural_keys_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/gettext_plural_keys_test.rb new file mode 100644 index 0000000..4d0c977 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/gettext_plural_keys_test.rb @@ -0,0 +1,20 @@ +require 'test_helper' + +class I18nGettextPluralKeysTest < I18n::TestCase + def setup + super + I18n::Gettext.plural_keys[:zz] = [:value1, :value2] + end + + test "Returns the plural keys of the given locale if present" do + assert_equal I18n::Gettext.plural_keys(:zz), [:value1, :value2] + end + + test "Returns the plural keys of :en if given locale not present" do + assert_equal I18n::Gettext.plural_keys(:yy), [:one, :other] + end + + test "Returns the whole hash with no arguments" do + assert_equal I18n::Gettext.plural_keys, { :en => [:one, :other], :zz => [:value1, :value2] } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/interpolate_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/interpolate_test.rb new file mode 100644 index 0000000..78e54d3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/interpolate_test.rb @@ -0,0 +1,91 @@ +require 'test_helper' + +# thanks to Masao's String extensions, some tests taken from Masao's tests +# http://github.com/mutoh/gettext/blob/edbbe1fa8238fa12c7f26f2418403015f0270e47/test/test_string.rb + +class I18nInterpolateTest < I18n::TestCase + test "String interpolates a hash argument w/ named placeholders" do + assert_equal "Masao Mutoh", I18n.interpolate("%{first} %{last}", :first => 'Masao', :last => 'Mutoh' ) + end + + test "String interpolates a hash argument w/ named placeholders (reverse order)" do + assert_equal "Mutoh, Masao", I18n.interpolate("%{last}, %{first}", :first => 'Masao', :last => 'Mutoh' ) + end + + test "String interpolates named placeholders with sprintf syntax" do + assert_equal "10, 43.4", I18n.interpolate("%d, %.1f", :integer => 10, :float => 43.4) + end + + test "String interpolates named placeholders with sprintf syntax, does not recurse" do + assert_equal "%s", I18n.interpolate("%{msg}", :msg => '%s', :not_translated => 'should not happen' ) + end + + test "String interpolation does not replace anything when no placeholders are given" do + assert_equal "aaa", I18n.interpolate("aaa", :num => 1) + end + + test "String interpolation sprintf behaviour equals Ruby 1.9 behaviour" do + assert_equal "1", I18n.interpolate("%d", :num => 1) + assert_equal "0b1", I18n.interpolate("%#b", :num => 1) + assert_equal "foo", I18n.interpolate("%s", :msg => "foo") + assert_equal "1.000000", I18n.interpolate("%f", :num => 1.0) + assert_equal " 1", I18n.interpolate("%3.0f", :num => 1.0) + assert_equal "100.00", I18n.interpolate("%2.2f", :num => 100.0) + assert_equal "0x64", I18n.interpolate("%#x", :num => 100.0) + assert_raise(ArgumentError) { I18n.interpolate("%,d", :num => 100) } + assert_raise(ArgumentError) { I18n.interpolate("%/d", :num => 100) } + end + + test "String interpolation raises an I18n::MissingInterpolationArgument when the string has extra placeholders" do + assert_raise(I18n::MissingInterpolationArgument) do # Ruby 1.9 msg: "key not found" + I18n.interpolate("%{first} %{last}", :first => 'Masao') + end + end + + test "String interpolation does not raise when extra values were passed" do + assert_nothing_raised do + assert_equal "Masao Mutoh", I18n.interpolate("%{first} %{last}", :first => 'Masao', :last => 'Mutoh', :salutation => 'Mr.' ) + end + end + + test "% acts as escape character in String interpolation" do + assert_equal "%{first}", I18n.interpolate("%%{first}", :first => 'Masao') + assert_equal "% 1", I18n.interpolate("%% %d", :num => 1.0) + assert_equal "%{num} %d", I18n.interpolate("%%{num} %%d", :num => 1) + end + + def test_sprintf_mix_unformatted_and_formatted_named_placeholders + assert_equal "foo 1.000000", I18n.interpolate("%{name} %f", :name => "foo", :num => 1.0) + end + + class RailsSafeBuffer < String + + def gsub(*args, &block) + to_str.gsub(*args, &block) + end + + end + test "with String subclass that redefined gsub method" do + assert_equal "Hello mars world", I18n.interpolate(RailsSafeBuffer.new("Hello %{planet} world"), :planet => 'mars') + end +end + +class I18nMissingInterpolationCustomHandlerTest < I18n::TestCase + def setup + super + @old_handler = I18n.config.missing_interpolation_argument_handler + I18n.config.missing_interpolation_argument_handler = lambda do |key, values, string| + "missing key is #{key}, values are #{values.inspect}, given string is '#{string}'" + end + end + + def teardown + I18n.config.missing_interpolation_argument_handler = @old_handler + super + end + + test "String interpolation can use custom missing interpolation handler" do + assert_equal %|Masao missing key is last, values are {:first=>"Masao"}, given string is '%{first} %{last}'|, + I18n.interpolate("%{first} %{last}", :first => 'Masao') + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/load_path_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/load_path_test.rb new file mode 100644 index 0000000..804aa88 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/load_path_test.rb @@ -0,0 +1,34 @@ +require 'test_helper' + +class I18nLoadPathTest < I18n::TestCase + def setup + super + I18n.locale = :en + I18n.backend = I18n::Backend::Simple.new + store_translations(:en, :foo => {:bar => 'bar', :baz => 'baz'}) + end + + test "nested load paths do not break locale loading" do + I18n.load_path = [[locales_dir + '/en.yml']] + assert_equal "baz", I18n.t(:'foo.bar') + end + + test "loading an empty yml file raises an InvalidLocaleData exception" do + assert_raise I18n::InvalidLocaleData do + I18n.load_path = [[locales_dir + '/invalid/empty.yml']] + I18n.t(:'foo.bar', :default => "baz") + end + end + + test "loading an invalid yml file raises an InvalidLocaleData exception" do + assert_raise I18n::InvalidLocaleData do + I18n.load_path = [[locales_dir + '/invalid/syntax.yml']] + I18n.t(:'foo.bar', :default => "baz") + end + end + + test "adding arrays of filenames to the load path does not break locale loading" do + I18n.load_path << Dir[locales_dir + '/*.{rb,yml}'] + assert_equal "baz", I18n.t(:'foo.bar') + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/middleware_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/middleware_test.rb new file mode 100644 index 0000000..2190d18 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n/middleware_test.rb @@ -0,0 +1,24 @@ +require 'test_helper' + +class I18nMiddlewareTest < I18n::TestCase + def setup + super + I18n.default_locale = :fr + @app = DummyRackApp.new + @middleware = I18n::Middleware.new(@app) + end + + test "middleware initializes new config object after request" do + old_i18n_config_object_id = Thread.current[:i18n_config].object_id + @middleware.call({}) + + updated_i18n_config_object_id = Thread.current[:i18n_config].object_id + assert_not_equal updated_i18n_config_object_id, old_i18n_config_object_id + end + + test "succesfully resets i18n locale to default locale by defining new config" do + @middleware.call({}) + + assert_equal :fr, I18n.locale + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n_test.rb new file mode 100644 index 0000000..39e98e5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/i18n_test.rb @@ -0,0 +1,446 @@ +# encoding: utf-8 +require 'test_helper' + +class I18nTest < I18n::TestCase + def setup + super + store_translations(:en, :currency => { :format => { :separator => '.', :delimiter => ',', } }) + store_translations(:nl, :currency => { :format => { :separator => ',', :delimiter => '.', } }) + store_translations(:en, "true" => "Yes", "false" => "No") + end + + test "exposes its VERSION constant" do + assert I18n::VERSION + end + + test "uses the simple backend by default" do + assert I18n.backend.is_a?(I18n::Backend::Simple) + end + + test "can set the backend" do + begin + assert_nothing_raised { I18n.backend = self } + assert_equal self, I18n.backend + ensure + I18n.backend = I18n::Backend::Simple.new + end + end + + test "uses :en as a default_locale by default" do + assert_equal :en, I18n.default_locale + end + + test "can set the default locale" do + begin + assert_nothing_raised { I18n.default_locale = 'de' } + assert_equal :de, I18n.default_locale + ensure + I18n.default_locale = :en + end + end + + test "default_locale= doesn't ignore junk" do + assert_raise(NoMethodError) { I18n.default_locale = Class } + end + + test "raises an I18n::InvalidLocale exception when setting an unavailable default locale" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.default_locale = :klingon } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "uses the default locale as a locale by default" do + assert_equal I18n.default_locale, I18n.locale + end + + test "sets the current locale to Thread.current" do + assert_nothing_raised { I18n.locale = 'de' } + assert_equal :de, I18n.locale + assert_equal :de, Thread.current[:i18n_config].locale + I18n.locale = :en + end + + test "locale= doesn't ignore junk" do + assert_raise(NoMethodError) { I18n.locale = Class } + end + + test "raises an I18n::InvalidLocale exception when setting an unavailable locale" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.locale = :klingon } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "can set the configuration object" do + begin + I18n.config = self + assert_equal self, I18n.config + assert_equal self, Thread.current[:i18n_config] + ensure + I18n.config = ::I18n::Config.new + end + end + + test "locale is not shared between configurations" do + a = I18n::Config.new + b = I18n::Config.new + a.locale = :fr + b.locale = :es + assert_equal :fr, a.locale + assert_equal :es, b.locale + assert_equal :en, I18n.locale + end + + test "other options are shared between configurations" do + begin + a = I18n::Config.new + b = I18n::Config.new + a.default_locale = :fr + b.default_locale = :es + assert_equal :es, a.default_locale + assert_equal :es, b.default_locale + assert_equal :es, I18n.default_locale + ensure + I18n.default_locale = :en + end + end + + test "uses a dot as a default_separator by default" do + assert_equal '.', I18n.default_separator + end + + test "can set the default_separator" do + begin + assert_nothing_raised { I18n.default_separator = "\001" } + ensure + I18n.default_separator = '.' + end + end + + test "normalize_keys normalizes given locale, keys and scope to an array of single-key symbols" do + assert_equal [:en, :foo, :bar], I18n.normalize_keys(:en, :bar, :foo) + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz.buz', :'foo.bar') + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, 'baz.buz', 'foo.bar') + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, %w(baz buz), %w(foo bar)) + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, [:baz, :buz], [:foo, :bar]) + end + + test "normalize_keys discards empty keys" do + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz..buz', :'foo..bar') + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz......buz', :'foo......bar') + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, ['baz', nil, '', 'buz'], ['foo', nil, '', 'bar']) + end + + test "normalize_keys uses a given separator" do + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz|buz', :'foo|bar', '|') + end + + test "can set the exception_handler" do + begin + previous_exception_handler = I18n.exception_handler + assert_nothing_raised { I18n.exception_handler = :custom_exception_handler } + ensure + I18n.exception_handler = previous_exception_handler + end + end + + test "uses a custom exception handler set to I18n.exception_handler" do + begin + previous_exception_handler = I18n.exception_handler + I18n.exception_handler = :custom_exception_handler + I18n.expects(:custom_exception_handler) + I18n.translate :bogus + ensure + I18n.exception_handler = previous_exception_handler + end + end + + test "uses a custom exception handler passed as an option" do + I18n.expects(:custom_exception_handler) + I18n.translate(:bogus, :exception_handler => :custom_exception_handler) + end + + test "delegates translate calls to the backend" do + I18n.backend.expects(:translate).with('de', :foo, {}) + I18n.translate :foo, :locale => 'de' + end + + test "delegates localize calls to the backend" do + I18n.backend.expects(:localize).with('de', :whatever, :default, {}) + I18n.localize :whatever, :locale => 'de' + end + + test "translate given no locale uses the current locale" do + I18n.backend.expects(:translate).with(:en, :foo, {}) + I18n.translate :foo + end + + test "translate works with nested symbol keys" do + assert_equal ".", I18n.t(:'currency.format.separator') + end + + test "translate works with nested string keys" do + assert_equal ".", I18n.t('currency.format.separator') + end + + test "translate with an array as a scope works" do + assert_equal ".", I18n.t(:separator, :scope => %w(currency format)) + end + + test "translate with an array containing dot separated strings as a scope works" do + assert_equal ".", I18n.t(:separator, :scope => ['currency.format']) + end + + test "translate with an array of keys and a dot separated string as a scope works" do + assert_equal [".", ","], I18n.t(%w(separator delimiter), :scope => 'currency.format') + end + + test "translate with an array of dot separated keys and a scope works" do + assert_equal [".", ","], I18n.t(%w(format.separator format.delimiter), :scope => 'currency') + end + + # def test_translate_given_no_args_raises_missing_translation_data + # assert_equal "translation missing: en, no key", I18n.t + # end + + test "translate given a bogus key returns an error message" do + assert_equal "translation missing: en.bogus", I18n.t(:bogus) + end + + test "translate given an empty string as a key raises an I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.t("") } + end + + test "translate given an unavailable locale rases an I18n::InvalidLocale" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.t(:foo, :locale => 'klingon') } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "translate given true as a key works" do + assert_equal "Yes", I18n.t(true) + end + + test "translate given false as a key works" do + assert_equal "No", I18n.t(false) + end + + test "available_locales can be replaced at runtime" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.t(:foo, :locale => 'klingon') } + old_locales, I18n.config.available_locales = I18n.config.available_locales, [:klingon] + I18n.t(:foo, :locale => 'klingon') + ensure + I18n.config.enforce_available_locales = false + I18n.config.available_locales = old_locales + end + end + + test "available_locales_set should return a set" do + assert_equal Set, I18n.config.available_locales_set.class + assert_equal I18n.config.available_locales.size * 2, I18n.config.available_locales_set.size + end + + test "exists? given an existing key will return true" do + assert_equal true, I18n.exists?(:currency) + end + + test "exists? given a non-existing key will return false" do + assert_equal false, I18n.exists?(:bogus) + end + + test "exists? given an existing dot-separated key will return true" do + assert_equal true, I18n.exists?('currency.format.delimiter') + end + + test "exists? given a non-existing dot-separated key will return false" do + assert_equal false, I18n.exists?('currency.format.bogus') + end + + test "exists? given an existing key and an existing locale will return true" do + assert_equal true, I18n.exists?(:currency, :nl) + end + + test "exists? given a non-existing key and an existing locale will return false" do + assert_equal false, I18n.exists?(:bogus, :nl) + end + + test "localize given nil raises an I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.l nil } + end + + test "localize given nil and default returns default" do + assert_nil I18n.l(nil, :default => nil) + end + + test "localize given an Object raises an I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.l Object.new } + end + + test "localize given an unavailable locale rases an I18n::InvalidLocale" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.l(Time.now, :locale => 'klingon') } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "can use a lambda as an exception handler" do + begin + previous_exception_handler = I18n.exception_handler + I18n.exception_handler = Proc.new { |exception, locale, key, options| key } + assert_equal :test_proc_handler, I18n.translate(:test_proc_handler) + ensure + I18n.exception_handler = previous_exception_handler + end + end + + test "can use an object responding to #call as an exception handler" do + begin + previous_exception_handler = I18n.exception_handler + I18n.exception_handler = Class.new do + def call(exception, locale, key, options); key; end + end.new + assert_equal :test_proc_handler, I18n.translate(:test_proc_handler) + ensure + I18n.exception_handler = previous_exception_handler + end + end + + test "I18n.with_locale temporarily sets the given locale" do + store_translations(:en, :foo => 'Foo in :en') + store_translations(:de, :foo => 'Foo in :de') + store_translations(:pl, :foo => 'Foo in :pl') + + I18n.with_locale { assert_equal [:en, 'Foo in :en'], [I18n.locale, I18n.t(:foo)] } + I18n.with_locale(:de) { assert_equal [:de, 'Foo in :de'], [I18n.locale, I18n.t(:foo)] } + I18n.with_locale(:pl) { assert_equal [:pl, 'Foo in :pl'], [I18n.locale, I18n.t(:foo)] } + I18n.with_locale(:en) { assert_equal [:en, 'Foo in :en'], [I18n.locale, I18n.t(:foo)] } + + assert_equal I18n.default_locale, I18n.locale + end + + test "I18n.with_locale resets the locale in case of errors" do + assert_raise(I18n::ArgumentError) { I18n.with_locale(:pl) { raise I18n::ArgumentError } } + assert_equal I18n.default_locale, I18n.locale + end + + test "I18n.translitarate handles I18n::ArgumentError exception" do + I18n::Backend::Transliterator.stubs(:get).raises(I18n::ArgumentError) + I18n.exception_handler.expects(:call).raises(I18n::ArgumentError) + assert_raise(I18n::ArgumentError) { + I18n.transliterate("ąćó") + } + end + + test "I18n.translitarate raises I18n::ArgumentError exception" do + I18n::Backend::Transliterator.stubs(:get).raises(I18n::ArgumentError) + I18n.exception_handler.expects(:call).never + assert_raise(I18n::ArgumentError) { + I18n.transliterate("ąćó", :raise => true) + } + end + + test "transliterate given an unavailable locale rases an I18n::InvalidLocale" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.transliterate('string', :locale => 'klingon') } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "transliterate non-ASCII chars not in map with default replacement char" do + assert_equal "???", I18n.transliterate("日本語") + end + + test "I18n.locale_available? returns true when the passed locale is available" do + I18n.available_locales = [:en, :de] + assert_equal true, I18n.locale_available?(:de) + end + + test "I18n.locale_available? returns true when the passed locale is a string and is available" do + I18n.available_locales = [:en, :de] + assert_equal true, I18n.locale_available?('de') + end + + test "I18n.locale_available? returns false when the passed locale is unavailable" do + assert_equal false, I18n.locale_available?(:klingon) + end + + test "I18n.enforce_available_locales! raises an I18n::InvalidLocale when the passed locale is unavailable" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.enforce_available_locales!(:klingon) } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "I18n.enforce_available_locales! does nothing when the passed locale is available" do + I18n.available_locales = [:en, :de] + begin + I18n.config.enforce_available_locales = true + assert_nothing_raised { I18n.enforce_available_locales!(:en) } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "I18n.enforce_available_locales config can be set to false" do + begin + I18n.config.enforce_available_locales = false + assert_equal false, I18n.config.enforce_available_locales + ensure + I18n.config.enforce_available_locales = false + end + end + + test 'I18n.reload! reloads the set of locales that are enforced' do + begin + # Clear the backend that affects the available locales and somehow can remain + # set from the last running test. + # For instance, it contains enough translations to cause a false positive with + # this test when ran with --seed=50992 + I18n.backend = I18n::Backend::Simple.new + + assert !I18n.available_locales.include?(:de), "Available locales should not include :de at this point" + + I18n.enforce_available_locales = true + + assert_raise(I18n::InvalidLocale) { I18n.default_locale = :de } + assert_raise(I18n::InvalidLocale) { I18n.locale = :de } + + store_translations(:de, :foo => 'Foo in :de') + + assert_raise(I18n::InvalidLocale) { I18n.default_locale = :de } + assert_raise(I18n::InvalidLocale) { I18n.locale = :de } + + I18n.reload! + + store_translations(:en, :foo => 'Foo in :en') + store_translations(:de, :foo => 'Foo in :de') + store_translations(:pl, :foo => 'Foo in :pl') + + assert I18n.available_locales.include?(:de), ":de should now be allowed" + assert I18n.available_locales.include?(:en), ":en should now be allowed" + assert I18n.available_locales.include?(:pl), ":pl should now be allowed" + + assert_nothing_raised { I18n.default_locale = I18n.locale = :en } + assert_nothing_raised { I18n.default_locale = I18n.locale = :de } + assert_nothing_raised { I18n.default_locale = I18n.locale = :pl } + ensure + I18n.enforce_available_locales = false + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/fallbacks_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/fallbacks_test.rb new file mode 100644 index 0000000..7a43852 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/fallbacks_test.rb @@ -0,0 +1,133 @@ +require 'test_helper' + +include I18n::Locale + +class I18nFallbacksDefaultsTest < I18n::TestCase + test "defaults reflect the I18n.default_locale if no default has been set manually" do + I18n.default_locale = :'en-US' + fallbacks = Fallbacks.new + assert_equal [:'en-US', :en], fallbacks.defaults + end + + test "defaults reflect a manually passed default locale if any" do + fallbacks = Fallbacks.new(:'fi-FI') + assert_equal [:'fi-FI', :fi], fallbacks.defaults + I18n.default_locale = :'de-DE' + assert_equal [:'fi-FI', :fi], fallbacks.defaults + end + + test "defaults allows to set multiple defaults" do + fallbacks = Fallbacks.new(:'fi-FI', :'se-FI') + assert_equal [:'fi-FI', :fi, :'se-FI', :se], fallbacks.defaults + end +end + +class I18nFallbacksComputationTest < I18n::TestCase + def setup + super + @fallbacks = Fallbacks.new(:'en-US') + end + + test "with no mappings defined it returns [:es, :en-US] for :es" do + assert_equal [:es, :"en-US", :en], @fallbacks[:es] + end + + test "with no mappings defined it returns [:es-ES, :es, :en-US] for :es-ES" do + assert_equal [:"es-ES", :es, :"en-US", :en], @fallbacks[:"es-ES"] + end + + test "with no mappings defined it returns [:es-MX, :es, :en-US] for :es-MX" do + assert_equal [:"es-MX", :es, :"en-US", :en], @fallbacks[:"es-MX"] + end + + test "with no mappings defined it returns [:es-Latn-ES, :es-Latn, :es, :en-US] for :es-Latn-ES" do + assert_equal [:"es-Latn-ES", :"es-Latn", :es, :"en-US", :en], @fallbacks[:'es-Latn-ES'] + end + + test "with no mappings defined it returns [:en, :en-US] for :en" do + assert_equal [:en, :"en-US"], @fallbacks[:en] + end + + test "with no mappings defined it returns [:en-US, :en] for :en-US (special case: locale == default)" do + assert_equal [:"en-US", :en], @fallbacks[:"en-US"] + end + + # Most people who speak Catalan also live in Spain, so it is safe to assume + # that they also speak Spanish as spoken in Spain. + test "with a Catalan mapping defined it returns [:ca, :es-ES, :es, :en-US] for :ca" do + @fallbacks.map(:ca => :"es-ES") + assert_equal [:ca, :"es-ES", :es, :"en-US", :en], @fallbacks[:ca] + end + + test "with a Catalan mapping defined it returns [:ca-ES, :ca, :es-ES, :es, :en-US] for :ca-ES" do + @fallbacks.map(:ca => :"es-ES") + assert_equal [:"ca-ES", :ca, :"es-ES", :es, :"en-US", :en], @fallbacks[:"ca-ES"] + end + + # People who speak Arabic as spoken in Palestine often times also speak + # Hebrew as spoken in Israel. However it is in no way safe to assume that + # everybody who speaks Arabic also speaks Hebrew. + + test "with a Hebrew mapping defined it returns [:ar, :en-US] for :ar" do + @fallbacks.map(:"ar-PS" => :"he-IL") + assert_equal [:ar, :"en-US", :en], @fallbacks[:ar] + end + + test "with a Hebrew mapping defined it returns [:ar-EG, :ar, :en-US] for :ar-EG" do + @fallbacks.map(:"ar-PS" => :"he-IL") + assert_equal [:"ar-EG", :ar, :"en-US", :en], @fallbacks[:"ar-EG"] + end + + test "with a Hebrew mapping defined it returns [:ar-PS, :ar, :he-IL, :he, :en-US] for :ar-PS" do + @fallbacks.map(:"ar-PS" => :"he-IL") + assert_equal [:"ar-PS", :ar, :"he-IL", :he, :"en-US", :en], @fallbacks[:"ar-PS"] + end + + # Sami people live in several scandinavian countries. In Finnland many people + # know Swedish and Finnish. Thus, it can be assumed that Sami living in + # Finnland also speak Swedish and Finnish. + + test "with a Sami mapping defined it returns [:sms-FI, :sms, :se-FI, :se, :fi-FI, :fi, :en-US] for :sms-FI" do + @fallbacks.map(:sms => [:"se-FI", :"fi-FI"]) + assert_equal [:"sms-FI", :sms, :"se-FI", :se, :"fi-FI", :fi, :"en-US", :en], @fallbacks[:"sms-FI"] + end + + # Austrian people understand German as spoken in Germany + + test "with a German mapping defined it returns [:de, :en-US] for de" do + @fallbacks.map(:"de-AT" => :"de-DE") + assert_equal [:de, :"en-US", :en], @fallbacks[:"de"] + end + + test "with a German mapping defined it returns [:de-DE, :de, :en-US] for de-DE" do + @fallbacks.map(:"de-AT" => :"de-DE") + assert_equal [:"de-DE", :de, :"en-US", :en], @fallbacks[:"de-DE"] + end + + test "with a German mapping defined it returns [:de-AT, :de, :de-DE, :en-US] for de-AT" do + @fallbacks.map(:"de-AT" => :"de-DE") + assert_equal [:"de-AT", :de, :"de-DE", :"en-US", :en], @fallbacks[:"de-AT"] + end + + # Mapping :de => :en, :he => :en + + test "with a mapping :de => :en, :he => :en defined it returns [:de, :en] for :de" do + assert_equal [:de, :"en-US", :en], @fallbacks[:de] + end + + test "with a mapping :de => :en, :he => :en defined it [:he, :en] for :de" do + assert_equal [:he, :"en-US", :en], @fallbacks[:he] + end + + # Test allowing mappings that fallback to each other + + test "with :no => :nb, :nb => :no defined :no returns [:no, :nb, :en-US, :en]" do + @fallbacks.map(:no => :nb, :nb => :no) + assert_equal [:no, :nb, :"en-US", :en], @fallbacks[:no] + end + + test "with :no => :nb, :nb => :no defined :nb returns [:nb, :no, :en-US, :en]" do + @fallbacks.map(:no => :nb, :nb => :no) + assert_equal [:nb, :no, :"en-US", :en], @fallbacks[:nb] + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/tag/rfc4646_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/tag/rfc4646_test.rb new file mode 100644 index 0000000..a0f4286 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/tag/rfc4646_test.rb @@ -0,0 +1,143 @@ +# encoding: utf-8 +require 'test_helper' + +class I18nLocaleTagRfc4646ParserTest < I18n::TestCase + include I18n::Locale + + test "Rfc4646::Parser given a valid tag 'de' returns an array of subtags" do + assert_equal ['de', nil, nil, nil, nil, nil, nil], Tag::Rfc4646::Parser.match('de') + end + + test "Rfc4646::Parser given a valid tag 'de-DE' returns an array of subtags" do + assert_equal ['de', nil, 'DE', nil, nil, nil, nil], Tag::Rfc4646::Parser.match('de-DE') + end + + test "Rfc4646::Parser given a valid lowercase tag 'de-latn-de-variant-x-phonebk' returns an array of subtags" do + assert_equal ['de', 'latn', 'de', 'variant', nil, 'x-phonebk', nil], Tag::Rfc4646::Parser.match('de-latn-de-variant-x-phonebk') + end + + test "Rfc4646::Parser given a valid uppercase tag 'DE-LATN-DE-VARIANT-X-PHONEBK' returns an array of subtags" do + assert_equal ['DE', 'LATN', 'DE', 'VARIANT', nil, 'X-PHONEBK', nil], Tag::Rfc4646::Parser.match('DE-LATN-DE-VARIANT-X-PHONEBK') + end + + test "Rfc4646::Parser given an invalid tag 'a-DE' it returns false" do + assert_equal false, Tag::Rfc4646::Parser.match('a-DE') + end + + test "Rfc4646::Parser given an invalid tag 'de-419-DE' it returns false" do + assert_equal false, Tag::Rfc4646::Parser.match('de-419-DE') + end +end + +# Tag for the locale 'de-Latn-DE-Variant-a-ext-x-phonebk-i-klingon' + +class I18nLocaleTagSubtagsTest < I18n::TestCase + include I18n::Locale + + def setup + super + subtags = %w(de Latn DE variant a-ext x-phonebk i-klingon) + @tag = Tag::Rfc4646.new(*subtags) + end + + test "returns 'de' as the language subtag in lowercase" do + assert_equal 'de', @tag.language + end + + test "returns 'Latn' as the script subtag in titlecase" do + assert_equal 'Latn', @tag.script + end + + test "returns 'DE' as the region subtag in uppercase" do + assert_equal 'DE', @tag.region + end + + test "returns 'variant' as the variant subtag in lowercase" do + assert_equal 'variant', @tag.variant + end + + test "returns 'a-ext' as the extension subtag" do + assert_equal 'a-ext', @tag.extension + end + + test "returns 'x-phonebk' as the privateuse subtag" do + assert_equal 'x-phonebk', @tag.privateuse + end + + test "returns 'i-klingon' as the grandfathered subtag" do + assert_equal 'i-klingon', @tag.grandfathered + end + + test "returns a formatted tag string from #to_s" do + assert_equal 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon', @tag.to_s + end + + test "returns an array containing the formatted subtags from #to_a" do + assert_equal %w(de Latn DE variant a-ext x-phonebk i-klingon), @tag.to_a + end +end + +# Tag inheritance + +class I18nLocaleTagSubtagsTest < I18n::TestCase + test "#parent returns 'de-Latn-DE-variant-a-ext-x-phonebk' as the parent of 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon'" do + tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk i-klingon)) + assert_equal 'de-Latn-DE-variant-a-ext-x-phonebk', tag.parent.to_s + end + + test "#parent returns 'de-Latn-DE-variant-a-ext' as the parent of 'de-Latn-DE-variant-a-ext-x-phonebk'" do + tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk)) + assert_equal 'de-Latn-DE-variant-a-ext', tag.parent.to_s + end + + test "#parent returns 'de-Latn-DE-variant' as the parent of 'de-Latn-DE-variant-a-ext'" do + tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext)) + assert_equal 'de-Latn-DE-variant', tag.parent.to_s + end + + test "#parent returns 'de-Latn-DE' as the parent of 'de-Latn-DE-variant'" do + tag = Tag::Rfc4646.new(*%w(de Latn DE variant)) + assert_equal 'de-Latn-DE', tag.parent.to_s + end + + test "#parent returns 'de-Latn' as the parent of 'de-Latn-DE'" do + tag = Tag::Rfc4646.new(*%w(de Latn DE)) + assert_equal 'de-Latn', tag.parent.to_s + end + + test "#parent returns 'de' as the parent of 'de-Latn'" do + tag = Tag::Rfc4646.new(*%w(de Latn)) + assert_equal 'de', tag.parent.to_s + end + + # TODO RFC4647 says: "If no language tag matches the request, the "default" value is returned." + # where should we set the default language? + # test "#parent returns '' as the parent of 'de'" do + # tag = Tag::Rfc4646.new *%w(de) + # assert_equal '', tag.parent.to_s + # end + + test "#parent returns an array of 5 parents for 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon'" do + parents = %w(de-Latn-DE-variant-a-ext-x-phonebk-i-klingon + de-Latn-DE-variant-a-ext-x-phonebk + de-Latn-DE-variant-a-ext + de-Latn-DE-variant + de-Latn-DE + de-Latn + de) + tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk i-klingon)) + assert_equal parents, tag.self_and_parents.map(&:to_s) + end + + test "returns an array of 5 parents for 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon'" do + parents = %w(de-Latn-DE-variant-a-ext-x-phonebk-i-klingon + de-Latn-DE-variant-a-ext-x-phonebk + de-Latn-DE-variant-a-ext + de-Latn-DE-variant + de-Latn-DE + de-Latn + de) + tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk i-klingon)) + assert_equal parents, tag.self_and_parents.map(&:to_s) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/tag/simple_test.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/tag/simple_test.rb new file mode 100644 index 0000000..002c63d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/locale/tag/simple_test.rb @@ -0,0 +1,32 @@ +# encoding: utf-8 +require 'test_helper' + +class I18nLocaleTagSimpleTest < I18n::TestCase + include I18n::Locale + + test "returns 'de' as the language subtag in lowercase" do + assert_equal %w(de Latn DE), Tag::Simple.new('de-Latn-DE').subtags + end + + test "returns a formatted tag string from #to_s" do + assert_equal 'de-Latn-DE', Tag::Simple.new('de-Latn-DE').to_s + end + + test "returns an array containing the formatted subtags from #to_a" do + assert_equal %w(de Latn DE), Tag::Simple.new('de-Latn-DE').to_a + end + + # Tag inheritance + + test "#parent returns 'de-Latn' as the parent of 'de-Latn-DE'" do + assert_equal 'de-Latn', Tag::Simple.new('de-Latn-DE').parent.to_s + end + + test "#parent returns 'de' as the parent of 'de-Latn'" do + assert_equal 'de', Tag::Simple.new('de-Latn').parent.to_s + end + + test "#self_and_parents returns an array of 3 tags for 'de-Latn-DE'" do + assert_equal %w(de-Latn-DE de-Latn de), Tag::Simple.new('de-Latn-DE').self_and_parents.map { |tag| tag.to_s} + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/run_all.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/run_all.rb new file mode 100644 index 0000000..64ff743 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/run_all.rb @@ -0,0 +1,20 @@ +def bundle_check + `bundle check` == "Resolving dependencies...\nThe Gemfile's dependencies are satisfied\n" +end + +def execute(command) + puts command + system command +end + +gemfiles = %w(Gemfile) + Dir['gemfiles/Gemfile*'].reject { |f| f.end_with?('.lock') } + +results = gemfiles.map do |gemfile| + puts "\nBUNDLE_GEMFILE=#{gemfile}" + ENV['BUNDLE_GEMFILE'] = File.expand_path("../../#{gemfile}", __FILE__) + + execute 'bundle install' unless bundle_check + execute 'bundle exec rake test' +end + +exit results.all? diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/de.po b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/de.po new file mode 100644 index 0000000..f3c9998 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/de.po @@ -0,0 +1,82 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: version 0.0.1\n" +"POT-Creation-Date: 2009-02-26 19:50+0100\n" +"PO-Revision-Date: 2009-02-18 14:53+0100\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +# #: app/helpers/translation_helper.rb:3 +# msgid "%{relative_time} ago" +# msgstr "vor %{relative_time}" + +#: app/views/cars/show.html.erb:5 +msgid "Axis" +msgid_plural "Axis" +msgstr[0] "Achse" +msgstr[1] "Achsen" + +#: app/controllers/cars_controller.rb:47 +msgid "Car was successfully created." +msgstr "Auto wurde erfolgreich gespeichert" + +#: app/controllers/cars_controller.rb:64 +msgid "Car was successfully updated." +msgstr "Auto wurde erfolgreich aktualisiert" + +#: app/views/cars/show.html.erb:1 locale/model_attributes.rb:3 +msgid "Car|Model" +msgstr "Modell" + +#: app/views/cars/show.html.erb:3 locale/model_attributes.rb:4 +msgid "Car|Wheels count" +msgstr "Räderzahl" + +msgctxt "New car" +msgid "Wheels count" +msgstr "Räderzahl!" + +#: app/views/cars/show.html.erb:7 +msgid "Created" +msgstr "Erstellt" + +#: app/views/cars/show.html.erb:9 +msgid "Month" +msgstr "Monat" + +#: locale/model_attributes.rb:2 +msgid "car" +msgstr "Auto" + +#: locale/testlog_phrases.rb:2 +msgid "this is a dynamic translation which was found thorugh gettext_test_log!" +msgstr "" +"Dies ist eine dynamische Übersetzung, die durch gettext_test_log " +"gefunden wurde!" + +#: app/views/cars/nowhere_really +msgid "Car|wheel" +msgid_plural "Car|wheels" +msgstr[0] "Rad" +msgstr[1] "Räder" + +msgctxt "New car" +msgid "wheel" +msgid_plural "wheels" +msgstr[0] "Rad!" +msgstr[1] "Räder!" + +msgid "On %{count} wheel." +msgid_plural "On %{count} wheels." +msgstr[0] "Auf %{count} Achse." +msgstr[1] "Auf %{count} Achsen." diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/en.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/en.rb new file mode 100644 index 0000000..e847d10 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/en.rb @@ -0,0 +1,3 @@ +# encoding: utf-8 + +{ :en => { :fuh => { :bah => "bas" } } } \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/en.yml b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/en.yml new file mode 100644 index 0000000..25f5bb6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/en.yml @@ -0,0 +1,3 @@ +en: + foo: + bar: baz \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/invalid/empty.yml b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/invalid/empty.yml new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/invalid/syntax.yml b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/invalid/syntax.yml new file mode 100644 index 0000000..40b1e61 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/invalid/syntax.yml @@ -0,0 +1,4 @@ +en: + foo: foo + bar: + baz: \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/plurals.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/plurals.rb new file mode 100644 index 0000000..f400285 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_data/locales/plurals.rb @@ -0,0 +1,113 @@ +# encoding: utf-8 + +{ + :af => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :am => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :ar => { :i18n => { :plural => { :keys => [:zero, :one, :two, :few, :many, :other], :rule => lambda { |n| n == 0 ? :zero : n == 1 ? :one : n == 2 ? :two : [3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [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].include?(n % 100) ? :many : :other } } } }, + :az => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :be => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :bg => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :bh => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :bn => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :bo => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :bs => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :ca => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :cs => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other } } } }, + :cy => { :i18n => { :plural => { :keys => [:one, :two, :many, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : n == 8 || n == 11 ? :many : :other } } } }, + :da => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :de => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :dz => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :el => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :en => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :eo => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :es => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :et => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :eu => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :fa => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :fi => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :fil => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :fo => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :fr => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n.between?(0, 2) && n != 2 ? :one : :other } } } }, + :fur => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :fy => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ga => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :gl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :gu => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :guw => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :ha => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :he => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :hi => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :hr => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :hu => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :id => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :is => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :it => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :iw => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ja => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :jv => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :ka => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :km => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :kn => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :ko => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :ku => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :lb => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ln => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :lt => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n % 10 == 1 && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :one : [2, 3, 4, 5, 6, 7, 8, 9].include?(n % 10) && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :few : :other } } } }, + :lv => { :i18n => { :plural => { :keys => [:zero, :one, :other], :rule => lambda { |n| n == 0 ? :zero : n % 10 == 1 && n % 100 != 11 ? :one : :other } } } }, + :mg => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :mk => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n % 10 == 1 ? :one : :other } } } }, + :ml => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :mn => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :mo => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 ? :few : :other } } } }, + :mr => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ms => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :mt => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 || [2, 3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :many : :other } } } }, + :my => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :nah => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :nb => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ne => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :nl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :nn => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :no => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :nso => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :om => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :or => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :pa => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :pap => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :pl => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : (n != 1 && [0, 1].include?(n % 10)) || [5, 6, 7, 8, 9].include?(n % 10) || [12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :ps => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :pt => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :"pt-PT" => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ro => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 ? :few : :other } } } }, + :ru => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :se => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :sh => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :sk => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other } } } }, + :sl => { :i18n => { :plural => { :keys => [:one, :two, :few, :other], :rule => lambda { |n| n % 100 == 1 ? :one : n % 100 == 2 ? :two : [3, 4].include?(n % 100) ? :few : :other } } } }, + :sma => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :smi => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :smj => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :smn => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :sms => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :so => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :sq => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :sr => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :sv => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :sw => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ta => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :te => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :th => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :ti => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :tk => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :tl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :to => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :tr => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :uk => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :ur => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :vi => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :wa => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :yo => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :zh => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :zu => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } } +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_helper.rb b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_helper.rb new file mode 100644 index 0000000..702a1b5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/i18n-0.9.1/test/test_helper.rb @@ -0,0 +1,61 @@ +$KCODE = 'u' if RUBY_VERSION <= '1.9' + +require 'minitest/autorun' +TEST_CASE = defined?(Minitest::Test) ? Minitest::Test : MiniTest::Unit::TestCase + +# TODO: Remove these aliases and update tests accordingly. +class TEST_CASE + alias :assert_raise :assert_raises + alias :assert_not_equal :refute_equal + + def assert_nothing_raised(*args) + yield + end +end + +require 'bundler/setup' +require 'i18n' +require 'mocha/setup' +require 'test_declarative' + +class I18n::TestCase < TEST_CASE + def self.key_value? + defined?(ActiveSupport) + end + + def setup + super + I18n.enforce_available_locales = false + end + + def teardown + I18n.locale = nil + I18n.default_locale = nil + I18n.load_path = nil + I18n.available_locales = nil + I18n.backend = nil + I18n.default_separator = nil + I18n.enforce_available_locales = true + super + end + + protected + + def translations + I18n.backend.instance_variable_get(:@translations) + end + + def store_translations(locale, data) + I18n.backend.store_translations(locale, data) + end + + def locales_dir + File.dirname(__FILE__) + '/test_data/locales' + end +end + +class DummyRackApp + def call(env) + I18n.locale = :es + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/.rubocop.yml b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/.rubocop.yml new file mode 100644 index 0000000..969c065 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/.rubocop.yml @@ -0,0 +1,154 @@ +--- +AllCops: + TargetRubyVersion: 2.1 + Include: + - lib/**/*.rb + Exclude: + - bin/**/* + - exe/**/* + - benchmark/**/* + - script/**/* + - vendor/**/* + - tmp/**/* +Layout/AlignArray: + Enabled: false +Layout/AlignHash: + EnforcedHashRocketStyle: table +Layout/AlignParameters: + Enabled: false +Layout/EmptyLinesAroundAccessModifier: + Enabled: false +Layout/EmptyLinesAroundModuleBody: + Enabled: false +Layout/EndOfLine: + EnforcedStyle: native +Layout/ExtraSpacing: + AllowForAlignment: true +Layout/FirstParameterIndentation: + EnforcedStyle: consistent +Layout/IndentationWidth: + Severity: error +Layout/IndentArray: + EnforcedStyle: consistent +Layout/IndentHash: + EnforcedStyle: consistent +Layout/IndentHeredoc: + Enabled: false +Layout/MultilineMethodCallIndentation: + EnforcedStyle: indented +Layout/MultilineOperationIndentation: + EnforcedStyle: indented +Layout/SpaceInsideBrackets: + Enabled: false +Lint/EndAlignment: + Severity: error +Lint/UnreachableCode: + Severity: error +Lint/UselessAccessModifier: + Enabled: false +Lint/Void: + Enabled: false +Metrics/AbcSize: + Max: 21 +Metrics/BlockLength: + Exclude: + - test/**/*.rb + - lib/jekyll/configuration.rb + - rake/*.rake + - jekyll.gemspec +Metrics/ClassLength: + Exclude: + - !ruby/regexp /features\/.*.rb$/ + - !ruby/regexp /test\/.*.rb$/ + Max: 300 +Metrics/CyclomaticComplexity: + Max: 9 +Metrics/LineLength: + Exclude: + - !ruby/regexp /features\/.*.rb/ + - Rakefile + - rake/*.rake + - Gemfile + - jekyll.gemspec + Max: 90 + Severity: warning +Metrics/MethodLength: + CountComments: false + Max: 20 + Severity: error +Metrics/ModuleLength: + Max: 240 +Metrics/ParameterLists: + Max: 4 +Metrics/PerceivedComplexity: + Max: 8 +Naming/FileName: + Enabled: false +Naming/HeredocDelimiterNaming: + Enabled: false +Security/MarshalLoad: + Exclude: + - !ruby/regexp /test\/.*.rb$/ + - lib/jekyll/regenerator.rb +Security/YAMLLoad: + Exclude: + - !ruby/regexp /features\/.*.rb/ + - !ruby/regexp /test\/.*.rb$/ +Style/Alias: + Enabled: false +Style/AndOr: + Severity: error +Style/BracesAroundHashParameters: + Enabled: false +Style/ClassAndModuleChildren: + Enabled: false +Style/FrozenStringLiteralComment: + EnforcedStyle: always +Style/Documentation: + Enabled: false + Exclude: + - !ruby/regexp /features\/.*.rb$/ +Style/DoubleNegation: + Enabled: false +Style/GuardClause: + Enabled: false +Style/HashSyntax: + EnforcedStyle: hash_rockets + Severity: error +Style/IfUnlessModifier: + Enabled: false +Style/InverseMethods: + Enabled: false +Style/ModuleFunction: + Enabled: false +Style/MultilineTernaryOperator: + Severity: error +Style/PercentLiteralDelimiters: + PreferredDelimiters: + "%q": "{}" + "%Q": "{}" + "%r": "!!" + "%s": "()" + "%w": "()" + "%W": "()" + "%x": "()" +Style/RedundantReturn: + Enabled: false +Style/RedundantSelf: + Enabled: false +Style/RegexpLiteral: + EnforcedStyle: percent_r +Style/RescueModifier: + Enabled: false +Style/SignalException: + EnforcedStyle: only_raise +Style/SingleLineMethods: + Enabled: false +Style/StringLiterals: + EnforcedStyle: double_quotes +Style/StringLiteralsInInterpolation: + EnforcedStyle: double_quotes +Style/SymbolArray: + Enabled: false +Style/TrailingCommaInLiteral: + EnforcedStyleForMultiline: consistent_comma diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/LICENSE b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/LICENSE new file mode 100644 index 0000000..c98bc25 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2008-2018 Tom Preston-Werner and Jekyll contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/README.markdown b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/README.markdown new file mode 100644 index 0000000..7dac778 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/README.markdown @@ -0,0 +1,61 @@ +# [Jekyll](https://jekyllrb.com/) + +[![Gem Version](https://img.shields.io/gem/v/jekyll.svg)][ruby-gems] +[![Linux Build Status](https://img.shields.io/travis/jekyll/jekyll/master.svg?label=Linux%20build)][travis] +[![Windows Build status](https://img.shields.io/appveyor/ci/jekyll/jekyll/master.svg?label=Windows%20build)][appveyor] +[![Test Coverage](https://img.shields.io/codeclimate/coverage/github/jekyll/jekyll.svg)][coverage] +[![Code Climate](https://img.shields.io/codeclimate/github/jekyll/jekyll.svg)][codeclimate] +[![Dependency Status](https://img.shields.io/gemnasium/jekyll/jekyll.svg)][gemnasium] +[![Security](https://hakiri.io/github/jekyll/jekyll/master.svg)][hakiri] + +[ruby-gems]: https://rubygems.org/gems/jekyll +[gemnasium]: https://gemnasium.com/jekyll/jekyll +[codeclimate]: https://codeclimate.com/github/jekyll/jekyll +[coverage]: https://codeclimate.com/github/jekyll/jekyll/coverage +[hakiri]: https://hakiri.io/github/jekyll/jekyll/master +[travis]: https://travis-ci.org/jekyll/jekyll +[appveyor]: https://ci.appveyor.com/project/jekyll/jekyll/branch/master + +Jekyll is a simple, blog-aware, static site generator perfect for personal, project, or organization sites. Think of it like a file-based CMS, without all the complexity. Jekyll takes your content, renders Markdown and Liquid templates, and spits out a complete, static website ready to be served by Apache, Nginx or another web server. Jekyll is the engine behind [GitHub Pages](https://pages.github.com), which you can use to host sites right from your GitHub repositories. + +## Philosophy + +Jekyll does what you tell it to do — no more, no less. It doesn't try to outsmart users by making bold assumptions, nor does it burden them with needless complexity and configuration. Put simply, Jekyll gets out of your way and allows you to concentrate on what truly matters: your content. + +See: https://jekyllrb.com/philosophy + +## Having trouble? + +See: https://jekyllrb.com/docs/troubleshooting/ + +## Getting Started + +* [Install](https://jekyllrb.com/docs/installation/) the gem +* Read up about its [Usage](https://jekyllrb.com/docs/usage/) and [Configuration](https://jekyllrb.com/docs/configuration/) +* Take a gander at some existing [Sites](https://wiki.github.com/jekyll/jekyll/sites) +* [Fork](https://github.com/jekyll/jekyll/fork) and [Contribute](https://jekyllrb.com/docs/contributing/) your own modifications +* Have questions? Check out our official forum community [Jekyll Talk](https://talk.jekyllrb.com/) or [`#jekyll` on irc.freenode.net](https://botbot.me/freenode/jekyll/) + +## Code of Conduct + +In order to have a more open and welcoming community, Jekyll adheres to a +[code of conduct](CODE_OF_CONDUCT.markdown) adapted from the Ruby on Rails code of +conduct. + +Please adhere to this code of conduct in any interactions you have in the +Jekyll community. It is strictly enforced on all official Jekyll +repositories, websites, and resources. If you encounter someone violating +these terms, please let one of our core team members [Olivia](mailto:olivia@jekyllrb.com?subject=Jekyll%20CoC%20Violation), [Pat](mailto:pat@jekyllrb.com?subject=Jekyll%20CoC%20Violation), [Matt](mailto:matt@jekyllrb.com?subject=Jekyll%20CoC%20Violation) or [Parker](mailto:parker@jekyllrb.com?subject=Jekyll%20CoC%20Violation) know and we will address it as soon as possible. + +## Diving In + +* [Migrate](http://import.jekyllrb.com/docs/home/) from your previous system +* Learn how the [YAML Front Matter](https://jekyllrb.com/docs/frontmatter/) works +* Put information on your site with [Variables](https://jekyllrb.com/docs/variables/) +* Customize the [Permalinks](https://jekyllrb.com/docs/permalinks/) your posts are generated with +* Use the built-in [Liquid Extensions](https://jekyllrb.com/docs/templates/) to make your life easier +* Use custom [Plugins](https://jekyllrb.com/docs/plugins/) to generate content specific to your site + +## License + +See the [LICENSE](https://github.com/jekyll/jekyll/blob/master/LICENSE) file. diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/exe/jekyll b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/exe/jekyll new file mode 100755 index 0000000..07e1371 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/exe/jekyll @@ -0,0 +1,57 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +STDOUT.sync = true + +$LOAD_PATH.unshift File.expand_path("../lib", __dir__) + +require "jekyll" +require "mercenary" + +Jekyll::PluginManager.require_from_bundler + +Jekyll::Deprecator.process(ARGV) + +Mercenary.program(:jekyll) do |p| + p.version Jekyll::VERSION + p.description "Jekyll is a blog-aware, static site generator in Ruby" + p.syntax "jekyll [options]" + + p.option "source", "-s", "--source [DIR]", "Source directory (defaults to ./)" + p.option "destination", "-d", "--destination [DIR]", + "Destination directory (defaults to ./_site)" + p.option "safe", "--safe", "Safe mode (defaults to false)" + p.option "plugins_dir", "-p", "--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]", Array, + "Plugins directory (defaults to ./_plugins)" + p.option "layouts_dir", "--layouts DIR", String, + "Layouts directory (defaults to ./_layouts)" + p.option "profile", "--profile", "Generate a Liquid rendering profile" + + Jekyll::External.require_if_present(Jekyll::External.blessed_gems) do |g, ver_constraint| + cmd = g.split("-").last + p.command(cmd.to_sym) do |c| + c.syntax cmd + c.action do + Jekyll.logger.abort_with "You must install the '#{g}' gem" \ + " version #{ver_constraint} to use the 'jekyll #{cmd}' command." + end + end + end + + Jekyll::Command.subclasses.each { |c| c.init_with_program(p) } + + p.action do |args, _| + if args.empty? + Jekyll.logger.error "A subcommand is required." + puts p + abort + else + subcommand = args.first + unless p.has_command? subcommand + Jekyll.logger.abort_with "fatal: 'jekyll #{args.first}' could not" \ + " be found. You may need to install the jekyll-#{args.first} gem" \ + " or a related gem to be able to use this subcommand." + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll.rb new file mode 100644 index 0000000..c909c3d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll.rb @@ -0,0 +1,198 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift __dir__ # For use/testing when no gem is installed + +# Require all of the Ruby files in the given directory. +# +# path - The String relative path from here to the directory. +# +# Returns nothing. +def require_all(path) + glob = File.join(__dir__, path, "*.rb") + Dir[glob].sort.each do |f| + require f + end +end + +# rubygems +require "rubygems" + +# stdlib +require "pathutil" +require "forwardable" +require "fileutils" +require "time" +require "English" +require "pathname" +require "logger" +require "set" + +# 3rd party +require "safe_yaml/load" +require "liquid" +require "kramdown" +require "colorator" +require "i18n" + +SafeYAML::OPTIONS[:suppress_warnings] = true +I18n.config.available_locales = :en + +module Jekyll + # internal requires + autoload :Cleaner, "jekyll/cleaner" + autoload :Collection, "jekyll/collection" + autoload :Configuration, "jekyll/configuration" + autoload :Convertible, "jekyll/convertible" + autoload :Deprecator, "jekyll/deprecator" + autoload :Document, "jekyll/document" + autoload :EntryFilter, "jekyll/entry_filter" + autoload :Errors, "jekyll/errors" + autoload :Excerpt, "jekyll/excerpt" + autoload :External, "jekyll/external" + autoload :FrontmatterDefaults, "jekyll/frontmatter_defaults" + autoload :Hooks, "jekyll/hooks" + autoload :Layout, "jekyll/layout" + autoload :CollectionReader, "jekyll/readers/collection_reader" + autoload :DataReader, "jekyll/readers/data_reader" + autoload :LayoutReader, "jekyll/readers/layout_reader" + autoload :PostReader, "jekyll/readers/post_reader" + autoload :PageReader, "jekyll/readers/page_reader" + autoload :StaticFileReader, "jekyll/readers/static_file_reader" + autoload :ThemeAssetsReader, "jekyll/readers/theme_assets_reader" + autoload :LogAdapter, "jekyll/log_adapter" + autoload :Page, "jekyll/page" + autoload :PageWithoutAFile, "jekyll/page_without_a_file" + autoload :PluginManager, "jekyll/plugin_manager" + autoload :Publisher, "jekyll/publisher" + autoload :Reader, "jekyll/reader" + autoload :Regenerator, "jekyll/regenerator" + autoload :RelatedPosts, "jekyll/related_posts" + autoload :Renderer, "jekyll/renderer" + autoload :LiquidRenderer, "jekyll/liquid_renderer" + autoload :Site, "jekyll/site" + autoload :StaticFile, "jekyll/static_file" + autoload :Stevenson, "jekyll/stevenson" + autoload :Theme, "jekyll/theme" + autoload :ThemeBuilder, "jekyll/theme_builder" + autoload :URL, "jekyll/url" + autoload :Utils, "jekyll/utils" + autoload :VERSION, "jekyll/version" + + # extensions + require "jekyll/plugin" + require "jekyll/converter" + require "jekyll/generator" + require "jekyll/command" + require "jekyll/liquid_extensions" + require "jekyll/filters" + + class << self + # Public: Tells you which Jekyll environment you are building in so you can skip tasks + # if you need to. This is useful when doing expensive compression tasks on css and + # images and allows you to skip that when working in development. + + def env + ENV["JEKYLL_ENV"] || "development" + end + + # Public: Generate a Jekyll configuration Hash by merging the default + # options with anything in _config.yml, and adding the given options on top. + # + # override - A Hash of config directives that override any options in both + # the defaults and the config file. + # See Jekyll::Configuration::DEFAULTS for a + # list of option names and their defaults. + # + # Returns the final configuration Hash. + def configuration(override = {}) + config = Configuration.new + override = Configuration[override].stringify_keys + unless override.delete("skip_config_files") + config = config.read_config_files(config.config_files(override)) + end + + # Merge DEFAULTS < _config.yml < override + Configuration.from(Utils.deep_merge_hashes(config, override)).tap do |obj| + set_timezone(obj["timezone"]) if obj["timezone"] + end + end + + # Public: Set the TZ environment variable to use the timezone specified + # + # timezone - the IANA Time Zone + # + # Returns nothing + # rubocop:disable Naming/AccessorMethodName + def set_timezone(timezone) + ENV["TZ"] = if Utils::Platforms.really_windows? + Utils::WinTZ.calculate(timezone) + else + timezone + end + end + # rubocop:enable Naming/AccessorMethodName + + # Public: Fetch the logger instance for this Jekyll process. + # + # Returns the LogAdapter instance. + def logger + @logger ||= LogAdapter.new(Stevenson.new, (ENV["JEKYLL_LOG_LEVEL"] || :info).to_sym) + end + + # Public: Set the log writer. + # New log writer must respond to the same methods + # as Ruby's interal Logger. + # + # writer - the new Logger-compatible log transport + # + # Returns the new logger. + def logger=(writer) + @logger = LogAdapter.new(writer, (ENV["JEKYLL_LOG_LEVEL"] || :info).to_sym) + end + + # Public: An array of sites + # + # Returns the Jekyll sites created. + def sites + @sites ||= [] + end + + # Public: Ensures the questionable path is prefixed with the base directory + # and prepends the questionable path with the base directory if false. + # + # base_directory - the directory with which to prefix the questionable path + # questionable_path - the path we're unsure about, and want prefixed + # + # Returns the sanitized path. + def sanitized_path(base_directory, questionable_path) + return base_directory if base_directory.eql?(questionable_path) + + clean_path = questionable_path.dup + clean_path.insert(0, "/") if clean_path.start_with?("~") + clean_path = File.expand_path(clean_path, "/") + + return clean_path if clean_path.eql?(base_directory) + + if clean_path.start_with?(base_directory.sub(%r!\z!, "/")) + clean_path + else + clean_path.sub!(%r!\A\w:/!, "/") + File.join(base_directory, clean_path) + end + end + + # Conditional optimizations + Jekyll::External.require_if_present("liquid-c") + end +end + +require "jekyll/drops/drop" +require "jekyll/drops/document_drop" +require_all "jekyll/commands" +require_all "jekyll/converters" +require_all "jekyll/converters/markdown" +require_all "jekyll/drops" +require_all "jekyll/generators" +require_all "jekyll/tags" + +require "jekyll-sass-converter" diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/cleaner.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/cleaner.rb new file mode 100644 index 0000000..cbcedce --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/cleaner.rb @@ -0,0 +1,112 @@ +# frozen_string_literal: true + +require "set" + +module Jekyll + # Handles the cleanup of a site's destination before it is built. + class Cleaner + HIDDEN_FILE_REGEX = %r!\/\.{1,2}$! + attr_reader :site + + def initialize(site) + @site = site + end + + # Cleans up the site's destination directory + def cleanup! + FileUtils.rm_rf(obsolete_files) + FileUtils.rm_rf(metadata_file) unless @site.incremental? + end + + private + + # Private: The list of files and directories to be deleted during cleanup process + # + # Returns an Array of the file and directory paths + def obsolete_files + out = (existing_files - new_files - new_dirs + replaced_files).to_a + Jekyll::Hooks.trigger :clean, :on_obsolete, out + out + end + + # Private: The metadata file storing dependency tree and build history + # + # Returns an Array with the metdata file as the only item + def metadata_file + [site.regenerator.metadata_file] + end + + # Private: The list of existing files, apart from those included in + # keep_files and hidden files. + # + # Returns a Set with the file paths + def existing_files + files = Set.new + regex = keep_file_regex + dirs = keep_dirs + + Utils.safe_glob(site.in_dest_dir, ["**", "*"], File::FNM_DOTMATCH).each do |file| + next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file) + files << file + end + + files + end + + # Private: The list of files to be created when site is built. + # + # Returns a Set with the file paths + def new_files + files = Set.new + site.each_site_file { |item| files << item.destination(site.dest) } + files + end + + # Private: The list of directories to be created when site is built. + # These are the parent directories of the files in #new_files. + # + # Returns a Set with the directory paths + def new_dirs + new_files.map { |file| parent_dirs(file) }.flatten.to_set + end + + # Private: The list of parent directories of a given file + # + # Returns an Array with the directory paths + def parent_dirs(file) + parent_dir = File.dirname(file) + if parent_dir == site.dest + [] + else + [parent_dir] + parent_dirs(parent_dir) + end + end + + # Private: The list of existing files that will be replaced by a directory + # during build + # + # Returns a Set with the file paths + def replaced_files + new_dirs.select { |dir| File.file?(dir) }.to_set + end + + # Private: The list of directories that need to be kept because they are + # parent directories of files specified in keep_files + # + # Returns a Set with the directory paths + def keep_dirs + site.keep_files.map { |file| parent_dirs(site.in_dest_dir(file)) }.flatten.to_set + end + + # Private: Creates a regular expression from the config's keep_files array + # + # Examples + # ['.git','.svn'] with site.dest "/myblog/_site" creates + # the following regex: /\A\/myblog\/_site\/(\.git|\/.svn)/ + # + # Returns the regular expression + def keep_file_regex + %r!\A#{Regexp.quote(site.dest)}\/(#{Regexp.union(site.keep_files).source})! + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/collection.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/collection.rb new file mode 100644 index 0000000..51c2f98 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/collection.rb @@ -0,0 +1,234 @@ +# frozen_string_literal: true + +module Jekyll + class Collection + attr_reader :site, :label, :metadata + attr_writer :docs + + # Create a new Collection. + # + # site - the site to which this collection belongs. + # label - the name of the collection + # + # Returns nothing. + def initialize(site, label) + @site = site + @label = sanitize_label(label) + @metadata = extract_metadata + end + + # Fetch the Documents in this collection. + # Defaults to an empty array if no documents have been read in. + # + # Returns an array of Jekyll::Document objects. + def docs + @docs ||= [] + end + + # Override of normal respond_to? to match method_missing's logic for + # looking in @data. + def respond_to_missing?(method, include_private = false) + docs.respond_to?(method.to_sym, include_private) || super + end + + # Override of method_missing to check in @data for the key. + def method_missing(method, *args, &blck) + if docs.respond_to?(method.to_sym) + Jekyll.logger.warn "Deprecation:", + "#{label}.#{method} should be changed to #{label}.docs.#{method}." + Jekyll.logger.warn "", "Called by #{caller(0..0)}." + docs.public_send(method.to_sym, *args, &blck) + else + super + end + end + + # Fetch the static files in this collection. + # Defaults to an empty array if no static files have been read in. + # + # Returns an array of Jekyll::StaticFile objects. + def files + @files ||= [] + end + + # Read the allowed documents into the collection's array of docs. + # + # Returns the sorted array of docs. + def read + filtered_entries.each do |file_path| + full_path = collection_dir(file_path) + next if File.directory?(full_path) + if Utils.has_yaml_header? full_path + read_document(full_path) + else + read_static_file(file_path, full_path) + end + end + docs.sort! + end + + # All the entries in this collection. + # + # Returns an Array of file paths to the documents in this collection + # relative to the collection's directory + def entries + return [] unless exists? + @entries ||= + Utils.safe_glob(collection_dir, ["**", "*"], File::FNM_DOTMATCH).map do |entry| + entry["#{collection_dir}/"] = "" + entry + end + end + + # Filtered version of the entries in this collection. + # See `Jekyll::EntryFilter#filter` for more information. + # + # Returns a list of filtered entry paths. + def filtered_entries + return [] unless exists? + @filtered_entries ||= + Dir.chdir(directory) do + entry_filter.filter(entries).reject do |f| + path = collection_dir(f) + File.directory?(path) || entry_filter.symlink?(f) + end + end + end + + # The directory for this Collection, relative to the site source. + # + # Returns a String containing the directory name where the collection + # is stored on the filesystem. + def relative_directory + @relative_directory ||= Pathname.new(directory).relative_path_from( + Pathname.new(site.source) + ).to_s + end + + # The full path to the directory containing the collection. + # + # Returns a String containing th directory name where the collection + # is stored on the filesystem. + def directory + @directory ||= site.in_source_dir( + File.join(site.config["collections_dir"], "_#{label}") + ) + end + + # The full path to the directory containing the collection, with + # optional subpaths. + # + # *files - (optional) any other path pieces relative to the + # directory to append to the path + # + # Returns a String containing th directory name where the collection + # is stored on the filesystem. + def collection_dir(*files) + return directory if files.empty? + site.in_source_dir(relative_directory, *files) + end + + # Checks whether the directory "exists" for this collection. + # The directory must exist on the filesystem and must not be a symlink + # if in safe mode. + # + # Returns false if the directory doesn't exist or if it's a symlink + # and we're in safe mode. + def exists? + File.directory?(directory) && !entry_filter.symlink?(directory) + end + + # The entry filter for this collection. + # Creates an instance of Jekyll::EntryFilter. + # + # Returns the instance of Jekyll::EntryFilter for this collection. + def entry_filter + @entry_filter ||= Jekyll::EntryFilter.new(site, relative_directory) + end + + # An inspect string. + # + # Returns the inspect string + def inspect + "#" + end + + # Produce a sanitized label name + # Label names may not contain anything but alphanumeric characters, + # underscores, and hyphens. + # + # label - the possibly-unsafe label + # + # Returns a sanitized version of the label. + def sanitize_label(label) + label.gsub(%r![^a-z0-9_\-\.]!i, "") + end + + # Produce a representation of this Collection for use in Liquid. + # Exposes two attributes: + # - label + # - docs + # + # Returns a representation of this collection for use in Liquid. + def to_liquid + Drops::CollectionDrop.new self + end + + # Whether the collection's documents ought to be written as individual + # files in the output. + # + # Returns true if the 'write' metadata is true, false otherwise. + def write? + !!metadata.fetch("output", false) + end + + # The URL template to render collection's documents at. + # + # Returns the URL template to render collection's documents at. + def url_template + @url_template ||= metadata.fetch("permalink") do + Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) + end + end + + # Extract options for this collection from the site configuration. + # + # Returns the metadata for this collection + def extract_metadata + if site.config["collections"].is_a?(Hash) + site.config["collections"][label] || {} + else + {} + end + end + + private + + def read_document(full_path) + doc = Jekyll::Document.new(full_path, :site => site, :collection => self) + doc.read + if site.publisher.publish?(doc) || !write? + docs << doc + else + Jekyll.logger.debug "Skipped Publishing:", doc.relative_path + end + end + + private + + def read_static_file(file_path, full_path) + relative_dir = Jekyll.sanitized_path( + relative_directory, + File.dirname(file_path) + ).chomp("/.") + + files << StaticFile.new( + site, + site.source, + relative_dir, + File.basename(full_path), + self + ) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/command.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/command.rb new file mode 100644 index 0000000..7de98e7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/command.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +module Jekyll + class Command + class << self + # A list of subclasses of Jekyll::Command + def subclasses + @subclasses ||= [] + end + + # Keep a list of subclasses of Jekyll::Command every time it's inherited + # Called automatically. + # + # base - the subclass + # + # Returns nothing + def inherited(base) + subclasses << base + super(base) + end + + # Run Site#process and catch errors + # + # site - the Jekyll::Site object + # + # Returns nothing + def process_site(site) + site.process + rescue Jekyll::Errors::FatalException => e + Jekyll.logger.error "ERROR:", "YOUR SITE COULD NOT BE BUILT:" + Jekyll.logger.error "", "------------------------------------" + Jekyll.logger.error "", e.message + exit(1) + end + + # Create a full Jekyll configuration with the options passed in as overrides + # + # options - the configuration overrides + # + # Returns a full Jekyll configuration + def configuration_from_options(options) + return options if options.is_a?(Jekyll::Configuration) + Jekyll.configuration(options) + end + + # Add common options to a command for building configuration + # + # c - the Jekyll::Command to add these options to + # + # Returns nothing + # rubocop:disable Metrics/MethodLength + def add_build_options(c) + c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", + Array, "Custom configuration file" + c.option "destination", "-d", "--destination DESTINATION", + "The current folder will be generated into DESTINATION" + c.option "source", "-s", "--source SOURCE", "Custom source directory" + c.option "future", "--future", "Publishes posts with a future date" + c.option "limit_posts", "--limit_posts MAX_POSTS", Integer, + "Limits the number of posts to parse and publish" + c.option "watch", "-w", "--[no-]watch", "Watch for changes and rebuild" + c.option "baseurl", "-b", "--baseurl URL", + "Serve the website from the given base URL" + c.option "force_polling", "--force_polling", "Force watch to use polling" + c.option "lsi", "--lsi", "Use LSI for improved related posts" + c.option "show_drafts", "-D", "--drafts", "Render posts in the _drafts folder" + c.option "unpublished", "--unpublished", + "Render posts that were marked as unpublished" + c.option "quiet", "-q", "--quiet", "Silence output." + c.option "verbose", "-V", "--verbose", "Print verbose output." + c.option "incremental", "-I", "--incremental", "Enable incremental rebuild." + c.option "strict_front_matter", "--strict_front_matter", + "Fail if errors are present in front matter" + end + # rubocop:enable Metrics/MethodLength + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/build.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/build.rb new file mode 100644 index 0000000..96a48cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/build.rb @@ -0,0 +1,102 @@ +# frozen_string_literal: true + +module Jekyll + module Commands + class Build < Command + class << self + # Create the Mercenary command for the Jekyll CLI for this Command + def init_with_program(prog) + prog.command(:build) do |c| + c.syntax "build [options]" + c.description "Build your site" + c.alias :b + + add_build_options(c) + + c.action do |_, options| + options["serving"] = false + Jekyll::Commands::Build.process(options) + end + end + end + + # Build your jekyll site + # Continuously watch if `watch` is set to true in the config. + def process(options) + # Adjust verbosity quickly + Jekyll.logger.adjust_verbosity(options) + + options = configuration_from_options(options) + site = Jekyll::Site.new(options) + + if options.fetch("skip_initial_build", false) + Jekyll.logger.warn "Build Warning:", "Skipping the initial build." \ + " This may result in an out-of-date site." + else + build(site, options) + end + + if options.fetch("detach", false) + Jekyll.logger.info "Auto-regeneration:", + "disabled when running server detached." + elsif options.fetch("watch", false) + watch(site, options) + else + Jekyll.logger.info "Auto-regeneration:", "disabled. Use --watch to enable." + end + end + + # Build your Jekyll site. + # + # site - the Jekyll::Site instance to build + # options - A Hash of options passed to the command + # + # Returns nothing. + def build(site, options) + t = Time.now + source = options["source"] + destination = options["destination"] + incremental = options["incremental"] + Jekyll.logger.info "Source:", source + Jekyll.logger.info "Destination:", destination + Jekyll.logger.info "Incremental build:", + (incremental ? "enabled" : "disabled. Enable with --incremental") + Jekyll.logger.info "Generating..." + process_site(site) + Jekyll.logger.info "", "done in #{(Time.now - t).round(3)} seconds." + end + + # Private: Watch for file changes and rebuild the site. + # + # site - A Jekyll::Site instance + # options - A Hash of options passed to the command + # + # Returns nothing. + def watch(site, options) + # Warn Windows users that they might need to upgrade. + if Utils::Platforms.bash_on_windows? + Jekyll.logger.warn "", + "Auto-regeneration may not work on some Windows versions." + Jekyll.logger.warn "", + "Please see: https://github.com/Microsoft/BashOnWindows/issues/216" + Jekyll.logger.warn "", + "If it does not work, please upgrade Bash on Windows or "\ + "run Jekyll with --no-watch." + end + + External.require_with_graceful_fail "jekyll-watch" + watch_method = Jekyll::Watcher.method(:watch) + if watch_method.parameters.size == 1 + watch_method.call( + options + ) + else + watch_method.call( + options, site + ) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/clean.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/clean.rb new file mode 100644 index 0000000..1ef65db --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/clean.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module Jekyll + module Commands + class Clean < Command + class << self + def init_with_program(prog) + prog.command(:clean) do |c| + c.syntax "clean [subcommand]" + c.description "Clean the site " \ + "(removes site output and metadata file) without building." + + add_build_options(c) + + c.action do |_, options| + Jekyll::Commands::Clean.process(options) + end + end + end + + def process(options) + options = configuration_from_options(options) + destination = options["destination"] + metadata_file = File.join(options["source"], ".jekyll-metadata") + sass_cache = ".sass-cache" + + remove(destination, :checker_func => :directory?) + remove(metadata_file, :checker_func => :file?) + remove(sass_cache, :checker_func => :directory?) + end + + def remove(filename, checker_func: :file?) + if File.public_send(checker_func, filename) + Jekyll.logger.info "Cleaner:", "Removing #{filename}..." + FileUtils.rm_rf(filename) + else + Jekyll.logger.info "Cleaner:", "Nothing to do for #{filename}." + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/doctor.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/doctor.rb new file mode 100644 index 0000000..960ee9f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/doctor.rb @@ -0,0 +1,155 @@ +# frozen_string_literal: true + +require "addressable/uri" + +module Jekyll + module Commands + class Doctor < Command + class << self + def init_with_program(prog) + prog.command(:doctor) do |c| + c.syntax "doctor" + c.description "Search site and print specific deprecation warnings" + c.alias(:hyde) + + c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", Array, + "Custom configuration file" + + c.action do |_, options| + Jekyll::Commands::Doctor.process(options) + end + end + end + + def process(options) + site = Jekyll::Site.new(configuration_from_options(options)) + site.reset + site.read + site.generate + + if healthy?(site) + Jekyll.logger.info "Your test results", "are in. Everything looks fine." + else + abort + end + end + + def healthy?(site) + [ + fsnotify_buggy?(site), + !deprecated_relative_permalinks(site), + !conflicting_urls(site), + !urls_only_differ_by_case(site), + proper_site_url?(site), + ].all? + end + + def deprecated_relative_permalinks(site) + if site.config["relative_permalinks"] + Jekyll::Deprecator.deprecation_message "Your site still uses relative" \ + " permalinks, which was removed in" \ + " Jekyll v3.0.0." + return true + end + end + + def conflicting_urls(site) + conflicting_urls = false + urls = {} + urls = collect_urls(urls, site.pages, site.dest) + urls = collect_urls(urls, site.posts.docs, site.dest) + urls.each do |url, paths| + next unless paths.size > 1 + conflicting_urls = true + Jekyll.logger.warn "Conflict:", "The URL '#{url}' is the destination" \ + " for the following pages: #{paths.join(", ")}" + end + conflicting_urls + end + + def fsnotify_buggy?(_site) + return true unless Utils::Platforms.osx? + if Dir.pwd != `pwd`.strip + Jekyll.logger.error " " + <<-STR.strip.gsub(%r!\n\s+!, "\n ") + We have detected that there might be trouble using fsevent on your + operating system, you can read https://github.com/thibaudgg/rb-fsevent/wiki/no-fsevents-fired-(OSX-bug) + for possible work arounds or you can work around it immediately + with `--force-polling`. + STR + + false + end + + true + end + + def urls_only_differ_by_case(site) + urls_only_differ_by_case = false + urls = case_insensitive_urls(site.pages + site.docs_to_write, site.dest) + urls.each_value do |real_urls| + next unless real_urls.uniq.size > 1 + urls_only_differ_by_case = true + Jekyll.logger.warn "Warning:", "The following URLs only differ" \ + " by case. On a case-insensitive file system one of the URLs" \ + " will be overwritten by the other: #{real_urls.join(", ")}" + end + urls_only_differ_by_case + end + + def proper_site_url?(site) + url = site.config["url"] + [ + url_exists?(url), + url_valid?(url), + url_absolute(url), + ].all? + end + + private + def collect_urls(urls, things, destination) + things.each do |thing| + dest = thing.destination(destination) + if urls[dest] + urls[dest] << thing.path + else + urls[dest] = [thing.path] + end + end + urls + end + + def case_insensitive_urls(things, destination) + things.each_with_object({}) do |thing, memo| + dest = thing.destination(destination) + (memo[dest.downcase] ||= []) << dest + end + end + + def url_exists?(url) + return true unless url.nil? || url.empty? + Jekyll.logger.warn "Warning:", "You didn't set an URL in the config file, "\ + "you may encounter problems with some plugins." + false + end + + def url_valid?(url) + Addressable::URI.parse(url) + true + # Addressable::URI#parse only raises a TypeError + # https://git.io/vFfbx + rescue TypeError + Jekyll.logger.warn "Warning:", "The site URL does not seem to be valid, "\ + "check the value of `url` in your config file." + false + end + + def url_absolute(url) + return true if Addressable::URI.parse(url).absolute? + Jekyll.logger.warn "Warning:", "Your site URL does not seem to be absolute, "\ + "check the value of `url` in your config file." + false + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/help.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/help.rb new file mode 100644 index 0000000..42a8017 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/help.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Jekyll + module Commands + class Help < Command + class << self + def init_with_program(prog) + prog.command(:help) do |c| + c.syntax "help [subcommand]" + c.description "Show the help message, optionally for a given subcommand." + + c.action do |args, _| + cmd = (args.first || "").to_sym + if args.empty? + puts prog + elsif prog.has_command? cmd + puts prog.commands[cmd] + else + invalid_command(prog, cmd) + abort + end + end + end + end + + def invalid_command(prog, cmd) + Jekyll.logger.error "Error:", + "Hmm... we don't know what the '#{cmd}' command is." + Jekyll.logger.info "Valid commands:", prog.commands.keys.join(", ") + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/new.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/new.rb new file mode 100644 index 0000000..f930d4d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/new.rb @@ -0,0 +1,159 @@ +# frozen_string_literal: true + +require "erb" + +module Jekyll + module Commands + class New < Command + class << self + def init_with_program(prog) + prog.command(:new) do |c| + c.syntax "new PATH" + c.description "Creates a new Jekyll site scaffold in PATH" + + c.option "force", "--force", "Force creation even if PATH already exists" + c.option "blank", "--blank", "Creates scaffolding but with empty files" + c.option "skip-bundle", "--skip-bundle", "Skip 'bundle install'" + + c.action do |args, options| + Jekyll::Commands::New.process(args, options) + end + end + end + + def process(args, options = {}) + raise ArgumentError, "You must specify a path." if args.empty? + + new_blog_path = File.expand_path(args.join(" "), Dir.pwd) + FileUtils.mkdir_p new_blog_path + if preserve_source_location?(new_blog_path, options) + Jekyll.logger.abort_with "Conflict:", + "#{new_blog_path} exists and is not empty." + end + + if options["blank"] + create_blank_site new_blog_path + else + create_site new_blog_path + end + + after_install(new_blog_path, options) + end + + def create_blank_site(path) + Dir.chdir(path) do + FileUtils.mkdir(%w(_layouts _posts _drafts)) + FileUtils.touch("index.html") + end + end + + def scaffold_post_content + ERB.new(File.read(File.expand_path(scaffold_path, site_template))).result + end + + # Internal: Gets the filename of the sample post to be created + # + # Returns the filename of the sample post, as a String + def initialized_post_name + "_posts/#{Time.now.strftime("%Y-%m-%d")}-welcome-to-jekyll.markdown" + end + + private + + def gemfile_contents + <<-RUBY +source "https://rubygems.org" + +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +gem "jekyll", "~> #{Jekyll::VERSION}" + +# This is the default theme for new Jekyll sites. You may change this to anything you like. +gem "minima", "~> 2.0" + +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +# gem "github-pages", group: :jekyll_plugins + +# If you have any plugins, put them here! +group :jekyll_plugins do + gem "jekyll-feed", "~> 0.6" +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +RUBY + end + + def create_site(new_blog_path) + create_sample_files new_blog_path + + File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| + f.write(scaffold_post_content) + end + + File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| + f.write(gemfile_contents) + end + end + + def preserve_source_location?(path, options) + !options["force"] && !Dir["#{path}/**/*"].empty? + end + + def create_sample_files(path) + FileUtils.cp_r site_template + "/.", path + FileUtils.chmod_R "u+w", path + FileUtils.rm File.expand_path(scaffold_path, path) + end + + def site_template + File.expand_path("../../site_template", __dir__) + end + + def scaffold_path + "_posts/0000-00-00-welcome-to-jekyll.markdown.erb" + end + + # After a new blog has been created, print a success notification and + # then automatically execute bundle install from within the new blog dir + # unless the user opts to generate a blank blog or skip 'bundle install'. + + def after_install(path, options = {}) + unless options["blank"] || options["skip-bundle"] + begin + require "bundler" + bundle_install path + rescue LoadError + Jekyll.logger.info "Could not load Bundler. Bundle install skipped." + end + end + + Jekyll.logger.info "New jekyll site installed in #{path.cyan}." + Jekyll.logger.info "Bundle install skipped." if options["skip-bundle"] + end + + def bundle_install(path) + Jekyll.logger.info "Running bundle install in #{path.cyan}..." + Dir.chdir(path) do + exe = Gem.bin_path("bundler", "bundle") + process, output = Jekyll::Utils::Exec.run("ruby", exe, "install") + + output.to_s.each_line do |line| + Jekyll.logger.info("Bundler:".green, line.strip) unless line.to_s.empty? + end + + raise SystemExit unless process.success? + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/new_theme.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/new_theme.rb new file mode 100644 index 0000000..c55e681 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/new_theme.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require "erb" + +class Jekyll::Commands::NewTheme < Jekyll::Command + class << self + def init_with_program(prog) + prog.command(:"new-theme") do |c| + c.syntax "new-theme NAME" + c.description "Creates a new Jekyll theme scaffold" + c.option "code_of_conduct", \ + "-c", "--code-of-conduct", \ + "Include a Code of Conduct. (defaults to false)" + + c.action do |args, opts| + Jekyll::Commands::NewTheme.process(args, opts) + end + end + end + + # rubocop:disable Metrics/AbcSize + def process(args, opts) + if !args || args.empty? + raise Jekyll::Errors::InvalidThemeName, "You must specify a theme name." + end + + new_theme_name = args.join("_") + theme = Jekyll::ThemeBuilder.new(new_theme_name, opts) + if theme.path.exist? + Jekyll.logger.abort_with "Conflict:", "#{theme.path} already exists." + end + + theme.create! + Jekyll.logger.info "Your new Jekyll theme, #{theme.name.cyan}," \ + " is ready for you in #{theme.path.to_s.cyan}!" + Jekyll.logger.info "For help getting started, read #{theme.path}/README.md." + end + # rubocop:enable Metrics/AbcSize + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve.rb new file mode 100644 index 0000000..849d37e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve.rb @@ -0,0 +1,387 @@ +# frozen_string_literal: true + +require "thread" + +module Jekyll + module Commands + class Serve < Command + # Similar to the pattern in Utils::ThreadEvent except we are maintaining the + # state of @running instead of just signaling an event. We have to maintain this + # state since Serve is just called via class methods instead of an instance + # being created each time. + @mutex = Mutex.new + @run_cond = ConditionVariable.new + @running = false + + class << self + COMMAND_OPTIONS = { + "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."], + "host" => ["host", "-H", "--host [HOST]", "Host to bind to"], + "open_url" => ["-o", "--open-url", "Launch your site in a browser"], + "detach" => ["-B", "--detach", + "Run the server in the background",], + "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], + "port" => ["-P", "--port [PORT]", "Port to listen on"], + "show_dir_listing" => ["--show-dir-listing", + "Show a directory listing instead of loading your index file.",], + "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", + "Skips the initial site build which occurs before the server is started.",], + "livereload" => ["-l", "--livereload", + "Use LiveReload to automatically refresh browsers",], + "livereload_ignore" => ["--livereload-ignore ignore GLOB1[,GLOB2[,...]]", + Array, + "Files for LiveReload to ignore. Remember to quote the values so your shell "\ + "won't expand them",], + "livereload_min_delay" => ["--livereload-min-delay [SECONDS]", + "Minimum reload delay",], + "livereload_max_delay" => ["--livereload-max-delay [SECONDS]", + "Maximum reload delay",], + "livereload_port" => ["--livereload-port [PORT]", Integer, + "Port for LiveReload to listen on",], + }.freeze + + DIRECTORY_INDEX = %w( + index.htm + index.html + index.rhtml + index.cgi + index.xml + index.json + ).freeze + + LIVERELOAD_PORT = 35_729 + LIVERELOAD_DIR = File.join(__dir__, "serve", "livereload_assets") + + attr_reader :mutex, :run_cond, :running + alias_method :running?, :running + + def init_with_program(prog) + prog.command(:serve) do |cmd| + cmd.description "Serve your site locally" + cmd.syntax "serve [options]" + cmd.alias :server + cmd.alias :s + + add_build_options(cmd) + COMMAND_OPTIONS.each do |key, val| + cmd.option key, *val + end + + cmd.action do |_, opts| + opts["livereload_port"] ||= LIVERELOAD_PORT + opts["serving"] = true + opts["watch" ] = true unless opts.key?("watch") + + start(opts) + end + end + end + + # + + def start(opts) + # Set the reactor to nil so any old reactor will be GCed. + # We can't unregister a hook so in testing when Serve.start is + # called multiple times we don't want to inadvertently keep using + # a reactor created by a previous test when our test might not + @reload_reactor = nil + + config = configuration_from_options(opts) + if Jekyll.env == "development" + config["url"] = default_url(config) + end + [Build, Serve].each { |klass| klass.process(config) } + end + + # + + def process(opts) + opts = configuration_from_options(opts) + destination = opts["destination"] + register_reload_hooks(opts) if opts["livereload"] + setup(destination) + + start_up_webrick(opts, destination) + end + + def shutdown + @server.shutdown if running? + end + + # Perform logical validation of CLI options + + private + def validate_options(opts) + if opts["livereload"] + if opts["detach"] + Jekyll.logger.warn "Warning:", + "--detach and --livereload are mutually exclusive. Choosing --livereload" + opts["detach"] = false + end + if opts["ssl_cert"] || opts["ssl_key"] + # This is not technically true. LiveReload works fine over SSL, but + # EventMachine's SSL support in Windows requires building the gem's + # native extensions against OpenSSL and that proved to be a process + # so tedious that expecting users to do it is a non-starter. + Jekyll.logger.abort_with "Error:", "LiveReload does not support SSL" + end + unless opts["watch"] + # Using livereload logically implies you want to watch the files + opts["watch"] = true + end + elsif %w(livereload_min_delay + livereload_max_delay + livereload_ignore + livereload_port).any? { |o| opts[o] } + Jekyll.logger.abort_with "--livereload-min-delay, "\ + "--livereload-max-delay, --livereload-ignore, and "\ + "--livereload-port require the --livereload option." + end + end + + # + + private + # rubocop:disable Metrics/AbcSize + def register_reload_hooks(opts) + require_relative "serve/live_reload_reactor" + @reload_reactor = LiveReloadReactor.new + + Jekyll::Hooks.register(:site, :post_render) do |site| + regenerator = Jekyll::Regenerator.new(site) + @changed_pages = site.pages.select do |p| + regenerator.regenerate?(p) + end + end + + # A note on ignoring files: LiveReload errs on the side of reloading when it + # comes to the message it gets. If, for example, a page is ignored but a CSS + # file linked in the page isn't, the page will still be reloaded if the CSS + # file is contained in the message sent to LiveReload. Additionally, the + # path matching is very loose so that a message to reload "/" will always + # lead the page to reload since every page starts with "/". + Jekyll::Hooks.register(:site, :post_write) do + if @changed_pages && @reload_reactor && @reload_reactor.running? + ignore, @changed_pages = @changed_pages.partition do |p| + Array(opts["livereload_ignore"]).any? do |filter| + File.fnmatch(filter, Jekyll.sanitized_path(p.relative_path)) + end + end + Jekyll.logger.debug "LiveReload:", "Ignoring #{ignore.map(&:relative_path)}" + @reload_reactor.reload(@changed_pages) + end + @changed_pages = nil + end + end + + # Do a base pre-setup of WEBRick so that everything is in place + # when we get ready to party, checking for an setting up an error page + # and making sure our destination exists. + + private + def setup(destination) + require_relative "serve/servlet" + + FileUtils.mkdir_p(destination) + if File.exist?(File.join(destination, "404.html")) + WEBrick::HTTPResponse.class_eval do + def create_error_page + @header["Content-Type"] = "text/html; charset=UTF-8" + @body = IO.read(File.join(@config[:DocumentRoot], "404.html")) + end + end + end + end + + # + + private + def webrick_opts(opts) + opts = { + :JekyllOptions => opts, + :DoNotReverseLookup => true, + :MimeTypes => mime_types, + :DocumentRoot => opts["destination"], + :StartCallback => start_callback(opts["detach"]), + :StopCallback => stop_callback(opts["detach"]), + :BindAddress => opts["host"], + :Port => opts["port"], + :DirectoryIndex => DIRECTORY_INDEX, + } + + opts[:DirectoryIndex] = [] if opts[:JekyllOptions]["show_dir_listing"] + + enable_ssl(opts) + enable_logging(opts) + opts + end + + # + + private + def start_up_webrick(opts, destination) + if opts["livereload"] + @reload_reactor.start(opts) + end + + @server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } + @server.mount(opts["baseurl"].to_s, Servlet, destination, file_handler_opts) + + Jekyll.logger.info "Server address:", server_address(@server, opts) + launch_browser @server, opts if opts["open_url"] + boot_or_detach @server, opts + end + + # Recreate NondisclosureName under utf-8 circumstance + + private + def file_handler_opts + WEBrick::Config::FileHandler.merge({ + :FancyIndexing => true, + :NondisclosureName => [ + ".ht*", "~*", + ], + }) + end + + # + + private + def server_address(server, options = {}) + format_url( + server.config[:SSLEnable], + server.config[:BindAddress], + server.config[:Port], + options["baseurl"] + ) + end + + private + def format_url(ssl_enabled, address, port, baseurl = nil) + format("%s://%
      s:%i%s", { + :prefix => ssl_enabled ? "https" : "http", + :address => address, + :port => port, + :baseurl => baseurl ? "#{baseurl}/" : "", + }) + end + + # + + private + def default_url(opts) + config = configuration_from_options(opts) + format_url( + config["ssl_cert"] && config["ssl_key"], + config["host"] == "127.0.0.1" ? "localhost" : config["host"], + config["port"] + ) + end + + # + + private + def launch_browser(server, opts) + address = server_address(server, opts) + return system "start", address if Utils::Platforms.windows? + return system "xdg-open", address if Utils::Platforms.linux? + return system "open", address if Utils::Platforms.osx? + Jekyll.logger.error "Refusing to launch browser; " \ + "Platform launcher unknown." + end + + # Keep in our area with a thread or detach the server as requested + # by the user. This method determines what we do based on what you + # ask us to do. + + private + def boot_or_detach(server, opts) + if opts["detach"] + pid = Process.fork do + server.start + end + + Process.detach(pid) + Jekyll.logger.info "Server detached with pid '#{pid}'.", \ + "Run `pkill -f jekyll' or `kill -9 #{pid}' to stop the server." + else + t = Thread.new { server.start } + trap("INT") { server.shutdown } + t.join + end + end + + # Make the stack verbose if the user requests it. + + private + def enable_logging(opts) + opts[:AccessLog] = [] + level = WEBrick::Log.const_get(opts[:JekyllOptions]["verbose"] ? :DEBUG : :WARN) + opts[:Logger] = WEBrick::Log.new($stdout, level) + end + + # Add SSL to the stack if the user triggers --enable-ssl and they + # provide both types of certificates commonly needed. Raise if they + # forget to add one of the certificates. + + private + def enable_ssl(opts) + cert, key, src = + opts[:JekyllOptions].values_at("ssl_cert", "ssl_key", "source") + + return if cert.nil? && key.nil? + raise "Missing --ssl_cert or --ssl_key. Both are required." unless cert && key + + require "openssl" + require "webrick/https" + + opts[:SSLCertificate] = OpenSSL::X509::Certificate.new(read_file(src, cert)) + opts[:SSLPrivateKey ] = OpenSSL::PKey::RSA.new(read_file(src, key)) + opts[:SSLEnable] = true + end + + private + def start_callback(detached) + unless detached + proc do + mutex.synchronize do + # Block until EventMachine reactor starts + @reload_reactor.started_event.wait unless @reload_reactor.nil? + @running = true + Jekyll.logger.info("Server running...", "press ctrl-c to stop.") + @run_cond.broadcast + end + end + end + end + + private + def stop_callback(detached) + unless detached + proc do + mutex.synchronize do + unless @reload_reactor.nil? + @reload_reactor.stop + @reload_reactor.stopped_event.wait + end + @running = false + @run_cond.broadcast + end + end + end + end + + private + def mime_types + file = File.expand_path("../mime.types", __dir__) + WEBrick::HTTPUtils.load_mime_types(file) + end + + private + def read_file(source_dir, file_path) + File.read(Jekyll.sanitized_path(source_dir, file_path)) + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/live_reload_reactor.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/live_reload_reactor.rb new file mode 100644 index 0000000..e9261f4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/live_reload_reactor.rb @@ -0,0 +1,127 @@ +# frozen_string_literal: true + +require "json" +require "em-websocket" + +require_relative "websockets" + +module Jekyll + module Commands + class Serve + class LiveReloadReactor + attr_reader :started_event + attr_reader :stopped_event + attr_reader :thread + + def initialize + @websockets = [] + @connections_count = 0 + @started_event = Utils::ThreadEvent.new + @stopped_event = Utils::ThreadEvent.new + end + + def stop + # There is only one EventMachine instance per Ruby process so stopping + # it here will stop the reactor thread we have running. + EM.stop if EM.reactor_running? + Jekyll.logger.debug "LiveReload Server:", "halted" + end + + def running? + EM.reactor_running? + end + + def handle_websockets_event(ws) + ws.onopen { |handshake| connect(ws, handshake) } + ws.onclose { disconnect(ws) } + ws.onmessage { |msg| print_message(msg) } + ws.onerror { |error| log_error(error) } + end + + def start(opts) + @thread = Thread.new do + # Use epoll if the kernel supports it + EM.epoll + EM.run do + EM.error_handler { |e| log_error(e) } + + EM.start_server( + opts["host"], + opts["livereload_port"], + HttpAwareConnection, + opts + ) do |ws| + handle_websockets_event(ws) + end + + # Notify blocked threads that EventMachine has started or shutdown + EM.schedule { @started_event.set } + EM.add_shutdown_hook { @stopped_event.set } + + Jekyll.logger.info "LiveReload address:", + "http://#{opts["host"]}:#{opts["livereload_port"]}" + end + end + @thread.abort_on_exception = true + end + + # For a description of the protocol see + # http://feedback.livereload.com/knowledgebase/articles/86174-livereload-protocol + def reload(pages) + pages.each do |p| + json_message = JSON.dump({ + :command => "reload", + :path => p.url, + :liveCSS => true, + }) + + Jekyll.logger.debug "LiveReload:", "Reloading #{p.url}" + Jekyll.logger.debug "", json_message + @websockets.each { |ws| ws.send(json_message) } + end + end + + private + def connect(ws, handshake) + @connections_count += 1 + if @connections_count == 1 + message = "Browser connected" + message += " over SSL/TLS" if handshake.secure? + Jekyll.logger.info "LiveReload:", message + end + ws.send( + JSON.dump( + :command => "hello", + :protocols => ["http://livereload.com/protocols/official-7"], + :serverName => "jekyll" + ) + ) + + @websockets << ws + end + + private + def disconnect(ws) + @websockets.delete(ws) + end + + private + def print_message(json_message) + msg = JSON.parse(json_message) + # Not sure what the 'url' command even does in LiveReload. The spec is silent + # on its purpose. + if msg["command"] == "url" + Jekyll.logger.info "LiveReload:", "Browser URL: #{msg["url"]}" + end + end + + private + def log_error(e) + Jekyll.logger.error "LiveReload experienced an error. " \ + "Run with --trace for more information." + raise e + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/livereload_assets/livereload.js b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/livereload_assets/livereload.js new file mode 100644 index 0000000..eee60ec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/livereload_assets/livereload.js @@ -0,0 +1,1183 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o tag"); + return; + } + } + this.reloader = new Reloader(this.window, this.console, Timer); + this.connector = new Connector(this.options, this.WebSocket, Timer, { + connecting: (function(_this) { + return function() {}; + })(this), + socketConnected: (function(_this) { + return function() {}; + })(this), + connected: (function(_this) { + return function(protocol) { + var _base; + if (typeof (_base = _this.listeners).connect === "function") { + _base.connect(); + } + _this.log("LiveReload is connected to " + _this.options.host + ":" + _this.options.port + " (protocol v" + protocol + ")."); + return _this.analyze(); + }; + })(this), + error: (function(_this) { + return function(e) { + if (e instanceof ProtocolError) { + if (typeof console !== "undefined" && console !== null) { + return console.log("" + e.message + "."); + } + } else { + if (typeof console !== "undefined" && console !== null) { + return console.log("LiveReload internal error: " + e.message); + } + } + }; + })(this), + disconnected: (function(_this) { + return function(reason, nextDelay) { + var _base; + if (typeof (_base = _this.listeners).disconnect === "function") { + _base.disconnect(); + } + switch (reason) { + case 'cannot-connect': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + ", will retry in " + nextDelay + " sec."); + case 'broken': + return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + ", reconnecting in " + nextDelay + " sec."); + case 'handshake-timeout': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake timeout), will retry in " + nextDelay + " sec."); + case 'handshake-failed': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake failed), will retry in " + nextDelay + " sec."); + case 'manual': + break; + case 'error': + break; + default: + return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + " (" + reason + "), reconnecting in " + nextDelay + " sec."); + } + }; + })(this), + message: (function(_this) { + return function(message) { + switch (message.command) { + case 'reload': + return _this.performReload(message); + case 'alert': + return _this.performAlert(message); + } + }; + })(this) + }); + this.initialized = true; + } + + LiveReload.prototype.on = function(eventName, handler) { + return this.listeners[eventName] = handler; + }; + + LiveReload.prototype.log = function(message) { + return this.console.log("" + message); + }; + + LiveReload.prototype.performReload = function(message) { + var _ref, _ref1; + this.log("LiveReload received reload request: " + (JSON.stringify(message, null, 2))); + return this.reloader.reload(message.path, { + liveCSS: (_ref = message.liveCSS) != null ? _ref : true, + liveImg: (_ref1 = message.liveImg) != null ? _ref1 : true, + originalPath: message.originalPath || '', + overrideURL: message.overrideURL || '', + serverURL: "http://" + this.options.host + ":" + this.options.port + }); + }; + + LiveReload.prototype.performAlert = function(message) { + return alert(message.message); + }; + + LiveReload.prototype.shutDown = function() { + var _base; + if (!this.initialized) { + return; + } + this.connector.disconnect(); + this.log("LiveReload disconnected."); + return typeof (_base = this.listeners).shutdown === "function" ? _base.shutdown() : void 0; + }; + + LiveReload.prototype.hasPlugin = function(identifier) { + return !!this.pluginIdentifiers[identifier]; + }; + + LiveReload.prototype.addPlugin = function(pluginClass) { + var plugin; + if (!this.initialized) { + return; + } + if (this.hasPlugin(pluginClass.identifier)) { + return; + } + this.pluginIdentifiers[pluginClass.identifier] = true; + plugin = new pluginClass(this.window, { + _livereload: this, + _reloader: this.reloader, + _connector: this.connector, + console: this.console, + Timer: Timer, + generateCacheBustUrl: (function(_this) { + return function(url) { + return _this.reloader.generateCacheBustUrl(url); + }; + })(this) + }); + this.plugins.push(plugin); + this.reloader.addPlugin(plugin); + }; + + LiveReload.prototype.analyze = function() { + var plugin, pluginData, pluginsData, _i, _len, _ref; + if (!this.initialized) { + return; + } + if (!(this.connector.protocol >= 7)) { + return; + } + pluginsData = {}; + _ref = this.plugins; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + plugin = _ref[_i]; + pluginsData[plugin.constructor.identifier] = pluginData = (typeof plugin.analyze === "function" ? plugin.analyze() : void 0) || {}; + pluginData.version = plugin.constructor.version; + } + this.connector.sendCommand({ + command: 'info', + plugins: pluginsData, + url: this.window.location.href + }); + }; + + return LiveReload; + + })(); + +}).call(this); + +},{"./connector":1,"./options":5,"./reloader":7,"./timer":9}],5:[function(require,module,exports){ +(function() { + var Options; + + exports.Options = Options = (function() { + function Options() { + this.https = false; + this.host = null; + this.port = 35729; + this.snipver = null; + this.ext = null; + this.extver = null; + this.mindelay = 1000; + this.maxdelay = 60000; + this.handshake_timeout = 5000; + } + + Options.prototype.set = function(name, value) { + if (typeof value === 'undefined') { + return; + } + if (!isNaN(+value)) { + value = +value; + } + return this[name] = value; + }; + + return Options; + + })(); + + Options.extract = function(document) { + var element, keyAndValue, m, mm, options, pair, src, _i, _j, _len, _len1, _ref, _ref1; + _ref = document.getElementsByTagName('script'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + element = _ref[_i]; + if ((src = element.src) && (m = src.match(/^[^:]+:\/\/(.*)\/z?livereload\.js(?:\?(.*))?$/))) { + options = new Options(); + options.https = src.indexOf("https") === 0; + if (mm = m[1].match(/^([^\/:]+)(?::(\d+))?$/)) { + options.host = mm[1]; + if (mm[2]) { + options.port = parseInt(mm[2], 10); + } + } + if (m[2]) { + _ref1 = m[2].split('&'); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + pair = _ref1[_j]; + if ((keyAndValue = pair.split('=')).length > 1) { + options.set(keyAndValue[0].replace(/-/g, '_'), keyAndValue.slice(1).join('=')); + } + } + } + return options; + } + } + return null; + }; + +}).call(this); + +},{}],6:[function(require,module,exports){ +(function() { + var PROTOCOL_6, PROTOCOL_7, Parser, ProtocolError, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + exports.PROTOCOL_6 = PROTOCOL_6 = 'http://livereload.com/protocols/official-6'; + + exports.PROTOCOL_7 = PROTOCOL_7 = 'http://livereload.com/protocols/official-7'; + + exports.ProtocolError = ProtocolError = (function() { + function ProtocolError(reason, data) { + this.message = "LiveReload protocol error (" + reason + ") after receiving data: \"" + data + "\"."; + } + + return ProtocolError; + + })(); + + exports.Parser = Parser = (function() { + function Parser(handlers) { + this.handlers = handlers; + this.reset(); + } + + Parser.prototype.reset = function() { + return this.protocol = null; + }; + + Parser.prototype.process = function(data) { + var command, e, message, options, _ref; + try { + if (this.protocol == null) { + if (data.match(/^!!ver:([\d.]+)$/)) { + this.protocol = 6; + } else if (message = this._parseMessage(data, ['hello'])) { + if (!message.protocols.length) { + throw new ProtocolError("no protocols specified in handshake message"); + } else if (__indexOf.call(message.protocols, PROTOCOL_7) >= 0) { + this.protocol = 7; + } else if (__indexOf.call(message.protocols, PROTOCOL_6) >= 0) { + this.protocol = 6; + } else { + throw new ProtocolError("no supported protocols found"); + } + } + return this.handlers.connected(this.protocol); + } else if (this.protocol === 6) { + message = JSON.parse(data); + if (!message.length) { + throw new ProtocolError("protocol 6 messages must be arrays"); + } + command = message[0], options = message[1]; + if (command !== 'refresh') { + throw new ProtocolError("unknown protocol 6 command"); + } + return this.handlers.message({ + command: 'reload', + path: options.path, + liveCSS: (_ref = options.apply_css_live) != null ? _ref : true + }); + } else { + message = this._parseMessage(data, ['reload', 'alert']); + return this.handlers.message(message); + } + } catch (_error) { + e = _error; + if (e instanceof ProtocolError) { + return this.handlers.error(e); + } else { + throw e; + } + } + }; + + Parser.prototype._parseMessage = function(data, validCommands) { + var e, message, _ref; + try { + message = JSON.parse(data); + } catch (_error) { + e = _error; + throw new ProtocolError('unparsable JSON', data); + } + if (!message.command) { + throw new ProtocolError('missing "command" key', data); + } + if (_ref = message.command, __indexOf.call(validCommands, _ref) < 0) { + throw new ProtocolError("invalid command '" + message.command + "', only valid commands are: " + (validCommands.join(', ')) + ")", data); + } + return message; + }; + + return Parser; + + })(); + +}).call(this); + +},{}],7:[function(require,module,exports){ +(function() { + var IMAGE_STYLES, Reloader, numberOfMatchingSegments, pathFromUrl, pathsMatch, pickBestMatch, splitUrl; + + splitUrl = function(url) { + var hash, index, params; + if ((index = url.indexOf('#')) >= 0) { + hash = url.slice(index); + url = url.slice(0, index); + } else { + hash = ''; + } + if ((index = url.indexOf('?')) >= 0) { + params = url.slice(index); + url = url.slice(0, index); + } else { + params = ''; + } + return { + url: url, + params: params, + hash: hash + }; + }; + + pathFromUrl = function(url) { + var path; + url = splitUrl(url).url; + if (url.indexOf('file://') === 0) { + path = url.replace(/^file:\/\/(localhost)?/, ''); + } else { + path = url.replace(/^([^:]+:)?\/\/([^:\/]+)(:\d*)?\//, '/'); + } + return decodeURIComponent(path); + }; + + pickBestMatch = function(path, objects, pathFunc) { + var bestMatch, object, score, _i, _len; + bestMatch = { + score: 0 + }; + for (_i = 0, _len = objects.length; _i < _len; _i++) { + object = objects[_i]; + score = numberOfMatchingSegments(path, pathFunc(object)); + if (score > bestMatch.score) { + bestMatch = { + object: object, + score: score + }; + } + } + if (bestMatch.score > 0) { + return bestMatch; + } else { + return null; + } + }; + + numberOfMatchingSegments = function(path1, path2) { + var comps1, comps2, eqCount, len; + path1 = path1.replace(/^\/+/, '').toLowerCase(); + path2 = path2.replace(/^\/+/, '').toLowerCase(); + if (path1 === path2) { + return 10000; + } + comps1 = path1.split('/').reverse(); + comps2 = path2.split('/').reverse(); + len = Math.min(comps1.length, comps2.length); + eqCount = 0; + while (eqCount < len && comps1[eqCount] === comps2[eqCount]) { + ++eqCount; + } + return eqCount; + }; + + pathsMatch = function(path1, path2) { + return numberOfMatchingSegments(path1, path2) > 0; + }; + + IMAGE_STYLES = [ + { + selector: 'background', + styleNames: ['backgroundImage'] + }, { + selector: 'border', + styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage'] + } + ]; + + exports.Reloader = Reloader = (function() { + function Reloader(window, console, Timer) { + this.window = window; + this.console = console; + this.Timer = Timer; + this.document = this.window.document; + this.importCacheWaitPeriod = 200; + this.plugins = []; + } + + Reloader.prototype.addPlugin = function(plugin) { + return this.plugins.push(plugin); + }; + + Reloader.prototype.analyze = function(callback) { + return results; + }; + + Reloader.prototype.reload = function(path, options) { + var plugin, _base, _i, _len, _ref; + this.options = options; + if ((_base = this.options).stylesheetReloadTimeout == null) { + _base.stylesheetReloadTimeout = 15000; + } + _ref = this.plugins; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + plugin = _ref[_i]; + if (plugin.reload && plugin.reload(path, options)) { + return; + } + } + if (options.liveCSS) { + if (path.match(/\.css$/i)) { + if (this.reloadStylesheet(path)) { + return; + } + } + } + if (options.liveImg) { + if (path.match(/\.(jpe?g|png|gif)$/i)) { + this.reloadImages(path); + return; + } + } + return this.reloadPage(); + }; + + Reloader.prototype.reloadPage = function() { + return this.window.document.location.reload(); + }; + + Reloader.prototype.reloadImages = function(path) { + var expando, img, selector, styleNames, styleSheet, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _results; + expando = this.generateUniqueString(); + _ref = this.document.images; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + img = _ref[_i]; + if (pathsMatch(path, pathFromUrl(img.src))) { + img.src = this.generateCacheBustUrl(img.src, expando); + } + } + if (this.document.querySelectorAll) { + for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { + _ref1 = IMAGE_STYLES[_j], selector = _ref1.selector, styleNames = _ref1.styleNames; + _ref2 = this.document.querySelectorAll("[style*=" + selector + "]"); + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + img = _ref2[_k]; + this.reloadStyleImages(img.style, styleNames, path, expando); + } + } + } + if (this.document.styleSheets) { + _ref3 = this.document.styleSheets; + _results = []; + for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { + styleSheet = _ref3[_l]; + _results.push(this.reloadStylesheetImages(styleSheet, path, expando)); + } + return _results; + } + }; + + Reloader.prototype.reloadStylesheetImages = function(styleSheet, path, expando) { + var e, rule, rules, styleNames, _i, _j, _len, _len1; + try { + rules = styleSheet != null ? styleSheet.cssRules : void 0; + } catch (_error) { + e = _error; + } + if (!rules) { + return; + } + for (_i = 0, _len = rules.length; _i < _len; _i++) { + rule = rules[_i]; + switch (rule.type) { + case CSSRule.IMPORT_RULE: + this.reloadStylesheetImages(rule.styleSheet, path, expando); + break; + case CSSRule.STYLE_RULE: + for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { + styleNames = IMAGE_STYLES[_j].styleNames; + this.reloadStyleImages(rule.style, styleNames, path, expando); + } + break; + case CSSRule.MEDIA_RULE: + this.reloadStylesheetImages(rule, path, expando); + } + } + }; + + Reloader.prototype.reloadStyleImages = function(style, styleNames, path, expando) { + var newValue, styleName, value, _i, _len; + for (_i = 0, _len = styleNames.length; _i < _len; _i++) { + styleName = styleNames[_i]; + value = style[styleName]; + if (typeof value === 'string') { + newValue = value.replace(/\burl\s*\(([^)]*)\)/, (function(_this) { + return function(match, src) { + if (pathsMatch(path, pathFromUrl(src))) { + return "url(" + (_this.generateCacheBustUrl(src, expando)) + ")"; + } else { + return match; + } + }; + })(this)); + if (newValue !== value) { + style[styleName] = newValue; + } + } + } + }; + + Reloader.prototype.reloadStylesheet = function(path) { + var imported, link, links, match, style, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1; + links = (function() { + var _i, _len, _ref, _results; + _ref = this.document.getElementsByTagName('link'); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + link = _ref[_i]; + if (link.rel.match(/^stylesheet$/i) && !link.__LiveReload_pendingRemoval) { + _results.push(link); + } + } + return _results; + }).call(this); + imported = []; + _ref = this.document.getElementsByTagName('style'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + style = _ref[_i]; + if (style.sheet) { + this.collectImportedStylesheets(style, style.sheet, imported); + } + } + for (_j = 0, _len1 = links.length; _j < _len1; _j++) { + link = links[_j]; + this.collectImportedStylesheets(link, link.sheet, imported); + } + if (this.window.StyleFix && this.document.querySelectorAll) { + _ref1 = this.document.querySelectorAll('style[data-href]'); + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { + style = _ref1[_k]; + links.push(style); + } + } + this.console.log("LiveReload found " + links.length + " LINKed stylesheets, " + imported.length + " @imported stylesheets"); + match = pickBestMatch(path, links.concat(imported), (function(_this) { + return function(l) { + return pathFromUrl(_this.linkHref(l)); + }; + })(this)); + if (match) { + if (match.object.rule) { + this.console.log("LiveReload is reloading imported stylesheet: " + match.object.href); + this.reattachImportedRule(match.object); + } else { + this.console.log("LiveReload is reloading stylesheet: " + (this.linkHref(match.object))); + this.reattachStylesheetLink(match.object); + } + } else { + this.console.log("LiveReload will reload all stylesheets because path '" + path + "' did not match any specific one"); + for (_l = 0, _len3 = links.length; _l < _len3; _l++) { + link = links[_l]; + this.reattachStylesheetLink(link); + } + } + return true; + }; + + Reloader.prototype.collectImportedStylesheets = function(link, styleSheet, result) { + var e, index, rule, rules, _i, _len; + try { + rules = styleSheet != null ? styleSheet.cssRules : void 0; + } catch (_error) { + e = _error; + } + if (rules && rules.length) { + for (index = _i = 0, _len = rules.length; _i < _len; index = ++_i) { + rule = rules[index]; + switch (rule.type) { + case CSSRule.CHARSET_RULE: + continue; + case CSSRule.IMPORT_RULE: + result.push({ + link: link, + rule: rule, + index: index, + href: rule.href + }); + this.collectImportedStylesheets(link, rule.styleSheet, result); + break; + default: + break; + } + } + } + }; + + Reloader.prototype.waitUntilCssLoads = function(clone, func) { + var callbackExecuted, executeCallback, poll; + callbackExecuted = false; + executeCallback = (function(_this) { + return function() { + if (callbackExecuted) { + return; + } + callbackExecuted = true; + return func(); + }; + })(this); + clone.onload = (function(_this) { + return function() { + _this.console.log("LiveReload: the new stylesheet has finished loading"); + _this.knownToSupportCssOnLoad = true; + return executeCallback(); + }; + })(this); + if (!this.knownToSupportCssOnLoad) { + (poll = (function(_this) { + return function() { + if (clone.sheet) { + _this.console.log("LiveReload is polling until the new CSS finishes loading..."); + return executeCallback(); + } else { + return _this.Timer.start(50, poll); + } + }; + })(this))(); + } + return this.Timer.start(this.options.stylesheetReloadTimeout, executeCallback); + }; + + Reloader.prototype.linkHref = function(link) { + return link.href || link.getAttribute('data-href'); + }; + + Reloader.prototype.reattachStylesheetLink = function(link) { + var clone, parent; + if (link.__LiveReload_pendingRemoval) { + return; + } + link.__LiveReload_pendingRemoval = true; + if (link.tagName === 'STYLE') { + clone = this.document.createElement('link'); + clone.rel = 'stylesheet'; + clone.media = link.media; + clone.disabled = link.disabled; + } else { + clone = link.cloneNode(false); + } + clone.href = this.generateCacheBustUrl(this.linkHref(link)); + parent = link.parentNode; + if (parent.lastChild === link) { + parent.appendChild(clone); + } else { + parent.insertBefore(clone, link.nextSibling); + } + return this.waitUntilCssLoads(clone, (function(_this) { + return function() { + var additionalWaitingTime; + if (/AppleWebKit/.test(navigator.userAgent)) { + additionalWaitingTime = 5; + } else { + additionalWaitingTime = 200; + } + return _this.Timer.start(additionalWaitingTime, function() { + var _ref; + if (!link.parentNode) { + return; + } + link.parentNode.removeChild(link); + clone.onreadystatechange = null; + return (_ref = _this.window.StyleFix) != null ? _ref.link(clone) : void 0; + }); + }; + })(this)); + }; + + Reloader.prototype.reattachImportedRule = function(_arg) { + var href, index, link, media, newRule, parent, rule, tempLink; + rule = _arg.rule, index = _arg.index, link = _arg.link; + parent = rule.parentStyleSheet; + href = this.generateCacheBustUrl(rule.href); + media = rule.media.length ? [].join.call(rule.media, ', ') : ''; + newRule = "@import url(\"" + href + "\") " + media + ";"; + rule.__LiveReload_newHref = href; + tempLink = this.document.createElement("link"); + tempLink.rel = 'stylesheet'; + tempLink.href = href; + tempLink.__LiveReload_pendingRemoval = true; + if (link.parentNode) { + link.parentNode.insertBefore(tempLink, link); + } + return this.Timer.start(this.importCacheWaitPeriod, (function(_this) { + return function() { + if (tempLink.parentNode) { + tempLink.parentNode.removeChild(tempLink); + } + if (rule.__LiveReload_newHref !== href) { + return; + } + parent.insertRule(newRule, index); + parent.deleteRule(index + 1); + rule = parent.cssRules[index]; + rule.__LiveReload_newHref = href; + return _this.Timer.start(_this.importCacheWaitPeriod, function() { + if (rule.__LiveReload_newHref !== href) { + return; + } + parent.insertRule(newRule, index); + return parent.deleteRule(index + 1); + }); + }; + })(this)); + }; + + Reloader.prototype.generateUniqueString = function() { + return 'livereload=' + Date.now(); + }; + + Reloader.prototype.generateCacheBustUrl = function(url, expando) { + var hash, oldParams, originalUrl, params, _ref; + if (expando == null) { + expando = this.generateUniqueString(); + } + _ref = splitUrl(url), url = _ref.url, hash = _ref.hash, oldParams = _ref.params; + if (this.options.overrideURL) { + if (url.indexOf(this.options.serverURL) < 0) { + originalUrl = url; + url = this.options.serverURL + this.options.overrideURL + "?url=" + encodeURIComponent(url); + this.console.log("LiveReload is overriding source URL " + originalUrl + " with " + url); + } + } + params = oldParams.replace(/(\?|&)livereload=(\d+)/, function(match, sep) { + return "" + sep + expando; + }); + if (params === oldParams) { + if (oldParams.length === 0) { + params = "?" + expando; + } else { + params = "" + oldParams + "&" + expando; + } + } + return url + params + hash; + }; + + return Reloader; + + })(); + +}).call(this); + +},{}],8:[function(require,module,exports){ +(function() { + var CustomEvents, LiveReload, k; + + CustomEvents = require('./customevents'); + + LiveReload = window.LiveReload = new (require('./livereload').LiveReload)(window); + + for (k in window) { + if (k.match(/^LiveReloadPlugin/)) { + LiveReload.addPlugin(window[k]); + } + } + + LiveReload.addPlugin(require('./less')); + + LiveReload.on('shutdown', function() { + return delete window.LiveReload; + }); + + LiveReload.on('connect', function() { + return CustomEvents.fire(document, 'LiveReloadConnect'); + }); + + LiveReload.on('disconnect', function() { + return CustomEvents.fire(document, 'LiveReloadDisconnect'); + }); + + CustomEvents.bind(document, 'LiveReloadShutDown', function() { + return LiveReload.shutDown(); + }); + +}).call(this); + +},{"./customevents":2,"./less":3,"./livereload":4}],9:[function(require,module,exports){ +(function() { + var Timer; + + exports.Timer = Timer = (function() { + function Timer(func) { + this.func = func; + this.running = false; + this.id = null; + this._handler = (function(_this) { + return function() { + _this.running = false; + _this.id = null; + return _this.func(); + }; + })(this); + } + + Timer.prototype.start = function(timeout) { + if (this.running) { + clearTimeout(this.id); + } + this.id = setTimeout(this._handler, timeout); + return this.running = true; + }; + + Timer.prototype.stop = function() { + if (this.running) { + clearTimeout(this.id); + this.running = false; + return this.id = null; + } + }; + + return Timer; + + })(); + + Timer.start = function(timeout, func) { + return setTimeout(func, timeout); + }; + +}).call(this); + +},{}]},{},[8]); diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/servlet.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/servlet.rb new file mode 100644 index 0000000..640720e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/servlet.rb @@ -0,0 +1,203 @@ +# frozen_string_literal: true + +require "webrick" + +module Jekyll + module Commands + class Serve + # This class is used to determine if the Servlet should modify a served file + # to insert the LiveReload script tags + class SkipAnalyzer + BAD_USER_AGENTS = [%r!MSIE!].freeze + + def self.skip_processing?(request, response, options) + new(request, response, options).skip_processing? + end + + def initialize(request, response, options) + @options = options + @request = request + @response = response + end + + def skip_processing? + !html? || chunked? || inline? || bad_browser? + end + + def chunked? + @response["Transfer-Encoding"] == "chunked" + end + + def inline? + @response["Content-Disposition"] =~ %r!^inline! + end + + def bad_browser? + BAD_USER_AGENTS.any? { |pattern| @request["User-Agent"] =~ pattern } + end + + def html? + @response["Content-Type"] =~ %r!text/html! + end + end + + # This class inserts the LiveReload script tags into HTML as it is served + class BodyProcessor + HEAD_TAG_REGEX = %r!|! + + attr_reader :content_length, :new_body, :livereload_added + + def initialize(body, options) + @body = body + @options = options + @processed = false + end + + def processed? + @processed + end + + # rubocop:disable Metrics/MethodLength + def process! + @new_body = [] + # @body will usually be a File object but Strings occur in rare cases + if @body.respond_to?(:each) + begin + @body.each { |line| @new_body << line.to_s } + ensure + @body.close + end + else + @new_body = @body.lines + end + + @content_length = 0 + @livereload_added = false + + @new_body.each do |line| + if !@livereload_added && line[" + document.write( + ' + TEMPLATE + ERB.new(Jekyll::Utils.strip_heredoc(template)) + end + + def livereload_args + # XHTML standard requires ampersands to be encoded as entities when in + # attributes. See http://stackoverflow.com/a/2190292 + src = "" + if @options["livereload_min_delay"] + src += "&mindelay=#{@options["livereload_min_delay"]}" + end + if @options["livereload_max_delay"] + src += "&maxdelay=#{@options["livereload_max_delay"]}" + end + if @options["livereload_port"] + src += "&port=#{@options["livereload_port"]}" + end + src + end + end + + class Servlet < WEBrick::HTTPServlet::FileHandler + DEFAULTS = { + "Cache-Control" => "private, max-age=0, proxy-revalidate, " \ + "no-store, no-cache, must-revalidate", + }.freeze + + def initialize(server, root, callbacks) + # So we can access them easily. + @jekyll_opts = server.config[:JekyllOptions] + set_defaults + super + end + + def search_index_file(req, res) + super || search_file(req, res, ".html") + end + + # Add the ability to tap file.html the same way that Nginx does on our + # Docker images (or on GitHub Pages.) The difference is that we might end + # up with a different preference on which comes first. + + def search_file(req, res, basename) + # /file.* > /file/index.html > /file.html + super || super(req, res, "#{basename}.html") + end + + # rubocop:disable Naming/MethodName + def do_GET(req, res) + rtn = super + + if @jekyll_opts["livereload"] + return rtn if SkipAnalyzer.skip_processing?(req, res, @jekyll_opts) + + processor = BodyProcessor.new(res.body, @jekyll_opts) + processor.process! + res.body = processor.new_body + res.content_length = processor.content_length.to_s + + if processor.livereload_added + # Add a header to indicate that the page content has been modified + res["X-Rack-LiveReload"] = "1" + end + end + + validate_and_ensure_charset(req, res) + res.header.merge!(@headers) + rtn + end + + # + + private + def validate_and_ensure_charset(_req, res) + key = res.header.keys.grep(%r!content-type!i).first + typ = res.header[key] + + unless typ =~ %r!;\s*charset=! + res.header[key] = "#{typ}; charset=#{@jekyll_opts["encoding"]}" + end + end + + # + + private + def set_defaults + hash_ = @jekyll_opts.fetch("webrick", {}).fetch("headers", {}) + DEFAULTS.each_with_object(@headers = hash_) do |(key, val), hash| + hash[key] = val unless hash.key?(key) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/websockets.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/websockets.rb new file mode 100644 index 0000000..1e5f948 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/commands/serve/websockets.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +require "http/parser" + +module Jekyll + module Commands + class Serve + # The LiveReload protocol requires the server to serve livereload.js over HTTP + # despite the fact that the protocol itself uses WebSockets. This custom connection + # class addresses the dual protocols that the server needs to understand. + class HttpAwareConnection < EventMachine::WebSocket::Connection + attr_reader :reload_body, :reload_size + + def initialize(_opts) + # If EventMachine SSL support on Windows ever gets better, the code below will + # set up the reactor to handle SSL + # + # @ssl_enabled = opts["ssl_cert"] && opts["ssl_key"] + # if @ssl_enabled + # em_opts[:tls_options] = { + # :private_key_file => Jekyll.sanitized_path(opts["source"], opts["ssl_key"]), + # :cert_chain_file => Jekyll.sanitized_path(opts["source"], opts["ssl_cert"]) + # } + # em_opts[:secure] = true + # end + + # This is too noisy even for --verbose, but uncomment if you need it for + # a specific WebSockets issue. Adding ?LR-verbose=true onto the URL will + # enable logging on the client side. + # em_opts[:debug] = true + + em_opts = {} + super(em_opts) + + reload_file = File.join(Serve.singleton_class::LIVERELOAD_DIR, "livereload.js") + + @reload_body = File.read(reload_file) + @reload_size = @reload_body.bytesize + end + + # rubocop:disable Metrics/MethodLength + def dispatch(data) + parser = Http::Parser.new + parser << data + + # WebSockets requests will have a Connection: Upgrade header + if parser.http_method != "GET" || parser.upgrade? + super + elsif parser.request_url =~ %r!^\/livereload.js! + headers = [ + "HTTP/1.1 200 OK", + "Content-Type: application/javascript", + "Content-Length: #{reload_size}", + "", + "", + ].join("\r\n") + send_data(headers) + + # stream_file_data would free us from keeping livereload.js in memory + # but JRuby blocks on that call and never returns + send_data(reload_body) + close_connection_after_writing + else + body = "This port only serves livereload.js over HTTP.\n" + headers = [ + "HTTP/1.1 400 Bad Request", + "Content-Type: text/plain", + "Content-Length: #{body.bytesize}", + "", + "", + ].join("\r\n") + send_data(headers) + send_data(body) + close_connection_after_writing + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/configuration.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/configuration.rb new file mode 100644 index 0000000..601e1f9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/configuration.rb @@ -0,0 +1,402 @@ +# frozen_string_literal: true + +module Jekyll + class Configuration < Hash + # Default options. Overridden by values in _config.yml. + # Strings rather than symbols are used for compatibility with YAML. + DEFAULTS = Configuration[{ + # Where things are + "source" => Dir.pwd, + "destination" => File.join(Dir.pwd, "_site"), + "collections_dir" => "", + "plugins_dir" => "_plugins", + "layouts_dir" => "_layouts", + "data_dir" => "_data", + "includes_dir" => "_includes", + "collections" => {}, + + # Handling Reading + "safe" => false, + "include" => [".htaccess"], + "exclude" => %w( + Gemfile Gemfile.lock node_modules vendor/bundle/ vendor/cache/ vendor/gems/ + vendor/ruby/ + ), + "keep_files" => [".git", ".svn"], + "encoding" => "utf-8", + "markdown_ext" => "markdown,mkdown,mkdn,mkd,md", + "strict_front_matter" => false, + + # Filtering Content + "show_drafts" => nil, + "limit_posts" => 0, + "future" => false, + "unpublished" => false, + + # Plugins + "whitelist" => [], + "plugins" => [], + + # Conversion + "markdown" => "kramdown", + "highlighter" => "rouge", + "lsi" => false, + "excerpt_separator" => "\n\n", + "incremental" => false, + + # Serving + "detach" => false, # default to not detaching the server + "port" => "4000", + "host" => "127.0.0.1", + "baseurl" => nil, # this mounts at /, i.e. no subdirectory + "show_dir_listing" => false, + + # Output Configuration + "permalink" => "date", + "paginate_path" => "/page:num", + "timezone" => nil, # use the local timezone + + "quiet" => false, + "verbose" => false, + "defaults" => [], + + "liquid" => { + "error_mode" => "warn", + }, + + "rdiscount" => { + "extensions" => [], + }, + + "redcarpet" => { + "extensions" => [], + }, + + "kramdown" => { + "auto_ids" => true, + "toc_levels" => "1..6", + "entity_output" => "as_char", + "smart_quotes" => "lsquo,rsquo,ldquo,rdquo", + "input" => "GFM", + "hard_wrap" => false, + "footnote_nr" => 1, + "show_warnings" => false, + }, + }.map { |k, v| [k, v.freeze] }].freeze + + class << self + # Static: Produce a Configuration ready for use in a Site. + # It takes the input, fills in the defaults where values do not + # exist, and patches common issues including migrating options for + # backwards compatiblity. Except where a key or value is being fixed, + # the user configuration will override the defaults. + # + # user_config - a Hash or Configuration of overrides. + # + # Returns a Configuration filled with defaults and fixed for common + # problems and backwards-compatibility. + def from(user_config) + Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys) + .add_default_collections + end + end + + # Public: Turn all keys into string + # + # Return a copy of the hash where all its keys are strings + def stringify_keys + reduce({}) { |hsh, (k, v)| hsh.merge(k.to_s => v) } + end + + def get_config_value_with_override(config_key, override) + override[config_key] || self[config_key] || DEFAULTS[config_key] + end + + # Public: Directory of the Jekyll source folder + # + # override - the command-line options hash + # + # Returns the path to the Jekyll source directory + def source(override) + get_config_value_with_override("source", override) + end + + def quiet(override = {}) + get_config_value_with_override("quiet", override) + end + alias_method :quiet?, :quiet + + def verbose(override = {}) + get_config_value_with_override("verbose", override) + end + alias_method :verbose?, :verbose + + def safe_load_file(filename) + case File.extname(filename) + when %r!\.toml!i + Jekyll::External.require_with_graceful_fail("tomlrb") unless defined?(Tomlrb) + Tomlrb.load_file(filename) + when %r!\.ya?ml!i + SafeYAML.load_file(filename) || {} + else + raise ArgumentError, "No parser for '#{filename}' is available. + Use a .y(a)ml or .toml file instead." + end + end + + # Public: Generate list of configuration files from the override + # + # override - the command-line options hash + # + # Returns an Array of config files + def config_files(override) + # Adjust verbosity quickly + Jekyll.logger.adjust_verbosity( + :quiet => quiet?(override), + :verbose => verbose?(override) + ) + + # Get configuration from /_config.yml or / + config_files = override["config"] + if config_files.to_s.empty? + default = %w(yml yaml).find(-> { "yml" }) do |ext| + File.exist?(Jekyll.sanitized_path(source(override), "_config.#{ext}")) + end + config_files = Jekyll.sanitized_path(source(override), "_config.#{default}") + @default_config_file = true + end + Array(config_files) + end + + # Public: Read configuration and return merged Hash + # + # file - the path to the YAML file to be read in + # + # Returns this configuration, overridden by the values in the file + def read_config_file(file) + next_config = safe_load_file(file) + check_config_is_hash!(next_config, file) + Jekyll.logger.info "Configuration file:", file + next_config + rescue SystemCallError + if @default_config_file ||= nil + Jekyll.logger.warn "Configuration file:", "none" + {} + else + Jekyll.logger.error "Fatal:", "The configuration file '#{file}' + could not be found." + raise LoadError, "The Configuration file '#{file}' could not be found." + end + end + + # Public: Read in a list of configuration files and merge with this hash + # + # files - the list of configuration file paths + # + # Returns the full configuration, with the defaults overridden by the values in the + # configuration files + def read_config_files(files) + configuration = clone + + begin + files.each do |config_file| + next if config_file.nil? || config_file.empty? + new_config = read_config_file(config_file) + configuration = Utils.deep_merge_hashes(configuration, new_config) + end + rescue ArgumentError => err + Jekyll.logger.warn "WARNING:", "Error reading configuration. " \ + "Using defaults (and options)." + warn err + end + + configuration.backwards_compatibilize.add_default_collections + end + + # Public: Split a CSV string into an array containing its values + # + # csv - the string of comma-separated values + # + # Returns an array of the values contained in the CSV + def csv_to_array(csv) + csv.split(",").map(&:strip) + end + + # Public: Ensure the proper options are set in the configuration to allow for + # backwards-compatibility with Jekyll pre-1.0 + # + # Returns the backwards-compatible configuration + def backwards_compatibilize + config = clone + # Provide backwards-compatibility + check_auto(config) + check_server(config) + check_plugins(config) + + renamed_key "server_port", "port", config + renamed_key "gems", "plugins", config + renamed_key "layouts", "layouts_dir", config + renamed_key "data_source", "data_dir", config + + check_pygments(config) + check_include_exclude(config) + check_coderay(config) + check_maruku(config) + + config + end + + # DEPRECATED. + def fix_common_issues + self + end + + def add_default_collections + config = clone + + # It defaults to `{}`, so this is only if someone sets it to null manually. + return config if config["collections"].nil? + + # Ensure we have a hash. + if config["collections"].is_a?(Array) + config["collections"] = Hash[config["collections"].map { |c| [c, {}] }] + end + + config["collections"] = Utils.deep_merge_hashes( + { "posts" => {} }, config["collections"] + ).tap do |collections| + collections["posts"]["output"] = true + if config["permalink"] + collections["posts"]["permalink"] ||= style_to_permalink(config["permalink"]) + end + end + + config + end + + def renamed_key(old, new, config, _ = nil) + if config.key?(old) + Jekyll::Deprecator.deprecation_message "The '#{old}' configuration" \ + " option has been renamed to '#{new}'. Please update your config" \ + " file accordingly." + config[new] = config.delete(old) + end + end + + private + def style_to_permalink(permalink_style) + case permalink_style.to_sym + when :pretty + "/:categories/:year/:month/:day/:title/" + when :none + "/:categories/:title:output_ext" + when :date + "/:categories/:year/:month/:day/:title:output_ext" + when :ordinal + "/:categories/:year/:y_day/:title:output_ext" + else + permalink_style.to_s + end + end + + # Private: Checks if a given config is a hash + # + # extracted_config - the value to check + # file - the file from which the config was extracted + # + # Raises an ArgumentError if given config is not a hash + private + def check_config_is_hash!(extracted_config, file) + unless extracted_config.is_a?(Hash) + raise ArgumentError, "Configuration file: (INVALID) #{file}".yellow + end + end + + private + def check_auto(config) + if config.key?("auto") || config.key?("watch") + Jekyll::Deprecator.deprecation_message "Auto-regeneration can no longer" \ + " be set from your configuration file(s). Use the" \ + " --[no-]watch/-w command-line option instead." + config.delete("auto") + config.delete("watch") + end + end + + private + def check_server(config) + if config.key?("server") + Jekyll::Deprecator.deprecation_message "The 'server' configuration option" \ + " is no longer accepted. Use the 'jekyll serve'" \ + " subcommand to serve your site with WEBrick." + config.delete("server") + end + end + + private + def check_pygments(config) + if config.key?("pygments") + Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" \ + " has been renamed to 'highlighter'. Please update your" \ + " config file accordingly. The allowed values are 'rouge', " \ + "'pygments' or null." + + config["highlighter"] = "pygments" if config["pygments"] + config.delete("pygments") + end + end + + private + def check_include_exclude(config) + %w(include exclude).each do |option| + if config[option].is_a?(String) + Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" \ + " must now be specified as an array, but you specified" \ + " a string. For now, we've treated the string you provided" \ + " as a list of comma-separated values." + config[option] = csv_to_array(config[option]) + end + config[option].map!(&:to_s) if config[option] + end + end + + private + def check_coderay(config) + if (config["kramdown"] || {}).key?("use_coderay") + Jekyll::Deprecator.deprecation_message "Please change 'use_coderay'" \ + " to 'enable_coderay' in your configuration file." + config["kramdown"]["use_coderay"] = config["kramdown"].delete("enable_coderay") + end + end + + private + def check_maruku(config) + if config.fetch("markdown", "kramdown").to_s.casecmp("maruku").zero? + Jekyll.logger.abort_with "Error:", "You're using the 'maruku' " \ + "Markdown processor, which has been removed as of 3.0.0. " \ + "We recommend you switch to Kramdown. To do this, replace " \ + "`markdown: maruku` with `markdown: kramdown` in your " \ + "`_config.yml` file." + end + end + + # Private: Checks if the `plugins` config is a String + # + # config - the config hash + # + # Raises a Jekyll::Errors::InvalidConfigurationError if the config `plugins` + # is a string + private + def check_plugins(config) + if config.key?("plugins") && config["plugins"].is_a?(String) + Jekyll.logger.error "Configuration Error:", "You specified the" \ + " `plugins` config in your configuration file as a string, please" \ + " use an array instead. If you wanted to set the directory of your" \ + " plugins, use the config key `plugins_dir` instead." + raise Jekyll::Errors::InvalidConfigurationError, + "'plugins' should not be a string, but was: " \ + "#{config["plugins"].inspect}. Use 'plugins_dir' instead." + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converter.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converter.rb new file mode 100644 index 0000000..3cb74de --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converter.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +module Jekyll + class Converter < Plugin + # Public: Get or set the highlighter prefix. When an argument is specified, + # the prefix will be set. If no argument is specified, the current prefix + # will be returned. + # + # highlighter_prefix - The String prefix (default: nil). + # + # Returns the String prefix. + def self.highlighter_prefix(highlighter_prefix = nil) + unless defined?(@highlighter_prefix) && highlighter_prefix.nil? + @highlighter_prefix = highlighter_prefix + end + @highlighter_prefix + end + + # Public: Get or set the highlighter suffix. When an argument is specified, + # the suffix will be set. If no argument is specified, the current suffix + # will be returned. + # + # highlighter_suffix - The String suffix (default: nil). + # + # Returns the String suffix. + def self.highlighter_suffix(highlighter_suffix = nil) + unless defined?(@highlighter_suffix) && highlighter_suffix.nil? + @highlighter_suffix = highlighter_suffix + end + @highlighter_suffix + end + + # Initialize the converter. + # + # Returns an initialized Converter. + def initialize(config = {}) + @config = config + end + + # Get the highlighter prefix. + # + # Returns the String prefix. + def highlighter_prefix + self.class.highlighter_prefix + end + + # Get the highlighter suffix. + # + # Returns the String suffix. + def highlighter_suffix + self.class.highlighter_suffix + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/identity.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/identity.rb new file mode 100644 index 0000000..2296aff --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/identity.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Jekyll + module Converters + class Identity < Converter + safe true + + priority :lowest + + def matches(_ext) + true + end + + def output_ext(ext) + ext + end + + def convert(content) + content + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown.rb new file mode 100644 index 0000000..17d102f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +module Jekyll + module Converters + class Markdown < Converter + highlighter_prefix "\n" + highlighter_suffix "\n" + safe true + + def setup + return if @setup ||= false + unless (@parser = get_processor) + Jekyll.logger.error "Invalid Markdown processor given:", @config["markdown"] + if @config["safe"] + Jekyll.logger.info "", "Custom processors are not loaded in safe mode" + end + Jekyll.logger.error( + "", + "Available processors are: #{valid_processors.join(", ")}" + ) + raise Errors::FatalException, "Bailing out; invalid Markdown processor." + end + + @setup = true + end + + # Rubocop does not allow reader methods to have names starting with `get_` + # To ensure compatibility, this check has been disabled on this method + # + # rubocop:disable Naming/AccessorMethodName + def get_processor + case @config["markdown"].downcase + when "redcarpet" then return RedcarpetParser.new(@config) + when "kramdown" then return KramdownParser.new(@config) + when "rdiscount" then return RDiscountParser.new(@config) + else + custom_processor + end + end + # rubocop:enable Naming/AccessorMethodName + + # Public: Provides you with a list of processors, the ones we + # support internally and the ones that you have provided to us (if you + # are not in safe mode.) + + def valid_processors + %w(rdiscount kramdown redcarpet) + third_party_processors + end + + # Public: A list of processors that you provide via plugins. + # This is really only available if you are not in safe mode, if you are + # in safe mode (re: GitHub) then there will be none. + + def third_party_processors + self.class.constants - \ + %w(KramdownParser RDiscountParser RedcarpetParser PRIORITIES).map( + &:to_sym + ) + end + + def extname_list + @extname_list ||= @config["markdown_ext"].split(",").map do |e| + ".#{e.downcase}" + end + end + + def matches(ext) + extname_list.include?(ext.downcase) + end + + def output_ext(_ext) + ".html" + end + + def convert(content) + setup + @parser.convert(content) + end + + private + def custom_processor + converter_name = @config["markdown"] + if custom_class_allowed?(converter_name) + self.class.const_get(converter_name).new(@config) + end + end + + # Private: Determine whether a class name is an allowed custom + # markdown class name. + # + # parser_name - the name of the parser class + # + # Returns true if the parser name contains only alphanumeric + # characters and is defined within Jekyll::Converters::Markdown + + private + def custom_class_allowed?(parser_name) + parser_name !~ %r![^A-Za-z0-9_]! && self.class.constants.include?( + parser_name.to_sym + ) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/kramdown_parser.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/kramdown_parser.rb new file mode 100644 index 0000000..bb03eaa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -0,0 +1,129 @@ +# Frozen-string-literal: true + +module Jekyll + module Converters + class Markdown + class KramdownParser + CODERAY_DEFAULTS = { + "css" => "style", + "bold_every" => 10, + "line_numbers" => "inline", + "line_number_start" => 1, + "tab_width" => 4, + "wrap" => "div", + }.freeze + + def initialize(config) + Jekyll::External.require_with_graceful_fail "kramdown" + @main_fallback_highlighter = config["highlighter"] || "rouge" + @config = config["kramdown"] || {} + @highlighter = nil + setup + end + + # Setup and normalize the configuration: + # * Create Kramdown if it doesn't exist. + # * Set syntax_highlighter, detecting enable_coderay and merging + # highlighter if none. + # * Merge kramdown[coderay] into syntax_highlighter_opts stripping coderay_. + # * Make sure `syntax_highlighter_opts` exists. + + def setup + @config["syntax_highlighter"] ||= highlighter + @config["syntax_highlighter_opts"] ||= {} + @config["coderay"] ||= {} # XXX: Legacy. + modernize_coderay_config + make_accessible + end + + def convert(content) + document = Kramdown::Document.new(content, @config) + html_output = document.to_html + if @config["show_warnings"] + document.warnings.each do |warning| + Jekyll.logger.warn "Kramdown warning:", warning + end + end + html_output + end + + private + # rubocop:disable Performance/HashEachMethods + def make_accessible(hash = @config) + hash.keys.each do |key| + hash[key.to_sym] = hash[key] + make_accessible(hash[key]) if hash[key].is_a?(Hash) + end + end + # rubocop:enable Performance/HashEachMethods + + # config[kramdown][syntax_higlighter] > + # config[kramdown][enable_coderay] > + # config[highlighter] + # Where `enable_coderay` is now deprecated because Kramdown + # supports Rouge now too. + + private + def highlighter + return @highlighter if @highlighter + + if @config["syntax_highlighter"] + return @highlighter = @config[ + "syntax_highlighter" + ] + end + + @highlighter = begin + if @config.key?("enable_coderay") && @config["enable_coderay"] + Jekyll::Deprecator.deprecation_message( + "You are using 'enable_coderay', " \ + "use syntax_highlighter: coderay in your configuration file." + ) + + "coderay" + else + @main_fallback_highlighter + end + end + end + + private + def strip_coderay_prefix(hash) + hash.each_with_object({}) do |(key, val), hsh| + cleaned_key = key.to_s.gsub(%r!\Acoderay_!, "") + + if key != cleaned_key + Jekyll::Deprecator.deprecation_message( + "You are using '#{key}'. Normalizing to #{cleaned_key}." + ) + end + + hsh[cleaned_key] = val + end + end + + # If our highlighter is CodeRay we go in to merge the CodeRay defaults + # with your "coderay" key if it's there, deprecating it in the + # process of you using it. + + private + def modernize_coderay_config + unless @config["coderay"].empty? + Jekyll::Deprecator.deprecation_message( + "You are using 'kramdown.coderay' in your configuration, " \ + "please use 'syntax_highlighter_opts' instead." + ) + + @config["syntax_highlighter_opts"] = begin + strip_coderay_prefix( + @config["syntax_highlighter_opts"] \ + .merge(CODERAY_DEFAULTS) \ + .merge(@config["coderay"]) + ) + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/rdiscount_parser.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/rdiscount_parser.rb new file mode 100644 index 0000000..654a3a6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/rdiscount_parser.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module Jekyll + module Converters + class Markdown + class RDiscountParser + def initialize(config) + Jekyll::External.require_with_graceful_fail "rdiscount" + @config = config + @rdiscount_extensions = @config["rdiscount"]["extensions"].map(&:to_sym) + end + + def convert(content) + rd = RDiscount.new(content, *@rdiscount_extensions) + html = rd.to_html + if @config["rdiscount"]["toc_token"] + html = replace_generated_toc(rd, html, @config["rdiscount"]["toc_token"]) + end + html + end + + private + def replace_generated_toc(rd, html, toc_token) + if rd.generate_toc && html.include?(toc_token) + utf8_toc = rd.toc_content + utf8_toc.force_encoding("utf-8") if utf8_toc.respond_to?(:force_encoding) + html.gsub(toc_token, utf8_toc) + else + html + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/redcarpet_parser.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/redcarpet_parser.rb new file mode 100644 index 0000000..7a8c6ec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -0,0 +1,108 @@ +# frozen_string_literal: true + +class Jekyll::Converters::Markdown::RedcarpetParser + module CommonMethods + def add_code_tags(code, lang) + code = code.to_s + code = code.sub( + %r!
      !,
      +        "
      "
      +      )
      +      code = code.sub(%r!
      !, "
      ") + code + end + end + + module WithPygments + include CommonMethods + def block_code(code, lang) + Jekyll::External.require_with_graceful_fail("pygments") + lang = lang && lang.split.first || "text" + add_code_tags( + Pygments.highlight( + code, + { + :lexer => lang, + :options => { :encoding => "utf-8" }, + } + ), + lang + ) + end + end + + module WithoutHighlighting + require "cgi" + + include CommonMethods + + def code_wrap(code) + "
      #{CGI.escapeHTML(code)}
      " + end + + def block_code(code, lang) + lang = lang && lang.split.first || "text" + add_code_tags(code_wrap(code), lang) + end + end + + module WithRouge + def block_code(_code, lang) + code = "
      #{super}
      " + + "
      #{add_code_tags(code, lang)}
      " + end + + protected + def rouge_formatter(_lexer) + Jekyll::Utils::Rouge.html_formatter(:wrap => false) + end + end + + def initialize(config) + Jekyll::External.require_with_graceful_fail("redcarpet") + @config = config + @redcarpet_extensions = {} + @config["redcarpet"]["extensions"].each do |e| + @redcarpet_extensions[e.to_sym] = true + end + + @renderer ||= class_with_proper_highlighter(@config["highlighter"]) + end + + def class_with_proper_highlighter(highlighter) + Class.new(Redcarpet::Render::HTML) do + case highlighter + when "pygments" + include WithPygments + when "rouge" + Jekyll::External.require_with_graceful_fail(%w( + rouge rouge/plugins/redcarpet + )) + + unless Gem::Version.new(Rouge.version) > Gem::Version.new("1.3.0") + abort "Please install Rouge 1.3.0 or greater and try running Jekyll again." + end + + include Rouge::Plugins::Redcarpet + include CommonMethods + include WithRouge + else + include WithoutHighlighting + end + end + end + + def convert(content) + @redcarpet_extensions[:fenced_code_blocks] = \ + !@redcarpet_extensions[:no_fenced_code_blocks] + if @redcarpet_extensions[:smart] + @renderer.send :include, Redcarpet::Render::SmartyPants + end + markdown = Redcarpet::Markdown.new( + @renderer.new(@redcarpet_extensions), + @redcarpet_extensions + ) + markdown.render(content) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/smartypants.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/smartypants.rb new file mode 100644 index 0000000..a3c3c15 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/converters/smartypants.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown + def initialize(source, options) + super + @block_parsers = [:block_html, :content] + @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :span_html] + end + + def parse_content + add_text @src.scan(%r!\A.*\n!) + end + define_parser(:content, %r!\A!) +end + +module Jekyll + module Converters + class SmartyPants < Converter + safe true + priority :low + + def initialize(config) + Jekyll::External.require_with_graceful_fail "kramdown" + @config = config["kramdown"].dup || {} + @config[:input] = :SmartyPants + end + + def matches(_) + false + end + + def output_ext(_) + nil + end + + def convert(content) + document = Kramdown::Document.new(content, @config) + html_output = document.to_html.chomp + if @config["show_warnings"] + document.warnings.each do |warning| + Jekyll.logger.warn "Kramdown warning:", warning.sub(%r!^Warning:\s+!, "") + end + end + html_output + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/convertible.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/convertible.rb new file mode 100644 index 0000000..d3749a1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/convertible.rb @@ -0,0 +1,257 @@ +# frozen_string_literal: true + +require "set" + +# Convertible provides methods for converting a pagelike item +# from a certain type of markup into actual content +# +# Requires +# self.site -> Jekyll::Site +# self.content +# self.content= +# self.data= +# self.ext= +# self.output= +# self.name +# self.path +# self.type -> :page, :post or :draft + +module Jekyll + module Convertible + # Returns the contents as a String. + def to_s + content || "" + end + + # Whether the file is published or not, as indicated in YAML front-matter + def published? + !(data.key?("published") && data["published"] == false) + end + + # Read the YAML frontmatter. + # + # base - The String path to the dir containing the file. + # name - The String filename of the file. + # opts - optional parameter to File.read, default at site configs + # + # Returns nothing. + # rubocop:disable Metrics/AbcSize + def read_yaml(base, name, opts = {}) + filename = File.join(base, name) + + begin + self.content = File.read(@path || site.in_source_dir(base, name), + Utils.merged_file_read_opts(site, opts)) + if content =~ Document::YAML_FRONT_MATTER_REGEXP + self.content = $POSTMATCH + self.data = SafeYAML.load(Regexp.last_match(1)) + end + rescue Psych::SyntaxError => e + Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}" + raise e if self.site.config["strict_front_matter"] + rescue StandardError => e + Jekyll.logger.warn "Error reading file #{filename}: #{e.message}" + raise e if self.site.config["strict_front_matter"] + end + + self.data ||= {} + + validate_data! filename + validate_permalink! filename + + self.data + end + # rubocop:enable Metrics/AbcSize + + def validate_data!(filename) + unless self.data.is_a?(Hash) + raise Errors::InvalidYAMLFrontMatterError, + "Invalid YAML front matter in #{filename}" + end + end + + def validate_permalink!(filename) + if self.data["permalink"] && self.data["permalink"].to_s.empty? + raise Errors::InvalidPermalinkError, "Invalid permalink in #{filename}" + end + end + + # Transform the contents based on the content type. + # + # Returns the transformed contents. + def transform + _renderer.convert(content) + end + + # Determine the extension depending on content_type. + # + # Returns the String extension for the output file. + # e.g. ".html" for an HTML output file. + def output_ext + _renderer.output_ext + end + + # Determine which converter to use based on this convertible's + # extension. + # + # Returns the Converter instance. + def converters + _renderer.converters + end + + # Render Liquid in the content + # + # content - the raw Liquid content to render + # payload - the payload for Liquid + # info - the info for Liquid + # + # Returns the converted content + def render_liquid(content, payload, info, path) + _renderer.render_liquid(content, payload, info, path) + end + # rubocop: enable RescueException + + # Convert this Convertible's data to a Hash suitable for use by Liquid. + # + # Returns the Hash representation of this Convertible. + def to_liquid(attrs = nil) + further_data = Hash[(attrs || self.class::ATTRIBUTES_FOR_LIQUID).map do |attribute| + [attribute, send(attribute)] + end] + + defaults = site.frontmatter_defaults.all(relative_path, type) + Utils.deep_merge_hashes defaults, Utils.deep_merge_hashes(data, further_data) + end + + # The type of a document, + # i.e., its classname downcase'd and to_sym'd. + # + # Returns the type of self. + def type + if is_a?(Page) + :pages + end + end + + # returns the owner symbol for hook triggering + def hook_owner + if is_a?(Page) + :pages + end + end + + # Determine whether the document is an asset file. + # Asset files include CoffeeScript files and Sass/SCSS files. + # + # Returns true if the extname belongs to the set of extensions + # that asset files use. + def asset_file? + sass_file? || coffeescript_file? + end + + # Determine whether the document is a Sass file. + # + # Returns true if extname == .sass or .scss, false otherwise. + def sass_file? + %w(.sass .scss).include?(ext) + end + + # Determine whether the document is a CoffeeScript file. + # + # Returns true if extname == .coffee, false otherwise. + def coffeescript_file? + ext == ".coffee" + end + + # Determine whether the file should be rendered with Liquid. + # + # Always returns true. + def render_with_liquid? + true + end + + # Determine whether the file should be placed into layouts. + # + # Returns false if the document is an asset file or if the front matter + # specifies `layout: none` + def place_in_layout? + !(asset_file? || no_layout?) + end + + # Checks if the layout specified in the document actually exists + # + # layout - the layout to check + # + # Returns true if the layout is invalid, false if otherwise + def invalid_layout?(layout) + !data["layout"].nil? && layout.nil? && !(self.is_a? Jekyll::Excerpt) + end + + # Recursively render layouts + # + # layouts - a list of the layouts + # payload - the payload for Liquid + # info - the info for Liquid + # + # Returns nothing + def render_all_layouts(layouts, payload, info) + _renderer.layouts = layouts + self.output = _renderer.place_in_layouts(output, payload, info) + ensure + @_renderer = nil # this will allow the modifications above to disappear + end + + # Add any necessary layouts to this convertible document. + # + # payload - The site payload Drop or Hash. + # layouts - A Hash of {"name" => "layout"}. + # + # Returns nothing. + def do_layout(payload, layouts) + self.output = _renderer.tap do |renderer| + renderer.layouts = layouts + renderer.payload = payload + end.run + + Jekyll.logger.debug "Post-Render Hooks:", self.relative_path + Jekyll::Hooks.trigger hook_owner, :post_render, self + ensure + @_renderer = nil # this will allow the modifications above to disappear + end + + # Write the generated page file to the destination directory. + # + # dest - The String path to the destination dir. + # + # Returns nothing. + def write(dest) + path = destination(dest) + FileUtils.mkdir_p(File.dirname(path)) + File.write(path, output, :mode => "wb") + Jekyll::Hooks.trigger hook_owner, :post_write, self + end + + # Accessor for data properties by Liquid. + # + # property - The String name of the property to retrieve. + # + # Returns the String value or nil if the property isn't included. + def [](property) + if self.class::ATTRIBUTES_FOR_LIQUID.include?(property) + send(property) + else + data[property] + end + end + + private + + def _renderer + @_renderer ||= Jekyll::Renderer.new(site, self) + end + + def no_layout? + data["layout"] == "none" + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/deprecator.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/deprecator.rb new file mode 100644 index 0000000..327358c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/deprecator.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module Jekyll + module Deprecator + extend self + + def process(args) + arg_is_present? args, "--server", "The --server command has been replaced by the \ + 'serve' subcommand." + arg_is_present? args, "--serve", "The --serve command has been replaced by the \ + 'serve' subcommand." + arg_is_present? args, "--no-server", "To build Jekyll without launching a server, \ + use the 'build' subcommand." + arg_is_present? args, "--auto", "The switch '--auto' has been replaced with \ + '--watch'." + arg_is_present? args, "--no-auto", "To disable auto-replication, simply leave off \ + the '--watch' switch." + arg_is_present? args, "--pygments", "The 'pygments'settings has been removed in \ + favour of 'highlighter'." + arg_is_present? args, "--paginate", "The 'paginate' setting can only be set in \ + your config files." + arg_is_present? args, "--url", "The 'url' setting can only be set in your \ + config files." + no_subcommand(args) + end + + def no_subcommand(args) + unless args.empty? || + args.first !~ %r(!/^--/!) || %w(--help --version).include?(args.first) + deprecation_message "Jekyll now uses subcommands instead of just switches. \ + Run `jekyll help` to find out more." + abort + end + end + + def arg_is_present?(args, deprecated_argument, message) + if args.include?(deprecated_argument) + deprecation_message(message) + end + end + + def deprecation_message(message) + Jekyll.logger.warn "Deprecation:", message + end + + def defaults_deprecate_type(old, current) + Jekyll.logger.warn "Defaults:", "The '#{old}' type has become '#{current}'." + Jekyll.logger.warn "Defaults:", "Please update your front-matter defaults to use \ + 'type: #{current}'." + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/document.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/document.rb new file mode 100644 index 0000000..1eb8418 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/document.rb @@ -0,0 +1,507 @@ +# frozen_string_literal: true + +module Jekyll + class Document + include Comparable + extend Forwardable + + attr_reader :path, :site, :extname, :collection + attr_accessor :content, :output + + def_delegator :self, :read_post_data, :post_read + + YAML_FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m + DATELESS_FILENAME_MATCHER = %r!^(?:.+/)*(.*)(\.[^.]+)$! + DATE_FILENAME_MATCHER = %r!^(?:.+/)*(\d{2,4}-\d{1,2}-\d{1,2})-(.*)(\.[^.]+)$! + + # Create a new Document. + # + # path - the path to the file + # relations - a hash with keys :site and :collection, the values of which + # are the Jekyll::Site and Jekyll::Collection to which this + # Document belong. + # + # Returns nothing. + def initialize(path, relations = {}) + @site = relations[:site] + @path = path + @extname = File.extname(path) + @collection = relations[:collection] + @has_yaml_header = nil + + if draft? + categories_from_path("_drafts") + else + categories_from_path(collection.relative_directory) + end + + data.default_proc = proc do |_, key| + site.frontmatter_defaults.find(relative_path, collection.label, key) + end + + trigger_hooks(:post_init) + end + + # Fetch the Document's data. + # + # Returns a Hash containing the data. An empty hash is returned if + # no data was read. + def data + @data ||= {} + end + + # Merge some data in with this document's data. + # + # Returns the merged data. + def merge_data!(other, source: "YAML front matter") + merge_categories!(other) + Utils.deep_merge_hashes!(data, other) + merge_date!(source) + data + end + + def date + data["date"] ||= (draft? ? source_file_mtime : site.time) + end + + def source_file_mtime + @source_file_mtime ||= File.mtime(path) + end + + # Returns whether the document is a draft. This is only the case if + # the document is in the 'posts' collection but in a different + # directory than '_posts'. + # + # Returns whether the document is a draft. + def draft? + data["draft"] ||= relative_path.index(collection.relative_directory).nil? && + collection.label == "posts" + end + + # The path to the document, relative to the site source. + # + # Returns a String path which represents the relative path + # from the site source to this document + def relative_path + @relative_path ||= Pathutil.new(path).relative_path_from(site.source).to_s + end + + # The output extension of the document. + # + # Returns the output extension + def output_ext + Jekyll::Renderer.new(site, self).output_ext + end + + # The base filename of the document, without the file extname. + # + # Returns the basename without the file extname. + def basename_without_ext + @basename_without_ext ||= File.basename(path, ".*") + end + + # The base filename of the document. + # + # Returns the base filename of the document. + def basename + @basename ||= File.basename(path) + end + + # Produces a "cleaned" relative path. + # The "cleaned" relative path is the relative path without the extname + # and with the collection's directory removed as well. + # This method is useful when building the URL of the document. + # + # Examples: + # When relative_path is "_methods/site/generate.md": + # cleaned_relative_path + # # => "/site/generate" + # + # Returns the cleaned relative path of the document. + def cleaned_relative_path + @cleaned_relative_path ||= + relative_path[0..-extname.length - 1].sub(collection.relative_directory, "") + end + + # Determine whether the document is a YAML file. + # + # Returns true if the extname is either .yml or .yaml, false otherwise. + def yaml_file? + %w(.yaml .yml).include?(extname) + end + + # Determine whether the document is an asset file. + # Asset files include CoffeeScript files and Sass/SCSS files. + # + # Returns true if the extname belongs to the set of extensions + # that asset files use. + def asset_file? + sass_file? || coffeescript_file? + end + + # Determine whether the document is a Sass file. + # + # Returns true if extname == .sass or .scss, false otherwise. + def sass_file? + %w(.sass .scss).include?(extname) + end + + # Determine whether the document is a CoffeeScript file. + # + # Returns true if extname == .coffee, false otherwise. + def coffeescript_file? + extname == ".coffee" + end + + # Determine whether the file should be rendered with Liquid. + # + # Returns false if the document is either an asset file or a yaml file, + # true otherwise. + def render_with_liquid? + !(coffeescript_file? || yaml_file?) + end + + # Determine whether the file should be rendered with a layout. + # + # Returns true if the Front Matter specifies that `layout` is set to `none`. + def no_layout? + data["layout"] == "none" + end + + # Determine whether the file should be placed into layouts. + # + # Returns false if the document is set to `layouts: none`, or is either an + # asset file or a yaml file. Returns true otherwise. + def place_in_layout? + !(asset_file? || yaml_file? || no_layout?) + end + + # The URL template where the document would be accessible. + # + # Returns the URL template for the document. + def url_template + collection.url_template + end + + # Construct a Hash of key-value pairs which contain a mapping between + # a key in the URL template and the corresponding value for this document. + # + # Returns the Hash of key-value pairs for replacement in the URL. + def url_placeholders + @url_placeholders ||= Drops::UrlDrop.new(self) + end + + # The permalink for this Document. + # Permalink is set via the data Hash. + # + # Returns the permalink or nil if no permalink was set in the data. + def permalink + data && data.is_a?(Hash) && data["permalink"] + end + + # The computed URL for the document. See `Jekyll::URL#to_s` for more details. + # + # Returns the computed URL for the document. + def url + @url ||= URL.new({ + :template => url_template, + :placeholders => url_placeholders, + :permalink => permalink, + }).to_s + end + + def [](key) + data[key] + end + + # The full path to the output file. + # + # base_directory - the base path of the output directory + # + # Returns the full path to the output file of this document. + def destination(base_directory) + dest = site.in_dest_dir(base_directory) + path = site.in_dest_dir(dest, URL.unescape_path(url)) + if url.end_with? "/" + path = File.join(path, "index.html") + else + path << output_ext unless path.end_with? output_ext + end + path + end + + # Write the generated Document file to the destination directory. + # + # dest - The String path to the destination dir. + # + # Returns nothing. + def write(dest) + path = destination(dest) + FileUtils.mkdir_p(File.dirname(path)) + File.write(path, output, :mode => "wb") + + trigger_hooks(:post_write) + end + + # Whether the file is published or not, as indicated in YAML front-matter + # + # Returns 'false' if the 'published' key is specified in the + # YAML front-matter and is 'false'. Otherwise returns 'true'. + def published? + !(data.key?("published") && data["published"] == false) + end + + # Read in the file and assign the content and data based on the file contents. + # Merge the frontmatter of the file with the frontmatter default + # values + # + # Returns nothing. + def read(opts = {}) + Jekyll.logger.debug "Reading:", relative_path + + if yaml_file? + @data = SafeYAML.load_file(path) + else + begin + merge_defaults + read_content(opts) + read_post_data + rescue StandardError => e + handle_read_error(e) + end + end + end + + # Create a Liquid-understandable version of this Document. + # + # Returns a Hash representing this Document's data. + def to_liquid + @to_liquid ||= Drops::DocumentDrop.new(self) + end + + # The inspect string for this document. + # Includes the relative path and the collection label. + # + # Returns the inspect string for this document. + def inspect + "#" + end + + # The string representation for this document. + # + # Returns the content of the document + def to_s + output || content || "NO CONTENT" + end + + # Compare this document against another document. + # Comparison is a comparison between the 2 paths of the documents. + # + # Returns -1, 0, +1 or nil depending on whether this doc's path is less than, + # equal or greater than the other doc's path. See String#<=> for more details. + def <=>(other) + return nil unless other.respond_to?(:data) + cmp = data["date"] <=> other.data["date"] + cmp = path <=> other.path if cmp.nil? || cmp.zero? + cmp + end + + # Determine whether this document should be written. + # Based on the Collection to which it belongs. + # + # True if the document has a collection and if that collection's #write? + # method returns true, otherwise false. + def write? + collection && collection.write? + end + + # The Document excerpt_separator, from the YAML Front-Matter or site + # default excerpt_separator value + # + # Returns the document excerpt_separator + def excerpt_separator + (data["excerpt_separator"] || site.config["excerpt_separator"]).to_s + end + + # Whether to generate an excerpt + # + # Returns true if the excerpt separator is configured. + def generate_excerpt? + !excerpt_separator.empty? + end + + def next_doc + pos = collection.docs.index { |post| post.equal?(self) } + if pos && pos < collection.docs.length - 1 + collection.docs[pos + 1] + end + end + + def previous_doc + pos = collection.docs.index { |post| post.equal?(self) } + if pos && pos > 0 + collection.docs[pos - 1] + end + end + + def trigger_hooks(hook_name, *args) + Jekyll::Hooks.trigger collection.label.to_sym, hook_name, self, *args if collection + Jekyll::Hooks.trigger :documents, hook_name, self, *args + end + + def id + @id ||= File.join(File.dirname(url), (data["slug"] || basename_without_ext).to_s) + end + + # Calculate related posts. + # + # Returns an Array of related Posts. + def related_posts + Jekyll::RelatedPosts.new(self).build + end + + # Override of normal respond_to? to match method_missing's logic for + # looking in @data. + def respond_to?(method, include_private = false) + data.key?(method.to_s) || super + end + + # Override of method_missing to check in @data for the key. + def method_missing(method, *args, &blck) + if data.key?(method.to_s) + Jekyll::Deprecator.deprecation_message "Document##{method} is now a key "\ + "in the #data hash." + Jekyll::Deprecator.deprecation_message "Called by #{caller(0..0)}." + data[method.to_s] + else + super + end + end + + def respond_to_missing?(method, *) + data.key?(method.to_s) || super + end + + # Add superdirectories of the special_dir to categories. + # In the case of es/_posts, 'es' is added as a category. + # In the case of _posts/es, 'es' is NOT added as a category. + # + # Returns nothing. + def categories_from_path(special_dir) + superdirs = relative_path.sub(%r!#{special_dir}(.*)!, "") + .split(File::SEPARATOR) + .reject do |c| + c.empty? || c == special_dir || c == basename + end + merge_data!({ "categories" => superdirs }, :source => "file path") + end + + def populate_categories + merge_data!({ + "categories" => ( + Array(data["categories"]) + Utils.pluralized_array_from_hash( + data, + "category", + "categories" + ) + ).map(&:to_s).flatten.uniq, + }) + end + + def populate_tags + merge_data!({ + "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten, + }) + end + + private + def merge_categories!(other) + if other.key?("categories") && !other["categories"].nil? + if other["categories"].is_a?(String) + other["categories"] = other["categories"].split(%r!\s+!).map(&:strip) + end + other["categories"] = (data["categories"] || []) | other["categories"] + end + end + + private + def merge_date!(source) + if data.key?("date") && !data["date"].is_a?(Time) + data["date"] = Utils.parse_date( + data["date"].to_s, + "Document '#{relative_path}' does not have a valid date in the #{source}." + ) + end + end + + private + def merge_defaults + defaults = @site.frontmatter_defaults.all( + relative_path, + collection.label.to_sym + ) + merge_data!(defaults, :source => "front matter defaults") unless defaults.empty? + end + + private + def read_content(opts) + self.content = File.read(path, Utils.merged_file_read_opts(site, opts)) + if content =~ YAML_FRONT_MATTER_REGEXP + self.content = $POSTMATCH + data_file = SafeYAML.load(Regexp.last_match(1)) + merge_data!(data_file, :source => "YAML front matter") if data_file + end + end + + private + def read_post_data + populate_title + populate_categories + populate_tags + generate_excerpt + end + + private + def handle_read_error(error) + if error.is_a? Psych::SyntaxError + Jekyll.logger.error "Error:", "YAML Exception reading #{path}: #{error.message}" + else + Jekyll.logger.error "Error:", "could not read file #{path}: #{error.message}" + end + + if site.config["strict_front_matter"] || error.is_a?(Jekyll::Errors::FatalException) + raise error + end + end + + private + def populate_title + if relative_path =~ DATE_FILENAME_MATCHER + date, slug, ext = Regexp.last_match.captures + modify_date(date) + elsif relative_path =~ DATELESS_FILENAME_MATCHER + slug, ext = Regexp.last_match.captures + end + + # Try to ensure the user gets a title. + data["title"] ||= Utils.titleize_slug(slug) + # Only overwrite slug & ext if they aren't specified. + data["slug"] ||= slug + data["ext"] ||= ext + end + + private + def modify_date(date) + if !data["date"] || data["date"].to_i == site.time.to_i + merge_data!({ "date" => date }, :source => "filename") + end + end + + private + def generate_excerpt + if generate_excerpt? + data["excerpt"] ||= Jekyll::Excerpt.new(self) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/collection_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/collection_drop.rb new file mode 100644 index 0000000..e1d7da9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/collection_drop.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class CollectionDrop < Drop + extend Forwardable + + mutable false + + def_delegator :@obj, :write?, :output + def_delegators :@obj, :label, :docs, :files, :directory, + :relative_directory + + def to_s + docs.to_s + end + + private + def_delegator :@obj, :metadata, :fallback_data + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/document_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/document_drop.rb new file mode 100644 index 0000000..7279978 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/document_drop.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class DocumentDrop < Drop + extend Forwardable + + NESTED_OBJECT_FIELD_BLACKLIST = %w( + content output excerpt next previous + ).freeze + + mutable false + + def_delegator :@obj, :relative_path, :path + def_delegators :@obj, :id, :output, :content, :to_s, :relative_path, :url + + def collection + @obj.collection.label + end + + def excerpt + fallback_data["excerpt"].to_s + end + + def <=>(other) + return nil unless other.is_a? DocumentDrop + cmp = self["date"] <=> other["date"] + cmp = self["path"] <=> other["path"] if cmp.nil? || cmp.zero? + cmp + end + + def previous + @obj.previous_doc.to_liquid + end + + def next + @obj.next_doc.to_liquid + end + + # Generate a Hash for use in generating JSON. + # This is useful if fields need to be cleared before the JSON can generate. + # + # state - the JSON::State object which determines the state of current processing. + # + # Returns a Hash ready for JSON generation. + def hash_for_json(state = nil) + to_h.tap do |hash| + if state && state.depth >= 2 + hash["previous"] = collapse_document(hash["previous"]) if hash["previous"] + hash["next"] = collapse_document(hash["next"]) if hash["next"] + end + end + end + + # Generate a Hash which breaks the recursive chain. + # Certain fields which are normally available are omitted. + # + # Returns a Hash with only non-recursive fields present. + def collapse_document(doc) + doc.keys.each_with_object({}) do |(key, _), result| + result[key] = doc[key] unless NESTED_OBJECT_FIELD_BLACKLIST.include?(key) + end + end + + private + def_delegator :@obj, :data, :fallback_data + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/drop.rb new file mode 100644 index 0000000..92978af --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/drop.rb @@ -0,0 +1,214 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class Drop < Liquid::Drop + include Enumerable + + NON_CONTENT_METHODS = [:fallback_data, :collapse_document].freeze + + # Get or set whether the drop class is mutable. + # Mutability determines whether or not pre-defined fields may be + # overwritten. + # + # is_mutable - Boolean set mutability of the class (default: nil) + # + # Returns the mutability of the class + def self.mutable(is_mutable = nil) + @is_mutable = if is_mutable + is_mutable + else + false + end + end + + def self.mutable? + @is_mutable + end + + # Create a new Drop + # + # obj - the Jekyll Site, Collection, or Document required by the + # drop. + # + # Returns nothing + def initialize(obj) + @obj = obj + @mutations = {} # only if mutable: true + end + + # Access a method in the Drop or a field in the underlying hash data. + # If mutable, checks the mutations first. Then checks the methods, + # and finally check the underlying hash (e.g. document front matter) + # if all the previous places didn't match. + # + # key - the string key whose value to fetch + # + # Returns the value for the given key, or nil if none exists + def [](key) + if self.class.mutable? && @mutations.key?(key) + @mutations[key] + elsif self.class.invokable? key + public_send key + else + fallback_data[key] + end + end + alias_method :invoke_drop, :[] + + # Set a field in the Drop. If mutable, sets in the mutations and + # returns. If not mutable, checks first if it's trying to override a + # Drop method and raises a DropMutationException if so. If not + # mutable and the key is not a method on the Drop, then it sets the + # key to the value in the underlying hash (e.g. document front + # matter) + # + # key - the String key whose value to set + # val - the Object to set the key's value to + # + # Returns the value the key was set to unless the Drop is not mutable + # and the key matches a method in which case it raises a + # DropMutationException. + def []=(key, val) + if respond_to?("#{key}=") + public_send("#{key}=", val) + elsif respond_to?(key.to_s) + if self.class.mutable? + @mutations[key] = val + else + raise Errors::DropMutationException, "Key #{key} cannot be set in the drop." + end + else + fallback_data[key] = val + end + end + + # Generates a list of strings which correspond to content getter + # methods. + # + # Returns an Array of strings which represent method-specific keys. + def content_methods + @content_methods ||= ( + self.class.instance_methods \ + - Jekyll::Drops::Drop.instance_methods \ + - NON_CONTENT_METHODS + ).map(&:to_s).reject do |method| + method.end_with?("=") + end + end + + # Check if key exists in Drop + # + # key - the string key whose value to fetch + # + # Returns true if the given key is present + def key?(key) + return false if key.nil? + return true if self.class.mutable? && @mutations.key?(key) + respond_to?(key) || fallback_data.key?(key) + end + + # Generates a list of keys with user content as their values. + # This gathers up the Drop methods and keys of the mutations and + # underlying data hashes and performs a set union to ensure a list + # of unique keys for the Drop. + # + # Returns an Array of unique keys for content for the Drop. + def keys + (content_methods | + @mutations.keys | + fallback_data.keys).flatten + end + + # Generate a Hash representation of the Drop by resolving each key's + # value. It includes Drop methods, mutations, and the underlying object's + # data. See the documentation for Drop#keys for more. + # + # Returns a Hash with all the keys and values resolved. + def to_h + keys.each_with_object({}) do |(key, _), result| + result[key] = self[key] + end + end + alias_method :to_hash, :to_h + + # Inspect the drop's keys and values through a JSON representation + # of its keys and values. + # + # Returns a pretty generation of the hash representation of the Drop. + def inspect + require "json" + JSON.pretty_generate to_h + end + + # Generate a Hash for use in generating JSON. + # This is useful if fields need to be cleared before the JSON can generate. + # + # Returns a Hash ready for JSON generation. + def hash_for_json(*) + to_h + end + + # Generate a JSON representation of the Drop. + # + # state - the JSON::State object which determines the state of current processing. + # + # Returns a JSON representation of the Drop in a String. + def to_json(state = nil) + require "json" + JSON.generate(hash_for_json(state), state) + end + + # Collects all the keys and passes each to the block in turn. + # + # block - a block which accepts one argument, the key + # + # Returns nothing. + def each_key(&block) + keys.each(&block) + end + + def each + each_key.each do |key| + yield key, self[key] + end + end + + def merge(other, &block) + self.dup.tap do |me| + if block.nil? + me.merge!(other) + else + me.merge!(other, block) + end + end + end + + def merge!(other) + other.each_key do |key| + if block_given? + self[key] = yield key, self[key], other[key] + else + if Utils.mergable?(self[key]) && Utils.mergable?(other[key]) + self[key] = Utils.deep_merge_hashes(self[key], other[key]) + next + end + + self[key] = other[key] unless other[key].nil? + end + end + end + + # Imitate Hash.fetch method in Drop + # + # Returns value if key is present in Drop, otherwise returns default value + # KeyError is raised if key is not present and no default value given + def fetch(key, default = nil, &block) + return self[key] if key?(key) + raise KeyError, %(key not found: "#{key}") if default.nil? && block.nil? + return yield(key) unless block.nil? + return default unless default.nil? + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/excerpt_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/excerpt_drop.rb new file mode 100644 index 0000000..0362d93 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/excerpt_drop.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class ExcerptDrop < DocumentDrop + def layout + @obj.doc.data["layout"] + end + + def excerpt + nil + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/jekyll_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/jekyll_drop.rb new file mode 100644 index 0000000..8a56b9e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/jekyll_drop.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class JekyllDrop < Liquid::Drop + class << self + def global + @global ||= JekyllDrop.new + end + end + + def version + Jekyll::VERSION + end + + def environment + Jekyll.env + end + + def to_h + @to_h ||= { + "version" => version, + "environment" => environment, + } + end + + def to_json(state = nil) + require "json" + JSON.generate(to_h, state) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/site_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/site_drop.rb new file mode 100644 index 0000000..632f81c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/site_drop.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class SiteDrop < Drop + extend Forwardable + + mutable false + + def_delegator :@obj, :site_data, :data + def_delegators :@obj, :time, :pages, :static_files, :documents, + :tags, :categories + + def [](key) + if @obj.collections.key?(key) && key != "posts" + @obj.collections[key].docs + else + super(key) + end + end + + def key?(key) + (@obj.collections.key?(key) && key != "posts") || super + end + + def posts + @site_posts ||= @obj.posts.docs.sort { |a, b| b <=> a } + end + + def html_pages + @site_html_pages ||= @obj.pages.select do |page| + page.html? || page.url.end_with?("/") + end + end + + def collections + @site_collections ||= @obj.collections.values.sort_by(&:label).map(&:to_liquid) + end + + # return nil for `{{ site.config }}` even if --config was passed via CLI + def config; end + + private + def_delegator :@obj, :config, :fallback_data + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/static_file_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/static_file_drop.rb new file mode 100644 index 0000000..f855cf3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/static_file_drop.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class StaticFileDrop < Drop + extend Forwardable + def_delegators :@obj, :name, :extname, :modified_time, :basename + def_delegator :@obj, :relative_path, :path + def_delegator :@obj, :data, :fallback_data + def_delegator :@obj, :type, :collection + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/unified_payload_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/unified_payload_drop.rb new file mode 100644 index 0000000..52647f9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/unified_payload_drop.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class UnifiedPayloadDrop < Drop + mutable true + + attr_accessor :page, :layout, :content, :paginator + attr_accessor :highlighter_prefix, :highlighter_suffix + + def jekyll + JekyllDrop.global + end + + def site + @site_drop ||= SiteDrop.new(@obj) + end + + private + def fallback_data + @fallback_data ||= {} + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/url_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/url_drop.rb new file mode 100644 index 0000000..0571558 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/drops/url_drop.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class UrlDrop < Drop + extend Forwardable + + mutable false + + def_delegator :@obj, :cleaned_relative_path, :path + def_delegator :@obj, :output_ext, :output_ext + + def collection + @obj.collection.label + end + + def name + Utils.slugify(@obj.basename_without_ext) + end + + def title + Utils.slugify(@obj.data["slug"], :mode => "pretty", :cased => true) || + Utils.slugify(@obj.basename_without_ext, :mode => "pretty", :cased => true) + end + + def slug + Utils.slugify(@obj.data["slug"]) || Utils.slugify(@obj.basename_without_ext) + end + + def categories + category_set = Set.new + Array(@obj.data["categories"]).each do |category| + category_set << category.to_s.downcase + end + category_set.to_a.join("/") + end + + def year + @obj.date.strftime("%Y") + end + + def month + @obj.date.strftime("%m") + end + + def day + @obj.date.strftime("%d") + end + + def hour + @obj.date.strftime("%H") + end + + def minute + @obj.date.strftime("%M") + end + + def second + @obj.date.strftime("%S") + end + + def i_day + @obj.date.strftime("%-d") + end + + def i_month + @obj.date.strftime("%-m") + end + + def short_month + @obj.date.strftime("%b") + end + + def short_year + @obj.date.strftime("%y") + end + + def y_day + @obj.date.strftime("%j") + end + + private + def fallback_data + {} + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/entry_filter.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/entry_filter.rb new file mode 100644 index 0000000..0191331 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/entry_filter.rb @@ -0,0 +1,123 @@ +# frozen_string_literal: true + +module Jekyll + class EntryFilter + attr_reader :site + SPECIAL_LEADING_CHARACTERS = [ + ".", "_", "#", "~", + ].freeze + + def initialize(site, base_directory = nil) + @site = site + @base_directory = derive_base_directory( + @site, base_directory.to_s.dup + ) + end + + def base_directory + @base_directory.to_s + end + + def derive_base_directory(site, base_dir) + base_dir[site.source] = "" if base_dir.start_with?(site.source) + base_dir + end + + def relative_to_source(entry) + File.join( + base_directory, entry + ) + end + + def filter(entries) + entries.reject do |e| + unless included?(e) + special?(e) || backup?(e) || excluded?(e) || symlink?(e) + end + end + end + + def included?(entry) + glob_include?(site.include, entry) || + glob_include?(site.include, File.basename(entry)) + end + + def special?(entry) + SPECIAL_LEADING_CHARACTERS.include?(entry[0..0]) || + SPECIAL_LEADING_CHARACTERS.include?(File.basename(entry)[0..0]) + end + + def backup?(entry) + entry[-1..-1] == "~" + end + + def excluded?(entry) + glob_include?(site.exclude, relative_to_source(entry)).tap do |excluded| + if excluded + Jekyll.logger.debug( + "EntryFilter:", + "excluded #{relative_to_source(entry)}" + ) + end + end + end + + # -- + # Check if a file is a symlink. + # NOTE: This can be converted to allowing even in safe, + # since we use Pathutil#in_path? now. + # -- + def symlink?(entry) + site.safe && File.symlink?(entry) && symlink_outside_site_source?(entry) + end + + # -- + # NOTE: Pathutil#in_path? gets the realpath. + # @param [] entry the entry you want to validate. + # Check if a path is outside of our given root. + # -- + def symlink_outside_site_source?(entry) + !Pathutil.new(entry).in_path?( + site.in_source_dir + ) + end + + # -- + # Check if an entry matches a specific pattern and return true,false. + # Returns true if path matches against any glob pattern. + # -- + def glob_include?(enum, e) + entry = Pathutil.new(site.in_source_dir).join(e) + enum.any? do |exp| + # Users who send a Regexp knows what they want to + # exclude, so let them send a Regexp to exclude files, + # we will not bother caring if it works or not, it's + # on them at this point. + + if exp.is_a?(Regexp) + entry =~ exp + + else + item = Pathutil.new(site.in_source_dir).join(exp) + + # If it's a directory they want to exclude, AKA + # ends with a "/" then we will go on to check and + # see if the entry falls within that path and + # exclude it if that's the case. + + if e.end_with?("/") + entry.in_path?( + item + ) + + else + File.fnmatch?(item, entry) || + entry.to_path.start_with?( + item + ) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/errors.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/errors.rb new file mode 100644 index 0000000..8d659e8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/errors.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module Jekyll + module Errors + FatalException = Class.new(::RuntimeError) + + InvalidThemeName = Class.new(FatalException) + + DropMutationException = Class.new(FatalException) + InvalidPermalinkError = Class.new(FatalException) + InvalidYAMLFrontMatterError = Class.new(FatalException) + MissingDependencyException = Class.new(FatalException) + + InvalidDateError = Class.new(FatalException) + InvalidPostNameError = Class.new(FatalException) + PostURLError = Class.new(FatalException) + InvalidURLError = Class.new(FatalException) + InvalidConfigurationError = Class.new(FatalException) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/excerpt.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/excerpt.rb new file mode 100644 index 0000000..7adfec9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/excerpt.rb @@ -0,0 +1,126 @@ +# frozen_string_literal: true + +module Jekyll + class Excerpt + extend Forwardable + + attr_accessor :doc + attr_accessor :content, :ext + attr_writer :output + + def_delegators :@doc, :site, :name, :ext, :relative_path, :extname, + :render_with_liquid?, :collection, :related_posts, + :url, :next_doc, :previous_doc + + # Initialize this Excerpt instance. + # + # doc - The Document. + # + # Returns the new Excerpt. + def initialize(doc) + self.doc = doc + self.content = extract_excerpt(doc.content) + end + + # Fetch YAML front-matter data from related doc, without layout key + # + # Returns Hash of doc data + def data + @data ||= doc.data.dup + @data.delete("layout") + @data.delete("excerpt") + @data + end + + def trigger_hooks(*); end + + # 'Path' of the excerpt. + # + # Returns the path for the doc this excerpt belongs to with #excerpt appended + def path + File.join(doc.path, "#excerpt") + end + + # Check if excerpt includes a string + # + # Returns true if the string passed in + def include?(something) + (output && output.include?(something)) || content.include?(something) + end + + # The UID for this doc (useful in feeds). + # e.g. /2008/11/05/my-awesome-doc + # + # Returns the String UID. + def id + "#{doc.id}#excerpt" + end + + def to_s + output || content + end + + def to_liquid + Jekyll::Drops::ExcerptDrop.new(self) + end + + # Returns the shorthand String identifier of this doc. + def inspect + "" + end + + def output + @output ||= Renderer.new(doc.site, self, site.site_payload).run + end + + def place_in_layout? + false + end + + protected + + # Internal: Extract excerpt from the content + # + # By default excerpt is your first paragraph of a doc: everything before + # the first two new lines: + # + # --- + # title: Example + # --- + # + # First paragraph with [link][1]. + # + # Second paragraph. + # + # [1]: http://example.com/ + # + # This is fairly good option for Markdown and Textile files. But might cause + # problems for HTML docs (which is quite unusual for Jekyll). If default + # excerpt delimiter is not good for you, you might want to set your own via + # configuration option `excerpt_separator`. For example, following is a good + # alternative for HTML docs: + # + # # file: _config.yml + # excerpt_separator: "" + # + # Notice that all markdown-style link references will be appended to the + # excerpt. So the example doc above will have this excerpt source: + # + # First paragraph with [link][1]. + # + # [1]: http://example.com/ + # + # Excerpts are rendered same time as content is rendered. + # + # Returns excerpt String + def extract_excerpt(doc_content) + head, _, tail = doc_content.to_s.partition(doc.excerpt_separator) + + if tail.empty? + head + else + head.to_s.dup << "\n\n" << tail.scan(%r!^ {0,3}\[[^\]]+\]:.+$!).join("\n") + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/external.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/external.rb new file mode 100644 index 0000000..0a65dfa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/external.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +module Jekyll + module External + class << self + # + # Gems that, if installed, should be loaded. + # Usually contain subcommands. + # + def blessed_gems + %w( + jekyll-docs + jekyll-import + ) + end + + # + # Require a gem or file if it's present, otherwise silently fail. + # + # names - a string gem name or array of gem names + # + def require_if_present(names) + Array(names).each do |name| + begin + require name + rescue LoadError + Jekyll.logger.debug "Couldn't load #{name}. Skipping." + yield(name, version_constraint(name)) if block_given? + false + end + end + end + + # + # The version constraint required to activate a given gem. + # Usually the gem version requirement is "> 0," because any version + # will do. In the case of jekyll-docs, however, we require the exact + # same version as Jekyll. + # + # Returns a String version constraint in a parseable form for + # RubyGems. + def version_constraint(gem_name) + return "= #{Jekyll::VERSION}" if gem_name.to_s.eql?("jekyll-docs") + "> 0" + end + + # + # Require a gem or gems. If it's not present, show a very nice error + # message that explains everything and is much more helpful than the + # normal LoadError. + # + # names - a string gem name or array of gem names + # + def require_with_graceful_fail(names) + Array(names).each do |name| + begin + Jekyll.logger.debug "Requiring:", name.to_s + require name + rescue LoadError => e + Jekyll.logger.error "Dependency Error:", <<-MSG +Yikes! It looks like you don't have #{name} or one of its dependencies installed. +In order to use Jekyll as currently configured, you'll need to install this gem. + +The full error message from Ruby is: '#{e.message}' + +If you run into trouble, you can find helpful resources at https://jekyllrb.com/help/! + MSG + raise Jekyll::Errors::MissingDependencyException, name + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters.rb new file mode 100644 index 0000000..686995e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters.rb @@ -0,0 +1,430 @@ +# frozen_string_literal: true + +require "addressable/uri" +require "json" +require "date" +require "liquid" + +require_all "jekyll/filters" + +module Jekyll + module Filters + include URLFilters + include GroupingFilters + + # Convert a Markdown string into HTML output. + # + # input - The Markdown String to convert. + # + # Returns the HTML formatted String. + def markdownify(input) + site = @context.registers[:site] + converter = site.find_converter_instance(Jekyll::Converters::Markdown) + converter.convert(input.to_s) + end + + # Convert quotes into smart quotes. + # + # input - The String to convert. + # + # Returns the smart-quotified String. + def smartify(input) + site = @context.registers[:site] + converter = site.find_converter_instance(Jekyll::Converters::SmartyPants) + converter.convert(input.to_s) + end + + # Convert a Sass string into CSS output. + # + # input - The Sass String to convert. + # + # Returns the CSS formatted String. + def sassify(input) + site = @context.registers[:site] + converter = site.find_converter_instance(Jekyll::Converters::Sass) + converter.convert(input) + end + + # Convert a Scss string into CSS output. + # + # input - The Scss String to convert. + # + # Returns the CSS formatted String. + def scssify(input) + site = @context.registers[:site] + converter = site.find_converter_instance(Jekyll::Converters::Scss) + converter.convert(input) + end + + # Slugify a filename or title. + # + # input - The filename or title to slugify. + # mode - how string is slugified + # + # Returns the given filename or title as a lowercase URL String. + # See Utils.slugify for more detail. + def slugify(input, mode = nil) + Utils.slugify(input, :mode => mode) + end + + # Format a date in short format e.g. "27 Jan 2011". + # + # date - the Time to format. + # + # Returns the formatting String. + def date_to_string(date) + time(date).strftime("%d %b %Y") + end + + # Format a date in long format e.g. "27 January 2011". + # + # date - The Time to format. + # + # Returns the formatted String. + def date_to_long_string(date) + return date if date.to_s.empty? + time(date).strftime("%d %B %Y") + end + + # Format a date for use in XML. + # + # date - The Time to format. + # + # Examples + # + # date_to_xmlschema(Time.now) + # # => "2011-04-24T20:34:46+08:00" + # + # Returns the formatted String. + def date_to_xmlschema(date) + return date if date.to_s.empty? + time(date).xmlschema + end + + # Format a date according to RFC-822 + # + # date - The Time to format. + # + # Examples + # + # date_to_rfc822(Time.now) + # # => "Sun, 24 Apr 2011 12:34:46 +0000" + # + # Returns the formatted String. + def date_to_rfc822(date) + return date if date.to_s.empty? + time(date).rfc822 + end + + # XML escape a string for use. Replaces any special characters with + # appropriate HTML entity replacements. + # + # input - The String to escape. + # + # Examples + # + # xml_escape('foo "bar" ') + # # => "foo "bar" <baz>" + # + # Returns the escaped String. + def xml_escape(input) + input.to_s.encode(:xml => :attr).gsub(%r!\A"|"\Z!, "") + end + + # CGI escape a string for use in a URL. Replaces any special characters + # with appropriate %XX replacements. + # + # input - The String to escape. + # + # Examples + # + # cgi_escape('foo,bar;baz?') + # # => "foo%2Cbar%3Bbaz%3F" + # + # Returns the escaped String. + def cgi_escape(input) + CGI.escape(input) + end + + # URI escape a string. + # + # input - The String to escape. + # + # Examples + # + # uri_escape('foo, bar \\baz?') + # # => "foo,%20bar%20%5Cbaz?" + # + # Returns the escaped String. + def uri_escape(input) + Addressable::URI.normalize_component(input) + end + + # Replace any whitespace in the input string with a single space + # + # input - The String on which to operate. + # + # Returns the formatted String + def normalize_whitespace(input) + input.to_s.gsub(%r!\s+!, " ").strip + end + + # Count the number of words in the input string. + # + # input - The String on which to operate. + # + # Returns the Integer word count. + def number_of_words(input) + input.split.length + end + + # Join an array of things into a string by separating with commas and the + # word "and" for the last one. + # + # array - The Array of Strings to join. + # connector - Word used to connect the last 2 items in the array + # + # Examples + # + # array_to_sentence_string(["apples", "oranges", "grapes"]) + # # => "apples, oranges, and grapes" + # + # Returns the formatted String. + def array_to_sentence_string(array, connector = "and") + case array.length + when 0 + "" + when 1 + array[0].to_s + when 2 + "#{array[0]} #{connector} #{array[1]}" + else + "#{array[0...-1].join(", ")}, #{connector} #{array[-1]}" + end + end + + # Convert the input into json string + # + # input - The Array or Hash to be converted + # + # Returns the converted json string + def jsonify(input) + as_liquid(input).to_json + end + + # Filter an array of objects + # + # input - the object array + # property - property within each object to filter by + # value - desired value + # + # Returns the filtered array of objects + def where(input, property, value) + return input unless input.respond_to?(:select) + input = input.values if input.is_a?(Hash) + input.select do |object| + Array(item_property(object, property)).map(&:to_s).include?(value.to_s) + end || [] + end + + # Filters an array of objects against an expression + # + # input - the object array + # variable - the variable to assign each item to in the expression + # expression - a Liquid comparison expression passed in as a string + # + # Returns the filtered array of objects + def where_exp(input, variable, expression) + return input unless input.respond_to?(:select) + input = input.values if input.is_a?(Hash) # FIXME + + condition = parse_condition(expression) + @context.stack do + input.select do |object| + @context[variable] = object + condition.evaluate(@context) + end + end || [] + end + + # Convert the input into integer + # + # input - the object string + # + # Returns the integer value + def to_integer(input) + return 1 if input == true + return 0 if input == false + input.to_i + end + + # Sort an array of objects + # + # input - the object array + # property - property within each object to filter by + # nils ('first' | 'last') - nils appear before or after non-nil values + # + # Returns the filtered array of objects + def sort(input, property = nil, nils = "first") + if input.nil? + raise ArgumentError, "Cannot sort a null object." + end + if property.nil? + input.sort + else + if nils == "first" + order = - 1 + elsif nils == "last" + order = + 1 + else + raise ArgumentError, "Invalid nils order: " \ + "'#{nils}' is not a valid nils order. It must be 'first' or 'last'." + end + + sort_input(input, property, order) + end + end + + def pop(array, num = 1) + return array unless array.is_a?(Array) + num = Liquid::Utils.to_integer(num) + new_ary = array.dup + new_ary.pop(num) + new_ary + end + + def push(array, input) + return array unless array.is_a?(Array) + new_ary = array.dup + new_ary.push(input) + new_ary + end + + def shift(array, num = 1) + return array unless array.is_a?(Array) + num = Liquid::Utils.to_integer(num) + new_ary = array.dup + new_ary.shift(num) + new_ary + end + + def unshift(array, input) + return array unless array.is_a?(Array) + new_ary = array.dup + new_ary.unshift(input) + new_ary + end + + def sample(input, num = 1) + return input unless input.respond_to?(:sample) + num = Liquid::Utils.to_integer(num) rescue 1 + if num == 1 + input.sample + else + input.sample(num) + end + end + + # Convert an object into its String representation for debugging + # + # input - The Object to be converted + # + # Returns a String representation of the object. + def inspect(input) + xml_escape(input.inspect) + end + + private + + # Sort the input Enumerable by the given property. + # If the property doesn't exist, return the sort order respective of + # which item doesn't have the property. + # We also utilize the Schwartzian transform to make this more efficient. + def sort_input(input, property, order) + input.map { |item| [item_property(item, property), item] } + .sort! do |apple_info, orange_info| + apple_property = apple_info.first + orange_property = orange_info.first + + if !apple_property.nil? && orange_property.nil? + - order + elsif apple_property.nil? && !orange_property.nil? + + order + else + apple_property <=> orange_property + end + end + .map!(&:last) + end + + private + def time(input) + date = Liquid::Utils.to_date(input) + unless date.respond_to?(:to_time) + raise Errors::InvalidDateError, + "Invalid Date: '#{input.inspect}' is not a valid datetime." + end + date.to_time.dup.localtime + end + + private + def item_property(item, property) + if item.respond_to?(:to_liquid) + property.to_s.split(".").reduce(item.to_liquid) do |subvalue, attribute| + subvalue[attribute] + end + elsif item.respond_to?(:data) + item.data[property.to_s] + else + item[property.to_s] + end + end + + private + def as_liquid(item) + case item + when Hash + pairs = item.map { |k, v| as_liquid([k, v]) } + Hash[pairs] + when Array + item.map { |i| as_liquid(i) } + else + if item.respond_to?(:to_liquid) + liquidated = item.to_liquid + # prevent infinite recursion for simple types (which return `self`) + if liquidated == item + item + else + as_liquid(liquidated) + end + else + item + end + end + end + + # Parse a string to a Liquid Condition + private + def parse_condition(exp) + parser = Liquid::Parser.new(exp) + left_expr = parser.expression + operator = parser.consume?(:comparison) + condition = + if operator + Liquid::Condition.new(Liquid::Expression.parse(left_expr), + operator, + Liquid::Expression.parse(parser.expression)) + else + Liquid::Condition.new(Liquid::Expression.parse(left_expr)) + end + parser.consume(:end_of_string) + + condition + end + + end +end + +Liquid::Template.register_filter( + Jekyll::Filters +) diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters/grouping_filters.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters/grouping_filters.rb new file mode 100644 index 0000000..4086bbe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters/grouping_filters.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module Jekyll + module Filters + module GroupingFilters + # Group an array of items by a property + # + # input - the inputted Enumerable + # property - the property + # + # Returns an array of Hashes, each looking something like this: + # {"name" => "larry" + # "items" => [...] } # all the items where `property` == "larry" + def group_by(input, property) + if groupable?(input) + groups = input.group_by { |item| item_property(item, property).to_s } + grouped_array(groups) + else + input + end + end + + # Group an array of items by an expression + # + # input - the object array + # variable - the variable to assign each item to in the expression + # expression -a Liquid comparison expression passed in as a string + # + # Returns the filtered array of objects + def group_by_exp(input, variable, expression) + return input unless groupable?(input) + + parsed_expr = parse_expression(expression) + @context.stack do + groups = input.group_by do |item| + @context[variable] = item + parsed_expr.render(@context) + end + grouped_array(groups) + end + end + + private + def parse_expression(str) + Liquid::Variable.new(str, Liquid::ParseContext.new) + end + + private + def groupable?(element) + element.respond_to?(:group_by) + end + + private + def grouped_array(groups) + groups.each_with_object([]) do |item, array| + array << { + "name" => item.first, + "items" => item.last, + "size" => item.last.size, + } + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters/url_filters.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters/url_filters.rb new file mode 100644 index 0000000..74844be --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/filters/url_filters.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +require "addressable/uri" + +module Jekyll + module Filters + module URLFilters + # Produces an absolute URL based on site.url and site.baseurl. + # + # input - the URL to make absolute. + # + # Returns the absolute URL as a String. + def absolute_url(input) + return if input.nil? + input = input.url if input.respond_to?(:url) + return input if Addressable::URI.parse(input.to_s).absolute? + site = @context.registers[:site] + return relative_url(input) if site.config["url"].nil? + Addressable::URI.parse( + site.config["url"].to_s + relative_url(input) + ).normalize.to_s + end + + # Produces a URL relative to the domain root based on site.baseurl + # unless it is already an absolute url with an authority (host). + # + # input - the URL to make relative to the domain root + # + # Returns a URL relative to the domain root as a String. + def relative_url(input) + return if input.nil? + input = input.url if input.respond_to?(:url) + return input if Addressable::URI.parse(input.to_s).absolute? + + parts = [sanitized_baseurl, input] + Addressable::URI.parse( + parts.compact.map { |part| ensure_leading_slash(part.to_s) }.join + ).normalize.to_s + end + + # Strips trailing `/index.html` from URLs to create pretty permalinks + # + # input - the URL with a possible `/index.html` + # + # Returns a URL with the trailing `/index.html` removed + def strip_index(input) + return if input.nil? || input.to_s.empty? + input.sub(%r!/index\.html?$!, "/") + end + + private + + def sanitized_baseurl + site = @context.registers[:site] + site.config["baseurl"].to_s.chomp("/") + end + + def ensure_leading_slash(input) + return input if input.nil? || input.empty? || input.start_with?("/") + "/#{input}" + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/frontmatter_defaults.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/frontmatter_defaults.rb new file mode 100644 index 0000000..f6b89f6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/frontmatter_defaults.rb @@ -0,0 +1,212 @@ +# frozen_string_literal: true + +module Jekyll + # This class handles custom defaults for YAML frontmatter settings. + # These are set in _config.yml and apply both to internal use (e.g. layout) + # and the data available to liquid. + # + # It is exposed via the frontmatter_defaults method on the site class. + class FrontmatterDefaults + # Initializes a new instance. + def initialize(site) + @site = site + end + + def update_deprecated_types(set) + return set unless set.key?("scope") && set["scope"].key?("type") + + set["scope"]["type"] = + case set["scope"]["type"] + when "page" + Deprecator.defaults_deprecate_type("page", "pages") + "pages" + when "post" + Deprecator.defaults_deprecate_type("post", "posts") + "posts" + when "draft" + Deprecator.defaults_deprecate_type("draft", "drafts") + "drafts" + else + set["scope"]["type"] + end + + set + end + + def ensure_time!(set) + return set unless set.key?("values") && set["values"].key?("date") + return set if set["values"]["date"].is_a?(Time) + set["values"]["date"] = Utils.parse_date( + set["values"]["date"], + "An invalid date format was found in a front-matter default set: #{set}" + ) + set + end + + # Finds a default value for a given setting, filtered by path and type + # + # path - the path (relative to the source) of the page, + # post or :draft the default is used in + # type - a symbol indicating whether a :page, + # a :post or a :draft calls this method + # + # Returns the default value or nil if none was found + def find(path, type, setting) + value = nil + old_scope = nil + + matching_sets(path, type).each do |set| + if set["values"].key?(setting) && has_precedence?(old_scope, set["scope"]) + value = set["values"][setting] + old_scope = set["scope"] + end + end + value + end + + # Collects a hash with all default values for a page or post + # + # path - the relative path of the page or post + # type - a symbol indicating the type (:post, :page or :draft) + # + # Returns a hash with all default values (an empty hash if there are none) + def all(path, type) + defaults = {} + old_scope = nil + matching_sets(path, type).each do |set| + if has_precedence?(old_scope, set["scope"]) + defaults = Utils.deep_merge_hashes(defaults, set["values"]) + old_scope = set["scope"] + else + defaults = Utils.deep_merge_hashes(set["values"], defaults) + end + end + defaults + end + + private + + # Checks if a given default setting scope matches the given path and type + # + # scope - the hash indicating the scope, as defined in _config.yml + # path - the path to check for + # type - the type (:post, :page or :draft) to check for + # + # Returns true if the scope applies to the given path and type + def applies?(scope, path, type) + applies_path?(scope, path) && applies_type?(scope, type) + end + + def applies_path?(scope, path) + return true if !scope.key?("path") || scope["path"].empty? + + sanitized_path = Pathname.new(sanitize_path(path)) + + site_path = Pathname.new(@site.source) + rel_scope_path = Pathname.new(scope["path"]) + abs_scope_path = File.join(@site.source, rel_scope_path) + Dir.glob(abs_scope_path).each do |scope_path| + scope_path = Pathname.new(scope_path).relative_path_from site_path + return true if path_is_subpath?(sanitized_path, scope_path) + end + + path_is_subpath?(sanitized_path, rel_scope_path) + end + + def path_is_subpath?(path, parent_path) + path.ascend do |ascended_path| + if ascended_path.to_s == parent_path.to_s + return true + end + end + + false + end + + # Determines whether the scope applies to type. + # The scope applies to the type if: + # 1. no 'type' is specified + # 2. the 'type' in the scope is the same as the type asked about + # + # scope - the Hash defaults set being asked about application + # type - the type of the document being processed / asked about + # its defaults. + # + # Returns true if either of the above conditions are satisfied, + # otherwise returns false + def applies_type?(scope, type) + !scope.key?("type") || scope["type"].eql?(type.to_s) + end + + # Checks if a given set of default values is valid + # + # set - the default value hash, as defined in _config.yml + # + # Returns true if the set is valid and can be used in this class + def valid?(set) + set.is_a?(Hash) && set["values"].is_a?(Hash) + end + + # Determines if a new scope has precedence over an old one + # + # old_scope - the old scope hash, or nil if there's none + # new_scope - the new scope hash + # + # Returns true if the new scope has precedence over the older + # rubocop: disable PredicateName + def has_precedence?(old_scope, new_scope) + return true if old_scope.nil? + + new_path = sanitize_path(new_scope["path"]) + old_path = sanitize_path(old_scope["path"]) + + if new_path.length != old_path.length + new_path.length >= old_path.length + elsif new_scope.key?("type") + true + else + !old_scope.key? "type" + end + end + # rubocop: enable PredicateName + + # Collects a list of sets that match the given path and type + # + # Returns an array of hashes + def matching_sets(path, type) + valid_sets.select do |set| + !set.key?("scope") || applies?(set["scope"], path, type) + end + end + + # Returns a list of valid sets + # + # This is not cached to allow plugins to modify the configuration + # and have their changes take effect + # + # Returns an array of hashes + def valid_sets + sets = @site.config["defaults"] + return [] unless sets.is_a?(Array) + + sets.map do |set| + if valid?(set) + ensure_time!(update_deprecated_types(set)) + else + Jekyll.logger.warn "Defaults:", "An invalid front-matter default set was found:" + Jekyll.logger.warn set.to_s + nil + end + end.compact + end + + # Sanitizes the given path by removing a leading and adding a trailing slash + def sanitize_path(path) + if path.nil? || path.empty? + "" + else + path.gsub(%r!\A/|(?<=[^/])\z!, "".freeze) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/generator.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/generator.rb new file mode 100644 index 0000000..649715f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/generator.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Jekyll + Generator = Class.new(Plugin) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/hooks.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/hooks.rb new file mode 100644 index 0000000..64496b5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/hooks.rb @@ -0,0 +1,107 @@ +# frozen_string_literal: true + +module Jekyll + module Hooks + DEFAULT_PRIORITY = 20 + + # compatibility layer for octopress-hooks users + PRIORITY_MAP = { + :low => 10, + :normal => 20, + :high => 30, + }.freeze + + # initial empty hooks + @registry = { + :site => { + :after_init => [], + :after_reset => [], + :post_read => [], + :pre_render => [], + :post_render => [], + :post_write => [], + }, + :pages => { + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], + }, + :posts => { + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], + }, + :documents => { + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], + }, + :clean => { + :on_obsolete => [], + }, + } + + # map of all hooks and their priorities + @hook_priority = {} + + NotAvailable = Class.new(RuntimeError) + Uncallable = Class.new(RuntimeError) + + # register hook(s) to be called later, public API + def self.register(owners, event, priority: DEFAULT_PRIORITY, &block) + Array(owners).each do |owner| + register_one(owner, event, priority_value(priority), &block) + end + end + + # Ensure the priority is a Fixnum + def self.priority_value(priority) + return priority if priority.is_a?(Integer) + PRIORITY_MAP[priority] || DEFAULT_PRIORITY + end + + # register a single hook to be called later, internal API + def self.register_one(owner, event, priority, &block) + @registry[owner] ||= { + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], + } + + unless @registry[owner][event] + raise NotAvailable, "Invalid hook. #{owner} supports only the " \ + "following hooks #{@registry[owner].keys.inspect}" + end + + unless block.respond_to? :call + raise Uncallable, "Hooks must respond to :call" + end + + insert_hook owner, event, priority, &block + end + + def self.insert_hook(owner, event, priority, &block) + @hook_priority[block] = [-priority, @hook_priority.size] + @registry[owner][event] << block + end + + # interface for Jekyll core components to trigger hooks + def self.trigger(owner, event, *args) + # proceed only if there are hooks to call + return unless @registry[owner] + return unless @registry[owner][event] + + # hooks to call for this owner and event + hooks = @registry[owner][event] + + # sort and call hooks according to priority and load order + hooks.sort_by { |h| @hook_priority[h] }.each do |hook| + hook.call(*args) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/layout.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/layout.rb new file mode 100644 index 0000000..f62fec0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/layout.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +module Jekyll + class Layout + include Convertible + + # Gets the Site object. + attr_reader :site + + # Gets the name of this layout. + attr_reader :name + + # Gets the path to this layout. + attr_reader :path + + # Gets the path to this layout relative to its base + attr_reader :relative_path + + # Gets/Sets the extension of this layout. + attr_accessor :ext + + # Gets/Sets the Hash that holds the metadata for this layout. + attr_accessor :data + + # Gets/Sets the content of this layout. + attr_accessor :content + + # Initialize a new Layout. + # + # site - The Site. + # base - The String path to the source. + # name - The String filename of the post file. + def initialize(site, base, name) + @site = site + @base = base + @name = name + + if site.theme && site.theme.layouts_path.eql?(base) + @base_dir = site.theme.root + @path = site.in_theme_dir(base, name) + else + @base_dir = site.source + @path = site.in_source_dir(base, name) + end + @relative_path = @path.sub(@base_dir, "") + + self.data = {} + + process(name) + read_yaml(base, name) + end + + # Extract information from the layout filename. + # + # name - The String filename of the layout file. + # + # Returns nothing. + def process(name) + self.ext = File.extname(name) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_extensions.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_extensions.rb new file mode 100644 index 0000000..4551ac1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_extensions.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module Jekyll + module LiquidExtensions + + # Lookup a Liquid variable in the given context. + # + # context - the Liquid context in question. + # variable - the variable name, as a string. + # + # Returns the value of the variable in the context + # or the variable name if not found. + def lookup_variable(context, variable) + lookup = context + + variable.split(".").each do |value| + lookup = lookup[value] + end + + lookup || variable + end + + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer.rb new file mode 100644 index 0000000..3c73172 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require_relative "liquid_renderer/file" +require_relative "liquid_renderer/table" + +module Jekyll + class LiquidRenderer + def initialize(site) + @site = site + Liquid::Template.error_mode = @site.config["liquid"]["error_mode"].to_sym + reset + end + + def reset + @stats = {} + end + + def file(filename) + filename = @site.in_source_dir(filename).sub( + %r!\A#{Regexp.escape(@site.source)}/!, + "" + ) + + LiquidRenderer::File.new(self, filename).tap do + @stats[filename] ||= new_profile_hash + @stats[filename][:count] += 1 + end + end + + def increment_bytes(filename, bytes) + @stats[filename][:bytes] += bytes + end + + def increment_time(filename, time) + @stats[filename][:time] += time + end + + def stats_table(n = 50) + LiquidRenderer::Table.new(@stats).to_s(n) + end + + def self.format_error(e, path) + "#{e.message} in #{path}" + end + + private + def new_profile_hash + Hash.new { |hash, key| hash[key] = 0 } + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer/file.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer/file.rb new file mode 100644 index 0000000..574bbd3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer/file.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +module Jekyll + class LiquidRenderer + class File + def initialize(renderer, filename) + @renderer = renderer + @filename = filename + end + + def parse(content) + measure_time do + @template = Liquid::Template.parse(content, :line_numbers => true) + end + + self + end + + def render(*args) + measure_time do + measure_bytes do + @template.render(*args) + end + end + end + + def render!(*args) + measure_time do + measure_bytes do + @template.render!(*args) + end + end + end + + def warnings + @template.warnings + end + + private + + def measure_bytes + yield.tap do |str| + @renderer.increment_bytes(@filename, str.bytesize) + end + end + + def measure_time + before = Time.now + yield + ensure + after = Time.now + @renderer.increment_time(@filename, after - before) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer/table.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer/table.rb new file mode 100644 index 0000000..7aa2e49 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/liquid_renderer/table.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +module Jekyll + class LiquidRenderer::Table + def initialize(stats) + @stats = stats + end + + def to_s(n = 50) + data = data_for_table(n) + widths = table_widths(data) + generate_table(data, widths) + end + + private + + def generate_table(data, widths) + str = String.new("\n") + + table_head = data.shift + str << generate_row(table_head, widths) + str << generate_table_head_border(table_head, widths) + + data.each do |row_data| + str << generate_row(row_data, widths) + end + + str << "\n" + str + end + + def generate_table_head_border(row_data, widths) + str = String.new("") + + row_data.each_index do |cell_index| + str << "-" * widths[cell_index] + str << "-+-" unless cell_index == row_data.length - 1 + end + + str << "\n" + str + end + + def generate_row(row_data, widths) + str = String.new("") + + row_data.each_with_index do |cell_data, cell_index| + str << if cell_index.zero? + cell_data.ljust(widths[cell_index], " ") + else + cell_data.rjust(widths[cell_index], " ") + end + + str << " | " unless cell_index == row_data.length - 1 + end + + str << "\n" + str + end + + def table_widths(data) + widths = [] + + data.each do |row| + row.each_with_index do |cell, index| + widths[index] = [ cell.length, widths[index] ].compact.max + end + end + + widths + end + + def data_for_table(n) + sorted = @stats.sort_by { |_, file_stats| -file_stats[:time] } + sorted = sorted.slice(0, n) + + table = [%w(Filename Count Bytes Time)] + + sorted.each do |filename, file_stats| + row = [] + row << filename + row << file_stats[:count].to_s + row << format_bytes(file_stats[:bytes]) + row << format("%.3f", file_stats[:time]) + table << row + end + + table + end + + def format_bytes(bytes) + bytes /= 1024.0 + format("%.2fK", bytes) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/log_adapter.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/log_adapter.rb new file mode 100644 index 0000000..65b8f9d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/log_adapter.rb @@ -0,0 +1,147 @@ +# frozen_string_literal: true + +module Jekyll + class LogAdapter + attr_reader :writer, :messages, :level + + LOG_LEVELS = { + :debug => ::Logger::DEBUG, + :info => ::Logger::INFO, + :warn => ::Logger::WARN, + :error => ::Logger::ERROR, + }.freeze + + # Public: Create a new instance of a log writer + # + # writer - Logger compatible instance + # log_level - (optional, symbol) the log level + # + # Returns nothing + def initialize(writer, level = :info) + @messages = [] + @writer = writer + self.log_level = level + end + + # Public: Set the log level on the writer + # + # level - (symbol) the log level + # + # Returns nothing + def log_level=(level) + writer.level = LOG_LEVELS.fetch(level) + @level = level + end + + def adjust_verbosity(options = {}) + # Quiet always wins. + if options[:quiet] + self.log_level = :error + elsif options[:verbose] + self.log_level = :debug + end + debug "Logging at level:", LOG_LEVELS.key(writer.level).to_s + end + + # Public: Print a debug message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def debug(topic, message = nil, &block) + write(:debug, topic, message, &block) + end + + # Public: Print a message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def info(topic, message = nil, &block) + write(:info, topic, message, &block) + end + + # Public: Print a message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def warn(topic, message = nil, &block) + write(:warn, topic, message, &block) + end + + # Public: Print an error message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def error(topic, message = nil, &block) + write(:error, topic, message, &block) + end + + # Public: Print an error message and immediately abort the process + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail (can be omitted) + # + # Returns nothing + def abort_with(topic, message = nil, &block) + error(topic, message, &block) + abort + end + + # Internal: Build a topic method + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns the formatted message + def message(topic, message = nil) + raise ArgumentError, "block or message, not both" if block_given? && message + + message = yield if block_given? + message = message.to_s.gsub(%r!\s+!, " ") + topic = formatted_topic(topic, block_given?) + out = topic + message + messages << out + out + end + + # Internal: Format the topic + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # colon - + # + # Returns the formatted topic statement + def formatted_topic(topic, colon = false) + "#{topic}#{colon ? ": " : " "}".rjust(20) + end + + # Internal: Check if the message should be written given the log level. + # + # level_of_message - the Symbol level of message, one of :debug, :info, :warn, :error + # + # Returns whether the message should be written. + def write_message?(level_of_message) + LOG_LEVELS.fetch(level) <= LOG_LEVELS.fetch(level_of_message) + end + + # Internal: Log a message. + # + # level_of_message - the Symbol level of message, one of :debug, :info, :warn, :error + # topic - the String topic or full message + # message - the String message (optional) + # block - a block containing the message (optional) + # + # Returns false if the message was not written, otherwise returns the value of calling + # the appropriate writer method, e.g. writer.info. + def write(level_of_message, topic, message = nil, &block) + return false unless write_message?(level_of_message) + writer.public_send(level_of_message, message(topic, message, &block)) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/mime.types b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/mime.types new file mode 100644 index 0000000..af68d35 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/mime.types @@ -0,0 +1,825 @@ +# Woah there. Do not edit this file directly. +# This file is generated automatically by script/vendor-mimes. + +application/andrew-inset ez +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +application/atomsvc+xml atomsvc +application/bdoc bdoc +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +application/cu-seeme cu +application/dash+xml mpd +application/davmount+xml davmount +application/docbook+xml dbk +application/dssc+der dssc +application/dssc+xml xdssc +application/ecmascript ecma +application/emma+xml emma +application/epub+zip epub +application/exi exi +application/font-tdpfr pfr +application/font-woff woff +application/font-woff2 woff2 +application/geo+json geojson +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +application/gzip gz +application/hyperstudio stk +application/inkml+xml ink inkml +application/ipfix ipfix +application/java-archive jar war ear +application/java-serialized-object ser +application/java-vm class +application/javascript js mjs +application/json json map +application/json5 json5 +application/jsonml+json jsonml +application/ld+json jsonld +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/mads+xml mads +application/manifest+json webmanifest +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +application/mathml+xml mathml +application/mbox mbox +application/mediaservercontrol+xml mscml +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +application/mods+xml mods +application/mp21 m21 mp21 +application/mp4 mp4s m4p +application/msword doc dot +application/mxf mxf +application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy exe dll deb dmg iso img msi msp msm buffer +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +application/pgp-signature asc sig +application/pics-rules prf +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +application/postscript ai eps ps +application/prs.cww cww +application/pskc+xml pskcxml +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +application/set-payment-initiation setpay +application/set-registration-initiation setreg +application/shf+xml shf +application/smil+xml smi smil +application/sparql-query rq +application/sparql-results+xml srx +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +application/tei+xml tei teicorpus +application/thraud+xml tfi +application/timestamped-data tsd +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +application/vnd.apple.pkpass pkpass +application/vnd.aristanetworks.swi swi +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +application/vnd.blueice.multipass mpm +application/vnd.bmi bmi +application/vnd.businessobjects rep +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +application/vnd.cups-ppd ppd +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +application/vnd.dna dna +application/vnd.dolby.mlp mlp +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.ds-keypoint kpxx +application/vnd.dvb.ait ait +application/vnd.dvb.service svc +application/vnd.dynageo geo +application/vnd.ecowin.chart mag +application/vnd.enliven nml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +application/vnd.eszigno3+xml es3 et3 +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +application/vnd.gmx gmx +application/vnd.google-apps.document gdoc +application/vnd.google-apps.presentation gslides +application/vnd.google-apps.spreadsheet gsheet +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +application/vnd.hydrostatix.sof-data sfd-hdstx +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +application/vnd.ms-cab-compressed cab +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +application/vnd.ms-officetheme thmx +application/vnd.ms-outlook msg +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +application/vnd.ms-project mpp mpt +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +application/vnd.neurolanguage.nlu nlu +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +application/vnd.olpc-sugar xo +application/vnd.oma.dd2+xml dd2 +application/vnd.openofficeorg.extension oxt +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +application/vnd.openxmlformats-officedocument.presentationml.template potx +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +application/vnd.osgeo.mapguide.package mgp +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +application/vnd.palm pdb pqa oprc +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +application/vnd.picsel efif +application/vnd.pmi.widget wg +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +application/vnd.sailingtracker.track st +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +application/vnd.smart.teacher teacher +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +application/vnd.sun.wadl+xml wadl +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.sus-calendar sus susp +application/vnd.svd svd +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +application/vnd.vcx vcx +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +application/vnd.vsf vsf +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +application/vnd.wt.stf stf +application/vnd.xara xar +application/vnd.xfdl xfdl +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +application/widget wgt +application/winhlp hlp +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +application/x-arj arj +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +application/x-chrome-extension crx +application/x-cocoa cco +application/x-conference nsc +application/x-cpio cpio +application/x-csh csh +application/x-debian-package udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +application/x-eva eva +application/x-font-bdf bdf +application/x-font-ghostscript gsf +application/x-font-linux-psf psf +application/x-font-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +application/x-font-ttf ttf ttc +application/x-font-type1 pfa pfb pfm afm +application/x-freearc arc +application/x-futuresplash spl +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +application/x-hdf hdf +application/x-httpd-php php +application/x-install-instructions install +application/x-java-archive-diff jardiff +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lua-bytecode luac +application/x-lzh-compressed lzh lha +application/x-makeself run +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload com bat +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-ns-proxy-autoconfig pac +application/x-nzb nzb +application/x-perl pl pm +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-redhat-package-manager rpm +application/x-research-info-systems ris +application/x-sea sea +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl tk +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-virtualbox-hdd hdd +application/x-virtualbox-ova ova +application/x-virtualbox-ovf ovf +application/x-virtualbox-vbox vbox +application/x-virtualbox-vbox-extpack vbox-extpack +application/x-virtualbox-vdi vdi +application/x-virtualbox-vhd vhd +application/x-virtualbox-vmdk vmdk +application/x-wais-source src +application/x-web-app-manifest+json webapp +application/x-x509-ca-cert der crt pem +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +application/xaml+xml xaml +application/xcap-diff+xml xdf +application/xenc+xml xenc +application/xhtml+xml xhtml xht +application/xml xml xsl xsd rng +application/xml-dtd dtd +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +audio/3gpp 3gpp +audio/adpcm adp +audio/basic au snd +audio/midi mid midi kar rmi +audio/mp3 mp3 +audio/mp4 m4a mp4a +audio/mpeg mpga mp2 mp2a m2a m3a +audio/ogg oga ogg spx +audio/s3m s3m +audio/silk sil +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +audio/vnd.rip rip +audio/wav wav +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +chemical/x-xyz xyz +image/apng apng +image/bmp bmp +image/cgm cgm +image/g3fax g3 +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/ktx ktx +image/png png +image/prs.btif btif +image/sgi sgi +image/svg+xml svg svgz +image/tiff tiff tif +image/vnd.adobe.photoshop psd +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.djvu djvu djv +image/vnd.dvb.subtitle sub +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +image/webp webp +image/x-3ds 3ds +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +image/x-jng jng +image/x-mrsid-image sid +image/x-pcx pcx +image/x-pict pic pct +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/rfc822 eml mime +model/gltf+json gltf +model/gltf-binary glb +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +model/vnd.gdl gdl +model/vnd.gtw gtw +model/vnd.mts mts +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +text/cache-manifest appcache manifest +text/calendar ics ifb +text/coffeescript coffee litcoffee +text/css css +text/csv csv +text/hjson hjson +text/html html htm shtml +text/jade jade +text/jsx jsx +text/less less +text/markdown markdown md +text/mathml mml +text/n3 n3 +text/plain txt text conf def list log in ini +text/prs.lines.tag dsc +text/richtext rtx +text/sgml sgml sgm +text/slim slim slm +text/stylus stylus styl +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +text/uri-list uri uris urls +text/vcard vcard +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.mcurl mcurl +text/vnd.curl.scurl scurl +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +text/vnd.sun.j2me.app-descriptor jad +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/vtt vtt +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-component htc +text/x-fortran f for f77 f90 +text/x-handlebars-template hbs +text/x-java-source java +text/x-lua lua +text/x-markdown mkd +text/x-nfo nfo +text/x-opml opml +text/x-pascal p pas +text/x-processing pde +text/x-sass sass +text/x-scss scss +text/x-setext etx +text/x-sfv sfv +text/x-suse-ymp ymp +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +text/yaml yaml yml +video/3gpp 3gp +video/3gpp2 3g2 +video/h261 h261 +video/h263 h263 +video/h264 h264 +video/jpeg jpgv +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +video/mp2t ts +video/mp4 mp4 mp4v mpg4 +video/mpeg mpeg mpg mpe m1v m2v +video/ogg ogv +video/quicktime qt mov +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +video/vnd.dvb.file dvb +video/vnd.fvt fvt +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/page.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/page.rb new file mode 100644 index 0000000..caea9cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/page.rb @@ -0,0 +1,187 @@ +# frozen_string_literal: true + +module Jekyll + class Page + include Convertible + + attr_writer :dir + attr_accessor :site, :pager + attr_accessor :name, :ext, :basename + attr_accessor :data, :content, :output + + alias_method :extname, :ext + + FORWARD_SLASH = "/".freeze + + # Attributes for Liquid templates + ATTRIBUTES_FOR_LIQUID = %w( + content + dir + name + path + url + ).freeze + + # A set of extensions that are considered HTML or HTML-like so we + # should not alter them, this includes .xhtml through XHTM5. + + HTML_EXTENSIONS = %w( + .html + .xhtml + .htm + ).freeze + + # Initialize a new Page. + # + # site - The Site object. + # base - The String path to the source. + # dir - The String path between the source and the file. + # name - The String filename of the file. + def initialize(site, base, dir, name) + @site = site + @base = base + @dir = dir + @name = name + @path = if site.in_theme_dir(base) == base # we're in a theme + site.in_theme_dir(base, dir, name) + else + site.in_source_dir(base, dir, name) + end + + process(name) + read_yaml(File.join(base, dir), name) + + data.default_proc = proc do |_, key| + site.frontmatter_defaults.find(File.join(dir, name), type, key) + end + + Jekyll::Hooks.trigger :pages, :post_init, self + end + + # The generated directory into which the page will be placed + # upon generation. This is derived from the permalink or, if + # permalink is absent, will be '/' + # + # Returns the String destination directory. + def dir + if url.end_with?(FORWARD_SLASH) + url + else + url_dir = File.dirname(url) + url_dir.end_with?(FORWARD_SLASH) ? url_dir : "#{url_dir}/" + end + end + + # The full path and filename of the post. Defined in the YAML of the post + # body. + # + # Returns the String permalink or nil if none has been set. + def permalink + data.nil? ? nil : data["permalink"] + end + + # The template of the permalink. + # + # Returns the template String. + def template + if !html? + "/:path/:basename:output_ext" + elsif index? + "/:path/" + else + Utils.add_permalink_suffix("/:path/:basename", site.permalink_style) + end + end + + # The generated relative url of this page. e.g. /about.html. + # + # Returns the String url. + def url + @url ||= URL.new({ + :template => template, + :placeholders => url_placeholders, + :permalink => permalink, + }).to_s + end + + # Returns a hash of URL placeholder names (as symbols) mapping to the + # desired placeholder replacements. For details see "url.rb" + def url_placeholders + { + :path => @dir, + :basename => basename, + :output_ext => output_ext, + } + end + + # Extract information from the page filename. + # + # name - The String filename of the page file. + # + # Returns nothing. + def process(name) + self.ext = File.extname(name) + self.basename = name[0..-ext.length - 1] + end + + # Add any necessary layouts to this post + # + # layouts - The Hash of {"name" => "layout"}. + # site_payload - The site payload Hash. + # + # Returns String rendered page. + def render(layouts, site_payload) + site_payload["page"] = to_liquid + site_payload["paginator"] = pager.to_liquid + + do_layout(site_payload, layouts) + end + + # The path to the source file + # + # Returns the path to the source file + def path + data.fetch("path") { relative_path } + end + + # The path to the page source file, relative to the site source + def relative_path + File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).sub(%r!\A\/!, "") + end + + # Obtain destination path. + # + # dest - The String path to the destination dir. + # + # Returns the destination file path String. + def destination(dest) + path = site.in_dest_dir(dest, URL.unescape_path(url)) + path = File.join(path, "index") if url.end_with?("/") + path << output_ext unless path.end_with? output_ext + path + end + + # Returns the object as a debug String. + def inspect + "#" + end + + # Returns the Boolean of whether this Page is HTML or not. + def html? + HTML_EXTENSIONS.include?(output_ext) + end + + # Returns the Boolean of whether this Page is an index file or not. + def index? + basename == "index" + end + + def trigger_hooks(hook_name, *args) + Jekyll::Hooks.trigger :pages, hook_name, self, *args + end + + def write? + true + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/page_without_a_file.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/page_without_a_file.rb new file mode 100644 index 0000000..2d30af5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/page_without_a_file.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Jekyll + # A Jekyll::Page subclass to handle processing files without reading it to + # determine the page-data and page-content based on Front Matter delimiters. + # + # The class instance is basically just a bare-bones entity with just + # attributes "dir", "name", "path", "url" defined on it. + class PageWithoutAFile < Page + def read_yaml(*) + @data ||= {} + end + + def inspect + "#" + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/plugin.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/plugin.rb new file mode 100644 index 0000000..2a9dbee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/plugin.rb @@ -0,0 +1,98 @@ +# frozen_string_literal: true + +module Jekyll + class Plugin + PRIORITIES = { + :low => -10, + :highest => 100, + :lowest => -100, + :normal => 0, + :high => 10, + }.freeze + + # + + def self.inherited(const) + return catch_inheritance(const) do |const_| + catch_inheritance(const_) + end + end + + # + + def self.catch_inheritance(const) + const.define_singleton_method :inherited do |const_| + (@children ||= Set.new).add const_ + if block_given? + yield const_ + end + end + end + + # + + def self.descendants + @children ||= Set.new + out = @children.map(&:descendants) + out << self unless superclass == Plugin + Set.new(out).flatten + end + + # Get or set the priority of this plugin. When called without an + # argument it returns the priority. When an argument is given, it will + # set the priority. + # + # priority - The Symbol priority (default: nil). Valid options are: + # :lowest, :low, :normal, :high, :highest + # + # Returns the Symbol priority. + def self.priority(priority = nil) + @priority ||= nil + if priority && PRIORITIES.key?(priority) + @priority = priority + end + @priority || :normal + end + + # Get or set the safety of this plugin. When called without an argument + # it returns the safety. When an argument is given, it will set the + # safety. + # + # safe - The Boolean safety (default: nil). + # + # Returns the safety Boolean. + def self.safe(safe = nil) + unless defined?(@safe) && safe.nil? + @safe = safe + end + @safe || false + end + + # Spaceship is priority [higher -> lower] + # + # other - The class to be compared. + # + # Returns -1, 0, 1. + def self.<=>(other) + PRIORITIES[other.priority] <=> PRIORITIES[self.priority] + end + + # Spaceship is priority [higher -> lower] + # + # other - The class to be compared. + # + # Returns -1, 0, 1. + def <=>(other) + self.class <=> other.class + end + + # Initialize a new plugin. This should be overridden by the subclass. + # + # config - The Hash of configuration options. + # + # Returns a new instance. + def initialize(config = {}) + # no-op for default + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/plugin_manager.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/plugin_manager.rb new file mode 100644 index 0000000..f53d187 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/plugin_manager.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true + +module Jekyll + class PluginManager + attr_reader :site + + # Create an instance of this class. + # + # site - the instance of Jekyll::Site we're concerned with + # + # Returns nothing + def initialize(site) + @site = site + end + + # Require all the plugins which are allowed. + # + # Returns nothing + def conscientious_require + require_theme_deps if site.theme + require_plugin_files + require_gems + deprecation_checks + end + + # Require each of the gem plugins specified. + # + # Returns nothing. + def require_gems + Jekyll::External.require_with_graceful_fail( + site.gems.select { |plugin| plugin_allowed?(plugin) } + ) + end + + # Require each of the runtime_dependencies specified by the theme's gemspec. + # + # Returns false only if no dependencies have been specified, otherwise nothing. + def require_theme_deps + return false unless site.theme.runtime_dependencies + site.theme.runtime_dependencies.each do |dep| + next if dep.name == "jekyll" + External.require_with_graceful_fail(dep.name) if plugin_allowed?(dep.name) + end + end + + def self.require_from_bundler + if !ENV["JEKYLL_NO_BUNDLER_REQUIRE"] && File.file?("Gemfile") + require "bundler" + + Bundler.setup + required_gems = Bundler.require(:jekyll_plugins) + message = "Required #{required_gems.map(&:name).join(", ")}" + Jekyll.logger.debug("PluginManager:", message) + ENV["JEKYLL_NO_BUNDLER_REQUIRE"] = "true" + + true + else + false + end + end + + # Check whether a gem plugin is allowed to be used during this build. + # + # plugin_name - the name of the plugin + # + # Returns true if the plugin name is in the whitelist or if the site is not + # in safe mode. + def plugin_allowed?(plugin_name) + !site.safe || whitelist.include?(plugin_name) + end + + # Build an array of allowed plugin gem names. + # + # Returns an array of strings, each string being the name of a gem name + # that is allowed to be used. + def whitelist + @whitelist ||= Array[site.config["whitelist"]].flatten + end + + # Require all .rb files if safe mode is off + # + # Returns nothing. + def require_plugin_files + unless site.safe + plugins_path.each do |plugin_search_path| + plugin_files = Utils.safe_glob(plugin_search_path, File.join("**", "*.rb")) + Jekyll::External.require_with_graceful_fail(plugin_files) + end + end + end + + # Public: Setup the plugin search path + # + # Returns an Array of plugin search paths + def plugins_path + if site.config["plugins_dir"].eql? Jekyll::Configuration::DEFAULTS["plugins_dir"] + [site.in_source_dir(site.config["plugins_dir"])] + else + Array(site.config["plugins_dir"]).map { |d| File.expand_path(d) } + end + end + + def deprecation_checks + pagination_included = (site.config["plugins"] || []).include?("jekyll-paginate") || + defined?(Jekyll::Paginate) + if site.config["paginate"] && !pagination_included + Jekyll::Deprecator.deprecation_message "You appear to have pagination " \ + "turned on, but you haven't included the `jekyll-paginate` gem. " \ + "Ensure you have `plugins: [jekyll-paginate]` in your configuration file." + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/publisher.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/publisher.rb new file mode 100644 index 0000000..26fe4a3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/publisher.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Jekyll + class Publisher + def initialize(site) + @site = site + end + + def publish?(thing) + can_be_published?(thing) && !hidden_in_the_future?(thing) + end + + def hidden_in_the_future?(thing) + thing.respond_to?(:date) && !@site.future && thing.date.to_i > @site.time.to_i + end + + private + + def can_be_published?(thing) + thing.data.fetch("published", true) || @site.unpublished + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/reader.rb new file mode 100644 index 0000000..7b5c3b1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/reader.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true + +require "csv" + +module Jekyll + class Reader + attr_reader :site + + def initialize(site) + @site = site + end + + # Read Site data from disk and load it into internal data structures. + # + # Returns nothing. + def read + @site.layouts = LayoutReader.new(site).read + read_directories + sort_files! + @site.data = DataReader.new(site).read(site.config["data_dir"]) + CollectionReader.new(site).read + ThemeAssetsReader.new(site).read + end + + # Sorts posts, pages, and static files. + def sort_files! + site.collections.each_value { |c| c.docs.sort! } + site.pages.sort_by!(&:name) + site.static_files.sort_by!(&:relative_path) + end + + # Recursively traverse directories to find pages and static files + # that will become part of the site according to the rules in + # filter_entries. + # + # dir - The String relative path of the directory to read. Default: ''. + # + # Returns nothing. + def read_directories(dir = "") + base = site.in_source_dir(dir) + + return unless File.directory?(base) + + dot = Dir.chdir(base) { filter_entries(Dir.entries("."), base) } + dot_dirs = dot.select { |file| File.directory?(@site.in_source_dir(base, file)) } + dot_files = (dot - dot_dirs) + dot_pages = dot_files.select do |file| + Utils.has_yaml_header?(@site.in_source_dir(base, file)) + end + dot_static_files = dot_files - dot_pages + + retrieve_posts(dir) + retrieve_dirs(base, dir, dot_dirs) + retrieve_pages(dir, dot_pages) + retrieve_static_files(dir, dot_static_files) + end + + # Retrieves all the posts(posts/drafts) from the given directory + # and add them to the site and sort them. + # + # dir - The String representing the directory to retrieve the posts from. + # + # Returns nothing. + def retrieve_posts(dir) + site.posts.docs.concat(PostReader.new(site).read_posts(dir)) + site.posts.docs.concat(PostReader.new(site).read_drafts(dir)) if site.show_drafts + end + + # Recursively traverse directories with the read_directories function. + # + # base - The String representing the site's base directory. + # dir - The String representing the directory to traverse down. + # dot_dirs - The Array of subdirectories in the dir. + # + # Returns nothing. + def retrieve_dirs(_base, dir, dot_dirs) + dot_dirs.each do |file| + dir_path = site.in_source_dir(dir, file) + rel_path = File.join(dir, file) + unless @site.dest.sub(%r!/$!, "") == dir_path + @site.reader.read_directories(rel_path) + end + end + end + + # Retrieve all the pages from the current directory, + # add them to the site and sort them. + # + # dir - The String representing the directory retrieve the pages from. + # dot_pages - The Array of pages in the dir. + # + # Returns nothing. + def retrieve_pages(dir, dot_pages) + site.pages.concat(PageReader.new(site, dir).read(dot_pages)) + end + + # Retrieve all the static files from the current directory, + # add them to the site and sort them. + # + # dir - The directory retrieve the static files from. + # dot_static_files - The static files in the dir. + # + # Returns nothing. + def retrieve_static_files(dir, dot_static_files) + site.static_files.concat(StaticFileReader.new(site, dir).read(dot_static_files)) + end + + # Filter out any files/directories that are hidden or backup files (start + # with "." or "#" or end with "~"), or contain site content (start with "_"), + # or are excluded in the site configuration, unless they are web server + # files such as '.htaccess'. + # + # entries - The Array of String file/directory entries to filter. + # base_directory - The string representing the optional base directory. + # + # Returns the Array of filtered entries. + def filter_entries(entries, base_directory = nil) + EntryFilter.new(site, base_directory).filter(entries) + end + + # Read the entries from a particular directory for processing + # + # dir - The String representing the relative path of the directory to read. + # subfolder - The String representing the directory to read. + # + # Returns the list of entries to process + def get_entries(dir, subfolder) + base = site.in_source_dir(dir, subfolder) + return [] unless File.exist?(base) + entries = Dir.chdir(base) { filter_entries(Dir["**/*"], base) } + entries.delete_if { |e| File.directory?(site.in_source_dir(base, e)) } + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/collection_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/collection_reader.rb new file mode 100644 index 0000000..77c7009 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/collection_reader.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Jekyll + class CollectionReader + SPECIAL_COLLECTIONS = %w(posts data).freeze + + attr_reader :site, :content + def initialize(site) + @site = site + @content = {} + end + + # Read in all collections specified in the configuration + # + # Returns nothing. + def read + site.collections.each_value do |collection| + collection.read unless SPECIAL_COLLECTIONS.include?(collection.label) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/data_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/data_reader.rb new file mode 100644 index 0000000..445d548 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/data_reader.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +module Jekyll + class DataReader + attr_reader :site, :content + def initialize(site) + @site = site + @content = {} + @entry_filter = EntryFilter.new(site) + end + + # Read all the files in and adds them to @content + # + # dir - The String relative path of the directory to read. + # + # Returns @content, a Hash of the .yaml, .yml, + # .json, and .csv files in the base directory + def read(dir) + base = site.in_source_dir(dir) + read_data_to(base, @content) + @content + end + + # Read and parse all .yaml, .yml, .json, .csv and .tsv + # files under and add them to the variable. + # + # dir - The string absolute path of the directory to read. + # data - The variable to which data will be added. + # + # Returns nothing + def read_data_to(dir, data) + return unless File.directory?(dir) && !@entry_filter.symlink?(dir) + + entries = Dir.chdir(dir) do + Dir["*.{yaml,yml,json,csv,tsv}"] + Dir["*"].select { |fn| File.directory?(fn) } + end + + entries.each do |entry| + path = @site.in_source_dir(dir, entry) + next if @entry_filter.symlink?(path) + + if File.directory?(path) + read_data_to(path, data[sanitize_filename(entry)] = {}) + else + key = sanitize_filename(File.basename(entry, ".*")) + data[key] = read_data_file(path) + end + end + end + + # Determines how to read a data file. + # + # Returns the contents of the data file. + def read_data_file(path) + case File.extname(path).downcase + when ".csv" + CSV.read(path, { + :headers => true, + :encoding => site.config["encoding"], + }).map(&:to_hash) + when ".tsv" + CSV.read(path, { + :col_sep => "\t", + :headers => true, + :encoding => site.config["encoding"], + }).map(&:to_hash) + else + SafeYAML.load_file(path) + end + end + + def sanitize_filename(name) + name.gsub(%r![^\w\s-]+|(?<=^|\b\s)\s+(?=$|\s?\b)!, "") + .gsub(%r!\s+!, "_") + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/layout_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/layout_reader.rb new file mode 100644 index 0000000..706dfed --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/layout_reader.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +module Jekyll + class LayoutReader + attr_reader :site + def initialize(site) + @site = site + @layouts = {} + end + + def read + layout_entries.each do |layout_file| + @layouts[layout_name(layout_file)] = \ + Layout.new(site, layout_directory, layout_file) + end + + theme_layout_entries.each do |layout_file| + @layouts[layout_name(layout_file)] ||= \ + Layout.new(site, theme_layout_directory, layout_file) + end + + @layouts + end + + def layout_directory + @layout_directory ||= (layout_directory_in_cwd || layout_directory_inside_source) + end + + def theme_layout_directory + @theme_layout_directory ||= site.theme.layouts_path if site.theme + end + + private + + def layout_entries + entries_in layout_directory + end + + def theme_layout_entries + theme_layout_directory ? entries_in(theme_layout_directory) : [] + end + + def entries_in(dir) + entries = [] + within(dir) do + entries = EntryFilter.new(site).filter(Dir["**/*.*"]) + end + entries + end + + def layout_name(file) + file.split(".")[0..-2].join(".") + end + + def within(directory) + return unless File.exist?(directory) + Dir.chdir(directory) { yield } + end + + def layout_directory_inside_source + site.in_source_dir(site.config["layouts_dir"]) + end + + def layout_directory_in_cwd + dir = Jekyll.sanitized_path(Dir.pwd, site.config["layouts_dir"]) + if File.directory?(dir) && !site.safe + dir + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/page_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/page_reader.rb new file mode 100644 index 0000000..62d7419 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/page_reader.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Jekyll + class PageReader + attr_reader :site, :dir, :unfiltered_content + def initialize(site, dir) + @site = site + @dir = dir + @unfiltered_content = [] + end + + # Read all the files in // for Yaml header and create a new Page + # object for each file. + # + # dir - The String relative path of the directory to read. + # + # Returns an array of static pages. + def read(files) + files.map do |page| + @unfiltered_content << Page.new(@site, @site.source, @dir, page) + end + @unfiltered_content.select { |page| site.publisher.publish?(page) } + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/post_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/post_reader.rb new file mode 100644 index 0000000..b0dc303 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/post_reader.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +module Jekyll + class PostReader + attr_reader :site, :unfiltered_content + def initialize(site) + @site = site + end + + # Read all the files in //_drafts and create a new + # Document object with each one. + # + # dir - The String relative path of the directory to read. + # + # Returns nothing. + def read_drafts(dir) + read_publishable(dir, "_drafts", Document::DATELESS_FILENAME_MATCHER) + end + + # Read all the files in //_posts and create a new Document + # object with each one. + # + # dir - The String relative path of the directory to read. + # + # Returns nothing. + def read_posts(dir) + read_publishable(dir, "_posts", Document::DATE_FILENAME_MATCHER) + end + + # Read all the files in // and create a new + # Document object with each one insofar as it matches the regexp matcher. + # + # dir - The String relative path of the directory to read. + # + # Returns nothing. + def read_publishable(dir, magic_dir, matcher) + read_content(dir, magic_dir, matcher).tap { |docs| docs.each(&:read) } + .select do |doc| + if doc.content.valid_encoding? + site.publisher.publish?(doc).tap do |will_publish| + if !will_publish && site.publisher.hidden_in_the_future?(doc) + Jekyll.logger.debug "Skipping:", "#{doc.relative_path} has a future date" + end + end + else + Jekyll.logger.debug "Skipping:", "#{doc.relative_path} is not valid UTF-8" + false + end + end + end + + # Read all the content files from //magic_dir + # and return them with the type klass. + # + # dir - The String relative path of the directory to read. + # magic_dir - The String relative directory to , + # looks for content here. + # klass - The return type of the content. + # + # Returns klass type of content files + def read_content(dir, magic_dir, matcher) + @site.reader.get_entries(dir, magic_dir).map do |entry| + next unless entry =~ matcher + path = @site.in_source_dir(File.join(dir, magic_dir, entry)) + Document.new(path, { + :site => @site, + :collection => @site.posts, + }) + end.reject(&:nil?) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/static_file_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/static_file_reader.rb new file mode 100644 index 0000000..6bf07f5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/static_file_reader.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Jekyll + class StaticFileReader + attr_reader :site, :dir, :unfiltered_content + def initialize(site, dir) + @site = site + @dir = dir + @unfiltered_content = [] + end + + # Read all the files in // for Yaml header and create a new Page + # object for each file. + # + # dir - The String relative path of the directory to read. + # + # Returns an array of static files. + def read(files) + files.map do |file| + @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file) + end + @unfiltered_content + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/theme_assets_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/theme_assets_reader.rb new file mode 100644 index 0000000..2706690 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/readers/theme_assets_reader.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +module Jekyll + class ThemeAssetsReader + attr_reader :site + def initialize(site) + @site = site + end + + def read + return unless site.theme && site.theme.assets_path + + Find.find(site.theme.assets_path) do |path| + next if File.directory?(path) + if File.symlink?(path) + Jekyll.logger.warn "Theme reader:", "Ignored symlinked asset: #{path}" + else + read_theme_asset(path) + end + end + end + + private + def read_theme_asset(path) + base = site.theme.root + dir = File.dirname(path.sub("#{site.theme.root}/", "")) + name = File.basename(path) + + if Utils.has_yaml_header?(path) + append_unless_exists site.pages, + Jekyll::Page.new(site, base, dir, name) + else + append_unless_exists site.static_files, + Jekyll::StaticFile.new(site, base, "/#{dir}", name) + end + end + + def append_unless_exists(haystack, new_item) + if haystack.any? { |file| file.relative_path == new_item.relative_path } + Jekyll.logger.debug "Theme:", + "Ignoring #{new_item.relative_path} in theme due to existing file " \ + "with that path in site." + return + end + + haystack << new_item + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/regenerator.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/regenerator.rb new file mode 100644 index 0000000..948de27 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/regenerator.rb @@ -0,0 +1,201 @@ +# frozen_string_literal: true + +module Jekyll + class Regenerator + attr_reader :site, :metadata, :cache + attr_accessor :disabled + private :disabled, :disabled= + + def initialize(site) + @site = site + + # Read metadata from file + read_metadata + + # Initialize cache to an empty hash + clear_cache + end + + # Checks if a renderable object needs to be regenerated + # + # Returns a boolean. + def regenerate?(document) + case document + when Page + regenerate_page?(document) + when Document + regenerate_document?(document) + else + source_path = document.respond_to?(:path) ? document.path : nil + dest_path = if document.respond_to?(:destination) + document.destination(@site.dest) + end + source_modified_or_dest_missing?(source_path, dest_path) + end + end + + # Add a path to the metadata + # + # Returns true, also on failure. + def add(path) + return true unless File.exist?(path) + + metadata[path] = { + "mtime" => File.mtime(path), + "deps" => [], + } + cache[path] = true + end + + # Force a path to regenerate + # + # Returns true. + def force(path) + cache[path] = true + end + + # Clear the metadata and cache + # + # Returns nothing + def clear + @metadata = {} + clear_cache + end + + # Clear just the cache + # + # Returns nothing + def clear_cache + @cache = {} + end + + # Checks if the source has been modified or the + # destination is missing + # + # returns a boolean + def source_modified_or_dest_missing?(source_path, dest_path) + modified?(source_path) || (dest_path && !File.exist?(dest_path)) + end + + # Checks if a path's (or one of its dependencies) + # mtime has changed + # + # Returns a boolean. + def modified?(path) + return true if disabled? + + # objects that don't have a path are always regenerated + return true if path.nil? + + # Check for path in cache + if cache.key? path + return cache[path] + end + + if metadata[path] + # If we have seen this file before, + # check if it or one of its dependencies has been modified + existing_file_modified?(path) + else + # If we have not seen this file before, add it to the metadata and regenerate it + add(path) + end + end + + # Add a dependency of a path + # + # Returns nothing. + def add_dependency(path, dependency) + return if metadata[path].nil? || disabled + + unless metadata[path]["deps"].include? dependency + metadata[path]["deps"] << dependency + add(dependency) unless metadata.include?(dependency) + end + regenerate? dependency + end + + # Write the metadata to disk + # + # Returns nothing. + def write_metadata + unless disabled? + File.binwrite(metadata_file, Marshal.dump(metadata)) + end + end + + # Produce the absolute path of the metadata file + # + # Returns the String path of the file. + def metadata_file + @metadata_file ||= site.in_source_dir(".jekyll-metadata") + end + + # Check if metadata has been disabled + # + # Returns a Boolean (true for disabled, false for enabled). + def disabled? + self.disabled = !site.incremental? if disabled.nil? + disabled + end + + private + + # Read metadata from the metadata file, if no file is found, + # initialize with an empty hash + # + # Returns the read metadata. + def read_metadata + @metadata = + if !disabled? && File.file?(metadata_file) + content = File.binread(metadata_file) + + begin + Marshal.load(content) + rescue TypeError + SafeYAML.load(content) + rescue ArgumentError => e + Jekyll.logger.warn("Failed to load #{metadata_file}: #{e}") + {} + end + else + {} + end + end + + private + def regenerate_page?(document) + document.asset_file? || document.data["regenerate"] || + source_modified_or_dest_missing?( + site.in_source_dir(document.relative_path), document.destination(@site.dest) + ) + end + + private + def regenerate_document?(document) + !document.write? || document.data["regenerate"] || + source_modified_or_dest_missing?( + document.path, document.destination(@site.dest) + ) + end + + private + def existing_file_modified?(path) + # If one of this file dependencies have been modified, + # set the regeneration bit for both the dependency and the file to true + metadata[path]["deps"].each do |dependency| + if modified?(dependency) + return cache[dependency] = cache[path] = true + end + end + + if File.exist?(path) && metadata[path]["mtime"].eql?(File.mtime(path)) + # If this file has not been modified, set the regeneration bit to false + cache[path] = false + else + # If it has been modified, set it to true + add(path) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/related_posts.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/related_posts.rb new file mode 100644 index 0000000..fcccdd8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/related_posts.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module Jekyll + class RelatedPosts + class << self + attr_accessor :lsi + end + + attr_reader :post, :site + + def initialize(post) + @post = post + @site = post.site + Jekyll::External.require_with_graceful_fail("classifier-reborn") if site.lsi + end + + def build + return [] unless site.posts.docs.size > 1 + + if site.lsi + build_index + lsi_related_posts + else + most_recent_posts + end + end + + def build_index + self.class.lsi ||= begin + lsi = ClassifierReborn::LSI.new(:auto_rebuild => false) + Jekyll.logger.info("Populating LSI...") + + site.posts.docs.each do |x| + lsi.add_item(x) + end + + Jekyll.logger.info("Rebuilding index...") + lsi.build_index + Jekyll.logger.info("") + lsi + end + end + + def lsi_related_posts + self.class.lsi.find_related(post, 11) + end + + def most_recent_posts + @most_recent_posts ||= (site.posts.docs.reverse - [post]).first(10) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/renderer.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/renderer.rb new file mode 100644 index 0000000..1f83e2e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/renderer.rb @@ -0,0 +1,269 @@ +# frozen_string_literal: true + +module Jekyll + class Renderer + attr_reader :document, :site + attr_writer :layouts, :payload + + def initialize(site, document, site_payload = nil) + @site = site + @document = document + @payload = site_payload + end + + # Fetches the payload used in Liquid rendering. + # It can be written with #payload=(new_payload) + # Falls back to site.site_payload if no payload is set. + # + # Returns a Jekyll::Drops::UnifiedPayloadDrop + def payload + @payload ||= site.site_payload + end + + # The list of layouts registered for this Renderer. + # It can be written with #layouts=(new_layouts) + # Falls back to site.layouts if no layouts are registered. + # + # Returns a Hash of String => Jekyll::Layout identified + # as basename without the extension name. + def layouts + @layouts || site.layouts + end + + # Determine which converters to use based on this document's + # extension. + # + # Returns Array of Converter instances. + def converters + @converters ||= site.converters.select { |c| c.matches(document.extname) }.sort + end + + # Determine the extname the outputted file should have + # + # Returns String the output extname including the leading period. + def output_ext + @output_ext ||= (permalink_ext || converter_output_ext) + end + + # Prepare payload and render the document + # + # Returns String rendered document output + def run + Jekyll.logger.debug "Rendering:", document.relative_path + + assign_pages! + assign_related_posts! + assign_highlighter_options! + assign_layout_data! + + Jekyll.logger.debug "Pre-Render Hooks:", document.relative_path + document.trigger_hooks(:pre_render, payload) + + render_document + end + + # Render the document. + # + # Returns String rendered document output + # rubocop: disable AbcSize + def render_document + info = { + :registers => { :site => site, :page => payload["page"] }, + } + output = document.content + if document.render_with_liquid? + Jekyll.logger.debug "Rendering Liquid:", document.relative_path + output = render_liquid(output, payload, info, document.path) + end + + Jekyll.logger.debug "Rendering Markup:", document.relative_path + output = convert(output) + document.content = output + + if document.place_in_layout? + Jekyll.logger.debug "Rendering Layout:", document.relative_path + output = place_in_layouts(output, payload, info) + end + + output + end + # rubocop: enable AbcSize + + # Convert the document using the converters which match this renderer's document. + # + # Returns String the converted content. + def convert(content) + converters.reduce(content) do |output, converter| + begin + converter.convert output + rescue StandardError => e + Jekyll.logger.error "Conversion error:", + "#{converter.class} encountered an error while "\ + "converting '#{document.relative_path}':" + Jekyll.logger.error("", e.to_s) + raise e + end + end + end + + # Render the given content with the payload and info + # + # content - + # payload - + # info - + # path - (optional) the path to the file, for use in ex + # + # Returns String the content, rendered by Liquid. + def render_liquid(content, payload, info, path = nil) + template = site.liquid_renderer.file(path).parse(content) + template.warnings.each do |e| + Jekyll.logger.warn "Liquid Warning:", + LiquidRenderer.format_error(e, path || document.relative_path) + end + template.render!(payload, info) + # rubocop: disable RescueException + rescue Exception => e + Jekyll.logger.error "Liquid Exception:", + LiquidRenderer.format_error(e, path || document.relative_path) + raise e + end + # rubocop: enable RescueException + + # Checks if the layout specified in the document actually exists + # + # layout - the layout to check + # + # Returns Boolean true if the layout is invalid, false if otherwise + def invalid_layout?(layout) + !document.data["layout"].nil? && layout.nil? && !(document.is_a? Jekyll::Excerpt) + end + + # Render layouts and place document content inside. + # + # Returns String rendered content + def place_in_layouts(content, payload, info) + output = content.dup + layout = layouts[document.data["layout"].to_s] + validate_layout(layout) + + used = Set.new([layout]) + + # Reset the payload layout data to ensure it starts fresh for each page. + payload["layout"] = nil + + while layout + output = render_layout(output, layout, info) + add_regenerator_dependencies(layout) + + if (layout = site.layouts[layout.data["layout"]]) + break if used.include?(layout) + used << layout + end + end + output + end + + # Checks if the layout specified in the document actually exists + # + # layout - the layout to check + # Returns nothing + private + def validate_layout(layout) + return unless invalid_layout?(layout) + Jekyll.logger.warn( + "Build Warning:", + "Layout '#{document.data["layout"]}' requested "\ + "in #{document.relative_path} does not exist." + ) + end + + # Render layout content into document.output + # + # Returns String rendered content + private + def render_layout(output, layout, info) + payload["content"] = output + payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) + + render_liquid( + layout.content, + payload, + info, + layout.relative_path + ) + end + + private + def add_regenerator_dependencies(layout) + return unless document.write? + site.regenerator.add_dependency( + site.in_source_dir(document.path), + layout.path + ) + end + + # Set page content to payload and assign pager if document has one. + # + # Returns nothing + private + def assign_pages! + payload["page"] = document.to_liquid + payload["paginator"] = if document.respond_to?(:pager) + document.pager.to_liquid + end + end + + # Set related posts to payload if document is a post. + # + # Returns nothing + private + def assign_related_posts! + if document.is_a?(Document) && document.collection.label == "posts" + payload["site"]["related_posts"] = document.related_posts + else + payload["site"]["related_posts"] = nil + end + end + + # Set highlighter prefix and suffix + # + # Returns nothing + private + def assign_highlighter_options! + payload["highlighter_prefix"] = converters.first.highlighter_prefix + payload["highlighter_suffix"] = converters.first.highlighter_suffix + end + + private + def assign_layout_data! + layout = layouts[document.data["layout"]] + if layout + payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) + end + end + + private + def permalink_ext + if document.permalink && !document.permalink.end_with?("/") + permalink_ext = File.extname(document.permalink) + permalink_ext unless permalink_ext.empty? + end + end + + private + def converter_output_ext + if output_exts.size == 1 + output_exts.last + else + output_exts[-2] + end + end + + private + def output_exts + @output_exts ||= converters.map do |c| + c.output_ext(document.extname) + end.compact + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/site.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/site.rb new file mode 100644 index 0000000..2af8e09 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/site.rb @@ -0,0 +1,470 @@ +# frozen_string_literal: true + +require "csv" + +module Jekyll + class Site + attr_reader :source, :dest, :config + attr_accessor :layouts, :pages, :static_files, :drafts, + :exclude, :include, :lsi, :highlighter, :permalink_style, + :time, :future, :unpublished, :safe, :plugins, :limit_posts, + :show_drafts, :keep_files, :baseurl, :data, :file_read_opts, + :gems, :plugin_manager, :theme + + attr_accessor :converters, :generators, :reader + attr_reader :regenerator, :liquid_renderer, :includes_load_paths + + # Public: Initialize a new Site. + # + # config - A Hash containing site configuration details. + def initialize(config) + # Source and destination may not be changed after the site has been created. + @source = File.expand_path(config["source"]).freeze + @dest = File.expand_path(config["destination"]).freeze + + self.config = config + + @reader = Reader.new(self) + @regenerator = Regenerator.new(self) + @liquid_renderer = LiquidRenderer.new(self) + + Jekyll.sites << self + + reset + setup + + Jekyll::Hooks.trigger :site, :after_init, self + end + + # Public: Set the site's configuration. This handles side-effects caused by + # changing values in the configuration. + # + # config - a Jekyll::Configuration, containing the new configuration. + # + # Returns the new configuration. + def config=(config) + @config = config.clone + + %w(safe lsi highlighter baseurl exclude include future unpublished + show_drafts limit_posts keep_files).each do |opt| + self.send("#{opt}=", config[opt]) + end + + # keep using `gems` to avoid breaking change + self.gems = config["plugins"] + + configure_plugins + configure_theme + configure_include_paths + configure_file_read_opts + + self.permalink_style = config["permalink"].to_sym + + @config + end + + # Public: Read, process, and write this Site to output. + # + # Returns nothing. + def process + reset + read + generate + render + cleanup + write + print_stats if config["profile"] + end + + def print_stats + puts @liquid_renderer.stats_table + end + + # Reset Site details. + # + # Returns nothing + def reset + self.time = if config["time"] + Utils.parse_date(config["time"].to_s, "Invalid time in _config.yml.") + else + Time.now + end + self.layouts = {} + self.pages = [] + self.static_files = [] + self.data = {} + @collections = nil + @regenerator.clear_cache + @liquid_renderer.reset + + if limit_posts < 0 + raise ArgumentError, "limit_posts must be a non-negative number" + end + + Jekyll::Hooks.trigger :site, :after_reset, self + end + + # Load necessary libraries, plugins, converters, and generators. + # + # Returns nothing. + def setup + ensure_not_in_dest + + plugin_manager.conscientious_require + + self.converters = instantiate_subclasses(Jekyll::Converter) + self.generators = instantiate_subclasses(Jekyll::Generator) + end + + # Check that the destination dir isn't the source dir or a directory + # parent to the source dir. + def ensure_not_in_dest + dest_pathname = Pathname.new(dest) + Pathname.new(source).ascend do |path| + if path == dest_pathname + raise Errors::FatalException, + "Destination directory cannot be or contain the Source directory." + end + end + end + + # The list of collections and their corresponding Jekyll::Collection instances. + # If config['collections'] is set, a new instance is created + # for each item in the collection, a new hash is returned otherwise. + # + # Returns a Hash containing collection name-to-instance pairs. + def collections + @collections ||= Hash[collection_names.map do |coll| + [coll, Jekyll::Collection.new(self, coll)] + end] + end + + # The list of collection names. + # + # Returns an array of collection names from the configuration, + # or an empty array if the `collections` key is not set. + def collection_names + case config["collections"] + when Hash + config["collections"].keys + when Array + config["collections"] + when nil + [] + else + raise ArgumentError, "Your `collections` key must be a hash or an array." + end + end + + # Read Site data from disk and load it into internal data structures. + # + # Returns nothing. + def read + reader.read + limit_posts! + Jekyll::Hooks.trigger :site, :post_read, self + end + + # Run each of the Generators. + # + # Returns nothing. + def generate + generators.each do |generator| + start = Time.now + generator.generate(self) + Jekyll.logger.debug "Generating:", + "#{generator.class} finished in #{Time.now - start} seconds." + end + end + + # Render the site to the destination. + # + # Returns nothing. + def render + relative_permalinks_are_deprecated + + payload = site_payload + + Jekyll::Hooks.trigger :site, :pre_render, self, payload + + render_docs(payload) + render_pages(payload) + + Jekyll::Hooks.trigger :site, :post_render, self, payload + end + + # Remove orphaned files and empty directories in destination. + # + # Returns nothing. + def cleanup + site_cleaner.cleanup! + end + + # Write static files, pages, and posts. + # + # Returns nothing. + def write + each_site_file do |item| + item.write(dest) if regenerator.regenerate?(item) + end + regenerator.write_metadata + Jekyll::Hooks.trigger :site, :post_write, self + end + + def posts + collections["posts"] ||= Collection.new(self, "posts") + end + + # Construct a Hash of Posts indexed by the specified Post attribute. + # + # post_attr - The String name of the Post attribute. + # + # Examples + # + # post_attr_hash('categories') + # # => { 'tech' => [, ], + # # 'ruby' => [] } + # + # Returns the Hash: { attr => posts } where + # attr - One of the values for the requested attribute. + # posts - The Array of Posts with the given attr value. + def post_attr_hash(post_attr) + # Build a hash map based on the specified post attribute ( post attr => + # array of posts ) then sort each array in reverse order. + hash = Hash.new { |h, key| h[key] = [] } + posts.docs.each do |p| + p.data[post_attr].each { |t| hash[t] << p } if p.data[post_attr] + end + hash.each_value { |posts| posts.sort!.reverse! } + hash + end + + def tags + post_attr_hash("tags") + end + + def categories + post_attr_hash("categories") + end + + # Prepare site data for site payload. The method maintains backward compatibility + # if the key 'data' is already used in _config.yml. + # + # Returns the Hash to be hooked to site.data. + def site_data + config["data"] || data + end + + # The Hash payload containing site-wide data. + # + # Returns the Hash: { "site" => data } where data is a Hash with keys: + # "time" - The Time as specified in the configuration or the + # current time if none was specified. + # "posts" - The Array of Posts, sorted chronologically by post date + # and then title. + # "pages" - The Array of all Pages. + # "html_pages" - The Array of HTML Pages. + # "categories" - The Hash of category values and Posts. + # See Site#post_attr_hash for type info. + # "tags" - The Hash of tag values and Posts. + # See Site#post_attr_hash for type info. + def site_payload + Drops::UnifiedPayloadDrop.new self + end + alias_method :to_liquid, :site_payload + + # Get the implementation class for the given Converter. + # Returns the Converter instance implementing the given Converter. + # klass - The Class of the Converter to fetch. + + def find_converter_instance(klass) + converters.find { |klass_| klass_.instance_of?(klass) } || \ + raise("No Converters found for #{klass}") + end + + # klass - class or module containing the subclasses. + # Returns array of instances of subclasses of parameter. + # Create array of instances of the subclasses of the class or module + # passed in as argument. + + def instantiate_subclasses(klass) + klass.descendants.select { |c| !safe || c.safe }.sort.map do |c| + c.new(config) + end + end + + # Warns the user if permanent links are relative to the parent + # directory. As this is a deprecated function of Jekyll. + # + # Returns + def relative_permalinks_are_deprecated + if config["relative_permalinks"] + Jekyll.logger.abort_with "Since v3.0, permalinks for pages" \ + " in subfolders must be relative to the" \ + " site source directory, not the parent" \ + " directory. Check https://jekyllrb.com/docs/upgrading/"\ + " for more info." + end + end + + # Get the to be written documents + # + # Returns an Array of Documents which should be written + def docs_to_write + documents.select(&:write?) + end + + # Get all the documents + # + # Returns an Array of all Documents + def documents + collections.reduce(Set.new) do |docs, (_, collection)| + docs + collection.docs + collection.files + end.to_a + end + + def each_site_file + %w(pages static_files docs_to_write).each do |type| + send(type).each do |item| + yield item + end + end + end + + # Returns the FrontmatterDefaults or creates a new FrontmatterDefaults + # if it doesn't already exist. + # + # Returns The FrontmatterDefaults + def frontmatter_defaults + @frontmatter_defaults ||= FrontmatterDefaults.new(self) + end + + # Whether to perform a full rebuild without incremental regeneration + # + # Returns a Boolean: true for a full rebuild, false for normal build + def incremental?(override = {}) + override["incremental"] || config["incremental"] + end + + # Returns the publisher or creates a new publisher if it doesn't + # already exist. + # + # Returns The Publisher + def publisher + @publisher ||= Publisher.new(self) + end + + # Public: Prefix a given path with the source directory. + # + # paths - (optional) path elements to a file or directory within the + # source directory + # + # Returns a path which is prefixed with the source directory. + def in_source_dir(*paths) + paths.reduce(source) do |base, path| + Jekyll.sanitized_path(base, path) + end + end + + # Public: Prefix a given path with the theme directory. + # + # paths - (optional) path elements to a file or directory within the + # theme directory + # + # Returns a path which is prefixed with the theme root directory. + def in_theme_dir(*paths) + return nil unless theme + paths.reduce(theme.root) do |base, path| + Jekyll.sanitized_path(base, path) + end + end + + # Public: Prefix a given path with the destination directory. + # + # paths - (optional) path elements to a file or directory within the + # destination directory + # + # Returns a path which is prefixed with the destination directory. + def in_dest_dir(*paths) + paths.reduce(dest) do |base, path| + Jekyll.sanitized_path(base, path) + end + end + + # Limits the current posts; removes the posts which exceed the limit_posts + # + # Returns nothing + private + def limit_posts! + if limit_posts > 0 + limit = posts.docs.length < limit_posts ? posts.docs.length : limit_posts + self.posts.docs = posts.docs[-limit, limit] + end + end + + # Returns the Cleaner or creates a new Cleaner if it doesn't + # already exist. + # + # Returns The Cleaner + private + def site_cleaner + @site_cleaner ||= Cleaner.new(self) + end + + private + def configure_plugins + self.plugin_manager = Jekyll::PluginManager.new(self) + self.plugins = plugin_manager.plugins_path + end + + private + def configure_theme + self.theme = nil + return if config["theme"].nil? + + self.theme = + if config["theme"].is_a?(String) + Jekyll::Theme.new(config["theme"]) + else + Jekyll.logger.warn "Theme:", "value of 'theme' in config should be " \ + "String to use gem-based themes, but got #{config["theme"].class}" + nil + end + end + + private + def configure_include_paths + @includes_load_paths = Array(in_source_dir(config["includes_dir"].to_s)) + @includes_load_paths << theme.includes_path if theme && theme.includes_path + end + + private + def configure_file_read_opts + self.file_read_opts = {} + self.file_read_opts[:encoding] = config["encoding"] if config["encoding"] + self.file_read_opts = Jekyll::Utils.merged_file_read_opts(self, {}) + end + + private + def render_docs(payload) + collections.each_value do |collection| + collection.docs.each do |document| + if regenerator.regenerate?(document) + document.output = Jekyll::Renderer.new(self, document, payload).run + document.trigger_hooks(:post_render) + end + end + end + end + + private + def render_pages(payload) + pages.flatten.each do |page| + if regenerator.regenerate?(page) + page.output = Jekyll::Renderer.new(self, page, payload).run + page.trigger_hooks(:post_render) + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/static_file.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/static_file.rb new file mode 100644 index 0000000..fd53710 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/static_file.rb @@ -0,0 +1,162 @@ +# frozen_string_literal: true + +module Jekyll + class StaticFile + extend Forwardable + + attr_reader :relative_path, :extname, :name, :data + + def_delegator :to_liquid, :to_json, :to_json + + class << self + # The cache of last modification times [path] -> mtime. + def mtimes + @mtimes ||= {} + end + + def reset_cache + @mtimes = nil + end + end + + # Initialize a new StaticFile. + # + # site - The Site. + # base - The String path to the . + # dir - The String path between and the file. + # name - The String filename of the file. + # rubocop: disable ParameterLists + def initialize(site, base, dir, name, collection = nil) + @site = site + @base = base + @dir = dir + @name = name + @collection = collection + @relative_path = File.join(*[@dir, @name].compact) + @extname = File.extname(@name) + @data = @site.frontmatter_defaults.all(relative_path, type) + end + # rubocop: enable ParameterLists + + # Returns source file path. + def path + File.join(*[@base, @dir, @name].compact) + end + + # Obtain destination path. + # + # dest - The String path to the destination dir. + # + # Returns destination file path. + def destination(dest) + @site.in_dest_dir(*[dest, destination_rel_dir, @name].compact) + end + + def destination_rel_dir + if @collection + File.dirname(url) + else + @dir + end + end + + def modified_time + @modified_time ||= File.stat(path).mtime + end + + # Returns last modification time for this file. + def mtime + modified_time.to_i + end + + # Is source path modified? + # + # Returns true if modified since last write. + def modified? + self.class.mtimes[path] != mtime + end + + # Whether to write the file to the filesystem + # + # Returns true unless the defaults for the destination path from + # _config.yml contain `published: false`. + def write? + defaults.fetch("published", true) + end + + # Write the static file to the destination directory (if modified). + # + # dest - The String path to the destination dir. + # + # Returns false if the file was not modified since last time (no-op). + def write(dest) + dest_path = destination(dest) + + return false if File.exist?(dest_path) && !modified? + self.class.mtimes[path] = mtime + + FileUtils.mkdir_p(File.dirname(dest_path)) + FileUtils.rm(dest_path) if File.exist?(dest_path) + copy_file(dest_path) + + true + end + + def to_liquid + @to_liquid ||= Drops::StaticFileDrop.new(self) + end + + def basename + File.basename(name, extname) + end + + def placeholders + { + :collection => @collection.label, + :path => relative_path[ + @collection.relative_directory.size..relative_path.size], + :output_ext => "", + :name => "", + :title => "", + } + end + + # Applies a similar URL-building technique as Jekyll::Document that takes + # the collection's URL template into account. The default URL template can + # be overriden in the collection's configuration in _config.yml. + def url + @url ||= if @collection.nil? + relative_path + else + ::Jekyll::URL.new({ + :template => @collection.url_template, + :placeholders => placeholders, + }) + end.to_s.gsub(%r!/$!, "") + end + + # Returns the type of the collection if present, nil otherwise. + def type + @type ||= @collection.nil? ? nil : @collection.label.to_sym + end + + # Returns the front matter defaults defined for the file's URL and/or type + # as defined in _config.yml. + def defaults + @defaults ||= @site.frontmatter_defaults.all url, type + end + + private + def copy_file(dest_path) + if @site.safe || Jekyll.env == "production" + FileUtils.cp(path, dest_path) + else + FileUtils.copy_entry(path, dest_path) + end + + unless File.symlink?(dest_path) + File.utime(self.class.mtimes[path], self.class.mtimes[path], dest_path) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/stevenson.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/stevenson.rb new file mode 100644 index 0000000..bbec661 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/stevenson.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +module Jekyll + class Stevenson < ::Logger + def initialize + @progname = nil + @level = DEBUG + @default_formatter = Formatter.new + @logdev = $stdout + @formatter = proc do |_, _, _, msg| + msg.to_s + end + end + + def add(severity, message = nil, progname = nil) + severity ||= UNKNOWN + @logdev = logdevice(severity) + + if @logdev.nil? || severity < @level + return true + end + progname ||= @progname + if message.nil? + if block_given? + message = yield + else + message = progname + progname = @progname + end + end + @logdev.puts( + format_message(format_severity(severity), Time.now, progname, message) + ) + true + end + + # Log a +WARN+ message + def warn(progname = nil, &block) + add(WARN, nil, progname.yellow, &block) + end + + # Log an +ERROR+ message + def error(progname = nil, &block) + add(ERROR, nil, progname.red, &block) + end + + def close + # No LogDevice in use + end + + private + + def logdevice(severity) + if severity > INFO + $stderr + else + $stdout + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/highlight.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/highlight.rb new file mode 100644 index 0000000..256342c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/highlight.rb @@ -0,0 +1,141 @@ +# frozen_string_literal: true + +module Jekyll + module Tags + class HighlightBlock < Liquid::Block + include Liquid::StandardFilters + + # The regular expression syntax checker. Start with the language specifier. + # Follow that by zero or more space separated options that take one of three + # forms: name, name=value, or name="" + # + # is a space-separated list of numbers + SYNTAX = %r!^([a-zA-Z0-9.+#_-]+)((\s+\w+(=(\w+|"([0-9]+\s)*[0-9]+"))?)*)$! + + def initialize(tag_name, markup, tokens) + super + if markup.strip =~ SYNTAX + @lang = Regexp.last_match(1).downcase + @highlight_options = parse_options(Regexp.last_match(2)) + else + raise SyntaxError, <<-MSG +Syntax Error in tag 'highlight' while parsing the following markup: + + #{markup} + +Valid syntax: highlight [linenos] +MSG + end + end + + def render(context) + prefix = context["highlighter_prefix"] || "" + suffix = context["highlighter_suffix"] || "" + code = super.to_s.gsub(%r!\A(\n|\r)+|(\n|\r)+\z!, "") + + is_safe = !!context.registers[:site].safe + + output = + case context.registers[:site].highlighter + when "pygments" + render_pygments(code, is_safe) + when "rouge" + render_rouge(code) + else + render_codehighlighter(code) + end + + rendered_output = add_code_tag(output) + prefix + rendered_output + suffix + end + + def sanitized_opts(opts, is_safe) + if is_safe + Hash[[ + [:startinline, opts.fetch(:startinline, nil)], + [:hl_lines, opts.fetch(:hl_lines, nil)], + [:linenos, opts.fetch(:linenos, nil)], + [:encoding, opts.fetch(:encoding, "utf-8")], + [:cssclass, opts.fetch(:cssclass, nil)], + ].reject { |f| f.last.nil? }] + else + opts + end + end + + private + + def parse_options(input) + options = {} + unless input.empty? + # Split along 3 possible forms -- key="", key=value, or key + input.scan(%r!(?:\w="[^"]*"|\w=\w|\w)+!) do |opt| + key, value = opt.split("=") + # If a quoted list, convert to array + if value && value.include?("\"") + value.delete!('"') + value = value.split + end + options[key.to_sym] = value || true + end + end + if options.key?(:linenos) && options[:linenos] == true + options[:linenos] = "inline" + end + options + end + + def render_pygments(code, is_safe) + Jekyll::External.require_with_graceful_fail("pygments") unless defined?(Pygments) + + highlighted_code = Pygments.highlight( + code, + :lexer => @lang, + :options => sanitized_opts(@highlight_options, is_safe) + ) + + if highlighted_code.nil? + Jekyll.logger.error <<-MSG +There was an error highlighting your code: + +#{code} + +While attempting to convert the above code, Pygments.rb returned an unacceptable value. +This is usually a timeout problem solved by running `jekyll build` again. +MSG + raise ArgumentError, "Pygments.rb returned an unacceptable value "\ + "when attempting to highlight some code." + end + + highlighted_code.sub('
      ', "").sub("
      ", "") + end + + def render_rouge(code) + formatter = Jekyll::Utils::Rouge.html_formatter( + :line_numbers => @highlight_options[:linenos], + :wrap => false, + :css_class => "highlight", + :gutter_class => "gutter", + :code_class => "code" + ) + lexer = ::Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText + formatter.format(lexer.lex(code)) + end + + def render_codehighlighter(code) + h(code).strip + end + + def add_code_tag(code) + code_attributes = [ + "class=\"language-#{@lang.to_s.tr("+", "-")}\"", + "data-lang=\"#{@lang}\"", + ].join(" ") + "
      "\
      +        "#{code.chomp}
      " + end + end + end +end + +Liquid::Template.register_tag("highlight", Jekyll::Tags::HighlightBlock) diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/include.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/include.rb new file mode 100644 index 0000000..e746478 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/include.rb @@ -0,0 +1,215 @@ +# frozen_string_literal: true + +module Jekyll + module Tags + class IncludeTagError < StandardError + attr_accessor :path + + def initialize(msg, path) + super(msg) + @path = path + end + end + + class IncludeTag < Liquid::Tag + VALID_SYNTAX = %r! + ([\w-]+)\s*=\s* + (?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+)) + !x + VARIABLE_SYNTAX = %r! + (?[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+) + (?.*) + !x + + def initialize(tag_name, markup, tokens) + super + matched = markup.strip.match(VARIABLE_SYNTAX) + if matched + @file = matched["variable"].strip + @params = matched["params"].strip + else + @file, @params = markup.strip.split(%r!\s+!, 2) + end + validate_params if @params + @tag_name = tag_name + end + + def syntax_example + "{% #{@tag_name} file.ext param='value' param2='value' %}" + end + + def parse_params(context) + params = {} + markup = @params + + while (match = VALID_SYNTAX.match(markup)) + markup = markup[match.end(0)..-1] + + value = if match[2] + match[2].gsub(%r!\\"!, '"') + elsif match[3] + match[3].gsub(%r!\\'!, "'") + elsif match[4] + context[match[4]] + end + + params[match[1]] = value + end + params + end + + def validate_file_name(file) + if file !~ %r!^[a-zA-Z0-9_/\.-]+$! || file =~ %r!\./! || file =~ %r!/\.! + raise ArgumentError, <<-MSG +Invalid syntax for include tag. File contains invalid characters or sequences: + + #{file} + +Valid syntax: + + #{syntax_example} + +MSG + end + end + + def validate_params + full_valid_syntax = %r!\A\s*(?:#{VALID_SYNTAX}(?=\s|\z)\s*)*\z! + unless @params =~ full_valid_syntax + raise ArgumentError, <<-MSG +Invalid syntax for include tag: + + #{@params} + +Valid syntax: + + #{syntax_example} + +MSG + end + end + + # Grab file read opts in the context + def file_read_opts(context) + context.registers[:site].file_read_opts + end + + # Render the variable if required + def render_variable(context) + if @file.match(VARIABLE_SYNTAX) + partial = context.registers[:site] + .liquid_renderer + .file("(variable)") + .parse(@file) + partial.render!(context) + end + end + + def tag_includes_dirs(context) + context.registers[:site].includes_load_paths.freeze + end + + def locate_include_file(context, file, safe) + includes_dirs = tag_includes_dirs(context) + includes_dirs.each do |dir| + path = File.join(dir.to_s, file.to_s) + return path if valid_include_file?(path, dir.to_s, safe) + end + raise IOError, "Could not locate the included file '#{file}' in any of "\ + "#{includes_dirs}. Ensure it exists in one of those directories and, "\ + "if it is a symlink, does not point outside your site source." + end + + def render(context) + site = context.registers[:site] + + file = render_variable(context) || @file + validate_file_name(file) + + path = locate_include_file(context, file, site.safe) + return unless path + + add_include_to_dependency(site, path, context) + + partial = load_cached_partial(path, context) + + context.stack do + context["include"] = parse_params(context) if @params + begin + partial.render!(context) + rescue Liquid::Error => e + e.template_name = path + e.markup_context = "included " if e.markup_context.nil? + raise e + end + end + end + + def add_include_to_dependency(site, path, context) + if context.registers[:page] && context.registers[:page].key?("path") + site.regenerator.add_dependency( + site.in_source_dir(context.registers[:page]["path"]), + path + ) + end + end + + def load_cached_partial(path, context) + context.registers[:cached_partials] ||= {} + cached_partial = context.registers[:cached_partials] + + if cached_partial.key?(path) + cached_partial[path] + else + unparsed_file = context.registers[:site] + .liquid_renderer + .file(path) + begin + cached_partial[path] = unparsed_file.parse(read_file(path, context)) + rescue Liquid::Error => e + e.template_name = path + e.markup_context = "included " if e.markup_context.nil? + raise e + end + end + end + + def valid_include_file?(path, dir, safe) + !outside_site_source?(path, dir, safe) && File.file?(path) + end + + def outside_site_source?(path, dir, safe) + safe && !realpath_prefixed_with?(path, dir) + end + + def realpath_prefixed_with?(path, dir) + File.exist?(path) && File.realpath(path).start_with?(dir) + rescue StandardError + false + end + + # This method allows to modify the file content by inheriting from the class. + def read_file(file, context) + File.read(file, file_read_opts(context)) + end + end + + class IncludeRelativeTag < IncludeTag + def tag_includes_dirs(context) + Array(page_path(context)).freeze + end + + def page_path(context) + if context.registers[:page].nil? + context.registers[:site].source + else + current_doc_dir = File.dirname(context.registers[:page]["path"]) + context.registers[:site].in_source_dir current_doc_dir + end + end + end + end +end + +Liquid::Template.register_tag("include", Jekyll::Tags::IncludeTag) +Liquid::Template.register_tag("include_relative", Jekyll::Tags::IncludeRelativeTag) diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/link.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/link.rb new file mode 100644 index 0000000..b3f5a2a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/link.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module Jekyll + module Tags + class Link < Liquid::Tag + class << self + def tag_name + self.name.split("::").last.downcase + end + end + + def initialize(tag_name, relative_path, tokens) + super + + @relative_path = relative_path.strip + end + + def render(context) + site = context.registers[:site] + + site.each_site_file do |item| + return item.url if item.relative_path == @relative_path + # This takes care of the case for static files that have a leading / + return item.url if item.relative_path == "/#{@relative_path}" + end + + raise ArgumentError, <<-MSG +Could not find document '#{@relative_path}' in tag '#{self.class.tag_name}'. + +Make sure the document exists and the path is correct. +MSG + end + end + end +end + +Liquid::Template.register_tag(Jekyll::Tags::Link.tag_name, Jekyll::Tags::Link) diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/post_url.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/post_url.rb new file mode 100644 index 0000000..db0b3fa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/tags/post_url.rb @@ -0,0 +1,103 @@ +# frozen_string_literal: true + +module Jekyll + module Tags + class PostComparer + MATCHER = %r!^(.+/)*(\d+-\d+-\d+)-(.*)$! + + attr_reader :path, :date, :slug, :name + + def initialize(name) + @name = name + + all, @path, @date, @slug = *name.sub(%r!^/!, "").match(MATCHER) + unless all + raise Jekyll::Errors::InvalidPostNameError, + "'#{name}' does not contain valid date and/or title." + end + + escaped_slug = Regexp.escape(slug) + @name_regex = %r!^_posts/#{path}#{date}-#{escaped_slug}\.[^.]+| + ^#{path}_posts/?#{date}-#{escaped_slug}\.[^.]+!x + end + + def post_date + @post_date ||= Utils.parse_date(date, + "\"#{date}\" does not contain valid date and/or title.") + end + + def ==(other) + other.relative_path.match(@name_regex) + end + + def deprecated_equality(other) + slug == post_slug(other) && + post_date.year == other.date.year && + post_date.month == other.date.month && + post_date.day == other.date.day + end + + private + # Construct the directory-aware post slug for a Jekyll::Post + # + # other - the Jekyll::Post + # + # Returns the post slug with the subdirectory (relative to _posts) + def post_slug(other) + path = other.basename.split("/")[0...-1].join("/") + if path.nil? || path == "" + other.data["slug"] + else + path + "/" + other.data["slug"] + end + end + end + + class PostUrl < Liquid::Tag + def initialize(tag_name, post, tokens) + super + @orig_post = post.strip + begin + @post = PostComparer.new(@orig_post) + rescue StandardError => e + raise Jekyll::Errors::PostURLError, <<-MSG +Could not parse name of post "#{@orig_post}" in tag 'post_url'. + +Make sure the post exists and the name is correct. + +#{e.class}: #{e.message} +MSG + end + end + + def render(context) + site = context.registers[:site] + + site.posts.docs.each do |p| + return p.url if @post == p + end + + # New matching method did not match, fall back to old method + # with deprecation warning if this matches + + site.posts.docs.each do |p| + next unless @post.deprecated_equality p + Jekyll::Deprecator.deprecation_message "A call to "\ + "'{% post_url #{@post.name} %}' did not match " \ + "a post using the new matching method of checking name " \ + "(path-date-slug) equality. Please make sure that you " \ + "change this tag to match the post's name exactly." + return p.url + end + + raise Jekyll::Errors::PostURLError, <<-MSG +Could not find post "#{@orig_post}" in tag 'post_url'. + +Make sure the post exists and the name is correct. +MSG + end + end + end +end + +Liquid::Template.register_tag("post_url", Jekyll::Tags::PostUrl) diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/theme.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/theme.rb new file mode 100644 index 0000000..edd041e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/theme.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +module Jekyll + class Theme + extend Forwardable + attr_reader :name + def_delegator :gemspec, :version, :version + + def initialize(name) + @name = name.downcase.strip + configure_sass + end + + def root + # Must use File.realpath to resolve symlinks created by rbenv + # Otherwise, Jekyll.sanitized path with prepend the unresolved root + @root ||= File.realpath(gemspec.full_gem_path) + rescue Errno::ENOENT, Errno::EACCES, Errno::ELOOP + raise "Path #{gemspec.full_gem_path} does not exist, is not accessible "\ + "or includes a symbolic link loop" + end + + def includes_path + path_for "_includes".freeze + end + + def layouts_path + path_for "_layouts".freeze + end + + def sass_path + path_for "_sass".freeze + end + + def assets_path + path_for "assets".freeze + end + + def configure_sass + return unless sass_path + Jekyll::External.require_with_graceful_fail "sass" + Sass.load_paths << sass_path + end + + def runtime_dependencies + gemspec.runtime_dependencies + end + + private + + def path_for(folder) + path = realpath_for(folder) + path if path && File.directory?(path) + end + + def realpath_for(folder) + File.realpath(Jekyll.sanitized_path(root, folder.to_s)) + rescue Errno::ENOENT, Errno::EACCES, Errno::ELOOP + nil + end + + def gemspec + @gemspec ||= Gem::Specification.find_by_name(name) + rescue Gem::LoadError + raise Jekyll::Errors::MissingDependencyException, + "The #{name} theme could not be found." + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/theme_builder.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/theme_builder.rb new file mode 100644 index 0000000..9b43e0a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/theme_builder.rb @@ -0,0 +1,119 @@ +# frozen_string_literal: true + +class Jekyll::ThemeBuilder + SCAFFOLD_DIRECTORIES = %w( + assets _layouts _includes _sass + ).freeze + + attr_reader :name, :path, :code_of_conduct + + def initialize(theme_name, opts) + @name = theme_name.to_s.tr(" ", "_").gsub(%r!_+!, "_") + @path = Pathname.new(File.expand_path(name, Dir.pwd)) + @code_of_conduct = !!opts["code_of_conduct"] + end + + def create! + create_directories + create_starter_files + create_gemspec + create_accessories + initialize_git_repo + end + + def user_name + @user_name ||= `git config user.name`.chomp + end + + def user_email + @user_email ||= `git config user.email`.chomp + end + + private + + def root + @root ||= Pathname.new(File.expand_path("../", __dir__)) + end + + def template_file(filename) + [ + root.join("theme_template", "#{filename}.erb"), + root.join("theme_template", filename.to_s), + ].find(&:exist?) + end + + def template(filename) + erb.render(template_file(filename).read) + end + + def erb + @erb ||= ERBRenderer.new(self) + end + + def mkdir_p(directories) + Array(directories).each do |directory| + full_path = path.join(directory) + Jekyll.logger.info "create", full_path.to_s + FileUtils.mkdir_p(full_path) + end + end + + def write_file(filename, contents) + full_path = path.join(filename) + Jekyll.logger.info "create", full_path.to_s + File.write(full_path, contents) + end + + def create_directories + mkdir_p(SCAFFOLD_DIRECTORIES) + end + + def create_starter_files + %w(page post default).each do |layout| + write_file("_layouts/#{layout}.html", template("_layouts/#{layout}.html")) + end + end + + def create_gemspec + write_file("Gemfile", template("Gemfile")) + write_file("#{name}.gemspec", template("theme.gemspec")) + end + + def create_accessories + accessories = %w(README.md LICENSE.txt) + accessories << "CODE_OF_CONDUCT.md" if code_of_conduct + accessories.each do |filename| + write_file(filename, template(filename)) + end + end + + def initialize_git_repo + Jekyll.logger.info "initialize", path.join(".git").to_s + Dir.chdir(path.to_s) { `git init` } + write_file(".gitignore", template("gitignore")) + end + + class ERBRenderer + extend Forwardable + + def_delegator :@theme_builder, :name, :theme_name + def_delegator :@theme_builder, :user_name, :user_name + def_delegator :@theme_builder, :user_email, :user_email + + def initialize(theme_builder) + @theme_builder = theme_builder + end + + def jekyll_version_with_minor + Jekyll::VERSION.split(".").take(2).join(".") + end + + def theme_directories + SCAFFOLD_DIRECTORIES + end + + def render(contents) + ERB.new(contents).result binding + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/url.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/url.rb new file mode 100644 index 0000000..f915785 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/url.rb @@ -0,0 +1,161 @@ +# frozen_string_literal: true + +require "addressable/uri" + +# Public: Methods that generate a URL for a resource such as a Post or a Page. +# +# Examples +# +# URL.new({ +# :template => /:categories/:title.html", +# :placeholders => {:categories => "ruby", :title => "something"} +# }).to_s +# +module Jekyll + class URL + # options - One of :permalink or :template must be supplied. + # :template - The String used as template for URL generation, + # for example "/:path/:basename:output_ext", where + # a placeholder is prefixed with a colon. + # :placeholders - A hash containing the placeholders which will be + # replaced when used inside the template. E.g. + # { "year" => Time.now.strftime("%Y") } would replace + # the placeholder ":year" with the current year. + # :permalink - If supplied, no URL will be generated from the + # template. Instead, the given permalink will be + # used as URL. + def initialize(options) + @template = options[:template] + @placeholders = options[:placeholders] || {} + @permalink = options[:permalink] + + if (@template || @permalink).nil? + raise ArgumentError, "One of :template or :permalink must be supplied." + end + end + + # The generated relative URL of the resource + # + # Returns the String URL + def to_s + sanitize_url(generated_permalink || generated_url) + end + + # Generates a URL from the permalink + # + # Returns the _unsanitized String URL + def generated_permalink + (@generated_permalink ||= generate_url(@permalink)) if @permalink + end + + # Generates a URL from the template + # + # Returns the unsanitized String URL + def generated_url + @generated_url ||= generate_url(@template) + end + + # Internal: Generate the URL by replacing all placeholders with their + # respective values in the given template + # + # Returns the unsanitized String URL + def generate_url(template) + if @placeholders.is_a? Drops::UrlDrop + generate_url_from_drop(template) + else + generate_url_from_hash(template) + end + end + + def generate_url_from_hash(template) + @placeholders.inject(template) do |result, token| + break result if result.index(":").nil? + if token.last.nil? + # Remove leading "/" to avoid generating urls with `//` + result.gsub(%r!/:#{token.first}!, "") + else + result.gsub(%r!:#{token.first}!, self.class.escape_path(token.last)) + end + end + end + + # We include underscores in keys to allow for 'i_month' and so forth. + # This poses a problem for keys which are followed by an underscore + # but the underscore is not part of the key, e.g. '/:month_:day'. + # That should be :month and :day, but our key extraction regexp isn't + # smart enough to know that so we have to make it an explicit + # possibility. + def possible_keys(key) + if key.end_with?("_") + [key, key.chomp("_")] + else + [key] + end + end + + def generate_url_from_drop(template) + template.gsub(%r!:([a-z_]+)!) do |match| + pool = possible_keys(match.sub(":", "")) + + winner = pool.find { |key| @placeholders.key?(key) } + if winner.nil? + raise NoMethodError, + "The URL template doesn't have #{pool.join(" or ")} keys. "\ + "Check your permalink template!" + end + + value = @placeholders[winner] + value = "" if value.nil? + replacement = self.class.escape_path(value) + + match.sub(":#{winner}", replacement) + end.gsub(%r!//!, "/".freeze) + end + + # Returns a sanitized String URL, stripping "../../" and multiples of "/", + # as well as the beginning "/" so we can enforce and ensure it. + + def sanitize_url(str) + "/" + str.gsub(%r!/{2,}!, "/").gsub(%r!\.+/|\A/+!, "") + end + + # Escapes a path to be a valid URL path segment + # + # path - The path to be escaped. + # + # Examples: + # + # URL.escape_path("/a b") + # # => "/a%20b" + # + # Returns the escaped path. + def self.escape_path(path) + # Because URI.escape doesn't escape "?", "[" and "]" by default, + # specify unsafe string (except unreserved, sub-delims, ":", "@" and "/"). + # + # URI path segment is defined in RFC 3986 as follows: + # segment = *pchar + # pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + # pct-encoded = "%" HEXDIG HEXDIG + # sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + # / "*" / "+" / "," / ";" / "=" + path = Addressable::URI.encode(path) + path.encode("utf-8").sub("#", "%23") + end + + # Unescapes a URL path segment + # + # path - The path to be unescaped. + # + # Examples: + # + # URL.unescape_path("/a%20b") + # # => "/a b" + # + # Returns the unescaped path. + def self.unescape_path(path) + Addressable::URI.unencode(path.encode("utf-8")) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils.rb new file mode 100644 index 0000000..1d3cb9c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils.rb @@ -0,0 +1,359 @@ +# frozen_string_literal: true + +module Jekyll + module Utils + extend self + autoload :Ansi, "jekyll/utils/ansi" + autoload :Exec, "jekyll/utils/exec" + autoload :Internet, "jekyll/utils/internet" + autoload :Platforms, "jekyll/utils/platforms" + autoload :Rouge, "jekyll/utils/rouge" + autoload :ThreadEvent, "jekyll/utils/thread_event" + autoload :WinTZ, "jekyll/utils/win_tz" + + # Constants for use in #slugify + SLUGIFY_MODES = %w(raw default pretty ascii latin).freeze + SLUGIFY_RAW_REGEXP = Regexp.new('\\s+').freeze + SLUGIFY_DEFAULT_REGEXP = Regexp.new("[^[:alnum:]]+").freeze + SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze + SLUGIFY_ASCII_REGEXP = Regexp.new("[^[A-Za-z0-9]]+").freeze + + # Takes an indented string and removes the preceding spaces on each line + + def strip_heredoc(str) + str.gsub(%r!^[ \t]{#{(str.scan(%r!^[ \t]*(?=\S)!).min || "").size}}!, "") + end + + # Takes a slug and turns it into a simple title. + + def titleize_slug(slug) + slug.split("-").map!(&:capitalize).join(" ") + end + + # Non-destructive version of deep_merge_hashes! See that method. + # + # Returns the merged hashes. + def deep_merge_hashes(master_hash, other_hash) + deep_merge_hashes!(master_hash.dup, other_hash) + end + + # Merges a master hash with another hash, recursively. + # + # master_hash - the "parent" hash whose values will be overridden + # other_hash - the other hash whose values will be persisted after the merge + # + # This code was lovingly stolen from some random gem: + # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html + # + # Thanks to whoever made it. + def deep_merge_hashes!(target, overwrite) + merge_values(target, overwrite) + merge_default_proc(target, overwrite) + duplicate_frozen_values(target) + + target + end + + def mergable?(value) + value.is_a?(Hash) || value.is_a?(Drops::Drop) + end + + def duplicable?(obj) + case obj + when nil, false, true, Symbol, Numeric + false + else + true + end + end + + # Read array from the supplied hash favouring the singular key + # and then the plural key, and handling any nil entries. + # + # hash - the hash to read from + # singular_key - the singular key + # plural_key - the plural key + # + # Returns an array + def pluralized_array_from_hash(hash, singular_key, plural_key) + [].tap do |array| + value = value_from_singular_key(hash, singular_key) + value ||= value_from_plural_key(hash, plural_key) + array << value + end.flatten.compact + end + + def value_from_singular_key(hash, key) + hash[key] if hash.key?(key) || (hash.default_proc && hash[key]) + end + + def value_from_plural_key(hash, key) + if hash.key?(key) || (hash.default_proc && hash[key]) + val = hash[key] + case val + when String + val.split + when Array + val.compact + end + end + end + + def transform_keys(hash) + result = {} + hash.each_key do |key| + result[yield(key)] = hash[key] + end + result + end + + # Apply #to_sym to all keys in the hash + # + # hash - the hash to which to apply this transformation + # + # Returns a new hash with symbolized keys + def symbolize_hash_keys(hash) + transform_keys(hash) { |key| key.to_sym rescue key } + end + + # Apply #to_s to all keys in the Hash + # + # hash - the hash to which to apply this transformation + # + # Returns a new hash with stringified keys + def stringify_hash_keys(hash) + transform_keys(hash) { |key| key.to_s rescue key } + end + + # Parse a date/time and throw an error if invalid + # + # input - the date/time to parse + # msg - (optional) the error message to show the user + # + # Returns the parsed date if successful, throws a FatalException + # if not + def parse_date(input, msg = "Input could not be parsed.") + Time.parse(input).localtime + rescue ArgumentError + raise Errors::InvalidDateError, "Invalid date '#{input}': #{msg}" + end + + # Determines whether a given file has + # + # Returns true if the YAML front matter is present. + # rubocop: disable PredicateName + def has_yaml_header?(file) + !!(File.open(file, "rb", &:readline) =~ %r!\A---\s*\r?\n!) + rescue EOFError + false + end + # rubocop: enable PredicateName + + # Slugify a filename or title. + # + # string - the filename or title to slugify + # mode - how string is slugified + # cased - whether to replace all uppercase letters with their + # lowercase counterparts + # + # When mode is "none", return the given string. + # + # When mode is "raw", return the given string, + # with every sequence of spaces characters replaced with a hyphen. + # + # When mode is "default" or nil, non-alphabetic characters are + # replaced with a hyphen too. + # + # When mode is "pretty", some non-alphabetic characters (._~!$&'()+,;=@) + # are not replaced with hyphen. + # + # When mode is "ascii", some everything else except ASCII characters + # a-z (lowercase), A-Z (uppercase) and 0-9 (numbers) are not replaced with hyphen. + # + # When mode is "latin", the input string is first preprocessed so that + # any letters with accents are replaced with the plain letter. Afterwards, + # it follows the "default" mode of operation. + # + # If cased is true, all uppercase letters in the result string are + # replaced with their lowercase counterparts. + # + # Examples: + # slugify("The _config.yml file") + # # => "the-config-yml-file" + # + # slugify("The _config.yml file", "pretty") + # # => "the-_config.yml-file" + # + # slugify("The _config.yml file", "pretty", true) + # # => "The-_config.yml file" + # + # slugify("The _config.yml file", "ascii") + # # => "the-config-yml-file" + # + # slugify("The _config.yml file", "latin") + # # => "the-config-yml-file" + # + # Returns the slugified string. + def slugify(string, mode: nil, cased: false) + mode ||= "default" + return nil if string.nil? + + unless SLUGIFY_MODES.include?(mode) + return cased ? string : string.downcase + end + + # Drop accent marks from latin characters. Everything else turns to ? + string = ::I18n.transliterate(string) if mode == "latin" + + slug = replace_character_sequence_with_hyphen(string, :mode => mode) + + # Remove leading/trailing hyphen + slug.gsub!(%r!^\-|\-$!i, "") + + slug.downcase! unless cased + slug + end + + # Add an appropriate suffix to template so that it matches the specified + # permalink style. + # + # template - permalink template without trailing slash or file extension + # permalink_style - permalink style, either built-in or custom + # + # The returned permalink template will use the same ending style as + # specified in permalink_style. For example, if permalink_style contains a + # trailing slash (or is :pretty, which indirectly has a trailing slash), + # then so will the returned template. If permalink_style has a trailing + # ":output_ext" (or is :none, :date, or :ordinal) then so will the returned + # template. Otherwise, template will be returned without modification. + # + # Examples: + # add_permalink_suffix("/:basename", :pretty) + # # => "/:basename/" + # + # add_permalink_suffix("/:basename", :date) + # # => "/:basename:output_ext" + # + # add_permalink_suffix("/:basename", "/:year/:month/:title/") + # # => "/:basename/" + # + # add_permalink_suffix("/:basename", "/:year/:month/:title") + # # => "/:basename" + # + # Returns the updated permalink template + def add_permalink_suffix(template, permalink_style) + template = template.dup + + case permalink_style + when :pretty + template << "/" + when :date, :ordinal, :none + template << ":output_ext" + else + template << "/" if permalink_style.to_s.end_with?("/") + template << ":output_ext" if permalink_style.to_s.end_with?(":output_ext") + end + + template + end + + # Work the same way as Dir.glob but seperating the input into two parts + # ('dir' + '/' + 'pattern') to make sure the first part('dir') does not act + # as a pattern. + # + # For example, Dir.glob("path[/*") always returns an empty array, + # because the method fails to find the closing pattern to '[' which is ']' + # + # Examples: + # safe_glob("path[", "*") + # # => ["path[/file1", "path[/file2"] + # + # safe_glob("path", "*", File::FNM_DOTMATCH) + # # => ["path/.", "path/..", "path/file1"] + # + # safe_glob("path", ["**", "*"]) + # # => ["path[/file1", "path[/folder/file2"] + # + # dir - the dir where glob will be executed under + # (the dir will be included to each result) + # patterns - the patterns (or the pattern) which will be applied under the dir + # flags - the flags which will be applied to the pattern + # + # Returns matched pathes + def safe_glob(dir, patterns, flags = 0) + return [] unless Dir.exist?(dir) + pattern = File.join(Array(patterns)) + return [dir] if pattern.empty? + Dir.chdir(dir) do + Dir.glob(pattern, flags).map { |f| File.join(dir, f) } + end + end + + # Returns merged option hash for File.read of self.site (if exists) + # and a given param + def merged_file_read_opts(site, opts) + merged = (site ? site.file_read_opts : {}).merge(opts) + if merged[:encoding] && !merged[:encoding].start_with?("bom|") + merged[:encoding] = "bom|#{merged[:encoding]}" + end + if merged["encoding"] && !merged["encoding"].start_with?("bom|") + merged["encoding"] = "bom|#{merged["encoding"]}" + end + merged + end + + private + def merge_values(target, overwrite) + target.merge!(overwrite) do |_key, old_val, new_val| + if new_val.nil? + old_val + elsif mergable?(old_val) && mergable?(new_val) + deep_merge_hashes(old_val, new_val) + else + new_val + end + end + end + + private + def merge_default_proc(target, overwrite) + if target.is_a?(Hash) && overwrite.is_a?(Hash) && target.default_proc.nil? + target.default_proc = overwrite.default_proc + end + end + + private + def duplicate_frozen_values(target) + target.each do |key, val| + target[key] = val.dup if val.frozen? && duplicable?(val) + end + end + + # Replace each character sequence with a hyphen. + # + # See Utils#slugify for a description of the character sequence specified + # by each mode. + private + def replace_character_sequence_with_hyphen(string, mode: "default") + replaceable_char = + case mode + when "raw" + SLUGIFY_RAW_REGEXP + when "pretty" + # "._~!$&'()+,;=@" is human readable (not URI-escaped) in URL + # and is allowed in both extN and NTFS. + SLUGIFY_PRETTY_REGEXP + when "ascii" + # For web servers not being able to handle Unicode, the safe + # method is to ditch anything else but latin letters and numeric + # digits. + SLUGIFY_ASCII_REGEXP + else + SLUGIFY_DEFAULT_REGEXP + end + + # Strip according to the mode + string.gsub(replaceable_char, "-") + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/ansi.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/ansi.rb new file mode 100644 index 0000000..b680528 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/ansi.rb @@ -0,0 +1,57 @@ +# Frozen-string-literal: true + +module Jekyll + module Utils + module Ansi + extend self + + ESCAPE = format("%c", 27) + MATCH = %r!#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m!ix + COLORS = { + :red => 31, + :green => 32, + :black => 30, + :magenta => 35, + :yellow => 33, + :white => 37, + :blue => 34, + :cyan => 36, + }.freeze + + # Strip ANSI from the current string. It also strips cursor stuff, + # well some of it, and it also strips some other stuff that a lot of + # the other ANSI strippers don't. + + def strip(str) + str.gsub MATCH, "" + end + + # + + def has?(str) + !!(str =~ MATCH) + end + + # Reset the color back to the default color so that you do not leak any + # colors when you move onto the next line. This is probably normally + # used as part of a wrapper so that we don't leak colors. + + def reset(str = "") + @ansi_reset ||= format("%c[0m", 27) + "#{@ansi_reset}#{str}" + end + + # SEE: `self::COLORS` for a list of methods. They are mostly + # standard base colors supported by pretty much any xterm-color, we do + # not need more than the base colors so we do not include them. + # Actually... if I'm honest we don't even need most of the + # base colors. + + COLORS.each do |color, num| + define_method color do |str| + "#{format("%c", 27)}[#{num}m#{str}#{reset}" + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/exec.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/exec.rb new file mode 100644 index 0000000..fee8b2d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/exec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require "open3" + +module Jekyll + module Utils + module Exec + extend self + + # Runs a program in a sub-shell. + # + # *args - a list of strings containing the program name and arguments + # + # Returns a Process::Status and a String of output in an array in + # that order. + def run(*args) + stdin, stdout, stderr, process = Open3.popen3(*args) + out = stdout.read.strip + err = stderr.read.strip + + [stdin, stdout, stderr].each(&:close) + [process.value, out + err] + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/internet.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/internet.rb new file mode 100644 index 0000000..f895596 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/internet.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +module Jekyll + module Utils + module Internet + + # Public: Determine whether the present device has a connection to + # the Internet. This allows plugin writers which require the outside + # world to have a neat fallback mechanism for offline building. + # + # Example: + # if Internet.connected? + # Typhoeus.get("https://pages.github.com/versions.json") + # else + # Jekyll.logger.warn "Warning:", "Version check has been disabled." + # Jekyll.logger.warn "", "Connect to the Internet to enable it." + # nil + # end + # + # Returns true if a DNS call can successfully be made, or false if not. + module_function + def connected? + !dns("example.com").nil? + end + + private + module_function + def dns(domain) + require "resolv" + Resolv::DNS.open do |resolver| + resolver.getaddress(domain) + end + rescue Resolv::ResolvError, Resolv::ResolvTimeout + nil + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/platforms.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/platforms.rb new file mode 100644 index 0000000..f4f3382 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/platforms.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +module Jekyll + module Utils + module Platforms + extend self + + # Provides jruby? and mri? which respectively detect these two types of + # tested Engines we support, in the future we might probably support the + # other one that everyone used to talk about. + + { :jruby? => "jruby", :mri? => "ruby" }.each do |k, v| + define_method k do + ::RUBY_ENGINE == v + end + end + + # -- + # Allows you to detect "real" Windows, or what we would consider + # "real" Windows. That is, that we can pass the basic test and the + # /proc/version returns nothing to us. + # -- + + def vanilla_windows? + RbConfig::CONFIG["host_os"] =~ %r!mswin|mingw|cygwin!i && \ + !proc_version + end + + # -- + # XXX: Remove in 4.0 + # -- + + alias_method :really_windows?, \ + :vanilla_windows? + + # + + def bash_on_windows? + RbConfig::CONFIG["host_os"] =~ %r!linux! && \ + proc_version =~ %r!microsoft!i + end + + # + + def windows? + vanilla_windows? || bash_on_windows? + end + + # + + def linux? + RbConfig::CONFIG["host_os"] =~ %r!linux! && \ + proc_version !~ %r!microsoft!i + end + + # Provides windows?, linux?, osx?, unix? so that we can detect + # platforms. This is mostly useful for `jekyll doctor` and for testing + # where we kick off certain tests based on the platform. + + { :osx? => %r!darwin|mac os!, :unix? => %r!solaris|bsd! }.each do |k, v| + define_method k do + !!( + RbConfig::CONFIG["host_os"] =~ v + ) + end + end + + # + + private + def proc_version + @cached_proc_version ||= begin + Pathutil.new( + "/proc/version" + ).read + rescue Errno::ENOENT + nil + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/rouge.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/rouge.rb new file mode 100644 index 0000000..d1befa1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/rouge.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Jekyll + module Utils + module Rouge + + def self.html_formatter(*args) + Jekyll::External.require_with_graceful_fail("rouge") + if old_api? + ::Rouge::Formatters::HTML.new(*args) + else + ::Rouge::Formatters::HTMLLegacy.new(*args) + end + end + + def self.old_api? + ::Rouge.version.to_s < "2" + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/thread_event.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/thread_event.rb new file mode 100644 index 0000000..5afb50d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/thread_event.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require "thread" + +module Jekyll + module Utils + # Based on the pattern and code from + # https://emptysqua.re/blog/an-event-synchronization-primitive-for-ruby/ + class ThreadEvent + attr_reader :flag + + def initialize + @lock = Mutex.new + @cond = ConditionVariable.new + @flag = false + end + + def set + @lock.synchronize do + yield if block_given? + @flag = true + @cond.broadcast + end + end + + def wait + @lock.synchronize do + unless @flag + @cond.wait(@lock) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/win_tz.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/win_tz.rb new file mode 100644 index 0000000..322f5ac --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/utils/win_tz.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +module Jekyll + module Utils + module WinTZ + extend self + + # Public: Calculate the Timezone for Windows when the config file has a defined + # 'timezone' key. + # + # timezone - the IANA Time Zone specified in "_config.yml" + # + # Returns a string that ultimately re-defines ENV["TZ"] in Windows + def calculate(timezone) + External.require_with_graceful_fail("tzinfo") + tz = TZInfo::Timezone.get(timezone) + difference = Time.now.to_i - tz.now.to_i + # + # POSIX style definition reverses the offset sign. + # e.g. Eastern Standard Time (EST) that is 5Hrs. to the 'west' of Prime Meridian + # is denoted as: + # EST+5 (or) EST+05:00 + # Reference: http://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html + sign = difference < 0 ? "-" : "+" + offset = sign == "-" ? "+" : "-" unless difference.zero? + # + # convert the difference (in seconds) to hours, as a rational number, and perform + # a modulo operation on it. + modulo = modulo_of(rational_hour(difference)) + # + # Format the hour as a two-digit number. + # Establish the minutes based on modulo expression. + hh = format("%02d", absolute_hour(difference).ceil) + mm = modulo.zero? ? "00" : "30" + + Jekyll.logger.debug "Timezone:", "#{timezone} #{offset}#{hh}:#{mm}" + # + # Note: The 3-letter-word below doesn't have a particular significance. + "WTZ#{sign}#{hh}:#{mm}" + end + + private + + # Private: Convert given seconds to an hour as a rational number. + # + # seconds - supplied as an integer, it is converted to a rational number. + # 3600 - no. of seconds in an hour. + # + # Returns a rational number. + def rational_hour(seconds) + seconds.to_r / 3600 + end + + # Private: Convert given seconds to an hour as an absolute number. + # + # seconds - supplied as an integer, it is converted to its absolute. + # 3600 - no. of seconds in an hour. + # + # Returns an integer. + def absolute_hour(seconds) + seconds.abs / 3600 + end + + # Private: Perform a modulo operation on a given fraction. + # + # fraction - supplied as a rational number, its numerator is divided + # by its denominator and the remainder returned. + # + # Returns an integer. + def modulo_of(fraction) + fraction.numerator % fraction.denominator + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/version.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/version.rb new file mode 100644 index 0000000..8597ff1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/jekyll/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Jekyll + VERSION = "3.7.0".freeze +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/.gitignore b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/.gitignore new file mode 100644 index 0000000..45c1505 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/.gitignore @@ -0,0 +1,3 @@ +_site +.sass-cache +.jekyll-metadata diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/404.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/404.html new file mode 100644 index 0000000..c472b4e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/404.html @@ -0,0 +1,24 @@ +--- +layout: default +--- + + + +
      +

      404

      + +

      Page not found :(

      +

      The requested page could not be found.

      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/_config.yml b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/_config.yml new file mode 100644 index 0000000..f91333e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/_config.yml @@ -0,0 +1,43 @@ +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole blog, values +# which you are expected to set up once and rarely edit after that. If you find +# yourself editing this file very often, consider using Jekyll's data files +# feature for the data you need to update frequently. +# +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'bundle exec jekyll serve'. If you change this file, please restart the server process. + +# Site settings +# These are used to personalize your new site. If you look in the HTML files, +# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. +# You can create any custom variable you would like, and they will be accessible +# in the templates via {{ site.myvariable }}. +title: Your awesome title +email: your-email@example.com +description: >- # this means to ignore newlines until "baseurl:" + Write an awesome description for your new site here. You can edit this + line in _config.yml. It will appear in your document head meta (for + Google search results) and in your feed.xml site description. +baseurl: "" # the subpath of your site, e.g. /blog +url: "" # the base hostname & protocol for your site, e.g. http://example.com +twitter_username: jekyllrb +github_username: jekyll + +# Build settings +markdown: kramdown +theme: minima +plugins: + - jekyll-feed + +# Exclude from processing. +# The following items will not be processed, by default. Create a custom list +# to override the default setting. +# exclude: +# - Gemfile +# - Gemfile.lock +# - node_modules +# - vendor/bundle/ +# - vendor/cache/ +# - vendor/gems/ +# - vendor/ruby/ diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb new file mode 100644 index 0000000..8d8f7c1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb @@ -0,0 +1,25 @@ +--- +layout: post +title: "Welcome to Jekyll!" +date: <%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %> +categories: jekyll update +--- +You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. + +To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works. + +Jekyll also offers powerful support for code snippets: + +{% highlight ruby %} +def print_hi(name) + puts "Hi, #{name}" +end +print_hi('Tom') +#=> prints 'Hi, Tom' to STDOUT. +{% endhighlight %} + +Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk]. + +[jekyll-docs]: https://jekyllrb.com/docs/home +[jekyll-gh]: https://github.com/jekyll/jekyll +[jekyll-talk]: https://talk.jekyllrb.com/ diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/about.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/about.md new file mode 100644 index 0000000..8b4e0b2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/about.md @@ -0,0 +1,18 @@ +--- +layout: page +title: About +permalink: /about/ +--- + +This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](https://jekyllrb.com/) + +You can find the source code for Minima at GitHub: +[jekyll][jekyll-organization] / +[minima](https://github.com/jekyll/minima) + +You can find the source code for Jekyll at GitHub: +[jekyll][jekyll-organization] / +[jekyll](https://github.com/jekyll/jekyll) + + +[jekyll-organization]: https://github.com/jekyll diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/index.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/index.md new file mode 100644 index 0000000..1eb5d67 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/site_template/index.md @@ -0,0 +1,6 @@ +--- +# You don't need to edit this file, it's empty on purpose. +# Edit theme's home layout instead if you wanna make some changes +# See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults +layout: home +--- diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/CODE_OF_CONDUCT.md.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/CODE_OF_CONDUCT.md.erb new file mode 100644 index 0000000..2b2c773 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/CODE_OF_CONDUCT.md.erb @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at <%= user_email %>. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/Gemfile b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/Gemfile new file mode 100644 index 0000000..bb94df8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/Gemfile @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +source "https://rubygems.org" +gemspec diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/LICENSE.txt.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/LICENSE.txt.erb new file mode 100644 index 0000000..38a0eb4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/LICENSE.txt.erb @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) <%= Time.now.year %> <%= user_name %> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/README.md.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/README.md.erb new file mode 100644 index 0000000..ff8ad05 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/README.md.erb @@ -0,0 +1,52 @@ +# <%= theme_name %> + +Welcome to your new Jekyll theme! In this directory, you'll find the files you need to be able to package up your theme into a gem. Put your layouts in `_layouts`, your includes in `_includes`, your sass files in `_sass` and any other assets in `assets`. + +To experiment with this code, add some sample content and run `bundle exec jekyll serve` – this directory is setup just like a Jekyll site! + +TODO: Delete this and the text above, and describe your gem + + +## Installation + +Add this line to your Jekyll site's `Gemfile`: + +```ruby +gem <%= theme_name.inspect %> +``` + +And add this line to your Jekyll site's `_config.yml`: + +```yaml +theme: <%= theme_name %> +``` + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install <%= theme_name %> + +## Usage + +TODO: Write usage instructions here. Describe your available layouts, includes, sass and/or assets. + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/hello. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. + +## Development + +To set up your environment to develop this theme, run `bundle install`. + +Your theme is setup just like a normal Jekyll site! To test your theme, run `bundle exec jekyll serve` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme. Add pages, documents, data, etc. like normal to test your theme's contents. As you make modifications to your theme and to your content, your site will regenerate and you should see the changes in the browser after a refresh, just like normal. + +When your theme is released, only the files in `_layouts`, `_includes`, `_sass` and `assets` tracked with Git will be bundled. +To add a custom directory to your theme-gem, please edit the regexp in `<%= theme_name %>.gemspec` accordingly. + +## License + +The theme is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). + diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/default.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/default.html new file mode 100644 index 0000000..cddd070 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/default.html @@ -0,0 +1 @@ +{{ content }} diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/page.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/page.html new file mode 100644 index 0000000..5e71126 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/page.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/post.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/post.html new file mode 100644 index 0000000..5e71126 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/_layouts/post.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/_config.yml.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/_config.yml.erb new file mode 100644 index 0000000..82e8d42 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/_config.yml.erb @@ -0,0 +1 @@ +theme: <%= theme_name %> diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/_post.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/_post.md new file mode 100644 index 0000000..145b21d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/_post.md @@ -0,0 +1,12 @@ +--- +layout: post +--- + +Eos eu docendi tractatos sapientem, brute option menandri in vix, quando vivendo accommodare te ius. Nec melius fastidii constituam id, viderer theophrastus ad sit, hinc semper periculis cum id. Noluisse postulant assentior est in, no choro sadipscing repudiandae vix. Vis in euismod delenit dignissim. Ex quod nostrum sit, suas decore animal id ius, nobis solet detracto quo te. + +{% comment %} +Might you have an include in your theme? Why not try it here! +{% include my-themes-great-include.html %} +{% endcomment %} + +No laudem altera adolescens has, volumus lucilius eum no. Eam ei nulla audiam efficiantur. Suas affert per no, ei tale nibh sea. Sea ne magna harum, in denique scriptorem sea, cetero alienum tibique ei eos. Labores persequeris referrentur eos ei. diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/index.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/index.html new file mode 100644 index 0000000..b688538 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/index.html @@ -0,0 +1,14 @@ +--- +layout: page +--- + +Lorem ipsum dolor sit amet, quo id prima corrumpit pertinacia, id ius dolor dolores, an veri pertinax explicari mea. Agam solum et qui, his id ludus graeco adipiscing. Duis theophrastus nam in, at his vidisse atomorum. Tantas gloriatur scripserit ne eos. Est wisi tempor habemus at, ei graeco dissentiet eos. Ne usu aliquip sanctus conceptam, te vis ignota animal, modus latine contentiones ius te. + +{% for post in site.posts %} +

      {{ post.title }}

      +
      {{ post.excerpt }}
      +{% endfor %} + +Te falli veritus sea, at molestiae scribentur deterruisset vix, et mea zril phaedrum vulputate. No cum dicit consulatu. Ut has nostro noluisse expetendis, te pro quaeque disputando, eu sed summo omnes. Eos at tale aperiam, usu cu propriae quaestio constituto, sed aperiam erroribus temporibus an. + +Quo eu liber mediocritatem, vix an delectus eleifend, iuvaret suscipit ei vel. Partem invenire per an, mea postulant dissentias eu, ius tantas audire nominavi eu. Dicunt tritani veritus ex vis, mei in case sententiae. At exerci democritum nam, cu lobortis iracundia mei. Alia eligendi consectetuer eu sed, paulo docendi noluisse sit ex. diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/style.scss b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/style.scss new file mode 100644 index 0000000..7388f52 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/example/style.scss @@ -0,0 +1,7 @@ +--- +--- + +// Here, you can test out the Sass/SCSS that you include in your theme. +// Simply `@import` the necessary file(s) to get the proper styles on the site. +// E.g.: +// @import "a-file-from-my-theme"; diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/gitignore.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/gitignore.erb new file mode 100644 index 0000000..867d379 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/gitignore.erb @@ -0,0 +1,5 @@ +*.gem +.bundle +.sass-cache +_site +Gemfile.lock diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/theme.gemspec.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/theme.gemspec.erb new file mode 100644 index 0000000..44c8feb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.7.0/lib/theme_template/theme.gemspec.erb @@ -0,0 +1,19 @@ +# coding: utf-8 + +Gem::Specification.new do |spec| + spec.name = <%= theme_name.inspect %> + spec.version = "0.1.0" + spec.authors = [<%= user_name.inspect %>] + spec.email = [<%= user_email.inspect %>] + + spec.summary = %q{TODO: Write a short summary, because Rubygems requires one.} + spec.homepage = "TODO: Put your gem's website or public repo URL here." + spec.license = "MIT" + + spec.files = `git ls-files -z`.split("\x0").select { |f| f.match(%r{^(<%= theme_directories.join("|") %>|LICENSE|README)}i) } + + spec.add_runtime_dependency "jekyll", "~> <%= jekyll_version_with_minor %>" + + spec.add_development_dependency "bundler", "~> 1.12" + spec.add_development_dependency "rake", "~> 10.0" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.gitignore b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.gitignore new file mode 100644 index 0000000..73a290d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.gitignore @@ -0,0 +1,20 @@ +/vendor +/.bundle/ +/.yardoc +/Gemfile.lock +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ +*.bundle +*.so +*.o +*.a +mkmf.log +*.gem +Gemfile.lock +spec/dest +.bundle +spec/fixtures/.jekyll-metadata diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rspec b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rspec new file mode 100644 index 0000000..5f16476 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rspec @@ -0,0 +1,2 @@ +--color +--format progress diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rubocop.yml b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rubocop.yml new file mode 100644 index 0000000..22a5680 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rubocop.yml @@ -0,0 +1,29 @@ +inherit_gem: + jekyll: .rubocop.yml + +AllCops: + TargetRubyVersion: 2.0 + Include: + - lib/*.rb + + Exclude: + - .rubocop.yml + - .codeclimate.yml + - .travis.yml + - .gitignore + - .rspec + + - Gemfile.lock + - CHANGELOG.md + - readme.md + - README.md + - Readme.md + - ReadMe.md + - COPYING + - LICENSE + + - test/**/* + - vendor/**/* + - features/**/* + - script/**/* + - spec/**/* diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.travis.yml b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.travis.yml new file mode 100644 index 0000000..1540c00 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.travis.yml @@ -0,0 +1,20 @@ +language: ruby +rvm: +- 2.2 +env: + global: + - NOKOGIRI_USE_SYSTEM_LIBRARIES=true +cache: bundler +sudo: false +before_script: bundle update +script: "./script/cibuild" +notifications: + email: false +deploy: + provider: rubygems + api_key: + secure: qz0q6ur0kGo03jjLdoAak6WcEAwxX2r9LG3DVrhOrcfoFipkuW+uwR0et4tpK8uFrz0P9y7eTIKOb0XCXeIsIXWj6R5benpRGr2U8m9A+tE/jxviBFUaxaokte0lqWiX1fEyhRmW3zvcdLQ47Vd2EwTNaq6ZmPulmEe9gS0rBQghyclakGlZ17LI7oGgiNL9SQ335Yqa1qJklTHYHbodWQ3Z07v7VN2jxqi3WH6NacT5gUGp5iCNCLLa8+jpKr4uONNIoy6/geAWdqtvgGUE8oTjIWDoJarrknJpqfx9Rd0KLDzkyneAigHDYPW60QtrE6GGpK/+TF1pF4DzdK2EgTWqGFnZf8ehfnxmtHVl2Xq/DPr6hS8Q/f+ut4ioMzBQxPD0hfh8/EOMYKsO8mOuOlYTiZXC7iuGyvFUOl2hnBgWA99t+I0NNB06qFp3ZxIjolEc3zjzc9f1a5HUXlEut5V8nqvCwbctNiTVpT8ZEWlsQlyRUnr9cIMUTEfLgQ+v6DnvAJBMO1EILq6liB5qfutjNhzhlREt7P/ZdppGsAzWpgt0q2PafqVoPe62WR3+/8Lj2ErMr034xSSqZVNcBS0mbdvW6k3jaABo1VJ4XuHm6/yDuemWzWb7kdG9/14+IIJMW1VuaWcmnCnB6gxjkCW3Dm2ftYiN7Rfn3AUz/nU= + gem: jekyll-feed + on: + tags: true + repo: jekyll/jekyll-feed diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Gemfile b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Gemfile new file mode 100644 index 0000000..9df5048 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' +gemspec + +if ENV["JEKYLL_VERSION"] + gem "jekyll", "~> #{ENV["JEKYLL_VERSION"]}" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/History.markdown b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/History.markdown new file mode 100644 index 0000000..e3622ca --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/History.markdown @@ -0,0 +1,98 @@ +## HEAD + +### Documentation + + * Use `https` in more places. (#165) + +### Minor Enhancements + + * fix template for posts with post.lang defined (#168) + +## 0.9.1 / 2017-02-17 + +### Minor Enhancements + + * Update feed.xml (#162) + +## 0.9.0 / 2017-02-16 + +### Minor Enhancements + + * Use absolute_url to generate the feed_meta url (#150) + * Make feed stylesheet optional (#149) + * Use new `normalize_whitespace` filter (#143) + * Feed entries must contain (#152) + * Remove trailing slash from feed ID (#159) + +### Development Fixes + + * Simplify minify regular expression (#141) + * Namespace as JekyllFeed (#151) + * rubocop -a (#160) + +### Bug Fixes + + * Filter out drafts before limit (#154) + +## 0.8.0 / 2016-10-06 + + * Use filters to clean up Liquid template (#134) + +### Minor Enhancements + + * Don't set @site.config["time"] on feed generation (#138) + +### pedantry + + * Appease Rubocop (#139) + +## 0.7.2 / 2016-10-06 + + * Support `image.path` when `post.image` is an object (#137) + +## 0.7.1 / 2016-09-26 + + * Assign `url_base` before first usage (#133) + +## 0.7.0 / 2016-09-06 + + * Use type="html" to skirt around double escaping problem (#127) + +## 0.6.0 / 2016-07-08 + + * Cleanup `post_author` logic (#113) + * Add XML stylesheet example with XSLT (#119) + * DRY up and add more doc (#120) + * Use smartify filter (#117) + +## 0.5.1 / 2016-04-18 + + * Fix mangling of whitespace when `site.lang` is set (#110) + +## 0.5.0 / 2016-04-13 + + * Consolidate regexps for stripping whitespace (#82) + * Only test against Jekyll 3 (#99) + * Think about how i18n might work (#75) + * Find author by reference (#106) + * Drop support for Jekyll 2 (#105) + * Add support for post image (#104) + +### Minor Enhancements + + * Use Module#method_defined? (#83) + * Use site.title for meta tag if available (#100) + +### Development Fixes + + * Do not require [**jekyll-last-modified-at**](https://github.com/gjtorikian/jekyll-last-modified-at) in tests (#87) + * Add Rubocop (#81) + * Correct typo in tests (#102) + * Simplify testing feed_meta tag (#101) + * Quiet known warnings in tests (#103) + +## 0.4.0 / 2015-12-30 + + * Feed uses `site.title`, or `site.name` if `title` doesn't exist (#72) + * Replace newlines with spaces in `title` and `summary` elements (#67) + * Properly render post content with Jekyll (#73) diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/LICENSE.txt b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/LICENSE.txt new file mode 100644 index 0000000..2c17689 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2015 Ben Balter + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/README.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/README.md new file mode 100644 index 0000000..ed75c2b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/README.md @@ -0,0 +1,139 @@ +# Jekyll Feed plugin + +A Jekyll plugin to generate an Atom (RSS-like) feed of your Jekyll posts + +[![Build Status](https://travis-ci.org/jekyll/jekyll-feed.svg)](https://travis-ci.org/jekyll/jekyll-feed) [![Gem Version](https://badge.fury.io/rb/jekyll-feed.svg)](https://badge.fury.io/rb/jekyll-feed) + +## Installation + +Add this line to your site's Gemfile: + +```ruby +gem 'jekyll-feed' +``` + +And then add this line to your site's `_config.yml`: + +```yml +gems: + - jekyll-feed +``` + +## Usage + +The plugin will automatically generate an Atom feed at `/feed.xml`. + +### Optional configuration options + +The plugin will automatically use any of the following configuration variables, if they are present in your site's `_config.yml` file. + +* `title` or `name` - The title of the site, e.g., "My awesome site" +* `description` - A longer description of what your site is about, e.g., "Where I blog about Jekyll and other awesome things" +* `url` - The URL to your site, e.g., `http://example.com`. If none is provided, the plugin will try to use `site.github.url`. +* `author` - Global author information (see below) + +### Already have a feed path? + +Do you already have an existing feed someplace other than `/feed.xml`, but are on a host like GitHub Pages that doesn't support machine-friendly redirects? If you simply swap out `jekyll-feed` for your existing template, your existing subscribers won't continue to get updates. Instead, you can specify a non-default path via your site's config. + +```yml +feed: + path: atom.xml +``` + +To note, you shouldn't have to do this unless you already have a feed you're using, and you can't or wish not to redirect existing subscribers. + +### Optional front matter + +The plugin will use the following post metadata, automatically generated by Jekyll, which you can override via a post's YAML front matter: + +* `date` +* `title` +* `excerpt` +* `id` +* `category` +* `tags` + +Additionally, the plugin will use the following values, if present in a post's YAML front matter: + +* `image` - URL of an image that is representative of the post (can also be passed as `image.path`) + +* `author` - The author of the post, e.g., "Dr. Jekyll". If none is given, feed readers will look to the feed author as defined in `_config.yml`. Like the feed author, this can also be an object or a reference to an author in `_data/authors.yml` (see below). + +### Author information + +*TL;DR: In most cases, put `author: [your name]` in the document's front matter, for sites with multiple authors. If you need something more complicated, read on.* + +There are several ways to convey author-specific information. Author information is found in the following order of priority: + +1. An `author` object, in the documents's front matter, e.g.: + + ```yml + author: + twitter: benbalter + ``` + +2. An `author` object, in the site's `_config.yml`, e.g.: + + ```yml + author: + twitter: benbalter + ``` + +3. `site.data.authors[author]`, if an author is specified in the document's front matter, and a corresponding key exists in `site.data.authors`. E.g., you have the following in the document's front matter: + + ```yml + author: benbalter + ``` + + And you have the following in `_data/authors.yml`: + + ```yml + benbalter: + picture: /img/benbalter.png + twitter: jekyllrb + + potus: + picture: /img/potus.png + twitter: whitehouse + ``` + + In the above example, the author `benbalter`'s Twitter handle will be resolved to `@jekyllrb`. This allows you to centralize author information in a single `_data/authors` file for site with many authors that require more than just the author's username. + + *Pro-tip: If `authors` is present in the document's front matter as an array (and `author` is not), the plugin will use the first author listed.* + +4. An author in the document's front matter (the simplest way), e.g.: + + ```yml + author: benbalter + ``` + +5. An author in the site's `_config.yml`, e.g.: + + ```yml + author: benbalter + ``` + +### Meta tags + +The plugin exposes a helper tag to expose the appropriate meta tags to support automated discovery of your feed. Simply place `{% feed_meta %}` someplace in your template's `` section, to output the necessary metadata. + +### SmartyPants + +The plugin uses [Jekyll's `smartify` filter](https://jekyllrb.com/docs/templates/) for processing the site title and post titles. This will translate plain ASCII punctuation into "smart" typographic punctuation. This will not render or strip any Markdown you may be using in a title. + +### Custom styling + +Want to style what your feed looks like in the browser? Simply add an XSLT at `/feed.xslt.xml` and Jekyll Feed will link to the stylesheet. + +## Why Atom, and not RSS? + +Great question. In short, Atom is a better format. Think of it like RSS 3.0. For more information, see [this discussion on why we chose Atom over RSS 2.0](https://github.com/jekyll/jekyll-rss-feed/issues/2). + +## Contributing + +1. Fork it (https://github.com/jekyll/jekyll-feed/fork) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create a new Pull Request diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Rakefile b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Rakefile new file mode 100644 index 0000000..8754e40 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Rakefile @@ -0,0 +1,6 @@ +require "bundler/gem_tasks" +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/jekyll-feed.gemspec b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/jekyll-feed.gemspec new file mode 100644 index 0000000..b74dfd8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/jekyll-feed.gemspec @@ -0,0 +1,25 @@ +# coding: utf-8 + +Gem::Specification.new do |spec| + spec.name = "jekyll-feed" + spec.version = "0.9.2" + spec.authors = ["Ben Balter"] + spec.email = ["ben.balter@github.com"] + spec.summary = "A Jekyll plugin to generate an Atom feed of your Jekyll posts" + spec.homepage = "https://github.com/jekyll/jekyll-feed" + spec.license = "MIT" + + spec.files = `git ls-files -z`.split("\x0") + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ["lib"] + + spec.add_dependency "jekyll", "~> 3.3" + + spec.add_development_dependency "bundler", "~> 1.6" + spec.add_development_dependency "rake", "~> 10.0" + spec.add_development_dependency "rspec", "~> 3.0" + spec.add_development_dependency "typhoeus", "~> 0.7" + spec.add_development_dependency "nokogiri", "~> 1.6" + spec.add_development_dependency "rubocop" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed.rb new file mode 100644 index 0000000..4413767 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed.rb @@ -0,0 +1,10 @@ +require "jekyll" +require "fileutils" +require "jekyll-feed/generator" + +module JekyllFeed + autoload :MetaTag, "jekyll-feed/meta-tag" + autoload :PageWithoutAFile, "jekyll-feed/page-without-a-file.rb" +end + +Liquid::Template.register_tag "feed_meta", JekyllFeed::MetaTag diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/feed.xml b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/feed.xml new file mode 100644 index 0000000..6f4770e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/feed.xml @@ -0,0 +1,81 @@ + +{% if page.xsl %} + +{% endif %} + + Jekyll + + + {{ site.time | date_to_xmlschema }} + {{ '/' | absolute_url | xml_escape }} + + {% if site.title %} + {{ site.title | smartify | xml_escape }} + {% elsif site.name %} + {{ site.name | smartify | xml_escape }} + {% endif %} + + {% if site.description %} + {{ site.description | xml_escape }} + {% endif %} + + {% if site.author %} + + {{ site.author.name | default: site.author | xml_escape }} + {% if site.author.email %} + {{ site.author.email | xml_escape }} + {% endif %} + {% if site.author.uri %} + {{ site.author.uri | xml_escape }} + {% endif %} + + {% endif %} + + {% assign posts = site.posts | where_exp: "post", "post.draft != true" %} + {% for post in posts limit: 10 %} + + {{ post.title | smartify | strip_html | normalize_whitespace | xml_escape }} + + {{ post.date | date_to_xmlschema }} + {{ post.last_modified_at | default: post.date | date_to_xmlschema }} + {{ post.id | absolute_url | xml_escape }} + {{ post.content | strip | xml_escape }} + + {% assign post_author = post.author | default: post.authors[0] | default: site.author %} + {% assign post_author = site.data.authors[post_author] | default: post_author %} + {% assign post_author_email = post_author.email | default: nil %} + {% assign post_author_uri = post_author.uri | default: nil %} + {% assign post_author_name = post_author.name | default: post_author %} + + + {{ post_author_name | default: "" | xml_escape }} + {% if post_author_email %} + {{ post_author_email | xml_escape }} + {% endif %} + {% if post_author_uri %} + {{ post_author_uri | xml_escape }} + {% endif %} + + + {% if post.category %} + + {% endif %} + + {% for tag in post.tags %} + + {% endfor %} + + {% if post.excerpt and post.excerpt != empty %} + {{ post.excerpt | strip_html | normalize_whitespace | xml_escape }} + {% endif %} + + {% assign post_image = post.image.path | default: post.image %} + {% if post_image %} + {% unless post_image contains "://" %} + {% assign post_image = post_image | absolute_url | xml_escape %} + {% endunless %} + + {% endif %} + + {% endfor %} + diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/generator.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/generator.rb new file mode 100644 index 0000000..0ff34ed --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/generator.rb @@ -0,0 +1,55 @@ +module JekyllFeed + class Generator < Jekyll::Generator + safe true + priority :lowest + + # Main plugin action, called by Jekyll-core + def generate(site) + @site = site + return if file_exists?(feed_path) + @site.pages << content_for_file(feed_path, feed_source_path) + end + + private + + # Matches all whitespace that follows + # 1. A '>', which closes an XML tag or + # 2. A '}', which closes a Liquid tag + # We will strip all of this whitespace to minify the template + MINIFY_REGEX = %r!(?<=>|})\s+! + + # Path to feed from config, or feed.xml for default + def feed_path + if @site.config["feed"] && @site.config["feed"]["path"] + @site.config["feed"]["path"] + else + "feed.xml" + end + end + + # Path to feed.xml template file + def feed_source_path + File.expand_path "./feed.xml", File.dirname(__FILE__) + end + + # Checks if a file already exists in the site source + def file_exists?(file_path) + if @site.respond_to?(:in_source_dir) + File.exist? @site.in_source_dir(file_path) + else + File.exist? Jekyll.sanitized_path(@site.source, file_path) + end + end + + # Generates contents for a file + def content_for_file(file_path, file_source_path) + file = PageWithoutAFile.new(@site, File.dirname(__FILE__), "", file_path) + file.content = File.read(file_source_path).gsub(MINIFY_REGEX, "") + file.data["layout"] = nil + file.data["sitemap"] = false + file.data["xsl"] = file_exists?("feed.xslt.xml") + file.output + file + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/meta-tag.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/meta-tag.rb new file mode 100644 index 0000000..9769b7d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/meta-tag.rb @@ -0,0 +1,39 @@ +module JekyllFeed + class MetaTag < Liquid::Tag + # Use Jekyll's native relative_url filter + include Jekyll::Filters::URLFilters + + def render(context) + @context = context + attrs = attributes.map { |k, v| %(#{k}="#{v}") }.join(" ") + "" + end + + private + + def config + @context.registers[:site].config + end + + def attributes + { + :type => "application/atom+xml", + :rel => "alternate", + :href => absolute_url(path), + :title => title, + }.keep_if { |_, v| v } + end + + def path + if config["feed"] && config["feed"]["path"] + config["feed"]["path"] + else + "feed.xml" + end + end + + def title + config["title"] || config["name"] + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/page-without-a-file.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/page-without-a-file.rb new file mode 100644 index 0000000..27556b9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/page-without-a-file.rb @@ -0,0 +1,7 @@ +module JekyllFeed + class PageWithoutAFile < Jekyll::Page + def read_yaml(*) + @data ||= {} + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/bootstrap b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/bootstrap new file mode 100755 index 0000000..8a09d8a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/bootstrap @@ -0,0 +1,3 @@ +#! /bin/bash + +bundle install diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/cibuild b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/cibuild new file mode 100755 index 0000000..5b4c0f3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/cibuild @@ -0,0 +1,7 @@ +#! /bin/bash + +set -e + +bundle exec rspec +bundle exec rubocop -S -D +bundle exec rake build diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/release b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/release new file mode 100755 index 0000000..a9c226f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/release @@ -0,0 +1,7 @@ +#!/bin/sh +# Tag and push a release. + +set -e + +script/cibuild +bundle exec rake release diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_config.yml b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_config.yml new file mode 100644 index 0000000..32bccc5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_config.yml @@ -0,0 +1,9 @@ +timezone: UTC + +defaults: + - + scope: + path: "" + type: page + values: + layout: some_default diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_data/authors.yml b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_data/authors.yml new file mode 100644 index 0000000..78a6ff9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_data/authors.yml @@ -0,0 +1,5 @@ +garthdb: + name: Garth + twitter: garthdb + uri: "http://garthdb.com" + email: example@mail.com diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_drafts/2015-01-12-a-draft.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_drafts/2015-01-12-a-draft.md new file mode 100644 index 0000000..bf78910 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_drafts/2015-01-12-a-draft.md @@ -0,0 +1,4 @@ +--- +--- + +This is a draft. diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_layouts/some_default.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_layouts/some_default.html new file mode 100644 index 0000000..6041172 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_layouts/some_default.html @@ -0,0 +1,11 @@ +--- +--- + + + {% feed_meta %} + + +THIS IS MY LAYOUT +{{ content }} + + diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2013-12-12-dec-the-second.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2013-12-12-dec-the-second.md new file mode 100644 index 0000000..22604a1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2013-12-12-dec-the-second.md @@ -0,0 +1,6 @@ +--- +excerpt: "Foo" +image: "/image.png" +--- + +# December the twelfth, actually. diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-02-march-the-second.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-02-march-the-second.md new file mode 100644 index 0000000..76a8fc9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-02-march-the-second.md @@ -0,0 +1,5 @@ +--- +image: "https://cdn.example.org/absolute.png" +--- + +March the second! diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-04-march-the-fourth.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-04-march-the-fourth.md new file mode 100644 index 0000000..216c372 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-04-march-the-fourth.md @@ -0,0 +1,8 @@ +--- +tags: + - '"/>' +image: + path: "/object-image.png" +--- + +March the fourth! diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md new file mode 100644 index 0000000..f032a1b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md @@ -0,0 +1,5 @@ +--- +last_modified_at: 2015-05-12T13:27:59+00:00 +--- + +Please don't modify this file. It's modified time is important. diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-02-12-strip-newlines.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-02-12-strip-newlines.md new file mode 100644 index 0000000..7d7a373 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-02-12-strip-newlines.md @@ -0,0 +1,6 @@ +--- +title: + The plugin + will properly + strip newlines. +--- diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-liquid.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-liquid.md new file mode 100644 index 0000000..81aaeae --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-liquid.md @@ -0,0 +1,7 @@ +--- +--- + +{% capture liquidstring %} +Liquid is not rendered. +{% endcapture %} +{{ liquidstring | replace:'not ','' }} diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-pre.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-pre.html new file mode 100644 index 0000000..42b54b5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-pre.html @@ -0,0 +1,8 @@ +--- +author: Pat +lang: en +--- + +
      Line 1
      +Line 2
      +Line 3
      diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-18-author-detail.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-18-author-detail.md new file mode 100644 index 0000000..c4c42bd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-18-author-detail.md @@ -0,0 +1,9 @@ +--- +excerpt: "" +author: + name: Ben + uri: "http://ben.balter.com" + email: ben@example.com +--- + +# December the twelfth, actually. diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html new file mode 100644 index 0000000..a845151 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html @@ -0,0 +1,2 @@ +--- +--- diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2016-04-25-author-reference.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2016-04-25-author-reference.md new file mode 100644 index 0000000..f9a0f0c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2016-04-25-author-reference.md @@ -0,0 +1,6 @@ +--- +excerpt: "" +author: garthdb +--- + +# April the twenty-fifth? diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/feed.xslt.xml b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/feed.xslt.xml new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/jekyll-feed_spec.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/jekyll-feed_spec.rb new file mode 100644 index 0000000..98ae904 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/jekyll-feed_spec.rb @@ -0,0 +1,285 @@ +require 'spec_helper' + +describe(JekyllFeed) do + let(:overrides) { Hash.new } + let(:config) do + Jekyll.configuration(Jekyll::Utils.deep_merge_hashes({ + "full_rebuild" => true, + "source" => source_dir, + "destination" => dest_dir, + "show_drafts" => true, + "url" => "http://example.org", + "name" => "My awesome site", + "author" => { + "name" => "Dr. Jekyll" + }, + "collections" => { + "my_collection" => { "output" => true }, + "other_things" => { "output" => false } + } + }, overrides)) + end + let(:site) { Jekyll::Site.new(config) } + let(:contents) { File.read(dest_dir("feed.xml")) } + let(:context) { make_context(site: site) } + let(:feed_meta) { Liquid::Template.parse("{% feed_meta %}").render!(context, {}) } + before(:each) do + site.process + end + + it "has no layout" do + expect(contents).not_to match(/\ATHIS IS MY LAYOUT/) + end + + it "creates a feed.xml file" do + expect(Pathname.new(dest_dir("feed.xml"))).to exist + end + + + it "doesn't have multiple new lines or trailing whitespace" do + expect(contents).to_not match /\s+\n/ + expect(contents).to_not match /\n{2,}/ + end + + it "puts all the posts in the feed.xml file" do + expect(contents).to match /http:\/\/example\.org\/2014\/03\/04\/march-the-fourth\.html/ + expect(contents).to match /http:\/\/example\.org\/2014\/03\/02\/march-the-second\.html/ + expect(contents).to match /http:\/\/example\.org\/2013\/12\/12\/dec-the-second\.html/ + expect(contents).to match "http://example.org/2015/08/08/stuck-in-the-middle.html" + expect(contents).to_not match /http:\/\/example\.org\/2016\/02\/09\/a-draft\.html/ + end + + it "does not include assets or any static files that aren't .html" do + expect(contents).not_to match /http:\/\/example\.org\/images\/hubot\.png/ + expect(contents).not_to match /http:\/\/example\.org\/feeds\/atom\.xml/ + end + + it "preserves linebreaks in preformatted text in posts" do + expect(contents).to match /Line 1\nLine 2\nLine 3/ + end + + it "supports post author name as an object" do + expect(contents).to match /\s*Ben<\/name>\s*ben@example.com<\/email>\s*http:\/\/ben.balter.com<\/uri>\s*<\/author>/ + end + + it "supports post author name as a string" do + expect(contents).to match /\s*Pat<\/name>\s*<\/author>/ + end + + it "does not output author tag no author is provided" do + expect(contents).not_to match /\s*<\/name>\s*<\/author>/ + end + + it "does use author reference with data from _data/authors.yml" do + expect(contents).to match /\s*Garth<\/name>\s*example@mail.com<\/email>\s*http:\/\/garthdb.com<\/uri>\s*<\/author>/ + end + + it "converts markdown posts to HTML" do + expect(contents).to match /<p>March the second!<\/p>/ + end + + it "uses last_modified_at where available" do + expect(contents).to match /2015-05-12T13:27:59\+00:00<\/updated>/ + end + + it "replaces newlines in posts to spaces" do + expect(contents).to match %r!The plugin will properly strip newlines.! + end + + it "renders Liquid inside posts" do + expect(contents).to match /Liquid is rendered\./ + expect(contents).not_to match /Liquid is not rendered\./ + end + + it "includes the item image" do + expect(contents).to include('') + expect(contents).to include('') + expect(contents).to include('') + end + + context "parsing" do + let(:feed) { RSS::Parser.parse(contents) } + + it "outputs an RSS feed" do + expect(feed.feed_type).to eql("atom") + expect(feed.feed_version).to eql("1.0") + expect(feed.encoding).to eql("UTF-8") + end + + it "outputs the link" do + expect(feed.link.href).to eql("http://example.org/feed.xml") + end + + it "outputs the generator" do + expect(feed.generator.content).to eql("Jekyll") + expect(feed.generator.version).to eql(Jekyll::VERSION) + end + + it "includes the items" do + expect(feed.items.count).to eql(10) + end + + it "includes item contents" do + post = feed.items.last + expect(post.title.content).to eql("Dec The Second") + expect(post.link.href).to eql("http://example.org/2013/12/12/dec-the-second.html") + expect(post.published.content).to eql(Time.parse("2013-12-12")) + end + + it "includes the item's excerpt" do + post = feed.items.last + expect(post.summary.content).to eql("Foo") + end + + it "doesn't include the item's excerpt if blank" do + post = feed.items.first + expect(post.summary).to be_nil + end + + context "with site.title set" do + let(:site_title) { "My Site Title" } + let(:overrides) { {"title" => site_title} } + + it "uses site.title for the title" do + expect(feed.title.content).to eql(site_title) + end + end + + context "with site.name set" do + let(:site_name) { "My Site Name" } + let(:overrides) { {"name" => site_name} } + + it "uses site.name for the title" do + expect(feed.title.content).to eql(site_name) + end + end + + context "with site.name and site.title set" do + let(:site_title) { "My Site Title" } + let(:site_name) { "My Site Name" } + let(:overrides) { {"title" => site_title, "name" => site_name} } + + it "uses site.title for the title, dropping site.name" do + expect(feed.title.content).to eql(site_title) + end + end + end + + context "smartify" do + let(:site_title) { "Pat's Site" } + let(:overrides) { { "title" => site_title } } + let(:feed) { RSS::Parser.parse(contents) } + + it "processes site title with SmartyPants" do + expect(feed.title.content).to eql("Pat’s Site") + end + end + + context "validation" do + it "validates" do + # See https://validator.w3.org/docs/api.html + url = "https://validator.w3.org/feed/check.cgi?output=soap12" + response = Typhoeus.post(url, body: { rawdata: contents }, accept_encoding: "gzip") + pending "Something went wrong with the W3 validator" unless response.success? + result = Nokogiri::XML(response.body) + result.remove_namespaces! + + result.css("warning").each do |warning| + # Quiet a warning that results from us passing the feed as a string + next if warning.css("text").text =~ /Self reference doesn't match document location/ + + # Quiet expected warning that results from blank summary test case + next if warning.css("text").text =~ /(content|summary) should not be blank/ + + # Quiet expected warning about multiple posts with same updated time + next if warning.css("text").text =~ /Two entries with the same value for atom:updated/ + + warn "Validation warning: #{warning.css("text").text} on line #{warning.css("line").text} column #{warning.css("column").text}" + end + + errors = result.css("error").map do |error| + "Validation error: #{error.css("text").text} on line #{error.css("line").text} column #{error.css("column").text}" + end + + expect(result.css("validity").text).to eql("true"), errors.join("\n") + end + end + + context "with a baseurl" do + let(:overrides) do + { "baseurl" => "/bass" } + end + + it "correctly adds the baseurl to the posts" do + expect(contents).to match /http:\/\/example\.org\/bass\/2014\/03\/04\/march-the-fourth\.html/ + expect(contents).to match /http:\/\/example\.org\/bass\/2014\/03\/02\/march-the-second\.html/ + expect(contents).to match /http:\/\/example\.org\/bass\/2013\/12\/12\/dec-the-second\.html/ + end + + it "renders the feed meta" do + expected = 'href="http://example.org/bass/feed.xml"' + expect(feed_meta).to include(expected) + end + end + + context "feed meta" do + it "renders the feed meta" do + expected = '' + expect(feed_meta).to eql(expected) + end + + context "with a blank site name" do + let(:config) do + Jekyll.configuration({ + "source" => source_dir, + "destination" => dest_dir, + "url" => "http://example.org" + }) + end + + it "does not output blank title" do + expect(feed_meta).not_to include('title=') + end + end + end + + context "changing the feed path" do + let(:overrides) do + { + "feed" => { + "path" => "atom.xml" + } + } + end + + it "should write to atom.xml" do + expect(Pathname.new(dest_dir("atom.xml"))).to exist + end + + it "renders the feed meta with custom feed path" do + expected = 'href="http://example.org/atom.xml"' + expect(feed_meta).to include(expected) + end + end + + context "feed stylesheet" do + it "includes the stylesheet" do + expect(contents).to include('') + end + end + + context "with site.lang set" do + let(:overrides) { { "lang" => "en-US" } } + + it "should set the language" do + expect(contents).to match %r{type="text/html" hreflang="en-US" />} + end + end + + context "with post.lang set"do + it "should set the language for that entry" do + expect(contents).to match %r{} + expect(contents).to match %r{} + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/spec_helper.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/spec_helper.rb new file mode 100644 index 0000000..b926bd7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/spec_helper.rb @@ -0,0 +1,28 @@ +require 'jekyll' +require 'typhoeus' +require 'nokogiri' +require 'rss' +require File.expand_path('../lib/jekyll-feed', File.dirname(__FILE__)) + +Jekyll.logger.log_level = :error + +RSpec.configure do |config| + config.run_all_when_everything_filtered = true + config.filter_run :focus + config.order = 'random' + + SOURCE_DIR = File.expand_path("../fixtures", __FILE__) + DEST_DIR = File.expand_path("../dest", __FILE__) + + def source_dir(*files) + File.join(SOURCE_DIR, *files) + end + + def dest_dir(*files) + File.join(DEST_DIR, *files) + end + + def make_context(registers = {}) + Liquid::Context.new({}, {}, { site: site }.merge(registers)) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll-sass-converter.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll-sass-converter.rb new file mode 100644 index 0000000..ed73199 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll-sass-converter.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "jekyll-sass-converter/version" +require "jekyll/converters/scss" +require "jekyll/converters/sass" + +module JekyllSassConverter +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll-sass-converter/version.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll-sass-converter/version.rb new file mode 100644 index 0000000..ca64ec0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll-sass-converter/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module JekyllSassConverter + VERSION = "1.5.1".freeze +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll/converters/sass.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll/converters/sass.rb new file mode 100644 index 0000000..1124988 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll/converters/sass.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require "sass" +require "jekyll/utils" +require "jekyll/converters/scss" + +module Jekyll + module Converters + class Sass < Scss + safe true + priority :low + + def matches(ext) + ext =~ %r!^\.sass$!i + end + + def syntax + :sass + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll/converters/scss.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll/converters/scss.rb new file mode 100644 index 0000000..fe41cfe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.1/lib/jekyll/converters/scss.rb @@ -0,0 +1,132 @@ +# frozen_string_literal: true + +require "sass" +require "jekyll/utils" + +module Jekyll + module Converters + class Scss < Converter + BYTE_ORDER_MARK = %r!^\xEF\xBB\xBF! + SyntaxError = Class.new(ArgumentError) + + safe true + priority :low + + ALLOWED_STYLES = %w(nested expanded compact compressed).freeze + + def matches(ext) + ext =~ %r!^\.scss$!i + end + + def output_ext(_ext) + ".css" + end + + def safe? + !!@config["safe"] + end + + def jekyll_sass_configuration + options = @config["sass"] || {} + unless options["style"].nil? + options["style"] = options["style"].to_s.gsub(%r!\A:!, "").to_sym + end + options + end + + def sass_build_configuration_options(overrides) + if safe? + { + :load_paths => sass_load_paths, + :syntax => syntax, + :style => sass_style, + :cache => false, + } + else + Jekyll::Utils.symbolize_hash_keys( + Jekyll::Utils.deep_merge_hashes( + jekyll_sass_configuration, + overrides + ) + ) + end + end + + def syntax + :scss + end + + def sass_dir + return "_sass" if jekyll_sass_configuration["sass_dir"].to_s.empty? + jekyll_sass_configuration["sass_dir"] + end + + def sass_style + style = jekyll_sass_configuration.fetch("style", :compact) + ALLOWED_STYLES.include?(style.to_s) ? style.to_sym : :compact + end + + def user_sass_load_paths + Array(jekyll_sass_configuration["load_paths"]) + end + + def sass_dir_relative_to_site_source + Jekyll.sanitized_path(site_source, sass_dir) + end + + def sass_load_paths + paths = user_sass_load_paths + [sass_dir_relative_to_site_source] + + if safe? + # Sanitize paths to prevent any attack vectors (.e.g. `/**/*`) + paths.map! { |path| Jekyll.sanitized_path(site_source, path) } + end + + # Expand file globs (e.g. `node_modules/*/node_modules` ) + Dir.chdir(site_source) do + paths = paths.map { |path| Dir.glob(path) }.flatten.uniq + + paths.map! do |path| + if safe? + # Sanitize again in case globbing was able to do something crazy. + Jekyll.sanitized_path(site_source, path) + else + File.expand_path(path) + end + end + end + + paths.select { |path| File.directory?(path) } + end + + def allow_caching? + !safe? + end + + def add_charset? + !!jekyll_sass_configuration["add_charset"] + end + + def sass_configs + sass_build_configuration_options({ + "syntax" => syntax, + "cache" => allow_caching?, + "load_paths" => sass_load_paths, + }) + end + + def convert(content) + output = ::Sass.compile(content, sass_configs) + replacement = add_charset? ? '@charset "UTF-8";' : "" + output.sub(BYTE_ORDER_MARK, replacement) + rescue ::Sass::SyntaxError => e + raise SyntaxError, "#{e} on line #{e.sass_line}" + end + + private + def site_source + @site_source ||= File.expand_path(@config["source"]).freeze + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll-watch.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll-watch.rb new file mode 100644 index 0000000..0f8b68b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll-watch.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require "jekyll-watch/version" +require_relative "jekyll/watcher" +require_relative "jekyll/commands/watch" diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll-watch/version.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll-watch/version.rb new file mode 100644 index 0000000..a2bbbb6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll-watch/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Jekyll + module Watch + VERSION = "2.0.0".freeze + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll/commands/watch.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll/commands/watch.rb new file mode 100644 index 0000000..2f5dda7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll/commands/watch.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Jekyll + module Commands + module Watch + extend self + + def init_with_program(prog); end + + # Build your jekyll site + # Continuously watch if `watch` is set to true in the config. + def process(options) + Jekyll.logger.log_level = :error if options["quiet"] + Jekyll::Watcher.watch(options) if options["watch"] + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll/watcher.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll/watcher.rb new file mode 100644 index 0000000..4c368de --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-2.0.0/lib/jekyll/watcher.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true + +require "listen" + +module Jekyll + module Watcher + extend self + + # Public: Continuously watch for file changes and rebuild the site + # whenever a change is detected. + # + # If the optional site argument is populated, that site instance will be + # reused and the options Hash ignored. Otherwise, a new site instance will + # be instantiated from the options Hash and used. + # + # options - A Hash containing the site configuration + # site - The current site instance (populated starting with Jekyll 3.2) + # (optional, default: nil) + # + # Returns nothing. + def watch(options, site = nil) + ENV["LISTEN_GEM_DEBUGGING"] ||= "1" if options["verbose"] + + site ||= Jekyll::Site.new(options) + listener = build_listener(site, options) + listener.start + + Jekyll.logger.info "Auto-regeneration:", "enabled for '#{options["source"]}'" + + unless options["serving"] + trap("INT") do + listener.stop + puts " Halting auto-regeneration." + exit 0 + end + + sleep_forever + end + rescue ThreadError + # You pressed Ctrl-C, oh my! + end + + private + def build_listener(site, options) + Listen.to( + options["source"], + :ignore => listen_ignore_paths(options), + :force_polling => options["force_polling"], + &listen_handler(site) + ) + end + + private + def listen_handler(site) + proc do |modified, added, removed| + t = Time.now + c = modified + added + removed + n = c.length + Jekyll.logger.info "Regenerating:", + "#{n} file(s) changed at #{t.strftime("%Y-%m-%d %H:%M:%S")}" + + c.map { |path| path.sub("#{site.source}/", "") }.each do |file| + Jekyll.logger.info "", file + end + + process(site, t) + end + end + + private + def custom_excludes(options) + Array(options["exclude"]).map { |e| Jekyll.sanitized_path(options["source"], e) } + end + + private + def config_files(options) + %w(yml yaml toml).map do |ext| + Jekyll.sanitized_path(options["source"], "_config.#{ext}") + end + end + + private + def to_exclude(options) + [ + config_files(options), + options["destination"], + custom_excludes(options), + ].flatten + end + + # Paths to ignore for the watch option + # + # options - A Hash of options passed to the command + # + # Returns a list of relative paths from source that should be ignored + private + def listen_ignore_paths(options) + source = Pathname.new(options["source"]).expand_path + paths = to_exclude(options) + + paths.map do |p| + absolute_path = Pathname.new(p).expand_path + next unless absolute_path.exist? + begin + relative_path = absolute_path.relative_path_from(source).to_s + unless relative_path.start_with?("../") + path_to_ignore = Regexp.new(Regexp.escape(relative_path)) + Jekyll.logger.debug "Watcher:", "Ignoring #{path_to_ignore}" + path_to_ignore + end + rescue ArgumentError + # Could not find a relative path + end + end.compact + [%r!\.jekyll\-metadata!] + end + + private + def sleep_forever + loop { sleep 1000 } + end + + private + def process(site, time) + begin + site.process + Jekyll.logger.info "", "...done in #{Time.now - time} seconds." + rescue => e + Jekyll.logger.warn "Error:", e.message + Jekyll.logger.warn "Error:", "Run jekyll build --trace for more information." + end + puts "" + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/AUTHORS b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/AUTHORS new file mode 100644 index 0000000..0583596 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/AUTHORS @@ -0,0 +1 @@ +The author of kramdown is Thomas Leitner . diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/CONTRIBUTERS b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/CONTRIBUTERS new file mode 100644 index 0000000..f61939c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/CONTRIBUTERS @@ -0,0 +1,60 @@ + Count Name +======= ==== + 876 Thomas Leitner + 6 Gioele Barabucci + 4 Ted Pak + 4 Shuanglei Tao + 4 Arne Brasseur + 3 Henning Perl + 3 gettalong + 3 Brandur + 3 Ben Armston + 3 Alex Marandon + 2 Tom Thorogood + 2 Parker Moore + 2 Nathanael Jones + 2 Max Meyer + 2 Jo Hund + 2 Christian Cornelssen + 2 Bran + 1 winniehell + 1 William + 1 Uwe Kubosch + 1 utenmiki + 1 Trevor Wennblom + 1 tomykaira + 1 Tim Blair + 1 Tim Besard + 1 Tim Bates + 1 Sun Yaozhu + 1 Simon Lydell + 1 Shusaku NAKAZATO + 1 Sebastian Boehm + 1 scherr + 1 Postmodern + 1 Pete Michaud + 1 myqlarson + 1 Michal Till + 1 Matt Hickford + 1 Martyn Chamberlin + 1 Marek Tuchowski + 1 Marcus Stollsteimer + 1 Luca Barbato + 1 l3kn + 1 Kir Kolyshkin + 1 Jonathan Hooper + 1 John Croisant + 1 Joe Fiorini + 1 Jens Kraemer + 1 Hirofumi Wakasugi + 1 Hector Correa + 1 Florian Klampfer + 1 Floreal Morandat florealm@gmail.com + 1 Diego Galeota + 1 Damien Pollet + 1 Christopher Jefferson + 1 Cédric Boutillier + 1 Andrew + 1 Alpha Chen + 1 Alex Tomlins + 1 Alexey Vasiliev diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/COPYING b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/COPYING new file mode 100644 index 0000000..1c29282 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/COPYING @@ -0,0 +1,30 @@ +kramdown - fast, pure-Ruby Markdown-superset converter +Copyright (C) 2009-2013 Thomas Leitner + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Some test cases and the benchmark files are based on test cases from +the MDTest test suite: + + MDTest + Copyright (c) 2007 Michel Fortin + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/README.md b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/README.md new file mode 100644 index 0000000..139bf06 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/README.md @@ -0,0 +1,71 @@ +# kramdown + +## Readme first! + +kramdown was originally licensed under the GPL until the 1.0.0 release. However, due to the many +requests it is now released under the MIT license and therefore can easily be used in commercial +projects, too. + +However, if you use kramdown in a commercial setting, please consider **contributing back any +changes** for the benefit of the community and/or +[**becoming a patron**](https://www.patreon.com/gettalong) - thanks! + + +## Introduction + +kramdown is a fast, pure Ruby Markdown superset converter, using a strict syntax definition and +supporting several common extensions. + +The syntax definition for the kramdown syntax can be found in **doc/syntax.page** (or online at +) and a quick reference is available in +**doc/quickref.page** or online at . + +The kramdown library is mainly written to support the kramdown-to-HTML conversion chain. However, +due to its flexibility (by creating an internal AST) it supports other input and output formats as +well. Here is a list of the supported formats: + +* input formats: kramdown (a Markdown superset), Markdown, GFM, HTML +* output formats: HTML, kramdown, LaTeX (and therefore PDF), PDF via Prawn + +All the documentation on the available input and output formats is available in the **doc/** +directory and online at . + +Starting from version 1.0.0 kramdown is using a versioning scheme with major, minor and patch parts +in the version number where the major number changes on backwards-incompatible changes, the minor +number on the introduction of new features and the patch number on everything else. + +For information about changes between versions, have a look at + or the commit history! + + +## Usage + +kramdown has a very simple API, so using kramdown is as easy as + +```ruby +require 'kramdown' + +Kramdown::Document.new(text).to_html +``` + +For detailed information have a look at the API documentation of the `Kramdown::Document` class. + +The full API documentation is available at , other sites with an +API documentation for kramdown probably don't provide the complete documentation! + +There are also some third-party libraries that extend the functionality of kramdown -- see the +kramdown Wiki at . + + +## Development + +Just clone the git repository as described in **doc/installation.page** and you are good to go. You +probably want to install `rake` so that you can use the provided rake tasks. + +If you want to run the tests, the development dependencies are needed as well as some additional +programs like `tidy` and `latex`. See the `.travis.yml` file for more information. + + +## License + +MIT - see the **COPYING** file. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/Rakefile b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/Rakefile new file mode 100644 index 0000000..c396cec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/Rakefile @@ -0,0 +1,308 @@ +# -*- ruby -*- + +# load all optional developer libraries +begin + require 'rubygems' + require 'rubygems/package_task' +rescue LoadError +end + +begin + require 'webgen/page' +rescue LoadError +end + +begin + gem 'rdoc' if RUBY_VERSION >= '1.9' + require 'rdoc/task' + require 'rdoc/rdoc' + + class RDoc::RDoc + + alias :old_parse_files :parse_files + + def parse_files(options) + file_info = old_parse_files(options) + require 'kramdown/options' + + # Add options documentation to Kramdown::Options module + opt_module = @store.all_classes_and_modules.find {|m| m.full_name == 'Kramdown::Options'} + opt_defs = Kramdown::Options.definitions.sort.collect do |n, definition| + desc = definition.desc.split(/\n/).map {|l| " #{l}"} + desc[-2] = [] + desc = desc.join("\n") + "[#{n} (type: #{definition.type}, default: #{definition.default.inspect})]\n#{desc}\n\n" + end + opt_module.comment.text += "\n== Available Options\n\n" << opt_defs.join("\n\n") + + file_info + end + + end + +rescue LoadError +end + +begin + require 'rcov/rcovtask' +rescue LoadError +end + +require 'fileutils' +require 'rake/clean' +require 'rake/testtask' +require 'rake/packagetask' +require 'erb' + +$:.unshift('lib') +require 'kramdown' + +# End user tasks ################################################################ + +task :default => :test + +desc "Install using setup.rb" +task :install do + ruby "setup.rb config" + ruby "setup.rb setup" + ruby "setup.rb install" +end + +task :clobber do + ruby "setup.rb clean" +end + +if defined?(Webgen) + desc "Generate the HTML documentation" + task :htmldoc do + ruby "-Ilib -S webgen" + end + CLOBBER << "htmldoc/" + CLOBBER << "webgen-tmp" +end + +if defined? RDoc::Task + rd = RDoc::Task.new do |rdoc| + rdoc.rdoc_dir = 'htmldoc/rdoc' + rdoc.title = 'kramdown' + rdoc.main = 'lib/kramdown/document.rb' + rdoc.rdoc_files.include('lib') + end +end + +if defined?(Webgen) && defined?(RDoc::Task) + desc "Build the whole user documentation" + task :doc => [:rdoc, 'htmldoc'] +end + +tt = Rake::TestTask.new do |test| + test.warning = false + test.libs << 'test' + test.test_files = FileList['test/test_*.rb'] +end + +# Release tasks and development tasks ############################################ + +namespace :dev do + + SUMMARY = 'kramdown is a fast, pure-Ruby Markdown-superset converter.' + DESCRIPTION = < CONTRIBUTERS` + `echo "======= ====" >> CONTRIBUTERS` + `git log | grep ^Author: | sed 's/^Author: //' | sort | uniq -c | sort -nr >> CONTRIBUTERS` + end + + CLOBBER << "man/man1/kramdown.1" + file 'man/man1/kramdown.1' => ['man/man1/kramdown.1.erb'] do + puts "Generating kramdown man page" + File.open('man/man1/kramdown.1', 'w+') do |file| + data = ERB.new(File.read('man/man1/kramdown.1.erb')).result(binding) + file.write(Kramdown::Document.new(data).to_man) + end + end + + Rake::PackageTask.new('kramdown', Kramdown::VERSION) do |pkg| + pkg.need_tar = true + pkg.need_zip = true + pkg.package_files = PKG_FILES + end + + if defined? Gem + spec = Gem::Specification.new do |s| + + #### Basic information + s.name = 'kramdown' + s.version = Kramdown::VERSION + s.summary = SUMMARY + s.description = DESCRIPTION + s.license = 'MIT' + + #### Dependencies, requirements and files + s.files = PKG_FILES.to_a + + s.require_path = 'lib' + s.executables = ['kramdown'] + s.default_executable = 'kramdown' + s.required_ruby_version = '>= 2.0' + s.add_development_dependency 'minitest', '~> 5.0' + s.add_development_dependency 'coderay', '~> 1.0.0' + s.add_development_dependency 'rouge' + s.add_development_dependency 'stringex', '~> 1.5.1' + s.add_development_dependency 'prawn', '~> 2.0' + s.add_development_dependency 'prawn-table', '~> 0.2.2' + s.add_development_dependency 'ritex', '~> 1.0' + s.add_development_dependency 'itextomml', '~> 1.5' + s.add_development_dependency 'execjs', '~> 2.7' + s.add_development_dependency 'sskatex', '>= 0.9.23' + + #### Documentation + + s.has_rdoc = true + s.rdoc_options = ['--main', 'lib/kramdown/document.rb'] + + #### Author and project details + + s.author = 'Thomas Leitner' + s.email = 't_leitner@gmx.at' + s.homepage = "http://kramdown.gettalong.org" + end + + + task :gemspec => [ 'CONTRIBUTERS', 'VERSION', 'man/man1/kramdown.1'] do + print "Generating Gemspec\n" + contents = spec.to_ruby + File.open("kramdown.gemspec", 'w+') {|f| f.puts(contents)} + end + + Gem::PackageTask.new(spec) do |pkg| + pkg.need_zip = true + pkg.need_tar = true + end + + end + + if defined?(Webgen) && defined?(Gem) && defined?(Rake::RDocTask) + desc 'Release Kramdown version ' + Kramdown::VERSION + task :release => [:clobber, :package, :publish_files, :publish_website] + end + + if defined?(Gem) + desc "Upload the release to Rubygems" + task :publish_files => [:package] do + sh "gem push pkg/kramdown-#{Kramdown::VERSION}.gem" + puts 'done' + end + end + + desc "Upload the website" + task :publish_website => ['doc'] do + puts "Transfer manually!!!" + # sh "rsync -avc --delete --exclude 'MathJax' --exclude 'robots.txt' htmldoc/ gettalong@rubyforge.org:/var/www/gforge-projects/kramdown/" + end + + + if defined? Rcov + Rcov::RcovTask.new do |rcov| + rcov.libs << 'test' + end + end + + CODING_LINE = "# -*- coding: utf-8 -*-\n" + COPYRIGHT=< +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# +EOF + + desc "Insert/Update copyright notice" + task :update_copyright do + inserted = false + Dir["lib/**/*.rb", "test/**/*.rb"].each do |file| + if !File.read(file).start_with?(CODING_LINE + COPYRIGHT) + inserted = true + puts "Updating file #{file}" + old = File.read(file) + if !old.gsub!(/\A#{Regexp.escape(CODING_LINE)}#\n#--.*?\n#\+\+\n#\n/m, CODING_LINE + COPYRIGHT) + old.gsub!(/\A(#{Regexp.escape(CODING_LINE)})?/, CODING_LINE + COPYRIGHT + "\n") + end + File.open(file, 'w+') {|f| f.puts(old)} + end + end + puts "Look through the above mentioned files and correct all problems" if inserted + end + + desc "Check for SsKaTeX availability" + task :test_sskatex_deps do + katexjs = 'katex/katex.min.js' + raise (<#{stem}.html.19" + end + end +end + +task :gemspec => ['dev:gemspec'] + +task :clobber => ['dev:clobber'] diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/VERSION b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/VERSION new file mode 100644 index 0000000..4a02d2c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/VERSION @@ -0,0 +1 @@ +1.16.2 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/benchmark.rb b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/benchmark.rb new file mode 100644 index 0000000..bad86af --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/benchmark.rb @@ -0,0 +1,43 @@ +require 'benchmark' +require 'stringio' + +require 'kramdown' +require 'bluecloth' +require 'maruku' +require 'maruku/version' +require 'rdiscount' +require 'bluefeather' +require 'redcarpet' + +module MaRuKu::Errors + def tell_user(s) + end +end + + +RUNS=20 + +FILES=['mdsyntax.text', 'mdbasics.text'] + +puts "Running tests on #{Time.now.strftime("%Y-%m-%d")} under #{RUBY_DESCRIPTION}" + +FILES.each do |file| + data = File.read(File.join(File.dirname(__FILE__), file)) + puts + puts "Test using file #{file} and #{RUNS} runs" + results = Benchmark.bmbm do |b| + b.report("kramdown #{Kramdown::VERSION}") { RUNS.times { Kramdown::Document.new(data).to_html } } + b.report("Maruku #{MaRuKu::Version}") { RUNS.times { Maruku.new(data, :on_error => :ignore).to_html } } + b.report("BlueFeather #{BlueFeather::VERSION}") { RUNS.times { BlueFeather.parse(data) } } + b.report("BlueCloth #{BlueCloth::VERSION}") { RUNS.times { BlueCloth.new(data).to_html } } + b.report("RDiscount #{RDiscount::VERSION}") { RUNS.times { RDiscount.new(data).to_html } } + b.report("redcarpet #{Redcarpet::VERSION}") { RUNS.times { Redcarpet::Markdown.new(Redcarpet::Render::HTML).render(data) } } + end + + puts + puts "Real time of X divided by real time of kramdown" + kd = results.shift.real + %w[Maruku BlueFeather BlueCloth RDiscount redcarpet].each do |name| + puts name.ljust(19) << (results.shift.real/kd).round(4).to_s + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/benchmark.sh b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/benchmark.sh new file mode 100755 index 0000000..3fe600c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/benchmark.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +source ~/.profile + +RUBY_VERSIONS=`rvm list strings | sort` +KD_VERSIONS="`git tag | sort -V` master" +OTHERS=false +AVERAGE=1 +MASTER_AS=master + +while getopts "r:k:om:a:" optname; do + case "$optname" in + "r") + RUBY_VERSIONS="$OPTARG" + ;; + "k") + KD_VERSIONS="$OPTARG" + ;; + "o") + OTHERS=true + ;; + "m") + MASTER_AS="$OPTARG" + ;; + "a") + AVERAGE="$OPTARG" + ;; + "?") + echo "Unknown option $OPTARG" + exit 1 + ;; + ":") + echo "No argument value for option $OPTARG" + exit 1 + ;; + *) + echo "Unknown error while processing options" + exit 1 + ;; + esac +done + +TMPDIR=/tmp/kramdown-benchmark + +rm -rf $TMPDIR +mkdir -p $TMPDIR +cp benchmark/md* $TMPDIR +cp benchmark/generate_data.rb $TMPDIR +git clone .git ${TMPDIR}/kramdown +cd ${TMPDIR}/kramdown + +for RUBY_VERSION in $RUBY_VERSIONS; do + rvm use $RUBY_VERSION + echo "Creating benchmark data for $(ruby -v)" + + for KD_VERSION in $KD_VERSIONS; do + echo "Using kramdown version $KD_VERSION" + git co $KD_VERSION 2>/dev/null + if [ -z $MASTER_AS -o $KD_VERSION != master ]; then + VNUM=${KD_VERSION} + else + VNUM=$MASTER_AS + fi + ruby -I${TMPDIR}/kramdown/lib ../generate_data.rb -k ${VNUM} -a ${AVERAGE} >/dev/null + done + + if [ $OTHERS = "true" ]; then + ruby -rubygems -I${TMPDIR}/kramdown/lib ../generate_data.rb -o >/dev/null + fi +done + +cd ${TMPDIR} +rvm default +ruby generate_data.rb -g diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/generate_data.rb b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/generate_data.rb new file mode 100644 index 0000000..762ebc3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/generate_data.rb @@ -0,0 +1,119 @@ +require 'benchmark' +require 'optparse' +require 'fileutils' + +require 'kramdown' + +options = {:others => false, :average => 1} +OptionParser.new do |opts| + opts.on("-a AVG", "--average AVG", Integer, "Average times over the specified number of runs") {|v| options[:average] = v } + opts.on("-o", "--[no-]others", "Generate data for other parsers") {|v| options[:others] = v} + opts.on("-g", "--[no-]graph", "Generate graph") {|v| options[:graph] = v} + opts.on("-k VERSION", "--kramdown VERSION", String, "Add benchmark data for kramdown version VERSION") {|v| options[:kramdown] = v} +end.parse! + +THISRUBY = (self.class.const_defined?(:RUBY_DESCRIPTION) ? RUBY_DESCRIPTION.scan(/^.*?(?=\s*\()/).first.sub(/\s/, '-') : "ruby-#{RUBY_VERSION}") + '-' + RUBY_PATCHLEVEL.to_s + +Dir.chdir(File.dirname(__FILE__)) +BMDATA = File.read('mdbasics.text') +MULTIPLIER = (0..5).map {|i| 2**i} + +if options[:others] + require 'maruku' + require 'maruku/version' + begin + require 'rdiscount' + rescue LoadError + end + #require 'bluefeather' + + module MaRuKu::Errors + def tell_user(s) + end + end + + bmdata = {} + labels = [] + MULTIPLIER.each do |i| + $stderr.puts "Generating benchmark data for other parsers, multiplier #{i}" + mddata = BMDATA*i + labels = [] + bmdata[i] = Benchmark::bmbm do |x| + labels << "Maruku #{MaRuKu::Version}" + x.report { Maruku.new(mddata, :on_error => :ignore).to_html } + if self.class.const_defined?(:BlueFeather) + labels << "BlueFeather #{BlueFeather::VERSION}" + x.report { BlueFeather.parse(mddata) } + end + if self.class.const_defined?(:RDiscount) + labels << "RDiscount #{RDiscount::VERSION}" + x.report { RDiscount.new(mddata).to_html } + end + end + end + File.open("static-#{THISRUBY}.dat", 'w+') do |f| + f.puts "# " + labels.join(" || ") + format_str = "%5d" + " %10.5f"*bmdata[MULTIPLIER.first].size + bmdata.sort.each do |m,v| + f.puts format_str % [m, *v.map {|tms| tms.real}] + end + end +end + +if options[:kramdown] + kramdown = "kramdown-#{THISRUBY}.dat" + data = if File.exist?(kramdown) + lines = File.readlines(kramdown).map {|l| l.chomp} + lines.first << " || " + lines + else + ["# ", *MULTIPLIER.map {|m| "%3d" % m}] + end + data.first << "#{options[:kramdown]}".rjust(10) + + times = [] + options[:average].times do + MULTIPLIER.each_with_index do |m, i| + $stderr.puts "Generating benchmark data for kramdown version #{options[:kramdown]}, multiplier #{m}" + mddata = BMDATA*m + begin + (times[i] ||= []) << Benchmark::bmbm {|x| x.report { Kramdown::Document.new(mddata).to_html } }.first.real + rescue + $stderr.puts $!.message + (times[i] ||= []) << 0 + end + end + end + times.each_with_index {|t,i| data[i+1] << "%14.5f" % (t.inject(0) {|sum,v| sum+v}/3.0)} + File.open(kramdown, 'w+') do |f| + data.each {|l| f.puts l} + end +end + +if options[:graph] + Dir['kramdown-*.dat'].each do |kramdown_name| + theruby = kramdown_name.sub(/^kramdown-/, '').sub(/\.dat$/, '') + graph_name = "graph-#{theruby}.png" + static_name = "static-#{theruby}.dat" + kramdown_names = File.readlines(kramdown_name).first.chomp[1..-1].split(/\s*\|\|\s*/) + static_names = (File.exist?(static_name) ? File.readlines(static_name).first.chomp[1..-1].split(/\s*\|\|\s*/) : []) + File.open("gnuplot.dat", "w+") do |f| + f.puts < +
    1. Main
    2. +
    3. Basics
    4. +
    5. Syntax
    6. +
    7. License
    8. +
    9. Dingus
    10. + + + +Getting the Gist of Markdown's Formatting Syntax +------------------------------------------------ + +This page offers a brief overview of what it's like to use Markdown. +The [syntax page] [s] provides complete, detailed documentation for +every feature, but Markdown should be very easy to pick up simply by +looking at a few examples of it in action. The examples on this page +are written in a before/after style, showing example syntax and the +HTML output produced by Markdown. + +It's also helpful to simply try Markdown out; the [Dingus] [d] is a +web application that allows you type your own Markdown-formatted text +and translate it to XHTML. + +**Note:** This document is itself written using Markdown; you +can [see the source for it by adding '.text' to the URL] [src]. + + [s]: /projects/markdown/syntax "Markdown Syntax" + [d]: /projects/markdown/dingus "Markdown Dingus" + [src]: /projects/markdown/basics.text + + +## Paragraphs, Headers, Blockquotes ## + +A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing spaces or tabs is considered +blank.) Normal paragraphs should not be intended with spaces or tabs. + +Markdown offers two styles of headers: *Setext* and *atx*. +Setext-style headers for `

      ` and `

      ` are created by +"underlining" with equal signs (`=`) and hyphens (`-`), respectively. +To create an atx-style header, you put 1-6 hash marks (`#`) at the +beginning of the line -- the number of hashes equals the resulting +HTML header level. + +Blockquotes are indicated using email-style '`>`' angle brackets. + +Markdown: + + A First Level Header + ==================== + + A Second Level Header + --------------------- + + Now is the time for all good men to come to + the aid of their country. This is just a + regular paragraph. + + The quick brown fox jumped over the lazy + dog's back. + + ### Header 3 + + > This is a blockquote. + > + > This is the second paragraph in the blockquote. + > + > ## This is an H2 in a blockquote + + +Output: + +

      A First Level Header

      + +

      A Second Level Header

      + +

      Now is the time for all good men to come to + the aid of their country. This is just a + regular paragraph.

      + +

      The quick brown fox jumped over the lazy + dog's back.

      + +

      Header 3

      + +
      +

      This is a blockquote.

      + +

      This is the second paragraph in the blockquote.

      + +

      This is an H2 in a blockquote

      +
      + + + +### Phrase Emphasis ### + +Markdown uses asterisks and underscores to indicate spans of emphasis. + +Markdown: + + Some of these words *are emphasized*. + Some of these words _are emphasized also_. + + Use two asterisks for **strong emphasis**. + Or, if you prefer, __use two underscores instead__. + +Output: + +

      Some of these words are emphasized. + Some of these words are emphasized also.

      + +

      Use two asterisks for strong emphasis. + Or, if you prefer, use two underscores instead.

      + + + +## Lists ## + +Unordered (bulleted) lists use asterisks, pluses, and hyphens (`*`, +`+`, and `-`) as list markers. These three markers are +interchangable; this: + + * Candy. + * Gum. + * Booze. + +this: + + + Candy. + + Gum. + + Booze. + +and this: + + - Candy. + - Gum. + - Booze. + +all produce the same output: + +
        +
      • Candy.
      • +
      • Gum.
      • +
      • Booze.
      • +
      + +Ordered (numbered) lists use regular numbers, followed by periods, as +list markers: + + 1. Red + 2. Green + 3. Blue + +Output: + +
        +
      1. Red
      2. +
      3. Green
      4. +
      5. Blue
      6. +
      + +If you put blank lines between items, you'll get `

      ` tags for the +list item text. You can create multi-paragraph list items by indenting +the paragraphs by 4 spaces or 1 tab: + + * A list item. + + With multiple paragraphs. + + * Another item in the list. + +Output: + +

        +
      • A list item.

        +

        With multiple paragraphs.

      • +
      • Another item in the list.

      • +
      + + + +### Links ### + +Markdown supports two styles for creating links: *inline* and +*reference*. With both styles, you use square brackets to delimit the +text you want to turn into a link. + +Inline-style links use parentheses immediately after the link text. +For example: + + This is an [example link](http://example.com/). + +Output: + +

      This is an + example link.

      + +Optionally, you may include a title attribute in the parentheses: + + This is an [example link](http://example.com/ "With a Title"). + +Output: + +

      This is an + example link.

      + +Reference-style links allow you to refer to your links by names, which +you define elsewhere in your document: + + I get 10 times more traffic from [Google][1] than from + [Yahoo][2] or [MSN][3]. + + [1]: http://google.com/ "Google" + [2]: http://search.yahoo.com/ "Yahoo Search" + [3]: http://search.msn.com/ "MSN Search" + +Output: + +

      I get 10 times more traffic from Google than from Yahoo or MSN.

      + +The title attribute is optional. Link names may contain letters, +numbers and spaces, but are *not* case sensitive: + + I start my morning with a cup of coffee and + [The New York Times][NY Times]. + + [ny times]: http://www.nytimes.com/ + +Output: + +

      I start my morning with a cup of coffee and + The New York Times.

      + + +### Images ### + +Image syntax is very much like link syntax. + +Inline (titles are optional): + + ![alt text](/path/to/img.jpg "Title") + +Reference-style: + + ![alt text][id] + + [id]: /path/to/img.jpg "Title" + +Both of the above examples produce the same output: + + alt text + + + +### Code ### + +In a regular paragraph, you can create code span by wrapping text in +backtick quotes. Any ampersands (`&`) and angle brackets (`<` or +`>`) will automatically be translated into HTML entities. This makes +it easy to use Markdown to write about HTML example code: + + I strongly recommend against using any `` tags. + + I wish SmartyPants used named entities like `—` + instead of decimal-encoded entites like `—`. + +Output: + +

      I strongly recommend against using any + <blink> tags.

      + +

      I wish SmartyPants used named entities like + &mdash; instead of decimal-encoded + entites like &#8212;.

      + + +To specify an entire block of pre-formatted code, indent every line of +the block by 4 spaces or 1 tab. Just like with code spans, `&`, `<`, +and `>` characters will be escaped automatically. + +Markdown: + + If you want your page to validate under XHTML 1.0 Strict, + you've got to put paragraph tags in your blockquotes: + +
      +

      For example.

      +
      + +Output: + +

      If you want your page to validate under XHTML 1.0 Strict, + you've got to put paragraph tags in your blockquotes:

      + +
      <blockquote>
      +        <p>For example.</p>
      +    </blockquote>
      +    
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/mdsyntax.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/mdsyntax.text new file mode 100644 index 0000000..57360a1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/mdsyntax.text @@ -0,0 +1,888 @@ +Markdown: Syntax +================ + + + + +* [Overview](#overview) + * [Philosophy](#philosophy) + * [Inline HTML](#html) + * [Automatic Escaping for Special Characters](#autoescape) +* [Block Elements](#block) + * [Paragraphs and Line Breaks](#p) + * [Headers](#header) + * [Blockquotes](#blockquote) + * [Lists](#list) + * [Code Blocks](#precode) + * [Horizontal Rules](#hr) +* [Span Elements](#span) + * [Links](#link) + * [Emphasis](#em) + * [Code](#code) + * [Images](#img) +* [Miscellaneous](#misc) + * [Backslash Escapes](#backslash) + * [Automatic Links](#autolink) + + +**Note:** This document is itself written using Markdown; you +can [see the source for it by adding '.text' to the URL][src]. + + [src]: /projects/markdown/syntax.text + +* * * + +

      Overview

      + +

      Philosophy

      + +Markdown is intended to be as easy-to-read and easy-to-write as is feasible. + +Readability, however, is emphasized above all else. A Markdown-formatted +document should be publishable as-is, as plain text, without looking +like it's been marked up with tags or formatting instructions. While +Markdown's syntax has been influenced by several existing text-to-HTML +filters -- including [Setext] [1], [atx] [2], [Textile] [3], [reStructuredText] [4], +[Grutatext] [5], and [EtText] [6] -- the single biggest source of +inspiration for Markdown's syntax is the format of plain text email. + + [1]: http://docutils.sourceforge.net/mirror/setext.html + [2]: http://www.aaronsw.com/2002/atx/ + [3]: http://textism.com/tools/textile/ + [4]: http://docutils.sourceforge.net/rst.html + [5]: http://www.triptico.com/software/grutatxt.html + [6]: http://ettext.taint.org/doc/ + +To this end, Markdown's syntax is comprised entirely of punctuation +characters, which punctuation characters have been carefully chosen so +as to look like what they mean. E.g., asterisks around a word actually +look like \*emphasis\*. Markdown lists look like, well, lists. Even +blockquotes look like quoted passages of text, assuming you've ever +used email. + + + +

      Inline HTML

      + +Markdown's syntax is intended for one purpose: to be used as a +format for *writing* for the web. + +Markdown is not a replacement for HTML, or even close to it. Its +syntax is very small, corresponding only to a very small subset of +HTML tags. The idea is *not* to create a syntax that makes it easier +to insert HTML tags. In my opinion, HTML tags are already easy to +insert. The idea for Markdown is to make it easy to read, write, and +edit prose. HTML is a *publishing* format; Markdown is a *writing* +format. Thus, Markdown's formatting syntax only addresses issues that +can be conveyed in plain text. + +For any markup that is not covered by Markdown's syntax, you simply +use HTML itself. There's no need to preface it or delimit it to +indicate that you're switching from Markdown to HTML; you just use +the tags. + +The only restrictions are that block-level HTML elements -- e.g. `
      `, +``, `
      `, `

      `, etc. -- must be separated from surrounding +content by blank lines, and the start and end tags of the block should +not be indented with tabs or spaces. Markdown is smart enough not +to add extra (unwanted) `

      ` tags around HTML block-level tags. + +For example, to add an HTML table to a Markdown article: + + This is a regular paragraph. + +

      + + + +
      Foo
      + + This is another regular paragraph. + +Note that Markdown formatting syntax is not processed within block-level +HTML tags. E.g., you can't use Markdown-style `*emphasis*` inside an +HTML block. + +Span-level HTML tags -- e.g. ``, ``, or `` -- can be +used anywhere in a Markdown paragraph, list item, or header. If you +want, you can even use HTML tags instead of Markdown formatting; e.g. if +you'd prefer to use HTML `` or `` tags instead of Markdown's +link or image syntax, go right ahead. + +Unlike block-level HTML tags, Markdown syntax *is* processed within +span-level tags. + + +

      Automatic Escaping for Special Characters

      + +In HTML, there are two characters that demand special treatment: `<` +and `&`. Left angle brackets are used to start tags; ampersands are +used to denote HTML entities. If you want to use them as literal +characters, you must escape them as entities, e.g. `<`, and +`&`. + +Ampersands in particular are bedeviling for web writers. If you want to +write about 'AT&T', you need to write '`AT&T`'. You even need to +escape ampersands within URLs. Thus, if you want to link to: + + http://images.google.com/images?num=30&q=larry+bird + +you need to encode the URL as: + + http://images.google.com/images?num=30&q=larry+bird + +in your anchor tag `href` attribute. Needless to say, this is easy to +forget, and is probably the single most common source of HTML validation +errors in otherwise well-marked-up web sites. + +Markdown allows you to use these characters naturally, taking care of +all the necessary escaping for you. If you use an ampersand as part of +an HTML entity, it remains unchanged; otherwise it will be translated +into `&`. + +So, if you want to include a copyright symbol in your article, you can write: + + © + +and Markdown will leave it alone. But if you write: + + AT&T + +Markdown will translate it to: + + AT&T + +Similarly, because Markdown supports [inline HTML](#html), if you use +angle brackets as delimiters for HTML tags, Markdown will treat them as +such. But if you write: + + 4 < 5 + +Markdown will translate it to: + + 4 < 5 + +However, inside Markdown code spans and blocks, angle brackets and +ampersands are *always* encoded automatically. This makes it easy to use +Markdown to write about HTML code. (As opposed to raw HTML, which is a +terrible format for writing about HTML syntax, because every single `<` +and `&` in your example code needs to be escaped.) + + +* * * + + +

      Block Elements

      + + +

      Paragraphs and Line Breaks

      + +A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing but spaces or tabs is considered +blank.) Normal paragraphs should not be intended with spaces or tabs. + +The implication of the "one or more consecutive lines of text" rule is +that Markdown supports "hard-wrapped" text paragraphs. This differs +significantly from most other text-to-HTML formatters (including Movable +Type's "Convert Line Breaks" option) which translate every line break +character in a paragraph into a `
      ` tag. + +When you *do* want to insert a `
      ` break tag using Markdown, you +end a line with two or more spaces, then type return. + +Yes, this takes a tad more effort to create a `
      `, but a simplistic +"every line break is a `
      `" rule wouldn't work for Markdown. +Markdown's email-style [blockquoting][bq] and multi-paragraph [list items][l] +work best -- and look better -- when you format them with hard breaks. + + [bq]: #blockquote + [l]: #list + + + + + +Markdown supports two styles of headers, [Setext] [1] and [atx] [2]. + +Setext-style headers are "underlined" using equal signs (for first-level +headers) and dashes (for second-level headers). For example: + + This is an H1 + ============= + + This is an H2 + ------------- + +Any number of underlining `=`'s or `-`'s will work. + +Atx-style headers use 1-6 hash characters at the start of the line, +corresponding to header levels 1-6. For example: + + # This is an H1 + + ## This is an H2 + + ###### This is an H6 + +Optionally, you may "close" atx-style headers. This is purely +cosmetic -- you can use this if you think it looks better. The +closing hashes don't even need to match the number of hashes +used to open the header. (The number of opening hashes +determines the header level.) : + + # This is an H1 # + + ## This is an H2 ## + + ### This is an H3 ###### + + +

      Blockquotes

      + +Markdown uses email-style `>` characters for blockquoting. If you're +familiar with quoting passages of text in an email message, then you +know how to create a blockquote in Markdown. It looks best if you hard +wrap the text and put a `>` before every line: + + > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, + > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. + > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. + > + > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse + > id sem consectetuer libero luctus adipiscing. + +Markdown allows you to be lazy and only put the `>` before the first +line of a hard-wrapped paragraph: + + > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, + consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. + Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. + + > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse + id sem consectetuer libero luctus adipiscing. + +Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by +adding additional levels of `>`: + + > This is the first level of quoting. + > + > > This is nested blockquote. + > + > Back to the first level. + +Blockquotes can contain other Markdown elements, including headers, lists, +and code blocks: + + > ## This is a header. + > + > 1. This is the first list item. + > 2. This is the second list item. + > + > Here's some example code: + > + > return shell_exec("echo $input | $markdown_script"); + +Any decent text editor should make email-style quoting easy. For +example, with BBEdit, you can make a selection and choose Increase +Quote Level from the Text menu. + + +

      Lists

      + +Markdown supports ordered (numbered) and unordered (bulleted) lists. + +Unordered lists use asterisks, pluses, and hyphens -- interchangably +-- as list markers: + + * Red + * Green + * Blue + +is equivalent to: + + + Red + + Green + + Blue + +and: + + - Red + - Green + - Blue + +Ordered lists use numbers followed by periods: + + 1. Bird + 2. McHale + 3. Parish + +It's important to note that the actual numbers you use to mark the +list have no effect on the HTML output Markdown produces. The HTML +Markdown produces from the above list is: + +
        +
      1. Bird
      2. +
      3. McHale
      4. +
      5. Parish
      6. +
      + +If you instead wrote the list in Markdown like this: + + 1. Bird + 1. McHale + 1. Parish + +or even: + + 3. Bird + 1. McHale + 8. Parish + +you'd get the exact same HTML output. The point is, if you want to, +you can use ordinal numbers in your ordered Markdown lists, so that +the numbers in your source match the numbers in your published HTML. +But if you want to be lazy, you don't have to. + +If you do use lazy list numbering, however, you should still start the +list with the number 1. At some point in the future, Markdown may support +starting ordered lists at an arbitrary number. + +List markers typically start at the left margin, but may be indented by +up to three spaces. List markers must be followed by one or more spaces +or a tab. + +To make lists look nice, you can wrap items with hanging indents: + + * Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. + * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. + +But if you want to be lazy, you don't have to: + + * Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. + * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. + +If list items are separated by blank lines, Markdown will wrap the +items in `

      ` tags in the HTML output. For example, this input: + + * Bird + * Magic + +will turn into: + +

        +
      • Bird
      • +
      • Magic
      • +
      + +But this: + + * Bird + + * Magic + +will turn into: + +
        +
      • Bird

      • +
      • Magic

      • +
      + +List items may consist of multiple paragraphs. Each subsequent +paragraph in a list item must be intended by either 4 spaces +or one tab: + + 1. This is a list item with two paragraphs. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. Aliquam hendrerit + mi posuere lectus. + + Vestibulum enim wisi, viverra nec, fringilla in, laoreet + vitae, risus. Donec sit amet nisl. Aliquam semper ipsum + sit amet velit. + + 2. Suspendisse id sem consectetuer libero luctus adipiscing. + +It looks nice if you indent every line of the subsequent +paragraphs, but here again, Markdown will allow you to be +lazy: + + * This is a list item with two paragraphs. + + This is the second paragraph in the list item. You're + only required to indent the first line. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. + + * Another item in the same list. + +To put a blockquote within a list item, the blockquote's `>` +delimiters need to be indented: + + * A list item with a blockquote: + + > This is a blockquote + > inside a list item. + +To put a code block within a list item, the code block needs +to be indented *twice* -- 8 spaces or two tabs: + + * A list item with a code block: + + + + +It's worth noting that it's possible to trigger an ordered list by +accident, by writing something like this: + + 1986. What a great season. + +In other words, a *number-period-space* sequence at the beginning of a +line. To avoid this, you can backslash-escape the period: + + 1986\. What a great season. + + + +

      Code Blocks

      + +Pre-formatted code blocks are used for writing about programming or +markup source code. Rather than forming normal paragraphs, the lines +of a code block are interpreted literally. Markdown wraps a code block +in both `
      ` and `` tags.
      +
      +To produce a code block in Markdown, simply indent every line of the
      +block by at least 4 spaces or 1 tab. For example, given this input:
      +
      +    This is a normal paragraph:
      +
      +        This is a code block.
      +
      +Markdown will generate:
      +
      +    

      This is a normal paragraph:

      + +
      This is a code block.
      +    
      + +One level of indentation -- 4 spaces or 1 tab -- is removed from each +line of the code block. For example, this: + + Here is an example of AppleScript: + + tell application "Foo" + beep + end tell + +will turn into: + +

      Here is an example of AppleScript:

      + +
      tell application "Foo"
      +        beep
      +    end tell
      +    
      + +A code block continues until it reaches a line that is not indented +(or the end of the article). + +Within a code block, ampersands (`&`) and angle brackets (`<` and `>`) +are automatically converted into HTML entities. This makes it very +easy to include example HTML source code using Markdown -- just paste +it and indent it, and Markdown will handle the hassle of encoding the +ampersands and angle brackets. For example, this: + + + +will turn into: + +
      <div class="footer">
      +        &copy; 2004 Foo Corporation
      +    </div>
      +    
      + +Regular Markdown syntax is not processed within code blocks. E.g., +asterisks are just literal asterisks within a code block. This means +it's also easy to use Markdown to write about Markdown's own syntax. + + + +

      Horizontal Rules

      + +You can produce a horizontal rule tag (`
      `) by placing three or +more hyphens, asterisks, or underscores on a line by themselves. If you +wish, you may use spaces between the hyphens or asterisks. Each of the +following lines will produce a horizontal rule: + + * * * + + *** + + ***** + + - - - + + --------------------------------------- + + _ _ _ + + +* * * + +

      Span Elements

      + + + +Markdown supports two style of links: *inline* and *reference*. + +In both styles, the link text is delimited by [square brackets]. + +To create an inline link, use a set of regular parentheses immediately +after the link text's closing square bracket. Inside the parentheses, +put the URL where you want the link to point, along with an *optional* +title for the link, surrounded in quotes. For example: + + This is [an example](http://example.com/ "Title") inline link. + + [This link](http://example.net/) has no title attribute. + +Will produce: + +

      This is + an example inline link.

      + +

      This link has no + title attribute.

      + +If you're referring to a local resource on the same server, you can +use relative paths: + + See my [About](/about/) page for details. + +Reference-style links use a second set of square brackets, inside +which you place a label of your choosing to identify the link: + + This is [an example][id] reference-style link. + +You can optionally use a space to separate the sets of brackets: + + This is [an example] [id] reference-style link. + +Then, anywhere in the document, you define your link label like this, +on a line by itself: + + [id]: http://example.com/ "Optional Title Here" + +That is: + +* Square brackets containing the link identifier (optionally + indented from the left margin using up to three spaces); +* followed by a colon; +* followed by one or more spaces (or tabs); +* followed by the URL for the link; +* optionally followed by a title attribute for the link, enclosed + in double or single quotes. + +The link URL may, optionally, be surrounded by angle brackets: + + [id]: "Optional Title Here" + +You can put the title attribute on the next line and use extra spaces +or tabs for padding, which tends to look better with longer URLs: + + [id]: http://example.com/longish/path/to/resource/here + "Optional Title Here" + +Link definitions are only used for creating links during Markdown +processing, and are stripped from your document in the HTML output. + +Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are *not* case sensitive. E.g. these two links: + + [link text][a] + [link text][A] + +are equivalent. + +The *implicit link name* shortcut allows you to omit the name of the +link, in which case the link text itself is used as the name. +Just use an empty set of square brackets -- e.g., to link the word +"Google" to the google.com web site, you could simply write: + + [Google][] + +And then define the link: + + [Google]: http://google.com/ + +Because link names may contain spaces, this shortcut even works for +multiple words in the link text: + + Visit [Daring Fireball][] for more information. + +And then define the link: + + [Daring Fireball]: http://daringfireball.net/ + +Link definitions can be placed anywhere in your Markdown document. I +tend to put them immediately after each paragraph in which they're +used, but if you want, you can put them all at the end of your +document, sort of like footnotes. + +Here's an example of reference links in action: + + I get 10 times more traffic from [Google] [1] than from + [Yahoo] [2] or [MSN] [3]. + + [1]: http://google.com/ "Google" + [2]: http://search.yahoo.com/ "Yahoo Search" + [3]: http://search.msn.com/ "MSN Search" + +Using the implicit link name shortcut, you could instead write: + + I get 10 times more traffic from [Google][] than from + [Yahoo][] or [MSN][]. + + [google]: http://google.com/ "Google" + [yahoo]: http://search.yahoo.com/ "Yahoo Search" + [msn]: http://search.msn.com/ "MSN Search" + +Both of the above examples will produce the following HTML output: + +

      I get 10 times more traffic from Google than from + Yahoo + or MSN.

      + +For comparison, here is the same paragraph written using +Markdown's inline link style: + + I get 10 times more traffic from [Google](http://google.com/ "Google") + than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or + [MSN](http://search.msn.com/ "MSN Search"). + +The point of reference-style links is not that they're easier to +write. The point is that with reference-style links, your document +source is vastly more readable. Compare the above examples: using +reference-style links, the paragraph itself is only 81 characters +long; with inline-style links, it's 176 characters; and as raw HTML, +it's 234 characters. In the raw HTML, there's more markup than there +is text. + +With Markdown's reference-style links, a source document much more +closely resembles the final output, as rendered in a browser. By +allowing you to move the markup-related metadata out of the paragraph, +you can add links without interrupting the narrative flow of your +prose. + + +

      Emphasis

      + +Markdown treats asterisks (`*`) and underscores (`_`) as indicators of +emphasis. Text wrapped with one `*` or `_` will be wrapped with an +HTML `` tag; double `*`'s or `_`'s will be wrapped with an HTML +`` tag. E.g., this input: + + *single asterisks* + + _single underscores_ + + **double asterisks** + + __double underscores__ + +will produce: + + single asterisks + + single underscores + + double asterisks + + double underscores + +You can use whichever style you prefer; the lone restriction is that +the same character must be used to open and close an emphasis span. + +Emphasis can be used in the middle of a word: + + un*fucking*believable + +But if you surround an `*` or `_` with spaces, it'll be treated as a +literal asterisk or underscore. + +To produce a literal asterisk or underscore at a position where it +would otherwise be used as an emphasis delimiter, you can backslash +escape it: + + \*this text is surrounded by literal asterisks\* + + + +

      Code

      + +To indicate a span of code, wrap it with backtick quotes (`` ` ``). +Unlike a pre-formatted code block, a code span indicates code within a +normal paragraph. For example: + + Use the `printf()` function. + +will produce: + +

      Use the printf() function.

      + +To include a literal backtick character within a code span, you can use +multiple backticks as the opening and closing delimiters: + + ``There is a literal backtick (`) here.`` + +which will produce this: + +

      There is a literal backtick (`) here.

      + +The backtick delimiters surrounding a code span may include spaces -- +one after the opening, one before the closing. This allows you to place +literal backtick characters at the beginning or end of a code span: + + A single backtick in a code span: `` ` `` + + A backtick-delimited string in a code span: `` `foo` `` + +will produce: + +

      A single backtick in a code span: `

      + +

      A backtick-delimited string in a code span: `foo`

      + +With a code span, ampersands and angle brackets are encoded as HTML +entities automatically, which makes it easy to include example HTML +tags. Markdown will turn this: + + Please don't use any `` tags. + +into: + +

      Please don't use any <blink> tags.

      + +You can write this: + + `—` is the decimal-encoded equivalent of `—`. + +to produce: + +

      &#8212; is the decimal-encoded + equivalent of &mdash;.

      + + + +

      Images

      + +Admittedly, it's fairly difficult to devise a "natural" syntax for +placing images into a plain text document format. + +Markdown uses an image syntax that is intended to resemble the syntax +for links, allowing for two styles: *inline* and *reference*. + +Inline image syntax looks like this: + + ![Alt text](/path/to/img.jpg) + + ![Alt text](/path/to/img.jpg "Optional title") + +That is: + +* An exclamation mark: `!`; +* followed by a set of square brackets, containing the `alt` + attribute text for the image; +* followed by a set of parentheses, containing the URL or path to + the image, and an optional `title` attribute enclosed in double + or single quotes. + +Reference-style image syntax looks like this: + + ![Alt text][id] + +Where "id" is the name of a defined image reference. Image references +are defined using syntax identical to link references: + + [id]: url/to/image "Optional title attribute" + +As of this writing, Markdown has no syntax for specifying the +dimensions of an image; if this is important to you, you can simply +use regular HTML `` tags. + + +* * * + + +

      Miscellaneous

      + + + +Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this: + + + +Markdown will turn this into: + + http://example.com/ + +Automatic links for email addresses work similarly, except that +Markdown will also perform a bit of randomized decimal and hex +entity-encoding to help obscure your address from address-harvesting +spambots. For example, Markdown will turn this: + + + +into something like this: + + address@exa + mple.com + +which will render in a browser as a clickable link to "address@example.com". + +(This sort of entity-encoding trick will indeed fool many, if not +most, address-harvesting bots, but it definitely won't fool all of +them. It's better than nothing, but an address published in this way +will probably eventually start receiving spam.) + + + +

      Backslash Escapes

      + +Markdown allows you to use backslash escapes to generate literal +characters which would otherwise have special meaning in Markdown's +formatting syntax. For example, if you wanted to surround a word with +literal asterisks (instead of an HTML `` tag), you can backslashes +before the asterisks, like this: + + \*literal asterisks\* + +Markdown provides backslash escapes for the following characters: + + \ backslash + ` backtick + * asterisk + _ underscore + {} curly braces + [] square brackets + () parentheses + # hash mark + + plus sign + - minus sign (hyphen) + . dot + ! exclamation mark + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/testing.sh b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/testing.sh new file mode 100755 index 0000000..683afc8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/testing.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +source ~/.profile + +COMMAND="$@" +if [[ -z "$COMMAND" ]]; then COMMAND="rake test"; fi + +for VERSION in `rvm list strings | sort`; do + rvm $VERSION + echo $(ruby -v) + RUBYOPT=-rubygems $COMMAND +done diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/timing.sh b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/timing.sh new file mode 100755 index 0000000..fc009a3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/benchmark/timing.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +source ~/.bashrc + +for VERSION in `rvm list strings | sort`; do + rvm $VERSION + echo $(ruby -v) + ruby -Ilib bin/kramdown < benchmark/mdsyntax.text 2>/dev/null >/dev/null + time ruby -Ilib bin/kramdown < benchmark/mdsyntax.text 2>/dev/null >/dev/null +done diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/bin/kramdown b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/bin/kramdown new file mode 100755 index 0000000..ba8acef --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/bin/kramdown @@ -0,0 +1,90 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- +# +#-- +# Copyright (C) 2009-2015 Thomas Leitner +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'optparse' +require 'rbconfig' +require 'yaml' +require 'kramdown' + +config_file = nil +begin + config_dir = case RbConfig::CONFIG['host_os'] + when /bccwin|cygwin|djgpp|mingw|mswin|wince/i + File.expand_path((ENV['HOME'] || ENV['USERPROFILE'] || "~") + "/AppData/Local") + when /darwin|mac os/ + File.expand_path("~/Library/Preferences/") + else + File.expand_path(ENV['XDG_CONFIG_HOME'] || '~/.config') + end + config_file = File.join(config_dir, "kramdownrc") +rescue +end + +options = if config_file && File.exist?(config_file) + YAML.safe_load(File.read(config_file), [Symbol]) + else + {} + end +format = ['html'] + +OptionParser.new do |opts| + opts.banner = "Usage: kramdown [options] [FILE FILE ...]" + opts.summary_indent = ' '*4 + + opts.separator "" + opts.separator "Command line options:" + opts.separator "" + + opts.on("-i", "--input ARG", "Specify the input format: kramdown (default), " \ + "html, GFM or markdown") {|v| options[:input] = v} + opts.on("-o", "--output ARG", Array, "Specify one or more output formats separated by commas: " \ + "html (default),", "kramdown, latex, pdf, man or remove_html_tags") {|v| format = v} + + opts.on("-v", "--version", "Show the version of kramdown") do + puts Kramdown::VERSION + exit + end + opts.on("-h", "--help", "Show the help") do + puts opts.summarize('', 5, 72) + exit + end + + opts.separator "" + opts.separator "kramdown options:" + opts.separator "" + + Kramdown::Options.definitions.sort.each do |n, definition| + no = n.to_s.tr('_', '-') + if definition.type == Kramdown::Options::Boolean + opts.on("--[no-]#{no}") {|v| options[n] = Kramdown::Options.parse(n, v)} + else + type = definition.type + type = String if type == Symbol || type == Object + opts.on("--#{no} ARG", type) {|v| options[n] = Kramdown::Options.parse(n, v)} + end + + definition.desc.split(/\n/).each do |line| + opts.separator opts.summary_indent + ' '*6 + line + end + opts.separator '' + end + +end.parse! + +begin + doc = Kramdown::Document.new(ARGF.read, options) + result = '' + format.each {|f| result = doc.send("to_#{f}")} + puts result + doc.warnings.each {|warn| $stderr.puts "Warning: #{warn}"} +rescue Kramdown::Error => e + $stderr.puts "Error: #{e.message}" + exit(1) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/data/kramdown/document.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/data/kramdown/document.html new file mode 100644 index 0000000..731d0ea --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/data/kramdown/document.html @@ -0,0 +1,22 @@ + + + + <% if @converter.root.options[:encoding] %> + + <% end %> +<% +extend ::Kramdown::Utils::Html +title = '' +h = @converter.root.children.find {|c| c.type == :header} +if h + collector = lambda {|c| c.children.collect {|cc| cc.type == :text ? escape_html(cc.value, :text) : collector.call(cc)}.join('')} + title = collector.call(h) +end +%> + <%= title %> + + + + <%= @body %> + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/data/kramdown/document.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/data/kramdown/document.latex new file mode 100644 index 0000000..acdf346 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/data/kramdown/document.latex @@ -0,0 +1,50 @@ +<% +encmap = { + 'UTF-8' => 'utf8x', + 'US-ASCII' => 'ascii', + 'ISO-8859-1' => 'latin1', + 'ISO-8859-2' => 'latin2', + 'ISO-8859-3' => 'latin3', + 'ISO-8859-4' => 'latin4', + 'ISO-8859-5' => 'latin5', + 'ISO-8859-9' => 'latin9', + 'ISO-8859-10' => 'latin10', + 'CP850' => 'cp850', + 'CP852' => 'cp852', + 'CP858' => 'cp858', + 'CP437' => 'cp437', + 'CP865' => 'cp865', + 'CP1250' => 'cp120', + 'CP1252' => 'cp1252', + 'CP1257' => 'cp1257' +} +%> +\documentclass{scrartcl} +<% if RUBY_VERSION >= '1.9' %> +\usepackage[<%= encmap[@body.encoding.name] %>]{inputenc} +<% else %> +\usepackage[mathletters]{ucs} +\usepackage[utf8x]{inputenc} +<% end %> +\usepackage[T1]{fontenc} +\usepackage{listings} +<% @converter.data[:packages].each {|pkg| %>\usepackage{<%= pkg %>} +<% } %> +\usepackage{hyperref} + +<% if @converter.data[:packages].include?('fancyvrb') %> +\VerbatimFootnotes +<% end %> + +<% if @converter.data[:packages].include?('acronym') %> +<% @converter.root.options[:abbrev_defs].each_pair do |k,v| %>\acrodef{<%= @converter.normalize_abbreviation_key(k) %>}[<%= k %>]{<%= @converter.escape(v) %>} +<% end %> +<% end %> + +\setcounter{footnote}{<%= @converter.options[:footnote_nr] - 1 %>} + +\hypersetup{colorlinks=true,urlcolor=blue} + +\begin{document} +<%= @body %> +\end{document} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/_design.scss b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/_design.scss new file mode 100644 index 0000000..1a42fe3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/_design.scss @@ -0,0 +1,441 @@ +/* Based on the Less Framework 4 + http://lessframework.com + by Joni Korpi + License: http://opensource.org/licenses/mit-license.php */ + + +/***** Variables for easy customization *****/ + +/* the baseline height in px */ +$baseline-height: 24; + +/* The overlay color for the background image */ +$bg-grad-color: rgba(255,255,128,0.1); + +/* The font size of the logo in px */ +$logo-size: 36; + +/* Color settings */ +$link-color: #1666A3; + + + +/* Resets + ------ */ + +html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, +p, blockquote, pre, a, abbr, address, cite, code, del, dfn, em, +img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, hr, +dl, dt, dd, ol, ul, li, fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, figure, figcaption, hgroup, +menu, footer, header, nav, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; +} + +article, aside, canvas, figure, figure img, figcaption, hgroup, +footer, header, nav, section, audio, video { + display: block; +} + +a img {border: 0;} + + + +/* Typography presets + ------------------ */ + +.gigantic { + font-size: 59px; + line-height: 72px; +} + +.huge { + font-size: 36px; + line-height: 48px; +} + +.large { + font-size: 23px; + line-height: 24px; +} + +.bigger { + font-size: 18px; + line-height: 24px; +} + +.big { + font-size: 14px; + line-height: 24px; +} + +body { + font: 14px/24px 'Palatino Linotype', 'Book Antiqua', Palatino, serif; +} + +.small, small { + font-size: 12px; + line-height: 24px; +} + +*:target::after { + content: " ☜"; +} + + +/* Typographics grid overlay */ + +.grid{ + background-image: -moz-linear-gradient(top, rgba(0,0,0,0) 95%, rgba(0,0,0,0.3) 100%); /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(95%,rgba(0,0,0,0)), color-stop(100%,rgba(0,0,0,0.3))); /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, rgba(0,0,0,0) 95%,rgba(0,0,0,0.3) 100%); /* Chrome10+,Safari5.1+ */ + background-image: -o-linear-gradient(top, rgba(0,0,0,0) 95%, rgba(0,0,0,0.3) 100%); /* Opera11.10+ */ + background-image: -ms-linear-gradient(top, rgba(0,0,0,0) 95%,rgba(0,0,0,0.3) 100%); /* IE10+ */ + background-image: linear-gradient(top, rgba(0,0,0,0.3) 95%,rgba(0,0,0,0.3) 100%); /* W3C */ + + -webkit-background-size: 100% #{$baseline-height}px; + -o-background-size: 100% #{$baseline-height}px; + background-size: 100% #{$baseline-height}px; +} + + +/* Basic mixins */ + +@mixin background { + background-image: -moz-linear-gradient($bg-grad-color, $bg-grad-color), url('bg.png'); + background-image: -webkit-linear-gradient($bg-grad-color, $bg-grad-color), url('bg.png'); + background-image: -o-linear-gradient($bg-grad-color, $bg-grad-color), url('bg.png'); + background-image: -ms-linear-gradient($bg-grad-color, $bg-grad-color), url('bg.png'); + background-image: linear-gradient($bg-grad-color, $bg-grad-color), url('bg.png'); +} + +@mixin typography($size: big) { + h3, h4, h5, h6, p, ul, ol, dl, pre, blockquote, table { + margin-top: 24px; + margin-bottom: 24px; + } + + @if $size == big { + h1 { @extend .huge } + h2 { @extend .large } + h3 { @extend .bigger } + h4,h5,h6 { @extend .big } + } @else { + h1 { @extend .large } + h2 { @extend .bigger } + h3,h4,h5,h6 { @extend .big } + } + + h1, h2, h3, h4, h5, h6 { + font-weight: normal; + padding-left: 48px; + margin-left: -48px; + margin-top: 36px; + margin-bottom: -12px; + } + + ul, ol, dd { + padding-left: 24px; + } + + ul ul, ul ol, ol ul, ol ol { + margin-top: 0; + margin-bottom: 0; + } + + pre { + padding-left: 12px; + padding-right: 12px; + border: 1px solid #ccc; + font-family: "Bitstream Vera Sans Mono", Consolas, monospace; + } + + dt { + font-weight: bold; + } + + a { + color: $link-color; + text-decoration: underline; + } + + a:hover, a:link { + color: $link-color / 2; + } +} + +/* Default Layout: 992px. + Gutters: 24px. + Outer margins: 48px. + Leftover space for scrollbars @1024px: 32px. + ------------------------------------------------------------------------------- + cols 1 2 3 4 5 6 7 8 9 10 + px 68 160 252 344 436 528 620 712 804 896 */ + +body { + width: 992px; + margin: 0 auto 48px; + color: rgb(60,60,60); + -webkit-text-size-adjust: 100%; /* Stops Mobile Safari from auto-adjusting font-sizes */ + @include background; +} + +body > header { + position: relative; + padding: 12px; + font-family: Verdana; + color: #eee; + -moz-box-shadow: 0 0 24px rgba(0,0,0,0.6); + -webkit-box-shadow: 0 0 24px rgba(0,0,0,0.6); + box-shadow: 0 0 24px rgba(0,0,0,0.6); + z-index: 1; +} + +#logo { + font-size: #{$logo-size}px; + line-height: #{$baseline-height * (floor($logo-size / $baseline-height) + 1)}px; + margin: 12px; + text-shadow: 0px 2px 5px rgba(0, 0, 0, 0.5); + + a { + color: #eee; + text-decoration: none; + + &:hover { + color: #fff; + } + } + +} + +#slogan { + font-size: 100%; + margin: 12px; + text-shadow: 0px 2px 5px rgba(0, 0, 0, 0.5); +} + +nav { + position: absolute; + bottom: 0px; + right: 0px; + background-color: rgba(255,255,255,0.1); + + li { + display: inline-block; + } + + ul { + margin: 0; + padding: 0; + } + + a, span { + display: block; + padding: 12px; + color: #ccc; + text-decoration: none; + } + + span { + background-color: rgba(255,255,255,0.3); + } + + a:hover { + background-color: rgba(255,255,255,0.3); + } + +} + +#wrapper { + clear: both; + position: relative; + background-color: white; + -moz-box-shadow: 0 0 24px rgba(0,0,0,0.6); + -webkit-box-shadow: 0 0 24px rgba(0,0,0,0.6); + box-shadow: 0 0 24px rgba(0,0,0,0.6); +} + +aside { + float: right; + right: 0; + background-color: white; + width: 252px; + padding: 24px; + + @include typography(small); + + h1, h2, h3, h4, h5, h6 { + padding-left: 48px; + margin-left: -48px; + } +} + + +aside.banner { + @include background; + position: relative; + width: inherit; + margin: 0; + float: none; + padding: 24px; + border: 10px solid rgba(255,255,255,0.1); + color: #ccc; + font-size: 36px; + line-height: 48px; + + a { + color: #ccc; + text-decoration: underline; + } + + a:hover { + background-color: rgba(255,255,255,0.3); + } + + p { + margin: 0; + } + + p + p { + margin-top: 24px; + } +} + +#content { + width: 620px; + padding: 24px 48px; + + @include typography(big); +} + +footer { + background-color: rgba(255,255,255,0.1); + min-height: 24px; + color: #eee; +} + + +/* Tablet Layout: 768px. + Gutters: 24px. + Outer margins: 28px. + Inherits styles from: Default Layout. + ----------------------------------------------------------------- + cols 1 2 3 4 5 6 7 8 + px 68 160 252 344 436 528 620 712 */ + +@media only screen and (min-width: 768px) and (max-width: 1005px) { + + body { + width: 716px; + } + + body > header { + padding: 0; + } + + aside { + position: static; + float: right; + } + + nav { + position: relative; + margin-top: 12px; + } +} + + + +/* Mobile Layout: 320px. + Gutters: 24px. + Outer margins: 34px. + Inherits styles from: Default Layout. + --------------------------------------------- + cols 1 2 3 + px 68 160 252 */ + +@media only screen and (max-width: 767px) { + + body { + width: 320px; + } + + body > header { + padding: 0; + } + + nav { + position: relative; + margin-top: 12px; + } + + aside { + position: relative; + } + + #content, aside { + width: 296px; + padding: 24px 12px; + } + + #content { + h1, h2, h3, h4, h5, h6 { + padding-left: 12px; + margin-left: -12px; + } + } + +} + + + +/* Wide Mobile Layout: 480px. + Gutters: 24px. + Outer margins: 22px. + Inherits styles from: Default Layout, Mobile Layout. + ------------------------------------------------------------ + cols 1 2 3 4 5 + px 68 160 252 344 436 */ + +@media only screen and (min-width: 480px) and (max-width: 767px) { + + body { + width: 90%; + } + + aside { + position: relative; + } + + #content, aside { + width: inherit; + padding: 24px 48px; + } + + #content { + h1, h2, h3, h4, h5, h6 { + padding-left: 48px; + margin-left: -48px; + } + } + +} + + +/* Retina media query. + Overrides styles for devices with a + device-pixel-ratio of 2+, such as iPhone 4. + ----------------------------------------------- */ + +@media +only screen and (-webkit-min-device-pixel-ratio: 2), +only screen and (min-device-pixel-ratio: 2) { + + body { + + } + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/bg.png b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b4df134dee0896f31dda02cc8773a68a263e771d GIT binary patch literal 56156 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 LNkvXXu0mjfZuDE* literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/default.scss b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/default.scss new file mode 100644 index 0000000..f76dca4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/default.scss @@ -0,0 +1,217 @@ +@import 'design'; + +a:hover { + background-color: rgba(0,0,0,0.1); +} + +aside.banner { + font-size: 18px; + line-height: 27px; +} + +aside a { + text-decoration: none; + + &:hover, &:link { + text-decoration: underline; + } + +} + +#content { + blockquote.information { + border-left: 12px solid #080; + background-color: #bfb; + padding: 12px 12px 12px 0; + margin-left: -48px; + padding-left: 48px; + } + + blockquote.markdown-difference { + border-left: 12px solid #dc0; + background-color: #ffa; + padding: 12px 12px 12px 0; + margin-left: -48px; + padding-left: 48px; + + &:before { + content: "Difference to Standard Markdown"; + display: block; + font-weight: bold; + } + } + + blockquote pre { + border: none; + } + + table { + border-collapse: collapse; + margin-left: auto; + margin-right: auto; + width: 100%; + + td, th { + padding: 3px 5px; + } + th { + background-color: #080; + color: white; + } + } + + pre.show-whitespaces .ws-space { + background-color: #f44; + } + pre.show-whitespaces .ws-space-l { + background-color: #f22; + } + pre.show-whitespaces .ws-space-r { + background-color: #f00; + } + pre.show-whitespaces .ws-tab { + background-color: #ff4; + } + pre.show-whitespaces .ws-tab-l { + background-color: #ff2; + } + pre.show-whitespaces .ws-tab-r { + background-color: #ff0; + } + pre.show-whitespaces.ws-lr .ws-tab { + background-color: inherit; + } + pre.show-whitespaces.ws-lr .ws-space { + background-color: inherit; + opacity: 0; + } + + table.kdexample td { + vertical-align: top; + } + + table.kdexample pre { + margin: 5px 0px; + } + + .kdexample:hover .kdexample-after-source { + display: block; + } + + .kdexample-after-source { + display: none; + background-color: #ffffee; + border: 2px solid #e6e8e9; + margin: 0 10px; + padding: 5px; + } + + .kdexample-after-live { + background-color: #eeffee; + border: 2px solid #e6e8e9; + margin: 5px 0px 12px; + padding: 5px; + } + + div.kdsyntaxlink { + float: right; + position: relative; + top: -17px; + padding: 5px; + border: 1px solid #e6e8e9; + margin-right: 10px; + margin-left: 10px; + + a { + text-decoration: none; + } + } +} + +.news-item { + border-top: 2px solid #ddd; + margin-top: 46px; +} + +.news-date { + float: right; + margin-top: 2px; + font-size: small; + color: #888; +} + +footer { + clear: both; + font-size: 92%; + text-align: left; + + a { + color: #898989; + + &:hover { + text-decoration: none; + color: #666; + } + } +} + +/* common rules */ +acronym { + cursor: help; + border-bottom: 1px solid #777; +} + +.float-left { + float: left; +} + +.float-right { + float: right; +} + +.a-left, tr.a-left td { + text-align: left; +} + +.a-center, tr.a-center td { + text-align: center; +} + +.a-right, tr.a-right td { + text-align: right; +} + +.clear { + clear: both; +} + +.inline-important { + font-weight: bold; + display: block; + text-align: center; +} + + +.patreon, .patreon:hover { + border-radius: 50px; + padding: 5px 10px; + margin: 0 5px; + display: inline-block; + text-decoration: none !important; + background-color: #e6461a !important; + box-shadow: 0px 0px 5px 5px #e6461a; + color: white !important; + font-weight: bold; + + &:hover { + box-shadow: 0px 0px 0px 5px #e6461a; + } +} + +#call-to-arms { + text-align: center; + margin: 40px 0 10px; + background-color: rgba(255, 255, 255, 0.18); + padding: 30px; + border-radius: 100px; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/default.template b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/default.template new file mode 100644 index 0000000..a9616d1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/default.template @@ -0,0 +1,62 @@ + + + + + + + + + + + + {title:} | kramdown + + +
      +
      +

      kramdown

      +

      fast, pure-Ruby Markdown-superset converter

      +
      + + +
      + +
      + <% if context.content_node.blocks.has_key?('intro') %> + + <% end %> + + + +
      + +
      +
      +
      + +
      +
      Copyright © 2009-2016 Thomas Leitner
      +
      Generated by webgen
      +
      + + + + + + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/documentation.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/documentation.page new file mode 100644 index 0000000..ebafaaf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/documentation.page @@ -0,0 +1,84 @@ +--- +title: Documentation +in_menu: true +sort_info: 7 +--- +# kramdown Documentation + +## Overview + +kramdown is first and foremost a library for converting text written in a superset of Markdown to +HTML. However, due to its modular architecture it is able to support additional input and output +formats. The following input and output formats are currently supported: + +* Input: [kramdown](parser/kramdown.html) (a superset of Markdown), + [Markdown](parser/markdown.html), [Github Flavored Markdown](parser/gfm.html), [HTML](parser/html.html) + +* Output: [HTML](converter/html.html), [LaTeX](converter/latex.html), + [kramdown](converter/kramdown.html), [RemoveHtmlTags](converter/remove_html_tags.html) (a special + converter which removes HTML tags, normally used in conjunction with the LaTeX or kramdown + converters) + +The [kramdown syntax page](syntax.html) describes in detail what is supported and how it differs +from standard Markdown. + +For all available options have a look at the [options documentation](options.html) or have a look at +a parser/converter page to see which options they support! + + +## Usage + +{:ruby: .language-ruby} + +The kramdown package provides two ways for using it: + +* **As a library** + + kramdown uses basically the same API as [RedCloth], [BlueCloth] and [Maruku]: + + require 'kramdown' + + puts Kramdown::Document.new(text).to_html + {:ruby} + + The second parameter to the `new` call is an options hash for (de)activating certain features. For + example, to disable automatic header ID generation, you can do the following: + + puts Kramdown::Document.new(text, :auto_ids => false).to_html + {:ruby} + + The default parser used is `kramdown`, however, you can select a different one with the `:input` + option: + + puts Kramdown::Document.new(text, :input => 'html').to_latex + {:ruby} + + You can also reuse the created document object to produce multiple outputs: + + doc = Kramdown::Document.new(text, :input => 'html') + puts doc.to_html + puts doc.to_latex + {:ruby} + + More information on how to use or extend kramdown can be found in the [API + documentation](rdoc/index.html)! + +* **As an application** + + Together with the library files a binary called `kramdown` is shipped which can be used to convert + text in any supported input format to any supported output format. It either reads from the files + specified as the command line arguments or from the standard input. For example: + + kramdown path/to/kramdown/doc/syntax.page + + The input and output formats as well as all available kramdown options are supported through + command line switches. + + +## Tests + +kramdown uses various test suites to verify the correct working of the parsers and converters. For +more information, have a look at the [tests document](tests.html). + + +{include_file: doc/links.markdown} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/documentation.template b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/documentation.template new file mode 100644 index 0000000..51e0c36 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/documentation.template @@ -0,0 +1,35 @@ +--- name:sidebar pipeline:erb,tags,kramdown + + +

      Documentation

      + +* Parsers + * [kramdown](parser/kramdown.html) + * [Markdown](parser/markdown.html) + * [GFM](parser/gfm.html) + * [HTML](parser/html.html) +* Converters + * [HTML](converter/html.html) + * [LaTeX](converter/latex.html) + * [man](converter/man.html) + * [kramdown](converter/kramdown.html) + * [RemoveHtmlTags](converter/remove_html_tags.html) +* Syntax Highlighters + * [Coderay](syntax_highlighter/coderay.html) + * [Rouge](syntax_highlighter/rouge.html) +* Math Engines + * [MathJax](math_engine/mathjax.html) + * [Ritex](math_engine/ritex.html) + * [itex2MML](math_engine/itex2mml.html) + * [Mathjax-Node](math_engine/mathjaxnode.html) + * [SsKaTeX](math_engine/sskatex.html) +* [Configuration Options](options.html) +* [Tests](tests.html) + +<% if context.node.children.first && context.node.children.first.children.length > 1 %> +

      Contents

      +<% end %> + +{menu: {options: {descendants: true, levels: [3,6]}}} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/index.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/index.page new file mode 100644 index 0000000..146bf94 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/index.page @@ -0,0 +1,113 @@ +--- +title: Home +in_menu: true +sort_info: 1 +--- +## Overview + +If you want to get started with kramdown, have a look at the [installation page](installation.html) +to see how you can install it on your system. Then look through the +[documentation](documentation.html) for finding information about how to actually use kramdown and +its parsers/converters. The [quick reference](quickref.html) provides a overview of the syntax -- if +you need a more detailed description of the superset of Markdown which kramdown supports the [syntax +page](syntax.html) is the place to go! + +{tikz:: +path: overview.png +img_attr: {style: 'background:transparent'} +content_processor.tikz.libraries: [mindmap, trees, arrows] +content_processor.tikz.transparent: true +content_processor.tikz.resolution: 300 100 +content_processor.tikz.opts: | + mindmap, concept color=black, text=white, + root concept/.append style={font=\Large}, + level 1 concept/.append style={font=\Large, minimum size=2.6cm}, + level 2 concept/.append style={font=\Large}, +} +\node[concept, font=\Large] (lib) {kramdown's internal representation} + child[concept color=orange, grow=120, ->] {node[concept] (i-kramdown) {kramdown}} + child[concept color=orange, grow=160] {node[concept] (i-html) {HTML}} + child[concept color=orange, grow=200] {node[concept] (i-gfm) {GFM}} + child[concept color=orange, grow=240] {node[concept] (i-markdown) {Markdown}} + child[concept color=green!50!black, grow=60] {node[concept] (o-html) {HTML}} + child[concept color=green!50!black, grow=20] {node[concept] (o-kramdown) {kramdown}} + child[concept color=green!50!black, grow=-20] { + node[concept] (o-latex) {\LaTeX} + child[grow=0] { + node[concept] (o-latex-pdf) {PDF} + } + } + child[concept color=green!50!black, grow=-60] {node[concept] (o-pdf) {PDF}} +; +\draw [dash pattern=on 0pt off 2pt,line width=5pt,arrows=-angle 60,shorten >=15pt,shorten <=10pt,color=orange] + (i-kramdown) edge(lib) + (i-markdown) edge(lib) + (i-html) edge (lib) + (i-gfm) edge (lib); +\draw [dash pattern=on 0pt off 2pt,line width=5pt,arrows=-angle 60,shorten >=10pt,shorten <=15pt,color=green!50!black] + (lib) edge(o-html) + (lib) edge (o-kramdown) + (lib) edge (o-latex) + (lib) edge (o-pdf); +{tikz} +{: style="text-align: center"} + + +## Bugs, Forums, Mailing Lists + +If you have found a bug, you should [report it here][bug_report]. Also, there is the [kramdown-users +google group][ml] available if you have any questions! + +[bug_report]: http://github.com/gettalong/kramdown/issues +[ml]: https://groups.google.com/forum/#!forum/kramdown-users + + +## Thanks + +kramdown would not be possible without the prior work of many other people. I want to thank everyone +involved with making Markdown such a nice markup language and especially the developers of other +Markdown implementations because kramdown borrowed many ideas from existing packages. + + +## Author + +* Thomas Leitner +* e-Mail: + +[PHP Markdown Extra]: http://michelf.com/projects/php-markdown/extra/ +[Maruku]: http://maruku.rubyforge.org +[BlueFeather]: http://ruby.morphball.net/bluefeather/index_en.html + +--- intro +
      + + + + +**kramdown**{:itemprop="name"} (sic, not Kramdown or KramDown, just kramdown) is a *free* +[MIT](https://github.com/gettalong/kramdown/blob/master/COPYING){:itemprop="license"}-licensed +[Ruby](http://www.ruby-lang.org) library for parsing and converting a superset of Markdown. It is +completely written in Ruby, supports standard Markdown (with some minor modifications) and various +extensions that have been made popular by the [PHP Markdown Extra] package and [Maruku]. +{:itemprop="description"} + +It is probably the fastest pure-Ruby Markdown converter available (September 2014), being about 3x +faster than [Maruku] and about 4.5x faster than [BlueFeather]. + +Version **1.16.2**{:itemprop="softwareVersion"} released on +**2017-11-29**{:itemprop="datePublished"}, [more news](news.html) +{: style="text-align: center; font-size: 80%"} + +
      + +
      +Support kramdown development and become a patron! +
      + + +[PHP Markdown Extra]: http://michelf.com/projects/php-markdown/extra/ +[Maruku]: http://maruku.rubyforge.org +[BlueFeather]: http://ruby.morphball.net/bluefeather/index_en.html diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/installation.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/installation.page new file mode 100644 index 0000000..179a1e9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/installation.page @@ -0,0 +1,88 @@ +--- +title: Installation +in_menu: true +sort_info: 5 +--- +# Download & Installation + +## Dependencies + +Since kramdown is written in Ruby, you just need the [Ruby interpreter](http://www.ruby-lang.org), +version 2.x. There are no other dependencies. + + +## Compatibility Notes + +kramdown should work on any platform which supports Ruby. It has been successfully tested on the +following platforms: + +* Linux with Ruby 2.x and jruby 9.0.0.0. + +See the platform specific installation notes for more information! + + +## Platform Specific Installation Instructions + +### Linux + +You need to make sure that Ruby is installed. If it isn't, consult the documentation of the Linux +distribution you are using on how to install it. For example, in case of Ubuntu 17.10 (this should +probably also work for any newer Ubuntu version or any recent Debian based distribution) all you +need to do is: + + sudo apt-get install ruby + +Once you have Ruby installed, you need to execute the following command to install kramdown: + + sudo gem install kramdown + + +### Mac OS X + +Mac OS X Snow Leopard comes with Ruby and Rubygems preinstalled. So installing kramdown is as easy +as running: + + sudo gem install kramdown + + +### Windows + +You need to install Ruby first. This can easily be done by using the [RubyInstaller] - just download +the installation binary and run it. After that open a command shell (select `Start -> Run...`, then +enter `cmd` and click on `Ok`) and type in the following: + + gem install kramdown + +[RubyInstaller]: http://rubyinstaller.org + + +## Generic Installation Instructions + + +### Using Rubygems + +If you are using Rubygems, installing the latest version of kramdown is as simple as executing + + gem install kramdown + + +### Manual Installation + +The latest version of kramdown can always be downloaded as `.tar.gz` or `.zip` via the [Github +releases page][ghreleases]. After the download the package needs to be decompressed and then you can +install kramdown using the included `setup.rb` installation method: + + $ ruby setup.rb config + $ ruby setup.rb setup + $ ruby setup.rb install + +[ghreleases]: https://github.com/gettalong/kramdown/releases + + +### Using the repository version + +kramdown uses git as its versioning system and kramdown's repository is hosted on GitHub. The +repository always contains a clean state of the current development version of kramdown. To check +out kramdown use the following command: + + git clone git://github.com/gettalong/kramdown.git diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/links.markdown b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/links.markdown new file mode 100644 index 0000000..6baa05a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/links.markdown @@ -0,0 +1,6 @@ +[Maruku]: http://maruku.rubyforge.org +[PHP Markdown Extra]: http://michelf.com/projects/php-markdown/extra/ +[Pandoc]: http://johnmacfarlane.net/pandoc/ +[MathJax]: http://www.mathjax.org +[BlueCloth]: http://deveiate.org/projects/BlueCloth +[RedCloth]: http://redcloth.org/ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/metainfo b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/metainfo new file mode 100644 index 0000000..efce601 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/metainfo @@ -0,0 +1,3 @@ +--- alcn +[converter/*.html, parser/*.html, documentation.en.html, options.en.html, tests.en.html]: + template: ../documentation.template diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/news.feed b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/news.feed new file mode 100644 index 0000000..65e511f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/news.feed @@ -0,0 +1,9 @@ +--- +title: kramdown News +description: kramdown - a fast, pure Ruby Markdown-superset converter +author: Thomas Leitner +author_url: http://kramdown.gettalong.org +entries: {alcn: news/*.html, sort: sort_info, reverse: true, limit: 10} +versions: + atom: + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/news.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/news.page new file mode 100644 index 0000000..b0f7f42 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/news.page @@ -0,0 +1,29 @@ +--- +title: News +in_menu: false +sort_info: 30 +--- pipeline:tags,blocks,fragments + +

      News

      + +Atom-Feed + + + +--- name:newsdata pipeline:erb +<% +opts = {:alcn => '/news/*.html', :sort => 'sort_info', :reverse => true, :flatten => true} +context.website.ext.item_tracker.add(context.dest_node, :nodes, :node_finder_option_set, + {:opts => opts, :ref_alcn => context.node.alcn}, :content) +context.website.ext.node_finder.find(opts, context.node).each do |node| + # context.options['contentprocessor.kramdown.options'] = {:auto_id_prefix => node.lcn.tr('.', '-')} +%> + +
      +
      + Published on <%= node['created_at'].strftime("%A, %d %B %Y") %> +
      +<%= context.render_block(:name => 'content', :chain => [node]) %> +
      + +<% end %> diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/options.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/options.page new file mode 100644 index 0000000..6b8bb48 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/options.page @@ -0,0 +1,49 @@ +--- +title: Options +--- +## Options + +The behaviour of kramdown can be adjusted via the available options. + +Options can be specified in multiple ways: + +On the command line +: The `kramdown` binary allows setting any option by using command line switches. + + For example, the following command will disable automatic header ID generation and defines the + first footnote number as 5: + + ~~~ + $ kramdown --no-auto-ids --footnote-nr 5 + ~~~ + + As you can see all underscores in option names have to be replaced with dashes. The built-in help + of the binary as well as the man-page show all available options. + +Within a kramdown document +: By using the special extension syntax, it is possible to set options within a document. + + Using the above example, the options would be set like this within a document: + + ~~~ + {::options auto_ids="false" footnote_nr="5" /} + ~~~ + +Using Ruby code + +: If you are using kramdown as a library, you can pass any options as second parameter to the + `Kramdown::Document.new` method. + + Again, using the above example you would initalize the kramdown document class as follows: + + ~~~ ruby + Kramdown::Document.new(source_text, \{auto_ids: false, footnote_nr: 5}) + ~~~ + + +## Available Options + +Below is a list of all currently available options. Have a look at the documentation of a converter +or parser to see directly which options they support! + +{options: {items: all}} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/quickref.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/quickref.page new file mode 100644 index 0000000..eeeacfb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/quickref.page @@ -0,0 +1,603 @@ +--- +title: Quick Reference +in_menu: true +sort_info: 9 +--- name:sidebar + + +

      Contents

      + +{menu: {options: {descendants: true, levels: [2,6]}}} +--- name:content +# Quick Reference + +Below are examples of all available structural elements that can be used in a kramdown text. Since +the kramdown syntax is a superset of the Markdown syntax, only a small part of the available syntax +is not available in standard Markdown syntax. Note, that only the most basic syntax information is +given. However, a link to the detailed syntax for each element is provided (which also details the +differences to the standard Markdown syntax). The quick reference is for version **<%= +::Kramdown::VERSION %>** of the syntax documentation. + +kramdown has two main classes of elements: block and span-level elements. Block-level elements are +used to create paragraphs, headers, lists and so on whereas span-level elements are used to markup +text phrases as emphasized, as a link and so on. + +All examples below feature the kramdown source, the converted HTML source (shown when hovering over +the kramdown source) and the output as it appears in the browser. This looks like this: + + + + + + +
      kramdown example code
      Example code converted to HTML
      +
      +Live browser view of example code +
      +
      + + +# Block-level Elements - Main Structural Elements + +## Paragraphs + +{kdlink: {oid: paragraphs, part: "paragraphs"}} + +Consecutive lines of text are considered to be one paragraph. As with other block level elements you +have to add a blank line to separate it from the following block-level element: + +{kdexample::} +The first paragraph. + +Another paragraph +{kdexample} + +Explicit line breaks in a paragraph can be made by using two spaces or two backslashes at the end of a line: + +{kdexample::} +This is a paragraph +which contains a hard line break. +{kdexample} + + +## Headers + +{kdlink: {oid: headers, part: "headers"}} + +kramdown supports Setext style headers and atx style headers. A header must always be preceded by a +blank line except at the beginning of the document: + + +{kdexample::} +First level header +================== + +Second level header +------------------- +{kdexample} + +{kdexample::} +# H1 header + +## H2 header + +### H3 header + +#### H4 header + +##### H5 header + +###### H6 header +{kdexample} + +If you set the option `auto_ids` to `false` (for example, by using the `options` extension, see +[Extensions](#extensions)), then the automatic header ID generation is turned off: + +{kdexample::} +{::options auto_ids="false" /} + +# A header without an ID +{kdexample} + + +## Blockquotes + +{kdlink: {oid: blockquotes, part: "blockquotes"}} + +A blockquote is started using the `>` marker followed by an optional space; all following lines that +are also started with the blockquote marker belong to the blockquote. You can use any block-level +elements inside a blockquote: + +{kdexample::} +> A sample blockquote. +> +> >Nested blockquotes are +> >also possible. +> +> ## Headers work too +> This is the outer quote again. +{kdexample} + +You may also be lazy with the `>` markers as long as there is no blank line: + +{kdexample::} +> This is a blockquote +continued on this +and this line. + +But this is a separate paragraph. +{kdexample} + +## Code Blocks + +{kdlink: {oid: code-blocks, part: "code blocks"}} + +kramdown supports two different code block styles. One uses lines indented with either four spaces +or one tab whereas the other uses lines with tilde characters as delimiters -- therefore the content +does not need to be indented: + +{kdexample::} + This is a sample code block. + + Continued here. +{kdexample} + +{kdexample::} +~~~~~~ +This is also a code block. +~~~ +Ending lines must have at least as +many tildes as the starting line. +~~~~~~~~~~~~ +{kdexample} + +The following is a code block with a language specified: + +{kdexample::} +~~~ ruby +def what? + 42 +end +~~~ +{kdexample} + + +## Horizontal Rules + +{kdlink: {oid: horizontal-rules, part: "horizontal rules"}} + +It is easy to insert a horizontal rule in kramdown: just use three or more asterisks, dashes or +underscores, optionally separated by spaces or tabs, on an otherwise blank line: + +{kdexample::} +* * * + +\--- + + _ _ _ _ + +--------------- +{kdexample} + + +## Lists + +{kdlink: {oid: lists, part: "lists"}} + +kramdown supports ordered and unordered lists. Ordered lists are started by using a number followed +by a period, a space and then the list item text. The content of a list item consists of block-level +elements. All lines which have the same indent as the text of the line with the list marker belong +to the list item: + +{kdexample::} +1. This is a list item +2. And another item +2. And the third one + with additional text +{kdexample} + +As with block quotes, you may be lazy when using the list item marker: + +{kdexample::} +* A list item +with additional text +{kdexample} + +As the content consists of block-level elements you can do things like the following: + +{kdexample::} +1. This is a list item + + > with a blockquote + + # And a header + +2. Followed by another item +{kdexample} + +Nested lists are also easy to create: + +{kdexample::} +1. Item one + 1. sub item one + 2. sub item two + 3. sub item three +2. Item two +{kdexample} + +Lists can occur directly after other block-level elements, however, there has to be at least one +blank line if you want to follow a paragraph with a list: + +{kdexample::} +This is a paragraph. +1. This is NOT a list. + +1. This is a list! +{kdexample} + +Unordered lists are started by using an asterisk, a dash or a plus sign (they can be mixed) and a +space. Apart from that unordered lists follow the same rules as ordered lists: + +{kdexample::} +* Item one ++ Item two +- Item three +{kdexample} + +## Definition Lists + +{kdlink: {oid: definition-lists, part: "definition lists"}} + +A definition list works similar to a normal list and is used to associate definitions with terms. +Definition lists are started when a normal paragraph is followed by a line starting with a colon and +then the definition text. One term can have many definitions and multiple terms can have the same +definition. Each line of the preceding paragraph is assumed to contain one term, for example: + +{kdexample::} +term +: definition +: another definition + +another term +and another term +: and a definition for the term +{kdexample} + +If you insert a blank line before a definition (note: there must only be one blank line between the +terms and the first definition), the definition will be wrapped in a paragraph: + +{kdexample::} +term + +: definition +: definition +{kdexample} + +Each term can be styled using span-level elements and each definition is parsed as block-level +elements, i.e. you can use any block-level in a definition. Just use the same indent for the lines +following the definition line: + +{kdexample::} +This *is* a term + +: This will be a para + + > a blockquote + + # A header +{kdexample} + + +## Tables + +{kdlink: {oid: tables, part: "tables"}} + +kramdown supports a syntax for creating simple tables. A line starting with a pipe character (`|`) +starts a table row. However, if the pipe characters is immediately followed by a dash (`-`), a +separator line is created. Separator lines are used to split the table header from the table body +(and optionally align the table columns) and to split the table body into multiple parts. If the +pipe character is followed by an equal sign (`=`), the tables rows below it are part of the table +footer. + +{kdexample::} +| A simple | table | +| with multiple | lines| +{kdexample} + +{kdexample::} +| Header1 | Header2 | Header3 | +|:--------|:-------:|--------:| +| cell1 | cell2 | cell3 | +| cell4 | cell5 | cell6 | +|---- +| cell1 | cell2 | cell3 | +| cell4 | cell5 | cell6 | +|===== +| Foot1 | Foot2 | Foot3 +{: rules="groups"} +{kdexample} + + +## HTML elements + +{kdlink: {oid: html-blocks, part: "HTML blocks"}} + +kramdown allows you to use block-level HTML tags (`div`, `p`, `pre`, ...) to markup whole blocks of +text -- just start a line with a block-level HTML tag. kramdown syntax is normally not processed +inside an HTML tag but this can be changed with the `parse_block_html` option. If this options is +set to `true`, then the content of a block-level HTML tag is parsed by kramdown either as block +level or span-level text, depending on the tag: + +{kdexample::} +
      +Something that stays right and is not wrapped in a para. +
      + +{::options parse_block_html="true" /} + +
      +This is wrapped in a para. +
      +

      +This can contain only *span* level elements. +

      +{kdexample} + + +## Block Attributes + +{kdlink: {oid: block-ials, part: "block IALs"}} +{kdlink: {oid: attribute-list-definitions, part: "ALDs"}} + +You can assign any attribute to a block-level element. Just directly follow the block with a *block +inline attribute list* (or short: block IAL). A block IAL consists of a left curly brace, followed +by a colon, the attribute definitions and a right curly brace. Here is a simple example which sets the +`title` attribute of a block quote: + +{kdexample::} +> A nice blockquote +{: title="Blockquote title"} +{kdexample} + +As one often wants to set one or more CSS classes on an element, there is an easy shortcut: + +{kdexample::} +> A nice blockquote +{: .class1 .class2} +{kdexample} + +A shortcut for setting the ID is also provided. Just prefix the ID with a hash symbol: + +{kdexample::} +> A nice blockquote +{: #with-an-id} +{kdexample} + +Sometimes one wants to use the same attributes for many elements. kramdown allows you to define the +attributes in one place with an *attribute list definition* (or short: ALD) and just reference this +definition in a block IAL. An ALD has the same structure as a block IAL but the colon has to be +replace with a colon, the reference name and another colon. By just using the reference name as-is +in a block IAL, one can include the attributes of the referenced ALD: + +{kdexample::} +{:refdef: .c1 #id .c2 title="title"} +paragraph +{: refdef} +{kdexample} + +The order in a block IAL or ALD is important because later defined attributes overwrite (with the +exception of the shortcut for CSS classes) prior defined attributes: + +{kdexample::} +{:refdef: .c1 #id .c2 title="title"} +paragraph +{: refdef .c3 title="t" #para} +{kdexample} + + +## Extensions + +{kdlink: {oid: extensions, part: "extensions"}} + +kramdown provides some less used functionality through a common syntax. This will allow the easy +addition of other extensions if need arises. Currently, there are extensions for ignoring text (i.e. +treating text as comment), for inserting arbitrary text as-is into the output and for setting +kramdown options. + +Here is an example that shows how to insert comments into text: + +{kdexample::} +This is a paragraph +{::comment} +This is a comment which is +completely ignored. +{:/comment} +... paragraph continues here. + +Extensions can also be used +inline {::nomarkdown}**see**{:/}! +{kdexample} + +As one can see from the above example, the syntax for extensions is nearly identical to that of +ALDs. However, there is no trailing colon after the extension name and the extension end tag needs a +slash between the colon and the extension name. One can also use the short form of the end tag, i.e. +`{:/}`. Attribute definitions can be specified on the start tag by separating them with a space from +the extension name. Also, if the extension does not have a body, there needs to be a slash right +before the closing brace: + +{kdexample::} +{::options auto_ids="false" /} + +# Header without id +{kdexample} + + + + +# Span-Level Elements - Text Modifiers + +## Emphasis + +{kdlink: {oid: emphasis, part: "emphasis"}} + +Emphasis can be added to text by surrounding the text with either asterisks or underscores: + +{kdexample::} +This is *emphasized*, +_this_ too! +{kdexample} + +Strong emphasis can be done by doubling the delimiters: + +{kdexample::} +This is **strong**, +__this__ too! +{kdexample} + +The form with the asterisks can also be used to markup parts of words: + +{kdexample::} +This w**ork**s as expected! +{kdexample} + + +## Links and Images + +{kdlink: {oid: links-and-images, part: "links and images"}} + +A simple link can be created by surrounding the text with square brackets and the link URL with +parentheses: + +{kdexample::} +A [link](http://kramdown.gettalong.org) +to the kramdown homepage. +{kdexample} + +You can also add title information to the link: + +{kdexample::} +A [link](http://kramdown.gettalong.org "hp") +to the homepage. +{kdexample} + +There is another way to create links which does not interrupt the text flow. The URL and title are +defined using a reference name and this reference name is then used in square brackets instead of +the link URL: + +{kdexample::} +A [link][kramdown hp] +to the homepage. + +[kramdown hp]: http://kramdown.gettalong.org "hp" +{kdexample} + +If the link text itself is the reference name, the second set of square brackets can be omitted: + +{kdexample::} +A link to the [kramdown hp]. + +[kramdown hp]: http://kramdown.gettalong.org "hp" +{kdexample} + +Images can be created in a similar way: just use an exclamation mark before the square brackets. The +link text will become the alternative text of the image and the link URL specifies the image source: + +{kdexample::} +An image: ![gras](img/image.jpg) +{kdexample} + + +## Inline Code + +{kdlink: {oid: code-spans, part: "code spans"}} + +Text phrases can be easily marked up as code by surrounding them with backticks: + +{kdexample::} +Use `Kramdown::Document.new(text).to_html` +to convert the `text` in kramdown +syntax to HTML. +{kdexample} + +If you want to use literal backticks in your code, just use two or more backticks as delimiters. The +space right after the beginning delimiter and the one right before the closing delimiter are ignored: + +{kdexample::} +Use backticks to markup code, +e.g. `` `code` ``. +{kdexample} + + +## Footnotes + +{kdlink: {oid: footnotes, part: "footnotes"}} + +Footnotes can easily be used in kramdown. Just set a footnote marker (consists of square brackets +with a caret and the footnote name inside) in the text and somewhere else the footnote definition (which +basically looks like a reference link definition): + +{kdexample::} +This is a text with a +footnote[^1]. + +[^1]: And here is the definition. +{kdexample} + +The footnote definition can contain any block-level element, all lines following a footnote +definition indented with four spaces or one tab belong to the definition: + +{kdexample::} +This is a text with a +footnote[^2]. + +[^2]: + And here is the definition. + + > With a quote! +{kdexample} + +As can be seen above the footnote name is only used for the anchors and the numbering is done +automatically in document order. Repeated footnote markers will link to the same footnote +definition. + + +## Abbreviations + +{kdlink: {oid: abbreviations, part: "abbreviations"}} + +Abbreviations will work out of the box once you add an abbreviation definition. So you can just +write the text and add the definitions later on. + +{kdexample::} +This is an HTML +example. + +*[HTML]: Hyper Text Markup Language +{kdexample} + + +## HTML Elements + +{kdlink: {oid: html-spans, part: "HTML spans"}} + +HTML is not only supported on the block-level but also on the span-level: + +{kdexample::} +This is written in +red. +{kdexample} + + +## Inline Attributes + +{kdlink: {oid: span-ials, part: "span IALs"}} + +As with a block-level element you can assign any attribute to a span-level elements using a *span +inline attribute list* (or short: span IAL). A span IAL has the same syntax as a block IAL and must +immediately follow the span-level element: + +{kdexample::} +This is *red*{: style="color: red"}. +{kdexample} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/sidebar.template b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/sidebar.template new file mode 100644 index 0000000..20f3533 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/sidebar.template @@ -0,0 +1,25 @@ +

      Support kramdown

      + +

      If you like kramdown and would like to support it, you are welcome to make a small +donation (Patreon, PayPal or Pledgie) -- it will surely be appreciated! Thanks!

      + +
      + +Become a Patron! + +
      + + + + +
      + +Click here to lend your support to: kramdown and make a donation at pledgie.com ! + +
      + +

      Sponsors

      + +

      GROSSWEBER provides software +development consulting and training services. We like to work on open source. We use it heavily. +We love kramdown!

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/sitemap.sitemap b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/sitemap.sitemap new file mode 100644 index 0000000..1f19756 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/sitemap.sitemap @@ -0,0 +1,5 @@ +--- +entries: + alcn: /**/*.html +default_change_freq: monthly +--- diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/syntax.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/syntax.page new file mode 100644 index 0000000..e8477a5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/doc/syntax.page @@ -0,0 +1,1799 @@ +--- +title: Syntax +in_menu: true +sort_info: 10 +--- name:sidebar + + +

      Contents

      + +{menu: {options: {descendants: true, levels: [2,6]}}} +--- name:content + +# kramdown Syntax + +This is version **<%= ::Kramdown::VERSION %>** of the syntax documentation. + +The kramdown syntax is based on the Markdown syntax and has been enhanced with features that are +found in other Markdown implementations like [Maruku], [PHP Markdown Extra] and [Pandoc]. However, +it strives to provide a strict syntax with definite rules and therefore isn't completely compatible +with Markdown. Nonetheless, most Markdown documents should work fine when parsed with kramdown. All +places where the kramdown syntax differs from the Markdown syntax are highlighted. + +Following is the complete syntax definition for all elements kramdown supports. Together with the +documentation on the available converters, it is clearly specified what you will get when a kramdown +document is converted. + + +## Source Text Formatting + +A kramdown document may be in any encoding, for example ASCII, UTF-8 or ISO-8859-1, and the output +will have the same encoding as the source. + +The document consists of two types of elements, block-level elements and span-level elements: + +* Block-level elements define the main structure of the content, for example, what part of the text + should be a paragraph, a list, a blockquote and so on. + +* Span-level elements mark up small text parts as, for example, emphasized text or a link. + +Thus span-level elements can only occur inside block-level elements or other span-level elements. + +You will often find references to the "first column" or "first character" of a line in a block-level +element descriptions. Such a reference is always to be taken relative to the current indentation +level because some block-level elements open up a new indentation level (e.g. blockquotes). The +beginning of a kramdown document opens up the default indentation level which begins at the first +column of the text. + + +### Line Wrapping + +Some lightweight markup syntax don't work well in environments where lines are hard-wrapped. For +example, this is the case with many email programs. Therefore kramdown allows content like +paragraphs or blockquotes to be hard-wrapped, i.e. broken across lines. This is sometimes referred +to as "lazy syntax" since the indentation or line prefix required for the first line of content is +not required for the consecutive lines. + +Block-level elements that support line wrapping always end when one of the following conditions is +met: + +* a [blank line](#blank-lines), an [EOB marker line](#eob-marker), a [block IAL](#block-ials) or the + end of the document (i.e. a [block boundary](#block-boundaries)), + +* or an [HTML block](#html-blocks). + +Line wrapping is allowed throughout a kramdown document but there are some block-level elements that +do *not* support being hard-wrapped: + +[headers](#headers) + +: This is not an issue in most situations since headers normally fit on one line. If a header text + gets too long for one line, you need to use HTML syntax instead. + +[fenced code blocks](#fenced-code-blocks) + +: The delimiting lines of a fenced code block do not support hard-wrapping. Since everything between + the delimiting lines is taken as is, the content of a fenced code block does also not support + hard-wrapping. + +[definition list terms](#definition-lists) + +: Each definition term has to appear on a separate line. Hard-wrapping would therefore introduce + additional definition terms. The definitions themselves, however, do support hard-wrapping. + +[tables](#tables) + +: Since each line of a kramdown table describes one table row or a separator, it is not possible to + hard-wrap tables. + +**Note** that it is **NOT** recommended to use lazy syntax to write a kramdown document. The +flexibility that the kramdown syntax offers due to the issue of line wrapping hinders readability +and should therefore not be used. + + +### Usage of Tabs + +kramdown assumes that tab stops are set at multiples of four. This is especially important when +using tabs for indentation in lists. Also, tabs may only be used at the beginning of a line when +indenting text and must not be preceded by spaces. Otherwise the results may be unexpected. + + +### Automatic and Manual Escaping + +Depending on the output format, there are often characters that need special treatment. For example, +when converting a kramdown document to HTML one needs to take care of the characters `<`, `>` and +`&`. To ease working with these special characters, they are automatically and correctly escaped +depending on the output format. + +This means, for example, that you can just use `<`, `>` and `&` in a kramdown document and need not +think about when to use their HTML entity counterparts. However, if you *do use* HTML entities or +HTML tags which use one of the characters, the result will be correct nonetheless! + +Since kramdown also uses some characters to mark-up the text, there needs to be a way to escape +these special characters so that they can have their normal meaning. This can be done by using +backslash escapes. For example, you can use a literal back tick like this: + + This \`is not a code\` span! + +Following is a list of all the characters (character sequences) that can be escaped: + + \ backslash + . period + * asterisk + _ underscore + + plus + - minus + = equal sign + ` back tick + ()[]{}<> left and right parens/brackets/braces/angle brackets + # hash + ! bang + << left guillemet + >> right guillemet + : colon + | pipe + " double quote + ' single quote + $ dollar sign + + +## Block Boundaries + +Some block-level elements have to start and/or end on so called block boundaries, as stated in their +documentation. There are two cases where block boundaries come into play: + +* If a block-level element has to start on a block boundary, it has to be preceded by either a + [blank line](#blank-lines), an [EOB marker](#eob-marker), a [block IAL](#block-ials) or it has to + be the first element. + +* If a block-level element has to end on a block boundary, it has to be followed by either a [blank + line](#blank-lines), an [EOB marker](#eob-marker), a [block IAL](#block-ials) or it has to be the + last element. + + + +# Structural Elements + +All structural elements are block-level elements and they are used to structure the content. They +can mark up some text as, for example, a simple paragraph, a quote or as a list item. + + +## Blank lines + +Any line that just contains white space characters such as spaces and tabs is considered a blank +line by kramdown. One or more consecutive blank lines are handled as one empty blank line. Blank +lines are used to separate block-level elements from each other and in this case they don't have +semantic meaning. However, there are some cases where blank lines do have a semantic meaning: + +* When used in headers -- see the [headers section](#headers) +* When used in code blocks -- see the [code blocks section](#code-blocks) +* When used in lists -- see the [lists section](#lists) +* When used in math blocks -- see the [math blocks section](#math-blocks) +* When used for elements that have to start/end on [block boundaries](#block-boundaries) + + +## Paragraphs + +Paragraphs are the most used block-level elements. One or more consecutive lines of text are +interpreted as one paragraph. The first line of a paragraph may be indented up to three spaces, the +other lines can have any amount of indentation because paragraphs support [line +wrapping](#line-wrapping). In addition to the rules outlined in the section about line wrapping, a +paragraph ends when a [definition list line](#definition-lists) is encountered. + +You can separate two consecutive paragraphs from each other by using one or more blank lines. Notice +that a line break in the source does not mean a line break in the output (due to the [lazy +syntax](#line-wrapping))!. If you want to have an explicit line break (i.e. a `
      ` tag) you need +to end a line with two or more spaces or two backslashes! Note, however, that a line break on the +last text line of a paragraph is not possible and will be ignored. Leading and trailing spaces will +be stripped from the paragraph text. + +The following gives you an example of how paragraphs look like: + + This para line starts at the first column. However, + the following lines can be indented any number of spaces/tabs. + The para continues here. + + This is another paragraph, not connected to the above one. But + with a hard line break. \\ + And another one. +{: .show-whitespaces .ws-lr} + + +## Headers + +kramdown supports so called Setext style and atx style headers. Both forms can be used inside a +single document. + +### Setext Style + +Setext style headers have to start on a [block boundary](#block-boundaries) with a line of text (the +header text) and a line with only equal signs (for a first level header) or dashes (for a second +level header). The header text may be indented up to three spaces but any leading or trailing spaces +are stripped from the header text. The amount of equal signs or dashes is not significant, just one +is enough but more may look better. The equal signs or dashes have to begin at the first column. For +example: + + First level header + ================== + + Second level header + ------ + + Other first level header + = + +Since Setext headers start on block boundaries, this means in most situations that they have to be +preceded by a blank line. However, blank lines are not necessary after a Setext header: + + This is a normal + paragraph. + + And A Header + ------------ + And a paragraph + + > This is a blockquote. + + And A Header + ------------ + +However, it is generally a good idea to also use a blank line after a Setext header because it looks +more appropriate and eases reading of the document. + +> The original Markdown syntax allows one to omit the blank line before a Setext header. However, +> this leads to ambiguities and makes reading the document harder than necessary. Therefore it is +> not allowed in a kramdown document. +{: .markdown-difference} + +An edge case worth mentioning is the following: + + header + --- + para + +One might ask if this represents two paragraphs separated by a [horizontal rule](#horizontal-rules) +or a second level header and a paragraph. As suggested by the wording in the example, the latter is +the case. The general rule is that Setext headers are processed before horizontal rules. + +### atx Style + +atx style headers have to start on a [block boundary](#block-boundaries) with a line that contains +one or more hash characters and then the header text. No spaces are allowed before the hash +characters. The number of hash characters specifies the heading level: one hash character gives you +a first level heading, two a second level heading and so on until the maximum of six hash characters +for a sixth level heading. You may optionally use any number of hashes at the end of the line to +close the header. Any leading or trailing spaces are stripped from the header text. For example: + + # First level header + + ### Third level header ### + + ## Second level header ###### + +> Again, the original Markdown syntax allows one to omit the blank line before an atx style header. +{: .markdown-difference} + + +### Specifying a Header ID + +kramdown supports a nice way for explicitly setting the header ID which is taken from [PHP Markdown +Extra] and [Maruku]: If you follow the header text with an opening curly bracket (separated from the +text with a least one space), a hash, the ID and a closing curly bracket, the ID is set on the +header. If you use the trailing hash feature of atx style headers, the header ID has to go after the +trailing hashes. For example: + + Hello {#id} + ----- + + # Hello {#id} + + # Hello # {#id} + +> This additional syntax is not part of standard Markdown. +{: .markdown-difference} + + +## Blockquotes + +A blockquote is started using the `>` marker followed by an optional space and the content of the +blockquote. The marker itself may be indented up to three spaces. All following lines, whether they +are started with the blockquote marker or just contain text, belong to the blockquote because +blockquotes support [line wrapping](#line-wrapping). + +The contents of a blockquote are block-level elements. This means that if you are just using text as +content that it will be wrapped in a paragraph. For example, the following gives you one blockquote +with two paragraphs in it: + + > This is a blockquote. + > on multiple lines + that may be lazy. + > + > This is the second paragraph. + +Since the contents of a blockquote are block-level elements, you can nest blockquotes and use other +block-level elements (this is also the reason why blockquotes need to support line wrapping): + + > This is a paragraph. + > + > > A nested blockquote. + > + > ## Headers work + > + > * lists too + > + > and all other block-level elements + +Note that the first space character after the `>` marker does *not* count when counting spaces for +the indentation of the block-level elements inside the blockquote! So [code blocks](#code-blocks) +will have to be indented with five spaces or one space and one tab, like this: + + > A code block: + > + > ruby -e 'puts :works' + +[Line wrapping](#line-wrapping) allows one to be lazy but hinders readability and should therefore +be avoided, especially with blockquotes. Here is an example of using blockquotes with line wrapping: + + > This is a paragraph inside + a blockquote. + > + > > This is a nested paragraph + that continues here + > and here + > > and here + + +## Code Blocks + +Code blocks can be used to represent verbatim text like markup, HTML or a program fragment because +no syntax is parsed within a code block. + +### Standard Code Blocks + +A code block can be started by using four spaces or one tab and then the text of the code block. All +following lines containing text, whether they adhere to this syntax or not, belong to the code block +because code blocks support [line wrapping](#line-wrapping)). A wrapped code line is automatically +appended to the preceding code line by substituting the line break with a space character. The +indentation (four spaces or one tab) is stripped from each line of the code block. + +> The original Markdown syntax does not allow line wrapping in code blocks. +{: .markdown-difference} + +Note that consecutive code blocks that are only separate by [blank lines](#blank-lines) are merged +together into one code block: + + Here comes some code + + This text belongs to the same code block. + +If you want to have one code block directly after another one, you need to use an [EOB +marker](#eob-marker) to separate the two: + + Here comes some code + ^ + This one is separate. + +### Fenced Code Blocks + +> This alternative syntax is not part of the original Markdown syntax. The idea and syntax comes +> from the [PHP Markdown Extra] package. +{: .markdown-difference} + +kramdown also supports an alternative syntax for code blocks which does not use indented blocks but +delimiting lines. The starting line needs to begin with three or more tilde characters (`~`) and the +closing line needs to have at least the number of tildes the starting line has. Everything between +is taken literally as with the other syntax but there is no need for indenting the text. For +example: + + ~~~~~~~~ + Here comes some code. + ~~~~~~~~ + +If you need lines of tildes in such a code block, just start the code block with more tildes. For +example: + + ~~~~~~~~~~~~ + ~~~~~~~ + code with tildes + ~~~~~~~~ + ~~~~~~~~~~~~~~~~~~ + +This type of code block is especially useful for copy-pasted code since you don't need to indent the +code. + +### Language of Code Blocks + +You can tell kramdown the language of a code block by using an [IAL](#inline-attribute-lists): + + ~~~ + def what? + 42 + end + ~~~ + {: .language-ruby} + +The specially named class `language-ruby` tells kramdown that this code block is written in the Ruby +language. Such information can be used, for example, by converters to do syntax highlighting on the +code block. + +Fenced code blocks provide an easier way to specify the language, namely by appending the language +of the code block to the end of the starting line: + + ~~~ ruby + def what? + 42 + end + ~~~ + + +## Lists + +kramdown provides syntax elements for creating ordered and unordered lists as well as definition +lists. + +### Ordered and Unordered lists + +Both ordered and unordered lists follow the same rules. + +A list is started with a list marker (in case of unordered lists one of `+`, `-` or `*` -- you can +mix them -- and in case of ordered lists a number followed by a period) followed by one tab or at +least one space, optionally followed by an [IAL](#inline-attribute-lists) that should be applied to +the list item and then the first part of the content of the list item. The leading tabs or spaces +are stripped away from this first line of content to allow for a nice alignment with the following +content of a list item (see below). All following list items with the same marker type (unordered or +ordered) are put into the same list. The numbers used for ordered lists are irrelevant, an ordered +list always starts at 1. + +The following gives you an unordered list and an ordered list: + + * kram + + down + - now + + 1. kram + 2. down + 3. now + +> The original Markdown syntax allows the markers of ordered and unordered lists to be mixed, the +> first marker specifying the list type (ordered or unordered). This is not allowed in kramdown. As +> stated, the above example will give you two lists (an unordered and an ordered) in kramdown and +> only one unordered list in Markdown. +{: .markdown-difference} + +The first list marker in a list may be indented up to three spaces. The column number of the first +non-space character which appears after the list item marker on the same line specifies the +indentation that has to be used for the following lines of content of the list item. If there is no +such character, the indentation that needs to be used is four spaces or one tab. Indented lines may +be followed by lines containing text with any amount of indentation due to [line +wrapping](#line-wrapping). Note, however, that in addition to the rules outlined in the section +about line wrapping, a list item also ends when a line with another list item marker is encountered +-- see the next paragraph. + +The indentation is stripped from the content and the content (note that the content naturally also +contains the content of the line with the item marker) is processed as text containing block-level +elements. All other list markers in the list may be indented up to three spaces or the number of +spaces used for the indentation of the last list item minus one, whichever number is smaller. For +example: + + * This is the first line. Since the first non-space characters appears in + column 3, all other indented lines have to be indented 2 spaces. + However, one could be lazy and not indent a line but this is not + recommended. + * This is the another item of the list. It uses a different number + of spaces for indentation which is okay but should generally be avoided. + * The list item marker is indented 3 spaces which is allowed but should + also be avoided and starts the third list item. Note that the lazy + line in the second list item may make you believe that this is a + sub-list which it isn't! So avoid being lazy! + +So, while the above is possible and creates one list with three items, it is not advised to use +different (marker and list content) indents for same level list items as well as lazy indentation! +It is much better to write such a list in the following way: + + * This is the first list item bla blabla blabla blabla blabla blabla + blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla + blabla blabla blabla bla + * This is the another item of the list. bla blabla blabla blabla blabla + blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla + +> The original Markdown syntax also allows you to indent the marker, however, the behaviour of what +> happens with the list items is not clearly specified and may surprise you. +> +> Also, Markdown uses a fixed number of spaces/tabs to indent the lines that belong to a list item! +{: .markdown-difference} + +Unordered and ordered lists work the same way in regard to the indentation: + + * list 1 item 1 + * list 1 item 2 (indent 1 space) + * list 1 item 3 (indent 2 spaces) + * list 1 item 4 (indent 3 spaces) + * lazy text belonging to above item 4 + +^ + + 1. list 1 item 1 + 2. list 1 item 2 (indent 1 space) + 3. list 1 item 3 (indent 2 spaces) + 4. list 1 item 4 (indent 3 spaces) + 5. lazy text belonging to above item 4 + +^ + + * list 1 item 1 + * nested list item 1 + * nested list item 2 + * list 1 item 2 + * nested list item 1 + +^ + + 1. list 1 item 1 + 1. nested list item 1 + 2. nested list item 2 + 10. list 1 item 2 + 1. nested list item 1 + +^ + + 1. text for this list item + further text (indent 3 spaces) + + 10. text for this list item + further text (indent 4 spaces) + +When using tabs for indenting the content of a list item, remember that tab stops occur at multiples +of four for kramdown. Tabs are correctly converted to spaces for calculating the indentation. For +example: + + * Using a tab to indent this line, the tab only counts as three spaces + and therefore the overall indentation is four spaces. + + 1. The tab after the marker counts here as three spaces. Since the + indentation of the marker is three spaces and the marker itself + takes two characters, the overall indentation needed for the + following lines is eight spaces or two tabs. + +It is clear that you might get unexpected results if you mix tabs and spaces or if you don't have +the tab stops set to multiples of four in your editor! Therefore this should be avoided! + +The content of a list item is made up of either text or block-level elements. Simple list items only +contain text like in the above examples. They are not even wrapped in a paragraph tag. If the first +list text is followed by one or more blank lines, it will be wrapped in a paragraph tag: + + * kram + + * down + * now + +In the above example, the first list item text will be wrapped in a paragraph tag since it is +followed by a blank line whereas the second list item contains just text. There is obviously a +problem for doing this with the last list item when it contains only text. You can circumvent this +by leaving a blank line after the last list item and using an EOB marker: + + * Not wrapped in a paragraph + * Wrapped in a paragraph due to the following blank line. + + * Also wrapped in a paragraph due to the + following blank line and the EOB marker. + + ^ + +The text of the last list item is also wrapped in a paragraph tag if *all* other list items contain +a proper paragraph as first element. This makes the following use case work like expected, i.e. +*all* the list items are wrapped in paragraphs: + + * First list item + + * Second list item + + * Last list item + +> The original Markdown syntax page specifies that list items which are separated by one or more +> blank lines are wrapped in paragraph tags. This means that the first text will also be wrapped in +> a paragraph if you have block-level elements in a list which are separated by blank lines. The +> above rule is easy to remember and lets you exactly specify when the first list text should be +> wrapped in a paragraph. The idea for the above rule comes from the [Pandoc] package. +{: .markdown-difference} + +As seen in the examples above, blank lines between list items are allowed. + +Since the content of a list item can contain block-level elements, you can do the following: + + * First item + + A second paragraph + + * nested list + + > blockquote + + * Second item + +However, there is a problem when you want to have a code block immediately after a list item. You +can use an EOB marker to circumvent this problem: + + * This is a list item. + + The second para of the list item. + ^ + A code block following the list item. + +You can have any block-level element as first element in a list item. However, as described above, +the leading tabs or spaces of the line with the list item marker are stripped away. This leads to a +problem when you want to have a code block as first element. The solution to this problem is the +following construct: + + * + This is a code block (indentation needs to be 4(1)+4(1) + spaces (tabs)). +{: .show-whitespaces .ws-lr} + +Note that the list marker needs to be followed with at least one space or tab! Otherwise the line is +not recognized as the start of a list item but interpreted as a paragraph containing the list +marker. + +If you want to have one list directly after another one (both with the same list type, i.e. ordered +or unordered), you need to use an EOB marker to separate the two: + + * List one + ^ + * List two + +Since paragraphs support [line wrapping](#line-wrapping), it would usually not be possible to create +compact nested list, i.e. a list where the text is not wrapped in paragraphs because there is no +blank line but a sub list after it: + + * This is just text. + * this is a sub list item + * this is a sub sub list item + * This is just text, + spanning two lines + * this is a nested list item. + +However, this is an often used syntax and is therefore support by kramdown. + +If you want to start a paragraph with something that looks like a list item marker, you need to +escape it. This is done by escaping the period in an ordered list or the list item marker in an +unordered list: + + 1984\. It was great + \- others say that, too! + +As mentioned at the beginning, an optional IAL for applying attributes to a list item can be used +after the list item marker: + + * {:.cls} This item has the class "cls". + Here continues the above paragraph. + + * This is a normal list item. + + +### Definition Lists + +> This syntax feature is not part of the original Markdown syntax. The idea and syntax comes from +> the [PHP Markdown Extra] package. +{: .markdown-difference} + +Definition lists allow you to assign one or more definitions to one or more terms. + +A definition list is started when a normal paragraph is followed by a line with a definition marker +(a colon which may be optionally indented up to three spaces), then at least one tab or one space, +optionally followed by an [IAL](#inline-attribute-lists) that should be applied to the list item and +then the first part of the definition. The line with the definition marker may optionally be +separated from the preceding paragraph by a blank line. The leading tabs or spaces are stripped away +from this first line of the definition to allow for a nice alignment with the following definition +content. Each line of the preceding paragraph is taken to be a term and the lines separately parsed +as span-level elements. Each such term may optionally start with an [IAL](#inline-attribute-lists) +that should be applied to the term. + +The following is a simple definition list: + + kramdown + : A Markdown-superset converter + + Maruku + : Another Markdown-superset converter + +The column number of the first non-space character which appears after a definition marker on the +same line specifies the indentation that has to be used for the following lines of the definition. +If there is no such character, the indentation that needs to be used is four spaces or one tab. +Indented lines may be followed by lines containing text with any amount of indentation due to [line +wrapping](#line-wrapping). Note, however, that in addition to the rules outlined in the section +about line wrapping, a list item also ends when a line with another definition marker is encountered. + +The indentation is stripped from the definition and it (note that the definition naturally also +contains the content of the line with the definition marker) is processed as text containing block +level elements. If there is more than one definition, all other definition markers for the term may +be indented up to three spaces or the number of spaces used for the indentation of the last +definition minus one, whichever number is smaller. For example: + + definition term 1 + definition term 2 + : This is the first line. Since the first non-space characters appears in + column 3, all other lines have to be indented 2 spaces (or lazy syntax may + be used after an indented line). This tells kramdown that the lines + belong to the definition. + : This is the another definition for the same term. It uses a + different number of spaces for indentation which is okay but + should generally be avoided. + : The definition marker is indented 3 spaces which is allowed but + should also be avoided. + +So, while the above is possible and creates a definition list with two terms and three definitions +for them, it is not advised to use different (definition marker and definition) indents in the same +definition list as well as lazy indentation! + +The definition for a term is made up of text and/or block-level elements. If a definition is *not* +preceded by a blank line, the first part of the definition will just be text if it would be a +paragraph otherwise: + + definition term + : This definition will just be text because it would normally be a + paragraph and the there is no preceding blank line. + + > although the definition contains other block-level elements + + : This definition *will* be a paragraph since it is preceded by a + blank line. + +The rules about having any block-level element as first element in a list item also apply to a +definition. + +As mentioned at the beginning, an optional IAL for applying attributes to a term or a definition can +be used: + + {:#term} Term with id="term" + : {:.cls} Definition with class "cls" + + {:#term1} First term + {:#term2} Second term + : {:.cls} Definition + + +## Tables + +> This syntax feature is not part of the original Markdown syntax. The syntax is based on the one +> from the [PHP Markdown Extra] package. +{: .markdown-difference} + +Sometimes one wants to include simple tabular data in a kramdown document for which using a +full-blown HTML table is just too much. kramdown supports this with a simple syntax for ASCII +tables. + +Tables can be created with or without a leading pipe character: If the first line of a table +contains a pipe character at the start of the line (optionally indented up to three spaces), then +all leading pipe characters (i.e. pipe characters that are only preceded by whitespace) are ignored +on all table lines. Otherwise they are not ignored and count when dividing a table line into table +cells. + +There are four different line types that can be used in a table: + +* *Table rows* define the content of a table. + + A table row is any line that contains at least one pipe character and is not identified as any + other type of table line! The table row is divided into individual table cells by pipe characters. + An optional trailing pipe character is ignored. Note that literal pipe characters need to be + escaped *except* if they occur in code spans or HTML `` elements! + + Header rows, footer rows and normal rows are all done using these table rows. Table cells can only + contain a single line of text, no multi-line text is supported. The text of a table cell is parsed + as span-level elements. + + Here are some example table rows: + + | First cell|Second cell|Third cell + | First | Second | Third | + + First | Second | | Fourth | + +* *Separator lines* are used to split the table body into multiple body parts. + + A separator line is any line that contains only pipes, dashes, pluses, colons and spaces/tabs and + which contains at least one dash and one pipe character. The pipe and plus characters can be used + to visually separate columns although this is not needed. Multiple separator lines after another + are treated as one separator line. + + Here are some example separator lines: + + |----+----| + +----|----+ + |---------| + |- + | :-----: | + -|- + +* The first separator line after at least one table row is treated specially, namely as *header + separator line*. It is used to demarcate header rows from normal table rows and/or to set column + alignments. All table rows above the header separator line are considered to be header rows. + + The header separator line can be specially formatted to contain column alignment definitions: An + alignment definition consists of an optional space/tab followed by an optional colon, one or more + dashes, an optional colon and another optional space/tab. The colons of an alignment definition + are used to set the alignment of a column: if there are no colons, the column uses the default + alignment, if there is a colon only before the dashes, the column is left aligned, if there are + colons before and after the dashes, the column is center aligned and if there is only a colon + after the dashes, the column is right aligned. Each alignment definition sets the alignment for + one column, the first alignment definition for the first column, the second alignment definition + for the second column and so on. + + Here are some example header separator lines with alignment definitions: + + |---+---+---| + + :-: |:------| ---:| + | :-: :- -: - + :-: | :- + +* A *footer separator line* is used to demarcate footer rows from normal table rows. All table rows + below the footer separator line are considered to be footer rows. + + A footer separator line is like a normal separator line except that dashes are replaced by equal + signs. A footer separator line may only appear once in a table. If multiple footer separator lines + are used in one table, only the last is treated as footer separator line, all others are treated + as normal separator lines. Normal separator lines that are used after the footer separator line + are ignored. + + Here are some example footer separator lines: + + |====+====| + +====|====+ + |=========| + |= + +Trailing spaces or tabs are ignored in all cases. To simplify table creation and maintenance, +header, footer and normal separator lines need not specify the same number of columns as table rows; +even `|-` and `|=` are a valid separators. + +Given the above components, a table is specified by + +* an optional separator line, +* optionally followed by zero, one or more table rows followed by a header separator line, +* one or more table rows, optionally interspersed with separator lines, +* optionally followed by a footer separator line and zero, one or more table rows and +* an optional trailing separator line. + +Also note + +* that the first line of a table must not have more than three spaces of indentation before the + first non-space character, +* that each line of a table needs to have at least one not escaped pipe character so that kramdown + recognizes it as a line belonging to the table and +* that tables have to start and end on [block boundaries](#block-boundaries)! + +> The table syntax differs from the one used in [PHP Markdown Extra] as follows: +> +> * kramdown tables do not need to have a table header. +> * kramdown tables can be structured using separator lines. +> * kramdown tables can contain a table footer. +> * kramdown tables need to be separated from other block-level elements. +{: .markdown-difference} + +Here is an example for a kramdown table with a table header row, two table bodies and a table footer +row: + + |-----------------+------------+-----------------+----------------| + | Default aligned |Left aligned| Center aligned | Right aligned | + |-----------------|:-----------|:---------------:|---------------:| + | First body part |Second cell | Third cell | fourth cell | + | Second line |foo | **strong** | baz | + | Third line |quux | baz | bar | + |-----------------+------------+-----------------+----------------| + | Second body | | | | + | 2 line | | | | + |=================+============+=================+================| + | Footer row | | | | + |-----------------+------------+-----------------+----------------| + +The above example table is rather time-consuming to create without the help of an ASCII table +editor. However, the table syntax is flexible and the above table could also be written like this: + + |--- + | Default aligned | Left aligned | Center aligned | Right aligned + |-|:-|:-:|-: + | First body part | Second cell | Third cell | fourth cell + | Second line |foo | **strong** | baz + | Third line |quux | baz | bar + |--- + | Second body + | 2 line + |=== + | Footer row + + +## Horizontal Rules + +A horizontal rule for visually separating content is created by using three or more asterisks, +dashes or underscores (these may not be mixed on a line), optionally separated by spaces or tabs, on +an otherwise blank line. The first asterisk, dash or underscore may optionally be indented up to +three spaces. The following examples show different possibilities to create a horizontal rule: + + * * * + + --- + + _ _ _ _ + + --------------- + + +## Math Blocks + +> This syntax feature is not part of the original Markdown syntax. The idea comes from the [Maruku] +> and [Pandoc] packages. +{: .markdown-difference} + +kramdown has built-in support for block and span-level mathematics written in LaTeX. + +A math block needs to start and end on [block boundaries](#block-boundaries). It is started using +two dollar signs, optionally indented up to three spaces. The math block continues until the next +two dollar signs (which may be on the same line or on one of the next lines) that appear at the end +of a line, i.e. they may only be followed by whitespace characters. The content of a math block has +to be valid LaTeX math. It is always wrapped inside a `\begin{displaymath}...\end{displaymath}` +enviroment except if it begins with a `\begin` statement. + +The following kramdown fragment + + $$ + \begin{align*} + & \phi(x,y) = \phi \left(\sum_{i=1}^n x_ie_i, \sum_{j=1}^n y_je_j \right) + = \sum_{i=1}^n \sum_{j=1}^n x_i y_j \phi(e_i, e_j) = \\ + & (x_1, \ldots, x_n) \left( \begin{array}{ccc} + \phi(e_1, e_1) & \cdots & \phi(e_1, e_n) \\ + \vdots & \ddots & \vdots \\ + \phi(e_n, e_1) & \cdots & \phi(e_n, e_n) + \end{array} \right) + \left( \begin{array}{c} + y_1 \\ + \vdots \\ + y_n + \end{array} \right) + \end{align*} + $$ + +renders (using Javascript library [MathJax](http://www.mathjax.org/)) as + +$$ +\begin{align*} + & \phi(x,y) = \phi \left(\sum_{i=1}^n x_ie_i, \sum_{j=1}^n y_je_j \right) + = \sum_{i=1}^n \sum_{j=1}^n x_i y_j \phi(e_i, e_j) = \\ + & (x_1, \ldots, x_n) \left( \begin{array}{ccc} + \phi(e_1, e_1) & \cdots & \phi(e_1, e_n) \\ + \vdots & \ddots & \vdots \\ + \phi(e_n, e_1) & \cdots & \phi(e_n, e_n) + \end{array} \right) + \left( \begin{array}{c} + y_1 \\ + \vdots \\ + y_n + \end{array} \right) +\end{align*} +$$ + +Using inline math is also easy: just surround your math content with two dollar signs, like with a +math block. If you don't want to start an inline math statement, just escape the dollar signs and +they will be treated as simple dollar signs. + +> **Note** that LaTeX code that uses the pipe symbol `|` in inline math statements may lead to a +> line being recognized as a table line. This problem can be avoided by using the `\vert` command +> instead of `|`! +{:.information} + +If you have a paragraph that looks like a math block but should actually be a paragraph with just an +inline math statement, you need to escape the first dollar sign: + + The following is a math block: + + $$ 5 + 5 $$ + + But next comes a paragraph with an inline math statement: + + \$$ 5 + 5 $$ + +If you don't even want the inline math statement, escape the first two dollar signs: + + \$\$ 5 + 5 $$ + +## HTML Blocks + +> The original Markdown syntax specifies that an HTML block must start at the left margin, i.e. no +> indentation is allowed. Also, the HTML block has to be surrounded by blank lines. Both +> restrictions are lifted for kramdown documents. Additionally, the original syntax does not allow +> you to use Markdown syntax in HTML blocks which is allowed with kramdown. +{: .markdown-difference} + +An HTML block is potentially started if a line is encountered that begins with a non-span-level HTML +tag or a general XML tag (opening or closing) which may be indented up to three spaces. + +The following HTML tags count as span-level HTML tags and *won't* start an HTML block if found at +the beginning of an HTML block line: + + a abbr acronym b big bdo br button cite code del dfn em i img input + ins kbd label option q rb rbc rp rt rtc ruby samp select small span + strong sub sup textarea tt var + +Further parsing of a found start tag depends on the tag and in which of three possible ways its +content is parsed: + +* Parse as raw HTML block: If the HTML/XML tag content should be handled as raw HTML, then only + HTML/XML tags are parsed from this point onwards and text is handled as raw, unparsed text until + the matching end tag is found or until the end of the document. Each found tag will be parsed as + raw HTML again. However, if a tag has a `markdown` attribute, this attribute controls parsing of + this one tag (see below). + + Note that the parser basically supports only correct XHTML! However, there are some exceptions. + For example, attributes without values (i.e. boolean attributes) are also supported and elements + without content like `
      ` can be written as `
      `. If an invalid closing tag is found, it is + ignored. + +* Parse as block-level elements: If the HTML/XML tag content should be parsed as text containing + block-level elements, the remaining text on the line will be parsed by the block-level parser as + if it appears on a separate line (**Caution**: This also means that if the line consists of the + start tag, text and the end tag, the end tag will not be found!). All following lines are parsed + as block-level elements until an HTML block line with the matching end tag is found or until the + end of the document. + +* Parse as span-level elements: If the HTML/XML tag content should be parsed as text containing span + level elements, then all text until the *next* matching end tag or until the end of the document + will be the content of the tag and will later be parsed by the span-level parser. This also means + that if the matching end tag is inside what appears to be a code span, it is still used! + +If there is text after an end tag, it will be parsed as if it appears on a separate line except when +inside a raw HTML block. + +Also, if an invalid closing tag is found, it is ignored. + +Note that all HTML tag and attribute names are converted to lowercase! + +By default, kramdown parses all block HTML tags and all XML tags as raw HTML blocks. However, this +can be configured with the `parse_block_html`. If this is set to `true`, then syntax parsing in HTML +blocks is globally enabled. It is also possible to enable/disable syntax parsing on a tag per tag +basis using the `markdown` attribute: + +* If an HTML tag has an attribute `markdown="0"`, then the tag is parsed as raw HTML block. + +* If an HTML tag has an attribute `markdown="1"`, then the default mechanism for parsing syntax in + this tag is used. + +* If an HTML tag has an attribute `markdown="block"`, then the content of the tag is parsed as block + level elements. + +* If an HTML tag has an attribute `markdown="span"`, then the content of the tag is parsed as span + level elements. + +The following list shows which HTML tags are parsed in which mode by default when `markdown="1"` is +applied or `parse_block_html` is `true`: + +Parse as raw HTML +: + script style math option textarea pre code kbd samp var + + Also, all general XML tags are parsed as raw HTML blocks. + +Parse as block-level elements +: + applet button blockquote body colgroup dd div dl fieldset form iframe li + map noscript object ol table tbody thead tfoot tr td ul + +Parse as span-level elements +: + a abbr acronym address b bdo big cite caption code del dfn dt em + h1 h2 h3 h4 h5 h6 i ins kbd label legend optgroup p pre q rb rbc + rp rt rtc ruby samp select small span strong sub sup th tt var + +> Remember that all span-level HTML tags like `a` or `b` do not start a HTML block! However, the +> above lists also include span-level HTML tags in the case the `markdown` attribute is used on a +> tag inside a raw HTML block. + +Here is a simple example input and its HTML output with `parse_block_html` set to `false`: + + This is a para. +
      + Something in here. +
      + Other para. +^ +

      This is a para.

      +
      + Something in here. +
      +

      Other para.

      + +As one can see the content of the `div` tag will be parsed as raw HTML block and left alone. +However, if the `markdown="1"` attribute was used on the `div` tag, the content would be parsed as +block-level elements and therefore converted to a paragraph. + +You can also use several HTML tags at once: + +
      + This is some text in the `layer1` div. +
      + This is some text in the `layers` div. +
      + This is a para outside the HTML block. + +However, remember that if the content of a tag is parsed as block-level elements, the content that +appears after a start/end tag but on the same line, is processed as if it appears on a new line: + +
      This is the first part of a para, + which is continued here. +
      + +

      This works without problems because it is parsed as + span-level elements

      + +
      The end tag is not found because + this line is parsed as a paragraph
      + +Since setting `parse_block_html` to `true` can lead to some not wanted behaviour, it is generally +better to selectively enable or disable block/span-level elements parsing by using the `markdown` +attribute! + +Unclosed block-level HTML tags are correctly closed at the end of the document to ensure correct +nesting and invalidly used end tags are removed from the output: + + This is a para. +
      + Another para. +

      +^ +

      This is a para.

      +
      +

      Another para.

      +
      + +The parsing of processing instructions and XML comments is also supported. The content of both, PIs +and XML comments, may span multiple lines. The start of a PI/XML comment may only appear at the +beginning of a line, optionally indented up to three spaces. If there is text after the end of a PI +or XML comment, it will be parsed as if it appears on a separate line. kramdown syntax in PIs/XML +comments is not processed: + + This is a para. + + First part of para, + continues here. + + + +# Text Markup + +These elements are all span-level elements and used inside block-level elements to markup text +fragments. For example, one can easily create links or apply emphasis to certain text parts. + +Note that empty span-level elements are not converted to empty HTML tags but are copied as-is to the +output. + + + +## Links and Images + +Three types of links are supported: automatic links, inline links and reference links. + +### Automatic Links + +This is the easiest one to create: Just surround a web address or an email address with angle +brackets and the address will be turned into a proper link. The address will be used as link target +and as link text. For example: + + Information can be found on the homepage. + You can also mail me: + +It is not possible to specify a different link text using automatic links -- use the other link +types for this! + + +### Inline Links + +As the wording suggests, inline links provide all information inline in the text flow. Reference +style links only provide the link text in the text flow and everything else is defined +elsewhere. This also allows you to reuse link definitions. + +An inline style link can be created by surrounding the link text with square brackets, followed +immediately by the link URL (and an optional title in single or double quotes preceded by at least +one space) in normal parentheses. For example: + + This is [a link](http://rubyforge.org) to a page. + A [link](../test "local URI") can also have a title. + And [spaces](link with spaces.html)! + +Notes: + +* The link text is treated like normal span-level text and therefore is parsed and converted. + However, if you use square brackets within the link text, you have to either properly nest them or + to escape them. It is not possible to create nested links! + + The link text may also be omitted, e.g. for creating link anchors. + +* The link URL has to contain properly nested parentheses if no title is specified, or the link URL + must be contained in angle brackets (incorrectly nested parentheses are allowed). + +* The link title may not contain its delimiters and may not be empty. + +* Additional link attributes can be added by using a [span IAL](#span-ials) after the inline link, + for example: + + This is a [link](http://example.com){:hreflang="de"} + +### Reference Links + +To create a reference style link, you need to surround the link text with square brackets (as with +inline links), followed by optional spaces/tabs/line breaks and then optionally followed with +another set of square brackets with the link identifier in them. A link identifier may not contain a +closing bracket and, when specified in a link definition, newline characters; it is also not case +sensitive, line breaks and tabs are converted to spaces and multiple spaces are compressed into one. +For example: + + This is a [reference style link][linkid] to a page. And [this] + [linkid] is also a link. As is [this][] and [THIS]. + +If you don't specify a link identifier (i.e. only use empty square brackets) or completely omit the +second pair of square brackets, the link text is converted to a valid link identifier by removing +all invalid characters and inserting spaces for line breaks. If there is a link definition found for +the link identifier, a link will be created. Otherwise the text is not converted to a link. + +As with inline links, additional link attributes can be added by using a [span IAL](#span-ials) +after the reference link. + +### Link Definitions + +The link definition can be put anywhere in the document. It does not appear in the output. A link +definition looks like this: + + [linkid]: http://www.example.com/ "Optional Title" + +> Link definitions are, despite being described here, non-content block-level elements. +{: .information} + +The link definition has the following structure: + +* The link identifier in square brackets, optionally indented up to three spaces, +* then a colon and one or more optional spaces/tabs, +* then the link URL which must contain at least one non-space character, or a left angle bracket, + the link URL and a right angle bracket, +* then optionally the title in single or double quotes, separated from the link URL by one or more + spaces or on the next line by itself indented any number of spaces/tabs. + +> The original Markdown syntax also allowed the title to be specified in parenthesis. This is not +> allowed for consistency with the inline title. +{: .markdown-difference} + +If you have some text that looks like a link definition but should really be a link and some text, +you can escape the colon after the link identifier: + + The next paragraph contains a link and some text. + + [Room 100]\: There you should find everything you need! + + [Room 100]: link_to_room_100.html + +Although link definitions are non-content block-level elements, [block IALs](#block-ials) can be +used on them to specify additional attributes for the links: + + [linkid]: http://example.com + {:hreflang="de"} + +### Images + +Images can be specified via a syntax that is similar to the one used by links. The difference is +that you have to use an exclamation mark before the first square bracket and that the link text of a +normal link becomes the alternative text of the image link. As with normal links, image links can be +written inline or reference style. For example: + + Here comes a ![smiley](../images/smiley.png)! And here + ![too](../images/other.png 'Title text'). Or ![here]. + With empty alt text ![](see.jpg) + +The link definition for images is exactly the same as the link definition for normal links. Since +additional attributes can be added via span and block IALs, it is possible, for example, to specify +image width and height: + + Here is an inline ![smiley](smiley.png){:height="36px" width="36px"}. + + And here is a referenced ![smile] + + [smile]: smile.png + {: height="36px" width="36px"} + +## Emphasis + +kramdown supports two types of emphasis: light and strong emphasis. Text parts that are surrounded +with single asterisks `*` or underscores `_` are treated as text with light emphasis, text parts +surrounded with two asterisks or underscores are treated as text with strong emphasis. Surrounded +means that the starting delimiter must not be followed by a space and that the stopping delimiter +must not be preceded by a space. + +Here is an example for text with light and strong emphasis: + + *some text* + _some text_ + **some text** + __some text__ + +The asterisk form is also allowed within a single word: + + This is un*believe*able! This d_oe_s not work! + +Text can be marked up with both light and strong emphasis, possibly using different delimiters. +However, it is not possible to nest strong within strong or light within light emphasized text: + + This is a ***text with light and strong emphasis***. + This **is _emphasized_ as well**. + This *does _not_ work*. + This **does __not__ work either**. + +If one or two asterisks or underscores are surrounded by spaces, they are treated literally. If you +want to force the literal meaning of an asterisk or an underscore you can backslash-escape it: + + This is a * literal asterisk. + These are ** two literal asterisk. + As \*are\* these! + + +## Code Spans + +This is the span-level equivalent of the [code block](#code-blocks) element. You can markup a text +part as code span by surrounding it with backticks `` ` ``. For example: + + Use `` tags for this. + +Note that all special characters in a code span are treated correctly. For example, when a code span +is converted to HTML, the characters `<`, `>` and `&` are substituted by their respective HTML +counterparts. + +To include a literal backtick in a code span, you need to use two or more backticks as delimiters. +You can insert one optional space after the starting and before the ending delimiter (these spaces +are not used in the output). For example: + + Here is a literal `` ` `` backtick. + And here is `` `some` `` text (note the two spaces so that one is left + in the output!). + +A single backtick surrounded by spaces is treated as literal backtick. If you want to force the +literal meaning of a backtick you can backslash-escape it: + + This is a ` literal backtick. + As \`are\` these! + +As with [code blocks](#language-of-code-blocks) you can set the language of a code span by using an +[IAL](#inline-attribute-lists): + + This is a Ruby code fragment `x = Class.new`{:.language-ruby} + + +## HTML Spans + +HTML tags cannot only be used on the block-level but also on the span-level. Span-level HTML tags +can only be used inside one block-level element, it is not possible to use a start tag in one block +level element and the end tag in another. Note that only correct XHTML is supported! This means that +you have to use, for example, `
      ` instead of `
      ` (although kramdown tries to fix such errors +if possible). + +By default, kramdown parses kramdown syntax inside span HTML tags. However, this behaviour can be +configured with the `parse_span_html` option. If this is set to `true`, then syntax parsing in HTML +spans is enabled, if it is set to `false`, parsing is disabled. It is also possible to +enable/disable syntax parsing on a tag per tag basis using the `markdown` attribute: + +* If an HTML tag has an attribute `markdown="0"`, then no parsing (except parsing of HTML span tags) + is done inside that HTML tag. + +* If an HTML tag has an attribute `markdown="1"`, then the content of the tag is parsed as span + level elements. + +* If an HTML tag has an attribute `markdown="block"`, then a warning is issued because HTML spans + cannot contain block-level elements and the attribute is ignored. + +* If an HTML tag has an attribute `markdown="span"`, then the content of the tag is parsed as span + level elements. + +The content of a span-level HTML tag is normally parsed as span-level elements. Note, however, that +some tags like `

      + + + + +

      parsed +This too +

      + + + + + + + + + +

      http://example.com

      + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.htmlinput b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.htmlinput new file mode 100644 index 0000000..22b9ea5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.htmlinput @@ -0,0 +1,34 @@ +

      baz { |qux| quux }

      + +

      This is some para. +

      + + + + +

      parsed +This too +

      + + + + + + + + + +

      http://example.com

      + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.options new file mode 100644 index 0000000..a660da2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.options @@ -0,0 +1 @@ +:parse_block_html: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.text new file mode 100644 index 0000000..e0617c4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_raw.text @@ -0,0 +1,33 @@ +

      baz { |qux| quux }

      + +This is some para. + + + + +

      *parsed* +This too +

      + + + + + + + + + + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.html new file mode 100644 index 0000000..2a6191f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.html @@ -0,0 +1,12 @@ +

      This text +should be parsed +as span +

      + +

      This produces `

      +

      ` an unwanted result.</p>

      + +

      This text too

      +

      +some text +

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.htmlinput b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.htmlinput new file mode 100644 index 0000000..4199b8b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.htmlinput @@ -0,0 +1,12 @@ +

      This text +should be parsed +as span +

      + +

      This produces `

      +

      ` an unwanted result.</p>

      + +

      This text too

      +

      +some text +

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.options new file mode 100644 index 0000000..a660da2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.options @@ -0,0 +1 @@ +:parse_block_html: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.text new file mode 100644 index 0000000..d07cf6d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_as_span.text @@ -0,0 +1,9 @@ +

      This *text +should* be parsed +as span +

      + +

      This produces `

      ` an unwanted result.

      + +

      This *text* too

      +some text diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.html new file mode 100644 index 0000000..8de78c0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.html @@ -0,0 +1,21 @@ +

      +

      test

      +
      + +
      +
      test
      +
      +
      +
      test
      +
      +
      +
      + +
      +
      code block with </div>
      +
      +
      + +
      +

      No matching end tag

      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.options new file mode 100644 index 0000000..a660da2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.options @@ -0,0 +1 @@ +:parse_block_html: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.text new file mode 100644 index 0000000..b8b1845 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/parse_block_html.text @@ -0,0 +1,17 @@ +
      + test +
      + +
      + test +
      + test +
      +
      + +
      + code block with
      +
      + +
      +No matching end tag diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/processing_instruction.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/processing_instruction.html new file mode 100644 index 0000000..b292a05 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/processing_instruction.html @@ -0,0 +1,13 @@ + + +

      para

      + + +

      para

      + +

      other

      + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/processing_instruction.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/processing_instruction.text new file mode 100644 index 0000000..fcb866f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/processing_instruction.text @@ -0,0 +1,12 @@ + + +para + + para + +other + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.html new file mode 100644 index 0000000..2836156 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.html @@ -0,0 +1,60 @@ +
      +

      test

      +
      + +

      +para2 +

      + +
      +

      tes

      + +

      test +weiter +

      +
      + +

      para4

      + +
      +
      +
      +

      foo

      +
      +
      +
      +
      +

      bar 

      +
      +
      + +

      para5

      + +
      +

      id

      +
      +

      test

      + +
      +

      hallo

      +
      +
      +

      hallo

      +
      + +

      para6

      + +
      +
      +

      Another para.

      +
      + +

      Test

      + +

      Test

      + +

      Test + +

      + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.html.19 new file mode 100644 index 0000000..0d926c5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.html.19 @@ -0,0 +1,60 @@ +
      +

      test

      +
      + +

      +para2 +

      + +
      +

      tes

      + +

      test +weiter +

      +
      + +

      para4

      + +
      +
      +
      +

      foo

      +
      +
      +
      +
      +

      bar 

      +
      +
      + +

      para5

      + +
      +

      id

      +
      +

      test

      + +
      +

      hallo

      +
      +
      +

      hallo

      +
      + +

      para6

      + +
      +
      +

      Another para.

      +
      + +

      Test

      + +

      Test

      + +

      Test + +

      + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.options new file mode 100644 index 0000000..a660da2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.options @@ -0,0 +1 @@ +:parse_block_html: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.text new file mode 100644 index 0000000..a2ffe25 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/simple.text @@ -0,0 +1,55 @@ +
      +test +
      + +

      +para2 +

      + +
      +

      tes

      + +

      test +weiter +

      +
      + +para4 + +
      +
      +
      +foo +
      +
      +
      +
      bar  +
      +
      + +para5 + +
      id +
      test + +
      +hallo +
      +hallo +
      + +para6 + +
      +Another para. +
      + +Test + +

      Test

      + +

      Test + +

      + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/textarea.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/textarea.html new file mode 100644 index 0000000..6f5693e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/textarea.html @@ -0,0 +1,8 @@ +

      This is a

      + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/textarea.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/textarea.text new file mode 100644 index 0000000..a240f5c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/textarea.text @@ -0,0 +1,8 @@ +This is a + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/xml.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/xml.html new file mode 100644 index 0000000..d941bc0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/xml.html @@ -0,0 +1,8 @@ + + +doit + +doit + +doit</some> + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/xml.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/xml.text new file mode 100644 index 0000000..6427fae --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/09_html/xml.text @@ -0,0 +1,7 @@ + + +doit + +doit + +doit diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/10_ald/simple.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/10_ald/simple.html new file mode 100644 index 0000000..74b03d5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/10_ald/simple.html @@ -0,0 +1,2 @@ +

      Some paragraph

      + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/10_ald/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/10_ald/simple.text new file mode 100644 index 0000000..f58768a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/10_ald/simple.text @@ -0,0 +1,8 @@ +Some paragraph + +{:id: ref1} +{:id: .class1} + {:id: #id} + {:id: key="value"} + {:id: .class2 .class3 ref2 #id-with key="value" key='value' key='dfsd\}' } +{:test: k ey=value} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.html new file mode 100644 index 0000000..9857a03 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.html @@ -0,0 +1 @@ +

      A header

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.options new file mode 100644 index 0000000..8776b55 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.options @@ -0,0 +1 @@ +:auto_ids: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.text new file mode 100644 index 0000000..f521fb0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/auto_id_and_ial.text @@ -0,0 +1,2 @@ +## A header +{:#myid .cls} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/nested.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/nested.html new file mode 100644 index 0000000..84cc368 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/nested.html @@ -0,0 +1,11 @@ +
      +test +
      + +
      +

      test

      +
      + +
      +

      para

      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/nested.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/nested.text new file mode 100644 index 0000000..827645c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/nested.text @@ -0,0 +1,15 @@ +{:.cls} +
      +test +
      +{:#id} + +{:.cls} +
      +test +
      +{:#id} + +{:.cls} +> para +{:#id} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/simple.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/simple.html new file mode 100644 index 0000000..1086f0c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/simple.html @@ -0,0 +1,29 @@ +

      Some paragraph.

      + +

      Some paragraph.

      + +
      +

      quote

      +
      + +
        +
      • list
      • +
      + +
      code block
      +
      + +
      other code block
      +
      + +

      A header

      + +

      Some paragraph here

      + +

      Some paragraph here

      + +

      Paragraph

      +

      Paragraph

      + +

      Another header

      + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/simple.text new file mode 100644 index 0000000..b97eef3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/11_ial/simple.text @@ -0,0 +1,41 @@ +Some paragraph. +{:.class .-class id key="val"} + +Some paragraph. +{:.cls1#id.cls2} + +> quote +{: #id} + {: .class} + +* list +{: key="val"} + + code block +{: #other} + + other code block + +## A header +{:#myid} + +{:.cls} +Some paragraph here + +{:.cls1} +{:.cls2} +Some paragraph here + +Paragraph +{:.cls} +Paragraph + +Another header +============== +{: .class #other} + +{:id: #id key="valo"} +{:id: #other .myclass other} +{:other: key1="val\"" - ig.nored as_is#this key2='val\'' .other-class} + +{:.invalid} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/comment.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/comment.html new file mode 100644 index 0000000..20b4c66 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/comment.html @@ -0,0 +1,8 @@ +

      This is a simple paragraph.

      + + + +

      And another paragraph

      + +

      {::comment} +Another paragraph

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/comment.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/comment.text new file mode 100644 index 0000000..2dfc919 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/comment.text @@ -0,0 +1,12 @@ +This is a simple paragraph. + +{::comment} +This is a comment {:/}which is {:/comment} ignored. +{:/comment} + +And another paragraph + +{::comment this='is' .ignore /} + +{::comment} +Another paragraph diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/ignored.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/ignored.html new file mode 100644 index 0000000..17aae5c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/ignored.html @@ -0,0 +1,8 @@ +

      paragraph

      + +

      {::something} +anotherthing +{:/something}

      + +

      {::something/} +paragraph

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/ignored.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/ignored.text new file mode 100644 index 0000000..ae94a8f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/ignored.text @@ -0,0 +1,8 @@ +paragraph + +{::something} +anotherthing +{:/something} + +{::something/} +paragraph diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.html new file mode 100644 index 0000000..7fe58d5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.html @@ -0,0 +1,10 @@ +

      This is a simple paragraph.

      + +This *is* not processed + +

      And another paragraph

      + +bold + +

      {::nomarkdown} +Another paragraph

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.kramdown b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.kramdown new file mode 100644 index 0000000..2cee512 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.kramdown @@ -0,0 +1,20 @@ +This is a simple paragraph. + +{::nomarkdown} +This *is* not processed +{:/} + +And another paragraph + +{::nomarkdown type="html"} +bold +{:/} + +{::nomarkdown type="latex"} +\begin{itemize} +\item[Yes] YESSSS! +\end{itemize} +{:/} + +\{::nomarkdown} Another paragraph + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.latex new file mode 100644 index 0000000..5af0263 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.latex @@ -0,0 +1,13 @@ +This is a simple paragraph. + +This *is* not processed + +And another paragraph + +\begin{itemize} +\item[Yes] YESSSS! +\end{itemize} + +\{::nomarkdown\} +Another paragraph + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.text new file mode 100644 index 0000000..43d441d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/nomarkdown.text @@ -0,0 +1,21 @@ +This is a simple paragraph. + +{::nomarkdown} +This *is* not processed + {:/nomarkdown} + +And another paragraph + +{::nomarkdown this='is' .ignore /} + +{::nomarkdown type='html'} +bold +{:/} +{::nomarkdown type="latex"} +\begin{itemize} +\item[Yes] YESSSS! +\end{itemize} +{:/} + +{::nomarkdown} +Another paragraph diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options.html new file mode 100644 index 0000000..d3567ec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options.html @@ -0,0 +1,21 @@ +

      No header id

      + +

      without header id

      + +
      +some *para* +
      + +
      +

      some para

      +
      + +

      Some text10.

      + +
      +
        +
      1. +

        Some text. 

        +
      2. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options.text new file mode 100644 index 0000000..5991ab7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options.text @@ -0,0 +1,21 @@ +# No header id + +{::options unusedvar="val" /} + +# without header id + +
      +some *para* +
      + +{::options parse_block_html="true" parse_span_html="true" /} + +
      +some *para* +
      + +{::options footnote_nr="10" /} + +Some text[^ab]. + +[^ab]: Some text. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options2.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options2.html new file mode 100644 index 0000000..203d6eb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options2.html @@ -0,0 +1,10 @@ + +

      Some text1.

      + +
      +
        +
      1. +

        Some text. 

        +
      2. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options2.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options2.text new file mode 100644 index 0000000..78abfbe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options2.text @@ -0,0 +1,5 @@ +{::options footnote_nr="da10" /} + +Some text[^ab]. + +[^ab]: Some text. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options3.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options3.html new file mode 100644 index 0000000..7434df6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options3.html @@ -0,0 +1,7 @@ +
      x = Class.new + +
      + +
      x = Class.new + +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options3.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options3.text new file mode 100644 index 0000000..e0ee87c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/12_extension/options3.text @@ -0,0 +1,7 @@ + x = Class.new +{: .language-ruby} + +{::options coderay_wrap="span" coderay_line_numbers="" coderay_css="class" coderay_tab_width="4" /} + + x = Class.new +{: .language-ruby} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/auto_ids.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/auto_ids.html new file mode 100644 index 0000000..398628a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/auto_ids.html @@ -0,0 +1,15 @@ +
      +
      item
      +
      def
      +
      item2
      +
      def
      +
      + +
      +
      item
      +
      def
      +
      item2
      +
      def
      +
      item3
      +
      def
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/auto_ids.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/auto_ids.text new file mode 100644 index 0000000..f1797a7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/auto_ids.text @@ -0,0 +1,18 @@ +{:auto_ids} +item +: def + +item2 +: def + +^ + +{:auto_ids-prefix-} +item +: def + +item2 +: def + +{:#id} item3 +: def diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/definition_at_beginning.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/definition_at_beginning.html new file mode 100644 index 0000000..7c5cc04 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/definition_at_beginning.html @@ -0,0 +1 @@ +

      : no definition

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/definition_at_beginning.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/definition_at_beginning.text new file mode 100644 index 0000000..cd3671b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/definition_at_beginning.text @@ -0,0 +1 @@ +: no definition diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/deflist_ial.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/deflist_ial.html new file mode 100644 index 0000000..3090b1e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/deflist_ial.html @@ -0,0 +1,4 @@ +
      +
      item
      +
      definition
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/deflist_ial.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/deflist_ial.text new file mode 100644 index 0000000..587c3b0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/deflist_ial.text @@ -0,0 +1,4 @@ +{:.dl-horizontal} +item +: definition +{:.dl-other} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/item_ial.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/item_ial.html new file mode 100644 index 0000000..0ed1197 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/item_ial.html @@ -0,0 +1,17 @@ +
      +
      item
      +
      definition +continued
      +
      another {:.cls}
      +
      +
      code
      +
      +
      +
      IAL at last + no code bc of text
      +
      term
      +
      definition
      +
      term1
      +
      term2
      +
      definition
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/item_ial.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/item_ial.text new file mode 100644 index 0000000..2058d74 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/item_ial.text @@ -0,0 +1,16 @@ +item +: {:.cls} definition + continued +: another {:.cls} +: {:.class} + code +: {:.cls} IAL at last + no code bc of text + + +{:.class} term +: definition + +{:.class1} term1 +{:.class2} term2 +: definition diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/multiple_terms.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/multiple_terms.html new file mode 100644 index 0000000..e2e089b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/multiple_terms.html @@ -0,0 +1,13 @@ +
      +
      kram
      +
      down
      +
      now
      +
      definition 1
      +
      definition 2
      +
      +

      definition 3

      +
      +
      +

      definition 4

      +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/multiple_terms.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/multiple_terms.text new file mode 100644 index 0000000..b834258 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/multiple_terms.text @@ -0,0 +1,10 @@ +kram +*down* +now +: definition 1 +: definition 2 + +: definition 3 + + +: definition 4 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/no_def_list.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/no_def_list.html new file mode 100644 index 0000000..c16f962 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/no_def_list.html @@ -0,0 +1,2 @@ +

      This is a para +: and not a definition list

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/no_def_list.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/no_def_list.text new file mode 100644 index 0000000..98b52b3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/no_def_list.text @@ -0,0 +1,2 @@ +This is a para +\: and not a definition list diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/para_wrapping.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/para_wrapping.html new file mode 100644 index 0000000..5f28fdf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/para_wrapping.html @@ -0,0 +1,10 @@ +
      +
      term
      +
      +

      definition

      +
      +
      definition
      +
      +

      definition

      +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/para_wrapping.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/para_wrapping.text new file mode 100644 index 0000000..280fa47 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/para_wrapping.text @@ -0,0 +1,6 @@ +term + +: definition +: definition + +: definition diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/separated_by_eob.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/separated_by_eob.html new file mode 100644 index 0000000..0a1c4dc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/separated_by_eob.html @@ -0,0 +1,8 @@ +
      +
      kram
      +
      down
      +
      +
      +
      kram
      +
      down
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/separated_by_eob.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/separated_by_eob.text new file mode 100644 index 0000000..56fedf1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/separated_by_eob.text @@ -0,0 +1,5 @@ +kram +: down +^ +kram +: down diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/simple.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/simple.html new file mode 100644 index 0000000..791f145 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/simple.html @@ -0,0 +1,10 @@ +
      +
      kram
      +
      down
      +
      novalue
      +
      +
      kram
      +
      down +kram
      +
      down
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/simple.text new file mode 100644 index 0000000..e3bf730 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/simple.text @@ -0,0 +1,10 @@ +kram +: down + +novalue +: + +kram +: down +kram +: down diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/styled_terms.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/styled_terms.html new file mode 100644 index 0000000..cf7d785 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/styled_terms.html @@ -0,0 +1,4 @@ +
      +
      kram
      +
      down
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/styled_terms.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/styled_terms.text new file mode 100644 index 0000000..76eb355 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/styled_terms.text @@ -0,0 +1,2 @@ +*kram* +: down diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/too_much_space.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/too_much_space.html new file mode 100644 index 0000000..b4df878 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/too_much_space.html @@ -0,0 +1,3 @@ +

      para

      + +

      : no definition

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/too_much_space.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/too_much_space.text new file mode 100644 index 0000000..30ab445 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/too_much_space.text @@ -0,0 +1,4 @@ +para + + +: no definition diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/with_blocks.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/with_blocks.html new file mode 100644 index 0000000..45b5865 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/with_blocks.html @@ -0,0 +1,38 @@ +
      +
      kram
      +
      this is some +text
      +
      +

      this is some +more text

      +
      +
      kram
      +
      +
      +

      blockquote

      +
      +
      +
      kram
      +
      +
      code
      +
      +
      +
      kram
      +
      +
      +
      kram
      +
      down
      +
      +
      +
      kram
      +
      +

      header

      +
      +
      kram
      +
      +
        +
      • list
      • +
      • items
      • +
      +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/with_blocks.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/with_blocks.text new file mode 100644 index 0000000..15195ce --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/13_definition_list/with_blocks.text @@ -0,0 +1,24 @@ +kram +: this is some + text + + : this is some + more text + +kram +: > blockquote + +kram +: + code + +kram +: kram + : down + +kram +: # header + +kram +: * list + * items diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/errors.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/errors.html new file mode 100644 index 0000000..302e97a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/errors.html @@ -0,0 +1,12 @@ +

      No table body

      + +

      |-|-|-

      + +

      |no|table|here|

      + +

      |no|table|here| +paragraph

      + +

      |-|-| +|-|-|

      + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/errors.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/errors.text new file mode 100644 index 0000000..3565d5b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/errors.text @@ -0,0 +1,13 @@ +No table body + +|-|-|- + +[5]: test +|no|table|here| + +|no|table|here| +paragraph + +|-|-| +|-|-| + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/escaping.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/escaping.html new file mode 100644 index 0000000..b4528a1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/escaping.html @@ -0,0 +1,52 @@ +

      cell 1 | cell 2

      + +

      cell 1 | cell 2

      + + + + + + + + +
      cell 1cell 2 | continued
      + + + + + + + + +
      cell 1cell 2
      + + + + + + + + +
      cell 1code | span
      + +

      cell 1 code | span

      + +

      cell 1 | code | span

      + + + + + + + + + + + + + + +
      cell 1cell `2cell 3
      cell 1`cell 2cell 3
      + +

      cell 1 | cell 2 | cell 3 +cell 1 | cell 2 | cell 3

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/escaping.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/escaping.text new file mode 100644 index 0000000..a8a24d6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/escaping.text @@ -0,0 +1,19 @@ +`cell 1 | cell 2` + +cell 1 \| cell 2 + +cell 1 | cell 2 \| continued + +cell 1 | cell `2` + +cell 1 | `code | span` + +cell 1 `code | span` + +cell 1 \| `code | span` + +cell 1 | cell `2 | cell 3 +cell 1` | cell 2 | cell 3 + +cell 1 \| cell `2 | cell 3 +cell 1` | cell 2 | cell 3 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/footer.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/footer.html new file mode 100644 index 0000000..e6596ed --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/footer.html @@ -0,0 +1,65 @@ +

      Simple footer

      + + + + + + + + + + + + + + +
      cell1cell2
      cell3cell4
      + +

      Full footer

      + + + + + + + + + + + + + + +
      cell1cell2
      cell3cell4
      + +

      Footer with separator lines

      + + + + + + + + + + + + + + + + + + +
      cell1cell2
      cell3cell4
      cell5cell6
      + +

      Empty footer

      + + + + + + + + +
      cell1cell2
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/footer.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/footer.text new file mode 100644 index 0000000..faaed8d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/footer.text @@ -0,0 +1,25 @@ +Simple footer + +| cell1 | cell2 +|= +| cell3 | cell4 + +Full footer + +| cell1 | cell2 +|=======|=======| +| cell3 | cell4 + +Footer with separator lines + +| cell1 | cell2 +|=======|=======| +| cell3 | cell4 +|--- +| cell5 | cell6 +|--- + +Empty footer + +| cell1 | cell2 +|= diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/header.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/header.html new file mode 100644 index 0000000..647f2c4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/header.html @@ -0,0 +1,117 @@ +

      Simple header

      + + + + + + + + + + + + + + +
      cell1cell2
      cell3cell4
      + +

      Full header

      + + + + + + + + + + + + + + +
      cell1cell2
      cell3cell4
      + +

      With alignment and superfluous alignment defs

      + + + + + + + + + + + + + + + + + + + + +
      defaultleftcenterrightdefault
      cell1cell2cell3cell4cell5
      + +

      With leading sep line

      + + + + + + + + + + + + + + +
      cell1cell2
      cell3cell4
      + +

      Multiple bodies

      + + + + + + + + + + + + + + + + + + + + +
      cell1cell2
      cell3cell4
      cell5cell6
      + +

      Sep line with tab

      + + + + + + + + + + + + + + + + + + +
      rightcenter
      cell1cell2
      cell3cell4
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/header.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/header.text new file mode 100644 index 0000000..6961bfb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/header.text @@ -0,0 +1,39 @@ +Simple header + +| cell1 | cell2 +|----- +| cell3 | cell4 + +Full header + +| cell1 | cell2 +|-------|-------| +| cell3 | cell4 + +With alignment and superfluous alignment defs + +| default | left | center | right | default +|-| :- |:-: | -: | - | :-: | :- +| cell1 | cell2 | cell3 | cell4 | cell5 + +With leading sep line + +|:-:|-:| +| cell1 | cell2 +|-------|-------| +| cell3 | cell4 + +Multiple bodies + +| cell1 | cell2 ++ :-: | +| cell3 | cell4 +|----||| +| cell5 | cell6 + +Sep line with tab + +right | center +---: | :---: +cell1 | cell2 +cell3 | cell4 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/no_table.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/no_table.html new file mode 100644 index 0000000..dce46b1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/no_table.html @@ -0,0 +1,3 @@ +

      No table

      + +

      | Some | thing | here

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/no_table.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/no_table.text new file mode 100644 index 0000000..90f90b3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/no_table.text @@ -0,0 +1,3 @@ +No table + +\| Some \| thing \| here diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/simple.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/simple.html new file mode 100644 index 0000000..506b442 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/simple.html @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + +
      cell1cell2
      cell3cell4
      cell5cell6 |
      cell7cell8
      + +

      Missing cells at end

      + + + + + + + + + + + + + + + + + + + +
      cell1cell2cell3
      cell1  
       cell2cell3
      + +

      Escaped pipe characters

      + + + + + + + + + + + + + + + + +
      cell1 | cell1cell2
      cell1cell2 |
      cell1 | concell2
      + +

      Table with code elements

      + + + + + + + + + + + + + + + + +
      This is a span | with a pipe.   
      Some span</em> herea span | with apipe.
      + +

      Special cases regarding codespan syntax

      + + + + + + + + +
      ab
      + + + + + + + +
      a
      + + + + + + + + + +
      tablewithial
      + + + + + + + + + +
      tablewithial
      + +

      not starting with a bar

      + + + + + + + + +
      simpletable
      + + + + + + + + + + + + + + +
      head1head2
      cell1cell2
      + + + + + + + + + + + + + + +
      head1head2
       cell2
      + + + + + + + + + + + + + + + + +
      ab
      cd
      ef
      + + + + + + + + + + + + + + +
      KeyValue type
      Type"GROUP"|"UNKNOWN"
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/simple.text new file mode 100644 index 0000000..0f225a4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/simple.text @@ -0,0 +1,53 @@ +| cell1 | cell2 | +|cell3 | cell4| +|cell5|cell6 \| +| cell7|cell8 + +Missing cells at end + +| cell1 | cell2 | cell3 | +| cell1 || +|| cell2 | cell3 + +Escaped pipe characters + +| cell1 \| cell1 | cell2 | +| cell1 | cell2 \| +| cell1 `|` con | cell2 + +Table with code elements + +| This is a span | with a pipe. +| Some span | here | a span | with a | pipe. + +Special cases regarding codespan syntax + +|a|`b` + +|`a` + +{:.cls} +| table | with | ial + +| table | with | ial +{:.cls} + +not starting with a bar + +simple | table + +head1 | head2 +------|------ +cell1 | cell2 + + head1 | head2 +-------|------ + | cell2 + +| a | b | + c | d +| e | f | + +| Key | Value type | +|--------|------------------------| +| `Type` | `"GROUP"`\|`"UNKNOWN"` | diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.html new file mode 100644 index 0000000..0bf6781 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.html @@ -0,0 +1,25 @@ + + + + + + + + + + + +
      this is 1a table
      with afootnote
      + +
      +
        +
      1. +

        Something

        + +
        +

        special here

        +
        +

        +
      2. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.latex new file mode 100644 index 0000000..99b5312 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.latex @@ -0,0 +1,11 @@ +\begin{longtable}{|l|l|} +\hline +this is \footnote{Something + +\begin{quote} +special here +\end{quote}} & a table\\ +with a & footnote\\ +\hline +\end{longtable} + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.text new file mode 100644 index 0000000..345fc5d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/14_table/table_with_footnote.text @@ -0,0 +1,6 @@ +| this is [^1] | a table +| with a | footnote + +[^1]: Something + + > special here diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/gh_128.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/gh_128.html new file mode 100644 index 0000000..ab27b4b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/gh_128.html @@ -0,0 +1,2 @@ + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/gh_128.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/gh_128.text new file mode 100644 index 0000000..95252a7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/gh_128.text @@ -0,0 +1 @@ +$$ $$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.html new file mode 100644 index 0000000..214212a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.html @@ -0,0 +1 @@ +f(x)=ax 3+bx 2+cx+df(x) = a{x^3} + b{x^2} + cx + d diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.options new file mode 100644 index 0000000..953bdae --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.options @@ -0,0 +1 @@ +:math_engine: itex2mml diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.text new file mode 100644 index 0000000..23fe297 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/itex2mml.text @@ -0,0 +1 @@ +$$f(x) = a{x^3} + b{x^2} + cx + d$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.html new file mode 100644 index 0000000..5ef3a83 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.html @@ -0,0 +1,4 @@ +

      This is a 5 + 5 statement

      + +
      5 + 5
      + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.options new file mode 100644 index 0000000..75f702c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.options @@ -0,0 +1,2 @@ +:math_engine_opts: + :preview: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.text new file mode 100644 index 0000000..7068767 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview.text @@ -0,0 +1,5 @@ +This is a $$5 + 5$$ statement + +$$ +5 + 5 +$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.html new file mode 100644 index 0000000..1ee20d4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.html @@ -0,0 +1,4 @@ +

      This is a 5 + 5 statement

      + +
      5 + 5
      + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.options new file mode 100644 index 0000000..ab0bc54 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.options @@ -0,0 +1,3 @@ +:math_engine_opts: + :preview: true + :preview_as_code: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.text new file mode 100644 index 0000000..7068767 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_as_code.text @@ -0,0 +1,5 @@ +This is a $$5 + 5$$ statement + +$$ +5 + 5 +$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.html new file mode 100644 index 0000000..623d286 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.html @@ -0,0 +1,4 @@ +

      This is a math statement

      + +
      math
      + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.options new file mode 100644 index 0000000..28a68b5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.options @@ -0,0 +1,2 @@ +:math_engine_opts: + :preview: 'math' diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.text new file mode 100644 index 0000000..7068767 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjax_preview_simple.text @@ -0,0 +1,5 @@ +This is a $$5 + 5$$ statement + +$$ +5 + 5 +$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.html.19 new file mode 100644 index 0000000..7508451 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.html.19 @@ -0,0 +1,27 @@ + + f + ( + x + ) + = + a + + + x + 3 + + + + + b + + + x + 2 + + + + + c + x + + + d + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.options new file mode 100644 index 0000000..adc27e8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.options @@ -0,0 +1 @@ +:math_engine: mathjaxnode diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.text new file mode 100644 index 0000000..23fe297 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode.text @@ -0,0 +1 @@ +$$f(x) = a{x^3} + b{x^2} + cx + d$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.html.19 new file mode 100644 index 0000000..252f41c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.html.19 @@ -0,0 +1,23 @@ + + f + ( + x + ) + = + a + + x + 3 + + + + b + + x + 2 + + + + c + x + + + d + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.options new file mode 100644 index 0000000..827e462 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.options @@ -0,0 +1,3 @@ +:math_engine: mathjaxnode +:math_engine_opts: + :texhints: false diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.text new file mode 100644 index 0000000..23fe297 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_notexhints.text @@ -0,0 +1 @@ +$$f(x) = a{x^3} + b{x^2} + cx + d$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.html.19 new file mode 100644 index 0000000..97b2653 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.html.19 @@ -0,0 +1,32 @@ + + + + f + ( + x + ) + = + a + + + x + 3 + + + + + b + + + x + 2 + + + + + c + x + + + d + + f(x) = a{x^3} + b{x^2} + cx + d + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.options new file mode 100644 index 0000000..1f645b1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.options @@ -0,0 +1,3 @@ +:math_engine: mathjaxnode +:math_engine_opts: + :semantics: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.text new file mode 100644 index 0000000..23fe297 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/mathjaxnode_semantics.text @@ -0,0 +1 @@ +$$f(x) = a{x^3} + b{x^2} + cx + d$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.html new file mode 100644 index 0000000..5d6b343 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.html @@ -0,0 +1,3 @@ +
      $$ +5+5 +$$
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.options new file mode 100644 index 0000000..06d559e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.options @@ -0,0 +1 @@ +:math_engine: ~ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.text new file mode 100644 index 0000000..fdee5cf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/no_engine.text @@ -0,0 +1,2 @@ +{: #math-id} +$$5+5$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/normal.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/normal.html new file mode 100644 index 0000000..3000a86 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/normal.html @@ -0,0 +1,29 @@ +

      This is a para. +

      + + + +

      +This is a para.

      + + + + + + + + + + + +
      $$5+5$$
      +
      + + + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/normal.text new file mode 100644 index 0000000..aa5984a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/normal.text @@ -0,0 +1,30 @@ +This is a para. +$$ \text{LaTeX} \lambda_5 $$ + +$$\lambda_5 = \alpha + 4$$ + +$$\lambda_\alpha > 5$$ +This is a para. + +$$\begin{align*} +&=5 \\ +&=6 \\ +\end{align*}$$ + +$$5+5$$ + + $$5+5$$ + + $$5+5$$ + + $$5+5$$ + + $$5+5$$ + +{:.cls} +$$5+5$$ +^ +$$5+5$$ +{:.cls} + +$$|x| = 5$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.html new file mode 100644 index 0000000..e9d61b5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.html @@ -0,0 +1 @@ +f(x)=ax3+bx2+cx+d diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.options new file mode 100644 index 0000000..0ef54eb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.options @@ -0,0 +1 @@ +:math_engine: ritex diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.text new file mode 100644 index 0000000..23fe297 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/ritex.text @@ -0,0 +1 @@ +$$f(x) = a{x^3} + b{x^2} + cx + d$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.html.19 new file mode 100644 index 0000000..116a0c8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.html.19 @@ -0,0 +1,2 @@ +Δ=12abcdefghi\Delta = \frac{1}{2} +\begin{vmatrix}a & b & c \\ d & e & f \\ g & h & i\end{vmatrix} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.options new file mode 100644 index 0000000..214a301 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.options @@ -0,0 +1 @@ +:math_engine: sskatex diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.text new file mode 100644 index 0000000..2f18490 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/15_math/sskatex.text @@ -0,0 +1,2 @@ +$$\Delta = \frac{1}{2} +\begin{vmatrix}a & b & c \\ d & e & f \\ g & h & i\end{vmatrix}$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/no_toc.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/no_toc.html new file mode 100644 index 0000000..bbb831e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/no_toc.html @@ -0,0 +1,14 @@ + +

      Header level 1

      + +

      Header level 2

      + +

      Header level 3

      + +

      Header level 4

      + +

      Other header level 1

      + +

      Other header level 2

      + +

      Other header level 3

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/no_toc.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/no_toc.text new file mode 100644 index 0000000..11ad829 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/no_toc.text @@ -0,0 +1,16 @@ +* Here comes the table of content +{:toc} + +# Header level 1 + +## Header level 2 + +### Header level 3 + +#### Header level 4 + +# Other header level 1 + +## Other header level 2 + +### Other header level 3 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.html new file mode 100644 index 0000000..d352684 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.html @@ -0,0 +1,35 @@ +

      Contents

      + + + +

      Header level 1

      + +

      Header level 2

      + +

      Header level 3

      + +

      Header level 4

      + +

      Other header level 1

      + +

      Other header level 2

      + +

      Other header level 3

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.options new file mode 100644 index 0000000..8776b55 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.options @@ -0,0 +1 @@ +:auto_ids: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.text new file mode 100644 index 0000000..d8f0b86 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_exclude.text @@ -0,0 +1,19 @@ +# Contents +{:.no_toc} + +* Here comes the table of content +{:toc} + +# Header level 1 + +## Header level 2 + +### Header level 3 + +#### Header level 4 + +# Other header level 1 + +## Other header level 2 + +### Other header level 3 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.html new file mode 100644 index 0000000..e50a07c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.html @@ -0,0 +1,24 @@ + + +

      Header level 1

      + +

      Header \` level 2

      + +

      Header level 3

      + +

      Header level 4

      + +

      Other header level 1

      + +

      Other header level 2

      + +

      Other header level 3

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.options new file mode 100644 index 0000000..bdfbeba --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.options @@ -0,0 +1,2 @@ +:toc_levels: 2..3 +:auto_ids: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.text new file mode 100644 index 0000000..1a62dea --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_levels.text @@ -0,0 +1,16 @@ +* Here comes the table of content +{:toc} + +# Header level 1 + +## Header \\\` level 2 + +### Header level 3 + +#### Header level 4 + +# Other header level 1 + +## Other header level 2 + +### Other header level 3 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.html new file mode 100644 index 0000000..a395a02 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.html @@ -0,0 +1,13 @@ + + +

      Header1 level 1

      + +
      +
        +
      1. +

        Some footnote content here 

        +
      2. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.options new file mode 100644 index 0000000..8776b55 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.options @@ -0,0 +1 @@ +:auto_ids: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.text new file mode 100644 index 0000000..5879ed5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_footnotes.text @@ -0,0 +1,6 @@ +* Here comes the table of content +{:toc} + +# Header[^1] level 1 + +[^1]: Some footnote content here diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.html new file mode 100644 index 0000000..ebde543 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.html @@ -0,0 +1,8 @@ +

      Header

      + +

      Header

      + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.options new file mode 100644 index 0000000..36c20f5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.options @@ -0,0 +1,2 @@ +:auto_ids: true +:auto_id_stripping: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.text new file mode 100644 index 0000000..9b4ac07 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/block/16_toc/toc_with_links.text @@ -0,0 +1,8 @@ +# [Header] + +# [Header] + +[header]: test.html + +* toc +{:toc} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/encoding.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/encoding.html new file mode 100644 index 0000000..0339347 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/encoding.html @@ -0,0 +1,46 @@ +

      Das ist gewöhnlich ein Über-Problem mit manchen
      +Sälen http://example.org und anderen Dinge. Siehe +Über mich!

      + +
      +

      Vielleicht höre ich nicht richtig?

      +
      + +
        +
      • Sollten wir uns das überlegen? Verhöhne mich nicht!
      • +
      • Ho ho höher! Sind *wir* da?
      • +
      + +

      Titel sind urschön

      + +

      Manche mögens ärmer

      + +
      öha
      +was nun?
      +
      + +
      +
      Töne
      +
      Laute Geräusche
      +
      vielleicht noch was ähnliches
      +
      + + + + + + + + + + + + + + + + +
      hochhöheram höchsten
      überdrübermüde
      + +

      Das ist schön +gemacht

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/encoding.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/encoding.text new file mode 100644 index 0000000..65edf4b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/encoding.text @@ -0,0 +1,28 @@ +Das ist gewöhnlich *ein* [Über-Problem](http://example.org) mit manchen +Sälen und anderen Dinge. Siehe +![Über mich](http://example.org)! + +> Vielleicht *höre*{:.red} ich nicht richtig? +{:.test} + +* Sollten wir uns das überl*egen*? *Verhöhne* mich nicht! +* Ho ho höher! Sind \*wir\* da? + +Titel sind urschön +================== + +## Manche mögens *ärmer* {#hot} + + öha + was nun? + +Töne +: Laute Geräusche +: vielleicht noch was ä*hnliches* + +| hoch | höher | am höchsten | +|----------------------------| +| über | drüber | müde | + +

      Das ist schön +gemacht

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/example.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/example.man new file mode 100644 index 0000000..b1afee7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/example.man @@ -0,0 +1,123 @@ +.\" generated by kramdown +.TH "NAME" "1" "November 2016" "Some extra data" +.SH NAME +name \- description +.SH "SYNOPSIS" +\fBname\fP [\fBOPTIONS\fP] \fIarguments\fP\.\.\. +.SH "DESCRIPTION" +This is a normal paragraph\. +.sp +.PD 0 +.IP \(bu 4 +A +.IP \(bu 4 +compact +.IP \(bu 4 +list +.IP \(bu 4 +with multiple +.RS +.IP \(bu 4 +items and +.RS +.IP \(bu 4 +nested +.RE +.RE +.IP \(bu 4 +as well +.PD +.RS +.P +blockquotes are fine +.IP 1. 4 +numbered lists +.IP 2. 4 +work too +.RS +.IP 1. 4 +and they +.IP 2. 4 +can be +.RS +.IP 1. 4 +nested +.RE +.RE +.IP 3. 4 +again +.RE +.sp +.RS 4 +.EX +Some fancy code + going + on + here +.EE +.RE +.TP +\fB\-o\fP +.TQ +\fB\-\-option\fP +Description lists +.sp +are useful as well +.P +And compact definition lists: +.sp +.PD 0 +.TP +\fBo\fP +Option +.TP +\fBk\fP +Key +.TP +\fBv\fP +Value +.PD +.TS +box center ; +l l l l . +tables can be centered +.TE +.sp +.TS +box ; +lb lb cb rb . +Default aligned Left aligned Center aligned Right aligned += +.T& +l l c r . +First body part Second cell Third cell fourth cell +Second \fIline\fP foo \fBstrong\fP baz +Third line \fBquux\fP baz bar +_ +.T& +l l c r . +Second body +2nd line += +Footer row one +Footer row two +.TE +.sp +.P +Inline formatting like \fIemphasis\fP, \fBstrong\fP and \fBcode span\fP work as ususal\. +.UR are_well\.html +Links +.UE +work, too! As do +.br +line breaks\. +.P +Abbreviations like MD can be used but the abbreviation title is ignored\. +.P +Math elements work \fB\el = 5\fP inline and in block form: +.sp +.RS 4 +.EX +\elambda_5 = \ealpha + 4 +.EE +.RE diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/example.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/example.text new file mode 100644 index 0000000..12b011b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/example.text @@ -0,0 +1,85 @@ +# name(1) - description +{: data-date="November 2016" data-extra="Some extra data"} + +## SYNOPSIS + +`name` \[`OPTIONS`\] *arguments*... + +## DESCRIPTION + +This is a normal paragraph. + +* A +* compact +* list +* with multiple + * items and + * nested +* as well +{:.compact} + +> blockquotes are fine +> +> 1. numbered lists +> +> 2. work too +> 1. and they +> 2. can be +> 1. nested +> +> 3. again + +~~~ +Some fancy code + going + on + here +~~~ + +`-o` +`--option` +: Description lists +: are useful as well + +And compact definition lists: + +`o` +: Option + +`k` +: Key + +`v` +: Value +{:.compact} + +| tables | can | be | centered | +{:.center} + +|-----------------+------------+-----------------+----------------| +| Default aligned |Left aligned| Center aligned | Right aligned | +|-----------------|:-----------|:---------------:|---------------:| +| First body part |Second cell | Third cell | fourth cell | +| Second *line* |foo | **strong** | baz | +| Third line |`quux` | baz | bar | +|-----------------+------------+-----------------+----------------| +| Second body | | | | +| 2nd line | | | | +|=================+============+=================+================| +| Footer row one | | | | +| Footer row two | | | | +|-----------------+------------+-----------------+----------------| + + +Inline formatting like *emphasis*, **strong** and `code span` work +as ususal. [Links](are_well.html) work, too! As do\\ +line breaks. + +Abbreviations like MD can be used but the abbreviation title is +ignored. + +*[MD]: Markdown + +Math elements work $$\l = 5$$ inline and in block form: + +$$\lambda_5 = \alpha + 4$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-dash-description.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-dash-description.man new file mode 100644 index 0000000..8e47527 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-dash-description.man @@ -0,0 +1,4 @@ +.\" generated by kramdown +.TH "NAME" "7" +.SH NAME +name \- description diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-dash-description.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-dash-description.text new file mode 100644 index 0000000..832c921 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-dash-description.text @@ -0,0 +1 @@ +# name -- description diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-description.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-description.man new file mode 100644 index 0000000..e59dc5e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-description.man @@ -0,0 +1,4 @@ +.\" generated by kramdown +.TH "NAME" "1" "November 2016" "Something extra" +.SH NAME +name \- description diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-description.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-description.text new file mode 100644 index 0000000..941482c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-description.text @@ -0,0 +1,2 @@ +# name description +{: data-section="1" data-date="November 2016" data-extra="Something extra"} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section-description.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section-description.man new file mode 100644 index 0000000..8df4ff7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section-description.man @@ -0,0 +1,4 @@ +.\" generated by kramdown +.TH "NAME" "1" +.SH NAME +name \- description diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section-description.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section-description.text new file mode 100644 index 0000000..5f3e765 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section-description.text @@ -0,0 +1 @@ +# name(1) -- description diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section.man new file mode 100644 index 0000000..7ca8757 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section.man @@ -0,0 +1,2 @@ +.\" generated by kramdown +.TH "NAME" "1" diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section.text new file mode 100644 index 0000000..da98dbd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name-section.text @@ -0,0 +1 @@ +# name(1) diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name.man new file mode 100644 index 0000000..8488496 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name.man @@ -0,0 +1,2 @@ +.\" generated by kramdown +.TH "NAME" "7" diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name.text new file mode 100644 index 0000000..5f4656a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/heading-name.text @@ -0,0 +1 @@ +# name diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/sections.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/sections.man new file mode 100644 index 0000000..14ab233 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/sections.man @@ -0,0 +1,4 @@ +.\" generated by kramdown +.SH "NAME" +works +.SS "Sub section" diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/sections.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/sections.text new file mode 100644 index 0000000..d1f5f86 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/sections.text @@ -0,0 +1,11 @@ +## NAME + +works + +### Sub section + +#### Ignored + +##### Ignored + +###### Ignored diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/text-escaping.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/text-escaping.man new file mode 100644 index 0000000..710a4f1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/text-escaping.man @@ -0,0 +1,8 @@ +.\" generated by kramdown +\&\. at the start of the line +.P +line with \efB backslash symbol +.P +some \. other \- escaped \' symbols +.P +\&\. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/text-escaping.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/text-escaping.text new file mode 100644 index 0000000..052b94f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/man/text-escaping.text @@ -0,0 +1,7 @@ +. at the start of the line + +line with \fB backslash symbol + +some . other - escaped \' symbols + +. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty.html new file mode 100644 index 0000000..a1102ea --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty.html @@ -0,0 +1,5 @@ +

      This is [] empty.

      + +

      This is [][] empty.

      + +

      This is empty.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty.text new file mode 100644 index 0000000..cca5de5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty.text @@ -0,0 +1,5 @@ +This is [] empty. + +This is [][] empty. + +This is [](test.html) empty. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty_title.htmlinput b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty_title.htmlinput new file mode 100644 index 0000000..b95b2cc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty_title.htmlinput @@ -0,0 +1,3 @@ +

      Image with empty title: alt text

      + +

      Link reference with empty title.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty_title.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty_title.text new file mode 100644 index 0000000..baabe7d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/empty_title.text @@ -0,0 +1,7 @@ +Image with empty title: ![alt text](/images/other.png) + +Link [reference][1] with empty title. + + + +[1]: http://example.tld diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/image_in_a.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/image_in_a.html new file mode 100644 index 0000000..e1f4ade --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/image_in_a.html @@ -0,0 +1,5 @@ +

      Simple: Some alt text

      + +

      Nested: Some alt ![img](text.png) text

      + +

      Simple: Some text alt text text

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/image_in_a.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/image_in_a.text new file mode 100644 index 0000000..bdbfb65 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/image_in_a.text @@ -0,0 +1,5 @@ +Simple: [Some ![alt text](/images/other.png)](local.html) + +Nested: [Some ![alt ![img](text.png) text](/images/other.png)](local.html) + +Simple: [Some *text ![alt text](/images/other.png) text*](local.html) diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/imagelinks.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/imagelinks.html new file mode 100644 index 0000000..565d36f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/imagelinks.html @@ -0,0 +1,15 @@ +

      Simple: alt text

      + +

      Simple with title: alt text

      + +

      Empty img link: alt text

      + +

      Reference style: alt text

      + +

      Reference style with title: alt text

      + +

      No alt text:

      + +

      No id: imgo

      + +

      With escaped pipe: an | pipe

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/imagelinks.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/imagelinks.text new file mode 100644 index 0000000..05050a2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/imagelinks.text @@ -0,0 +1,18 @@ +Simple: ![alt text](/images/other.png) + +Simple with title: ![alt text](/images/other.png "title") + +Empty img link: ![alt text]() + +Reference style: ![alt text][img] + +Reference style with title: ![alt text][imgo] + +No alt text: ![](other.png) + +No id: ![imgo] + +[img]: other.png +[imgo]: other.png "Title" + +With escaped pipe: ![an \| pipe](other.png) diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.html new file mode 100644 index 0000000..0810bc7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.html @@ -0,0 +1,46 @@ +

      simple URL

      + +

      simple URL

      + +

      simple URL with formatting

      + +

      simple URL with single quoted title

      + +

      simple URL with double quoted title

      + +

      simple URL [with ] escaped

      + +

      simple URL with ] escaped

      + +

      simple URL [with] nested

      + +

      simple URL with [no](link.html) inside

      + +

      simple URL with parens

      + +

      simple URL with parens

      + +

      simple URL broken +on line

      + +

      simple URL with spaces

      + +

      simple URL with spaces

      + +

      simple URL with spaces

      + +

      simple leading/trailing spaces

      + +

      simple leading/trailing spaces

      + +

      simple leading/trailing spaces

      + +

      bad [URL not

      + +

      bad [URL with parens](something(new.html)

      + +

      bad [URL with empty title](something.html ‘’)

      + +

      bad [URL](

      + +

      bad [URL](no

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.html.19 new file mode 100644 index 0000000..8d00efa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.html.19 @@ -0,0 +1,46 @@ +

      simple URL

      + +

      simple URL

      + +

      simple URL with formatting

      + +

      simple URL with single quoted title

      + +

      simple URL with double quoted title

      + +

      simple URL [with ] escaped

      + +

      simple URL with ] escaped

      + +

      simple URL [with] nested

      + +

      simple URL with [no](link.html) inside

      + +

      simple URL with parens

      + +

      simple URL with parens

      + +

      simple URL broken +on line

      + +

      simple URL with spaces

      + +

      simple URL with spaces

      + +

      simple URL with spaces

      + +

      simple leading/trailing spaces

      + +

      simple leading/trailing spaces

      + +

      simple leading/trailing spaces

      + +

      bad [URL not

      + +

      bad [URL with parens](something(new.html)

      + +

      bad [URL with empty title](something.html ‘’)

      + +

      bad [URL](

      + +

      bad [URL](no

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.text new file mode 100644 index 0000000..c705764 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/inline.text @@ -0,0 +1,48 @@ +simple [URL]() + +simple [URL](something.html) + +simple [URL *with* formatting](something.html) + +simple [URL with single quoted title](something.html 'a t"itle') + +simple [URL with double quoted title](something.html "a t'itle") + +simple [URL \[with \] escaped](something.html) + +simple [URL with \] escaped](something.html) + +simple [URL [with] nested](something.html) + +simple [URL with [no](link.html) inside](something.html) + +simple [URL with parens](/something/to(do)) + +simple [URL with parens](/something/to(do "doit") + +simple [URL broken +on line](something.html +"title") + +simple [URL with spaces](with spaces.html) + +simple [URL with spaces](with spaces.html 'title') + +simple [URL with spaces](with (spaces).html) + +simple [leading/trailing spaces]( spaces.html) + +simple [leading/trailing spaces](spaces.html ) + +simple [leading/trailing spaces]( spaces.html ) + + +bad [URL [not](something.html) + +bad [URL with parens](something(new.html) + +bad [URL with empty title](something.html '') + +bad [URL]( + +bad [URL](no diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/latex_escaping.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/latex_escaping.latex new file mode 100644 index 0000000..63e58e7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/latex_escaping.latex @@ -0,0 +1,6 @@ +\href{https://example.com/~tilde/}{https://example.com/\ensuremath{\sim}tilde/} + +\href{http://example.com/percent\%20percent}{http://example.com/percent\%20percent} + +\href{http://example.com/hash#hash}{http://example.com/hash\#hash} + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/latex_escaping.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/latex_escaping.text new file mode 100644 index 0000000..9b27ae8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/latex_escaping.text @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs.html new file mode 100644 index 0000000..15e2ca7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs.html @@ -0,0 +1,9 @@ +

      This is a para. +[id]: http://www.example.com/

      + +
      [4]: nourl
      +
      + +

      Points to 1 and 2 and 3 but not [4]

      + +

      Points to _.:,;!?- and otherid8

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs.text new file mode 100644 index 0000000..16a25b5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs.text @@ -0,0 +1,27 @@ +This is a para. +[id]: http://www.example.com/ + +[otherid1]: http://wwww.example.com/ "title 1" +[otherid2]: http://wwww.example.com/ 'title 2' +[otherid3]: +[otherid4]: 'title' +[otherid5]: some spaces.html +[otherid6]: some spaces.html 'title' +[otherid7]: some spaces + "title" +[otherid8]:test.html#'test' 'title' + +[break]: http://www.example.com/test/asdf.html + 'Another title' + +[1]: ignored.url + [1]: one.url + [2]: two.url + [3]: three.url + [4]: nourl + +Points to [1] and [2] and [3] but not [4] + +[_.:,;!?-]: http://example.com + +Points to [_.:,;!?-] and [otherid8] diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs_with_ial.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs_with_ial.html new file mode 100644 index 0000000..f56d77d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs_with_ial.html @@ -0,0 +1,4 @@ +

      Link def with attr and attr 2 and attr 3 and attr before

      + +

      test

      + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs_with_ial.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs_with_ial.text new file mode 100644 index 0000000..59398a3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/link_defs_with_ial.text @@ -0,0 +1,16 @@ +Link def with [attr] and [attr 2] and [attr 3] and [attr before] + +[attr]: http://example.com 'title' +{: hreflang="en" .test} + +[attr 2]: http://example.com 'title' +{: hreflang="en"} +{: .test} + +[attr 3]: http://example.com +{: .test} +test + +{: hreflang="en"} +{: .test} +[attr before]: http://example.com diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/links_with_angle_brackets.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/links_with_angle_brackets.html new file mode 100644 index 0000000..ecaa31e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/links_with_angle_brackets.html @@ -0,0 +1,3 @@ +

      This is a link.

      + +

      This is a link.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/links_with_angle_brackets.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/links_with_angle_brackets.text new file mode 100644 index 0000000..2cf0ece --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/links_with_angle_brackets.text @@ -0,0 +1,3 @@ +This is a [link](). + +This is a [link]( 'and title'). diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.html new file mode 100644 index 0000000..49afd2e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.html @@ -0,0 +1,37 @@ + +

      simple URL and URL

      + +

      simple URL and URL

      + +

      simple 1 and isurl

      + +

      simple 1 and isurl

      + +

      this is [a holy isurl]

      + +

      no [resolution][] here and [here]

      + +

      with a break in +the text

      + +

      this not [isurl] and not [isurl]

      + +

      a Link with_BIG letters

      + +

      bad [no URL] d isurl

      + +

      [no url] invalid.html +[no url]:

      + +

      “title”

      + +

      test url but no title +test [urldef]

      + +

      [urldef]: some.url ‘title”

      + +

      some with spaces

      + +

      this is a ‘special’ occasion for /all/ of us

      + +

      this is predefined for URI

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.html.19 new file mode 100644 index 0000000..f6fed18 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.html.19 @@ -0,0 +1,37 @@ + +

      simple URL and URL

      + +

      simple URL and URL

      + +

      simple 1 and isurl

      + +

      simple 1 and isurl

      + +

      this is [a holy isurl]

      + +

      no [resolution][] here and [here]

      + +

      with a break in +the text

      + +

      this not [isurl] and not [isurl]

      + +

      a Link with_BIG letters

      + +

      bad [no URL] d isurl

      + +

      [no url] invalid.html +[no url]:

      + +

      “titleâ€

      + +

      test url but no title +test [urldef]

      + +

      [urldef]: some.url ‘titleâ€

      + +

      some with spaces

      + +

      this is a ‘special’ occasion for /all/ of us

      + +

      this is predefined for URI

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.options new file mode 100644 index 0000000..efb4b01 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.options @@ -0,0 +1,3 @@ +:link_defs: + predefined: [predefined.html] + URI: [uri.html, My URI] diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.text new file mode 100644 index 0000000..9f39fa7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/01_link/reference.text @@ -0,0 +1,53 @@ +[isurl]: someurl.html + [1]: otherurl.html + +simple [URL][1] and [URL][isurl] + +simple [URL] [1] and [URL] +[isurl] + +simple [1][] and [isurl][] + +simple [1] and [isurl] + +this is [a holy [isurl]] + +no [resolution][] here and [here] + +with a [break in +the text] + + [break in the text]: url.html + +this not \[isurl] and not [isurl\] + +a [Link with_BIG] letters + + [link WITH_big]: letters.html + 'This is the title' + +bad [no URL] d [isurl] + +[no url] invalid.html +[no url]: + +[URL but no title]: invalid.html + + "title" + +test [url but no title] +test [urldef] + +[urldef]: some.url 'title" + + +some [with spaces] + +[with spaces]: with spaces.html "title" + +this [is a 'special' occasion for /all/ of us] + +[is a 'special' occasion for /all/ of us]: occasion.html + + +this is [predefined] for [URI] diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/empty.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/empty.html new file mode 100644 index 0000000..127e694 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/empty.html @@ -0,0 +1,3 @@ +

      This __is **empty.

      + +

      This **is empty.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/empty.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/empty.text new file mode 100644 index 0000000..c99d053 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/empty.text @@ -0,0 +1,3 @@ +This __is **empty. + +This ****is empty. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/errors.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/errors.html new file mode 100644 index 0000000..e62f03f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/errors.html @@ -0,0 +1,9 @@ +

      This is a *star.

      + +

      This is a **star.

      + +

      This is *a *star.

      + +

      This is *a star*.

      + +

      This** is** a star.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/errors.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/errors.text new file mode 100644 index 0000000..e80e5eb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/errors.text @@ -0,0 +1,9 @@ +This is a *star. + +This is a **star. + +This is **a *star*. + +This is *a star\*. + +This** is** a star. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/nesting.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/nesting.html new file mode 100644 index 0000000..3d34cee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/nesting.html @@ -0,0 +1,41 @@ +
        +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      • test test
      • +
      +
        +
      • ab
      • +
      • ab
      • +
      • abc
      • +
      • ab
      • +
      • ab
      • +
      • abc
      • +
      +
        +
      • _a_b
      • +
      • a_b_
      • +
      • a_b_c
      • +
      • __a__b
      • +
      • a__b__
      • +
      • a__b__c
      • +
      • a__2__c
      • +
      • a__2__3
      • +
      • 1__2__3
      • +
      +
        +
      • a _b_ c
      • +
      • a __b__ c
      • +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/nesting.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/nesting.text new file mode 100644 index 0000000..ba67e84 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/nesting.text @@ -0,0 +1,36 @@ +- ***test test*** +- ___test test___ +- *test **test*** +- **test *test*** +- ***test* test** +- ***test** test* +- ***test* test** +- **test *test*** +- *test **test*** +- _test __test___ +- __test _test___ +- ___test_ test__ +- ___test__ test_ +- ___test_ test__ +- __test _test___ +- _test __test___ +^ +- *a*b +- a*b* +- a*b*c +- **a**b +- a**b** +- a**b**c +^ +- _a_b +- a_b_ +- a_b_c +- __a__b +- a__b__ +- a__b__c +- a__2__c +- a__2__3 +- 1__2__3 +^ +- *a _b_ c* +- **a __b__ c** diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.html new file mode 100644 index 0000000..ca53cfe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.html @@ -0,0 +1,61 @@ +

      This is so hard.

      + +

      This is so hard too.

      + +

      At start +At start

      + +

      At end +At end

      + +

      At start +At start

      + +

      At end +At end

      + +

      And nested.

      + +

      And nest**ed.

      + +

      And *nested* like this.

      + +

      And not_nest_ed.

      + +

      And nested.

      + +

      And nested.

      + +

      And neste.

      + +

      And lonely * here*.

      + +

      And lonely ** here**.

      + +

      And lonely ** here.

      + +

      ** and here**.

      + +

      And compli*cated * here

      + +

      Some**what more * **here

      + +

      Do it *this* way +Or this *this* way +Or that *that* way +Or that *that* way

      + +

      http://blah.com/blah_%28

      + +

      A-_B

      + +
        +
      • test
      • +
      • test
      • +
      • test
      • +
      • (“test”)
      • +
      • (test)
      • +
      • “testâ€
      • +
      • `test
      • +
      • „test“
      • +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.options new file mode 100644 index 0000000..2e6e0a1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.options @@ -0,0 +1 @@ +:entity_output: :numeric diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.text new file mode 100644 index 0000000..ab30913 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/02_emphasis/normal.text @@ -0,0 +1,59 @@ +This *is* so **hard**. + +This _is_ so __hard__ too. + +*At* start +*At* start + +At *end* +At *end* + +_At_ start +_At_ start + +At _end_ +At _end_ + +And *nest**ed***. + +And *nest**ed*. + +And *nest**ed* like** this. + +And *not_nest_ed*. + +And ***nested***. + +And ___nested___. + +And **nest*e***. + +And lonely * here*. + +And lonely ** here**. + +And **lonely ** here**. + +** and here**. + +And **compli*cated \*** here + +Some***what* more * ***he*re + +Do it *\*this\** way +Or this \**this*\* way +Or that *\*that*\* way +Or that \**that\** way + +[http://blah.com/blah_%28](http://blah.com/blah_%28) + +[A-_B](A_-B) + +- _test_ +- '_test_' +- "_test_" +- ("_test_") +- (_test_) +- “_test_†+- \`_test_' +- „_test_“ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/empty.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/empty.html new file mode 100644 index 0000000..20c5051 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/empty.html @@ -0,0 +1,5 @@ +

      This is `` empty.

      + +

      This is ``empty.

      + +

      This is ````empty.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/empty.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/empty.text new file mode 100644 index 0000000..cbb9152 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/empty.text @@ -0,0 +1,5 @@ +This is `` empty. + +This is ``empty. + +This is ````empty. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/errors.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/errors.html new file mode 100644 index 0000000..1d341a8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/errors.html @@ -0,0 +1 @@ +

      Not ended `span.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/errors.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/errors.text new file mode 100644 index 0000000..7a948b4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/errors.text @@ -0,0 +1 @@ +Not ended `span. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.latex new file mode 100644 index 0000000..a1f84d9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.latex @@ -0,0 +1,2 @@ +You can say \mintinline{ruby}{x = Class.new}, for example. + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.options new file mode 100644 index 0000000..c11ebb6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.options @@ -0,0 +1 @@ +:syntax_highlighter: minted diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.text new file mode 100644 index 0000000..7373290 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting-minted.text @@ -0,0 +1 @@ +You can say `x = Class.new`{:.language-ruby}, for example. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting.html new file mode 100644 index 0000000..c6860f6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting.html @@ -0,0 +1 @@ +

      You can say x = Class.new, for example.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting.text new file mode 100644 index 0000000..7373290 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/highlighting.text @@ -0,0 +1 @@ +You can say `x = Class.new`{:.language-ruby}, for example. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/normal.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/normal.html new file mode 100644 index 0000000..68eddbe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/normal.html @@ -0,0 +1,16 @@ +

      This is a simple span.

      + +

      With some<ht>&ml in it.

      + +

      And ` backticks.

      + +

      And ``some`` more.

      + +

      With backslash in\ it.

      + +

      This is a ` literal backtick. +As `are` these!

      + +

      No literal backtick.

      + +

      something

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/normal.text new file mode 100644 index 0000000..10d06e2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/normal.text @@ -0,0 +1,16 @@ +This is `a` simple span. + +With `some&ml` in it. + +And `` ` `` backticks. + +And ``` ``some`` ``` more. + +With backslash `in\` it. + +This is a ` literal backtick. +As \`are\` these! + +No `` literal backtick``. + +`something` diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.html new file mode 100644 index 0000000..7822f78 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.html @@ -0,0 +1 @@ +

      You can say Class.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.options new file mode 100644 index 0000000..34094e9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.options @@ -0,0 +1,4 @@ +:syntax_highlighter: rouge +:syntax_highlighter_opts: + span: + disable: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.text new file mode 100644 index 0000000..d958d91 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/disabled.text @@ -0,0 +1 @@ +You can say `Class`{:.language-ruby}. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.html new file mode 100644 index 0000000..4294542 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.html @@ -0,0 +1 @@ +

      You can say x = Class.new, for example.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.options new file mode 100644 index 0000000..9ac61e7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.options @@ -0,0 +1 @@ +:syntax_highlighter: rouge diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.text new file mode 100644 index 0000000..7373290 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/03_codespan/rouge/simple.text @@ -0,0 +1 @@ +You can say `x = Class.new`{:.language-ruby}, for example. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.html new file mode 100644 index 0000000..b983b5a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.html @@ -0,0 +1,79 @@ +

      This is 123456789

      + +
      +
        +
      1. + +

        A paragraph 

        +
      2. +
      3. + +

        A header 

        +
      4. +
      5. + +
        +

        blockquote

        + +

        paragraph 

        +
        +
      6. +
      7. + +
        codeblock
        +
        +

        +
      8. +
      9. + +
          +
        • item 1
        • +
        • item 2 +
            +
          • +

            sub item

            + +
            +

            blockquote

            + +

            header 

            +
            +
          • +
          +
        • +
        +
      10. +
      11. + + + + + + + + + + + + +
        ab
        cd
        +

        +
      12. +
      13. + +
        +

        +
      14. +
      15. + + +

        +
      16. +
      17. + +
        test +
        +

        +
      18. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.options new file mode 100644 index 0000000..ac54fc0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.options @@ -0,0 +1 @@ +footnote_backlink_inline: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.text new file mode 100644 index 0000000..55f94a3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_inline.text @@ -0,0 +1,38 @@ +This is [^paragraph][^header][^blockquote][^codeblock][^list][^table][^hrule][^mathblock][^html] + +[^paragraph]: + A paragraph + +[^header]: + # A header + +[^blockquote]: + > blockquote + > + > paragraph + +[^codeblock]: + codeblock + +[^list]: + * item 1 + * item 2 + * sub item + + > blockquote + > + > # header + +[^table]: + | a | b | + | c | d | + +[^hrule]: + *** + +[^mathblock]: + $$x + 2$$ + +[^html]: +
      test +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.html new file mode 100644 index 0000000..dc66dc8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.html @@ -0,0 +1,9 @@ +

      Some footnote here1

      + +
      +
        +
      1. +

        Some text here text &8617; <img />

        +
      2. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.options new file mode 100644 index 0000000..4c677ef --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.options @@ -0,0 +1 @@ +:footnote_backlink: 'text &8617; ' diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.text new file mode 100644 index 0000000..41a6f98 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/backlink_text.text @@ -0,0 +1,3 @@ +Some footnote here[^fn] + +[^fn]: Some text here diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.html new file mode 100644 index 0000000..9012cc0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.html @@ -0,0 +1,17 @@ +

      Some para.

      + +
      +

      blockquote

      +
      + +
        +
      • a list +with some text
      • +
      + +
        +
      • other list
      • +
      +
      code
      +
      + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.latex new file mode 100644 index 0000000..965653c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.latex @@ -0,0 +1,17 @@ +Some para. + +\begin{quote} +blockquote +\end{quote} + +\begin{itemize} +\item{} a list +with some text +\end{itemize} + +\begin{itemize} +\item{} other list +\end{itemize} +\begin{verbatim}code +\end{verbatim} + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.text new file mode 100644 index 0000000..44b52e0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/definitions.text @@ -0,0 +1,24 @@ +Some para. + +[^footnote]: ignored definition +[^footnote]: Some footnote text + +> blockquote + +[^other]: some + foot + + note text + +* a list + with some text + +[^tnote]: foot note + +* other list +^ + code + +[^1]: + > a blockquote + and some para diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.html new file mode 100644 index 0000000..bbd8eac --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.html @@ -0,0 +1,12 @@ +

      This is a footnote35. And another36.

      + +
      +
        +
      1. +

        Some text. 

        +
      2. +
      3. +

        Some other text. 

        +
      4. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.latex new file mode 100644 index 0000000..8f07dde --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.latex @@ -0,0 +1,2 @@ +This is a footnote\footnote{Some text.}. And another\footnote{Some other text.}. + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.options new file mode 100644 index 0000000..f606ecf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.options @@ -0,0 +1 @@ +:footnote_nr: 35 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.text new file mode 100644 index 0000000..cad2935 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/footnote_nr.text @@ -0,0 +1,4 @@ +This is a footnote[^ab]. And another[^bc]. + +[^ab]: Some text. +[^bc]: Some other text. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/inside_footnote.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/inside_footnote.html new file mode 100644 index 0000000..26ce52e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/inside_footnote.html @@ -0,0 +1,17 @@ +

      Lorem ipsum1 dolor sit amet.

      + +

      Lorem ipsum2 dolor sit amet.

      + +
      +
        +
      1. +

        Consecutur adisping.3 

        +
      2. +
      3. +

        Sed ut perspiciatis unde omnis. 

        +
      4. +
      5. +

        Sed ut. 

        +
      6. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/inside_footnote.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/inside_footnote.text new file mode 100644 index 0000000..f4f91e9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/inside_footnote.text @@ -0,0 +1,9 @@ +Lorem ipsum[^first] dolor sit amet. + +Lorem ipsum[^second] dolor sit amet. + +[^first]: Consecutur adisping.[^third] + +[^second]: Sed ut perspiciatis unde omnis. + +[^third]: Sed ut. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.html new file mode 100644 index 0000000..d4c45d7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.html @@ -0,0 +1,46 @@ +

      This is some *ref.1

      + +
      +

      a blockquote 2

      +
      + +
        +
      • and a list item 3
      • +
      + +

      And a header4

      + +

      A marker without a definition [^without].

      + +

      A marker 5 used twice1 and thrice1.

      + +
      +
        +
      1. +

        Some foot note text  2 3

        +
      2. +
      3. +

        other text +with more lines

        + +
        +

        and a quote

        +
        +

        +
      4. +
      5. +

        some text 

        +
      6. +
      7. + +
        code block
        +continued here
        +
        +

        +
      8. +
      9. + +

        +
      10. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.latex new file mode 100644 index 0000000..8f406b8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.latex @@ -0,0 +1,23 @@ +This is some *ref.\footnote{Some foot note text} + +\begin{quote} +a blockquote \footnote{other text +with more lines + +\begin{quote} +and a quote +\end{quote}} +\end{quote} + +\begin{itemize} +\item{} and a list item \footnote{some \emph{text}} +\end{itemize} + +\section*{And a header\footnote{\begin{verbatim}code block +continued here +\end{verbatim}}} + +A marker without a definition {[}\^{}without{]}. + +A marker \footnote{} used twice\footnote{Some foot note text} and thrice\footnote{Some foot note text}. + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.options new file mode 100644 index 0000000..5cfe250 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.options @@ -0,0 +1,2 @@ +:auto_ids: false +:entity_output: :symbolic diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.text new file mode 100644 index 0000000..42b77fb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/markers.text @@ -0,0 +1,27 @@ +This is some *ref.[^fn] + +[^fn]: Some foot note text +{: .class} + +> a blockquote [^3] + +* and a list item [^1] + +# And a header[^now] + +[^1]:some *text* +[^3]: other text + with more lines + + > and a quote + +A marker without a definition [^without]. + +A marker [^empty] used twice[^fn] and thrice[^fn]. + +[^now]: + + code block + continued here + +[^empty]: diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.html new file mode 100644 index 0000000..997ef26 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.html @@ -0,0 +1,11 @@ +
      +
        +
      1. +

        Footnote \` text 

        +
      2. +
      +
      + +

      Some para with a1 footnote.

      + +

      And another para.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.options new file mode 100644 index 0000000..2e6e0a1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.options @@ -0,0 +1 @@ +:entity_output: :numeric diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.text new file mode 100644 index 0000000..97c0ab1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/placement.text @@ -0,0 +1,8 @@ +* footnotes will be placed here +{:footnotes} + +Some para with a[^1] footnote. + +[^1]: Footnote \\\` text + +And another para. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.html new file mode 100644 index 0000000..d246a37 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.html @@ -0,0 +1,14 @@ +

      Something

      +

      something1.

      + +

      Footnotes

      + +

      Test

      +
      +
        +
      1. + +

        A note 

        +
      2. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.options new file mode 100644 index 0000000..5cfe250 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.options @@ -0,0 +1,2 @@ +:auto_ids: false +:entity_output: :symbolic diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.text new file mode 100644 index 0000000..6a60c61 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/regexp_problem.text @@ -0,0 +1,52 @@ +# Something +something[^note1]. + +# Footnotes +[^note1]: + A note + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Test diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.html new file mode 100644 index 0000000..df5e917 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.html @@ -0,0 +1,9 @@ +

      Some footnote here1

      + +
      +
        +
      1. +

        Some text here

        +
      2. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.options new file mode 100644 index 0000000..0512dd6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.options @@ -0,0 +1 @@ +:footnote_backlink: '' diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.text new file mode 100644 index 0000000..41a6f98 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/04_footnote/without_backlink.text @@ -0,0 +1,3 @@ +Some footnote here[^fn] + +[^fn]: Some text here diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/across_lines.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/across_lines.html new file mode 100644 index 0000000..e7cec40 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/across_lines.html @@ -0,0 +1 @@ +

      Link: test

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/across_lines.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/across_lines.text new file mode 100644 index 0000000..8f39d95 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/across_lines.text @@ -0,0 +1,2 @@ +Link: test diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/button.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/button.html new file mode 100644 index 0000000..c49bb52 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/button.html @@ -0,0 +1,7 @@ +

      + +

      First some text and then a

      + +

      and then text.

      + +

      A it.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/button.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/button.text new file mode 100644 index 0000000..e0a7783 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/button.text @@ -0,0 +1,7 @@ + + +First some text and then a + + and then text. + +A it. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/invalid.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/invalid.html new file mode 100644 index 0000000..030552f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/invalid.html @@ -0,0 +1 @@ +

      This is some text

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/invalid.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/invalid.text new file mode 100644 index 0000000..383f0a8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/invalid.text @@ -0,0 +1 @@ +This is some text diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/link_with_mailto.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/link_with_mailto.html new file mode 100644 index 0000000..7d0d6ad --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/link_with_mailto.html @@ -0,0 +1 @@ +

      Link: text

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/link_with_mailto.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/link_with_mailto.text new file mode 100644 index 0000000..fb01619 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/link_with_mailto.text @@ -0,0 +1 @@ +Link: text diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/mark_element.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/mark_element.html new file mode 100644 index 0000000..b6989b7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/mark_element.html @@ -0,0 +1,3 @@ +

      Lorem ipsum.

      + +

      Test

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/mark_element.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/mark_element.text new file mode 100644 index 0000000..6ae30e0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/mark_element.text @@ -0,0 +1,3 @@ +Lorem ipsum. + +Test diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/markdown_attr.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/markdown_attr.html new file mode 100644 index 0000000..44158c3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/markdown_attr.html @@ -0,0 +1,6 @@ +

      This is text +This is *text* +This is text +This is text +This is *nothing* to fear about. +This is <http://example.com>.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/markdown_attr.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/markdown_attr.text new file mode 100644 index 0000000..dcc10ff --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/markdown_attr.text @@ -0,0 +1,6 @@ +This is *text* +This is *text* +This is *text* +This is *text* +This is *nothing* to *fear* about. +This is . diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/normal.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/normal.html new file mode 100644 index 0000000..0da5f26 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/normal.html @@ -0,0 +1,43 @@ +

      Empty !

      + +

      title is a title.

      + +

      This is .

      + +

      This is comment.

      + +

      This is multiline comment.

      + +

      This is tag +now .

      + +

      This is tag + now.

      + +

      This is an empty tag.

      + +

      This is something strange.

      + +

      Auto-closing:

      + +

      Expanding:

      + +

      An invalid tag: <hR>

      + +

      A <p>block tag</p>.

      + +

      An invalid </closing> tag.

      + +

      A tag.

      + +

      An unclosed tag.

      + +

      Some element with | pipe symbol

      + +

      Some element with | pipe symbol

      + +

      Some element with | pipe +symbol|

      + +

      underlined

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/normal.text new file mode 100644 index 0000000..0156d7c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/normal.text @@ -0,0 +1,43 @@ +Empty ! + +title is a title. + +This is . + +This is comment. + +This is multiline comment. + +This is tag +now . + +This is tag + now. + +This is an empty tag. + +This is _something strange_. + +Auto-closing:
      + +Expanding: + +An invalid tag:
      + +A

      block tag

      . + +An invalid tag. + +A tag. + +An unclosed *tag.* + +Some element with | pipe symbol + +Some element with | pipe symbol + +Some element with | pipe +symbol| + +underlined diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/raw_span_elements.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/raw_span_elements.html new file mode 100644 index 0000000..808f1db --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/raw_span_elements.html @@ -0,0 +1,2 @@ +

      This is raw --version and --version and --version and +---version.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/raw_span_elements.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/raw_span_elements.text new file mode 100644 index 0000000..5b128fc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/raw_span_elements.text @@ -0,0 +1,2 @@ +This is raw --version and --version and --version and +---version. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/xml.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/xml.html new file mode 100644 index 0000000..00b43c1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/xml.html @@ -0,0 +1,5 @@ +

      This doit test

      + +

      This doit test

      + +

      This doit</some> test

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/xml.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/xml.text new file mode 100644 index 0000000..bc234de --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/05_html/xml.text @@ -0,0 +1,5 @@ +This doit test + +This doit test + +This doit test diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev.html new file mode 100644 index 0000000..f247c53 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev.html @@ -0,0 +1,21 @@ +

      This is some text.

      + +

      There is some real concern about OtHeR!

      + +

      is some Think empty about Oesterreich. CSS und CSS3

      + +

      no abbrev here because there is someone and kulis some

      + +
        +
      • (X)HTML test
      • +
      • line two
      • +
      + +

      (X)HTML

      + +
        +
      • test (X)HTML
      • +
      + +

      This is awesome.

      + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev.text new file mode 100644 index 0000000..1aa8100 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev.text @@ -0,0 +1,34 @@ +This is some text. + +*[is some]: Yes it is +*[OtHeR!]: This & that + +*[is some]: It is, yes +*[empty]: + +There *is some real* concern about OtHeR! + +is some Think empty about Oesterreich. CSS und CSS3 + +no abbrev here because there is someone and kulis some + +*[Oesterreich]: Very nice country + +*[CSS]: Cascading +*[CSS3]: Cascading 3 + +* (X)HTML test +* line two + +[(X)HTML](http://en.wikipedia.org/wiki/Xhtml) + +* test (X)HTML + +*[(X)HTML]: (eXtensible) HyperText Markup Language + + +This is awesome. + +{:.testit} +*[awesome]: Some text here +{:.test} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev_defs.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev_defs.html new file mode 100644 index 0000000..108fcfc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev_defs.html @@ -0,0 +1,2 @@ +
      *[4]: noabbrev
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev_defs.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev_defs.text new file mode 100644 index 0000000..3f3a0e5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/abbrev_defs.text @@ -0,0 +1,5 @@ +*[ABBR]: Some abbreviations + *[one abbr]: one abbrev + *[2 and other]: another + *[3]: yet another + *[4]: noabbrev diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/in_footnote.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/in_footnote.html new file mode 100644 index 0000000..f4f6ea4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/in_footnote.html @@ -0,0 +1,9 @@ +

      There is a TXT file here. 1

      + +
      +
        +
      1. +

        A TXT file. 

        +
      2. +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/in_footnote.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/in_footnote.text new file mode 100644 index 0000000..e7709cb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/abbreviations/in_footnote.text @@ -0,0 +1,5 @@ +There is a TXT file here. [^1] + +*[TXT]: Text File + +[^1]: A TXT file. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/autolinks/url_links.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/autolinks/url_links.html new file mode 100644 index 0000000..90eae7d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/autolinks/url_links.html @@ -0,0 +1,15 @@ +

      This should be a http://www.example.com/ link. +This should be a john.doe@example.com link. +As should john.doe@example.com this. +As should john_doe@example.com this. +As should CSS@example.com this. +Another ampersand http://www.example.com/?doit&x=y link. +More entities http://www.example.com/?doit&x="y&z=y.

      + +

      Email international übung@macht.den.meister.de, ü.äß@hülse.de +Email invalid: <me@example.com>

      + +

      Autolink with underscore: http://www.example.com/with_under_score

      + +

      http://www.example.com/

      + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/autolinks/url_links.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/autolinks/url_links.text new file mode 100644 index 0000000..033e8af --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/autolinks/url_links.text @@ -0,0 +1,16 @@ +This should be a link. +This should be a link. +As should this. +As should this. +As should this. +Another ampersand link. +More entities . + +Email international <übung@macht.den.meister.de>, <ü.äß@hülse.de> +Email invalid: <[me@example.com](mailtos:me@example.com)> + +Autolink with underscore: + + + +*[CSS]: Cascading diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/escaped_chars/normal.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/escaped_chars/normal.html new file mode 100644 index 0000000..015d594 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/escaped_chars/normal.html @@ -0,0 +1,47 @@ +

      \

      + +

      .

      + +

      *

      + +

      _

      + +

      +

      + +

      -

      + +

      `

      + +

      (

      + +

      )

      + +

      [

      + +

      ]

      + +

      {

      + +

      }

      + +

      #

      + +

      !

      + +

      <<

      + +

      >>

      + +

      :

      + +

      |

      + +

      "

      + +

      '

      + +

      =

      + +

      >

      + +

      <

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/escaped_chars/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/escaped_chars/normal.text new file mode 100644 index 0000000..1c47104 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/escaped_chars/normal.text @@ -0,0 +1,47 @@ +\\ + +\. + +\* + +\_ + +\+ + +\- + +\` + +\( + +\) + +\[ + +\] + +\{ + +\} + +\# + +\! + +\<< + +\>> + +\: + +\| + +\" + +\' + +\= + +\> + +\< diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/comment.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/comment.html new file mode 100644 index 0000000..3544d49 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/comment.html @@ -0,0 +1,6 @@ +

      This is a paragraph. +This is a paragraph. +This is a . +This is a paragraph. +This is a {:/comment} simple {:/} paragraph. +This is a {::comment} paragraph.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/comment.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/comment.text new file mode 100644 index 0000000..8b9e8d3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/comment.text @@ -0,0 +1,6 @@ +This is a {::comment}simple{:/} paragraph. +This is a {::comment}simple{:/comment} paragraph. +This is a {::comment}simple {:/other} paragraph{:/comment}. +This is a {::comment/} paragraph. +This is a {:/comment} simple {:/} paragraph. +This is a {::comment} paragraph. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/ignored.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/ignored.html new file mode 100644 index 0000000..63c2c40 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/ignored.html @@ -0,0 +1 @@ +

      This is {::something}paragraph{:/}

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/ignored.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/ignored.text new file mode 100644 index 0000000..a7e7737 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/ignored.text @@ -0,0 +1 @@ +This is {::something}paragraph{:/} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/nomarkdown.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/nomarkdown.html new file mode 100644 index 0000000..83de931 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/nomarkdown.html @@ -0,0 +1 @@ +

      This is *some* text.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/nomarkdown.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/nomarkdown.text new file mode 100644 index 0000000..57c4b38 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/nomarkdown.text @@ -0,0 +1 @@ +This is {::nomarkdown}*some*{:/} text. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/options.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/options.html new file mode 100644 index 0000000..48e3076 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/options.html @@ -0,0 +1 @@ +

      This is an option *true*!

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/options.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/options.text new file mode 100644 index 0000000..e289491 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/extension/options.text @@ -0,0 +1 @@ +This is an {::options parse_span_html="false" /} option *true*! diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/ial/simple.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/ial/simple.html new file mode 100644 index 0000000..c0f3a47 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/ial/simple.html @@ -0,0 +1,6 @@ +

      This is a span.

      + +

      This is a span.

      + +

      This is an{: .ignored} span ial. +This is an{: .escaped} span ial.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/ial/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/ial/simple.text new file mode 100644 index 0000000..8945602 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/ial/simple.text @@ -0,0 +1,6 @@ +This is a `span`{: .hund #dog}. + +This is a `span`{: .hund #dog}{: .katz key='val'}. + +This is an{: .ignored} span ial. +This is an\{: .escaped} span ial. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.html new file mode 100644 index 0000000..11066a5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.html @@ -0,0 +1,11 @@ +

      This is a line
      +with a line break.

      + +

      This is a line +without a line break.

      + +

      This is a line
      +with a line\
      +break.

      + +

      Line break on last line.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.latex new file mode 100644 index 0000000..a62ff56 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.latex @@ -0,0 +1,12 @@ +This is a line\newline +with a line break. + +This is a line +without a line break. + +This is a line \newline +with a line\textbackslash{} \newline +break. + +Line break on last line. + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.text new file mode 100644 index 0000000..92f866f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/line_breaks/normal.text @@ -0,0 +1,11 @@ +This is a line +with a line break. + +This is a line +without a line break. + +This is a line \\ +with a line\\ +break. + +Line break on last line. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.html new file mode 100644 index 0000000..4e195d1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.html @@ -0,0 +1 @@ +

      This is f(x)=ax 3+bx 2+cx+df(x) = a{x^3} + b{x^2} + cx + d something!

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.options new file mode 100644 index 0000000..953bdae --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.options @@ -0,0 +1 @@ +:math_engine: itex2mml diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.text new file mode 100644 index 0000000..3e20b55 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/itex2mml.text @@ -0,0 +1 @@ +This is $$f(x) = a{x^3} + b{x^2} + cx + d$$ something! diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.html.19 new file mode 100644 index 0000000..ed0403e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.html.19 @@ -0,0 +1,27 @@ +

      This is + f + ( + x + ) + = + a + + + x + 3 + + + + + b + + + x + 2 + + + + + c + x + + + d + something!

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.options new file mode 100644 index 0000000..adc27e8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.options @@ -0,0 +1 @@ +:math_engine: mathjaxnode diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.text new file mode 100644 index 0000000..3e20b55 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/mathjaxnode.text @@ -0,0 +1 @@ +This is $$f(x) = a{x^3} + b{x^2} + cx + d$$ something! diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.html new file mode 100644 index 0000000..3b93c54 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.html @@ -0,0 +1 @@ +

      $5+5$ inline math

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.options new file mode 100644 index 0000000..06d559e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.options @@ -0,0 +1 @@ +:math_engine: ~ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.text new file mode 100644 index 0000000..a22f9fd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/no_engine.text @@ -0,0 +1 @@ +$$5+5$$ inline math diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/normal.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/normal.html new file mode 100644 index 0000000..d99130e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/normal.html @@ -0,0 +1,10 @@ +

      This is some math. With new line characters in between.

      + +

      inline math, $5.00 $$no math$$

      + +

      $$5+5$$ inline math

      + +

      + +

      $$5+5$$

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/normal.text new file mode 100644 index 0000000..e37a007 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/normal.text @@ -0,0 +1,10 @@ +This is $$\lambda_\alpha > 5$$ some math. With $$1 ++ 1$$ new line characters in between. + +$$5+5$$ inline math, $5.00 \$$no math$$ + +\$\$5+5$$ inline math + +\$$5+5$$ + +\$\$5+5$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.html new file mode 100644 index 0000000..60ba8fe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.html @@ -0,0 +1 @@ +

      This is f(x)=ax3+bx2+cx+d something!

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.options new file mode 100644 index 0000000..0ef54eb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.options @@ -0,0 +1 @@ +:math_engine: ritex diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.text new file mode 100644 index 0000000..3e20b55 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/ritex.text @@ -0,0 +1 @@ +This is $$f(x) = a{x^3} + b{x^2} + cx + d$$ something! diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.html.19 new file mode 100644 index 0000000..4ab6e6e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.html.19 @@ -0,0 +1 @@ +

      Erst einmal eine Formel wie a2+b2=c2a^2+b^2=c^2 innerhalb eines Satzes.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.options new file mode 100644 index 0000000..214a301 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.options @@ -0,0 +1 @@ +:math_engine: sskatex diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.text new file mode 100644 index 0000000..94af230 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/math/sskatex.text @@ -0,0 +1 @@ +Erst einmal eine Formel wie $$a^2+b^2=c^2$$ innerhalb eines Satzes. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.html new file mode 100644 index 0000000..96b3b5c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.html @@ -0,0 +1,6 @@ +

      This is the A&O. © 2008 by me +As well \& as this. Some ŗ other +values may ¯ may also show but +not st. like &#xYZ;.

      + +

      This is BS&T; done!

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.options new file mode 100644 index 0000000..036c561 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.options @@ -0,0 +1 @@ +:entity_output: :as_input diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.text new file mode 100644 index 0000000..0446f4c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities.text @@ -0,0 +1,6 @@ +This is the A&O. © 2008 by me +As well \& as this. Some ŗ other +values may ¯ may also show but +not st. like &#xYZ;. + +This is BS&T; done! diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.html new file mode 100644 index 0000000..7507f75 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.html @@ -0,0 +1 @@ +

      This "is" 'the' A&O. © 2008 by me ŗ and λ

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.html.19 new file mode 100644 index 0000000..ed2817b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.html.19 @@ -0,0 +1 @@ +

      This "is" 'the' A&O. © 2008 by me ŗ and λ

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.options new file mode 100644 index 0000000..32a751e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.options @@ -0,0 +1,2 @@ +:entity_output: :as_char +:smart_quotes: apos,apos,quot,quot diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.text new file mode 100644 index 0000000..279b511 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_char.text @@ -0,0 +1 @@ +This "is" 'the' A&O. © 2008 by me ŗ and λ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.html new file mode 100644 index 0000000..d2eec9d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.html @@ -0,0 +1 @@ +

      This is the A&O. © 2008 by me ŗ and λ

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.options new file mode 100644 index 0000000..036c561 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.options @@ -0,0 +1 @@ +:entity_output: :as_input diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.text new file mode 100644 index 0000000..1ddf7cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_as_input.text @@ -0,0 +1 @@ +This is the A&O. © 2008 by me ŗ and λ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.html new file mode 100644 index 0000000..d04613e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.html @@ -0,0 +1 @@ +

      This is the A&O. © 2008 by me ŗ and λ

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.options new file mode 100644 index 0000000..2e6e0a1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.options @@ -0,0 +1 @@ +:entity_output: :numeric diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.text new file mode 100644 index 0000000..1ddf7cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_numeric.text @@ -0,0 +1 @@ +This is the A&O. © 2008 by me ŗ and λ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.html new file mode 100644 index 0000000..258ba14 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.html @@ -0,0 +1 @@ +

      This is the A&O. © 2008 by me ŗ and λ

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.options new file mode 100644 index 0000000..c195785 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.options @@ -0,0 +1 @@ +:entity_output: :symbolic diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.text new file mode 100644 index 0000000..1ddf7cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/entities_symbolic.text @@ -0,0 +1 @@ +This is the A&O. © 2008 by me ŗ and λ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/greaterthan.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/greaterthan.html new file mode 100644 index 0000000..dcce4cc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/greaterthan.html @@ -0,0 +1 @@ +

      2 > 1 > 0

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/greaterthan.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/greaterthan.text new file mode 100644 index 0000000..7dfb7f1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/greaterthan.text @@ -0,0 +1 @@ +2 > 1 > 0 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/lowerthan.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/lowerthan.html new file mode 100644 index 0000000..8ebac23 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/lowerthan.html @@ -0,0 +1 @@ +

      0 < 1 < 2

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/lowerthan.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/lowerthan.text new file mode 100644 index 0000000..038df8b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/lowerthan.text @@ -0,0 +1 @@ +0 < 1 < 2 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.html new file mode 100644 index 0000000..02d1dbc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.html @@ -0,0 +1,40 @@ +

      This is… something—this too–!

      + +

      This «is» some text, « this » too!

      + +

      “Fancy quotes” are ‘cool’, even in the ’80s! +Je t’ aime. You’re a funny one! Thomas’ name +Mark’s name. “…you” +“‘Nested’ quotes are ‘possible’”, too! +‘“Otherway” is “round”’!

      + +

      ‘Opening now!’

      + +

      ’80s are really cool.

      + +

      Cluster’s Last Stand.

      + +

      Nam liber tempor +“…At vero eos et accusam”

      + +

      Single underscores should work.”

      + +

      Single asterisks should work.”

      + +

      Double underscores should work.’

      + +

      Double asterisks should work.’

      + +

      Hurrah!

      + +

      Absolutely.’

      + +

      “…some Text”

      + +

      “… some Text”

      + +

      This: “…some Text”

      + +

      This: “… some Text”

      + +

      ”[foo]” “[foo]” d “[foo]”

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.options new file mode 100644 index 0000000..4f1c17c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.options @@ -0,0 +1 @@ +:entity_output: symbolic diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.text new file mode 100644 index 0000000..27e090e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography.text @@ -0,0 +1,40 @@ +This is... something---this too--! + +This <> some text, << this >> too! + +"Fancy quotes" are 'cool', even in the '80s! +Je t' aime. You're a funny one! Thomas' name +Mark's name. "...you" +"'Nested' quotes are 'possible'", too! +'"Otherway" is "round"'! + +'Opening now!' + +'80s are really cool. + +Cluster's Last Stand. + +Nam liber tempor +"...At vero eos et accusam" + +"_Single underscores_ should work." + +"*Single asterisks* should work." + +'__Double underscores__ should work.' + +'**Double asterisks** should work.' + +"_Hurrah!_" + +'__Absolutely__.' + +"...some Text" + +"... some Text" + +This: "...some Text" + +This: "... some Text" + +"\[foo]" "\[foo]" d "\[foo]" diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.html new file mode 100644 index 0000000..4a6c226 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.html @@ -0,0 +1,3 @@ +

      This ... something---this too--!

      + +

      This <<is>> some text, << this >> too!

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.latex new file mode 100644 index 0000000..c7d9ba5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.latex @@ -0,0 +1,4 @@ +This ... something---this too--! + +This \textless{}\textless{}is\textgreater{}\textgreater{} some text, \textless{}\textless{} this \textgreater{}\textgreater{} too! + diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.options new file mode 100644 index 0000000..d0a0313 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.options @@ -0,0 +1,8 @@ +typographic_symbols: + hellip: '...' + mdash: '---' + ndash: '--' + laquo: '<<' + raquo: '>>' + laquo_space: '<< ' + raquo_space: ' >>' diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.text new file mode 100644 index 0000000..a3d59b3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases/span/text_substitutions/typography_subst.text @@ -0,0 +1,3 @@ +This ... something---this too--! + +This <> some text, << this >> too! diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/atx_header.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/atx_header.html new file mode 100644 index 0000000..776d7a1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/atx_header.html @@ -0,0 +1,3 @@ +

      header

      + +

      #no header

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/atx_header.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/atx_header.text new file mode 100644 index 0000000..5e70e2b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/atx_header.text @@ -0,0 +1,3 @@ +# header + +#no header diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.html new file mode 100644 index 0000000..8390d09 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.html @@ -0,0 +1,2 @@ +
      Kramdown::Document.new(text, :input => 'GFM')
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.options new file mode 100644 index 0000000..72e9bc1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.options @@ -0,0 +1 @@ +:enable_coderay: false diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.text new file mode 100644 index 0000000..98cf3a8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_disable_highlighting.text @@ -0,0 +1,3 @@ +```ruby +Kramdown::Document.new(text, :input => 'GFM') +``` diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_syntax.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_syntax.html new file mode 100644 index 0000000..8c1079d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_syntax.html @@ -0,0 +1,20 @@ +
      Three backticks
      +
      + +
      Four backticks
      +
      + +
      Unbalanced bottom heavy
      +
      + +
      +
      1language no space
      +
      +
      +
      + +
      +
      1language with space
      +
      +
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_syntax.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_syntax.text new file mode 100644 index 0000000..fb5c611 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/backticks_syntax.text @@ -0,0 +1,19 @@ +``` +Three backticks +``` + +```` +Four backticks +```` + +``` +Unbalanced bottom heavy +`````` + +````ruby +language no space +```` + +```` ruby +language with space +```` diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.html new file mode 100644 index 0000000..0bdefdc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.html @@ -0,0 +1,20 @@ +

      normal

      + +
      require 'kramdown'
      +
      +Kramdown::Document.new(text).to_html
      +
      + +

      indent with tab

      + +
      ```ruby
      +require 'kramdown'
      +
      +Kramdown::Document.new(text).to_html
      +```
      +
      + +

      indent with 2 spaces

      + +
        console.log("hello");
      +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.options new file mode 100644 index 0000000..72e9bc1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.options @@ -0,0 +1 @@ +:enable_coderay: false diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.text new file mode 100644 index 0000000..5e3e192 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/codeblock_fenced.text @@ -0,0 +1,21 @@ +normal + +```ruby +require 'kramdown' + +Kramdown::Document.new(text).to_html +``` + +indent with tab + + ```ruby + require 'kramdown' + + Kramdown::Document.new(text).to_html + ``` + +indent with 2 spaces + + ```js + console.log("hello"); + ``` diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks.html new file mode 100644 index 0000000..1dfb2f0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks.html @@ -0,0 +1,3 @@ +

      one
      +two
      +three

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks.text new file mode 100644 index 0000000..f1287bd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks.text @@ -0,0 +1,3 @@ +one +_two_ +three diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.html new file mode 100644 index 0000000..e1dba2b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.html @@ -0,0 +1,2 @@ +

      This is just a normal paragraph.
      +Containing a manual line break above.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.options new file mode 100644 index 0000000..f2da683 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.options @@ -0,0 +1 @@ +:hard_wrap: false diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.text new file mode 100644 index 0000000..2fe88b9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/hard_line_breaks_off.text @@ -0,0 +1,2 @@ +This is just a normal paragraph. +Containing a manual line break above. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.html new file mode 100644 index 0000000..1e52650 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.html @@ -0,0 +1,27 @@ +

      test

      + +

      variable_name

      + +

      abc def öúß

      + +

      192 abc 192

      + +

      ;.;;

      + +

      variable_name

      + +

      variable_name

      + +

      ;;

      + +

      before after tab

      + +

      with code

      + +

      with  ä space

      + +

      With “smart” quotes

      + +

      with — « typographic » … symbols

      + +

      with

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.html.19 new file mode 100644 index 0000000..b45fe8f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.html.19 @@ -0,0 +1,27 @@ +

      test

      + +

      variable_name

      + +

      abc def öúß

      + +

      192 abc 192

      + +

      ;.;;

      + +

      variable_name

      + +

      variable_name

      + +

      ;;

      + +

      before after tab

      + +

      with code

      + +

      with  ä space

      + +

      With “smart†quotes

      + +

      with — « typographic » … symbols

      + +

      with

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.options new file mode 100644 index 0000000..8776b55 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.options @@ -0,0 +1 @@ +:auto_ids: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.text new file mode 100644 index 0000000..0a89c0b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids.text @@ -0,0 +1,27 @@ +### test {#myid} + +### variable_name + +### abc def öúß + +### 192 abc 192 + +### ;.;; + +### variable_name + +### variable_name + +### ;; + +### before after tab + +### with `code` + +### with  ä space + +### With "smart" quotes + +### with --- << typographic >> ... symbols + +### with $$m=5$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.html new file mode 100644 index 0000000..4aab072 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.html @@ -0,0 +1,3 @@ +

      Header 1

      + +

      123

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.options new file mode 100644 index 0000000..f37255d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.options @@ -0,0 +1,2 @@ +:auto_ids: true +:auto_id_prefix: hallo- diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.text new file mode 100644 index 0000000..acf09fe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/header_ids_with_prefix.text @@ -0,0 +1,3 @@ +# Header 1 + +# 123 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.html new file mode 100644 index 0000000..beecad4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.html @@ -0,0 +1,3 @@ +

      Header with --ndash

      + +

      with --- << typographic >> ... symbols

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.html.19 new file mode 100644 index 0000000..beecad4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.html.19 @@ -0,0 +1,3 @@ +

      Header with --ndash

      + +

      with --- << typographic >> ... symbols

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.options new file mode 100644 index 0000000..4a83cd1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.options @@ -0,0 +1 @@ +:gfm_quirks: [no_auto_typographic] diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.text new file mode 100644 index 0000000..f579651 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/no_typographic.text @@ -0,0 +1,3 @@ +### Header with --ndash + +### with --- << typographic >> ... symbols diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.html new file mode 100644 index 0000000..41dfb3a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.html @@ -0,0 +1,31 @@ +

      A
      + - b

      + +

      This is a list
      +- or is it

      + +

      blockquote
      +> text

      + +

      header
      +# text

      + +

      codeblock fenced
      + +puts hello world +

      + +
        +
      • +

        level 1
        +some text

        + +

        begin level 2
        +* level 2
        +* level 2

        +
      • +
      + +

      h1

      +

      ## h2
      +### h3

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.options new file mode 100644 index 0000000..704f643 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.options @@ -0,0 +1 @@ +:gfm_quirks: [] diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.text new file mode 100644 index 0000000..4e09e03 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end-disabled.text @@ -0,0 +1,27 @@ +A + - b + +This is a list +- or is it + +blockquote +> text + +header +# text + +codeblock fenced +``` +puts hello world +``` + +* level 1 + some text + + begin level 2 + * level 2 + * level 2 + +# h1 +## h2 +### h3 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end.html new file mode 100644 index 0000000..c337d61 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end.html @@ -0,0 +1,38 @@ +

      A

      +
        +
      • b
      • +
      + +

      This is a list

      +
        +
      • or is it
      • +
      + +

      blockquote

      +
      +

      text

      +
      + +

      header

      +

      text

      + +

      codeblock fenced

      +
      puts hello world
      +
      + +
        +
      • +

        level 1
        +some text

        + +

        begin level 2

        +
          +
        • level 2
        • +
        • level 2
        • +
        +
      • +
      + +

      h1

      +

      h2

      +

      h3

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end.text new file mode 100644 index 0000000..4e09e03 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/paragraph_end.text @@ -0,0 +1,27 @@ +A + - b + +This is a list +- or is it + +blockquote +> text + +header +# text + +codeblock fenced +``` +puts hello world +``` + +* level 1 + some text + + begin level 2 + * level 2 + * level 2 + +# h1 +## h2 +### h3 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.html new file mode 100644 index 0000000..dad32ab --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.html @@ -0,0 +1,27 @@ +

      This is a test

      + +

      ~This is another test~

      + +

      This is yet another test~

      + +

      ~~ This is a test of it NOT working ~~

      + +

      ~~
      +This
      +is
      +a
      +multiline
      +test
      +~~

      + +

      This is an inline strikethrough test

      + +

      This is an ~~escaped~~ strikethrough.

      + +

      This is a strikethrough with a ~ in the middle

      + +

      I don’t even~ have an extra tilde.

      + +

      This should ~~not be struck.

      + +

      This is a complex strike through *test ~~with nesting involved* here~~.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.html.19 new file mode 100644 index 0000000..ed28995 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.html.19 @@ -0,0 +1,27 @@ +

      This is a test

      + +

      ~This is another test~

      + +

      This is yet another test~

      + +

      ~~ This is a test of it NOT working ~~

      + +

      ~~
      +This
      +is
      +a
      +multiline
      +test
      +~~

      + +

      This is an inline strikethrough test

      + +

      This is an ~~escaped~~ strikethrough.

      + +

      This is a strikethrough with a ~ in the middle

      + +

      I don’t even~ have an extra tilde.

      + +

      This should ~~not be struck.

      + +

      This is a complex strike through *test ~~with nesting involved* here~~.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.text new file mode 100644 index 0000000..fbeffc6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/strikethrough.text @@ -0,0 +1,27 @@ +~~This is a test~~ + +~~~This is another test~~~ + +~~This is yet another test~~~ + +~~ This is a test of it NOT working ~~ + +~~ +This +is +a +**multiline** +test +~~ + +This is an ~~_inline_ **strikethrough**~~ test + +This is an \~~escaped~~ strikethrough. + +This is a ~~strikethrough with a ~ in the middle~~ + +I ~~don't even~~~ have an extra tilde. + +This should ~~not be struck. + +This ~~is a complex *strike* through *test ~~with nesting~~ involved* here~~. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/task_list.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/task_list.html new file mode 100644 index 0000000..a11b553 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/task_list.html @@ -0,0 +1,40 @@ +

      unordered task list

      + +
        +
      • first ul task item
      • +
      • second ul task item
      • +
      • third ul task item
      • +
      • fourth ul task item [ ] next
      • +
      + +

      unordered list

      + +
        +
      • +
        +

        first ul item

        +
        +
      • +
      • +
      • +
        test
        +
        +
      • +
      • second ul item
      • +
      + +

      ordered list

      + +
        +
      1. first ol item
      2. +
      3. second ol item
      4. +
      + +

      ordered task list

      + +
        +
      1. first ol task item
      2. +
      3. second ol task item
      4. +
      5. third ol task item
      6. +
      7. fourth ol task item
      8. +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/task_list.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/task_list.text new file mode 100644 index 0000000..f6ade2f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/task_list.text @@ -0,0 +1,26 @@ +unordered task list + +- [ ] first ul task item +- [x] second ul task item +- [X] third ul task item +- [ ] fourth ul task item [ ] next + +unordered list + +- > first ul item +- +- + test +- second ul item + +ordered list + +1. first ol item +2. second ol item + +ordered task list + +1. [ ] first ol task item +2. [x] second ol task item +3. [X] third ol task item +4. [ ] fourth ol task item diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/two_para_hard_line_breaks.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/two_para_hard_line_breaks.html new file mode 100644 index 0000000..d5ba2e4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/two_para_hard_line_breaks.html @@ -0,0 +1,4 @@ +

      This is just a normal paragraph.
      +Containing a line break.

      + +

      Another paragraph.

      diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/two_para_hard_line_breaks.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/two_para_hard_line_breaks.text new file mode 100644 index 0000000..6b3d7c5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.16.2/test/testcases_gfm/two_para_hard_line_breaks.text @@ -0,0 +1,4 @@ +This is just a normal paragraph. +Containing a line break. + +Another paragraph. diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/History.md b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/History.md new file mode 100644 index 0000000..f317aec --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/History.md @@ -0,0 +1,232 @@ +# Liquid Change Log + +## 4.0.0 / not yet released / branch "master" + +### Changed +* Render an opaque internal error by default for non-Liquid::Error (#835) [Dylan Thacker-Smith] +* Ruby 2.0 support dropped (#832) [Dylan Thacker-Smith] +* Add to_number Drop method to allow custom drops to work with number filters (#731) +* Add strict_variables and strict_filters options to detect undefined references (#691) +* Improve loop performance (#681) [Florian Weingarten] +* Rename Drop method `before_method` to `liquid_method_missing` (#661) [Thierry Joyal] +* Add url_decode filter to invert url_encode (#645) [Larry Archer] +* Add global_filter to apply a filter to all output (#610) [Loren Hale] +* Add compact filter (#600) [Carson Reinke] +* Rename deprecated "has_key?" and "has_interrupt?" methods (#593) [Florian Weingarten] +* Include template name with line numbers in render errors (574) [Dylan Thacker-Smith] +* Add sort_natural filter (#554) [Martin Hanzel] +* Add forloop.parentloop as a reference to the parent loop (#520) [Justin Li] +* Block parsing moved to BlockBody class (#458) [Dylan Thacker-Smith] +* Add concat filter to concatenate arrays (#429) [Diogo Beato] +* Ruby 1.9 support dropped (#491) [Justin Li] +* Liquid::Template.file_system's read_template_file method is no longer passed the context. (#441) [James Reid-Smith] +* Remove support for `liquid_methods` +* Liquid::Template.register_filter raises when the module overrides registered public methods as private or protected (#705) [Gaurav Chande] + +### Fixed +* Fix map filter when value is a Proc (#672) [Guillaume Malette] +* Fix truncate filter when value is not a string (#672) [Guillaume Malette] +* Fix behaviour of escape filter when input is nil (#665) [Tanel Jakobsoo] +* Fix sort filter behaviour with empty array input (#652) [Marcel Cary] +* Fix test failure under certain timezones (#631) [Dylan Thacker-Smith] +* Fix bug in uniq filter (#595) [Florian Weingarten] +* Fix bug when "blank" and "empty" are used as variable names (#592) [Florian Weingarten] +* Fix condition parse order in strict mode (#569) [Justin Li] +* Fix naming of the "context variable" when dynamically including a template (#559) [Justin Li] +* Gracefully accept empty strings in the date filter (#555) [Loren Hale] +* Fix capturing into variables with a hyphen in the name (#505) [Florian Weingarten] +* Fix case sensitivity regression in date standard filter (#499) [Kelley Reynolds] +* Disallow filters with no variable in strict mode (#475) [Justin Li] +* Disallow variable names in the strict parser that are not valid in the lax parser (#463) [Justin Li] +* Fix BlockBody#warnings taking exponential time to compute (#486) [Justin Li] + +## 3.0.5 / 2015-07-23 / branch "3-0-stable" + +* Fix test failure under certain timezones [Dylan Thacker-Smith] + +## 3.0.4 / 2015-07-17 + +* Fix chained access to multi-dimensional hashes [Florian Weingarten] + +## 3.0.3 / 2015-05-28 + +* Fix condition parse order in strict mode (#569) [Justin Li] + +## 3.0.2 / 2015-04-24 + +* Expose VariableLookup private members (#551) [Justin Li] +* Documentation fixes + +## 3.0.1 / 2015-01-23 + +* Remove duplicate `index0` key in TableRow tag (#502) [Alfred Xing] + +## 3.0.0 / 2014-11-12 + +* Removed Block#end_tag. Instead, override parse with `super` followed by your code. See #446 [Dylan Thacker-Smith] +* Fixed condition with wrong data types (#423) [Bogdan Gusiev] +* Add url_encode to standard filters (#421) [Derrick Reimer] +* Add uniq to standard filters [Florian Weingarten] +* Add exception_handler feature (#397) and #254 [Bogdan Gusiev, Florian Weingarten] +* Optimize variable parsing to avoid repeated regex evaluation during template rendering #383 [Jason Hiltz-Laforge] +* Optimize checking for block interrupts to reduce object allocation #380 [Jason Hiltz-Laforge] +* Properly set context rethrow_errors on render! #349 [Thierry Joyal] +* Fix broken rendering of variables which are equal to false (#345) [Florian Weingarten] +* Remove ActionView template handler [Dylan Thacker-Smith] +* Freeze lots of string literals for new Ruby 2.1 optimization (#297) [Florian Weingarten] +* Allow newlines in tags and variables (#324) [Dylan Thacker-Smith] +* Tag#parse is called after initialize, which now takes options instead of tokens as the 3rd argument. See #321 [Dylan Thacker-Smith] +* Raise `Liquid::ArgumentError` instead of `::ArgumentError` when filter has wrong number of arguments #309 [Bogdan Gusiev] +* Add a to_s default for liquid drops (#306) [Adam Doeler] +* Add strip, lstrip, and rstrip to standard filters [Florian Weingarten] +* Make if, for & case tags return complete and consistent nodelists (#250) [Nick Jones] +* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith] +* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl] +* Fix resource counting bug with respond_to?(:length) (#263) [Florian Weingarten] +* Allow specifying custom patterns for template filenames (#284) [Andrei Gladkyi] +* Allow drops to optimize loading a slice of elements (#282) [Tom Burns] +* Support for passing variables to snippets in subdirs (#271) [Joost Hietbrink] +* Add a class cache to avoid runtime extend calls (#249) [James Tucker] +* Remove some legacy Ruby 1.8 compatibility code (#276) [Florian Weingarten] +* Add default filter to standard filters (#267) [Derrick Reimer] +* Add optional strict parsing and warn parsing (#235) [Tristan Hume] +* Add I18n syntax error translation (#241) [Simon Hørup Eskildsen, Sirupsen] +* Make sort filter work on enumerable drops (#239) [Florian Weingarten] +* Fix clashing method names in enumerable drops (#238) [Florian Weingarten] +* Make map filter work on enumerable drops (#233) [Florian Weingarten] +* Improved whitespace stripping for blank blocks, related to #216 [Florian Weingarten] + +## 2.6.3 / 2015-07-23 / branch "2-6-stable" + +* Fix test failure under certain timezones [Dylan Thacker-Smith] + +## 2.6.2 / 2015-01-23 + +* Remove duplicate hash key [Parker Moore] + +## 2.6.1 / 2014-01-10 + +Security fix, cherry-picked from master (4e14a65): +* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl] +* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith] + +## 2.6.0 / 2013-11-25 + +IMPORTANT: Liquid 2.6 is going to be the last version of Liquid which maintains explicit Ruby 1.8 compatability. +The following releases will only be tested against Ruby 1.9 and Ruby 2.0 and are likely to break on Ruby 1.8. + +* Bugfix for #106: fix example servlet [gnowoel] +* Bugfix for #97: strip_html filter supports multi-line tags [Jo Liss] +* Bugfix for #114: strip_html filter supports style tags [James Allardice] +* Bugfix for #117: 'now' support for date filter in Ruby 1.9 [Notre Dame Webgroup] +* Bugfix for #166: truncate filter on UTF-8 strings with Ruby 1.8 [Florian Weingarten] +* Bugfix for #204: 'raw' parsing bug [Florian Weingarten] +* Bugfix for #150: 'for' parsing bug [Peter Schröder] +* Bugfix for #126: Strip CRLF in strip_newline [Peter Schröder] +* Bugfix for #174, "can't convert Fixnum into String" for "replace" [jsw0528] +* Allow a Liquid::Drop to be passed into Template#render [Daniel Huckstep] +* Resource limits [Florian Weingarten] +* Add reverse filter [Jay Strybis] +* Add utf-8 support +* Use array instead of Hash to keep the registered filters [Tasos Stathopoulos] +* Cache tokenized partial templates [Tom Burns] +* Avoid warnings in Ruby 1.9.3 [Marcus Stollsteimer] +* Better documentation for 'include' tag (closes #163) [Peter Schröder] +* Use of BigDecimal on filters to have better precision (closes #155) [Arthur Nogueira Neves] + +## 2.5.5 / 2014-01-10 / branch "2-5-stable" + +Security fix, cherry-picked from master (4e14a65): +* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl] +* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith] + +## 2.5.4 / 2013-11-11 + +* Fix "can't convert Fixnum into String" for "replace" (#173), [jsw0528] + +## 2.5.3 / 2013-10-09 + +* #232, #234, #237: Fix map filter bugs [Florian Weingarten] + +## 2.5.2 / 2013-09-03 / deleted + +Yanked from rubygems, as it contained too many changes that broke compatibility. Those changes will be on following major releases. + +## 2.5.1 / 2013-07-24 + +* #230: Fix security issue with map filter, Use invoke_drop in map filter [Florian Weingarten] + +## 2.5.0 / 2013-03-06 + +* Prevent Object methods from being called on drops +* Avoid symbol injection from liquid +* Added break and continue statements +* Fix filter parser for args without space separators +* Add support for filter keyword arguments + + +## 2.4.0 / 2012-08-03 + +* Performance improvements +* Allow filters in `assign` +* Add `modulo` filter +* Ruby 1.8, 1.9, and Rubinius compatibility fixes +* Add support for `quoted['references']` in `tablerow` +* Add support for Enumerable to `tablerow` +* `strip_html` filter removes html comments + + +## 2.3.0 / 2011-10-16 + +* Several speed/memory improvements +* Numerous bug fixes +* Added support for MRI 1.9, Rubinius, and JRuby +* Added support for integer drop parameters +* Added epoch support to `date` filter +* New `raw` tag that suppresses parsing +* Added `else` option to `for` tag +* New `increment` tag +* New `split` filter + + +## 2.2.1 / 2010-08-23 + +* Added support for literal tags + + +## 2.2.0 / 2010-08-22 + +* Compatible with Ruby 1.8.7, 1.9.1 and 1.9.2-p0 +* Merged some changed made by the community + + +## 1.9.0 / 2008-03-04 + +* Fixed gem install rake task +* Improve Error encapsulation in liquid by maintaining a own set of exceptions instead of relying on ruby build ins + + +## Before 1.9.0 + +* Added If with or / and expressions +* Implemented .to_liquid for all objects which can be passed to liquid like Strings Arrays Hashes Numerics and Booleans. To export new objects to liquid just implement .to_liquid on them and return objects which themselves have .to_liquid methods. +* Added more tags to standard library +* Added include tag ( like partials in rails ) +* [...] Gazillion of detail improvements +* Added strainers as filter hosts for better security [Tobias Luetke] +* Fixed that rails integration would call filter with the wrong "self" [Michael Geary] +* Fixed bad error reporting when a filter called a method which doesn't exist. Liquid told you that it couldn't find the filter which was obviously misleading [Tobias Luetke] +* Removed count helper from standard lib. use size [Tobias Luetke] +* Fixed bug with string filter parameters failing to tolerate commas in strings. [Paul Hammond] +* Improved filter parameters. Filter parameters are now context sensitive; Types are resolved according to the rules of the context. Multiple parameters are now separated by the Liquid::ArgumentSeparator: , by default [Paul Hammond] + {{ 'Typo' | link_to: 'http://typo.leetsoft.com', 'Typo - a modern weblog engine' }} +* Added Liquid::Drop. A base class which you can use for exporting proxy objects to liquid which can acquire more data when used in liquid. [Tobias Luetke] + + class ProductDrop < Liquid::Drop + def top_sales + Shop.current.products.find(:all, :order => 'sales', :limit => 10 ) + end + end + t = Liquid::Template.parse( ' {% for product in product.top_sales %} {{ product.name }} {% endfor %} ' ) + t.render('product' => ProductDrop.new ) +* Added filter parameters support. Example: {{ date | format_date: "%Y" }} [Paul Hammond] diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/LICENSE b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/LICENSE new file mode 100644 index 0000000..926b04e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2005, 2006 Tobias Luetke + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/README.md b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/README.md new file mode 100644 index 0000000..877fdf6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/README.md @@ -0,0 +1,106 @@ +[![Build Status](https://api.travis-ci.org/Shopify/liquid.svg?branch=master)](http://travis-ci.org/Shopify/liquid) +[![Inline docs](http://inch-ci.org/github/Shopify/liquid.svg?branch=master)](http://inch-ci.org/github/Shopify/liquid) + +# Liquid template engine + +* [Contributing guidelines](CONTRIBUTING.md) +* [Version history](History.md) +* [Liquid documentation from Shopify](http://docs.shopify.com/themes/liquid-basics) +* [Liquid Wiki at GitHub](https://github.com/Shopify/liquid/wiki) +* [Website](http://liquidmarkup.org/) + +## Introduction + +Liquid is a template engine which was written with very specific requirements: + +* It has to have beautiful and simple markup. Template engines which don't produce good looking markup are no fun to use. +* It needs to be non evaling and secure. Liquid templates are made so that users can edit them. You don't want to run code on your server which your users wrote. +* It has to be stateless. Compile and render steps have to be separate so that the expensive parsing and compiling can be done once and later on you can just render it passing in a hash with local variables and objects. + +## Why you should use Liquid + +* You want to allow your users to edit the appearance of your application but don't want them to run **insecure code on your server**. +* You want to render templates directly from the database. +* You like smarty (PHP) style template engines. +* You need a template engine which does HTML just as well as emails. +* You don't like the markup of your current templating engine. + +## What does it look like? + +```html +
        + {% for product in products %} +
      • +

        {{ product.name }}

        + Only {{ product.price | price }} + + {{ product.description | prettyprint | paragraph }} +
      • + {% endfor %} +
      +``` + +## How to use Liquid + +Liquid supports a very simple API based around the Liquid::Template class. +For standard use you can just pass it the content of a file and call render with a parameters hash. + +```ruby +@template = Liquid::Template.parse("hi {{name}}") # Parses and compiles the template +@template.render('name' => 'tobi') # => "hi tobi" +``` + +### Error Modes + +Setting the error mode of Liquid lets you specify how strictly you want your templates to be interpreted. +Normally the parser is very lax and will accept almost anything without error. Unfortunately this can make +it very hard to debug and can lead to unexpected behaviour. + +Liquid also comes with a stricter parser that can be used when editing templates to give better error messages +when templates are invalid. You can enable this new parser like this: + +```ruby +Liquid::Template.error_mode = :strict # Raises a SyntaxError when invalid syntax is used +Liquid::Template.error_mode = :warn # Adds errors to template.errors but continues as normal +Liquid::Template.error_mode = :lax # The default mode, accepts almost anything. +``` + +If you want to set the error mode only on specific templates you can pass `:error_mode` as an option to `parse`: +```ruby +Liquid::Template.parse(source, :error_mode => :strict) +``` +This is useful for doing things like enabling strict mode only in the theme editor. + +It is recommended that you enable `:strict` or `:warn` mode on new apps to stop invalid templates from being created. +It is also recommended that you use it in the template editors of existing apps to give editors better error messages. + +### Undefined variables and filters + +By default, the renderer doesn't raise or in any other way notify you if some variables or filters are missing, i.e. not passed to the `render` method. +You can improve this situation by passing `strict_variables: true` and/or `strict_filters: true` options to the `render` method. +When one of these options is set to true, all errors about undefined variables and undefined filters will be stored in `errors` array of a `Liquid::Template` instance. +Here are some examples: + +```ruby +template = Liquid::Template.parse("{{x}} {{y}} {{z.a}} {{z.b}}") +template.render({ 'x' => 1, 'z' => { 'a' => 2 } }, { strict_variables: true }) +#=> '1 2 ' # when a variable is undefined, it's rendered as nil +template.errors +#=> [#, #] +``` + +```ruby +template = Liquid::Template.parse("{{x | filter1 | upcase}}") +template.render({ 'x' => 'foo' }, { strict_filters: true }) +#=> '' # when at least one filter in the filter chain is undefined, a whole expression is rendered as nil +template.errors +#=> [#] +``` + +If you want to raise on a first exception instead of pushing all of them in `errors`, you can use `render!` method: + +```ruby +template = Liquid::Template.parse("{{x}} {{y}}") +template.render!({ 'x' => 1}, { strict_variables: true }) +#=> Liquid::UndefinedVariable: Liquid error: undefined variable y +``` diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid.rb new file mode 100644 index 0000000..7d9da26 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid.rb @@ -0,0 +1,79 @@ +# Copyright (c) 2005 Tobias Luetke +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Liquid + FilterSeparator = /\|/ + ArgumentSeparator = ','.freeze + FilterArgumentSeparator = ':'.freeze + VariableAttributeSeparator = '.'.freeze + WhitespaceControl = '-'.freeze + TagStart = /\{\%/ + TagEnd = /\%\}/ + VariableSignature = /\(?[\w\-\.\[\]]\)?/ + VariableSegment = /[\w\-]/ + VariableStart = /\{\{/ + VariableEnd = /\}\}/ + VariableIncompleteEnd = /\}\}?/ + QuotedString = /"[^"]*"|'[^']*'/ + QuotedFragment = /#{QuotedString}|(?:[^\s,\|'"]|#{QuotedString})+/o + TagAttributes = /(\w+)\s*\:\s*(#{QuotedFragment})/o + AnyStartingTag = /#{TagStart}|#{VariableStart}/o + PartialTemplateParser = /#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableIncompleteEnd}/om + TemplateParser = /(#{PartialTemplateParser}|#{AnyStartingTag})/om + VariableParser = /\[[^\]]+\]|#{VariableSegment}+\??/o + + singleton_class.send(:attr_accessor, :cache_classes) + self.cache_classes = true +end + +require "liquid/version" +require 'liquid/lexer' +require 'liquid/parser' +require 'liquid/i18n' +require 'liquid/drop' +require 'liquid/tablerowloop_drop' +require 'liquid/forloop_drop' +require 'liquid/extensions' +require 'liquid/errors' +require 'liquid/interrupts' +require 'liquid/strainer' +require 'liquid/expression' +require 'liquid/context' +require 'liquid/parser_switching' +require 'liquid/tag' +require 'liquid/block' +require 'liquid/block_body' +require 'liquid/document' +require 'liquid/variable' +require 'liquid/variable_lookup' +require 'liquid/range_lookup' +require 'liquid/file_system' +require 'liquid/resource_limits' +require 'liquid/template' +require 'liquid/standardfilters' +require 'liquid/condition' +require 'liquid/utils' +require 'liquid/tokenizer' +require 'liquid/parse_context' + +# Load all the tags of the standard library +# +Dir["#{__dir__}/liquid/tags/*.rb"].each { |f| require f } diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/block.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/block.rb new file mode 100644 index 0000000..eed0475 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/block.rb @@ -0,0 +1,67 @@ +module Liquid + class Block < Tag + def initialize(tag_name, markup, options) + super + @blank = true + end + + def parse(tokens) + @body = BlockBody.new + while parse_body(@body, tokens) + end + end + + def render(context) + @body.render(context) + end + + def blank? + @blank + end + + def nodelist + @body.nodelist + end + + def unknown_tag(tag, _params, _tokens) + case tag + when 'else'.freeze + raise SyntaxError.new(parse_context.locale.t("errors.syntax.unexpected_else".freeze, + block_name: block_name)) + when 'end'.freeze + raise SyntaxError.new(parse_context.locale.t("errors.syntax.invalid_delimiter".freeze, + block_name: block_name, + block_delimiter: block_delimiter)) + else + raise SyntaxError.new(parse_context.locale.t("errors.syntax.unknown_tag".freeze, tag: tag)) + end + end + + def block_name + @tag_name + end + + def block_delimiter + @block_delimiter ||= "end#{block_name}" + end + + protected + + def parse_body(body, tokens) + body.parse(tokens, parse_context) do |end_tag_name, end_tag_params| + @blank &&= body.blank? + + return false if end_tag_name == block_delimiter + unless end_tag_name + raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_never_closed".freeze, block_name: block_name)) + end + + # this tag is not registered with the system + # pass it to the current block for special handling or error reporting + unknown_tag(end_tag_name, end_tag_params, tokens) + end + + true + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/block_body.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/block_body.rb new file mode 100644 index 0000000..4e2a4c9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/block_body.rb @@ -0,0 +1,139 @@ +module Liquid + class BlockBody + FullToken = /\A#{TagStart}#{WhitespaceControl}?\s*(\w+)\s*(.*?)#{WhitespaceControl}?#{TagEnd}\z/om + ContentOfVariable = /\A#{VariableStart}#{WhitespaceControl}?(.*?)#{WhitespaceControl}?#{VariableEnd}\z/om + TAGSTART = "{%".freeze + VARSTART = "{{".freeze + + attr_reader :nodelist + + def initialize + @nodelist = [] + @blank = true + end + + def parse(tokenizer, parse_context) + parse_context.line_number = tokenizer.line_number + while token = tokenizer.shift + unless token.empty? + case + when token.start_with?(TAGSTART) + whitespace_handler(token, parse_context) + if token =~ FullToken + tag_name = $1 + markup = $2 + # fetch the tag from registered blocks + if tag = registered_tags[tag_name] + new_tag = tag.parse(tag_name, markup, tokenizer, parse_context) + @blank &&= new_tag.blank? + @nodelist << new_tag + else + # end parsing if we reach an unknown tag and let the caller decide + # determine how to proceed + return yield tag_name, markup + end + else + raise_missing_tag_terminator(token, parse_context) + end + when token.start_with?(VARSTART) + whitespace_handler(token, parse_context) + @nodelist << create_variable(token, parse_context) + @blank = false + else + if parse_context.trim_whitespace + token.lstrip! + end + parse_context.trim_whitespace = false + @nodelist << token + @blank &&= !!(token =~ /\A\s*\z/) + end + end + parse_context.line_number = tokenizer.line_number + end + + yield nil, nil + end + + def whitespace_handler(token, parse_context) + if token[2] == WhitespaceControl + previous_token = @nodelist.last + if previous_token.is_a? String + previous_token.rstrip! + end + end + parse_context.trim_whitespace = (token[-3] == WhitespaceControl) + end + + def blank? + @blank + end + + def render(context) + output = [] + context.resource_limits.render_score += @nodelist.length + + @nodelist.each do |token| + # Break out if we have any unhanded interrupts. + break if context.interrupt? + + begin + # If we get an Interrupt that means the block must stop processing. An + # Interrupt is any command that stops block execution such as {% break %} + # or {% continue %} + if token.is_a?(Continue) || token.is_a?(Break) + context.push_interrupt(token.interrupt) + break + end + + node_output = render_node(token, context) + + unless token.is_a?(Block) && token.blank? + output << node_output + end + rescue MemoryError => e + raise e + rescue UndefinedVariable, UndefinedDropMethod, UndefinedFilter => e + context.handle_error(e, token.line_number, token.raw) + output << nil + rescue ::StandardError => e + output << context.handle_error(e, token.line_number, token.raw) + end + end + + output.join + end + + private + + def render_node(node, context) + node_output = (node.respond_to?(:render) ? node.render(context) : node) + node_output = node_output.is_a?(Array) ? node_output.join : node_output.to_s + + context.resource_limits.render_length += node_output.length + if context.resource_limits.reached? + raise MemoryError.new("Memory limits exceeded".freeze) + end + node_output + end + + def create_variable(token, parse_context) + token.scan(ContentOfVariable) do |content| + markup = content.first + return Variable.new(markup, parse_context) + end + raise_missing_variable_terminator(token, parse_context) + end + + def raise_missing_tag_terminator(token, parse_context) + raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_termination".freeze, token: token, tag_end: TagEnd.inspect)) + end + + def raise_missing_variable_terminator(token, parse_context) + raise SyntaxError.new(parse_context.locale.t("errors.syntax.variable_termination".freeze, token: token, tag_end: VariableEnd.inspect)) + end + + def registered_tags + Template.tags + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/condition.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/condition.rb new file mode 100644 index 0000000..9573f6b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/condition.rb @@ -0,0 +1,132 @@ +module Liquid + # Container for liquid nodes which conveniently wraps decision making logic + # + # Example: + # + # c = Condition.new(1, '==', 1) + # c.evaluate #=> true + # + class Condition #:nodoc: + @@operators = { + '=='.freeze => ->(cond, left, right) { cond.send(:equal_variables, left, right) }, + '!='.freeze => ->(cond, left, right) { !cond.send(:equal_variables, left, right) }, + '<>'.freeze => ->(cond, left, right) { !cond.send(:equal_variables, left, right) }, + '<'.freeze => :<, + '>'.freeze => :>, + '>='.freeze => :>=, + '<='.freeze => :<=, + 'contains'.freeze => lambda do |cond, left, right| + if left && right && left.respond_to?(:include?) + right = right.to_s if left.is_a?(String) + left.include?(right) + else + false + end + end + } + + def self.operators + @@operators + end + + attr_reader :attachment + attr_accessor :left, :operator, :right + + def initialize(left = nil, operator = nil, right = nil) + @left = left + @operator = operator + @right = right + @child_relation = nil + @child_condition = nil + end + + def evaluate(context = Context.new) + result = interpret_condition(left, right, operator, context) + + case @child_relation + when :or + result || @child_condition.evaluate(context) + when :and + result && @child_condition.evaluate(context) + else + result + end + end + + def or(condition) + @child_relation = :or + @child_condition = condition + end + + def and(condition) + @child_relation = :and + @child_condition = condition + end + + def attach(attachment) + @attachment = attachment + end + + def else? + false + end + + def inspect + "#" + end + + private + + def equal_variables(left, right) + if left.is_a?(Liquid::Expression::MethodLiteral) + if right.respond_to?(left.method_name) + return right.send(left.method_name) + else + return nil + end + end + + if right.is_a?(Liquid::Expression::MethodLiteral) + if left.respond_to?(right.method_name) + return left.send(right.method_name) + else + return nil + end + end + + left == right + end + + def interpret_condition(left, right, op, context) + # If the operator is empty this means that the decision statement is just + # a single variable. We can just poll this variable from the context and + # return this as the result. + return context.evaluate(left) if op.nil? + + left = context.evaluate(left) + right = context.evaluate(right) + + operation = self.class.operators[op] || raise(Liquid::ArgumentError.new("Unknown operator #{op}")) + + if operation.respond_to?(:call) + operation.call(self, left, right) + elsif left.respond_to?(operation) && right.respond_to?(operation) + begin + left.send(operation, right) + rescue ::ArgumentError => e + raise Liquid::ArgumentError.new(e.message) + end + end + end + end + + class ElseCondition < Condition + def else? + true + end + + def evaluate(_context) + true + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/context.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/context.rb new file mode 100644 index 0000000..6ba2353 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/context.rb @@ -0,0 +1,224 @@ +module Liquid + # Context keeps the variable stack and resolves variables, as well as keywords + # + # context['variable'] = 'testing' + # context['variable'] #=> 'testing' + # context['true'] #=> true + # context['10.2232'] #=> 10.2232 + # + # context.stack do + # context['bob'] = 'bobsen' + # end + # + # context['bob'] #=> nil class Context + class Context + attr_reader :scopes, :errors, :registers, :environments, :resource_limits + attr_accessor :exception_renderer, :template_name, :partial, :global_filter, :strict_variables, :strict_filters + + def initialize(environments = {}, outer_scope = {}, registers = {}, rethrow_errors = false, resource_limits = nil) + @environments = [environments].flatten + @scopes = [(outer_scope || {})] + @registers = registers + @errors = [] + @partial = false + @strict_variables = false + @resource_limits = resource_limits || ResourceLimits.new(Template.default_resource_limits) + squash_instance_assigns_with_environments + + @this_stack_used = false + + self.exception_renderer = Template.default_exception_renderer + if rethrow_errors + self.exception_renderer = ->(e) { raise } + end + + @interrupts = [] + @filters = [] + @global_filter = nil + end + + def warnings + @warnings ||= [] + end + + def strainer + @strainer ||= Strainer.create(self, @filters) + end + + # Adds filters to this context. + # + # Note that this does not register the filters with the main Template object. see Template.register_filter + # for that + def add_filters(filters) + filters = [filters].flatten.compact + @filters += filters + @strainer = nil + end + + def apply_global_filter(obj) + global_filter.nil? ? obj : global_filter.call(obj) + end + + # are there any not handled interrupts? + def interrupt? + !@interrupts.empty? + end + + # push an interrupt to the stack. this interrupt is considered not handled. + def push_interrupt(e) + @interrupts.push(e) + end + + # pop an interrupt from the stack + def pop_interrupt + @interrupts.pop + end + + def handle_error(e, line_number = nil, raw_token = nil) + e = internal_error unless e.is_a?(Liquid::Error) + e.template_name ||= template_name + e.line_number ||= line_number + errors.push(e) + exception_renderer.call(e).to_s + end + + def invoke(method, *args) + strainer.invoke(method, *args).to_liquid + end + + # Push new local scope on the stack. use Context#stack instead + def push(new_scope = {}) + @scopes.unshift(new_scope) + raise StackLevelError, "Nesting too deep".freeze if @scopes.length > 100 + end + + # Merge a hash of variables in the current local scope + def merge(new_scopes) + @scopes[0].merge!(new_scopes) + end + + # Pop from the stack. use Context#stack instead + def pop + raise ContextError if @scopes.size == 1 + @scopes.shift + end + + # Pushes a new local scope on the stack, pops it at the end of the block + # + # Example: + # context.stack do + # context['var'] = 'hi' + # end + # + # context['var] #=> nil + def stack(new_scope = nil) + old_stack_used = @this_stack_used + if new_scope + push(new_scope) + @this_stack_used = true + else + @this_stack_used = false + end + + yield + ensure + pop if @this_stack_used + @this_stack_used = old_stack_used + end + + def clear_instance_assigns + @scopes[0] = {} + end + + # Only allow String, Numeric, Hash, Array, Proc, Boolean or Liquid::Drop + def []=(key, value) + unless @this_stack_used + @this_stack_used = true + push({}) + end + @scopes[0][key] = value + end + + # Look up variable, either resolve directly after considering the name. We can directly handle + # Strings, digits, floats and booleans (true,false). + # If no match is made we lookup the variable in the current scope and + # later move up to the parent blocks to see if we can resolve the variable somewhere up the tree. + # Some special keywords return symbols. Those symbols are to be called on the rhs object in expressions + # + # Example: + # products == empty #=> products.empty? + def [](expression) + evaluate(Expression.parse(expression)) + end + + def key?(key) + self[key] != nil + end + + def evaluate(object) + object.respond_to?(:evaluate) ? object.evaluate(self) : object + end + + # Fetches an object starting at the local scope and then moving up the hierachy + def find_variable(key) + # This was changed from find() to find_index() because this is a very hot + # path and find_index() is optimized in MRI to reduce object allocation + index = @scopes.find_index { |s| s.key?(key) } + scope = @scopes[index] if index + + variable = nil + + if scope.nil? + @environments.each do |e| + variable = lookup_and_evaluate(e, key) + unless variable.nil? + scope = e + break + end + end + end + + scope ||= @environments.last || @scopes.last + variable ||= lookup_and_evaluate(scope, key) + + variable = variable.to_liquid + variable.context = self if variable.respond_to?(:context=) + + variable + end + + def lookup_and_evaluate(obj, key) + if @strict_variables && obj.respond_to?(:key?) && !obj.key?(key) + raise Liquid::UndefinedVariable, "undefined variable #{key}" + end + + value = obj[key] + + if value.is_a?(Proc) && obj.respond_to?(:[]=) + obj[key] = (value.arity == 0) ? value.call : value.call(self) + else + value + end + end + + private + + def internal_error + # raise and catch to set backtrace and cause on exception + raise Liquid::InternalError, 'internal' + rescue Liquid::InternalError => exc + exc + end + + def squash_instance_assigns_with_environments + @scopes.last.each_key do |k| + @environments.each do |env| + if env.key?(k) + scopes.last[k] = lookup_and_evaluate(env, k) + break + end + end + end + end # squash_instance_assigns_with_environments + end # Context +end # Liquid diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/document.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/document.rb new file mode 100644 index 0000000..d035dd4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/document.rb @@ -0,0 +1,27 @@ +module Liquid + class Document < BlockBody + def self.parse(tokens, parse_context) + doc = new + doc.parse(tokens, parse_context) + doc + end + + def parse(tokens, parse_context) + super do |end_tag_name, end_tag_params| + unknown_tag(end_tag_name, parse_context) if end_tag_name + end + rescue SyntaxError => e + e.line_number ||= parse_context.line_number + raise + end + + def unknown_tag(tag, parse_context) + case tag + when 'else'.freeze, 'end'.freeze + raise SyntaxError.new(parse_context.locale.t("errors.syntax.unexpected_outer_tag".freeze, tag: tag)) + else + raise SyntaxError.new(parse_context.locale.t("errors.syntax.unknown_tag".freeze, tag: tag)) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/drop.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/drop.rb new file mode 100644 index 0000000..6b5aa99 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/drop.rb @@ -0,0 +1,78 @@ +require 'set' + +module Liquid + # A drop in liquid is a class which allows you to export DOM like things to liquid. + # Methods of drops are callable. + # The main use for liquid drops is to implement lazy loaded objects. + # If you would like to make data available to the web designers which you don't want loaded unless needed then + # a drop is a great way to do that. + # + # Example: + # + # class ProductDrop < Liquid::Drop + # def top_sales + # Shop.current.products.find(:all, :order => 'sales', :limit => 10 ) + # end + # end + # + # tmpl = Liquid::Template.parse( ' {% for product in product.top_sales %} {{ product.name }} {%endfor%} ' ) + # tmpl.render('product' => ProductDrop.new ) # will invoke top_sales query. + # + # Your drop can either implement the methods sans any parameters + # or implement the liquid_method_missing(name) method which is a catch all. + class Drop + attr_writer :context + + # Catch all for the method + def liquid_method_missing(method) + return nil unless @context && @context.strict_variables + raise Liquid::UndefinedDropMethod, "undefined method #{method}" + end + + # called by liquid to invoke a drop + def invoke_drop(method_or_key) + if self.class.invokable?(method_or_key) + send(method_or_key) + else + liquid_method_missing(method_or_key) + end + end + + def key?(_name) + true + end + + def inspect + self.class.to_s + end + + def to_liquid + self + end + + def to_s + self.class.name + end + + alias_method :[], :invoke_drop + + # Check for method existence without invoking respond_to?, which creates symbols + def self.invokable?(method_name) + invokable_methods.include?(method_name.to_s) + end + + def self.invokable_methods + @invokable_methods ||= begin + blacklist = Liquid::Drop.public_instance_methods + [:each] + + if include?(Enumerable) + blacklist += Enumerable.public_instance_methods + blacklist -= [:sort, :count, :first, :min, :max, :include?] + end + + whitelist = [:to_liquid] + (public_instance_methods - blacklist) + Set.new(whitelist.map(&:to_s)) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/errors.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/errors.rb new file mode 100644 index 0000000..defa5ea --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/errors.rb @@ -0,0 +1,56 @@ +module Liquid + class Error < ::StandardError + attr_accessor :line_number + attr_accessor :template_name + attr_accessor :markup_context + + def to_s(with_prefix = true) + str = "" + str << message_prefix if with_prefix + str << super() + + if markup_context + str << " " + str << markup_context + end + + str + end + + private + + def message_prefix + str = "" + if is_a?(SyntaxError) + str << "Liquid syntax error" + else + str << "Liquid error" + end + + if line_number + str << " (" + str << template_name << " " if template_name + str << "line " << line_number.to_s << ")" + end + + str << ": " + str + end + end + + ArgumentError = Class.new(Error) + ContextError = Class.new(Error) + FileSystemError = Class.new(Error) + StandardError = Class.new(Error) + SyntaxError = Class.new(Error) + StackLevelError = Class.new(Error) + TaintedError = Class.new(Error) + MemoryError = Class.new(Error) + ZeroDivisionError = Class.new(Error) + FloatDomainError = Class.new(Error) + UndefinedVariable = Class.new(Error) + UndefinedDropMethod = Class.new(Error) + UndefinedFilter = Class.new(Error) + MethodOverrideError = Class.new(Error) + InternalError = Class.new(Error) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/expression.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/expression.rb new file mode 100644 index 0000000..1325ae5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/expression.rb @@ -0,0 +1,45 @@ +module Liquid + class Expression + class MethodLiteral + attr_reader :method_name, :to_s + + def initialize(method_name, to_s) + @method_name = method_name + @to_s = to_s + end + + def to_liquid + to_s + end + end + + LITERALS = { + nil => nil, 'nil'.freeze => nil, 'null'.freeze => nil, ''.freeze => nil, + 'true'.freeze => true, + 'false'.freeze => false, + 'blank'.freeze => MethodLiteral.new(:blank?, '').freeze, + 'empty'.freeze => MethodLiteral.new(:empty?, '').freeze + } + + def self.parse(markup) + if LITERALS.key?(markup) + LITERALS[markup] + else + case markup + when /\A'(.*)'\z/m # Single quoted strings + $1 + when /\A"(.*)"\z/m # Double quoted strings + $1 + when /\A(-?\d+)\z/ # Integer and floats + $1.to_i + when /\A\((\S+)\.\.(\S+)\)\z/ # Ranges + RangeLookup.parse($1, $2) + when /\A(-?\d[\d\.]+)\z/ # Floats + $1.to_f + else + VariableLookup.parse(markup) + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/extensions.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/extensions.rb new file mode 100644 index 0000000..d35bcea --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/extensions.rb @@ -0,0 +1,68 @@ +require 'time' +require 'date' + +class String # :nodoc: + def to_liquid + self + end +end + +class Array # :nodoc: + def to_liquid + self + end +end + +class Hash # :nodoc: + def to_liquid + self + end +end + +class Numeric # :nodoc: + def to_liquid + self + end +end + +class Range # :nodoc: + def to_liquid + self + end +end + +class Time # :nodoc: + def to_liquid + self + end +end + +class DateTime < Date # :nodoc: + def to_liquid + self + end +end + +class Date # :nodoc: + def to_liquid + self + end +end + +class TrueClass + def to_liquid # :nodoc: + self + end +end + +class FalseClass + def to_liquid # :nodoc: + self + end +end + +class NilClass + def to_liquid # :nodoc: + self + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/file_system.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/file_system.rb new file mode 100644 index 0000000..13f1f46 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/file_system.rb @@ -0,0 +1,73 @@ +module Liquid + # A Liquid file system is a way to let your templates retrieve other templates for use with the include tag. + # + # You can implement subclasses that retrieve templates from the database, from the file system using a different + # path structure, you can provide them as hard-coded inline strings, or any manner that you see fit. + # + # You can add additional instance variables, arguments, or methods as needed. + # + # Example: + # + # Liquid::Template.file_system = Liquid::LocalFileSystem.new(template_path) + # liquid = Liquid::Template.parse(template) + # + # This will parse the template with a LocalFileSystem implementation rooted at 'template_path'. + class BlankFileSystem + # Called by Liquid to retrieve a template file + def read_template_file(_template_path) + raise FileSystemError, "This liquid context does not allow includes." + end + end + + # This implements an abstract file system which retrieves template files named in a manner similar to Rails partials, + # ie. with the template name prefixed with an underscore. The extension ".liquid" is also added. + # + # For security reasons, template paths are only allowed to contain letters, numbers, and underscore. + # + # Example: + # + # file_system = Liquid::LocalFileSystem.new("/some/path") + # + # file_system.full_path("mypartial") # => "/some/path/_mypartial.liquid" + # file_system.full_path("dir/mypartial") # => "/some/path/dir/_mypartial.liquid" + # + # Optionally in the second argument you can specify a custom pattern for template filenames. + # The Kernel::sprintf format specification is used. + # Default pattern is "_%s.liquid". + # + # Example: + # + # file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html") + # + # file_system.full_path("index") # => "/some/path/index.html" + # + class LocalFileSystem + attr_accessor :root + + def initialize(root, pattern = "_%s.liquid".freeze) + @root = root + @pattern = pattern + end + + def read_template_file(template_path) + full_path = full_path(template_path) + raise FileSystemError, "No such template '#{template_path}'" unless File.exist?(full_path) + + File.read(full_path) + end + + def full_path(template_path) + raise FileSystemError, "Illegal template name '#{template_path}'" unless template_path =~ /\A[^.\/][a-zA-Z0-9_\/]+\z/ + + full_path = if template_path.include?('/'.freeze) + File.join(root, File.dirname(template_path), @pattern % File.basename(template_path)) + else + File.join(root, @pattern % template_path) + end + + raise FileSystemError, "Illegal template path '#{File.expand_path(full_path)}'" unless File.expand_path(full_path).start_with?(File.expand_path(root)) + + full_path + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/forloop_drop.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/forloop_drop.rb new file mode 100644 index 0000000..81b2d1a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/forloop_drop.rb @@ -0,0 +1,42 @@ +module Liquid + class ForloopDrop < Drop + def initialize(name, length, parentloop) + @name = name + @length = length + @parentloop = parentloop + @index = 0 + end + + attr_reader :name, :length, :parentloop + + def index + @index + 1 + end + + def index0 + @index + end + + def rindex + @length - @index + end + + def rindex0 + @length - @index - 1 + end + + def first + @index == 0 + end + + def last + @index == @length - 1 + end + + protected + + def increment! + @index += 1 + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/i18n.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/i18n.rb new file mode 100644 index 0000000..e998d58 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/i18n.rb @@ -0,0 +1,39 @@ +require 'yaml' + +module Liquid + class I18n + DEFAULT_LOCALE = File.join(File.expand_path(__dir__), "locales", "en.yml") + + TranslationError = Class.new(StandardError) + + attr_reader :path + + def initialize(path = DEFAULT_LOCALE) + @path = path + end + + def translate(name, vars = {}) + interpolate(deep_fetch_translation(name), vars) + end + alias_method :t, :translate + + def locale + @locale ||= YAML.load_file(@path) + end + + private + + def interpolate(name, vars) + name.gsub(/%\{(\w+)\}/) do + # raise TranslationError, "Undefined key #{$1} for interpolation in translation #{name}" unless vars[$1.to_sym] + "#{vars[$1.to_sym]}" + end + end + + def deep_fetch_translation(name) + name.split('.'.freeze).reduce(locale) do |level, cur| + level[cur] or raise TranslationError, "Translation for #{name} does not exist in locale #{path}" + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/interrupts.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/interrupts.rb new file mode 100644 index 0000000..41359d7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/interrupts.rb @@ -0,0 +1,16 @@ +module Liquid + # An interrupt is any command that breaks processing of a block (ex: a for loop). + class Interrupt + attr_reader :message + + def initialize(message = nil) + @message = message || "interrupt".freeze + end + end + + # Interrupt that is thrown whenever a {% break %} is called. + class BreakInterrupt < Interrupt; end + + # Interrupt that is thrown whenever a {% continue %} is called. + class ContinueInterrupt < Interrupt; end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/lexer.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/lexer.rb new file mode 100644 index 0000000..b9f2422 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/lexer.rb @@ -0,0 +1,53 @@ +require "strscan" +module Liquid + class Lexer + SPECIALS = { + '|'.freeze => :pipe, + '.'.freeze => :dot, + ':'.freeze => :colon, + ','.freeze => :comma, + '['.freeze => :open_square, + ']'.freeze => :close_square, + '('.freeze => :open_round, + ')'.freeze => :close_round, + '?'.freeze => :question, + '-'.freeze => :dash + } + IDENTIFIER = /[a-zA-Z_][\w-]*\??/ + SINGLE_STRING_LITERAL = /'[^\']*'/ + DOUBLE_STRING_LITERAL = /"[^\"]*"/ + NUMBER_LITERAL = /-?\d+(\.\d+)?/ + DOTDOT = /\.\./ + COMPARISON_OPERATOR = /==|!=|<>|<=?|>=?|contains/ + + def initialize(input) + @ss = StringScanner.new(input.rstrip) + end + + def tokenize + @output = [] + + until @ss.eos? + @ss.skip(/\s*/) + tok = case + when t = @ss.scan(COMPARISON_OPERATOR) then [:comparison, t] + when t = @ss.scan(SINGLE_STRING_LITERAL) then [:string, t] + when t = @ss.scan(DOUBLE_STRING_LITERAL) then [:string, t] + when t = @ss.scan(NUMBER_LITERAL) then [:number, t] + when t = @ss.scan(IDENTIFIER) then [:id, t] + when t = @ss.scan(DOTDOT) then [:dotdot, t] + else + c = @ss.getch + if s = SPECIALS[c] + [s, c] + else + raise SyntaxError, "Unexpected character #{c}" + end + end + @output << tok + end + + @output << [:end_of_string] + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/locales/en.yml b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/locales/en.yml new file mode 100644 index 0000000..9a259bf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/locales/en.yml @@ -0,0 +1,26 @@ +--- + errors: + syntax: + tag_unexpected_args: "Syntax Error in '%{tag}' - Valid syntax: %{tag}" + assign: "Syntax Error in 'assign' - Valid syntax: assign [var] = [source]" + capture: "Syntax Error in 'capture' - Valid syntax: capture [var]" + case: "Syntax Error in 'case' - Valid syntax: case [condition]" + case_invalid_when: "Syntax Error in tag 'case' - Valid when condition: {% when [condition] [or condition2...] %}" + case_invalid_else: "Syntax Error in tag 'case' - Valid else condition: {% else %} (no parameters) " + cycle: "Syntax Error in 'cycle' - Valid syntax: cycle [name :] var [, var2, var3 ...]" + for: "Syntax Error in 'for loop' - Valid syntax: for [item] in [collection]" + for_invalid_in: "For loops require an 'in' clause" + for_invalid_attribute: "Invalid attribute in for loop. Valid attributes are limit and offset" + if: "Syntax Error in tag 'if' - Valid syntax: if [expression]" + include: "Error in tag 'include' - Valid syntax: include '[template]' (with|for) [object|collection]" + unknown_tag: "Unknown tag '%{tag}'" + invalid_delimiter: "'end' is not a valid delimiter for %{block_name} tags. use %{block_delimiter}" + unexpected_else: "%{block_name} tag does not expect 'else' tag" + unexpected_outer_tag: "Unexpected outer '%{tag}' tag" + tag_termination: "Tag '%{token}' was not properly terminated with regexp: %{tag_end}" + variable_termination: "Variable '%{token}' was not properly terminated with regexp: %{tag_end}" + tag_never_closed: "'%{block_name}' tag was never closed" + meta_syntax_error: "Liquid syntax error: #{e.message}" + table_row: "Syntax Error in 'table_row loop' - Valid syntax: table_row [item] in [collection] cols=3" + argument: + include: "Argument error in tag 'include' - Illegal template name" diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parse_context.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parse_context.rb new file mode 100644 index 0000000..34986dd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parse_context.rb @@ -0,0 +1,37 @@ +module Liquid + class ParseContext + attr_accessor :locale, :line_number, :trim_whitespace + attr_reader :partial, :warnings, :error_mode + + def initialize(options = {}) + @template_options = options ? options.dup : {} + @locale = @template_options[:locale] ||= I18n.new + @warnings = [] + self.partial = false + end + + def [](option_key) + @options[option_key] + end + + def partial=(value) + @partial = value + @options = value ? partial_options : @template_options + @error_mode = @options[:error_mode] || Template.error_mode + value + end + + def partial_options + @partial_options ||= begin + dont_pass = @template_options[:include_options_blacklist] + if dont_pass == true + { locale: locale } + elsif dont_pass.is_a?(Array) + @template_options.reject { |k, v| dont_pass.include?(k) } + else + @template_options + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parser.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parser.rb new file mode 100644 index 0000000..6954343 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parser.rb @@ -0,0 +1,90 @@ +module Liquid + class Parser + def initialize(input) + l = Lexer.new(input) + @tokens = l.tokenize + @p = 0 # pointer to current location + end + + def jump(point) + @p = point + end + + def consume(type = nil) + token = @tokens[@p] + if type && token[0] != type + raise SyntaxError, "Expected #{type} but found #{@tokens[@p].first}" + end + @p += 1 + token[1] + end + + # Only consumes the token if it matches the type + # Returns the token's contents if it was consumed + # or false otherwise. + def consume?(type) + token = @tokens[@p] + return false unless token && token[0] == type + @p += 1 + token[1] + end + + # Like consume? Except for an :id token of a certain name + def id?(str) + token = @tokens[@p] + return false unless token && token[0] == :id + return false unless token[1] == str + @p += 1 + token[1] + end + + def look(type, ahead = 0) + tok = @tokens[@p + ahead] + return false unless tok + tok[0] == type + end + + def expression + token = @tokens[@p] + if token[0] == :id + variable_signature + elsif [:string, :number].include? token[0] + consume + elsif token.first == :open_round + consume + first = expression + consume(:dotdot) + last = expression + consume(:close_round) + "(#{first}..#{last})" + else + raise SyntaxError, "#{token} is not a valid expression" + end + end + + def argument + str = "" + # might be a keyword argument (identifier: expression) + if look(:id) && look(:colon, 1) + str << consume << consume << ' '.freeze + end + + str << expression + str + end + + def variable_signature + str = consume(:id) + while look(:open_square) + str << consume + str << expression + str << consume(:close_square) + end + if look(:dot) + str << consume + str << variable_signature + end + str + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parser_switching.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parser_switching.rb new file mode 100644 index 0000000..3aa664a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/parser_switching.rb @@ -0,0 +1,31 @@ +module Liquid + module ParserSwitching + def parse_with_selected_parser(markup) + case parse_context.error_mode + when :strict then strict_parse_with_error_context(markup) + when :lax then lax_parse(markup) + when :warn + begin + return strict_parse_with_error_context(markup) + rescue SyntaxError => e + parse_context.warnings << e + return lax_parse(markup) + end + end + end + + private + + def strict_parse_with_error_context(markup) + strict_parse(markup) + rescue SyntaxError => e + e.line_number = line_number + e.markup_context = markup_context(markup) + raise e + end + + def markup_context(markup) + "in \"#{markup.strip}\"" + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/profiler.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/profiler.rb new file mode 100644 index 0000000..dc9db60 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/profiler.rb @@ -0,0 +1,158 @@ +require 'liquid/profiler/hooks' + +module Liquid + # Profiler enables support for profiling template rendering to help track down performance issues. + # + # To enable profiling, first require 'liquid/profiler'. + # Then, to profile a parse/render cycle, pass the profile: true option to Liquid::Template.parse. + # After Liquid::Template#render is called, the template object makes available an instance of this + # class via the Liquid::Template#profiler method. + # + # template = Liquid::Template.parse(template_content, profile: true) + # output = template.render + # profile = template.profiler + # + # This object contains all profiling information, containing information on what tags were rendered, + # where in the templates these tags live, and how long each tag took to render. + # + # This is a tree structure that is Enumerable all the way down, and keeps track of tags and rendering times + # inside of {% include %} tags. + # + # profile.each do |node| + # # Access to the node itself + # node.code + # + # # Which template and line number of this node. + # # If top level, this will be "". + # node.partial + # node.line_number + # + # # Render time in seconds of this node + # node.render_time + # + # # If the template used {% include %}, this node will also have children. + # node.children.each do |child2| + # # ... + # end + # end + # + # Profiler also exposes the total time of the template's render in Liquid::Profiler#total_render_time. + # + # All render times are in seconds. There is a small performance hit when profiling is enabled. + # + class Profiler + include Enumerable + + class Timing + attr_reader :code, :partial, :line_number, :children + + def initialize(node, partial) + @code = node.respond_to?(:raw) ? node.raw : node + @partial = partial + @line_number = node.respond_to?(:line_number) ? node.line_number : nil + @children = [] + end + + def self.start(node, partial) + new(node, partial).tap(&:start) + end + + def start + @start_time = Time.now + end + + def finish + @end_time = Time.now + end + + def render_time + @end_time - @start_time + end + end + + def self.profile_node_render(node) + if Profiler.current_profile && node.respond_to?(:render) + Profiler.current_profile.start_node(node) + output = yield + Profiler.current_profile.end_node(node) + output + else + yield + end + end + + def self.profile_children(template_name) + if Profiler.current_profile + Profiler.current_profile.push_partial(template_name) + output = yield + Profiler.current_profile.pop_partial + output + else + yield + end + end + + def self.current_profile + Thread.current[:liquid_profiler] + end + + def initialize + @partial_stack = [""] + + @root_timing = Timing.new("", current_partial) + @timing_stack = [@root_timing] + + @render_start_at = Time.now + @render_end_at = @render_start_at + end + + def start + Thread.current[:liquid_profiler] = self + @render_start_at = Time.now + end + + def stop + Thread.current[:liquid_profiler] = nil + @render_end_at = Time.now + end + + def total_render_time + @render_end_at - @render_start_at + end + + def each(&block) + @root_timing.children.each(&block) + end + + def [](idx) + @root_timing.children[idx] + end + + def length + @root_timing.children.length + end + + def start_node(node) + @timing_stack.push(Timing.start(node, current_partial)) + end + + def end_node(_node) + timing = @timing_stack.pop + timing.finish + + @timing_stack.last.children << timing + end + + def current_partial + @partial_stack.last + end + + def push_partial(partial_name) + @partial_stack.push(partial_name) + end + + def pop_partial + @partial_stack.pop + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/profiler/hooks.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/profiler/hooks.rb new file mode 100644 index 0000000..6f8d798 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/profiler/hooks.rb @@ -0,0 +1,23 @@ +module Liquid + class BlockBody + def render_node_with_profiling(node, context) + Profiler.profile_node_render(node) do + render_node_without_profiling(node, context) + end + end + + alias_method :render_node_without_profiling, :render_node + alias_method :render_node, :render_node_with_profiling + end + + class Include < Tag + def render_with_profiling(context) + Profiler.profile_children(context.evaluate(@template_name_expr).to_s) do + render_without_profiling(context) + end + end + + alias_method :render_without_profiling, :render + alias_method :render, :render_with_profiling + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/range_lookup.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/range_lookup.rb new file mode 100644 index 0000000..93bb420 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/range_lookup.rb @@ -0,0 +1,37 @@ +module Liquid + class RangeLookup + def self.parse(start_markup, end_markup) + start_obj = Expression.parse(start_markup) + end_obj = Expression.parse(end_markup) + if start_obj.respond_to?(:evaluate) || end_obj.respond_to?(:evaluate) + new(start_obj, end_obj) + else + start_obj.to_i..end_obj.to_i + end + end + + def initialize(start_obj, end_obj) + @start_obj = start_obj + @end_obj = end_obj + end + + def evaluate(context) + start_int = to_integer(context.evaluate(@start_obj)) + end_int = to_integer(context.evaluate(@end_obj)) + start_int..end_int + end + + private + + def to_integer(input) + case input + when Integer + input + when NilClass, String + input.to_i + else + Utils.to_integer(input) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/resource_limits.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/resource_limits.rb new file mode 100644 index 0000000..08b359b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/resource_limits.rb @@ -0,0 +1,23 @@ +module Liquid + class ResourceLimits + attr_accessor :render_length, :render_score, :assign_score, + :render_length_limit, :render_score_limit, :assign_score_limit + + def initialize(limits) + @render_length_limit = limits[:render_length_limit] + @render_score_limit = limits[:render_score_limit] + @assign_score_limit = limits[:assign_score_limit] + reset + end + + def reached? + (@render_length_limit && @render_length > @render_length_limit) || + (@render_score_limit && @render_score > @render_score_limit) || + (@assign_score_limit && @assign_score > @assign_score_limit) + end + + def reset + @render_length = @render_score = @assign_score = 0 + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/standardfilters.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/standardfilters.rb new file mode 100644 index 0000000..bb56f4c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/standardfilters.rb @@ -0,0 +1,420 @@ +require 'cgi' +require 'bigdecimal' + +module Liquid + module StandardFilters + HTML_ESCAPE = { + '&'.freeze => '&'.freeze, + '>'.freeze => '>'.freeze, + '<'.freeze => '<'.freeze, + '"'.freeze => '"'.freeze, + "'".freeze => '''.freeze + } + HTML_ESCAPE_ONCE_REGEXP = /["><']|&(?!([a-zA-Z]+|(#\d+));)/ + + # Return the size of an array or of an string + def size(input) + input.respond_to?(:size) ? input.size : 0 + end + + # convert an input string to DOWNCASE + def downcase(input) + input.to_s.downcase + end + + # convert an input string to UPCASE + def upcase(input) + input.to_s.upcase + end + + # capitalize words in the input centence + def capitalize(input) + input.to_s.capitalize + end + + def escape(input) + CGI.escapeHTML(input).untaint unless input.nil? + end + alias_method :h, :escape + + def escape_once(input) + input.to_s.gsub(HTML_ESCAPE_ONCE_REGEXP, HTML_ESCAPE) + end + + def url_encode(input) + CGI.escape(input) unless input.nil? + end + + def url_decode(input) + CGI.unescape(input) unless input.nil? + end + + def slice(input, offset, length = nil) + offset = Utils.to_integer(offset) + length = length ? Utils.to_integer(length) : 1 + + if input.is_a?(Array) + input.slice(offset, length) || [] + else + input.to_s.slice(offset, length) || '' + end + end + + # Truncate a string down to x characters + def truncate(input, length = 50, truncate_string = "...".freeze) + return if input.nil? + input_str = input.to_s + length = Utils.to_integer(length) + truncate_string_str = truncate_string.to_s + l = length - truncate_string_str.length + l = 0 if l < 0 + input_str.length > length ? input_str[0...l] + truncate_string_str : input_str + end + + def truncatewords(input, words = 15, truncate_string = "...".freeze) + return if input.nil? + wordlist = input.to_s.split + words = Utils.to_integer(words) + l = words - 1 + l = 0 if l < 0 + wordlist.length > l ? wordlist[0..l].join(" ".freeze) + truncate_string.to_s : input + end + + # Split input string into an array of substrings separated by given pattern. + # + # Example: + #
      {{ post | split '//' | first }}
      + # + def split(input, pattern) + input.to_s.split(pattern.to_s) + end + + def strip(input) + input.to_s.strip + end + + def lstrip(input) + input.to_s.lstrip + end + + def rstrip(input) + input.to_s.rstrip + end + + def strip_html(input) + empty = ''.freeze + input.to_s.gsub(//m, empty).gsub(//m, empty).gsub(//m, empty).gsub(/<.*?>/m, empty) + end + + # Remove all newlines from the string + def strip_newlines(input) + input.to_s.gsub(/\r?\n/, ''.freeze) + end + + # Join elements of the array with certain character between them + def join(input, glue = ' '.freeze) + InputIterator.new(input).join(glue) + end + + # Sort elements of the array + # provide optional property with which to sort an array of hashes or drops + def sort(input, property = nil) + ary = InputIterator.new(input) + if property.nil? + ary.sort + elsif ary.empty? # The next two cases assume a non-empty array. + [] + elsif ary.first.respond_to?(:[]) && !ary.first[property].nil? + ary.sort do |a, b| + a = a[property] + b = b[property] + if a && b + a <=> b + else + a ? -1 : 1 + end + end + end + end + + # Sort elements of an array ignoring case if strings + # provide optional property with which to sort an array of hashes or drops + def sort_natural(input, property = nil) + ary = InputIterator.new(input) + + if property.nil? + ary.sort { |a, b| a.casecmp(b) } + elsif ary.empty? # The next two cases assume a non-empty array. + [] + elsif ary.first.respond_to?(:[]) && !ary.first[property].nil? + ary.sort { |a, b| a[property].casecmp(b[property]) } + end + end + + # Remove duplicate elements from an array + # provide optional property with which to determine uniqueness + def uniq(input, property = nil) + ary = InputIterator.new(input) + + if property.nil? + ary.uniq + elsif ary.empty? # The next two cases assume a non-empty array. + [] + elsif ary.first.respond_to?(:[]) + ary.uniq{ |a| a[property] } + end + end + + # Reverse the elements of an array + def reverse(input) + ary = InputIterator.new(input) + ary.reverse + end + + # map/collect on a given property + def map(input, property) + InputIterator.new(input).map do |e| + e = e.call if e.is_a?(Proc) + + if property == "to_liquid".freeze + e + elsif e.respond_to?(:[]) + r = e[property] + r.is_a?(Proc) ? r.call : r + end + end + end + + # Remove nils within an array + # provide optional property with which to check for nil + def compact(input, property = nil) + ary = InputIterator.new(input) + + if property.nil? + ary.compact + elsif ary.empty? # The next two cases assume a non-empty array. + [] + elsif ary.first.respond_to?(:[]) + ary.reject{ |a| a[property].nil? } + end + end + + # Replace occurrences of a string with another + def replace(input, string, replacement = ''.freeze) + input.to_s.gsub(string.to_s, replacement.to_s) + end + + # Replace the first occurrences of a string with another + def replace_first(input, string, replacement = ''.freeze) + input.to_s.sub(string.to_s, replacement.to_s) + end + + # remove a substring + def remove(input, string) + input.to_s.gsub(string.to_s, ''.freeze) + end + + # remove the first occurrences of a substring + def remove_first(input, string) + input.to_s.sub(string.to_s, ''.freeze) + end + + # add one string to another + def append(input, string) + input.to_s + string.to_s + end + + def concat(input, array) + unless array.respond_to?(:to_ary) + raise ArgumentError.new("concat filter requires an array argument") + end + InputIterator.new(input).concat(array) + end + + # prepend a string to another + def prepend(input, string) + string.to_s + input.to_s + end + + # Add
      tags in front of all newlines in input string + def newline_to_br(input) + input.to_s.gsub(/\n/, "
      \n".freeze) + end + + # Reformat a date using Ruby's core Time#strftime( string ) -> string + # + # %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 - Number of seconds since 1970-01-01 00:00:00 UTC. + # %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 + # + # See also: http://www.ruby-doc.org/core/Time.html#method-i-strftime + def date(input, format) + return input if format.to_s.empty? + + return input unless date = Utils.to_date(input) + + date.strftime(format.to_s) + end + + # Get the first element of the passed in array + # + # Example: + # {{ product.images | first | to_img }} + # + def first(array) + array.first if array.respond_to?(:first) + end + + # Get the last element of the passed in array + # + # Example: + # {{ product.images | last | to_img }} + # + def last(array) + array.last if array.respond_to?(:last) + end + + # absolute value + def abs(input) + result = Utils.to_number(input).abs + result.is_a?(BigDecimal) ? result.to_f : result + end + + # addition + def plus(input, operand) + apply_operation(input, operand, :+) + end + + # subtraction + def minus(input, operand) + apply_operation(input, operand, :-) + end + + # multiplication + def times(input, operand) + apply_operation(input, operand, :*) + end + + # division + def divided_by(input, operand) + apply_operation(input, operand, :/) + rescue ::ZeroDivisionError => e + raise Liquid::ZeroDivisionError, e.message + end + + def modulo(input, operand) + apply_operation(input, operand, :%) + rescue ::ZeroDivisionError => e + raise Liquid::ZeroDivisionError, e.message + end + + def round(input, n = 0) + result = Utils.to_number(input).round(Utils.to_number(n)) + result = result.to_f if result.is_a?(BigDecimal) + result = result.to_i if n == 0 + result + rescue ::FloatDomainError => e + raise Liquid::FloatDomainError, e.message + end + + def ceil(input) + Utils.to_number(input).ceil.to_i + rescue ::FloatDomainError => e + raise Liquid::FloatDomainError, e.message + end + + def floor(input) + Utils.to_number(input).floor.to_i + rescue ::FloatDomainError => e + raise Liquid::FloatDomainError, e.message + end + + def default(input, default_value = ''.freeze) + if !input || input.respond_to?(:empty?) && input.empty? + default_value + else + input + end + end + + private + + def apply_operation(input, operand, operation) + result = Utils.to_number(input).send(operation, Utils.to_number(operand)) + result.is_a?(BigDecimal) ? result.to_f : result + end + + class InputIterator + include Enumerable + + def initialize(input) + @input = if input.is_a?(Array) + input.flatten + elsif input.is_a?(Hash) + [input] + elsif input.is_a?(Enumerable) + input + else + Array(input) + end + end + + def join(glue) + to_a.join(glue) + end + + def concat(args) + to_a.concat(args) + end + + def reverse + reverse_each.to_a + end + + def uniq(&block) + to_a.uniq(&block) + end + + def compact + to_a.compact + end + + def empty? + @input.each { return false } + true + end + + def each + @input.each do |e| + yield(e.respond_to?(:to_liquid) ? e.to_liquid : e) + end + end + end + end + + Template.register_filter(StandardFilters) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/strainer.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/strainer.rb new file mode 100644 index 0000000..99a9c29 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/strainer.rb @@ -0,0 +1,66 @@ +require 'set' + +module Liquid + # Strainer is the parent class for the filters system. + # New filters are mixed into the strainer class which is then instantiated for each liquid template render run. + # + # The Strainer only allows method calls defined in filters given to it via Strainer.global_filter, + # Context#add_filters or Template.register_filter + class Strainer #:nodoc: + @@global_strainer = Class.new(Strainer) do + @filter_methods = Set.new + end + @@strainer_class_cache = Hash.new do |hash, filters| + hash[filters] = Class.new(@@global_strainer) do + @filter_methods = @@global_strainer.filter_methods.dup + filters.each { |f| add_filter(f) } + end + end + + def initialize(context) + @context = context + end + + class << self + attr_reader :filter_methods + end + + def self.add_filter(filter) + raise ArgumentError, "Expected module but got: #{filter.class}" unless filter.is_a?(Module) + unless self.class.include?(filter) + invokable_non_public_methods = (filter.private_instance_methods + filter.protected_instance_methods).select { |m| invokable?(m) } + if invokable_non_public_methods.any? + raise MethodOverrideError, "Filter overrides registered public methods as non public: #{invokable_non_public_methods.join(', ')}" + else + send(:include, filter) + @filter_methods.merge(filter.public_instance_methods.map(&:to_s)) + end + end + end + + def self.global_filter(filter) + @@strainer_class_cache.clear + @@global_strainer.add_filter(filter) + end + + def self.invokable?(method) + @filter_methods.include?(method.to_s) + end + + def self.create(context, filters = []) + @@strainer_class_cache[filters].new(context) + end + + def invoke(method, *args) + if self.class.invokable?(method) + send(method, *args) + elsif @context && @context.strict_filters + raise Liquid::UndefinedFilter, "undefined filter #{method}" + else + args.first + end + rescue ::ArgumentError => e + raise Liquid::ArgumentError, e.message, e.backtrace + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tablerowloop_drop.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tablerowloop_drop.rb new file mode 100644 index 0000000..cda4a1e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tablerowloop_drop.rb @@ -0,0 +1,62 @@ +module Liquid + class TablerowloopDrop < Drop + def initialize(length, cols) + @length = length + @row = 1 + @col = 1 + @cols = cols + @index = 0 + end + + attr_reader :length, :col, :row + + def index + @index + 1 + end + + def index0 + @index + end + + def col0 + @col - 1 + end + + def rindex + @length - @index + end + + def rindex0 + @length - @index - 1 + end + + def first + @index == 0 + end + + def last + @index == @length - 1 + end + + def col_first + @col == 1 + end + + def col_last + @col == @cols + end + + protected + + def increment! + @index += 1 + + if @col == @cols + @col = 1 + @row += 1 + else + @col += 1 + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tag.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tag.rb new file mode 100644 index 0000000..06970c1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tag.rb @@ -0,0 +1,43 @@ +module Liquid + class Tag + attr_reader :nodelist, :tag_name, :line_number, :parse_context + alias_method :options, :parse_context + include ParserSwitching + + class << self + def parse(tag_name, markup, tokenizer, options) + tag = new(tag_name, markup, options) + tag.parse(tokenizer) + tag + end + + private :new + end + + def initialize(tag_name, markup, parse_context) + @tag_name = tag_name + @markup = markup + @parse_context = parse_context + @line_number = parse_context.line_number + end + + def parse(_tokens) + end + + def raw + "#{@tag_name} #{@markup}" + end + + def name + self.class.name.downcase + end + + def render(_context) + ''.freeze + end + + def blank? + false + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/assign.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/assign.rb new file mode 100644 index 0000000..f6cd5fa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/assign.rb @@ -0,0 +1,51 @@ +module Liquid + # Assign sets a variable in your template. + # + # {% assign foo = 'monkey' %} + # + # You can then use the variable later in the page. + # + # {{ foo }} + # + class Assign < Tag + Syntax = /(#{VariableSignature}+)\s*=\s*(.*)\s*/om + + def initialize(tag_name, markup, options) + super + if markup =~ Syntax + @to = $1 + @from = Variable.new($2, options) + else + raise SyntaxError.new options[:locale].t("errors.syntax.assign".freeze) + end + end + + def render(context) + val = @from.render(context) + context.scopes.last[@to] = val + context.resource_limits.assign_score += assign_score_of(val) + ''.freeze + end + + def blank? + true + end + + private + + def assign_score_of(val) + if val.instance_of?(String) + val.length + elsif val.instance_of?(Array) || val.instance_of?(Hash) + sum = 1 + # Uses #each to avoid extra allocations. + val.each { |child| sum += assign_score_of(child) } + sum + else + 1 + end + end + end + + Template.register_tag('assign'.freeze, Assign) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/break.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/break.rb new file mode 100644 index 0000000..6fe0969 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/break.rb @@ -0,0 +1,18 @@ +module Liquid + # Break tag to be used to break out of a for loop. + # + # == Basic Usage: + # {% for item in collection %} + # {% if item.condition %} + # {% break %} + # {% endif %} + # {% endfor %} + # + class Break < Tag + def interrupt + BreakInterrupt.new + end + end + + Template.register_tag('break'.freeze, Break) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/capture.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/capture.rb new file mode 100644 index 0000000..8674356 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/capture.rb @@ -0,0 +1,38 @@ +module Liquid + # Capture stores the result of a block into a variable without rendering it inplace. + # + # {% capture heading %} + # Monkeys! + # {% endcapture %} + # ... + #

      {{ heading }}

      + # + # Capture is useful for saving content for use later in your template, such as + # in a sidebar or footer. + # + class Capture < Block + Syntax = /(#{VariableSignature}+)/o + + def initialize(tag_name, markup, options) + super + if markup =~ Syntax + @to = $1 + else + raise SyntaxError.new(options[:locale].t("errors.syntax.capture")) + end + end + + def render(context) + output = super + context.scopes.last[@to] = output + context.resource_limits.assign_score += output.length + ''.freeze + end + + def blank? + true + end + end + + Template.register_tag('capture'.freeze, Capture) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/case.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/case.rb new file mode 100644 index 0000000..453b4d6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/case.rb @@ -0,0 +1,86 @@ +module Liquid + class Case < Block + Syntax = /(#{QuotedFragment})/o + WhenSyntax = /(#{QuotedFragment})(?:(?:\s+or\s+|\s*\,\s*)(#{QuotedFragment}.*))?/om + + def initialize(tag_name, markup, options) + super + @blocks = [] + + if markup =~ Syntax + @left = Expression.parse($1) + else + raise SyntaxError.new(options[:locale].t("errors.syntax.case".freeze)) + end + end + + def parse(tokens) + body = BlockBody.new + while parse_body(body, tokens) + body = @blocks.last.attachment + end + end + + def nodelist + @blocks.map(&:attachment) + end + + def unknown_tag(tag, markup, tokens) + case tag + when 'when'.freeze + record_when_condition(markup) + when 'else'.freeze + record_else_condition(markup) + else + super + end + end + + def render(context) + context.stack do + execute_else_block = true + + output = '' + @blocks.each do |block| + if block.else? + return block.attachment.render(context) if execute_else_block + elsif block.evaluate(context) + execute_else_block = false + output << block.attachment.render(context) + end + end + output + end + end + + private + + def record_when_condition(markup) + body = BlockBody.new + + while markup + unless markup =~ WhenSyntax + raise SyntaxError.new(options[:locale].t("errors.syntax.case_invalid_when".freeze)) + end + + markup = $2 + + block = Condition.new(@left, '=='.freeze, Expression.parse($1)) + block.attach(body) + @blocks << block + end + end + + def record_else_condition(markup) + unless markup.strip.empty? + raise SyntaxError.new(options[:locale].t("errors.syntax.case_invalid_else".freeze)) + end + + block = ElseCondition.new + block.attach(BlockBody.new) + @blocks << block + end + end + + Template.register_tag('case'.freeze, Case) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/comment.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/comment.rb new file mode 100644 index 0000000..c57c9cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/comment.rb @@ -0,0 +1,16 @@ +module Liquid + class Comment < Block + def render(_context) + ''.freeze + end + + def unknown_tag(_tag, _markup, _tokens) + end + + def blank? + true + end + end + + Template.register_tag('comment'.freeze, Comment) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/continue.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/continue.rb new file mode 100644 index 0000000..9c81ec2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/continue.rb @@ -0,0 +1,18 @@ +module Liquid + # Continue tag to be used to break out of a for loop. + # + # == Basic Usage: + # {% for item in collection %} + # {% if item.condition %} + # {% continue %} + # {% endif %} + # {% endfor %} + # + class Continue < Tag + def interrupt + ContinueInterrupt.new + end + end + + Template.register_tag('continue'.freeze, Continue) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/cycle.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/cycle.rb new file mode 100644 index 0000000..345b988 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/cycle.rb @@ -0,0 +1,57 @@ +module Liquid + # Cycle is usually used within a loop to alternate between values, like colors or DOM classes. + # + # {% for item in items %} + #
      {{ item }}
      + # {% end %} + # + #
      Item one
      + #
      Item two
      + #
      Item three
      + #
      Item four
      + #
      Item five
      + # + class Cycle < Tag + SimpleSyntax = /\A#{QuotedFragment}+/o + NamedSyntax = /\A(#{QuotedFragment})\s*\:\s*(.*)/om + + def initialize(tag_name, markup, options) + super + case markup + when NamedSyntax + @variables = variables_from_string($2) + @name = Expression.parse($1) + when SimpleSyntax + @variables = variables_from_string(markup) + @name = @variables.to_s + else + raise SyntaxError.new(options[:locale].t("errors.syntax.cycle".freeze)) + end + end + + def render(context) + context.registers[:cycle] ||= Hash.new(0) + + context.stack do + key = context.evaluate(@name) + iteration = context.registers[:cycle][key] + result = context.evaluate(@variables[iteration]) + iteration += 1 + iteration = 0 if iteration >= @variables.size + context.registers[:cycle][key] = iteration + result + end + end + + private + + def variables_from_string(markup) + markup.split(',').collect do |var| + var =~ /\s*(#{QuotedFragment})\s*/o + $1 ? Expression.parse($1) : nil + end.compact + end + end + + Template.register_tag('cycle', Cycle) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/decrement.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/decrement.rb new file mode 100644 index 0000000..b5cdaaa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/decrement.rb @@ -0,0 +1,35 @@ +module Liquid + # decrement is used in a place where one needs to insert a counter + # into a template, and needs the counter to survive across + # multiple instantiations of the template. + # NOTE: decrement is a pre-decrement, --i, + # while increment is post: i++. + # + # (To achieve the survival, the application must keep the context) + # + # if the variable does not exist, it is created with value 0. + + # Hello: {% decrement variable %} + # + # gives you: + # + # Hello: -1 + # Hello: -2 + # Hello: -3 + # + class Decrement < Tag + def initialize(tag_name, markup, options) + super + @variable = markup.strip + end + + def render(context) + value = context.environments.first[@variable] ||= 0 + value -= 1 + context.environments.first[@variable] = value + value.to_s + end + end + + Template.register_tag('decrement'.freeze, Decrement) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/for.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/for.rb new file mode 100644 index 0000000..55011b3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/for.rb @@ -0,0 +1,195 @@ +module Liquid + # "For" iterates over an array or collection. + # Several useful variables are available to you within the loop. + # + # == Basic usage: + # {% for item in collection %} + # {{ forloop.index }}: {{ item.name }} + # {% endfor %} + # + # == Advanced usage: + # {% for item in collection %} + #
      + # Item {{ forloop.index }}: {{ item.name }} + #
      + # {% else %} + # There is nothing in the collection. + # {% endfor %} + # + # You can also define a limit and offset much like SQL. Remember + # that offset starts at 0 for the first item. + # + # {% for item in collection limit:5 offset:10 %} + # {{ item.name }} + # {% end %} + # + # To reverse the for loop simply use {% for item in collection reversed %} + # + # == Available variables: + # + # forloop.name:: 'item-collection' + # forloop.length:: Length of the loop + # forloop.index:: The current item's position in the collection; + # forloop.index starts at 1. + # This is helpful for non-programmers who start believe + # the first item in an array is 1, not 0. + # forloop.index0:: The current item's position in the collection + # where the first item is 0 + # forloop.rindex:: Number of items remaining in the loop + # (length - index) where 1 is the last item. + # forloop.rindex0:: Number of items remaining in the loop + # where 0 is the last item. + # forloop.first:: Returns true if the item is the first item. + # forloop.last:: Returns true if the item is the last item. + # forloop.parentloop:: Provides access to the parent loop, if present. + # + class For < Block + Syntax = /\A(#{VariableSegment}+)\s+in\s+(#{QuotedFragment}+)\s*(reversed)?/o + + def initialize(tag_name, markup, options) + super + @from = @limit = nil + parse_with_selected_parser(markup) + @for_block = BlockBody.new + @else_block = nil + end + + def parse(tokens) + return unless parse_body(@for_block, tokens) + parse_body(@else_block, tokens) + end + + def nodelist + @else_block ? [@for_block, @else_block] : [@for_block] + end + + def unknown_tag(tag, markup, tokens) + return super unless tag == 'else'.freeze + @else_block = BlockBody.new + end + + def render(context) + segment = collection_segment(context) + + if segment.empty? + render_else(context) + else + render_segment(context, segment) + end + end + + protected + + def lax_parse(markup) + if markup =~ Syntax + @variable_name = $1 + collection_name = $2 + @reversed = !!$3 + @name = "#{@variable_name}-#{collection_name}" + @collection_name = Expression.parse(collection_name) + markup.scan(TagAttributes) do |key, value| + set_attribute(key, value) + end + else + raise SyntaxError.new(options[:locale].t("errors.syntax.for".freeze)) + end + end + + def strict_parse(markup) + p = Parser.new(markup) + @variable_name = p.consume(:id) + raise SyntaxError.new(options[:locale].t("errors.syntax.for_invalid_in".freeze)) unless p.id?('in'.freeze) + collection_name = p.expression + @name = "#{@variable_name}-#{collection_name}" + @collection_name = Expression.parse(collection_name) + @reversed = p.id?('reversed'.freeze) + + while p.look(:id) && p.look(:colon, 1) + unless attribute = p.id?('limit'.freeze) || p.id?('offset'.freeze) + raise SyntaxError.new(options[:locale].t("errors.syntax.for_invalid_attribute".freeze)) + end + p.consume + set_attribute(attribute, p.expression) + end + p.consume(:end_of_string) + end + + private + + def collection_segment(context) + offsets = context.registers[:for] ||= Hash.new(0) + + from = if @from == :continue + offsets[@name].to_i + else + context.evaluate(@from).to_i + end + + collection = context.evaluate(@collection_name) + collection = collection.to_a if collection.is_a?(Range) + + limit = context.evaluate(@limit) + to = limit ? limit.to_i + from : nil + + segment = Utils.slice_collection(collection, from, to) + segment.reverse! if @reversed + + offsets[@name] = from + segment.length + + segment + end + + def render_segment(context, segment) + for_stack = context.registers[:for_stack] ||= [] + length = segment.length + + result = '' + + context.stack do + loop_vars = Liquid::ForloopDrop.new(@name, length, for_stack[-1]) + + for_stack.push(loop_vars) + + begin + context['forloop'.freeze] = loop_vars + + segment.each_with_index do |item, index| + context[@variable_name] = item + result << @for_block.render(context) + loop_vars.send(:increment!) + + # Handle any interrupts if they exist. + if context.interrupt? + interrupt = context.pop_interrupt + break if interrupt.is_a? BreakInterrupt + next if interrupt.is_a? ContinueInterrupt + end + end + ensure + for_stack.pop + end + end + + result + end + + def set_attribute(key, expr) + case key + when 'offset'.freeze + @from = if expr == 'continue'.freeze + :continue + else + Expression.parse(expr) + end + when 'limit'.freeze + @limit = Expression.parse(expr) + end + end + + def render_else(context) + @else_block ? @else_block.render(context) : ''.freeze + end + end + + Template.register_tag('for'.freeze, For) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/if.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/if.rb new file mode 100644 index 0000000..40176bb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/if.rb @@ -0,0 +1,111 @@ +module Liquid + # If is the conditional block + # + # {% if user.admin %} + # Admin user! + # {% else %} + # Not admin user + # {% endif %} + # + # There are {% if count < 5 %} less {% else %} more {% endif %} items than you need. + # + class If < Block + Syntax = /(#{QuotedFragment})\s*([=!<>a-z_]+)?\s*(#{QuotedFragment})?/o + ExpressionsAndOperators = /(?:\b(?:\s?and\s?|\s?or\s?)\b|(?:\s*(?!\b(?:\s?and\s?|\s?or\s?)\b)(?:#{QuotedFragment}|\S+)\s*)+)/o + BOOLEAN_OPERATORS = %w(and or) + + def initialize(tag_name, markup, options) + super + @blocks = [] + push_block('if'.freeze, markup) + end + + def parse(tokens) + while parse_body(@blocks.last.attachment, tokens) + end + end + + def nodelist + @blocks.map(&:attachment) + end + + def unknown_tag(tag, markup, tokens) + if ['elsif'.freeze, 'else'.freeze].include?(tag) + push_block(tag, markup) + else + super + end + end + + def render(context) + context.stack do + @blocks.each do |block| + if block.evaluate(context) + return block.attachment.render(context) + end + end + ''.freeze + end + end + + private + + def push_block(tag, markup) + block = if tag == 'else'.freeze + ElseCondition.new + else + parse_with_selected_parser(markup) + end + + @blocks.push(block) + block.attach(BlockBody.new) + end + + def lax_parse(markup) + expressions = markup.scan(ExpressionsAndOperators) + raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop =~ Syntax + + condition = Condition.new(Expression.parse($1), $2, Expression.parse($3)) + + until expressions.empty? + operator = expressions.pop.to_s.strip + + raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop.to_s =~ Syntax + + new_condition = Condition.new(Expression.parse($1), $2, Expression.parse($3)) + raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless BOOLEAN_OPERATORS.include?(operator) + new_condition.send(operator, condition) + condition = new_condition + end + + condition + end + + def strict_parse(markup) + p = Parser.new(markup) + condition = parse_binary_comparison(p) + p.consume(:end_of_string) + condition + end + + def parse_binary_comparison(p) + condition = parse_comparison(p) + if op = (p.id?('and'.freeze) || p.id?('or'.freeze)) + condition.send(op, parse_binary_comparison(p)) + end + condition + end + + def parse_comparison(p) + a = Expression.parse(p.expression) + if op = p.consume?(:comparison) + b = Expression.parse(p.expression) + Condition.new(a, op, b) + else + Condition.new(a) + end + end + end + + Template.register_tag('if'.freeze, If) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/ifchanged.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/ifchanged.rb new file mode 100644 index 0000000..d70cbe1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/ifchanged.rb @@ -0,0 +1,18 @@ +module Liquid + class Ifchanged < Block + def render(context) + context.stack do + output = super + + if output != context.registers[:ifchanged] + context.registers[:ifchanged] = output + output + else + ''.freeze + end + end + end + end + + Template.register_tag('ifchanged'.freeze, Ifchanged) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/include.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/include.rb new file mode 100644 index 0000000..9234eb4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/include.rb @@ -0,0 +1,113 @@ +module Liquid + # Include allows templates to relate with other templates + # + # Simply include another template: + # + # {% include 'product' %} + # + # Include a template with a local variable: + # + # {% include 'product' with products[0] %} + # + # Include a template for a collection: + # + # {% include 'product' for products %} + # + class Include < Tag + Syntax = /(#{QuotedFragment}+)(\s+(?:with|for)\s+(#{QuotedFragment}+))?/o + + def initialize(tag_name, markup, options) + super + + if markup =~ Syntax + + template_name = $1 + variable_name = $3 + + @variable_name_expr = variable_name ? Expression.parse(variable_name) : nil + @template_name_expr = Expression.parse(template_name) + @attributes = {} + + markup.scan(TagAttributes) do |key, value| + @attributes[key] = Expression.parse(value) + end + + else + raise SyntaxError.new(options[:locale].t("errors.syntax.include".freeze)) + end + end + + def parse(_tokens) + end + + def render(context) + template_name = context.evaluate(@template_name_expr) + raise ArgumentError.new(options[:locale].t("errors.argument.include")) unless template_name + + partial = load_cached_partial(template_name, context) + context_variable_name = template_name.split('/'.freeze).last + + variable = if @variable_name_expr + context.evaluate(@variable_name_expr) + else + context.find_variable(template_name) + end + + old_template_name = context.template_name + old_partial = context.partial + begin + context.template_name = template_name + context.partial = true + context.stack do + @attributes.each do |key, value| + context[key] = context.evaluate(value) + end + + if variable.is_a?(Array) + variable.collect do |var| + context[context_variable_name] = var + partial.render(context) + end + else + context[context_variable_name] = variable + partial.render(context) + end + end + ensure + context.template_name = old_template_name + context.partial = old_partial + end + end + + private + + alias_method :parse_context, :options + private :parse_context + + def load_cached_partial(template_name, context) + cached_partials = context.registers[:cached_partials] || {} + + if cached = cached_partials[template_name] + return cached + end + source = read_template_from_file_system(context) + begin + parse_context.partial = true + partial = Liquid::Template.parse(source, parse_context) + ensure + parse_context.partial = false + end + cached_partials[template_name] = partial + context.registers[:cached_partials] = cached_partials + partial + end + + def read_template_from_file_system(context) + file_system = context.registers[:file_system] || Liquid::Template.file_system + + file_system.read_template_file(context.evaluate(@template_name_expr)) + end + end + + Template.register_tag('include'.freeze, Include) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/increment.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/increment.rb new file mode 100644 index 0000000..baa0cbb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/increment.rb @@ -0,0 +1,31 @@ +module Liquid + # increment is used in a place where one needs to insert a counter + # into a template, and needs the counter to survive across + # multiple instantiations of the template. + # (To achieve the survival, the application must keep the context) + # + # if the variable does not exist, it is created with value 0. + # + # Hello: {% increment variable %} + # + # gives you: + # + # Hello: 0 + # Hello: 1 + # Hello: 2 + # + class Increment < Tag + def initialize(tag_name, markup, options) + super + @variable = markup.strip + end + + def render(context) + value = context.environments.first[@variable] ||= 0 + context.environments.first[@variable] = value + 1 + value.to_s + end + end + + Template.register_tag('increment'.freeze, Increment) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/raw.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/raw.rb new file mode 100644 index 0000000..6b461bd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/raw.rb @@ -0,0 +1,47 @@ +module Liquid + class Raw < Block + Syntax = /\A\s*\z/ + FullTokenPossiblyInvalid = /\A(.*)#{TagStart}\s*(\w+)\s*(.*)?#{TagEnd}\z/om + + def initialize(tag_name, markup, parse_context) + super + + ensure_valid_markup(tag_name, markup, parse_context) + end + + def parse(tokens) + @body = '' + while token = tokens.shift + if token =~ FullTokenPossiblyInvalid + @body << $1 if $1 != "".freeze + return if block_delimiter == $2 + end + @body << token unless token.empty? + end + + raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_never_closed".freeze, block_name: block_name)) + end + + def render(_context) + @body + end + + def nodelist + [@body] + end + + def blank? + @body.empty? + end + + protected + + def ensure_valid_markup(tag_name, markup, parse_context) + unless markup =~ Syntax + raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_unexpected_args".freeze, tag: tag_name)) + end + end + end + + Template.register_tag('raw'.freeze, Raw) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/table_row.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/table_row.rb new file mode 100644 index 0000000..acd91e0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/table_row.rb @@ -0,0 +1,54 @@ +module Liquid + class TableRow < Block + Syntax = /(\w+)\s+in\s+(#{QuotedFragment}+)/o + + def initialize(tag_name, markup, options) + super + if markup =~ Syntax + @variable_name = $1 + @collection_name = Expression.parse($2) + @attributes = {} + markup.scan(TagAttributes) do |key, value| + @attributes[key] = Expression.parse(value) + end + else + raise SyntaxError.new(options[:locale].t("errors.syntax.table_row".freeze)) + end + end + + def render(context) + collection = context.evaluate(@collection_name) or return ''.freeze + + from = @attributes.key?('offset'.freeze) ? context.evaluate(@attributes['offset'.freeze]).to_i : 0 + to = @attributes.key?('limit'.freeze) ? from + context.evaluate(@attributes['limit'.freeze]).to_i : nil + + collection = Utils.slice_collection(collection, from, to) + + length = collection.length + + cols = context.evaluate(@attributes['cols'.freeze]).to_i + + result = "\n" + context.stack do + tablerowloop = Liquid::TablerowloopDrop.new(length, cols) + context['tablerowloop'.freeze] = tablerowloop + + collection.each_with_index do |item, index| + context[@variable_name] = item + + result << "" << super << '' + + if tablerowloop.col_last && !tablerowloop.last + result << "\n" + end + + tablerowloop.send(:increment!) + end + end + result << "\n" + result + end + end + + Template.register_tag('tablerow'.freeze, TableRow) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/unless.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/unless.rb new file mode 100644 index 0000000..1d4280d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tags/unless.rb @@ -0,0 +1,30 @@ +require_relative 'if' + +module Liquid + # Unless is a conditional just like 'if' but works on the inverse logic. + # + # {% unless x < 0 %} x is greater than zero {% endunless %} + # + class Unless < If + def render(context) + context.stack do + # First condition is interpreted backwards ( if not ) + first_block = @blocks.first + unless first_block.evaluate(context) + return first_block.attachment.render(context) + end + + # After the first condition unless works just like if + @blocks[1..-1].each do |block| + if block.evaluate(context) + return block.attachment.render(context) + end + end + + ''.freeze + end + end + end + + Template.register_tag('unless'.freeze, Unless) +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/template.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/template.rb new file mode 100644 index 0000000..31a67e4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/template.rb @@ -0,0 +1,254 @@ +module Liquid + # Templates are central to liquid. + # Interpretating templates is a two step process. First you compile the + # source code you got. During compile time some extensive error checking is performed. + # your code should expect to get some SyntaxErrors. + # + # After you have a compiled template you can then render it. + # You can use a compiled template over and over again and keep it cached. + # + # Example: + # + # template = Liquid::Template.parse(source) + # template.render('user_name' => 'bob') + # + class Template + attr_accessor :root + attr_reader :resource_limits, :warnings + + @@file_system = BlankFileSystem.new + + class TagRegistry + include Enumerable + + def initialize + @tags = {} + @cache = {} + end + + def [](tag_name) + return nil unless @tags.key?(tag_name) + return @cache[tag_name] if Liquid.cache_classes + + lookup_class(@tags[tag_name]).tap { |o| @cache[tag_name] = o } + end + + def []=(tag_name, klass) + @tags[tag_name] = klass.name + @cache[tag_name] = klass + end + + def delete(tag_name) + @tags.delete(tag_name) + @cache.delete(tag_name) + end + + def each(&block) + @tags.each(&block) + end + + private + + def lookup_class(name) + name.split("::").reject(&:empty?).reduce(Object) { |scope, const| scope.const_get(const) } + end + end + + attr_reader :profiler + + class << self + # Sets how strict the parser should be. + # :lax acts like liquid 2.5 and silently ignores malformed tags in most cases. + # :warn is the default and will give deprecation warnings when invalid syntax is used. + # :strict will enforce correct syntax. + attr_writer :error_mode + + # Sets how strict the taint checker should be. + # :lax is the default, and ignores the taint flag completely + # :warn adds a warning, but does not interrupt the rendering + # :error raises an error when tainted output is used + attr_writer :taint_mode + + attr_accessor :default_exception_renderer + Template.default_exception_renderer = lambda do |exception| + exception + end + + def file_system + @@file_system + end + + def file_system=(obj) + @@file_system = obj + end + + def register_tag(name, klass) + tags[name.to_s] = klass + end + + def tags + @tags ||= TagRegistry.new + end + + def error_mode + @error_mode ||= :lax + end + + def taint_mode + @taint_mode ||= :lax + end + + # Pass a module with filter methods which should be available + # to all liquid views. Good for registering the standard library + def register_filter(mod) + Strainer.global_filter(mod) + end + + def default_resource_limits + @default_resource_limits ||= {} + end + + # creates a new Template object from liquid source code + # To enable profiling, pass in profile: true as an option. + # See Liquid::Profiler for more information + def parse(source, options = {}) + template = Template.new + template.parse(source, options) + end + end + + def initialize + @rethrow_errors = false + @resource_limits = ResourceLimits.new(self.class.default_resource_limits) + end + + # Parse source code. + # Returns self for easy chaining + def parse(source, options = {}) + @options = options + @profiling = options[:profile] + @line_numbers = options[:line_numbers] || @profiling + parse_context = options.is_a?(ParseContext) ? options : ParseContext.new(options) + @root = Document.parse(tokenize(source), parse_context) + @warnings = parse_context.warnings + self + end + + def registers + @registers ||= {} + end + + def assigns + @assigns ||= {} + end + + def instance_assigns + @instance_assigns ||= {} + end + + def errors + @errors ||= [] + end + + # Render takes a hash with local variables. + # + # if you use the same filters over and over again consider registering them globally + # with Template.register_filter + # + # if profiling was enabled in Template#parse then the resulting profiling information + # will be available via Template#profiler + # + # Following options can be passed: + # + # * filters : array with local filters + # * registers : hash with register variables. Those can be accessed from + # filters and tags and might be useful to integrate liquid more with its host application + # + def render(*args) + return ''.freeze if @root.nil? + + context = case args.first + when Liquid::Context + c = args.shift + + if @rethrow_errors + c.exception_renderer = ->(e) { raise } + end + + c + when Liquid::Drop + drop = args.shift + drop.context = Context.new([drop, assigns], instance_assigns, registers, @rethrow_errors, @resource_limits) + when Hash + Context.new([args.shift, assigns], instance_assigns, registers, @rethrow_errors, @resource_limits) + when nil + Context.new(assigns, instance_assigns, registers, @rethrow_errors, @resource_limits) + else + raise ArgumentError, "Expected Hash or Liquid::Context as parameter" + end + + case args.last + when Hash + options = args.pop + + registers.merge!(options[:registers]) if options[:registers].is_a?(Hash) + + apply_options_to_context(context, options) + when Module, Array + context.add_filters(args.pop) + end + + # Retrying a render resets resource usage + context.resource_limits.reset + + begin + # render the nodelist. + # for performance reasons we get an array back here. join will make a string out of it. + result = with_profiling(context) do + @root.render(context) + end + result.respond_to?(:join) ? result.join : result + rescue Liquid::MemoryError => e + context.handle_error(e) + ensure + @errors = context.errors + end + end + + def render!(*args) + @rethrow_errors = true + render(*args) + end + + private + + def tokenize(source) + Tokenizer.new(source, @line_numbers) + end + + def with_profiling(context) + if @profiling && !context.partial + raise "Profiler not loaded, require 'liquid/profiler' first" unless defined?(Liquid::Profiler) + + @profiler = Profiler.new + @profiler.start + + begin + yield + ensure + @profiler.stop + end + else + yield + end + end + + def apply_options_to_context(context, options) + context.add_filters(options[:filters]) if options[:filters] + context.global_filter = options[:global_filter] if options[:global_filter] + context.exception_renderer = options[:exception_renderer] if options[:exception_renderer] + context.strict_variables = options[:strict_variables] if options[:strict_variables] + context.strict_filters = options[:strict_filters] if options[:strict_filters] + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tokenizer.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tokenizer.rb new file mode 100644 index 0000000..d03657e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/tokenizer.rb @@ -0,0 +1,31 @@ +module Liquid + class Tokenizer + attr_reader :line_number + + def initialize(source, line_numbers = false) + @source = source + @line_number = line_numbers ? 1 : nil + @tokens = tokenize + end + + def shift + token = @tokens.shift + @line_number += token.count("\n") if @line_number && token + token + end + + private + + def tokenize + @source = @source.source if @source.respond_to?(:source) + return [] if @source.to_s.empty? + + tokens = @source.split(TemplateParser) + + # removes the rogue empty element at the beginning of the array + tokens.shift if tokens[0] && tokens[0].empty? + + tokens + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/utils.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/utils.rb new file mode 100644 index 0000000..fc05ac5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/utils.rb @@ -0,0 +1,83 @@ +module Liquid + module Utils + def self.slice_collection(collection, from, to) + if (from != 0 || !to.nil?) && collection.respond_to?(:load_slice) + collection.load_slice(from, to) + else + slice_collection_using_each(collection, from, to) + end + end + + def self.slice_collection_using_each(collection, from, to) + segments = [] + index = 0 + + # Maintains Ruby 1.8.7 String#each behaviour on 1.9 + if collection.is_a?(String) + return collection.empty? ? [] : [collection] + end + return [] unless collection.respond_to?(:each) + + collection.each do |item| + if to && to <= index + break + end + + if from <= index + segments << item + end + + index += 1 + end + + segments + end + + def self.to_integer(num) + return num if num.is_a?(Integer) + num = num.to_s + begin + Integer(num) + rescue ::ArgumentError + raise Liquid::ArgumentError, "invalid integer" + end + end + + def self.to_number(obj) + case obj + when Float + BigDecimal.new(obj.to_s) + when Numeric + obj + when String + (obj.strip =~ /\A-?\d+\.\d+\z/) ? BigDecimal.new(obj) : obj.to_i + else + if obj.respond_to?(:to_number) + obj.to_number + else + 0 + end + end + end + + def self.to_date(obj) + return obj if obj.respond_to?(:strftime) + + if obj.is_a?(String) + return nil if obj.empty? + obj = obj.downcase + end + + case obj + when 'now'.freeze, 'today'.freeze + Time.now + when /\A\d+\z/, Integer + Time.at(obj.to_i) + when String + Time.parse(obj) + end + rescue ::ArgumentError + nil + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/variable.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/variable.rb new file mode 100644 index 0000000..8006ac7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/variable.rb @@ -0,0 +1,136 @@ +module Liquid + # Holds variables. Variables are only loaded "just in time" + # and are not evaluated as part of the render stage + # + # {{ monkey }} + # {{ user.name }} + # + # Variables can be combined with filters: + # + # {{ user | link }} + # + class Variable + FilterParser = /(?:\s+|#{QuotedFragment}|#{ArgumentSeparator})+/o + attr_accessor :filters, :name, :line_number + attr_reader :parse_context + alias_method :options, :parse_context + include ParserSwitching + + def initialize(markup, parse_context) + @markup = markup + @name = nil + @parse_context = parse_context + @line_number = parse_context.line_number + + parse_with_selected_parser(markup) + end + + def raw + @markup + end + + def markup_context(markup) + "in \"{{#{markup}}}\"" + end + + def lax_parse(markup) + @filters = [] + return unless markup =~ /(#{QuotedFragment})(.*)/om + + name_markup = $1 + filter_markup = $2 + @name = Expression.parse(name_markup) + if filter_markup =~ /#{FilterSeparator}\s*(.*)/om + filters = $1.scan(FilterParser) + filters.each do |f| + next unless f =~ /\w+/ + filtername = Regexp.last_match(0) + filterargs = f.scan(/(?:#{FilterArgumentSeparator}|#{ArgumentSeparator})\s*((?:\w+\s*\:\s*)?#{QuotedFragment})/o).flatten + @filters << parse_filter_expressions(filtername, filterargs) + end + end + end + + def strict_parse(markup) + @filters = [] + p = Parser.new(markup) + + @name = Expression.parse(p.expression) + while p.consume?(:pipe) + filtername = p.consume(:id) + filterargs = p.consume?(:colon) ? parse_filterargs(p) : [] + @filters << parse_filter_expressions(filtername, filterargs) + end + p.consume(:end_of_string) + end + + def parse_filterargs(p) + # first argument + filterargs = [p.argument] + # followed by comma separated others + filterargs << p.argument while p.consume?(:comma) + filterargs + end + + def render(context) + obj = @filters.inject(context.evaluate(@name)) do |output, (filter_name, filter_args, filter_kwargs)| + filter_args = evaluate_filter_expressions(context, filter_args, filter_kwargs) + context.invoke(filter_name, output, *filter_args) + end + + obj = context.apply_global_filter(obj) + + taint_check(context, obj) + + obj + end + + private + + def parse_filter_expressions(filter_name, unparsed_args) + filter_args = [] + keyword_args = {} + unparsed_args.each do |a| + if matches = a.match(/\A#{TagAttributes}\z/o) + keyword_args[matches[1]] = Expression.parse(matches[2]) + else + filter_args << Expression.parse(a) + end + end + result = [filter_name, filter_args] + result << keyword_args unless keyword_args.empty? + result + end + + def evaluate_filter_expressions(context, filter_args, filter_kwargs) + parsed_args = filter_args.map{ |expr| context.evaluate(expr) } + if filter_kwargs + parsed_kwargs = {} + filter_kwargs.each do |key, expr| + parsed_kwargs[key] = context.evaluate(expr) + end + parsed_args << parsed_kwargs + end + parsed_args + end + + def taint_check(context, obj) + return unless obj.tainted? + return if Template.taint_mode == :lax + + @markup =~ QuotedFragment + name = Regexp.last_match(0) + + error = TaintedError.new("variable '#{name}' is tainted and was not escaped") + error.line_number = line_number + error.template_name = context.template_name + + case Template.taint_mode + when :warn + context.warnings << error + when :error + raise error + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/variable_lookup.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/variable_lookup.rb new file mode 100644 index 0000000..3ed4e4a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/variable_lookup.rb @@ -0,0 +1,82 @@ +module Liquid + class VariableLookup + SQUARE_BRACKETED = /\A\[(.*)\]\z/m + COMMAND_METHODS = ['size'.freeze, 'first'.freeze, 'last'.freeze] + + attr_reader :name, :lookups + + def self.parse(markup) + new(markup) + end + + def initialize(markup) + lookups = markup.scan(VariableParser) + + name = lookups.shift + if name =~ SQUARE_BRACKETED + name = Expression.parse($1) + end + @name = name + + @lookups = lookups + @command_flags = 0 + + @lookups.each_index do |i| + lookup = lookups[i] + if lookup =~ SQUARE_BRACKETED + lookups[i] = Expression.parse($1) + elsif COMMAND_METHODS.include?(lookup) + @command_flags |= 1 << i + end + end + end + + def evaluate(context) + name = context.evaluate(@name) + object = context.find_variable(name) + + @lookups.each_index do |i| + key = context.evaluate(@lookups[i]) + + # If object is a hash- or array-like object we look for the + # presence of the key and if its available we return it + if object.respond_to?(:[]) && + ((object.respond_to?(:key?) && object.key?(key)) || + (object.respond_to?(:fetch) && key.is_a?(Integer))) + + # if its a proc we will replace the entry with the proc + res = context.lookup_and_evaluate(object, key) + object = res.to_liquid + + # Some special cases. If the part wasn't in square brackets and + # no key with the same name was found we interpret following calls + # as commands and call them on the current object + elsif @command_flags & (1 << i) != 0 && object.respond_to?(key) + object = object.send(key).to_liquid + + # No key was present with the desired value and it wasn't one of the directly supported + # keywords either. The only thing we got left is to return nil or + # raise an exception if `strict_variables` option is set to true + else + return nil unless context.strict_variables + raise Liquid::UndefinedVariable, "undefined variable #{key}" + end + + # If we are dealing with a drop here we have to + object.context = context if object.respond_to?(:context=) + end + + object + end + + def ==(other) + self.class == other.class && state == other.state + end + + protected + + def state + [@name, @lookups, @command_flags] + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/version.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/version.rb new file mode 100644 index 0000000..af15e07 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/lib/liquid/version.rb @@ -0,0 +1,4 @@ +# encoding: utf-8 +module Liquid + VERSION = "4.0.0" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/fixtures/en_locale.yml b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/fixtures/en_locale.yml new file mode 100644 index 0000000..0b113c6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/fixtures/en_locale.yml @@ -0,0 +1,9 @@ +--- + simple: "less is more" + whatever: "something %{something}" + errors: + i18n: + undefined_interpolation: "undefined key %{key}" + unknown_translation: "translation '%{name}' wasn't found" + syntax: + oops: "something wasn't right" diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/assign_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/assign_test.rb new file mode 100644 index 0000000..5502289 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/assign_test.rb @@ -0,0 +1,48 @@ +require 'test_helper' + +class AssignTest < Minitest::Test + include Liquid + + def test_assign_with_hyphen_in_variable_name + template_source = <<-END_TEMPLATE + {% assign this-thing = 'Print this-thing' %} + {{ this-thing }} + END_TEMPLATE + template = Template.parse(template_source) + rendered = template.render! + assert_equal "Print this-thing", rendered.strip + end + + def test_assigned_variable + assert_template_result('.foo.', + '{% assign foo = values %}.{{ foo[0] }}.', + 'values' => %w(foo bar baz)) + + assert_template_result('.bar.', + '{% assign foo = values %}.{{ foo[1] }}.', + 'values' => %w(foo bar baz)) + end + + def test_assign_with_filter + assert_template_result('.bar.', + '{% assign foo = values | split: "," %}.{{ foo[1] }}.', + 'values' => "foo,bar,baz") + end + + def test_assign_syntax_error + assert_match_syntax_error(/assign/, + '{% assign foo not values %}.', + 'values' => "foo,bar,baz") + end + + def test_assign_uses_error_mode + with_error_mode(:strict) do + assert_raises(SyntaxError) do + Template.parse("{% assign foo = ('X' | downcase) %}") + end + end + with_error_mode(:lax) do + assert Template.parse("{% assign foo = ('X' | downcase) %}") + end + end +end # AssignTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/blank_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/blank_test.rb new file mode 100644 index 0000000..e9b56df --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/blank_test.rb @@ -0,0 +1,106 @@ +require 'test_helper' + +class FoobarTag < Liquid::Tag + def render(*args) + " " + end + + Liquid::Template.register_tag('foobar', FoobarTag) +end + +class BlankTestFileSystem + def read_template_file(template_path) + template_path + end +end + +class BlankTest < Minitest::Test + include Liquid + N = 10 + + def wrap_in_for(body) + "{% for i in (1..#{N}) %}#{body}{% endfor %}" + end + + def wrap_in_if(body) + "{% if true %}#{body}{% endif %}" + end + + def wrap(body) + wrap_in_for(body) + wrap_in_if(body) + end + + def test_new_tags_are_not_blank_by_default + assert_template_result(" " * N, wrap_in_for("{% foobar %}")) + end + + def test_loops_are_blank + assert_template_result("", wrap_in_for(" ")) + end + + def test_if_else_are_blank + assert_template_result("", "{% if true %} {% elsif false %} {% else %} {% endif %}") + end + + def test_unless_is_blank + assert_template_result("", wrap("{% unless true %} {% endunless %}")) + end + + def test_mark_as_blank_only_during_parsing + assert_template_result(" " * (N + 1), wrap(" {% if false %} this never happens, but still, this block is not blank {% endif %}")) + end + + def test_comments_are_blank + assert_template_result("", wrap(" {% comment %} whatever {% endcomment %} ")) + end + + def test_captures_are_blank + assert_template_result("", wrap(" {% capture foo %} whatever {% endcapture %} ")) + end + + def test_nested_blocks_are_blank_but_only_if_all_children_are + assert_template_result("", wrap(wrap(" "))) + assert_template_result("\n but this is not " * (N + 1), + wrap('{% if true %} {% comment %} this is blank {% endcomment %} {% endif %} + {% if true %} but this is not {% endif %}')) + end + + def test_assigns_are_blank + assert_template_result("", wrap(' {% assign foo = "bar" %} ')) + end + + def test_whitespace_is_blank + assert_template_result("", wrap(" ")) + assert_template_result("", wrap("\t")) + end + + def test_whitespace_is_not_blank_if_other_stuff_is_present + body = " x " + assert_template_result(body * (N + 1), wrap(body)) + end + + def test_increment_is_not_blank + assert_template_result(" 0" * 2 * (N + 1), wrap("{% assign foo = 0 %} {% increment foo %} {% decrement foo %}")) + end + + def test_cycle_is_not_blank + assert_template_result(" " * ((N + 1) / 2) + " ", wrap("{% cycle ' ', ' ' %}")) + end + + def test_raw_is_not_blank + assert_template_result(" " * (N + 1), wrap(" {% raw %} {% endraw %}")) + end + + def test_include_is_blank + Liquid::Template.file_system = BlankTestFileSystem.new + assert_template_result "foobar" * (N + 1), wrap("{% include 'foobar' %}") + assert_template_result " foobar " * (N + 1), wrap("{% include ' foobar ' %}") + assert_template_result " " * (N + 1), wrap(" {% include ' ' %} ") + end + + def test_case_is_blank + assert_template_result("", wrap(" {% assign foo = 'bar' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} {% endcase %} ")) + assert_template_result("", wrap(" {% assign foo = 'else' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} {% endcase %} ")) + assert_template_result(" x " * (N + 1), wrap(" {% assign foo = 'else' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} x {% endcase %} ")) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/capture_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/capture_test.rb new file mode 100644 index 0000000..8d965b3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/capture_test.rb @@ -0,0 +1,50 @@ +require 'test_helper' + +class CaptureTest < Minitest::Test + include Liquid + + def test_captures_block_content_in_variable + assert_template_result("test string", "{% capture 'var' %}test string{% endcapture %}{{var}}", {}) + end + + def test_capture_with_hyphen_in_variable_name + template_source = <<-END_TEMPLATE + {% capture this-thing %}Print this-thing{% endcapture %} + {{ this-thing }} + END_TEMPLATE + template = Template.parse(template_source) + rendered = template.render! + assert_equal "Print this-thing", rendered.strip + end + + def test_capture_to_variable_from_outer_scope_if_existing + template_source = <<-END_TEMPLATE + {% assign var = '' %} + {% if true %} + {% capture var %}first-block-string{% endcapture %} + {% endif %} + {% if true %} + {% capture var %}test-string{% endcapture %} + {% endif %} + {{var}} + END_TEMPLATE + template = Template.parse(template_source) + rendered = template.render! + assert_equal "test-string", rendered.gsub(/\s/, '') + end + + def test_assigning_from_capture + template_source = <<-END_TEMPLATE + {% assign first = '' %} + {% assign second = '' %} + {% for number in (1..3) %} + {% capture first %}{{number}}{% endcapture %} + {% assign second = first %} + {% endfor %} + {{ first }}-{{ second }} + END_TEMPLATE + template = Template.parse(template_source) + rendered = template.render! + assert_equal "3-3", rendered.gsub(/\s/, '') + end +end # CaptureTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/context_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/context_test.rb new file mode 100644 index 0000000..2d109bb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/context_test.rb @@ -0,0 +1,32 @@ +require 'test_helper' + +class ContextTest < Minitest::Test + include Liquid + + def test_override_global_filter + global = Module.new do + def notice(output) + "Global #{output}" + end + end + + local = Module.new do + def notice(output) + "Local #{output}" + end + end + + with_global_filter(global) do + assert_equal 'Global test', Template.parse("{{'test' | notice }}").render! + assert_equal 'Local test', Template.parse("{{'test' | notice }}").render!({}, filters: [local]) + end + end + + def test_has_key_will_not_add_an_error_for_missing_keys + with_error_mode :strict do + context = Context.new + context.key?('unknown') + assert_empty context.errors + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/document_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/document_test.rb new file mode 100644 index 0000000..bcc4a21 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/document_test.rb @@ -0,0 +1,19 @@ +require 'test_helper' + +class DocumentTest < Minitest::Test + include Liquid + + def test_unexpected_outer_tag + exc = assert_raises(SyntaxError) do + Template.parse("{% else %}") + end + assert_equal exc.message, "Liquid syntax error: Unexpected outer 'else' tag" + end + + def test_unknown_tag + exc = assert_raises(SyntaxError) do + Template.parse("{% foo %}") + end + assert_equal exc.message, "Liquid syntax error: Unknown tag 'foo'" + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/drop_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/drop_test.rb new file mode 100644 index 0000000..2de4a5a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/drop_test.rb @@ -0,0 +1,273 @@ +require 'test_helper' + +class ContextDrop < Liquid::Drop + def scopes + @context.scopes.size + end + + def scopes_as_array + (1..@context.scopes.size).to_a + end + + def loop_pos + @context['forloop.index'] + end + + def liquid_method_missing(method) + @context[method] + end +end + +class ProductDrop < Liquid::Drop + class TextDrop < Liquid::Drop + def array + ['text1', 'text2'] + end + + def text + 'text1' + end + end + + class CatchallDrop < Liquid::Drop + def liquid_method_missing(method) + 'catchall_method: ' << method.to_s + end + end + + def texts + TextDrop.new + end + + def catchall + CatchallDrop.new + end + + def context + ContextDrop.new + end + + def user_input + "foo".taint + end + + protected + + def callmenot + "protected" + end +end + +class EnumerableDrop < Liquid::Drop + def liquid_method_missing(method) + method + end + + def size + 3 + end + + def first + 1 + end + + def count + 3 + end + + def min + 1 + end + + def max + 3 + end + + def each + yield 1 + yield 2 + yield 3 + end +end + +class RealEnumerableDrop < Liquid::Drop + include Enumerable + + def liquid_method_missing(method) + method + end + + def each + yield 1 + yield 2 + yield 3 + end +end + +class DropsTest < Minitest::Test + include Liquid + + def test_product_drop + tpl = Liquid::Template.parse(' ') + assert_equal ' ', tpl.render!('product' => ProductDrop.new) + end + + def test_rendering_raises_on_tainted_attr + with_taint_mode(:error) do + tpl = Liquid::Template.parse('{{ product.user_input }}') + assert_raises TaintedError do + tpl.render!('product' => ProductDrop.new) + end + end + end + + def test_rendering_warns_on_tainted_attr + with_taint_mode(:warn) do + tpl = Liquid::Template.parse('{{ product.user_input }}') + context = Context.new('product' => ProductDrop.new) + tpl.render!(context) + assert_equal [Liquid::TaintedError], context.warnings.map(&:class) + assert_equal "variable 'product.user_input' is tainted and was not escaped", context.warnings.first.to_s(false) + end + end + + def test_rendering_doesnt_raise_on_escaped_tainted_attr + with_taint_mode(:error) do + tpl = Liquid::Template.parse('{{ product.user_input | escape }}') + tpl.render!('product' => ProductDrop.new) + end + end + + def test_drop_does_only_respond_to_whitelisted_methods + assert_equal "", Liquid::Template.parse("{{ product.inspect }}").render!('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse("{{ product.pretty_inspect }}").render!('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse("{{ product.whatever }}").render!('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse('{{ product | map: "inspect" }}').render!('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse('{{ product | map: "pretty_inspect" }}').render!('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse('{{ product | map: "whatever" }}').render!('product' => ProductDrop.new) + end + + def test_drops_respond_to_to_liquid + assert_equal "text1", Liquid::Template.parse("{{ product.to_liquid.texts.text }}").render!('product' => ProductDrop.new) + assert_equal "text1", Liquid::Template.parse('{{ product | map: "to_liquid" | map: "texts" | map: "text" }}').render!('product' => ProductDrop.new) + end + + def test_text_drop + output = Liquid::Template.parse(' {{ product.texts.text }} ').render!('product' => ProductDrop.new) + assert_equal ' text1 ', output + end + + def test_catchall_unknown_method + output = Liquid::Template.parse(' {{ product.catchall.unknown }} ').render!('product' => ProductDrop.new) + assert_equal ' catchall_method: unknown ', output + end + + def test_catchall_integer_argument_drop + output = Liquid::Template.parse(' {{ product.catchall[8] }} ').render!('product' => ProductDrop.new) + assert_equal ' catchall_method: 8 ', output + end + + def test_text_array_drop + output = Liquid::Template.parse('{% for text in product.texts.array %} {{text}} {% endfor %}').render!('product' => ProductDrop.new) + assert_equal ' text1 text2 ', output + end + + def test_context_drop + output = Liquid::Template.parse(' {{ context.bar }} ').render!('context' => ContextDrop.new, 'bar' => "carrot") + assert_equal ' carrot ', output + end + + def test_nested_context_drop + output = Liquid::Template.parse(' {{ product.context.foo }} ').render!('product' => ProductDrop.new, 'foo' => "monkey") + assert_equal ' monkey ', output + end + + def test_protected + output = Liquid::Template.parse(' {{ product.callmenot }} ').render!('product' => ProductDrop.new) + assert_equal ' ', output + end + + def test_object_methods_not_allowed + [:dup, :clone, :singleton_class, :eval, :class_eval, :inspect].each do |method| + output = Liquid::Template.parse(" {{ product.#{method} }} ").render!('product' => ProductDrop.new) + assert_equal ' ', output + end + end + + def test_scope + assert_equal '1', Liquid::Template.parse('{{ context.scopes }}').render!('context' => ContextDrop.new) + assert_equal '2', Liquid::Template.parse('{%for i in dummy%}{{ context.scopes }}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1]) + assert_equal '3', Liquid::Template.parse('{%for i in dummy%}{%for i in dummy%}{{ context.scopes }}{%endfor%}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1]) + end + + def test_scope_though_proc + assert_equal '1', Liquid::Template.parse('{{ s }}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] }) + assert_equal '2', Liquid::Template.parse('{%for i in dummy%}{{ s }}{%endfor%}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] }, 'dummy' => [1]) + assert_equal '3', Liquid::Template.parse('{%for i in dummy%}{%for i in dummy%}{{ s }}{%endfor%}{%endfor%}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] }, 'dummy' => [1]) + end + + def test_scope_with_assigns + assert_equal 'variable', Liquid::Template.parse('{% assign a = "variable"%}{{a}}').render!('context' => ContextDrop.new) + assert_equal 'variable', Liquid::Template.parse('{% assign a = "variable"%}{%for i in dummy%}{{a}}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1]) + assert_equal 'test', Liquid::Template.parse('{% assign header_gif = "test"%}{{header_gif}}').render!('context' => ContextDrop.new) + assert_equal 'test', Liquid::Template.parse("{% assign header_gif = 'test'%}{{header_gif}}").render!('context' => ContextDrop.new) + end + + def test_scope_from_tags + assert_equal '1', Liquid::Template.parse('{% for i in context.scopes_as_array %}{{i}}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1]) + assert_equal '12', Liquid::Template.parse('{%for a in dummy%}{% for i in context.scopes_as_array %}{{i}}{% endfor %}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1]) + assert_equal '123', Liquid::Template.parse('{%for a in dummy%}{%for a in dummy%}{% for i in context.scopes_as_array %}{{i}}{% endfor %}{% endfor %}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1]) + end + + def test_access_context_from_drop + assert_equal '123', Liquid::Template.parse('{%for a in dummy%}{{ context.loop_pos }}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1, 2, 3]) + end + + def test_enumerable_drop + assert_equal '123', Liquid::Template.parse('{% for c in collection %}{{c}}{% endfor %}').render!('collection' => EnumerableDrop.new) + end + + def test_enumerable_drop_size + assert_equal '3', Liquid::Template.parse('{{collection.size}}').render!('collection' => EnumerableDrop.new) + end + + def test_enumerable_drop_will_invoke_liquid_method_missing_for_clashing_method_names + ["select", "each", "map", "cycle"].each do |method| + assert_equal method.to_s, Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => EnumerableDrop.new) + assert_equal method.to_s, Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => EnumerableDrop.new) + assert_equal method.to_s, Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => RealEnumerableDrop.new) + assert_equal method.to_s, Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => RealEnumerableDrop.new) + end + end + + def test_some_enumerable_methods_still_get_invoked + [ :count, :max ].each do |method| + assert_equal "3", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => RealEnumerableDrop.new) + assert_equal "3", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => RealEnumerableDrop.new) + assert_equal "3", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => EnumerableDrop.new) + assert_equal "3", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => EnumerableDrop.new) + end + + assert_equal "yes", Liquid::Template.parse("{% if collection contains 3 %}yes{% endif %}").render!('collection' => RealEnumerableDrop.new) + + [ :min, :first ].each do |method| + assert_equal "1", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => RealEnumerableDrop.new) + assert_equal "1", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => RealEnumerableDrop.new) + assert_equal "1", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => EnumerableDrop.new) + assert_equal "1", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => EnumerableDrop.new) + end + end + + def test_empty_string_value_access + assert_equal '', Liquid::Template.parse('{{ product[value] }}').render!('product' => ProductDrop.new, 'value' => '') + end + + def test_nil_value_access + assert_equal '', Liquid::Template.parse('{{ product[value] }}').render!('product' => ProductDrop.new, 'value' => nil) + end + + def test_default_to_s_on_drops + assert_equal 'ProductDrop', Liquid::Template.parse("{{ product }}").render!('product' => ProductDrop.new) + assert_equal 'EnumerableDrop', Liquid::Template.parse('{{ collection }}').render!('collection' => EnumerableDrop.new) + end +end # DropsTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/error_handling_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/error_handling_test.rb new file mode 100644 index 0000000..ba81861 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/error_handling_test.rb @@ -0,0 +1,260 @@ +require 'test_helper' + +class ErrorHandlingTest < Minitest::Test + include Liquid + + def test_templates_parsed_with_line_numbers_renders_them_in_errors + template = <<-LIQUID + Hello, + + {{ errors.standard_error }} will raise a standard error. + + Bla bla test. + + {{ errors.syntax_error }} will raise a syntax error. + + This is an argument error: {{ errors.argument_error }} + + Bla. + LIQUID + + expected = <<-TEXT + Hello, + + Liquid error (line 3): standard error will raise a standard error. + + Bla bla test. + + Liquid syntax error (line 7): syntax error will raise a syntax error. + + This is an argument error: Liquid error (line 9): argument error + + Bla. + TEXT + + output = Liquid::Template.parse(template, line_numbers: true).render('errors' => ErrorDrop.new) + assert_equal expected, output + end + + def test_standard_error + template = Liquid::Template.parse(' {{ errors.standard_error }} ') + assert_equal ' Liquid error: standard error ', template.render('errors' => ErrorDrop.new) + + assert_equal 1, template.errors.size + assert_equal StandardError, template.errors.first.class + end + + def test_syntax + template = Liquid::Template.parse(' {{ errors.syntax_error }} ') + assert_equal ' Liquid syntax error: syntax error ', template.render('errors' => ErrorDrop.new) + + assert_equal 1, template.errors.size + assert_equal SyntaxError, template.errors.first.class + end + + def test_argument + template = Liquid::Template.parse(' {{ errors.argument_error }} ') + assert_equal ' Liquid error: argument error ', template.render('errors' => ErrorDrop.new) + + assert_equal 1, template.errors.size + assert_equal ArgumentError, template.errors.first.class + end + + def test_missing_endtag_parse_time_error + assert_raises(Liquid::SyntaxError) do + Liquid::Template.parse(' {% for a in b %} ... ') + end + end + + def test_unrecognized_operator + with_error_mode(:strict) do + assert_raises(SyntaxError) do + Liquid::Template.parse(' {% if 1 =! 2 %}ok{% endif %} ') + end + end + end + + def test_lax_unrecognized_operator + template = Liquid::Template.parse(' {% if 1 =! 2 %}ok{% endif %} ', error_mode: :lax) + assert_equal ' Liquid error: Unknown operator =! ', template.render + assert_equal 1, template.errors.size + assert_equal Liquid::ArgumentError, template.errors.first.class + end + + def test_with_line_numbers_adds_numbers_to_parser_errors + err = assert_raises(SyntaxError) do + Liquid::Template.parse(%q( + foobar + + {% "cat" | foobar %} + + bla + ), + line_numbers: true + ) + end + + assert_match(/Liquid syntax error \(line 4\)/, err.message) + end + + def test_with_line_numbers_adds_numbers_to_parser_errors_with_whitespace_trim + err = assert_raises(SyntaxError) do + Liquid::Template.parse(%q( + foobar + + {%- "cat" | foobar -%} + + bla + ), + line_numbers: true + ) + end + + assert_match(/Liquid syntax error \(line 4\)/, err.message) + end + + def test_parsing_warn_with_line_numbers_adds_numbers_to_lexer_errors + template = Liquid::Template.parse(' + foobar + + {% if 1 =! 2 %}ok{% endif %} + + bla + ', + error_mode: :warn, + line_numbers: true + ) + + assert_equal ['Liquid syntax error (line 4): Unexpected character = in "1 =! 2"'], + template.warnings.map(&:message) + end + + def test_parsing_strict_with_line_numbers_adds_numbers_to_lexer_errors + err = assert_raises(SyntaxError) do + Liquid::Template.parse(' + foobar + + {% if 1 =! 2 %}ok{% endif %} + + bla + ', + error_mode: :strict, + line_numbers: true + ) + end + + assert_equal 'Liquid syntax error (line 4): Unexpected character = in "1 =! 2"', err.message + end + + def test_syntax_errors_in_nested_blocks_have_correct_line_number + err = assert_raises(SyntaxError) do + Liquid::Template.parse(' + foobar + + {% if 1 != 2 %} + {% foo %} + {% endif %} + + bla + ', + line_numbers: true + ) + end + + assert_equal "Liquid syntax error (line 5): Unknown tag 'foo'", err.message + end + + def test_strict_error_messages + err = assert_raises(SyntaxError) do + Liquid::Template.parse(' {% if 1 =! 2 %}ok{% endif %} ', error_mode: :strict) + end + assert_equal 'Liquid syntax error: Unexpected character = in "1 =! 2"', err.message + + err = assert_raises(SyntaxError) do + Liquid::Template.parse('{{%%%}}', error_mode: :strict) + end + assert_equal 'Liquid syntax error: Unexpected character % in "{{%%%}}"', err.message + end + + def test_warnings + template = Liquid::Template.parse('{% if ~~~ %}{{%%%}}{% else %}{{ hello. }}{% endif %}', error_mode: :warn) + assert_equal 3, template.warnings.size + assert_equal 'Unexpected character ~ in "~~~"', template.warnings[0].to_s(false) + assert_equal 'Unexpected character % in "{{%%%}}"', template.warnings[1].to_s(false) + assert_equal 'Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].to_s(false) + assert_equal '', template.render + end + + def test_warning_line_numbers + template = Liquid::Template.parse("{% if ~~~ %}\n{{%%%}}{% else %}\n{{ hello. }}{% endif %}", error_mode: :warn, line_numbers: true) + assert_equal 'Liquid syntax error (line 1): Unexpected character ~ in "~~~"', template.warnings[0].message + assert_equal 'Liquid syntax error (line 2): Unexpected character % in "{{%%%}}"', template.warnings[1].message + assert_equal 'Liquid syntax error (line 3): Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].message + assert_equal 3, template.warnings.size + assert_equal [1, 2, 3], template.warnings.map(&:line_number) + end + + # Liquid should not catch Exceptions that are not subclasses of StandardError, like Interrupt and NoMemoryError + def test_exceptions_propagate + assert_raises Exception do + template = Liquid::Template.parse('{{ errors.exception }}') + template.render('errors' => ErrorDrop.new) + end + end + + def test_default_exception_renderer_with_internal_error + template = Liquid::Template.parse('This is a runtime error: {{ errors.runtime_error }}', line_numbers: true) + + output = template.render({ 'errors' => ErrorDrop.new }) + + assert_equal 'This is a runtime error: Liquid error (line 1): internal', output + assert_equal [Liquid::InternalError], template.errors.map(&:class) + end + + def test_setting_default_exception_renderer + old_exception_renderer = Liquid::Template.default_exception_renderer + exceptions = [] + Liquid::Template.default_exception_renderer = ->(e) { exceptions << e; '' } + template = Liquid::Template.parse('This is a runtime error: {{ errors.argument_error }}') + + output = template.render({ 'errors' => ErrorDrop.new }) + + assert_equal 'This is a runtime error: ', output + assert_equal [Liquid::ArgumentError], template.errors.map(&:class) + ensure + Liquid::Template.default_exception_renderer = old_exception_renderer if old_exception_renderer + end + + def test_exception_renderer_exposing_non_liquid_error + template = Liquid::Template.parse('This is a runtime error: {{ errors.runtime_error }}', line_numbers: true) + exceptions = [] + handler = ->(e) { exceptions << e; e.cause } + + output = template.render({ 'errors' => ErrorDrop.new }, exception_renderer: handler) + + assert_equal 'This is a runtime error: runtime error', output + assert_equal [Liquid::InternalError], exceptions.map(&:class) + assert_equal exceptions, template.errors + assert_equal '#', exceptions.first.cause.inspect + end + + class TestFileSystem + def read_template_file(template_path) + "{{ errors.argument_error }}" + end + end + + def test_included_template_name_with_line_numbers + old_file_system = Liquid::Template.file_system + + begin + Liquid::Template.file_system = TestFileSystem.new + template = Liquid::Template.parse("Argument error:\n{% include 'product' %}", line_numbers: true) + page = template.render('errors' => ErrorDrop.new) + ensure + Liquid::Template.file_system = old_file_system + end + assert_equal "Argument error:\nLiquid error (product line 1): argument error", page + assert_equal "product", template.errors.first.template_name + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/filter_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/filter_test.rb new file mode 100644 index 0000000..d3c880e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/filter_test.rb @@ -0,0 +1,178 @@ +require 'test_helper' + +module MoneyFilter + def money(input) + sprintf(' %d$ ', input) + end + + def money_with_underscore(input) + sprintf(' %d$ ', input) + end +end + +module CanadianMoneyFilter + def money(input) + sprintf(' %d$ CAD ', input) + end +end + +module SubstituteFilter + def substitute(input, params = {}) + input.gsub(/%\{(\w+)\}/) { |match| params[$1] } + end +end + +class FiltersTest < Minitest::Test + include Liquid + + module OverrideObjectMethodFilter + def tap(input) + "tap overridden" + end + end + + def setup + @context = Context.new + end + + def test_local_filter + @context['var'] = 1000 + @context.add_filters(MoneyFilter) + + assert_equal ' 1000$ ', Template.parse("{{var | money}}").render(@context) + end + + def test_underscore_in_filter_name + @context['var'] = 1000 + @context.add_filters(MoneyFilter) + assert_equal ' 1000$ ', Template.parse("{{var | money_with_underscore}}").render(@context) + end + + def test_second_filter_overwrites_first + @context['var'] = 1000 + @context.add_filters(MoneyFilter) + @context.add_filters(CanadianMoneyFilter) + + assert_equal ' 1000$ CAD ', Template.parse("{{var | money}}").render(@context) + end + + def test_size + @context['var'] = 'abcd' + @context.add_filters(MoneyFilter) + + assert_equal '4', Template.parse("{{var | size}}").render(@context) + end + + def test_join + @context['var'] = [1, 2, 3, 4] + + assert_equal "1 2 3 4", Template.parse("{{var | join}}").render(@context) + end + + def test_sort + @context['value'] = 3 + @context['numbers'] = [2, 1, 4, 3] + @context['words'] = ['expected', 'as', 'alphabetic'] + @context['arrays'] = ['flower', 'are'] + @context['case_sensitive'] = ['sensitive', 'Expected', 'case'] + + assert_equal '1 2 3 4', Template.parse("{{numbers | sort | join}}").render(@context) + assert_equal 'alphabetic as expected', Template.parse("{{words | sort | join}}").render(@context) + assert_equal '3', Template.parse("{{value | sort}}").render(@context) + assert_equal 'are flower', Template.parse("{{arrays | sort | join}}").render(@context) + assert_equal 'Expected case sensitive', Template.parse("{{case_sensitive | sort | join}}").render(@context) + end + + def test_sort_natural + @context['words'] = ['case', 'Assert', 'Insensitive'] + @context['hashes'] = [{ 'a' => 'A' }, { 'a' => 'b' }, { 'a' => 'C' }] + @context['objects'] = [TestObject.new('A'), TestObject.new('b'), TestObject.new('C')] + + # Test strings + assert_equal 'Assert case Insensitive', Template.parse("{{words | sort_natural | join}}").render(@context) + + # Test hashes + assert_equal 'A b C', Template.parse("{{hashes | sort_natural: 'a' | map: 'a' | join}}").render(@context) + + # Test objects + assert_equal 'A b C', Template.parse("{{objects | sort_natural: 'a' | map: 'a' | join}}").render(@context) + end + + def test_compact + @context['words'] = ['a', nil, 'b', nil, 'c'] + @context['hashes'] = [{ 'a' => 'A' }, { 'a' => nil }, { 'a' => 'C' }] + @context['objects'] = [TestObject.new('A'), TestObject.new(nil), TestObject.new('C')] + + # Test strings + assert_equal 'a b c', Template.parse("{{words | compact | join}}").render(@context) + + # Test hashes + assert_equal 'A C', Template.parse("{{hashes | compact: 'a' | map: 'a' | join}}").render(@context) + + # Test objects + assert_equal 'A C', Template.parse("{{objects | compact: 'a' | map: 'a' | join}}").render(@context) + end + + def test_strip_html + @context['var'] = "bla blub" + + assert_equal "bla blub", Template.parse("{{ var | strip_html }}").render(@context) + end + + def test_strip_html_ignore_comments_with_html + @context['var'] = "bla blub" + + assert_equal "bla blub", Template.parse("{{ var | strip_html }}").render(@context) + end + + def test_capitalize + @context['var'] = "blub" + + assert_equal "Blub", Template.parse("{{ var | capitalize }}").render(@context) + end + + def test_nonexistent_filter_is_ignored + @context['var'] = 1000 + + assert_equal '1000', Template.parse("{{ var | xyzzy }}").render(@context) + end + + def test_filter_with_keyword_arguments + @context['surname'] = 'john' + @context['input'] = 'hello %{first_name}, %{last_name}' + @context.add_filters(SubstituteFilter) + output = Template.parse(%({{ input | substitute: first_name: surname, last_name: 'doe' }})).render(@context) + assert_equal 'hello john, doe', output + end + + def test_override_object_method_in_filter + assert_equal "tap overridden", Template.parse("{{var | tap}}").render!({ 'var' => 1000 }, filters: [OverrideObjectMethodFilter]) + + # tap still treated as a non-existent filter + assert_equal "1000", Template.parse("{{var | tap}}").render!({ 'var' => 1000 }) + end +end + +class FiltersInTemplate < Minitest::Test + include Liquid + + def test_local_global + with_global_filter(MoneyFilter) do + assert_equal " 1000$ ", Template.parse("{{1000 | money}}").render!(nil, nil) + assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, filters: CanadianMoneyFilter) + assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, filters: [CanadianMoneyFilter]) + end + end + + def test_local_filter_with_deprecated_syntax + assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, CanadianMoneyFilter) + assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, [CanadianMoneyFilter]) + end +end # FiltersTest + +class TestObject < Liquid::Drop + attr_accessor :a + def initialize(a) + @a = a + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/hash_ordering_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/hash_ordering_test.rb new file mode 100644 index 0000000..dfc1c29 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/hash_ordering_test.rb @@ -0,0 +1,23 @@ +require 'test_helper' + +class HashOrderingTest < Minitest::Test + module MoneyFilter + def money(input) + sprintf(' %d$ ', input) + end + end + + module CanadianMoneyFilter + def money(input) + sprintf(' %d$ CAD ', input) + end + end + + include Liquid + + def test_global_register_order + with_global_filter(MoneyFilter, CanadianMoneyFilter) do + assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render(nil, nil) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/output_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/output_test.rb new file mode 100644 index 0000000..b4cf9d7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/output_test.rb @@ -0,0 +1,123 @@ +require 'test_helper' + +module FunnyFilter + def make_funny(input) + 'LOL' + end + + def cite_funny(input) + "LOL: #{input}" + end + + def add_smiley(input, smiley = ":-)") + "#{input} #{smiley}" + end + + def add_tag(input, tag = "p", id = "foo") + %(<#{tag} id="#{id}">#{input}) + end + + def paragraph(input) + "

      #{input}

      " + end + + def link_to(name, url) + %(#{name}) + end +end + +class OutputTest < Minitest::Test + include Liquid + + def setup + @assigns = { + 'best_cars' => 'bmw', + 'car' => { 'bmw' => 'good', 'gm' => 'bad' } + } + end + + def test_variable + text = %( {{best_cars}} ) + + expected = %( bmw ) + assert_equal expected, Template.parse(text).render!(@assigns) + end + + def test_variable_traversing_with_two_brackets + text = %({{ site.data.menu[include.menu][include.locale] }}) + assert_equal "it works!", Template.parse(text).render!( + "site" => { "data" => { "menu" => { "foo" => { "bar" => "it works!" } } } }, + "include" => { "menu" => "foo", "locale" => "bar" } + ) + end + + def test_variable_traversing + text = %( {{car.bmw}} {{car.gm}} {{car.bmw}} ) + + expected = %( good bad good ) + assert_equal expected, Template.parse(text).render!(@assigns) + end + + def test_variable_piping + text = %( {{ car.gm | make_funny }} ) + expected = %( LOL ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_variable_piping_with_input + text = %( {{ car.gm | cite_funny }} ) + expected = %( LOL: bad ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_variable_piping_with_args + text = %! {{ car.gm | add_smiley : ':-(' }} ! + expected = %| bad :-( | + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_variable_piping_with_no_args + text = %( {{ car.gm | add_smiley }} ) + expected = %| bad :-) | + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_multiple_variable_piping_with_args + text = %! {{ car.gm | add_smiley : ':-(' | add_smiley : ':-('}} ! + expected = %| bad :-( :-( | + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_variable_piping_with_multiple_args + text = %( {{ car.gm | add_tag : 'span', 'bar'}} ) + expected = %( bad ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_variable_piping_with_variable_args + text = %( {{ car.gm | add_tag : 'span', car.bmw}} ) + expected = %( bad ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_multiple_pipings + text = %( {{ best_cars | cite_funny | paragraph }} ) + expected = %(

      LOL: bmw

      ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_link_to + text = %( {{ 'Typo' | link_to: 'http://typo.leetsoft.com' }} ) + expected = %( Typo ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end +end # OutputTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/parsing_quirks_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/parsing_quirks_test.rb new file mode 100644 index 0000000..3531318 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/parsing_quirks_test.rb @@ -0,0 +1,118 @@ +require 'test_helper' + +class ParsingQuirksTest < Minitest::Test + include Liquid + + def test_parsing_css + text = " div { font-weight: bold; } " + assert_equal text, Template.parse(text).render! + end + + def test_raise_on_single_close_bracet + assert_raises(SyntaxError) do + Template.parse("text {{method} oh nos!") + end + end + + def test_raise_on_label_and_no_close_bracets + assert_raises(SyntaxError) do + Template.parse("TEST {{ ") + end + end + + def test_raise_on_label_and_no_close_bracets_percent + assert_raises(SyntaxError) do + Template.parse("TEST {% ") + end + end + + def test_error_on_empty_filter + assert Template.parse("{{test}}") + + with_error_mode(:lax) do + assert Template.parse("{{|test}}") + end + + with_error_mode(:strict) do + assert_raises(SyntaxError) { Template.parse("{{|test}}") } + assert_raises(SyntaxError) { Template.parse("{{test |a|b|}}") } + end + end + + def test_meaningless_parens_error + with_error_mode(:strict) do + assert_raises(SyntaxError) do + markup = "a == 'foo' or (b == 'bar' and c == 'baz') or false" + Template.parse("{% if #{markup} %} YES {% endif %}") + end + end + end + + def test_unexpected_characters_syntax_error + with_error_mode(:strict) do + assert_raises(SyntaxError) do + markup = "true && false" + Template.parse("{% if #{markup} %} YES {% endif %}") + end + assert_raises(SyntaxError) do + markup = "false || true" + Template.parse("{% if #{markup} %} YES {% endif %}") + end + end + end + + def test_no_error_on_lax_empty_filter + assert Template.parse("{{test |a|b|}}", error_mode: :lax) + assert Template.parse("{{test}}", error_mode: :lax) + assert Template.parse("{{|test|}}", error_mode: :lax) + end + + def test_meaningless_parens_lax + with_error_mode(:lax) do + assigns = { 'b' => 'bar', 'c' => 'baz' } + markup = "a == 'foo' or (b == 'bar' and c == 'baz') or false" + assert_template_result(' YES ', "{% if #{markup} %} YES {% endif %}", assigns) + end + end + + def test_unexpected_characters_silently_eat_logic_lax + with_error_mode(:lax) do + markup = "true && false" + assert_template_result(' YES ', "{% if #{markup} %} YES {% endif %}") + markup = "false || true" + assert_template_result('', "{% if #{markup} %} YES {% endif %}") + end + end + + def test_raise_on_invalid_tag_delimiter + assert_raises(Liquid::SyntaxError) do + Template.new.parse('{% end %}') + end + end + + def test_unanchored_filter_arguments + with_error_mode(:lax) do + assert_template_result('hi', "{{ 'hi there' | split$$$:' ' | first }}") + + assert_template_result('x', "{{ 'X' | downcase) }}") + + # After the messed up quotes a filter without parameters (reverse) should work + # but one with parameters (remove) shouldn't be detected. + assert_template_result('here', "{{ 'hi there' | split:\"t\"\" | reverse | first}}") + assert_template_result('hi ', "{{ 'hi there' | split:\"t\"\" | remove:\"i\" | first}}") + end + end + + def test_invalid_variables_work + with_error_mode(:lax) do + assert_template_result('bar', "{% assign 123foo = 'bar' %}{{ 123foo }}") + assert_template_result('123', "{% assign 123 = 'bar' %}{{ 123 }}") + end + end + + def test_extra_dots_in_ranges + with_error_mode(:lax) do + assert_template_result('12345', "{% for i in (1...5) %}{{ i }}{% endfor %}") + end + end +end # ParsingQuirksTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/render_profiling_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/render_profiling_test.rb new file mode 100644 index 0000000..d0111e7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/render_profiling_test.rb @@ -0,0 +1,154 @@ +require 'test_helper' + +class RenderProfilingTest < Minitest::Test + include Liquid + + class ProfilingFileSystem + def read_template_file(template_path) + "Rendering template {% assign template_name = '#{template_path}'%}\n{{ template_name }}" + end + end + + def setup + Liquid::Template.file_system = ProfilingFileSystem.new + end + + def test_template_allows_flagging_profiling + t = Template.parse("{{ 'a string' | upcase }}") + t.render! + + assert_nil t.profiler + end + + def test_parse_makes_available_simple_profiling + t = Template.parse("{{ 'a string' | upcase }}", profile: true) + t.render! + + assert_equal 1, t.profiler.length + + node = t.profiler[0] + assert_equal " 'a string' | upcase ", node.code + end + + def test_render_ignores_raw_strings_when_profiling + t = Template.parse("This is raw string\nstuff\nNewline", profile: true) + t.render! + + assert_equal 0, t.profiler.length + end + + def test_profiling_includes_line_numbers_of_liquid_nodes + t = Template.parse("{{ 'a string' | upcase }}\n{% increment test %}", profile: true) + t.render! + assert_equal 2, t.profiler.length + + # {{ 'a string' | upcase }} + assert_equal 1, t.profiler[0].line_number + # {{ increment test }} + assert_equal 2, t.profiler[1].line_number + end + + def test_profiling_includes_line_numbers_of_included_partials + t = Template.parse("{% include 'a_template' %}", profile: true) + t.render! + + included_children = t.profiler[0].children + + # {% assign template_name = 'a_template' %} + assert_equal 1, included_children[0].line_number + # {{ template_name }} + assert_equal 2, included_children[1].line_number + end + + def test_profiling_times_the_rendering_of_tokens + t = Template.parse("{% include 'a_template' %}", profile: true) + t.render! + + node = t.profiler[0] + refute_nil node.render_time + end + + def test_profiling_times_the_entire_render + t = Template.parse("{% include 'a_template' %}", profile: true) + t.render! + + assert t.profiler.total_render_time >= 0, "Total render time was not calculated" + end + + def test_profiling_uses_include_to_mark_children + t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}", profile: true) + t.render! + + include_node = t.profiler[1] + assert_equal 2, include_node.children.length + end + + def test_profiling_marks_children_with_the_name_of_included_partial + t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}", profile: true) + t.render! + + include_node = t.profiler[1] + include_node.children.each do |child| + assert_equal "a_template", child.partial + end + end + + def test_profiling_supports_multiple_templates + t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}\n{% include 'b_template' %}", profile: true) + t.render! + + a_template = t.profiler[1] + a_template.children.each do |child| + assert_equal "a_template", child.partial + end + + b_template = t.profiler[2] + b_template.children.each do |child| + assert_equal "b_template", child.partial + end + end + + def test_profiling_supports_rendering_the_same_partial_multiple_times + t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}\n{% include 'a_template' %}", profile: true) + t.render! + + a_template1 = t.profiler[1] + a_template1.children.each do |child| + assert_equal "a_template", child.partial + end + + a_template2 = t.profiler[2] + a_template2.children.each do |child| + assert_equal "a_template", child.partial + end + end + + def test_can_iterate_over_each_profiling_entry + t = Template.parse("{{ 'a string' | upcase }}\n{% increment test %}", profile: true) + t.render! + + timing_count = 0 + t.profiler.each do |timing| + timing_count += 1 + end + + assert_equal 2, timing_count + end + + def test_profiling_marks_children_of_if_blocks + t = Template.parse("{% if true %} {% increment test %} {{ test }} {% endif %}", profile: true) + t.render! + + assert_equal 1, t.profiler.length + assert_equal 2, t.profiler[0].children.length + end + + def test_profiling_marks_children_of_for_blocks + t = Template.parse("{% for item in collection %} {{ item }} {% endfor %}", profile: true) + t.render!({ "collection" => ["one", "two"] }) + + assert_equal 1, t.profiler.length + # Will profile each invocation of the for block + assert_equal 2, t.profiler[0].children.length + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/security_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/security_test.rb new file mode 100644 index 0000000..0357498 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/security_test.rb @@ -0,0 +1,66 @@ +require 'test_helper' + +module SecurityFilter + def add_one(input) + "#{input} + 1" + end +end + +class SecurityTest < Minitest::Test + include Liquid + + def setup + @assigns = {} + end + + def test_no_instance_eval + text = %( {{ '1+1' | instance_eval }} ) + expected = %( 1+1 ) + + assert_equal expected, Template.parse(text).render!(@assigns) + end + + def test_no_existing_instance_eval + text = %( {{ '1+1' | __instance_eval__ }} ) + expected = %( 1+1 ) + + assert_equal expected, Template.parse(text).render!(@assigns) + end + + def test_no_instance_eval_after_mixing_in_new_filter + text = %( {{ '1+1' | instance_eval }} ) + expected = %( 1+1 ) + + assert_equal expected, Template.parse(text).render!(@assigns) + end + + def test_no_instance_eval_later_in_chain + text = %( {{ '1+1' | add_one | instance_eval }} ) + expected = %( 1+1 + 1 ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: SecurityFilter) + end + + def test_does_not_add_filters_to_symbol_table + current_symbols = Symbol.all_symbols + + test = %( {{ "some_string" | a_bad_filter }} ) + + template = Template.parse(test) + assert_equal [], (Symbol.all_symbols - current_symbols) + + template.render! + assert_equal [], (Symbol.all_symbols - current_symbols) + end + + def test_does_not_add_drop_methods_to_symbol_table + current_symbols = Symbol.all_symbols + + assigns = { 'drop' => Drop.new } + assert_equal "", Template.parse("{{ drop.custom_method_1 }}", assigns).render! + assert_equal "", Template.parse("{{ drop.custom_method_2 }}", assigns).render! + assert_equal "", Template.parse("{{ drop.custom_method_3 }}", assigns).render! + + assert_equal [], (Symbol.all_symbols - current_symbols) + end +end # SecurityTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/standard_filter_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/standard_filter_test.rb new file mode 100644 index 0000000..fcbfd88 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/standard_filter_test.rb @@ -0,0 +1,535 @@ +# encoding: utf-8 + +require 'test_helper' + +class Filters + include Liquid::StandardFilters +end + +class TestThing + attr_reader :foo + + def initialize + @foo = 0 + end + + def to_s + "woot: #{@foo}" + end + + def [](whatever) + to_s + end + + def to_liquid + @foo += 1 + self + end +end + +class TestDrop < Liquid::Drop + def test + "testfoo" + end +end + +class TestEnumerable < Liquid::Drop + include Enumerable + + def each(&block) + [ { "foo" => 1, "bar" => 2 }, { "foo" => 2, "bar" => 1 }, { "foo" => 3, "bar" => 3 } ].each(&block) + end +end + +class NumberLikeThing < Liquid::Drop + def initialize(amount) + @amount = amount + end + + def to_number + @amount + end +end + +class StandardFiltersTest < Minitest::Test + include Liquid + + def setup + @filters = Filters.new + end + + def test_size + assert_equal 3, @filters.size([1, 2, 3]) + assert_equal 0, @filters.size([]) + assert_equal 0, @filters.size(nil) + end + + def test_downcase + assert_equal 'testing', @filters.downcase("Testing") + assert_equal '', @filters.downcase(nil) + end + + def test_upcase + assert_equal 'TESTING', @filters.upcase("Testing") + assert_equal '', @filters.upcase(nil) + end + + def test_slice + assert_equal 'oob', @filters.slice('foobar', 1, 3) + assert_equal 'oobar', @filters.slice('foobar', 1, 1000) + assert_equal '', @filters.slice('foobar', 1, 0) + assert_equal 'o', @filters.slice('foobar', 1, 1) + assert_equal 'bar', @filters.slice('foobar', 3, 3) + assert_equal 'ar', @filters.slice('foobar', -2, 2) + assert_equal 'ar', @filters.slice('foobar', -2, 1000) + assert_equal 'r', @filters.slice('foobar', -1) + assert_equal '', @filters.slice(nil, 0) + assert_equal '', @filters.slice('foobar', 100, 10) + assert_equal '', @filters.slice('foobar', -100, 10) + assert_equal 'oob', @filters.slice('foobar', '1', '3') + assert_raises(Liquid::ArgumentError) do + @filters.slice('foobar', nil) + end + assert_raises(Liquid::ArgumentError) do + @filters.slice('foobar', 0, "") + end + end + + def test_slice_on_arrays + input = 'foobar'.split(//) + assert_equal %w(o o b), @filters.slice(input, 1, 3) + assert_equal %w(o o b a r), @filters.slice(input, 1, 1000) + assert_equal %w(), @filters.slice(input, 1, 0) + assert_equal %w(o), @filters.slice(input, 1, 1) + assert_equal %w(b a r), @filters.slice(input, 3, 3) + assert_equal %w(a r), @filters.slice(input, -2, 2) + assert_equal %w(a r), @filters.slice(input, -2, 1000) + assert_equal %w(r), @filters.slice(input, -1) + assert_equal %w(), @filters.slice(input, 100, 10) + assert_equal %w(), @filters.slice(input, -100, 10) + end + + def test_truncate + assert_equal '1234...', @filters.truncate('1234567890', 7) + assert_equal '1234567890', @filters.truncate('1234567890', 20) + assert_equal '...', @filters.truncate('1234567890', 0) + assert_equal '1234567890', @filters.truncate('1234567890') + assert_equal "测试...", @filters.truncate("测试测试测试测试", 5) + assert_equal '12341', @filters.truncate("1234567890", 5, 1) + end + + def test_split + assert_equal ['12', '34'], @filters.split('12~34', '~') + assert_equal ['A? ', ' ,Z'], @filters.split('A? ~ ~ ~ ,Z', '~ ~ ~') + assert_equal ['A?Z'], @filters.split('A?Z', '~') + assert_equal [], @filters.split(nil, ' ') + assert_equal ['A', 'Z'], @filters.split('A1Z', 1) + end + + def test_escape + assert_equal '<strong>', @filters.escape('') + assert_equal nil, @filters.escape(nil) + assert_equal '<strong>', @filters.h('') + end + + def test_escape_once + assert_equal '<strong>Hulk</strong>', @filters.escape_once('<strong>Hulk') + end + + def test_url_encode + assert_equal 'foo%2B1%40example.com', @filters.url_encode('foo+1@example.com') + assert_equal nil, @filters.url_encode(nil) + end + + def test_url_decode + assert_equal 'foo bar', @filters.url_decode('foo+bar') + assert_equal 'foo bar', @filters.url_decode('foo%20bar') + assert_equal 'foo+1@example.com', @filters.url_decode('foo%2B1%40example.com') + assert_equal nil, @filters.url_decode(nil) + end + + def test_truncatewords + assert_equal 'one two three', @filters.truncatewords('one two three', 4) + assert_equal 'one two...', @filters.truncatewords('one two three', 2) + assert_equal 'one two three', @filters.truncatewords('one two three') + assert_equal 'Two small (13” x 5.5” x 10” high) baskets fit inside one large basket (13”...', @filters.truncatewords('Two small (13” x 5.5” x 10” high) baskets fit inside one large basket (13” x 16” x 10.5” high) with cover.', 15) + assert_equal "测试测试测试测试", @filters.truncatewords('测试测试测试测试', 5) + assert_equal 'one two1', @filters.truncatewords("one two three", 2, 1) + end + + def test_strip_html + assert_equal 'test', @filters.strip_html("
      test
      ") + assert_equal 'test', @filters.strip_html("
      test
      ") + assert_equal '', @filters.strip_html("") + assert_equal '', @filters.strip_html("") + assert_equal 'test', @filters.strip_html("test
      ") + assert_equal 'test', @filters.strip_html("test") + assert_equal '', @filters.strip_html(nil) + end + + def test_join + assert_equal '1 2 3 4', @filters.join([1, 2, 3, 4]) + assert_equal '1 - 2 - 3 - 4', @filters.join([1, 2, 3, 4], ' - ') + end + + def test_sort + assert_equal [1, 2, 3, 4], @filters.sort([4, 3, 2, 1]) + assert_equal [{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }], @filters.sort([{ "a" => 4 }, { "a" => 3 }, { "a" => 1 }, { "a" => 2 }], "a") + end + + def test_sort_when_property_is_sometimes_missing_puts_nils_last + input = [ + { "price" => 4, "handle" => "alpha" }, + { "handle" => "beta" }, + { "price" => 1, "handle" => "gamma" }, + { "handle" => "delta" }, + { "price" => 2, "handle" => "epsilon" } + ] + expectation = [ + { "price" => 1, "handle" => "gamma" }, + { "price" => 2, "handle" => "epsilon" }, + { "price" => 4, "handle" => "alpha" }, + { "handle" => "delta" }, + { "handle" => "beta" } + ] + assert_equal expectation, @filters.sort(input, "price") + end + + def test_sort_empty_array + assert_equal [], @filters.sort([], "a") + end + + def test_sort_natural_empty_array + assert_equal [], @filters.sort_natural([], "a") + end + + def test_legacy_sort_hash + assert_equal [{ a: 1, b: 2 }], @filters.sort({ a: 1, b: 2 }) + end + + def test_numerical_vs_lexicographical_sort + assert_equal [2, 10], @filters.sort([10, 2]) + assert_equal [{ "a" => 2 }, { "a" => 10 }], @filters.sort([{ "a" => 10 }, { "a" => 2 }], "a") + assert_equal ["10", "2"], @filters.sort(["10", "2"]) + assert_equal [{ "a" => "10" }, { "a" => "2" }], @filters.sort([{ "a" => "10" }, { "a" => "2" }], "a") + end + + def test_uniq + assert_equal ["foo"], @filters.uniq("foo") + assert_equal [1, 3, 2, 4], @filters.uniq([1, 1, 3, 2, 3, 1, 4, 3, 2, 1]) + assert_equal [{ "a" => 1 }, { "a" => 3 }, { "a" => 2 }], @filters.uniq([{ "a" => 1 }, { "a" => 3 }, { "a" => 1 }, { "a" => 2 }], "a") + testdrop = TestDrop.new + assert_equal [testdrop], @filters.uniq([testdrop, TestDrop.new], 'test') + end + + def test_uniq_empty_array + assert_equal [], @filters.uniq([], "a") + end + + def test_compact_empty_array + assert_equal [], @filters.compact([], "a") + end + + def test_reverse + assert_equal [4, 3, 2, 1], @filters.reverse([1, 2, 3, 4]) + end + + def test_legacy_reverse_hash + assert_equal [{ a: 1, b: 2 }], @filters.reverse(a: 1, b: 2) + end + + def test_map + assert_equal [1, 2, 3, 4], @filters.map([{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }], 'a') + assert_template_result 'abc', "{{ ary | map:'foo' | map:'bar' }}", + 'ary' => [{ 'foo' => { 'bar' => 'a' } }, { 'foo' => { 'bar' => 'b' } }, { 'foo' => { 'bar' => 'c' } }] + end + + def test_map_doesnt_call_arbitrary_stuff + assert_template_result "", '{{ "foo" | map: "__id__" }}' + assert_template_result "", '{{ "foo" | map: "inspect" }}' + end + + def test_map_calls_to_liquid + t = TestThing.new + assert_template_result "woot: 1", '{{ foo | map: "whatever" }}', "foo" => [t] + end + + def test_map_on_hashes + assert_template_result "4217", '{{ thing | map: "foo" | map: "bar" }}', + "thing" => { "foo" => [ { "bar" => 42 }, { "bar" => 17 } ] } + end + + def test_legacy_map_on_hashes_with_dynamic_key + template = "{% assign key = 'foo' %}{{ thing | map: key | map: 'bar' }}" + hash = { "foo" => { "bar" => 42 } } + assert_template_result "42", template, "thing" => hash + end + + def test_sort_calls_to_liquid + t = TestThing.new + Liquid::Template.parse('{{ foo | sort: "whatever" }}').render("foo" => [t]) + assert t.foo > 0 + end + + def test_map_over_proc + drop = TestDrop.new + p = proc{ drop } + templ = '{{ procs | map: "test" }}' + assert_template_result "testfoo", templ, "procs" => [p] + end + + def test_map_over_drops_returning_procs + drops = [ + { + "proc" => ->{ "foo" }, + }, + { + "proc" => ->{ "bar" }, + }, + ] + templ = '{{ drops | map: "proc" }}' + assert_template_result "foobar", templ, "drops" => drops + end + + def test_map_works_on_enumerables + assert_template_result "123", '{{ foo | map: "foo" }}', "foo" => TestEnumerable.new + end + + def test_sort_works_on_enumerables + assert_template_result "213", '{{ foo | sort: "bar" | map: "foo" }}', "foo" => TestEnumerable.new + end + + def test_first_and_last_call_to_liquid + assert_template_result 'foobar', '{{ foo | first }}', 'foo' => [ThingWithToLiquid.new] + assert_template_result 'foobar', '{{ foo | last }}', 'foo' => [ThingWithToLiquid.new] + end + + def test_truncate_calls_to_liquid + assert_template_result "wo...", '{{ foo | truncate: 5 }}', "foo" => TestThing.new + end + + def test_date + assert_equal 'May', @filters.date(Time.parse("2006-05-05 10:00:00"), "%B") + assert_equal 'June', @filters.date(Time.parse("2006-06-05 10:00:00"), "%B") + assert_equal 'July', @filters.date(Time.parse("2006-07-05 10:00:00"), "%B") + + assert_equal 'May', @filters.date("2006-05-05 10:00:00", "%B") + assert_equal 'June', @filters.date("2006-06-05 10:00:00", "%B") + assert_equal 'July', @filters.date("2006-07-05 10:00:00", "%B") + + assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", "") + assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", "") + assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", "") + assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", nil) + + assert_equal '07/05/2006', @filters.date("2006-07-05 10:00:00", "%m/%d/%Y") + + assert_equal "07/16/2004", @filters.date("Fri Jul 16 01:00:00 2004", "%m/%d/%Y") + assert_equal "#{Date.today.year}", @filters.date('now', '%Y') + assert_equal "#{Date.today.year}", @filters.date('today', '%Y') + assert_equal "#{Date.today.year}", @filters.date('Today', '%Y') + + assert_equal nil, @filters.date(nil, "%B") + + assert_equal '', @filters.date('', "%B") + + with_timezone("UTC") do + assert_equal "07/05/2006", @filters.date(1152098955, "%m/%d/%Y") + assert_equal "07/05/2006", @filters.date("1152098955", "%m/%d/%Y") + end + end + + def test_first_last + assert_equal 1, @filters.first([1, 2, 3]) + assert_equal 3, @filters.last([1, 2, 3]) + assert_equal nil, @filters.first([]) + assert_equal nil, @filters.last([]) + end + + def test_replace + assert_equal '2 2 2 2', @filters.replace('1 1 1 1', '1', 2) + assert_equal '2 2 2 2', @filters.replace('1 1 1 1', 1, 2) + assert_equal '2 1 1 1', @filters.replace_first('1 1 1 1', '1', 2) + assert_equal '2 1 1 1', @filters.replace_first('1 1 1 1', 1, 2) + assert_template_result '2 1 1 1', "{{ '1 1 1 1' | replace_first: '1', 2 }}" + end + + def test_remove + assert_equal ' ', @filters.remove("a a a a", 'a') + assert_equal ' ', @filters.remove("1 1 1 1", 1) + assert_equal 'a a a', @filters.remove_first("a a a a", 'a ') + assert_equal ' 1 1 1', @filters.remove_first("1 1 1 1", 1) + assert_template_result 'a a a', "{{ 'a a a a' | remove_first: 'a ' }}" + end + + def test_pipes_in_string_arguments + assert_template_result 'foobar', "{{ 'foo|bar' | remove: '|' }}" + end + + def test_strip + assert_template_result 'ab c', "{{ source | strip }}", 'source' => " ab c " + assert_template_result 'ab c', "{{ source | strip }}", 'source' => " \tab c \n \t" + end + + def test_lstrip + assert_template_result 'ab c ', "{{ source | lstrip }}", 'source' => " ab c " + assert_template_result "ab c \n \t", "{{ source | lstrip }}", 'source' => " \tab c \n \t" + end + + def test_rstrip + assert_template_result " ab c", "{{ source | rstrip }}", 'source' => " ab c " + assert_template_result " \tab c", "{{ source | rstrip }}", 'source' => " \tab c \n \t" + end + + def test_strip_newlines + assert_template_result 'abc', "{{ source | strip_newlines }}", 'source' => "a\nb\nc" + assert_template_result 'abc', "{{ source | strip_newlines }}", 'source' => "a\r\nb\nc" + end + + def test_newlines_to_br + assert_template_result "a
      \nb
      \nc", "{{ source | newline_to_br }}", 'source' => "a\nb\nc" + end + + def test_plus + assert_template_result "2", "{{ 1 | plus:1 }}" + assert_template_result "2.0", "{{ '1' | plus:'1.0' }}" + + assert_template_result "5", "{{ price | plus:'2' }}", 'price' => NumberLikeThing.new(3) + end + + def test_minus + assert_template_result "4", "{{ input | minus:operand }}", 'input' => 5, 'operand' => 1 + assert_template_result "2.3", "{{ '4.3' | minus:'2' }}" + + assert_template_result "5", "{{ price | minus:'2' }}", 'price' => NumberLikeThing.new(7) + end + + def test_abs + assert_template_result "17", "{{ 17 | abs }}" + assert_template_result "17", "{{ -17 | abs }}" + assert_template_result "17", "{{ '17' | abs }}" + assert_template_result "17", "{{ '-17' | abs }}" + assert_template_result "0", "{{ 0 | abs }}" + assert_template_result "0", "{{ '0' | abs }}" + assert_template_result "17.42", "{{ 17.42 | abs }}" + assert_template_result "17.42", "{{ -17.42 | abs }}" + assert_template_result "17.42", "{{ '17.42' | abs }}" + assert_template_result "17.42", "{{ '-17.42' | abs }}" + end + + def test_times + assert_template_result "12", "{{ 3 | times:4 }}" + assert_template_result "0", "{{ 'foo' | times:4 }}" + assert_template_result "6", "{{ '2.1' | times:3 | replace: '.','-' | plus:0}}" + assert_template_result "7.25", "{{ 0.0725 | times:100 }}" + assert_template_result "-7.25", '{{ "-0.0725" | times:100 }}' + assert_template_result "7.25", '{{ "-0.0725" | times: -100 }}' + assert_template_result "4", "{{ price | times:2 }}", 'price' => NumberLikeThing.new(2) + end + + def test_divided_by + assert_template_result "4", "{{ 12 | divided_by:3 }}" + assert_template_result "4", "{{ 14 | divided_by:3 }}" + + assert_template_result "5", "{{ 15 | divided_by:3 }}" + assert_equal "Liquid error: divided by 0", Template.parse("{{ 5 | divided_by:0 }}").render + + assert_template_result "0.5", "{{ 2.0 | divided_by:4 }}" + assert_raises(Liquid::ZeroDivisionError) do + assert_template_result "4", "{{ 1 | modulo: 0 }}" + end + + assert_template_result "5", "{{ price | divided_by:2 }}", 'price' => NumberLikeThing.new(10) + end + + def test_modulo + assert_template_result "1", "{{ 3 | modulo:2 }}" + assert_raises(Liquid::ZeroDivisionError) do + assert_template_result "4", "{{ 1 | modulo: 0 }}" + end + + assert_template_result "1", "{{ price | modulo:2 }}", 'price' => NumberLikeThing.new(3) + end + + def test_round + assert_template_result "5", "{{ input | round }}", 'input' => 4.6 + assert_template_result "4", "{{ '4.3' | round }}" + assert_template_result "4.56", "{{ input | round: 2 }}", 'input' => 4.5612 + assert_raises(Liquid::FloatDomainError) do + assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | round }}" + end + + assert_template_result "5", "{{ price | round }}", 'price' => NumberLikeThing.new(4.6) + assert_template_result "4", "{{ price | round }}", 'price' => NumberLikeThing.new(4.3) + end + + def test_ceil + assert_template_result "5", "{{ input | ceil }}", 'input' => 4.6 + assert_template_result "5", "{{ '4.3' | ceil }}" + assert_raises(Liquid::FloatDomainError) do + assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | ceil }}" + end + + assert_template_result "5", "{{ price | ceil }}", 'price' => NumberLikeThing.new(4.6) + end + + def test_floor + assert_template_result "4", "{{ input | floor }}", 'input' => 4.6 + assert_template_result "4", "{{ '4.3' | floor }}" + assert_raises(Liquid::FloatDomainError) do + assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | floor }}" + end + + assert_template_result "5", "{{ price | floor }}", 'price' => NumberLikeThing.new(5.4) + end + + def test_append + assigns = { 'a' => 'bc', 'b' => 'd' } + assert_template_result('bcd', "{{ a | append: 'd'}}", assigns) + assert_template_result('bcd', "{{ a | append: b}}", assigns) + end + + def test_concat + assert_equal [1, 2, 3, 4], @filters.concat([1, 2], [3, 4]) + assert_equal [1, 2, 'a'], @filters.concat([1, 2], ['a']) + assert_equal [1, 2, 10], @filters.concat([1, 2], [10]) + + assert_raises(Liquid::ArgumentError, "concat filter requires an array argument") do + @filters.concat([1, 2], 10) + end + end + + def test_prepend + assigns = { 'a' => 'bc', 'b' => 'a' } + assert_template_result('abc', "{{ a | prepend: 'a'}}", assigns) + assert_template_result('abc', "{{ a | prepend: b}}", assigns) + end + + def test_default + assert_equal "foo", @filters.default("foo", "bar") + assert_equal "bar", @filters.default(nil, "bar") + assert_equal "bar", @filters.default("", "bar") + assert_equal "bar", @filters.default(false, "bar") + assert_equal "bar", @filters.default([], "bar") + assert_equal "bar", @filters.default({}, "bar") + end + + def test_cannot_access_private_methods + assert_template_result('a', "{{ 'a' | to_number }}") + end + + def test_date_raises_nothing + assert_template_result('', "{{ '' | date: '%D' }}") + assert_template_result('abc', "{{ 'abc' | date: '%D' }}") + end + + private + + def with_timezone(tz) + old_tz = ENV['TZ'] + ENV['TZ'] = tz + yield + ensure + ENV['TZ'] = old_tz + end +end # StandardFiltersTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/break_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/break_tag_test.rb new file mode 100644 index 0000000..0fbde83 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/break_tag_test.rb @@ -0,0 +1,15 @@ +require 'test_helper' + +class BreakTagTest < Minitest::Test + include Liquid + + # tests that no weird errors are raised if break is called outside of a + # block + def test_break_with_no_block + assigns = { 'i' => 1 } + markup = '{% break %}' + expected = '' + + assert_template_result(expected, markup, assigns) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/continue_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/continue_tag_test.rb new file mode 100644 index 0000000..ce4c158 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/continue_tag_test.rb @@ -0,0 +1,15 @@ +require 'test_helper' + +class ContinueTagTest < Minitest::Test + include Liquid + + # tests that no weird errors are raised if continue is called outside of a + # block + def test_continue_with_no_block + assigns = {} + markup = '{% continue %}' + expected = '' + + assert_template_result(expected, markup, assigns) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/for_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/for_tag_test.rb new file mode 100644 index 0000000..d9d396f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/for_tag_test.rb @@ -0,0 +1,410 @@ +require 'test_helper' + +class ThingWithValue < Liquid::Drop + def value + 3 + end +end + +class ForTagTest < Minitest::Test + include Liquid + + def test_for + assert_template_result(' yo yo yo yo ', '{%for item in array%} yo {%endfor%}', 'array' => [1, 2, 3, 4]) + assert_template_result('yoyo', '{%for item in array%}yo{%endfor%}', 'array' => [1, 2]) + assert_template_result(' yo ', '{%for item in array%} yo {%endfor%}', 'array' => [1]) + assert_template_result('', '{%for item in array%}{%endfor%}', 'array' => [1, 2]) + expected = < [1, 2, 3]) + end + + def test_for_reversed + assigns = { 'array' => [ 1, 2, 3] } + assert_template_result('321', '{%for item in array reversed %}{{item}}{%endfor%}', assigns) + end + + def test_for_with_range + assert_template_result(' 1 2 3 ', '{%for item in (1..3) %} {{item}} {%endfor%}') + + assert_raises(Liquid::ArgumentError) do + Template.parse('{% for i in (a..2) %}{% endfor %}').render!("a" => [1, 2]) + end + + assert_template_result(' 0 1 2 3 ', '{% for item in (a..3) %} {{item}} {% endfor %}', "a" => "invalid integer") + end + + def test_for_with_variable_range + assert_template_result(' 1 2 3 ', '{%for item in (1..foobar) %} {{item}} {%endfor%}', "foobar" => 3) + end + + def test_for_with_hash_value_range + foobar = { "value" => 3 } + assert_template_result(' 1 2 3 ', '{%for item in (1..foobar.value) %} {{item}} {%endfor%}', "foobar" => foobar) + end + + def test_for_with_drop_value_range + foobar = ThingWithValue.new + assert_template_result(' 1 2 3 ', '{%for item in (1..foobar.value) %} {{item}} {%endfor%}', "foobar" => foobar) + end + + def test_for_with_variable + assert_template_result(' 1 2 3 ', '{%for item in array%} {{item}} {%endfor%}', 'array' => [1, 2, 3]) + assert_template_result('123', '{%for item in array%}{{item}}{%endfor%}', 'array' => [1, 2, 3]) + assert_template_result('123', '{% for item in array %}{{item}}{% endfor %}', 'array' => [1, 2, 3]) + assert_template_result('abcd', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', 'b', 'c', 'd']) + assert_template_result('a b c', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', ' ', 'b', ' ', 'c']) + assert_template_result('abc', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', '', 'b', '', 'c']) + end + + def test_for_helpers + assigns = { 'array' => [1, 2, 3] } + assert_template_result(' 1/3 2/3 3/3 ', + '{%for item in array%} {{forloop.index}}/{{forloop.length}} {%endfor%}', + assigns) + assert_template_result(' 1 2 3 ', '{%for item in array%} {{forloop.index}} {%endfor%}', assigns) + assert_template_result(' 0 1 2 ', '{%for item in array%} {{forloop.index0}} {%endfor%}', assigns) + assert_template_result(' 2 1 0 ', '{%for item in array%} {{forloop.rindex0}} {%endfor%}', assigns) + assert_template_result(' 3 2 1 ', '{%for item in array%} {{forloop.rindex}} {%endfor%}', assigns) + assert_template_result(' true false false ', '{%for item in array%} {{forloop.first}} {%endfor%}', assigns) + assert_template_result(' false false true ', '{%for item in array%} {{forloop.last}} {%endfor%}', assigns) + end + + def test_for_and_if + assigns = { 'array' => [1, 2, 3] } + assert_template_result('+--', + '{%for item in array%}{% if forloop.first %}+{% else %}-{% endif %}{%endfor%}', + assigns) + end + + def test_for_else + assert_template_result('+++', '{%for item in array%}+{%else%}-{%endfor%}', 'array' => [1, 2, 3]) + assert_template_result('-', '{%for item in array%}+{%else%}-{%endfor%}', 'array' => []) + assert_template_result('-', '{%for item in array%}+{%else%}-{%endfor%}', 'array' => nil) + end + + def test_limiting + assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } + assert_template_result('12', '{%for i in array limit:2 %}{{ i }}{%endfor%}', assigns) + assert_template_result('1234', '{%for i in array limit:4 %}{{ i }}{%endfor%}', assigns) + assert_template_result('3456', '{%for i in array limit:4 offset:2 %}{{ i }}{%endfor%}', assigns) + assert_template_result('3456', '{%for i in array limit: 4 offset: 2 %}{{ i }}{%endfor%}', assigns) + end + + def test_dynamic_variable_limiting + assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } + assigns['limit'] = 2 + assigns['offset'] = 2 + + assert_template_result('34', '{%for i in array limit: limit offset: offset %}{{ i }}{%endfor%}', assigns) + end + + def test_nested_for + assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] } + assert_template_result('123456', '{%for item in array%}{%for i in item%}{{ i }}{%endfor%}{%endfor%}', assigns) + end + + def test_offset_only + assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } + assert_template_result('890', '{%for i in array offset:7 %}{{ i }}{%endfor%}', assigns) + end + + def test_pause_resume + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } } + markup = <<-MKUP + {%for i in array.items limit: 3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit: 3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit: 3 %}{{i}}{%endfor%} + MKUP + expected = <<-XPCTD + 123 + next + 456 + next + 789 + XPCTD + assert_template_result(expected, markup, assigns) + end + + def test_pause_resume_limit + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } } + markup = <<-MKUP + {%for i in array.items limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:1 %}{{i}}{%endfor%} + MKUP + expected = <<-XPCTD + 123 + next + 456 + next + 7 + XPCTD + assert_template_result(expected, markup, assigns) + end + + def test_pause_resume_BIG_limit + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } } + markup = <<-MKUP + {%for i in array.items limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:1000 %}{{i}}{%endfor%} + MKUP + expected = <<-XPCTD + 123 + next + 456 + next + 7890 + XPCTD + assert_template_result(expected, markup, assigns) + end + + def test_pause_resume_BIG_offset + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } } + markup = '{%for i in array.items limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:3 offset:1000 %}{{i}}{%endfor%}' + expected = '123 + next + 456 + next + ' + assert_template_result(expected, markup, assigns) + end + + def test_for_with_break + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } } + + markup = '{% for i in array.items %}{% break %}{% endfor %}' + expected = "" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{{ i }}{% break %}{% endfor %}' + expected = "1" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{% break %}{{ i }}{% endfor %}' + expected = "" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{{ i }}{% if i > 3 %}{% break %}{% endif %}{% endfor %}' + expected = "1234" + assert_template_result(expected, markup, assigns) + + # tests to ensure it only breaks out of the local for loop + # and not all of them. + assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] } + markup = '{% for item in array %}' \ + '{% for i in item %}' \ + '{% if i == 1 %}' \ + '{% break %}' \ + '{% endif %}' \ + '{{ i }}' \ + '{% endfor %}' \ + '{% endfor %}' + expected = '3456' + assert_template_result(expected, markup, assigns) + + # test break does nothing when unreached + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } } + markup = '{% for i in array.items %}{% if i == 9999 %}{% break %}{% endif %}{{ i }}{% endfor %}' + expected = '12345' + assert_template_result(expected, markup, assigns) + end + + def test_for_with_continue + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } } + + markup = '{% for i in array.items %}{% continue %}{% endfor %}' + expected = "" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{{ i }}{% continue %}{% endfor %}' + expected = "12345" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{% continue %}{{ i }}{% endfor %}' + expected = "" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{% if i > 3 %}{% continue %}{% endif %}{{ i }}{% endfor %}' + expected = "123" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{% if i == 3 %}{% continue %}{% else %}{{ i }}{% endif %}{% endfor %}' + expected = "1245" + assert_template_result(expected, markup, assigns) + + # tests to ensure it only continues the local for loop and not all of them. + assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] } + markup = '{% for item in array %}' \ + '{% for i in item %}' \ + '{% if i == 1 %}' \ + '{% continue %}' \ + '{% endif %}' \ + '{{ i }}' \ + '{% endfor %}' \ + '{% endfor %}' + expected = '23456' + assert_template_result(expected, markup, assigns) + + # test continue does nothing when unreached + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } } + markup = '{% for i in array.items %}{% if i == 9999 %}{% continue %}{% endif %}{{ i }}{% endfor %}' + expected = '12345' + assert_template_result(expected, markup, assigns) + end + + def test_for_tag_string + # ruby 1.8.7 "String".each => Enumerator with single "String" element. + # ruby 1.9.3 no longer supports .each on String though we mimic + # the functionality for backwards compatibility + + assert_template_result('test string', + '{%for val in string%}{{val}}{%endfor%}', + 'string' => "test string") + + assert_template_result('test string', + '{%for val in string limit:1%}{{val}}{%endfor%}', + 'string' => "test string") + + assert_template_result('val-string-1-1-0-1-0-true-true-test string', + '{%for val in string%}' \ + '{{forloop.name}}-' \ + '{{forloop.index}}-' \ + '{{forloop.length}}-' \ + '{{forloop.index0}}-' \ + '{{forloop.rindex}}-' \ + '{{forloop.rindex0}}-' \ + '{{forloop.first}}-' \ + '{{forloop.last}}-' \ + '{{val}}{%endfor%}', + 'string' => "test string") + end + + def test_for_parentloop_references_parent_loop + assert_template_result('1.1 1.2 1.3 2.1 2.2 2.3 ', + '{% for inner in outer %}{% for k in inner %}' \ + '{{ forloop.parentloop.index }}.{{ forloop.index }} ' \ + '{% endfor %}{% endfor %}', + 'outer' => [[1, 1, 1], [1, 1, 1]]) + end + + def test_for_parentloop_nil_when_not_present + assert_template_result('.1 .2 ', + '{% for inner in outer %}' \ + '{{ forloop.parentloop.index }}.{{ forloop.index }} ' \ + '{% endfor %}', + 'outer' => [[1, 1, 1], [1, 1, 1]]) + end + + def test_inner_for_over_empty_input + assert_template_result 'oo', '{% for a in (1..2) %}o{% for b in empty %}{% endfor %}{% endfor %}' + end + + def test_blank_string_not_iterable + assert_template_result('', "{% for char in characters %}I WILL NOT BE OUTPUT{% endfor %}", 'characters' => '') + end + + def test_bad_variable_naming_in_for_loop + assert_raises(Liquid::SyntaxError) do + Liquid::Template.parse('{% for a/b in x %}{% endfor %}') + end + end + + def test_spacing_with_variable_naming_in_for_loop + expected = '12345' + template = '{% for item in items %}{{item}}{% endfor %}' + assigns = { 'items' => [1, 2, 3, 4, 5] } + assert_template_result(expected, template, assigns) + end + + class LoaderDrop < Liquid::Drop + attr_accessor :each_called, :load_slice_called + + def initialize(data) + @data = data + end + + def each + @each_called = true + @data.each { |el| yield el } + end + + def load_slice(from, to) + @load_slice_called = true + @data[(from..to - 1)] + end + end + + def test_iterate_with_each_when_no_limit_applied + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + assigns = { 'items' => loader } + expected = '12345' + template = '{% for item in items %}{{item}}{% endfor %}' + assert_template_result(expected, template, assigns) + assert loader.each_called + assert !loader.load_slice_called + end + + def test_iterate_with_load_slice_when_limit_applied + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + assigns = { 'items' => loader } + expected = '1' + template = '{% for item in items limit:1 %}{{item}}{% endfor %}' + assert_template_result(expected, template, assigns) + assert !loader.each_called + assert loader.load_slice_called + end + + def test_iterate_with_load_slice_when_limit_and_offset_applied + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + assigns = { 'items' => loader } + expected = '34' + template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}' + assert_template_result(expected, template, assigns) + assert !loader.each_called + assert loader.load_slice_called + end + + def test_iterate_with_load_slice_returns_same_results_as_without + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + loader_assigns = { 'items' => loader } + array_assigns = { 'items' => [1, 2, 3, 4, 5] } + expected = '34' + template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}' + assert_template_result(expected, template, loader_assigns) + assert_template_result(expected, template, array_assigns) + end + + def test_for_cleans_up_registers + context = Context.new(ErrorDrop.new) + + assert_raises(StandardError) do + Liquid::Template.parse('{% for i in (1..2) %}{{ standard_error }}{% endfor %}').render!(context) + end + + assert context.registers[:for_stack].empty? + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/if_else_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/if_else_tag_test.rb new file mode 100644 index 0000000..45a5d3a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/if_else_tag_test.rb @@ -0,0 +1,188 @@ +require 'test_helper' + +class IfElseTagTest < Minitest::Test + include Liquid + + def test_if + assert_template_result(' ', ' {% if false %} this text should not go into the output {% endif %} ') + assert_template_result(' this text should go into the output ', + ' {% if true %} this text should go into the output {% endif %} ') + assert_template_result(' you rock ?', '{% if false %} you suck {% endif %} {% if true %} you rock {% endif %}?') + end + + def test_literal_comparisons + assert_template_result(' NO ', '{% assign v = false %}{% if v %} YES {% else %} NO {% endif %}') + assert_template_result(' YES ', '{% assign v = nil %}{% if v == nil %} YES {% else %} NO {% endif %}') + end + + def test_if_else + assert_template_result(' YES ', '{% if false %} NO {% else %} YES {% endif %}') + assert_template_result(' YES ', '{% if true %} YES {% else %} NO {% endif %}') + assert_template_result(' YES ', '{% if "foo" %} YES {% else %} NO {% endif %}') + end + + def test_if_boolean + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => true) + end + + def test_if_or + assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => true, 'b' => true) + assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => true, 'b' => false) + assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => false, 'b' => true) + assert_template_result('', '{% if a or b %} YES {% endif %}', 'a' => false, 'b' => false) + + assert_template_result(' YES ', '{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => true) + assert_template_result('', '{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => false) + end + + def test_if_or_with_operators + assert_template_result(' YES ', '{% if a == true or b == true %} YES {% endif %}', 'a' => true, 'b' => true) + assert_template_result(' YES ', '{% if a == true or b == false %} YES {% endif %}', 'a' => true, 'b' => true) + assert_template_result('', '{% if a == false or b == false %} YES {% endif %}', 'a' => true, 'b' => true) + end + + def test_comparison_of_strings_containing_and_or_or + awful_markup = "a == 'and' and b == 'or' and c == 'foo and bar' and d == 'bar or baz' and e == 'foo' and foo and bar" + assigns = { 'a' => 'and', 'b' => 'or', 'c' => 'foo and bar', 'd' => 'bar or baz', 'e' => 'foo', 'foo' => true, 'bar' => true } + assert_template_result(' YES ', "{% if #{awful_markup} %} YES {% endif %}", assigns) + end + + def test_comparison_of_expressions_starting_with_and_or_or + assigns = { 'order' => { 'items_count' => 0 }, 'android' => { 'name' => 'Roy' } } + assert_template_result("YES", + "{% if android.name == 'Roy' %}YES{% endif %}", + assigns) + assert_template_result("YES", + "{% if order.items_count == 0 %}YES{% endif %}", + assigns) + end + + def test_if_and + assert_template_result(' YES ', '{% if true and true %} YES {% endif %}') + assert_template_result('', '{% if false and true %} YES {% endif %}') + assert_template_result('', '{% if false and true %} YES {% endif %}') + end + + def test_hash_miss_generates_false + assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => {}) + end + + def test_if_from_variable + assert_template_result('', '{% if var %} NO {% endif %}', 'var' => false) + assert_template_result('', '{% if var %} NO {% endif %}', 'var' => nil) + assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => { 'bar' => false }) + assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => {}) + assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => nil) + assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => true) + + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => "text") + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => true) + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => 1) + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => {}) + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => []) + assert_template_result(' YES ', '{% if "foo" %} YES {% endif %}') + assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => true }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => "text" }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => 1 }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => {} }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => [] }) + + assert_template_result(' YES ', '{% if var %} NO {% else %} YES {% endif %}', 'var' => false) + assert_template_result(' YES ', '{% if var %} NO {% else %} YES {% endif %}', 'var' => nil) + assert_template_result(' YES ', '{% if var %} YES {% else %} NO {% endif %}', 'var' => true) + assert_template_result(' YES ', '{% if "foo" %} YES {% else %} NO {% endif %}', 'var' => "text") + + assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => { 'bar' => false }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => { 'bar' => true }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => { 'bar' => "text" }) + assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => { 'notbar' => true }) + assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => {}) + assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'notfoo' => { 'bar' => true }) + end + + def test_nested_if + assert_template_result('', '{% if false %}{% if false %} NO {% endif %}{% endif %}') + assert_template_result('', '{% if false %}{% if true %} NO {% endif %}{% endif %}') + assert_template_result('', '{% if true %}{% if false %} NO {% endif %}{% endif %}') + assert_template_result(' YES ', '{% if true %}{% if true %} YES {% endif %}{% endif %}') + + assert_template_result(' YES ', '{% if true %}{% if true %} YES {% else %} NO {% endif %}{% else %} NO {% endif %}') + assert_template_result(' YES ', '{% if true %}{% if false %} NO {% else %} YES {% endif %}{% else %} NO {% endif %}') + assert_template_result(' YES ', '{% if false %}{% if true %} NO {% else %} NONO {% endif %}{% else %} YES {% endif %}') + end + + def test_comparisons_on_null + assert_template_result('', '{% if null < 10 %} NO {% endif %}') + assert_template_result('', '{% if null <= 10 %} NO {% endif %}') + assert_template_result('', '{% if null >= 10 %} NO {% endif %}') + assert_template_result('', '{% if null > 10 %} NO {% endif %}') + + assert_template_result('', '{% if 10 < null %} NO {% endif %}') + assert_template_result('', '{% if 10 <= null %} NO {% endif %}') + assert_template_result('', '{% if 10 >= null %} NO {% endif %}') + assert_template_result('', '{% if 10 > null %} NO {% endif %}') + end + + def test_else_if + assert_template_result('0', '{% if 0 == 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}') + assert_template_result('1', '{% if 0 != 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}') + assert_template_result('2', '{% if 0 != 0 %}0{% elsif 1 != 1%}1{% else %}2{% endif %}') + + assert_template_result('elsif', '{% if false %}if{% elsif true %}elsif{% endif %}') + end + + def test_syntax_error_no_variable + assert_raises(SyntaxError){ assert_template_result('', '{% if jerry == 1 %}') } + end + + def test_syntax_error_no_expression + assert_raises(SyntaxError) { assert_template_result('', '{% if %}') } + end + + def test_if_with_custom_condition + original_op = Condition.operators['contains'] + Condition.operators['contains'] = :[] + + assert_template_result('yes', %({% if 'bob' contains 'o' %}yes{% endif %})) + assert_template_result('no', %({% if 'bob' contains 'f' %}yes{% else %}no{% endif %})) + ensure + Condition.operators['contains'] = original_op + end + + def test_operators_are_ignored_unless_isolated + original_op = Condition.operators['contains'] + Condition.operators['contains'] = :[] + + assert_template_result('yes', + %({% if 'gnomeslab-and-or-liquid' contains 'gnomeslab-and-or-liquid' %}yes{% endif %})) + ensure + Condition.operators['contains'] = original_op + end + + def test_operators_are_whitelisted + assert_raises(SyntaxError) do + assert_template_result('', %({% if 1 or throw or or 1 %}yes{% endif %})) + end + end + + def test_multiple_conditions + tpl = "{% if a or b and c %}true{% else %}false{% endif %}" + + tests = { + [true, true, true] => true, + [true, true, false] => true, + [true, false, true] => true, + [true, false, false] => true, + [false, true, true] => true, + [false, true, false] => false, + [false, false, true] => false, + [false, false, false] => false, + } + + tests.each do |vals, expected| + a, b, c = vals + assigns = { 'a' => a, 'b' => b, 'c' => c } + assert_template_result expected.to_s, tpl, assigns, assigns.to_s + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/include_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/include_tag_test.rb new file mode 100644 index 0000000..7b4e3f6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/include_tag_test.rb @@ -0,0 +1,238 @@ +require 'test_helper' + +class TestFileSystem + def read_template_file(template_path) + case template_path + when "product" + "Product: {{ product.title }} " + + when "locale_variables" + "Locale: {{echo1}} {{echo2}}" + + when "variant" + "Variant: {{ variant.title }}" + + when "nested_template" + "{% include 'header' %} {% include 'body' %} {% include 'footer' %}" + + when "body" + "body {% include 'body_detail' %}" + + when "nested_product_template" + "Product: {{ nested_product_template.title }} {%include 'details'%} " + + when "recursively_nested_template" + "-{% include 'recursively_nested_template' %}" + + when "pick_a_source" + "from TestFileSystem" + + when 'assignments' + "{% assign foo = 'bar' %}" + + else + template_path + end + end +end + +class OtherFileSystem + def read_template_file(template_path) + 'from OtherFileSystem' + end +end + +class CountingFileSystem + attr_reader :count + def read_template_file(template_path) + @count ||= 0 + @count += 1 + 'from CountingFileSystem' + end +end + +class CustomInclude < Liquid::Tag + Syntax = /(#{Liquid::QuotedFragment}+)(\s+(?:with|for)\s+(#{Liquid::QuotedFragment}+))?/o + + def initialize(tag_name, markup, tokens) + markup =~ Syntax + @template_name = $1 + super + end + + def parse(tokens) + end + + def render(context) + @template_name[1..-2] + end +end + +class IncludeTagTest < Minitest::Test + include Liquid + + def setup + Liquid::Template.file_system = TestFileSystem.new + end + + def test_include_tag_looks_for_file_system_in_registers_first + assert_equal 'from OtherFileSystem', + Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: OtherFileSystem.new }) + end + + def test_include_tag_with + assert_template_result "Product: Draft 151cm ", + "{% include 'product' with products[0] %}", "products" => [ { 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' } ] + end + + def test_include_tag_with_default_name + assert_template_result "Product: Draft 151cm ", + "{% include 'product' %}", "product" => { 'title' => 'Draft 151cm' } + end + + def test_include_tag_for + assert_template_result "Product: Draft 151cm Product: Element 155cm ", + "{% include 'product' for products %}", "products" => [ { 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' } ] + end + + def test_include_tag_with_local_variables + assert_template_result "Locale: test123 ", "{% include 'locale_variables' echo1: 'test123' %}" + end + + def test_include_tag_with_multiple_local_variables + assert_template_result "Locale: test123 test321", + "{% include 'locale_variables' echo1: 'test123', echo2: 'test321' %}" + end + + def test_include_tag_with_multiple_local_variables_from_context + assert_template_result "Locale: test123 test321", + "{% include 'locale_variables' echo1: echo1, echo2: more_echos.echo2 %}", + 'echo1' => 'test123', 'more_echos' => { "echo2" => 'test321' } + end + + def test_included_templates_assigns_variables + assert_template_result "bar", "{% include 'assignments' %}{{ foo }}" + end + + def test_nested_include_tag + assert_template_result "body body_detail", "{% include 'body' %}" + + assert_template_result "header body body_detail footer", "{% include 'nested_template' %}" + end + + def test_nested_include_with_variable + assert_template_result "Product: Draft 151cm details ", + "{% include 'nested_product_template' with product %}", "product" => { "title" => 'Draft 151cm' } + + assert_template_result "Product: Draft 151cm details Product: Element 155cm details ", + "{% include 'nested_product_template' for products %}", "products" => [{ "title" => 'Draft 151cm' }, { "title" => 'Element 155cm' }] + end + + def test_recursively_included_template_does_not_produce_endless_loop + infinite_file_system = Class.new do + def read_template_file(template_path) + "-{% include 'loop' %}" + end + end + + Liquid::Template.file_system = infinite_file_system.new + + assert_raises(Liquid::StackLevelError, SystemStackError) do + Template.parse("{% include 'loop' %}").render! + end + end + + def test_dynamically_choosen_template + assert_template_result "Test123", "{% include template %}", "template" => 'Test123' + assert_template_result "Test321", "{% include template %}", "template" => 'Test321' + + assert_template_result "Product: Draft 151cm ", "{% include template for product %}", + "template" => 'product', 'product' => { 'title' => 'Draft 151cm' } + end + + def test_include_tag_caches_second_read_of_same_partial + file_system = CountingFileSystem.new + assert_equal 'from CountingFileSystemfrom CountingFileSystem', + Template.parse("{% include 'pick_a_source' %}{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system }) + assert_equal 1, file_system.count + end + + def test_include_tag_doesnt_cache_partials_across_renders + file_system = CountingFileSystem.new + assert_equal 'from CountingFileSystem', + Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system }) + assert_equal 1, file_system.count + + assert_equal 'from CountingFileSystem', + Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system }) + assert_equal 2, file_system.count + end + + def test_include_tag_within_if_statement + assert_template_result "foo_if_true", "{% if true %}{% include 'foo_if_true' %}{% endif %}" + end + + def test_custom_include_tag + original_tag = Liquid::Template.tags['include'] + Liquid::Template.tags['include'] = CustomInclude + begin + assert_equal "custom_foo", + Template.parse("{% include 'custom_foo' %}").render! + ensure + Liquid::Template.tags['include'] = original_tag + end + end + + def test_custom_include_tag_within_if_statement + original_tag = Liquid::Template.tags['include'] + Liquid::Template.tags['include'] = CustomInclude + begin + assert_equal "custom_foo_if_true", + Template.parse("{% if true %}{% include 'custom_foo_if_true' %}{% endif %}").render! + ensure + Liquid::Template.tags['include'] = original_tag + end + end + + def test_does_not_add_error_in_strict_mode_for_missing_variable + Liquid::Template.file_system = TestFileSystem.new + + a = Liquid::Template.parse(' {% include "nested_template" %}') + a.render! + assert_empty a.errors + end + + def test_passing_options_to_included_templates + assert_raises(Liquid::SyntaxError) do + Template.parse("{% include template %}", error_mode: :strict).render!("template" => '{{ "X" || downcase }}') + end + with_error_mode(:lax) do + assert_equal 'x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: true).render!("template" => '{{ "X" || downcase }}') + end + assert_raises(Liquid::SyntaxError) do + Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:locale]).render!("template" => '{{ "X" || downcase }}') + end + with_error_mode(:lax) do + assert_equal 'x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:error_mode]).render!("template" => '{{ "X" || downcase }}') + end + end + + def test_render_raise_argument_error_when_template_is_undefined + assert_raises(Liquid::ArgumentError) do + template = Liquid::Template.parse('{% include undefined_variable %}') + template.render! + end + assert_raises(Liquid::ArgumentError) do + template = Liquid::Template.parse('{% include nil %}') + template.render! + end + end + + def test_including_via_variable_value + assert_template_result "from TestFileSystem", "{% assign page = 'pick_a_source' %}{% include page %}" + + assert_template_result "Product: Draft 151cm ", "{% assign page = 'product' %}{% include page %}", "product" => { 'title' => 'Draft 151cm' } + + assert_template_result "Product: Draft 151cm ", "{% assign page = 'product' %}{% include page for foo %}", "foo" => { 'title' => 'Draft 151cm' } + end +end # IncludeTagTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/increment_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/increment_tag_test.rb new file mode 100644 index 0000000..97c51ac --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/increment_tag_test.rb @@ -0,0 +1,23 @@ +require 'test_helper' + +class IncrementTagTest < Minitest::Test + include Liquid + + def test_inc + assert_template_result('0', '{%increment port %}', {}) + assert_template_result('0 1', '{%increment port %} {%increment port%}', {}) + assert_template_result('0 0 1 2 1', + '{%increment port %} {%increment starboard%} ' \ + '{%increment port %} {%increment port%} ' \ + '{%increment starboard %}', {}) + end + + def test_dec + assert_template_result('9', '{%decrement port %}', { 'port' => 10 }) + assert_template_result('-1 -2', '{%decrement port %} {%decrement port%}', {}) + assert_template_result('1 5 2 2 5', + '{%increment port %} {%increment starboard%} ' \ + '{%increment port %} {%decrement port%} ' \ + '{%decrement starboard %}', { 'port' => 1, 'starboard' => 5 }) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/raw_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/raw_tag_test.rb new file mode 100644 index 0000000..634d052 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/raw_tag_test.rb @@ -0,0 +1,31 @@ +require 'test_helper' + +class RawTagTest < Minitest::Test + include Liquid + + def test_tag_in_raw + assert_template_result '{% comment %} test {% endcomment %}', + '{% raw %}{% comment %} test {% endcomment %}{% endraw %}' + end + + def test_output_in_raw + assert_template_result '{{ test }}', '{% raw %}{{ test }}{% endraw %}' + end + + def test_open_tag_in_raw + assert_template_result ' Foobar {% invalid ', '{% raw %} Foobar {% invalid {% endraw %}' + assert_template_result ' Foobar invalid %} ', '{% raw %} Foobar invalid %} {% endraw %}' + assert_template_result ' Foobar {{ invalid ', '{% raw %} Foobar {{ invalid {% endraw %}' + assert_template_result ' Foobar invalid }} ', '{% raw %} Foobar invalid }} {% endraw %}' + assert_template_result ' Foobar {% invalid {% {% endraw ', '{% raw %} Foobar {% invalid {% {% endraw {% endraw %}' + assert_template_result ' Foobar {% {% {% ', '{% raw %} Foobar {% {% {% {% endraw %}' + assert_template_result ' test {% raw %} {% endraw %}', '{% raw %} test {% raw %} {% {% endraw %}endraw %}' + assert_template_result ' Foobar {{ invalid 1', '{% raw %} Foobar {{ invalid {% endraw %}{{ 1 }}' + end + + def test_invalid_raw + assert_match_syntax_error(/tag was never closed/, '{% raw %} foo') + assert_match_syntax_error(/Valid syntax/, '{% raw } foo {% endraw %}') + assert_match_syntax_error(/Valid syntax/, '{% raw } foo %}{% endraw %}') + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/standard_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/standard_tag_test.rb new file mode 100644 index 0000000..4b4703a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/standard_tag_test.rb @@ -0,0 +1,296 @@ +require 'test_helper' + +class StandardTagTest < Minitest::Test + include Liquid + + def test_no_transform + assert_template_result('this text should come out of the template without change...', + 'this text should come out of the template without change...') + + assert_template_result('blah', 'blah') + assert_template_result('', '') + assert_template_result('|,.:', '|,.:') + assert_template_result('', '') + + text = %(this shouldnt see any transformation either but has multiple lines + as you can clearly see here ...) + assert_template_result(text, text) + end + + def test_has_a_block_which_does_nothing + assert_template_result(%(the comment block should be removed .. right?), + %(the comment block should be removed {%comment%} be gone.. {%endcomment%} .. right?)) + + assert_template_result('', '{%comment%}{%endcomment%}') + assert_template_result('', '{%comment%}{% endcomment %}') + assert_template_result('', '{% comment %}{%endcomment%}') + assert_template_result('', '{% comment %}{% endcomment %}') + assert_template_result('', '{%comment%}comment{%endcomment%}') + assert_template_result('', '{% comment %}comment{% endcomment %}') + assert_template_result('', '{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}') + + assert_template_result('', '{%comment%}{%blabla%}{%endcomment%}') + assert_template_result('', '{% comment %}{% blabla %}{% endcomment %}') + assert_template_result('', '{%comment%}{% endif %}{%endcomment%}') + assert_template_result('', '{% comment %}{% endwhatever %}{% endcomment %}') + assert_template_result('', '{% comment %}{% raw %} {{%%%%}} }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}') + + assert_template_result('foobar', 'foo{%comment%}comment{%endcomment%}bar') + assert_template_result('foobar', 'foo{% comment %}comment{% endcomment %}bar') + assert_template_result('foobar', 'foo{%comment%} comment {%endcomment%}bar') + assert_template_result('foobar', 'foo{% comment %} comment {% endcomment %}bar') + + assert_template_result('foo bar', 'foo {%comment%} {%endcomment%} bar') + assert_template_result('foo bar', 'foo {%comment%}comment{%endcomment%} bar') + assert_template_result('foo bar', 'foo {%comment%} comment {%endcomment%} bar') + + assert_template_result('foobar', 'foo{%comment%} + {%endcomment%}bar') + end + + def test_hyphenated_assign + assigns = { 'a-b' => '1' } + assert_template_result('a-b:1 a-b:2', 'a-b:{{a-b}} {%assign a-b = 2 %}a-b:{{a-b}}', assigns) + end + + def test_assign_with_colon_and_spaces + assigns = { 'var' => { 'a:b c' => { 'paged' => '1' } } } + assert_template_result('var2: 1', '{%assign var2 = var["a:b c"].paged %}var2: {{var2}}', assigns) + end + + def test_capture + assigns = { 'var' => 'content' } + assert_template_result('content foo content foo ', + '{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}', + assigns) + end + + def test_capture_detects_bad_syntax + assert_raises(SyntaxError) do + assert_template_result('content foo content foo ', + '{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}', + { 'var' => 'content' }) + end + end + + def test_case + assigns = { 'condition' => 2 } + assert_template_result(' its 2 ', + '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', + assigns) + + assigns = { 'condition' => 1 } + assert_template_result(' its 1 ', + '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', + assigns) + + assigns = { 'condition' => 3 } + assert_template_result('', + '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', + assigns) + + assigns = { 'condition' => "string here" } + assert_template_result(' hit ', + '{% case condition %}{% when "string here" %} hit {% endcase %}', + assigns) + + assigns = { 'condition' => "bad string here" } + assert_template_result('', + '{% case condition %}{% when "string here" %} hit {% endcase %}',\ + assigns) + end + + def test_case_with_else + assigns = { 'condition' => 5 } + assert_template_result(' hit ', + '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}', + assigns) + + assigns = { 'condition' => 6 } + assert_template_result(' else ', + '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}', + assigns) + + assigns = { 'condition' => 6 } + assert_template_result(' else ', + '{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}', + assigns) + end + + def test_case_on_size + assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => []) + assert_template_result('1', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1]) + assert_template_result('2', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1]) + assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1]) + assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1, 1]) + assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1, 1, 1]) + end + + def test_case_on_size_with_else + assert_template_result('else', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => []) + + assert_template_result('1', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1]) + + assert_template_result('2', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1]) + + assert_template_result('else', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1, 1]) + + assert_template_result('else', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1, 1, 1]) + + assert_template_result('else', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1, 1, 1, 1]) + end + + def test_case_on_length_with_else + assert_template_result('else', + '{% case a.empty? %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', + {}) + + assert_template_result('false', + '{% case false %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', + {}) + + assert_template_result('true', + '{% case true %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', + {}) + + assert_template_result('else', + '{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', + {}) + end + + def test_assign_from_case + # Example from the shopify forums + code = "{% case collection.handle %}{% when 'menswear-jackets' %}{% assign ptitle = 'menswear' %}{% when 'menswear-t-shirts' %}{% assign ptitle = 'menswear' %}{% else %}{% assign ptitle = 'womenswear' %}{% endcase %}{{ ptitle }}" + template = Liquid::Template.parse(code) + assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-jackets' }) + assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-t-shirts' }) + assert_equal "womenswear", template.render!("collection" => { 'handle' => 'x' }) + assert_equal "womenswear", template.render!("collection" => { 'handle' => 'y' }) + assert_equal "womenswear", template.render!("collection" => { 'handle' => 'z' }) + end + + def test_case_when_or + code = '{% case condition %}{% when 1 or 2 or 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 }) + assert_template_result(' its 4 ', code, { 'condition' => 4 }) + assert_template_result('', code, { 'condition' => 5 }) + + code = '{% case condition %}{% when 1 or "string" or null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil }) + assert_template_result('', code, { 'condition' => 'something else' }) + end + + def test_case_when_comma + code = '{% case condition %}{% when 1, 2, 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 }) + assert_template_result(' its 4 ', code, { 'condition' => 4 }) + assert_template_result('', code, { 'condition' => 5 }) + + code = '{% case condition %}{% when 1, "string", null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil }) + assert_template_result('', code, { 'condition' => 'something else' }) + end + + def test_assign + assert_template_result 'variable', '{% assign a = "variable"%}{{a}}' + end + + def test_assign_unassigned + assigns = { 'var' => 'content' } + assert_template_result('var2: var2:content', 'var2:{{var2}} {%assign var2 = var%} var2:{{var2}}', assigns) + end + + def test_assign_an_empty_string + assert_template_result '', '{% assign a = ""%}{{a}}' + end + + def test_assign_is_global + assert_template_result 'variable', '{%for i in (1..2) %}{% assign a = "variable"%}{% endfor %}{{a}}' + end + + def test_case_detects_bad_syntax + assert_raises(SyntaxError) do + assert_template_result('', '{% case false %}{% when %}true{% endcase %}', {}) + end + + assert_raises(SyntaxError) do + assert_template_result('', '{% case false %}{% huh %}true{% endcase %}', {}) + end + end + + def test_cycle + assert_template_result('one', '{%cycle "one", "two"%}') + assert_template_result('one two', '{%cycle "one", "two"%} {%cycle "one", "two"%}') + assert_template_result(' two', '{%cycle "", "two"%} {%cycle "", "two"%}') + + assert_template_result('one two one', '{%cycle "one", "two"%} {%cycle "one", "two"%} {%cycle "one", "two"%}') + + assert_template_result('text-align: left text-align: right', + '{%cycle "text-align: left", "text-align: right" %} {%cycle "text-align: left", "text-align: right"%}') + end + + def test_multiple_cycles + assert_template_result('1 2 1 1 2 3 1', + '{%cycle 1,2%} {%cycle 1,2%} {%cycle 1,2%} {%cycle 1,2,3%} {%cycle 1,2,3%} {%cycle 1,2,3%} {%cycle 1,2,3%}') + end + + def test_multiple_named_cycles + assert_template_result('one one two two one one', + '{%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %} {%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %} {%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %}') + end + + def test_multiple_named_cycles_with_names_from_context + assigns = { "var1" => 1, "var2" => 2 } + assert_template_result('one one two two one one', + '{%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %}', assigns) + end + + def test_size_of_array + assigns = { "array" => [1, 2, 3, 4] } + assert_template_result('array has 4 elements', "array has {{ array.size }} elements", assigns) + end + + def test_size_of_hash + assigns = { "hash" => { a: 1, b: 2, c: 3, d: 4 } } + assert_template_result('hash has 4 elements', "hash has {{ hash.size }} elements", assigns) + end + + def test_illegal_symbols + assert_template_result('', '{% if true == empty %}?{% endif %}', {}) + assert_template_result('', '{% if true == null %}?{% endif %}', {}) + assert_template_result('', '{% if empty == true %}?{% endif %}', {}) + assert_template_result('', '{% if null == true %}?{% endif %}', {}) + end + + def test_ifchanged + assigns = { 'array' => [ 1, 1, 2, 2, 3, 3] } + assert_template_result('123', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns) + + assigns = { 'array' => [ 1, 1, 1, 1] } + assert_template_result('1', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns) + end + + def test_multiline_tag + assert_template_result '0 1 2 3', "0{%\nfor i in (1..3)\n%} {{\ni\n}}{%\nendfor\n%}" + end +end # StandardTagTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/statements_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/statements_test.rb new file mode 100644 index 0000000..eeff166 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/statements_test.rb @@ -0,0 +1,111 @@ +require 'test_helper' + +class StatementsTest < Minitest::Test + include Liquid + + def test_true_eql_true + text = ' {% if true == true %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text + end + + def test_true_not_eql_true + text = ' {% if true != true %} true {% else %} false {% endif %} ' + assert_template_result ' false ', text + end + + def test_true_lq_true + text = ' {% if 0 > 0 %} true {% else %} false {% endif %} ' + assert_template_result ' false ', text + end + + def test_one_lq_zero + text = ' {% if 1 > 0 %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text + end + + def test_zero_lq_one + text = ' {% if 0 < 1 %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text + end + + def test_zero_lq_or_equal_one + text = ' {% if 0 <= 0 %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text + end + + def test_zero_lq_or_equal_one_involving_nil + text = ' {% if null <= 0 %} true {% else %} false {% endif %} ' + assert_template_result ' false ', text + + text = ' {% if 0 <= null %} true {% else %} false {% endif %} ' + assert_template_result ' false ', text + end + + def test_zero_lqq_or_equal_one + text = ' {% if 0 >= 0 %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text + end + + def test_strings + text = " {% if 'test' == 'test' %} true {% else %} false {% endif %} " + assert_template_result ' true ', text + end + + def test_strings_not_equal + text = " {% if 'test' != 'test' %} true {% else %} false {% endif %} " + assert_template_result ' false ', text + end + + def test_var_strings_equal + text = ' {% if var == "hello there!" %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => 'hello there!' + end + + def test_var_strings_are_not_equal + text = ' {% if "hello there!" == var %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => 'hello there!' + end + + def test_var_and_long_string_are_equal + text = " {% if var == 'hello there!' %} true {% else %} false {% endif %} " + assert_template_result ' true ', text, 'var' => 'hello there!' + end + + def test_var_and_long_string_are_equal_backwards + text = " {% if 'hello there!' == var %} true {% else %} false {% endif %} " + assert_template_result ' true ', text, 'var' => 'hello there!' + end + + # def test_is_nil + # text = %| {% if var != nil %} true {% else %} false {% end %} | + # @template.assigns = { 'var' => 'hello there!'} + # expected = %| true | + # assert_equal expected, @template.parse(text) + # end + + def test_is_collection_empty + text = ' {% if array == empty %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'array' => [] + end + + def test_is_not_collection_empty + text = ' {% if array == empty %} true {% else %} false {% endif %} ' + assert_template_result ' false ', text, 'array' => [1, 2, 3] + end + + def test_nil + text = ' {% if var == nil %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => nil + + text = ' {% if var == null %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => nil + end + + def test_not_nil + text = ' {% if var != nil %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => 1 + + text = ' {% if var != null %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => 1 + end +end # StatementsTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/table_row_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/table_row_test.rb new file mode 100644 index 0000000..d7bc14c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/table_row_test.rb @@ -0,0 +1,64 @@ +require 'test_helper' + +class TableRowTest < Minitest::Test + include Liquid + + class ArrayDrop < Liquid::Drop + include Enumerable + + def initialize(array) + @array = array + end + + def each(&block) + @array.each(&block) + end + end + + def test_table_row + assert_template_result("\n 1 2 3 \n 4 5 6 \n", + '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', + 'numbers' => [1, 2, 3, 4, 5, 6]) + + assert_template_result("\n\n", + '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', + 'numbers' => []) + end + + def test_table_row_with_different_cols + assert_template_result("\n 1 2 3 4 5 \n 6 \n", + '{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}', + 'numbers' => [1, 2, 3, 4, 5, 6]) + end + + def test_table_col_counter + assert_template_result("\n12\n12\n12\n", + '{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}', + 'numbers' => [1, 2, 3, 4, 5, 6]) + end + + def test_quoted_fragment + assert_template_result("\n 1 2 3 \n 4 5 6 \n", + "{% tablerow n in collections.frontpage cols:3%} {{n}} {% endtablerow %}", + 'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] }) + assert_template_result("\n 1 2 3 \n 4 5 6 \n", + "{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}", + 'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] }) + end + + def test_enumerable_drop + assert_template_result("\n 1 2 3 \n 4 5 6 \n", + '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', + 'numbers' => ArrayDrop.new([1, 2, 3, 4, 5, 6])) + end + + def test_offset_and_limit + assert_template_result("\n 1 2 3 \n 4 5 6 \n", + '{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}', + 'numbers' => [0, 1, 2, 3, 4, 5, 6, 7]) + end + + def test_blank_string_not_iterable + assert_template_result("\n\n", "{% tablerow char in characters cols:3 %}I WILL NOT BE OUTPUT{% endtablerow %}", 'characters' => '') + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/unless_else_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/unless_else_tag_test.rb new file mode 100644 index 0000000..c414a71 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/tags/unless_else_tag_test.rb @@ -0,0 +1,26 @@ +require 'test_helper' + +class UnlessElseTagTest < Minitest::Test + include Liquid + + def test_unless + assert_template_result(' ', ' {% unless true %} this text should not go into the output {% endunless %} ') + assert_template_result(' this text should go into the output ', + ' {% unless false %} this text should go into the output {% endunless %} ') + assert_template_result(' you rock ?', '{% unless true %} you suck {% endunless %} {% unless false %} you rock {% endunless %}?') + end + + def test_unless_else + assert_template_result(' YES ', '{% unless true %} NO {% else %} YES {% endunless %}') + assert_template_result(' YES ', '{% unless false %} YES {% else %} NO {% endunless %}') + assert_template_result(' YES ', '{% unless "foo" %} NO {% else %} YES {% endunless %}') + end + + def test_unless_in_loop + assert_template_result '23', '{% for i in choices %}{% unless i %}{{ forloop.index }}{% endunless %}{% endfor %}', 'choices' => [1, nil, false] + end + + def test_unless_else_in_loop + assert_template_result ' TRUE 2 3 ', '{% for i in choices %}{% unless i %} {{ forloop.index }} {% else %} TRUE {% endunless %}{% endfor %}', 'choices' => [1, nil, false] + end +end # UnlessElseTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/template_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/template_test.rb new file mode 100644 index 0000000..253b976 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/template_test.rb @@ -0,0 +1,323 @@ +require 'test_helper' +require 'timeout' + +class TemplateContextDrop < Liquid::Drop + def liquid_method_missing(method) + method + end + + def foo + 'fizzbuzz' + end + + def baz + @context.registers['lulz'] + end +end + +class SomethingWithLength < Liquid::Drop + def length + nil + end +end + +class ErroneousDrop < Liquid::Drop + def bad_method + raise 'ruby error in drop' + end +end + +class DropWithUndefinedMethod < Liquid::Drop + def foo + 'foo' + end +end + +class TemplateTest < Minitest::Test + include Liquid + + def test_instance_assigns_persist_on_same_template_object_between_parses + t = Template.new + assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render! + assert_equal 'from instance assigns', t.parse("{{ foo }}").render! + end + + def test_warnings_is_not_exponential_time + str = "false" + 100.times do + str = "{% if true %}true{% else %}#{str}{% endif %}" + end + + t = Template.parse(str) + assert_equal [], Timeout.timeout(1) { t.warnings } + end + + def test_instance_assigns_persist_on_same_template_parsing_between_renders + t = Template.new.parse("{{ foo }}{% assign foo = 'foo' %}{{ foo }}") + assert_equal 'foo', t.render! + assert_equal 'foofoo', t.render! + end + + def test_custom_assigns_do_not_persist_on_same_template + t = Template.new + assert_equal 'from custom assigns', t.parse("{{ foo }}").render!('foo' => 'from custom assigns') + assert_equal '', t.parse("{{ foo }}").render! + end + + def test_custom_assigns_squash_instance_assigns + t = Template.new + assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render! + assert_equal 'from custom assigns', t.parse("{{ foo }}").render!('foo' => 'from custom assigns') + end + + def test_persistent_assigns_squash_instance_assigns + t = Template.new + assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render! + t.assigns['foo'] = 'from persistent assigns' + assert_equal 'from persistent assigns', t.parse("{{ foo }}").render! + end + + def test_lambda_is_called_once_from_persistent_assigns_over_multiple_parses_and_renders + t = Template.new + t.assigns['number'] = -> { @global ||= 0; @global += 1 } + assert_equal '1', t.parse("{{number}}").render! + assert_equal '1', t.parse("{{number}}").render! + assert_equal '1', t.render! + @global = nil + end + + def test_lambda_is_called_once_from_custom_assigns_over_multiple_parses_and_renders + t = Template.new + assigns = { 'number' => -> { @global ||= 0; @global += 1 } } + assert_equal '1', t.parse("{{number}}").render!(assigns) + assert_equal '1', t.parse("{{number}}").render!(assigns) + assert_equal '1', t.render!(assigns) + @global = nil + end + + def test_resource_limits_works_with_custom_length_method + t = Template.parse("{% assign foo = bar %}") + t.resource_limits.render_length_limit = 42 + assert_equal "", t.render!("bar" => SomethingWithLength.new) + end + + def test_resource_limits_render_length + t = Template.parse("0123456789") + t.resource_limits.render_length_limit = 5 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + + t.resource_limits.render_length_limit = 10 + assert_equal "0123456789", t.render! + refute_nil t.resource_limits.render_length + end + + def test_resource_limits_render_score + t = Template.parse("{% for a in (1..10) %} {% for a in (1..10) %} foo {% endfor %} {% endfor %}") + t.resource_limits.render_score_limit = 50 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + + t = Template.parse("{% for a in (1..100) %} foo {% endfor %}") + t.resource_limits.render_score_limit = 50 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + + t.resource_limits.render_score_limit = 200 + assert_equal (" foo " * 100), t.render! + refute_nil t.resource_limits.render_score + end + + def test_resource_limits_assign_score + t = Template.parse("{% assign foo = 42 %}{% assign bar = 23 %}") + t.resource_limits.assign_score_limit = 1 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + + t.resource_limits.assign_score_limit = 2 + assert_equal "", t.render! + refute_nil t.resource_limits.assign_score + end + + def test_resource_limits_assign_score_nested + t = Template.parse("{% assign foo = 'aaaa' | reverse %}") + + t.resource_limits.assign_score_limit = 3 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + + t.resource_limits.assign_score_limit = 5 + assert_equal "", t.render! + end + + def test_resource_limits_aborts_rendering_after_first_error + t = Template.parse("{% for a in (1..100) %} foo1 {% endfor %} bar {% for a in (1..100) %} foo2 {% endfor %}") + t.resource_limits.render_score_limit = 50 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + end + + def test_resource_limits_hash_in_template_gets_updated_even_if_no_limits_are_set + t = Template.parse("{% for a in (1..100) %} {% assign foo = 1 %} {% endfor %}") + t.render! + assert t.resource_limits.assign_score > 0 + assert t.resource_limits.render_score > 0 + assert t.resource_limits.render_length > 0 + end + + def test_render_length_persists_between_blocks + t = Template.parse("{% if true %}aaaa{% endif %}") + t.resource_limits.render_length_limit = 7 + assert_equal "Liquid error: Memory limits exceeded", t.render + t.resource_limits.render_length_limit = 8 + assert_equal "aaaa", t.render + + t = Template.parse("{% if true %}aaaa{% endif %}{% if true %}bbb{% endif %}") + t.resource_limits.render_length_limit = 13 + assert_equal "Liquid error: Memory limits exceeded", t.render + t.resource_limits.render_length_limit = 14 + assert_equal "aaaabbb", t.render + + t = Template.parse("{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}") + t.resource_limits.render_length_limit = 5 + assert_equal "Liquid error: Memory limits exceeded", t.render + t.resource_limits.render_length_limit = 11 + assert_equal "Liquid error: Memory limits exceeded", t.render + t.resource_limits.render_length_limit = 12 + assert_equal "ababab", t.render + end + + def test_default_resource_limits_unaffected_by_render_with_context + context = Context.new + t = Template.parse("{% for a in (1..100) %} {% assign foo = 1 %} {% endfor %}") + t.render!(context) + assert context.resource_limits.assign_score > 0 + assert context.resource_limits.render_score > 0 + assert context.resource_limits.render_length > 0 + end + + def test_can_use_drop_as_context + t = Template.new + t.registers['lulz'] = 'haha' + drop = TemplateContextDrop.new + assert_equal 'fizzbuzz', t.parse('{{foo}}').render!(drop) + assert_equal 'bar', t.parse('{{bar}}').render!(drop) + assert_equal 'haha', t.parse("{{baz}}").render!(drop) + end + + def test_render_bang_force_rethrow_errors_on_passed_context + context = Context.new({ 'drop' => ErroneousDrop.new }) + t = Template.new.parse('{{ drop.bad_method }}') + + e = assert_raises RuntimeError do + t.render!(context) + end + assert_equal 'ruby error in drop', e.message + end + + def test_exception_renderer_that_returns_string + exception = nil + handler = ->(e) { exception = e; '' } + + output = Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_renderer: handler) + + assert exception.is_a?(Liquid::ZeroDivisionError) + assert_equal '', output + end + + def test_exception_renderer_that_raises + exception = nil + assert_raises(Liquid::ZeroDivisionError) do + Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_renderer: ->(e) { exception = e; raise }) + end + assert exception.is_a?(Liquid::ZeroDivisionError) + end + + def test_global_filter_option_on_render + global_filter_proc = ->(output) { "#{output} filtered" } + rendered_template = Template.parse("{{name}}").render({ "name" => "bob" }, global_filter: global_filter_proc) + + assert_equal 'bob filtered', rendered_template + end + + def test_global_filter_option_when_native_filters_exist + global_filter_proc = ->(output) { "#{output} filtered" } + rendered_template = Template.parse("{{name | upcase}}").render({ "name" => "bob" }, global_filter: global_filter_proc) + + assert_equal 'BOB filtered', rendered_template + end + + def test_undefined_variables + t = Template.parse("{{x}} {{y}} {{z.a}} {{z.b}} {{z.c.d}}") + result = t.render({ 'x' => 33, 'z' => { 'a' => 32, 'c' => { 'e' => 31 } } }, { strict_variables: true }) + + assert_equal '33 32 ', result + assert_equal 3, t.errors.count + assert_instance_of Liquid::UndefinedVariable, t.errors[0] + assert_equal 'Liquid error: undefined variable y', t.errors[0].message + assert_instance_of Liquid::UndefinedVariable, t.errors[1] + assert_equal 'Liquid error: undefined variable b', t.errors[1].message + assert_instance_of Liquid::UndefinedVariable, t.errors[2] + assert_equal 'Liquid error: undefined variable d', t.errors[2].message + end + + def test_undefined_variables_raise + t = Template.parse("{{x}} {{y}} {{z.a}} {{z.b}} {{z.c.d}}") + + assert_raises UndefinedVariable do + t.render!({ 'x' => 33, 'z' => { 'a' => 32, 'c' => { 'e' => 31 } } }, { strict_variables: true }) + end + end + + def test_undefined_drop_methods + d = DropWithUndefinedMethod.new + t = Template.new.parse('{{ foo }} {{ woot }}') + result = t.render(d, { strict_variables: true }) + + assert_equal 'foo ', result + assert_equal 1, t.errors.count + assert_instance_of Liquid::UndefinedDropMethod, t.errors[0] + end + + def test_undefined_drop_methods_raise + d = DropWithUndefinedMethod.new + t = Template.new.parse('{{ foo }} {{ woot }}') + + assert_raises UndefinedDropMethod do + t.render!(d, { strict_variables: true }) + end + end + + def test_undefined_filters + t = Template.parse("{{a}} {{x | upcase | somefilter1 | somefilter2 | somefilter3}}") + filters = Module.new do + def somefilter3(v) + "-#{v}-" + end + end + result = t.render({ 'a' => 123, 'x' => 'foo' }, { filters: [filters], strict_filters: true }) + + assert_equal '123 ', result + assert_equal 1, t.errors.count + assert_instance_of Liquid::UndefinedFilter, t.errors[0] + assert_equal 'Liquid error: undefined filter somefilter1', t.errors[0].message + end + + def test_undefined_filters_raise + t = Template.parse("{{x | somefilter1 | upcase | somefilter2}}") + + assert_raises UndefinedFilter do + t.render!({ 'x' => 'foo' }, { strict_filters: true }) + end + end + + def test_using_range_literal_works_as_expected + t = Template.parse("{% assign foo = (x..y) %}{{ foo }}") + result = t.render({ 'x' => 1, 'y' => 5 }) + assert_equal '1..5', result + + t = Template.parse("{% assign nums = (x..y) %}{% for num in nums %}{{ num }}{% endfor %}") + result = t.render({ 'x' => 1, 'y' => 5 }) + assert_equal '12345', result + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/trim_mode_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/trim_mode_test.rb new file mode 100644 index 0000000..ed24fe3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/trim_mode_test.rb @@ -0,0 +1,525 @@ +require 'test_helper' + +class TrimModeTest < Minitest::Test + include Liquid + + # Make sure the trim isn't applied to standard output + def test_standard_output + text = <<-END_TEMPLATE +
      +

      + {{ 'John' }} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      + John +

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_variable_output_with_multiple_blank_lines + text = <<-END_TEMPLATE +
      +

      + + + {{- 'John' -}} + + +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      John

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_tag_output_with_multiple_blank_lines + text = <<-END_TEMPLATE +
      +

      + + + {%- if true -%} + yes + {%- endif -%} + + +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      yes

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + # Make sure the trim isn't applied to standard tags + def test_standard_tags + whitespace = ' ' + text = <<-END_TEMPLATE +
      +

      + {% if true %} + yes + {% endif %} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      +#{whitespace} + yes +#{whitespace} +

      +
      + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE +
      +

      + {% if false %} + no + {% endif %} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      +#{whitespace} +

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + # Make sure the trim isn't too agressive + def test_no_trim_output + text = '

      {{- \'John\' -}}

      ' + expected = '

      John

      ' + assert_template_result(expected, text) + end + + # Make sure the trim isn't too agressive + def test_no_trim_tags + text = '

      {%- if true -%}yes{%- endif -%}

      ' + expected = '

      yes

      ' + assert_template_result(expected, text) + + text = '

      {%- if false -%}no{%- endif -%}

      ' + expected = '

      ' + assert_template_result(expected, text) + end + + def test_single_line_outer_tag + text = '

      {%- if true %} yes {% endif -%}

      ' + expected = '

      yes

      ' + assert_template_result(expected, text) + + text = '

      {%- if false %} no {% endif -%}

      ' + expected = '

      ' + assert_template_result(expected, text) + end + + def test_single_line_inner_tag + text = '

      {% if true -%} yes {%- endif %}

      ' + expected = '

      yes

      ' + assert_template_result(expected, text) + + text = '

      {% if false -%} no {%- endif %}

      ' + expected = '

      ' + assert_template_result(expected, text) + end + + def test_single_line_post_tag + text = '

      {% if true -%} yes {% endif -%}

      ' + expected = '

      yes

      ' + assert_template_result(expected, text) + + text = '

      {% if false -%} no {% endif -%}

      ' + expected = '

      ' + assert_template_result(expected, text) + end + + def test_single_line_pre_tag + text = '

      {%- if true %} yes {%- endif %}

      ' + expected = '

      yes

      ' + assert_template_result(expected, text) + + text = '

      {%- if false %} no {%- endif %}

      ' + expected = '

      ' + assert_template_result(expected, text) + end + + def test_pre_trim_output + text = <<-END_TEMPLATE +
      +

      + {{- 'John' }} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      John +

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_pre_trim_tags + text = <<-END_TEMPLATE +
      +

      + {%- if true %} + yes + {%- endif %} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      + yes +

      +
      + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE +
      +

      + {%- if false %} + no + {%- endif %} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      +

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_post_trim_output + text = <<-END_TEMPLATE +
      +

      + {{ 'John' -}} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      + John

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_post_trim_tags + text = <<-END_TEMPLATE +
      +

      + {% if true -%} + yes + {% endif -%} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      + yes +

      +
      + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE +
      +

      + {% if false -%} + no + {% endif -%} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      +

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_pre_and_post_trim_tags + text = <<-END_TEMPLATE +
      +

      + {%- if true %} + yes + {% endif -%} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      + yes +

      +
      + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE +
      +

      + {%- if false %} + no + {% endif -%} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_post_and_pre_trim_tags + text = <<-END_TEMPLATE +
      +

      + {% if true -%} + yes + {%- endif %} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      + yes +

      +
      + END_EXPECTED + assert_template_result(expected, text) + + whitespace = ' ' + text = <<-END_TEMPLATE +
      +

      + {% if false -%} + no + {%- endif %} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      +#{whitespace} +

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_trim_output + text = <<-END_TEMPLATE +
      +

      + {{- 'John' -}} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      John

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_trim_tags + text = <<-END_TEMPLATE +
      +

      + {%- if true -%} + yes + {%- endif -%} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      yes

      +
      + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE +
      +

      + {%- if false -%} + no + {%- endif -%} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_whitespace_trim_output + text = <<-END_TEMPLATE +
      +

      + {{- 'John' -}}, + {{- '30' -}} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      John,30

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_whitespace_trim_tags + text = <<-END_TEMPLATE +
      +

      + {%- if true -%} + yes + {%- endif -%} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      yes

      +
      + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE +
      +

      + {%- if false -%} + no + {%- endif -%} +

      +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_complex_trim_output + text = <<-END_TEMPLATE +
      +

      + {{- 'John' -}} + {{- '30' -}} +

      + + {{ 'John' -}} + {{- '30' }} + + + {{- 'John' }} + {{ '30' -}} + +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +

      John30

      + + John30 + + John + 30 +
      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_complex_trim + text = <<-END_TEMPLATE +
      + {%- if true -%} + {%- if true -%} +

      + {{- 'John' -}} +

      + {%- endif -%} + {%- endif -%} +
      + END_TEMPLATE + expected = <<-END_EXPECTED +

      John

      + END_EXPECTED + assert_template_result(expected, text) + end + + def test_raw_output + whitespace = ' ' + text = <<-END_TEMPLATE +
      + {% raw %} + {%- if true -%} +

      + {{- 'John' -}} +

      + {%- endif -%} + {% endraw %} +
      + END_TEMPLATE + expected = <<-END_EXPECTED +
      +#{whitespace} + {%- if true -%} +

      + {{- 'John' -}} +

      + {%- endif -%} +#{whitespace} +
      + END_EXPECTED + assert_template_result(expected, text) + end +end # TrimModeTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/variable_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/variable_test.rb new file mode 100644 index 0000000..58df833 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/integration/variable_test.rb @@ -0,0 +1,92 @@ +require 'test_helper' + +class VariableTest < Minitest::Test + include Liquid + + def test_simple_variable + template = Template.parse(%({{test}})) + assert_equal 'worked', template.render!('test' => 'worked') + assert_equal 'worked wonderfully', template.render!('test' => 'worked wonderfully') + end + + def test_variable_render_calls_to_liquid + assert_template_result 'foobar', '{{ foo }}', 'foo' => ThingWithToLiquid.new + end + + def test_simple_with_whitespaces + template = Template.parse(%( {{ test }} )) + assert_equal ' worked ', template.render!('test' => 'worked') + assert_equal ' worked wonderfully ', template.render!('test' => 'worked wonderfully') + end + + def test_ignore_unknown + template = Template.parse(%({{ test }})) + assert_equal '', template.render! + end + + def test_using_blank_as_variable_name + template = Template.parse("{% assign foo = blank %}{{ foo }}") + assert_equal '', template.render! + end + + def test_using_empty_as_variable_name + template = Template.parse("{% assign foo = empty %}{{ foo }}") + assert_equal '', template.render! + end + + def test_hash_scoping + template = Template.parse(%({{ test.test }})) + assert_equal 'worked', template.render!('test' => { 'test' => 'worked' }) + end + + def test_false_renders_as_false + assert_equal 'false', Template.parse("{{ foo }}").render!('foo' => false) + assert_equal 'false', Template.parse("{{ false }}").render! + end + + def test_nil_renders_as_empty_string + assert_equal '', Template.parse("{{ nil }}").render! + assert_equal 'cat', Template.parse("{{ nil | append: 'cat' }}").render! + end + + def test_preset_assigns + template = Template.parse(%({{ test }})) + template.assigns['test'] = 'worked' + assert_equal 'worked', template.render! + end + + def test_reuse_parsed_template + template = Template.parse(%({{ greeting }} {{ name }})) + template.assigns['greeting'] = 'Goodbye' + assert_equal 'Hello Tobi', template.render!('greeting' => 'Hello', 'name' => 'Tobi') + assert_equal 'Hello ', template.render!('greeting' => 'Hello', 'unknown' => 'Tobi') + assert_equal 'Hello Brian', template.render!('greeting' => 'Hello', 'name' => 'Brian') + assert_equal 'Goodbye Brian', template.render!('name' => 'Brian') + assert_equal({ 'greeting' => 'Goodbye' }, template.assigns) + end + + def test_assigns_not_polluted_from_template + template = Template.parse(%({{ test }}{% assign test = 'bar' %}{{ test }})) + template.assigns['test'] = 'baz' + assert_equal 'bazbar', template.render! + assert_equal 'bazbar', template.render! + assert_equal 'foobar', template.render!('test' => 'foo') + assert_equal 'bazbar', template.render! + end + + def test_hash_with_default_proc + template = Template.parse(%(Hello {{ test }})) + assigns = Hash.new { |h, k| raise "Unknown variable '#{k}'" } + assigns['test'] = 'Tobi' + assert_equal 'Hello Tobi', template.render!(assigns) + assigns.delete('test') + e = assert_raises(RuntimeError) do + template.render!(assigns) + end + assert_equal "Unknown variable 'test'", e.message + end + + def test_multiline_variable + assert_equal 'worked', Template.parse("{{\ntest\n}}").render!('test' => 'worked') + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/test_helper.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/test_helper.rb new file mode 100644 index 0000000..b8e4d9a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/test_helper.rb @@ -0,0 +1,117 @@ +#!/usr/bin/env ruby + +ENV["MT_NO_EXPECTATIONS"] = "1" +require 'minitest/autorun' +require 'spy/integration' + +$LOAD_PATH.unshift(File.join(File.expand_path(__dir__), '..', 'lib')) +require 'liquid.rb' +require 'liquid/profiler' + +mode = :strict +if env_mode = ENV['LIQUID_PARSER_MODE'] + puts "-- #{env_mode.upcase} ERROR MODE" + mode = env_mode.to_sym +end +Liquid::Template.error_mode = mode + +if ENV['LIQUID-C'] == '1' + puts "-- LIQUID C" + require 'liquid/c' +end + +if Minitest.const_defined?('Test') + # We're on Minitest 5+. Nothing to do here. +else + # Minitest 4 doesn't have Minitest::Test yet. + Minitest::Test = MiniTest::Unit::TestCase +end + +module Minitest + class Test + def fixture(name) + File.join(File.expand_path(__dir__), "fixtures", name) + end + end + + module Assertions + include Liquid + + def assert_template_result(expected, template, assigns = {}, message = nil) + assert_equal expected, Template.parse(template).render!(assigns), message + end + + def assert_template_result_matches(expected, template, assigns = {}, message = nil) + return assert_template_result(expected, template, assigns, message) unless expected.is_a? Regexp + + assert_match expected, Template.parse(template).render!(assigns), message + end + + def assert_match_syntax_error(match, template, assigns = {}) + exception = assert_raises(Liquid::SyntaxError) do + Template.parse(template).render(assigns) + end + assert_match match, exception.message + end + + def with_global_filter(*globals) + original_global_strainer = Liquid::Strainer.class_variable_get(:@@global_strainer) + Liquid::Strainer.class_variable_set(:@@global_strainer, Class.new(Liquid::Strainer) do + @filter_methods = Set.new + end) + Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear + + globals.each do |global| + Liquid::Template.register_filter(global) + end + yield + ensure + Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear + Liquid::Strainer.class_variable_set(:@@global_strainer, original_global_strainer) + end + + def with_taint_mode(mode) + old_mode = Liquid::Template.taint_mode + Liquid::Template.taint_mode = mode + yield + ensure + Liquid::Template.taint_mode = old_mode + end + + def with_error_mode(mode) + old_mode = Liquid::Template.error_mode + Liquid::Template.error_mode = mode + yield + ensure + Liquid::Template.error_mode = old_mode + end + end +end + +class ThingWithToLiquid + def to_liquid + 'foobar' + end +end + +class ErrorDrop < Liquid::Drop + def standard_error + raise Liquid::StandardError, 'standard error' + end + + def argument_error + raise Liquid::ArgumentError, 'argument error' + end + + def syntax_error + raise Liquid::SyntaxError, 'syntax error' + end + + def runtime_error + raise 'runtime error' + end + + def exception + raise Exception, 'exception' + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/block_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/block_unit_test.rb new file mode 100644 index 0000000..6a27a7d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/block_unit_test.rb @@ -0,0 +1,58 @@ +require 'test_helper' + +class BlockUnitTest < Minitest::Test + include Liquid + + def test_blankspace + template = Liquid::Template.parse(" ") + assert_equal [" "], template.root.nodelist + end + + def test_variable_beginning + template = Liquid::Template.parse("{{funk}} ") + assert_equal 2, template.root.nodelist.size + assert_equal Variable, template.root.nodelist[0].class + assert_equal String, template.root.nodelist[1].class + end + + def test_variable_end + template = Liquid::Template.parse(" {{funk}}") + assert_equal 2, template.root.nodelist.size + assert_equal String, template.root.nodelist[0].class + assert_equal Variable, template.root.nodelist[1].class + end + + def test_variable_middle + template = Liquid::Template.parse(" {{funk}} ") + assert_equal 3, template.root.nodelist.size + assert_equal String, template.root.nodelist[0].class + assert_equal Variable, template.root.nodelist[1].class + assert_equal String, template.root.nodelist[2].class + end + + def test_variable_many_embedded_fragments + template = Liquid::Template.parse(" {{funk}} {{so}} {{brother}} ") + assert_equal 7, template.root.nodelist.size + assert_equal [String, Variable, String, Variable, String, Variable, String], + block_types(template.root.nodelist) + end + + def test_with_block + template = Liquid::Template.parse(" {% comment %} {% endcomment %} ") + assert_equal [String, Comment, String], block_types(template.root.nodelist) + assert_equal 3, template.root.nodelist.size + end + + def test_with_custom_tag + Liquid::Template.register_tag("testtag", Block) + assert Liquid::Template.parse("{% testtag %} {% endtesttag %}") + ensure + Liquid::Template.tags.delete('testtag') + end + + private + + def block_types(nodelist) + nodelist.collect(&:class) + end +end # VariableTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/condition_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/condition_unit_test.rb new file mode 100644 index 0000000..8dfc788 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/condition_unit_test.rb @@ -0,0 +1,158 @@ +require 'test_helper' + +class ConditionUnitTest < Minitest::Test + include Liquid + + def setup + @context = Liquid::Context.new + end + + def test_basic_condition + assert_equal false, Condition.new(1, '==', 2).evaluate + assert_equal true, Condition.new(1, '==', 1).evaluate + end + + def test_default_operators_evalute_true + assert_evaluates_true 1, '==', 1 + assert_evaluates_true 1, '!=', 2 + assert_evaluates_true 1, '<>', 2 + assert_evaluates_true 1, '<', 2 + assert_evaluates_true 2, '>', 1 + assert_evaluates_true 1, '>=', 1 + assert_evaluates_true 2, '>=', 1 + assert_evaluates_true 1, '<=', 2 + assert_evaluates_true 1, '<=', 1 + # negative numbers + assert_evaluates_true 1, '>', -1 + assert_evaluates_true (-1), '<', 1 + assert_evaluates_true 1.0, '>', -1.0 + assert_evaluates_true (-1.0), '<', 1.0 + end + + def test_default_operators_evalute_false + assert_evaluates_false 1, '==', 2 + assert_evaluates_false 1, '!=', 1 + assert_evaluates_false 1, '<>', 1 + assert_evaluates_false 1, '<', 0 + assert_evaluates_false 2, '>', 4 + assert_evaluates_false 1, '>=', 3 + assert_evaluates_false 2, '>=', 4 + assert_evaluates_false 1, '<=', 0 + assert_evaluates_false 1, '<=', 0 + end + + def test_contains_works_on_strings + assert_evaluates_true 'bob', 'contains', 'o' + assert_evaluates_true 'bob', 'contains', 'b' + assert_evaluates_true 'bob', 'contains', 'bo' + assert_evaluates_true 'bob', 'contains', 'ob' + assert_evaluates_true 'bob', 'contains', 'bob' + + assert_evaluates_false 'bob', 'contains', 'bob2' + assert_evaluates_false 'bob', 'contains', 'a' + assert_evaluates_false 'bob', 'contains', '---' + end + + def test_invalid_comparation_operator + assert_evaluates_argument_error 1, '~~', 0 + end + + def test_comparation_of_int_and_str + assert_evaluates_argument_error '1', '>', 0 + assert_evaluates_argument_error '1', '<', 0 + assert_evaluates_argument_error '1', '>=', 0 + assert_evaluates_argument_error '1', '<=', 0 + end + + def test_contains_works_on_arrays + @context = Liquid::Context.new + @context['array'] = [1, 2, 3, 4, 5] + array_expr = VariableLookup.new("array") + + assert_evaluates_false array_expr, 'contains', 0 + assert_evaluates_true array_expr, 'contains', 1 + assert_evaluates_true array_expr, 'contains', 2 + assert_evaluates_true array_expr, 'contains', 3 + assert_evaluates_true array_expr, 'contains', 4 + assert_evaluates_true array_expr, 'contains', 5 + assert_evaluates_false array_expr, 'contains', 6 + assert_evaluates_false array_expr, 'contains', "1" + end + + def test_contains_returns_false_for_nil_operands + @context = Liquid::Context.new + assert_evaluates_false VariableLookup.new('not_assigned'), 'contains', '0' + assert_evaluates_false 0, 'contains', VariableLookup.new('not_assigned') + end + + def test_contains_return_false_on_wrong_data_type + assert_evaluates_false 1, 'contains', 0 + end + + def test_contains_with_string_left_operand_coerces_right_operand_to_string + assert_evaluates_true ' 1 ', 'contains', 1 + assert_evaluates_false ' 1 ', 'contains', 2 + end + + def test_or_condition + condition = Condition.new(1, '==', 2) + + assert_equal false, condition.evaluate + + condition.or Condition.new(2, '==', 1) + + assert_equal false, condition.evaluate + + condition.or Condition.new(1, '==', 1) + + assert_equal true, condition.evaluate + end + + def test_and_condition + condition = Condition.new(1, '==', 1) + + assert_equal true, condition.evaluate + + condition.and Condition.new(2, '==', 2) + + assert_equal true, condition.evaluate + + condition.and Condition.new(2, '==', 1) + + assert_equal false, condition.evaluate + end + + def test_should_allow_custom_proc_operator + Condition.operators['starts_with'] = proc { |cond, left, right| left =~ %r{^#{right}} } + + assert_evaluates_true 'bob', 'starts_with', 'b' + assert_evaluates_false 'bob', 'starts_with', 'o' + ensure + Condition.operators.delete 'starts_with' + end + + def test_left_or_right_may_contain_operators + @context = Liquid::Context.new + @context['one'] = @context['another'] = "gnomeslab-and-or-liquid" + + assert_evaluates_true VariableLookup.new("one"), '==', VariableLookup.new("another") + end + + private + + def assert_evaluates_true(left, op, right) + assert Condition.new(left, op, right).evaluate(@context), + "Evaluated false: #{left} #{op} #{right}" + end + + def assert_evaluates_false(left, op, right) + assert !Condition.new(left, op, right).evaluate(@context), + "Evaluated true: #{left} #{op} #{right}" + end + + def assert_evaluates_argument_error(left, op, right) + assert_raises(Liquid::ArgumentError) do + Condition.new(left, op, right).evaluate(@context) + end + end +end # ConditionTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/context_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/context_unit_test.rb new file mode 100644 index 0000000..5655865 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/context_unit_test.rb @@ -0,0 +1,483 @@ +require 'test_helper' + +class HundredCentes + def to_liquid + 100 + end +end + +class CentsDrop < Liquid::Drop + def amount + HundredCentes.new + end + + def non_zero? + true + end +end + +class ContextSensitiveDrop < Liquid::Drop + def test + @context['test'] + end +end + +class Category < Liquid::Drop + attr_accessor :name + + def initialize(name) + @name = name + end + + def to_liquid + CategoryDrop.new(self) + end +end + +class CategoryDrop + attr_accessor :category, :context + def initialize(category) + @category = category + end +end + +class CounterDrop < Liquid::Drop + def count + @count ||= 0 + @count += 1 + end +end + +class ArrayLike + def fetch(index) + end + + def [](index) + @counts ||= [] + @counts[index] ||= 0 + @counts[index] += 1 + end + + def to_liquid + self + end +end + +class ContextUnitTest < Minitest::Test + include Liquid + + def setup + @context = Liquid::Context.new + end + + def teardown + Spy.teardown + end + + def test_variables + @context['string'] = 'string' + assert_equal 'string', @context['string'] + + @context['num'] = 5 + assert_equal 5, @context['num'] + + @context['time'] = Time.parse('2006-06-06 12:00:00') + assert_equal Time.parse('2006-06-06 12:00:00'), @context['time'] + + @context['date'] = Date.today + assert_equal Date.today, @context['date'] + + now = DateTime.now + @context['datetime'] = now + assert_equal now, @context['datetime'] + + @context['bool'] = true + assert_equal true, @context['bool'] + + @context['bool'] = false + assert_equal false, @context['bool'] + + @context['nil'] = nil + assert_equal nil, @context['nil'] + assert_equal nil, @context['nil'] + end + + def test_variables_not_existing + assert_equal nil, @context['does_not_exist'] + end + + def test_scoping + @context.push + @context.pop + + assert_raises(Liquid::ContextError) do + @context.pop + end + + assert_raises(Liquid::ContextError) do + @context.push + @context.pop + @context.pop + end + end + + def test_length_query + @context['numbers'] = [1, 2, 3, 4] + + assert_equal 4, @context['numbers.size'] + + @context['numbers'] = { 1 => 1, 2 => 2, 3 => 3, 4 => 4 } + + assert_equal 4, @context['numbers.size'] + + @context['numbers'] = { 1 => 1, 2 => 2, 3 => 3, 4 => 4, 'size' => 1000 } + + assert_equal 1000, @context['numbers.size'] + end + + def test_hyphenated_variable + @context['oh-my'] = 'godz' + assert_equal 'godz', @context['oh-my'] + end + + def test_add_filter + filter = Module.new do + def hi(output) + output + ' hi!' + end + end + + context = Context.new + context.add_filters(filter) + assert_equal 'hi? hi!', context.invoke(:hi, 'hi?') + + context = Context.new + assert_equal 'hi?', context.invoke(:hi, 'hi?') + + context.add_filters(filter) + assert_equal 'hi? hi!', context.invoke(:hi, 'hi?') + end + + def test_only_intended_filters_make_it_there + filter = Module.new do + def hi(output) + output + ' hi!' + end + end + + context = Context.new + assert_equal "Wookie", context.invoke("hi", "Wookie") + + context.add_filters(filter) + assert_equal "Wookie hi!", context.invoke("hi", "Wookie") + end + + def test_add_item_in_outer_scope + @context['test'] = 'test' + @context.push + assert_equal 'test', @context['test'] + @context.pop + assert_equal 'test', @context['test'] + end + + def test_add_item_in_inner_scope + @context.push + @context['test'] = 'test' + assert_equal 'test', @context['test'] + @context.pop + assert_equal nil, @context['test'] + end + + def test_hierachical_data + @context['hash'] = { "name" => 'tobi' } + assert_equal 'tobi', @context['hash.name'] + assert_equal 'tobi', @context['hash["name"]'] + end + + def test_keywords + assert_equal true, @context['true'] + assert_equal false, @context['false'] + end + + def test_digits + assert_equal 100, @context['100'] + assert_equal 100.00, @context['100.00'] + end + + def test_strings + assert_equal "hello!", @context['"hello!"'] + assert_equal "hello!", @context["'hello!'"] + end + + def test_merge + @context.merge({ "test" => "test" }) + assert_equal 'test', @context['test'] + @context.merge({ "test" => "newvalue", "foo" => "bar" }) + assert_equal 'newvalue', @context['test'] + assert_equal 'bar', @context['foo'] + end + + def test_array_notation + @context['test'] = [1, 2, 3, 4, 5] + + assert_equal 1, @context['test[0]'] + assert_equal 2, @context['test[1]'] + assert_equal 3, @context['test[2]'] + assert_equal 4, @context['test[3]'] + assert_equal 5, @context['test[4]'] + end + + def test_recoursive_array_notation + @context['test'] = { 'test' => [1, 2, 3, 4, 5] } + + assert_equal 1, @context['test.test[0]'] + + @context['test'] = [{ 'test' => 'worked' }] + + assert_equal 'worked', @context['test[0].test'] + end + + def test_hash_to_array_transition + @context['colors'] = { + 'Blue' => ['003366', '336699', '6699CC', '99CCFF'], + 'Green' => ['003300', '336633', '669966', '99CC99'], + 'Yellow' => ['CC9900', 'FFCC00', 'FFFF99', 'FFFFCC'], + 'Red' => ['660000', '993333', 'CC6666', 'FF9999'] + } + + assert_equal '003366', @context['colors.Blue[0]'] + assert_equal 'FF9999', @context['colors.Red[3]'] + end + + def test_try_first + @context['test'] = [1, 2, 3, 4, 5] + + assert_equal 1, @context['test.first'] + assert_equal 5, @context['test.last'] + + @context['test'] = { 'test' => [1, 2, 3, 4, 5] } + + assert_equal 1, @context['test.test.first'] + assert_equal 5, @context['test.test.last'] + + @context['test'] = [1] + assert_equal 1, @context['test.first'] + assert_equal 1, @context['test.last'] + end + + def test_access_hashes_with_hash_notation + @context['products'] = { 'count' => 5, 'tags' => ['deepsnow', 'freestyle'] } + @context['product'] = { 'variants' => [ { 'title' => 'draft151cm' }, { 'title' => 'element151cm' } ] } + + assert_equal 5, @context['products["count"]'] + assert_equal 'deepsnow', @context['products["tags"][0]'] + assert_equal 'deepsnow', @context['products["tags"].first'] + assert_equal 'draft151cm', @context['product["variants"][0]["title"]'] + assert_equal 'element151cm', @context['product["variants"][1]["title"]'] + assert_equal 'draft151cm', @context['product["variants"][0]["title"]'] + assert_equal 'element151cm', @context['product["variants"].last["title"]'] + end + + def test_access_variable_with_hash_notation + @context['foo'] = 'baz' + @context['bar'] = 'foo' + + assert_equal 'baz', @context['["foo"]'] + assert_equal 'baz', @context['[bar]'] + end + + def test_access_hashes_with_hash_access_variables + @context['var'] = 'tags' + @context['nested'] = { 'var' => 'tags' } + @context['products'] = { 'count' => 5, 'tags' => ['deepsnow', 'freestyle'] } + + assert_equal 'deepsnow', @context['products[var].first'] + assert_equal 'freestyle', @context['products[nested.var].last'] + end + + def test_hash_notation_only_for_hash_access + @context['array'] = [1, 2, 3, 4, 5] + @context['hash'] = { 'first' => 'Hello' } + + assert_equal 1, @context['array.first'] + assert_equal nil, @context['array["first"]'] + assert_equal 'Hello', @context['hash["first"]'] + end + + def test_first_can_appear_in_middle_of_callchain + @context['product'] = { 'variants' => [ { 'title' => 'draft151cm' }, { 'title' => 'element151cm' } ] } + + assert_equal 'draft151cm', @context['product.variants[0].title'] + assert_equal 'element151cm', @context['product.variants[1].title'] + assert_equal 'draft151cm', @context['product.variants.first.title'] + assert_equal 'element151cm', @context['product.variants.last.title'] + end + + def test_cents + @context.merge("cents" => HundredCentes.new) + assert_equal 100, @context['cents'] + end + + def test_nested_cents + @context.merge("cents" => { 'amount' => HundredCentes.new }) + assert_equal 100, @context['cents.amount'] + + @context.merge("cents" => { 'cents' => { 'amount' => HundredCentes.new } }) + assert_equal 100, @context['cents.cents.amount'] + end + + def test_cents_through_drop + @context.merge("cents" => CentsDrop.new) + assert_equal 100, @context['cents.amount'] + end + + def test_nested_cents_through_drop + @context.merge("vars" => { "cents" => CentsDrop.new }) + assert_equal 100, @context['vars.cents.amount'] + end + + def test_drop_methods_with_question_marks + @context.merge("cents" => CentsDrop.new) + assert @context['cents.non_zero?'] + end + + def test_context_from_within_drop + @context.merge("test" => '123', "vars" => ContextSensitiveDrop.new) + assert_equal '123', @context['vars.test'] + end + + def test_nested_context_from_within_drop + @context.merge("test" => '123', "vars" => { "local" => ContextSensitiveDrop.new }) + assert_equal '123', @context['vars.local.test'] + end + + def test_ranges + @context.merge("test" => '5') + assert_equal (1..5), @context['(1..5)'] + assert_equal (1..5), @context['(1..test)'] + assert_equal (5..5), @context['(test..test)'] + end + + def test_cents_through_drop_nestedly + @context.merge("cents" => { "cents" => CentsDrop.new }) + assert_equal 100, @context['cents.cents.amount'] + + @context.merge("cents" => { "cents" => { "cents" => CentsDrop.new } }) + assert_equal 100, @context['cents.cents.cents.amount'] + end + + def test_drop_with_variable_called_only_once + @context['counter'] = CounterDrop.new + + assert_equal 1, @context['counter.count'] + assert_equal 2, @context['counter.count'] + assert_equal 3, @context['counter.count'] + end + + def test_drop_with_key_called_only_once + @context['counter'] = CounterDrop.new + + assert_equal 1, @context['counter["count"]'] + assert_equal 2, @context['counter["count"]'] + assert_equal 3, @context['counter["count"]'] + end + + def test_proc_as_variable + @context['dynamic'] = proc { 'Hello' } + + assert_equal 'Hello', @context['dynamic'] + end + + def test_lambda_as_variable + @context['dynamic'] = proc { 'Hello' } + + assert_equal 'Hello', @context['dynamic'] + end + + def test_nested_lambda_as_variable + @context['dynamic'] = { "lambda" => proc { 'Hello' } } + + assert_equal 'Hello', @context['dynamic.lambda'] + end + + def test_array_containing_lambda_as_variable + @context['dynamic'] = [1, 2, proc { 'Hello' }, 4, 5] + + assert_equal 'Hello', @context['dynamic[2]'] + end + + def test_lambda_is_called_once + @context['callcount'] = proc { @global ||= 0; @global += 1; @global.to_s } + + assert_equal '1', @context['callcount'] + assert_equal '1', @context['callcount'] + assert_equal '1', @context['callcount'] + + @global = nil + end + + def test_nested_lambda_is_called_once + @context['callcount'] = { "lambda" => proc { @global ||= 0; @global += 1; @global.to_s } } + + assert_equal '1', @context['callcount.lambda'] + assert_equal '1', @context['callcount.lambda'] + assert_equal '1', @context['callcount.lambda'] + + @global = nil + end + + def test_lambda_in_array_is_called_once + @context['callcount'] = [1, 2, proc { @global ||= 0; @global += 1; @global.to_s }, 4, 5] + + assert_equal '1', @context['callcount[2]'] + assert_equal '1', @context['callcount[2]'] + assert_equal '1', @context['callcount[2]'] + + @global = nil + end + + def test_access_to_context_from_proc + @context.registers[:magic] = 345392 + + @context['magic'] = proc { @context.registers[:magic] } + + assert_equal 345392, @context['magic'] + end + + def test_to_liquid_and_context_at_first_level + @context['category'] = Category.new("foobar") + assert_kind_of CategoryDrop, @context['category'] + assert_equal @context, @context['category'].context + end + + def test_use_empty_instead_of_any_in_interrupt_handling_to_avoid_lots_of_unnecessary_object_allocations + mock_any = Spy.on_instance_method(Array, :any?) + mock_empty = Spy.on_instance_method(Array, :empty?) + + @context.interrupt? + + refute mock_any.has_been_called? + assert mock_empty.has_been_called? + end + + def test_context_initialization_with_a_proc_in_environment + contx = Context.new([test: ->(c) { c['poutine'] }], { test: :foo }) + + assert contx + assert_nil contx['poutine'] + end + + def test_apply_global_filter + global_filter_proc = ->(output) { "#{output} filtered" } + + context = Context.new + context.global_filter = global_filter_proc + + assert_equal 'hi filtered', context.apply_global_filter('hi') + end + + def test_apply_global_filter_when_no_global_filter_exist + context = Context.new + assert_equal 'hi', context.apply_global_filter('hi') + end +end # ContextTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/file_system_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/file_system_unit_test.rb new file mode 100644 index 0000000..2c7250b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/file_system_unit_test.rb @@ -0,0 +1,35 @@ +require 'test_helper' + +class FileSystemUnitTest < Minitest::Test + include Liquid + + def test_default + assert_raises(FileSystemError) do + BlankFileSystem.new.read_template_file("dummy") + end + end + + def test_local + file_system = Liquid::LocalFileSystem.new("/some/path") + assert_equal "/some/path/_mypartial.liquid", file_system.full_path("mypartial") + assert_equal "/some/path/dir/_mypartial.liquid", file_system.full_path("dir/mypartial") + + assert_raises(FileSystemError) do + file_system.full_path("../dir/mypartial") + end + + assert_raises(FileSystemError) do + file_system.full_path("/dir/../../dir/mypartial") + end + + assert_raises(FileSystemError) do + file_system.full_path("/etc/passwd") + end + end + + def test_custom_template_filename_patterns + file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html") + assert_equal "/some/path/mypartial.html", file_system.full_path("mypartial") + assert_equal "/some/path/dir/mypartial.html", file_system.full_path("dir/mypartial") + end +end # FileSystemTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/i18n_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/i18n_unit_test.rb new file mode 100644 index 0000000..b57500e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/i18n_unit_test.rb @@ -0,0 +1,37 @@ +require 'test_helper' + +class I18nUnitTest < Minitest::Test + include Liquid + + def setup + @i18n = I18n.new(fixture("en_locale.yml")) + end + + def test_simple_translate_string + assert_equal "less is more", @i18n.translate("simple") + end + + def test_nested_translate_string + assert_equal "something wasn't right", @i18n.translate("errors.syntax.oops") + end + + def test_single_string_interpolation + assert_equal "something different", @i18n.translate("whatever", something: "different") + end + + # def test_raises_translation_error_on_undefined_interpolation_key + # assert_raises I18n::TranslationError do + # @i18n.translate("whatever", :oopstypos => "yes") + # end + # end + + def test_raises_unknown_translation + assert_raises I18n::TranslationError do + @i18n.translate("doesnt_exist") + end + end + + def test_sets_default_path_to_en + assert_equal I18n::DEFAULT_LOCALE, I18n.new.path + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/lexer_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/lexer_unit_test.rb new file mode 100644 index 0000000..af9c267 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/lexer_unit_test.rb @@ -0,0 +1,51 @@ +require 'test_helper' + +class LexerUnitTest < Minitest::Test + include Liquid + + def test_strings + tokens = Lexer.new(%( 'this is a test""' "wat 'lol'")).tokenize + assert_equal [[:string, %('this is a test""')], [:string, %("wat 'lol'")], [:end_of_string]], tokens + end + + def test_integer + tokens = Lexer.new('hi 50').tokenize + assert_equal [[:id, 'hi'], [:number, '50'], [:end_of_string]], tokens + end + + def test_float + tokens = Lexer.new('hi 5.0').tokenize + assert_equal [[:id, 'hi'], [:number, '5.0'], [:end_of_string]], tokens + end + + def test_comparison + tokens = Lexer.new('== <> contains').tokenize + assert_equal [[:comparison, '=='], [:comparison, '<>'], [:comparison, 'contains'], [:end_of_string]], tokens + end + + def test_specials + tokens = Lexer.new('| .:').tokenize + assert_equal [[:pipe, '|'], [:dot, '.'], [:colon, ':'], [:end_of_string]], tokens + tokens = Lexer.new('[,]').tokenize + assert_equal [[:open_square, '['], [:comma, ','], [:close_square, ']'], [:end_of_string]], tokens + end + + def test_fancy_identifiers + tokens = Lexer.new('hi five?').tokenize + assert_equal [[:id, 'hi'], [:id, 'five?'], [:end_of_string]], tokens + + tokens = Lexer.new('2foo').tokenize + assert_equal [[:number, '2'], [:id, 'foo'], [:end_of_string]], tokens + end + + def test_whitespace + tokens = Lexer.new("five|\n\t ==").tokenize + assert_equal [[:id, 'five'], [:pipe, '|'], [:comparison, '=='], [:end_of_string]], tokens + end + + def test_unexpected_character + assert_raises(SyntaxError) do + Lexer.new("%").tokenize + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/parser_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/parser_unit_test.rb new file mode 100644 index 0000000..9f23337 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/parser_unit_test.rb @@ -0,0 +1,82 @@ +require 'test_helper' + +class ParserUnitTest < Minitest::Test + include Liquid + + def test_consume + p = Parser.new("wat: 7") + assert_equal 'wat', p.consume(:id) + assert_equal ':', p.consume(:colon) + assert_equal '7', p.consume(:number) + end + + def test_jump + p = Parser.new("wat: 7") + p.jump(2) + assert_equal '7', p.consume(:number) + end + + def test_consume? + p = Parser.new("wat: 7") + assert_equal 'wat', p.consume?(:id) + assert_equal false, p.consume?(:dot) + assert_equal ':', p.consume(:colon) + assert_equal '7', p.consume?(:number) + end + + def test_id? + p = Parser.new("wat 6 Peter Hegemon") + assert_equal 'wat', p.id?('wat') + assert_equal false, p.id?('endgame') + assert_equal '6', p.consume(:number) + assert_equal 'Peter', p.id?('Peter') + assert_equal false, p.id?('Achilles') + end + + def test_look + p = Parser.new("wat 6 Peter Hegemon") + assert_equal true, p.look(:id) + assert_equal 'wat', p.consume(:id) + assert_equal false, p.look(:comparison) + assert_equal true, p.look(:number) + assert_equal true, p.look(:id, 1) + assert_equal false, p.look(:number, 1) + end + + def test_expressions + p = Parser.new("hi.there hi?[5].there? hi.there.bob") + assert_equal 'hi.there', p.expression + assert_equal 'hi?[5].there?', p.expression + assert_equal 'hi.there.bob', p.expression + + p = Parser.new("567 6.0 'lol' \"wut\"") + assert_equal '567', p.expression + assert_equal '6.0', p.expression + assert_equal "'lol'", p.expression + assert_equal '"wut"', p.expression + end + + def test_ranges + p = Parser.new("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)") + assert_equal '(5..7)', p.expression + assert_equal '(1.5..9.6)', p.expression + assert_equal '(young..old)', p.expression + assert_equal '(hi[5].wat..old)', p.expression + end + + def test_arguments + p = Parser.new("filter: hi.there[5], keyarg: 7") + assert_equal 'filter', p.consume(:id) + assert_equal ':', p.consume(:colon) + assert_equal 'hi.there[5]', p.argument + assert_equal ',', p.consume(:comma) + assert_equal 'keyarg: 7', p.argument + end + + def test_invalid_expression + assert_raises(SyntaxError) do + p = Parser.new("==") + p.expression + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/regexp_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/regexp_unit_test.rb new file mode 100644 index 0000000..0821229 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/regexp_unit_test.rb @@ -0,0 +1,44 @@ +require 'test_helper' + +class RegexpUnitTest < Minitest::Test + include Liquid + + def test_empty + assert_equal [], ''.scan(QuotedFragment) + end + + def test_quote + assert_equal ['"arg 1"'], '"arg 1"'.scan(QuotedFragment) + end + + def test_words + assert_equal ['arg1', 'arg2'], 'arg1 arg2'.scan(QuotedFragment) + end + + def test_tags + assert_equal ['', ''], ' '.scan(QuotedFragment) + assert_equal [''], ''.scan(QuotedFragment) + assert_equal ['', ''], %().scan(QuotedFragment) + end + + def test_double_quoted_words + assert_equal ['arg1', 'arg2', '"arg 3"'], 'arg1 arg2 "arg 3"'.scan(QuotedFragment) + end + + def test_single_quoted_words + assert_equal ['arg1', 'arg2', "'arg 3'"], 'arg1 arg2 \'arg 3\''.scan(QuotedFragment) + end + + def test_quoted_words_in_the_middle + assert_equal ['arg1', 'arg2', '"arg 3"', 'arg4'], 'arg1 arg2 "arg 3" arg4 '.scan(QuotedFragment) + end + + def test_variable_parser + assert_equal ['var'], 'var'.scan(VariableParser) + assert_equal ['var', 'method'], 'var.method'.scan(VariableParser) + assert_equal ['var', '[method]'], 'var[method]'.scan(VariableParser) + assert_equal ['var', '[method]', '[0]'], 'var[method][0]'.scan(VariableParser) + assert_equal ['var', '["method"]', '[0]'], 'var["method"][0]'.scan(VariableParser) + assert_equal ['var', '[method]', '[0]', 'method'], 'var[method][0].method'.scan(VariableParser) + end +end # RegexpTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/strainer_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/strainer_unit_test.rb new file mode 100644 index 0000000..6ccdc27 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/strainer_unit_test.rb @@ -0,0 +1,148 @@ +require 'test_helper' + +class StrainerUnitTest < Minitest::Test + include Liquid + + module AccessScopeFilters + def public_filter + "public" + end + + def private_filter + "private" + end + private :private_filter + end + + Strainer.global_filter(AccessScopeFilters) + + def test_strainer + strainer = Strainer.create(nil) + assert_equal 5, strainer.invoke('size', 'input') + assert_equal "public", strainer.invoke("public_filter") + end + + def test_stainer_raises_argument_error + strainer = Strainer.create(nil) + assert_raises(Liquid::ArgumentError) do + strainer.invoke("public_filter", 1) + end + end + + def test_stainer_argument_error_contains_backtrace + strainer = Strainer.create(nil) + begin + strainer.invoke("public_filter", 1) + rescue Liquid::ArgumentError => e + assert_match( + /\ALiquid error: wrong number of arguments \((1 for 0|given 1, expected 0)\)\z/, + e.message) + assert_equal e.backtrace[0].split(':')[0], __FILE__ + end + end + + def test_strainer_only_invokes_public_filter_methods + strainer = Strainer.create(nil) + assert_equal false, strainer.class.invokable?('__test__') + assert_equal false, strainer.class.invokable?('test') + assert_equal false, strainer.class.invokable?('instance_eval') + assert_equal false, strainer.class.invokable?('__send__') + assert_equal true, strainer.class.invokable?('size') # from the standard lib + end + + def test_strainer_returns_nil_if_no_filter_method_found + strainer = Strainer.create(nil) + assert_nil strainer.invoke("private_filter") + assert_nil strainer.invoke("undef_the_filter") + end + + def test_strainer_returns_first_argument_if_no_method_and_arguments_given + strainer = Strainer.create(nil) + assert_equal "password", strainer.invoke("undef_the_method", "password") + end + + def test_strainer_only_allows_methods_defined_in_filters + strainer = Strainer.create(nil) + assert_equal "1 + 1", strainer.invoke("instance_eval", "1 + 1") + assert_equal "puts", strainer.invoke("__send__", "puts", "Hi Mom") + assert_equal "has_method?", strainer.invoke("invoke", "has_method?", "invoke") + end + + def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation + a = Module.new + b = Module.new + strainer = Strainer.create(nil, [a, b]) + assert_kind_of Strainer, strainer + assert_kind_of a, strainer + assert_kind_of b, strainer + assert_kind_of Liquid::StandardFilters, strainer + end + + def test_add_filter_when_wrong_filter_class + c = Context.new + s = c.strainer + wrong_filter = ->(v) { v.reverse } + + assert_raises ArgumentError do + s.class.add_filter(wrong_filter) + end + end + + module PrivateMethodOverrideFilter + private + + def public_filter + "overriden as private" + end + end + + def test_add_filter_raises_when_module_privately_overrides_registered_public_methods + strainer = Context.new.strainer + + error = assert_raises(Liquid::MethodOverrideError) do + strainer.class.add_filter(PrivateMethodOverrideFilter) + end + assert_equal 'Liquid error: Filter overrides registered public methods as non public: public_filter', error.message + end + + module ProtectedMethodOverrideFilter + protected + + def public_filter + "overriden as protected" + end + end + + def test_add_filter_raises_when_module_overrides_registered_public_method_as_protected + strainer = Context.new.strainer + + error = assert_raises(Liquid::MethodOverrideError) do + strainer.class.add_filter(ProtectedMethodOverrideFilter) + end + assert_equal 'Liquid error: Filter overrides registered public methods as non public: public_filter', error.message + end + + module PublicMethodOverrideFilter + def public_filter + "public" + end + end + + def test_add_filter_does_not_raise_when_module_overrides_previously_registered_method + strainer = Context.new.strainer + strainer.class.add_filter(PublicMethodOverrideFilter) + assert strainer.class.filter_methods.include?('public_filter') + end + + module LateAddedFilter + def late_added_filter(input) + "filtered" + end + end + + def test_global_filter_clears_cache + assert_equal 'input', Strainer.create(nil).invoke('late_added_filter', 'input') + Strainer.global_filter(LateAddedFilter) + assert_equal 'filtered', Strainer.create(nil).invoke('late_added_filter', 'input') + end +end # StrainerTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tag_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tag_unit_test.rb new file mode 100644 index 0000000..c4b901b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tag_unit_test.rb @@ -0,0 +1,21 @@ +require 'test_helper' + +class TagUnitTest < Minitest::Test + include Liquid + + def test_tag + tag = Tag.parse('tag', "", Tokenizer.new(""), ParseContext.new) + assert_equal 'liquid::tag', tag.name + assert_equal '', tag.render(Context.new) + end + + def test_return_raw_text_of_tag + tag = Tag.parse("long_tag", "param1, param2, param3", Tokenizer.new(""), ParseContext.new) + assert_equal("long_tag param1, param2, param3", tag.raw) + end + + def test_tag_name_should_return_name_of_the_tag + tag = Tag.parse("some_tag", "", Tokenizer.new(""), ParseContext.new) + assert_equal 'some_tag', tag.tag_name + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/case_tag_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/case_tag_unit_test.rb new file mode 100644 index 0000000..7110308 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/case_tag_unit_test.rb @@ -0,0 +1,10 @@ +require 'test_helper' + +class CaseTagUnitTest < Minitest::Test + include Liquid + + def test_case_nodelist + template = Liquid::Template.parse('{% case var %}{% when true %}WHEN{% else %}ELSE{% endcase %}') + assert_equal ['WHEN', 'ELSE'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/for_tag_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/for_tag_unit_test.rb new file mode 100644 index 0000000..b8fc520 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/for_tag_unit_test.rb @@ -0,0 +1,13 @@ +require 'test_helper' + +class ForTagUnitTest < Minitest::Test + def test_for_nodelist + template = Liquid::Template.parse('{% for item in items %}FOR{% endfor %}') + assert_equal ['FOR'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten + end + + def test_for_else_nodelist + template = Liquid::Template.parse('{% for item in items %}FOR{% else %}ELSE{% endfor %}') + assert_equal ['FOR', 'ELSE'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/if_tag_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/if_tag_unit_test.rb new file mode 100644 index 0000000..7ecfc40 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tags/if_tag_unit_test.rb @@ -0,0 +1,8 @@ +require 'test_helper' + +class IfTagUnitTest < Minitest::Test + def test_if_nodelist + template = Liquid::Template.parse('{% if true %}IF{% else %}ELSE{% endif %}') + assert_equal ['IF', 'ELSE'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/template_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/template_unit_test.rb new file mode 100644 index 0000000..6328be5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/template_unit_test.rb @@ -0,0 +1,78 @@ +require 'test_helper' + +class TemplateUnitTest < Minitest::Test + include Liquid + + def test_sets_default_localization_in_document + t = Template.new + t.parse('{%comment%}{%endcomment%}') + assert_instance_of I18n, t.root.nodelist[0].options[:locale] + end + + def test_sets_default_localization_in_context_with_quick_initialization + t = Template.new + t.parse('{%comment%}{%endcomment%}', locale: I18n.new(fixture("en_locale.yml"))) + + locale = t.root.nodelist[0].options[:locale] + assert_instance_of I18n, locale + assert_equal fixture("en_locale.yml"), locale.path + end + + def test_with_cache_classes_tags_returns_the_same_class + original_cache_setting = Liquid.cache_classes + Liquid.cache_classes = true + + original_klass = Class.new + Object.send(:const_set, :CustomTag, original_klass) + Template.register_tag('custom', CustomTag) + + Object.send(:remove_const, :CustomTag) + + new_klass = Class.new + Object.send(:const_set, :CustomTag, new_klass) + + assert Template.tags['custom'].equal?(original_klass) + ensure + Object.send(:remove_const, :CustomTag) + Template.tags.delete('custom') + Liquid.cache_classes = original_cache_setting + end + + def test_without_cache_classes_tags_reloads_the_class + original_cache_setting = Liquid.cache_classes + Liquid.cache_classes = false + + original_klass = Class.new + Object.send(:const_set, :CustomTag, original_klass) + Template.register_tag('custom', CustomTag) + + Object.send(:remove_const, :CustomTag) + + new_klass = Class.new + Object.send(:const_set, :CustomTag, new_klass) + + assert Template.tags['custom'].equal?(new_klass) + ensure + Object.send(:remove_const, :CustomTag) + Template.tags.delete('custom') + Liquid.cache_classes = original_cache_setting + end + + class FakeTag; end + + def test_tags_delete + Template.register_tag('fake', FakeTag) + assert_equal FakeTag, Template.tags['fake'] + + Template.tags.delete('fake') + assert_nil Template.tags['fake'] + end + + def test_tags_can_be_looped_over + Template.register_tag('fake', FakeTag) + result = Template.tags.map { |name, klass| [name, klass] } + assert result.include?(["fake", "TemplateUnitTest::FakeTag"]) + ensure + Template.tags.delete('fake') + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tokenizer_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tokenizer_unit_test.rb new file mode 100644 index 0000000..de84c1f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/tokenizer_unit_test.rb @@ -0,0 +1,55 @@ +require 'test_helper' + +class TokenizerTest < Minitest::Test + def test_tokenize_strings + assert_equal [' '], tokenize(' ') + assert_equal ['hello world'], tokenize('hello world') + end + + def test_tokenize_variables + assert_equal ['{{funk}}'], tokenize('{{funk}}') + assert_equal [' ', '{{funk}}', ' '], tokenize(' {{funk}} ') + assert_equal [' ', '{{funk}}', ' ', '{{so}}', ' ', '{{brother}}', ' '], tokenize(' {{funk}} {{so}} {{brother}} ') + assert_equal [' ', '{{ funk }}', ' '], tokenize(' {{ funk }} ') + end + + def test_tokenize_blocks + assert_equal ['{%comment%}'], tokenize('{%comment%}') + assert_equal [' ', '{%comment%}', ' '], tokenize(' {%comment%} ') + + assert_equal [' ', '{%comment%}', ' ', '{%endcomment%}', ' '], tokenize(' {%comment%} {%endcomment%} ') + assert_equal [' ', '{% comment %}', ' ', '{% endcomment %}', ' '], tokenize(" {% comment %} {% endcomment %} ") + end + + def test_calculate_line_numbers_per_token_with_profiling + assert_equal [1], tokenize_line_numbers("{{funk}}") + assert_equal [1, 1, 1], tokenize_line_numbers(" {{funk}} ") + assert_equal [1, 2, 2], tokenize_line_numbers("\n{{funk}}\n") + assert_equal [1, 1, 3], tokenize_line_numbers(" {{\n funk \n}} ") + end + + private + + def tokenize(source) + tokenizer = Liquid::Tokenizer.new(source) + tokens = [] + while t = tokenizer.shift + tokens << t + end + tokens + end + + def tokenize_line_numbers(source) + tokenizer = Liquid::Tokenizer.new(source, true) + line_numbers = [] + loop do + line_number = tokenizer.line_number + if tokenizer.shift + line_numbers << line_number + else + break + end + end + line_numbers + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/variable_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/variable_unit_test.rb new file mode 100644 index 0000000..5a21ace --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.0/test/unit/variable_unit_test.rb @@ -0,0 +1,162 @@ +require 'test_helper' + +class VariableUnitTest < Minitest::Test + include Liquid + + def test_variable + var = create_variable('hello') + assert_equal VariableLookup.new('hello'), var.name + end + + def test_filters + var = create_variable('hello | textileze') + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['textileze', []]], var.filters + + var = create_variable('hello | textileze | paragraph') + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['textileze', []], ['paragraph', []]], var.filters + + var = create_variable(%( hello | strftime: '%Y')) + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['strftime', ['%Y']]], var.filters + + var = create_variable(%( 'typo' | link_to: 'Typo', true )) + assert_equal 'typo', var.name + assert_equal [['link_to', ['Typo', true]]], var.filters + + var = create_variable(%( 'typo' | link_to: 'Typo', false )) + assert_equal 'typo', var.name + assert_equal [['link_to', ['Typo', false]]], var.filters + + var = create_variable(%( 'foo' | repeat: 3 )) + assert_equal 'foo', var.name + assert_equal [['repeat', [3]]], var.filters + + var = create_variable(%( 'foo' | repeat: 3, 3 )) + assert_equal 'foo', var.name + assert_equal [['repeat', [3, 3]]], var.filters + + var = create_variable(%( 'foo' | repeat: 3, 3, 3 )) + assert_equal 'foo', var.name + assert_equal [['repeat', [3, 3, 3]]], var.filters + + var = create_variable(%( hello | strftime: '%Y, okay?')) + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['strftime', ['%Y, okay?']]], var.filters + + var = create_variable(%( hello | things: "%Y, okay?", 'the other one')) + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['things', ['%Y, okay?', 'the other one']]], var.filters + end + + def test_filter_with_date_parameter + var = create_variable(%( '2006-06-06' | date: "%m/%d/%Y")) + assert_equal '2006-06-06', var.name + assert_equal [['date', ['%m/%d/%Y']]], var.filters + end + + def test_filters_without_whitespace + var = create_variable('hello | textileze | paragraph') + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['textileze', []], ['paragraph', []]], var.filters + + var = create_variable('hello|textileze|paragraph') + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['textileze', []], ['paragraph', []]], var.filters + + var = create_variable("hello|replace:'foo','bar'|textileze") + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['replace', ['foo', 'bar']], ['textileze', []]], var.filters + end + + def test_symbol + var = create_variable("http://disney.com/logo.gif | image: 'med' ", error_mode: :lax) + assert_equal VariableLookup.new('http://disney.com/logo.gif'), var.name + assert_equal [['image', ['med']]], var.filters + end + + def test_string_to_filter + var = create_variable("'http://disney.com/logo.gif' | image: 'med' ") + assert_equal 'http://disney.com/logo.gif', var.name + assert_equal [['image', ['med']]], var.filters + end + + def test_string_single_quoted + var = create_variable(%( "hello" )) + assert_equal 'hello', var.name + end + + def test_string_double_quoted + var = create_variable(%( 'hello' )) + assert_equal 'hello', var.name + end + + def test_integer + var = create_variable(%( 1000 )) + assert_equal 1000, var.name + end + + def test_float + var = create_variable(%( 1000.01 )) + assert_equal 1000.01, var.name + end + + def test_dashes + assert_equal VariableLookup.new('foo-bar'), create_variable('foo-bar').name + assert_equal VariableLookup.new('foo-bar-2'), create_variable('foo-bar-2').name + + with_error_mode :strict do + assert_raises(Liquid::SyntaxError) { create_variable('foo - bar') } + assert_raises(Liquid::SyntaxError) { create_variable('-foo') } + assert_raises(Liquid::SyntaxError) { create_variable('2foo') } + end + end + + def test_string_with_special_chars + var = create_variable(%( 'hello! $!@.;"ddasd" ' )) + assert_equal 'hello! $!@.;"ddasd" ', var.name + end + + def test_string_dot + var = create_variable(%( test.test )) + assert_equal VariableLookup.new('test.test'), var.name + end + + def test_filter_with_keyword_arguments + var = create_variable(%( hello | things: greeting: "world", farewell: 'goodbye')) + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['things', [], { 'greeting' => 'world', 'farewell' => 'goodbye' }]], var.filters + end + + def test_lax_filter_argument_parsing + var = create_variable(%( number_of_comments | pluralize: 'comment': 'comments' ), error_mode: :lax) + assert_equal VariableLookup.new('number_of_comments'), var.name + assert_equal [['pluralize', ['comment', 'comments']]], var.filters + end + + def test_strict_filter_argument_parsing + with_error_mode(:strict) do + assert_raises(SyntaxError) do + create_variable(%( number_of_comments | pluralize: 'comment': 'comments' )) + end + end + end + + def test_output_raw_source_of_variable + var = create_variable(%( name_of_variable | upcase )) + assert_equal " name_of_variable | upcase ", var.raw + end + + def test_variable_lookup_interface + lookup = VariableLookup.new('a.b.c') + assert_equal 'a', lookup.name + assert_equal ['b', 'c'], lookup.lookups + end + + private + + def create_variable(markup, options = {}) + Variable.new(markup, ParseContext.new(options)) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CHANGELOG.md b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CHANGELOG.md new file mode 100644 index 0000000..232adbd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CHANGELOG.md @@ -0,0 +1 @@ +# Moved to [GitHub releases](https://github.com/guard/listen/releases) page. diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CONTRIBUTING.md b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CONTRIBUTING.md new file mode 100644 index 0000000..5a5d6de --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CONTRIBUTING.md @@ -0,0 +1,38 @@ +Contribute to Listen +=================== + +File an issue +------------- + +If you haven't already, first see [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) for known issues, solutions and workarounds. + +You can report bugs and feature requests to [GitHub Issues](https://github.com/guard/listen/issues). + +**Please don't ask question in the issue tracker**, instead ask them in our +[Google group](http://groups.google.com/group/guard-dev) or on `#guard` (irc.freenode.net). + +Try to figure out where the issue belongs to: Is it an issue with Listen itself or with Guard? + + +**It's most likely that your bug gets resolved faster if you provide as much information as possible!** + +The MOST useful information is debugging output from Listen (`LISTEN_GEM_DEBUGGING=1`) - see [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) for details. + + +Development +----------- + +* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames). +* Source hosted at [GitHub](https://github.com/guard/listen). + +Pull requests are very welcome! Please try to follow these simple rules if applicable: + +* Please create a topic branch for every separate change you make. +* Make sure your patches are well tested. All specs run with `rake spec` must pass. +* Update the [Yard](http://yardoc.org/) documentation. +* Update the [README](https://github.com/guard/listen/blob/master/README.md). +* Update the [CHANGELOG](https://github.com/guard/listen/blob/master/CHANGELOG.md) for noteworthy changes. +* Please **do not change** the version number. + +For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on +`#guard` (irc.freenode.net). diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/LICENSE.txt b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/LICENSE.txt new file mode 100644 index 0000000..b5f71c8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2013 Thibaud Guillaume-Gentil + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/README.md b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/README.md new file mode 100644 index 0000000..2682872 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/README.md @@ -0,0 +1,297 @@ +## IMPORTANT: [Ruby 2.1 is officially outdated and unsupported!](https://www.ruby-lang.org/en/news/2016/03/30/ruby-2-1-9-released/) Please upgrade to Ruby 2.2 before installing Listen! + +### (To install for older versions, update Bundler to a prerelease version: `gem install bundler --pre` and Bundler should correctly resolve to an earlier gems for your given Ruby version). + +:exclamation: Listen is currently accepting more maintainers. Please [read this](https://github.com/guard/guard/wiki/Maintainers) if you're interested in joining the team. + +# Listen + +[![Gem Version](https://badge.fury.io/rb/listen.png)](http://badge.fury.io/rb/listen) [![Build Status](https://travis-ci.org/guard/listen.png)](https://travis-ci.org/guard/listen) [![Dependency Status](https://gemnasium.com/guard/listen.png)](https://gemnasium.com/guard/listen) [![Code Climate](https://codeclimate.com/github/guard/listen.png)](https://codeclimate.com/github/guard/listen) [![Coverage Status](https://coveralls.io/repos/guard/listen/badge.png?branch=master)](https://coveralls.io/r/guard/listen) + +The Listen gem listens to file modifications and notifies you about the changes. + +## Features + +* OS-optimized adapters on MRI for Mac OS X 10.6+, Linux, \*BSD and Windows, [more info](#listen-adapters) below. +* Detects file modification, addition and removal. +* You can watch multiple directories. +* Regexp-patterns for ignoring paths for more accuracy and speed +* Increased change detection accuracy on OS X HFS and VFAT volumes. +* Tested on selected Ruby environments via [Travis CI](https://travis-ci.org/guard/listen). (See [.travis.yml](https:///github.com/guard/listen/master/.travis.yml) for supported/tested Ruby Versions), + +## Issues / limitations + +* Limited support for symlinked directories ([#279](https://github.com/guard/listen/issues/279)): + * Symlinks are always followed ([#25](https://github.com/guard/listen/issues/25)). + * Symlinked directories pointing within a watched directory are not supported ([#273](https://github.com/guard/listen/pull/273)- see [Duplicate directory errors](https://github.com/guard/listen/wiki/Duplicate-directory-errors)). +* No directory/adapter-specific configuration options. +* Support for plugins planned for future. +* TCP functionality was removed in Listen [3.0.0](https://github.com/guard/listen/releases/tag/v3.0.0) ([#319](https://github.com/guard/listen/issues/319), [#218](https://github.com/guard/listen/issues/218)). There are plans to extract this feature to separate gems ([#258](https://github.com/guard/listen/issues/258)), until this is finished, you can use by locking the `listen` gem to version `'~> 2.10'`. +* Some filesystems won't work without polling (VM/Vagrant Shared folders, NFS, Samba, sshfs, etc.). +* Specs suite on JRuby and Rubinius aren't reliable on Travis CI, but should work. +* Windows and \*BSD adapter aren't continuously and automatically tested. +* OSX adapter has some performance limitations ([#342](https://github.com/guard/listen/issues/342)). +* Ruby < 2.2.x is no longer supported - upgrade to Ruby 2.2 or 2.3 + +Pull requests or help is very welcome for these. + +## Install + +The simplest way to install Listen is to use [Bundler](http://bundler.io). + +```ruby +gem 'listen', '~> 3.0' # NOTE: for TCP functionality, use '~> 2.10' for now +``` + +## Usage + +Call `Listen.to` with either a single directory or multiple directories, then define the "changes" callback in a block. + +``` ruby +listener = Listen.to('dir/to/listen', 'dir/to/listen2') do |modified, added, removed| + puts "modified absolute path: #{modified}" + puts "added absolute path: #{added}" + puts "removed absolute path: #{removed}" +end +listener.start # not blocking +sleep +``` + +### Pause / unpause / stop + +Listeners can also be easily paused/unpaused: + +``` ruby +listener = Listen.to('dir/path/to/listen') { |modified, added, removed| puts 'handle changes here...' } + +listener.start +listener.paused? # => false +listener.processing? # => true + +listener.pause # stops processing changes (but keeps on collecting them) +listener.paused? # => true +listener.processing? # => false + +listener.unpause # resumes processing changes ("start" would do the same) +listener.stop # stop both listening to changes and processing them +``` + + Note: While paused, Listen keeps on collecting changes in the background - to clear them, call "stop" + + Note: You should keep track of all started listeners and stop them properly on finish. + +### Ignore / ignore! + +Listen ignores some directories and extensions by default (See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer), you can add ignoring patterns with the `ignore` option/method or overwrite default with `ignore!` option/method. + +``` ruby +listener = Listen.to('dir/path/to/listen', ignore: /\.txt/) { |modified, added, removed| # ... } +listener.start +listener.ignore! /\.pkg/ # overwrite all patterns and only ignore pkg extension. +listener.ignore /\.rb/ # ignore rb extension in addition of pkg. +sleep +``` + +Note: `:ignore` regexp patterns are evaluated against relative paths. + +Note: Ignoring paths does not improve performance, except when Polling ([#274](https://github.com/guard/listen/issues/274)) + +### Only + +Listen catches all files (less the ignored ones) by default. If you want to only listen to a specific type of file (i.e., just `.rb` extension), you should use the `only` option/method. + +``` ruby +listener = Listen.to('dir/path/to/listen', only: /\.rb$/) { |modified, added, removed| # ... } +listener.start +listener.only /_spec\.rb$/ # overwrite all existing only patterns. +sleep +``` + +Note: `:only` regexp patterns are evaluated only against relative **file** paths. + + +## Changes callback + +Changes to the listened-to directories gets reported back to the user in a callback. +The registered callback gets invoked, when there are changes, with **three** parameters: +`modified`, `added` and `removed` paths, in that particular order. +Paths are always returned in their absolute form. + +Example: + +```ruby +listener = Listen.to('path/to/app') do |modified, added, removed| + # This block will be called when there are changes. +end +listener.start +sleep +``` + +or ... + +```ruby +# Create a callback +callback = Proc.new do |modified, added, removed| + # This proc will be called when there are changes. +end +listener = Listen.to('dir', &callback) +listener.start +sleep +``` + +## Options + +All the following options can be set through the `Listen.to` after the directory path(s) params. + +```ruby +ignore: [%r{/foo/bar}, /\.pid$/, /\.coffee$/] # Ignore a list of paths + # default: See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer + +ignore!: %r{/foo/bar} # Same as ignore options, but overwrite default ignored paths. + +only: %r{.rb$} # Only listen to specific files + # default: none + +latency: 0.5 # Set the delay (**in seconds**) between checking for changes + # default: 0.25 sec (1.0 sec for polling) + +wait_for_delay: 4 # Set the delay (**in seconds**) between calls to the callback when changes exist + # default: 0.10 sec + +force_polling: true # Force the use of the polling adapter + # default: none + +relative: false # Whether changes should be relative to current dir or not + # default: false + +polling_fallback_message: 'custom message' # Set a custom polling fallback message (or disable it with false) + # default: "Listen will be polling for changes. Learn more at https://github.com/guard/listen#listen-adapters." +``` + +## Debugging + +Setting the environment variable `LISTEN_GEM_DEBUGGING=1` sets up the INFO level logger, while `LISTEN_GEM_DEBUGGING=2` sets up the DEBUG level logger. + +You can also set `Listen.logger` to a custom logger. + + +## Listen adapters + +The Listen gem has a set of adapters to notify it when there are changes. + +There are 4 OS-specific adapters to support Darwin, Linux, \*BSD and Windows. +These adapters are fast as they use some system-calls to implement the notifying function. + +There is also a polling adapter - although it's much slower than other adapters, +it works on every platform/system and scenario (including network filesystems such as VM shared folders). + +The Darwin and Linux adapters are dependencies of the Listen gem so they work out of the box. For other adapters a specific gem will have to be added to your Gemfile, please read below. + +The Listen gem will choose the best adapter automatically, if present. If you +want to force the use of the polling adapter, use the `:force_polling` option +while initializing the listener. + +### On Windows + +If you are on Windows, it's recommended to use the [`wdm`](https://github.com/Maher4Ever/wdm) adapter instead of polling. + +Please add the following to your Gemfile: + +```ruby +gem 'wdm', '>= 0.1.0' if Gem.win_platform? +``` + +### On \*BSD + +If you are on \*BSD you can try to use the [`rb-kqueue`](https://github.com/mat813/rb-kqueue) adapter instead of polling. + +Please add the following to your Gemfile: + +```ruby +require 'rbconfig' +if RbConfig::CONFIG['target_os'] =~ /bsd|dragonfly/i + gem 'rb-kqueue', '>= 0.2' +end + +``` + +### Getting the [polling fallback message](#options)? + +Please visit the [installation section of the Listen WIKI](https://github.com/guard/listen/wiki#installation) for more information and options for potential fixes. + +### Issues and troubleshooting + +*NOTE: without providing the output after setting the `LISTEN_GEM_DEBUGGING=1` environment variable, it can be almost impossible to guess why listen is not working as expected.* + +See [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) + +## Performance + +If Listen seems slow or unresponsive, make sure you're not using the Polling adapter (you should see a warning upon startup if you are). + +Also, if the directories you're watching contain many files, make sure you're: + +* not using Polling (ideally) +* using `:ignore` and `:only` options to avoid tracking directories you don't care about (important with Polling and on MacOS) +* running Listen with the `:latency` and `:wait_for_delay` options not too small or too big (depends on needs) +* not watching directories with log files, database files or other frequently changing files +* not using a version of Listen prior to 2.7.7 +* not getting silent crashes within Listen (see LISTEN_GEM_DEBUGGING=2) +* not running multiple instances of Listen in the background +* using a file system with atime modification disabled (ideally) +* not using a filesystem with inaccurate file modification times (ideally), e.g. HFS, VFAT +* not buffering to a slow terminal (e.g. transparency + fancy font + slow gfx card + lots of output) +* ideally not running a slow encryption stack, e.g. btrfs + ecryptfs + +When in doubt, LISTEN_GEM_DEBUGGING=2 can help discover the actual events and time they happened. + +See also [Tips and Techniques](https://github.com/guard/listen/wiki/Tips-and-Techniques). + +## Development + +* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames). +* Source hosted at [GitHub](https://github.com/guard/listen). + +Pull requests are very welcome! Please try to follow these simple rules if applicable: + +* Please create a topic branch for every separate change you make. +* Make sure your patches are well tested. All specs must pass on [Travis CI](https://travis-ci.org/guard/listen). +* Update the [Yard](http://yardoc.org/) documentation. +* Update the [README](https://github.com/guard/listen/blob/master/README.md). +* Please **do not change** the version number. + +For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on +`#guard` (irc.freenode.net). + +## Acknowledgments + +* [Michael Kessler (netzpirat)][] for having written the [initial specs](https://github.com/guard/listen/commit/1e457b13b1bb8a25d2240428ce5ed488bafbed1f). +* [Travis Tilley (ttilley)][] for this awesome work on [fssm][] & [rb-fsevent][]. +* [Nathan Weizenbaum (nex3)][] for [rb-inotify][], a thorough inotify wrapper. +* [Mathieu Arnold (mat813)][] for [rb-kqueue][], a simple kqueue wrapper. +* [Maher Sallam][] for [wdm][], windows support wouldn't exist without him. +* [Yehuda Katz (wycats)][] for [vigilo][], that has been a great source of inspiration. + +## Author + +[Thibaud Guillaume-Gentil](https://github.com/thibaudgg) ([@thibaudgg](https://twitter.com/thibaudgg)) + +## Contributors + +[https://github.com/guard/listen/graphs/contributors](https://github.com/guard/listen/graphs/contributors) + +[Thibaud Guillaume-Gentil (thibaudgg)]: https://github.com/thibaudgg +[Maher Sallam]: https://github.com/Maher4Ever +[Michael Kessler (netzpirat)]: https://github.com/netzpirat +[Travis Tilley (ttilley)]: https://github.com/ttilley +[fssm]: https://github.com/ttilley/fssm +[rb-fsevent]: https://github.com/thibaudgg/rb-fsevent +[Mathieu Arnold (mat813)]: https://github.com/mat813 +[Nathan Weizenbaum (nex3)]: https://github.com/nex3 +[rb-inotify]: https://github.com/nex3/rb-inotify +[stereobooster]: https://github.com/stereobooster +[rb-fchange]: https://github.com/stereobooster/rb-fchange +[rb-kqueue]: https://github.com/mat813/rb-kqueue +[Yehuda Katz (wycats)]: https://github.com/wycats +[vigilo]: https://github.com/wycats/vigilo +[wdm]: https://github.com/Maher4Ever/wdm diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/bin/listen b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/bin/listen new file mode 100755 index 0000000..dbbdef2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/bin/listen @@ -0,0 +1,12 @@ +#!/usr/bin/env ruby + +require 'listen' +require 'listen/cli' + +unless defined?(JRUBY_VERSION) + if Signal.list.keys.include?('INT') + Signal.trap('INT') { Thread.new { Listen.stop } } + end +end + +Listen::CLI.start diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen.rb new file mode 100644 index 0000000..fc9ae3e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen.rb @@ -0,0 +1,57 @@ +require 'logger' +require 'listen/logger' +require 'listen/listener' + +require 'listen/internals/thread_pool' + +# Show warnings about vulnerabilities, bugs and outdated Rubies, since previous +# versions aren't tested or officially supported. +require 'ruby_dep/warning' +RubyDep::Warning.new.show_warnings + +# Always set up logging by default first time file is required +# +# NOTE: If you need to clear the logger completely, do so *after* +# requiring this file. If you need to set a custom logger, +# require the listen/logger file and set the logger before requiring +# this file. +Listen.setup_default_logger_if_unset + +# Won't print anything by default because of level - unless you've set +# LISTEN_GEM_DEBUGGING or provided your own logger with a high enough level +Listen::Logger.info "Listen loglevel set to: #{Listen.logger.level}" +Listen::Logger.info "Listen version: #{Listen::VERSION}" + +module Listen + class << self + # Listens to file system modifications on a either single directory or + # multiple directories. + # + # @param (see Listen::Listener#new) + # + # @yield [modified, added, removed] the changed files + # @yieldparam [Array] modified the list of modified files + # @yieldparam [Array] added the list of added files + # @yieldparam [Array] removed the list of removed files + # + # @return [Listen::Listener] the listener + # + def to(*args, &block) + @listeners ||= [] + Listener.new(*args, &block).tap do |listener| + @listeners << listener + end + end + + # This is used by the `listen` binary to handle Ctrl-C + # + def stop + Internals::ThreadPool.stop + @listeners ||= [] + + # TODO: should use a mutex for this + @listeners.each(&:stop) + @listeners = nil + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter.rb new file mode 100644 index 0000000..a1954d9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter.rb @@ -0,0 +1,45 @@ +require 'listen/adapter/base' +require 'listen/adapter/bsd' +require 'listen/adapter/darwin' +require 'listen/adapter/linux' +require 'listen/adapter/polling' +require 'listen/adapter/windows' + +module Listen + module Adapter + OPTIMIZED_ADAPTERS = [Darwin, Linux, BSD, Windows].freeze + POLLING_FALLBACK_MESSAGE = 'Listen will be polling for changes.'\ + 'Learn more at https://github.com/guard/listen#listen-adapters.'.freeze + + class << self + def select(options = {}) + _log :debug, 'Adapter: considering polling ...' + return Polling if options[:force_polling] + _log :debug, 'Adapter: considering optimized backend...' + return _usable_adapter_class if _usable_adapter_class + _log :debug, 'Adapter: falling back to polling...' + _warn_polling_fallback(options) + Polling + rescue + _log :warn, format('Adapter: failed: %s:%s', $ERROR_POSITION.inspect, + $ERROR_POSITION * "\n") + raise + end + + private + + def _usable_adapter_class + OPTIMIZED_ADAPTERS.detect(&:usable?) + end + + def _warn_polling_fallback(options) + msg = options.fetch(:polling_fallback_message, POLLING_FALLBACK_MESSAGE) + Kernel.warn "[Listen warning]:\n #{msg}" if msg + end + + def _log(type, message) + Listen::Logger.send(type, message) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/base.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/base.rb new file mode 100644 index 0000000..e33349a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/base.rb @@ -0,0 +1,141 @@ +require 'listen/options' +require 'listen/record' +require 'listen/change' + +module Listen + module Adapter + class Base + attr_reader :options + + # TODO: only used by tests + DEFAULTS = {}.freeze + + attr_reader :config + + def initialize(config) + @started = false + @config = config + + @configured = nil + + fail 'No directories to watch!' if config.directories.empty? + + defaults = self.class.const_get('DEFAULTS') + @options = Listen::Options.new(config.adapter_options, defaults) + rescue + _log_exception 'adapter config failed: %s:%s called from: %s', caller + raise + end + + # TODO: it's a separate method as a temporary workaround for tests + def configure + if @configured + _log(:warn, 'Adapter already configured!') + return + end + + @configured = true + + @callbacks ||= {} + config.directories.each do |dir| + callback = @callbacks[dir] || lambda do |event| + _process_event(dir, event) + end + @callbacks[dir] = callback + _configure(dir, &callback) + end + + @snapshots ||= {} + # TODO: separate config per directory (some day maybe) + change_config = Change::Config.new(config.queue, config.silencer) + config.directories.each do |dir| + record = Record.new(dir) + snapshot = Change.new(change_config, record) + @snapshots[dir] = snapshot + end + end + + def started? + @started + end + + def start + configure + + if started? + _log(:warn, 'Adapter already started!') + return + end + + @started = true + + calling_stack = caller.dup + Listen::Internals::ThreadPool.add do + begin + @snapshots.values.each do |snapshot| + _timed('Record.build()') { snapshot.record.build } + end + _run + rescue + msg = 'run() in thread failed: %s:\n'\ + ' %s\n\ncalled from:\n %s' + _log_exception(msg, calling_stack) + raise # for unit tests mostly + end + end + end + + def stop + _stop + end + + def self.usable? + const_get('OS_REGEXP') =~ RbConfig::CONFIG['target_os'] + end + + private + + def _stop + end + + def _timed(title) + start = Time.now.to_f + yield + diff = Time.now.to_f - start + Listen::Logger.info format('%s: %.05f seconds', title, diff) + rescue + Listen::Logger.warn "#{title} crashed: #{$ERROR_INFO.inspect}" + raise + end + + # TODO: allow backend adapters to pass specific invalidation objects + # e.g. Darwin -> DirRescan, INotify -> MoveScan, etc. + def _queue_change(type, dir, rel_path, options) + @snapshots[dir].invalidate(type, rel_path, options) + end + + def _log(*args, &block) + self.class.send(:_log, *args, &block) + end + + def _log_exception(msg, caller_stack) + formatted = format( + msg, + $ERROR_INFO, + $ERROR_POSITION * "\n", + caller_stack * "\n" + ) + + _log(:error, formatted) + end + + class << self + private + + def _log(*args, &block) + Listen::Logger.send(*args, &block) + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/bsd.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/bsd.rb new file mode 100644 index 0000000..7db424f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/bsd.rb @@ -0,0 +1,106 @@ +# Listener implementation for BSD's `kqueue`. +# @see http://www.freebsd.org/cgi/man.cgi?query=kqueue +# @see https://github.com/mat813/rb-kqueue/blob/master/lib/rb-kqueue/queue.rb +# +module Listen + module Adapter + class BSD < Base + OS_REGEXP = /bsd|dragonfly/i + + DEFAULTS = { + events: [ + :delete, + :write, + :extend, + :attrib, + :rename + # :link, :revoke + ] + }.freeze + + BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '') + Please add the following to your Gemfile to avoid polling for changes: + require 'rbconfig' + if RbConfig::CONFIG['target_os'] =~ /#{OS_REGEXP}/ + gem 'rb-kqueue', '>= 0.2' + end + EOS + + def self.usable? + return false unless super + require 'rb-kqueue' + require 'find' + true + rescue LoadError + Kernel.warn BUNDLER_DECLARE_GEM + false + end + + private + + def _configure(directory, &callback) + @worker ||= KQueue::Queue.new + @callback = callback + # use Record to make a snapshot of dir, so we + # can detect new files + _find(directory.to_s) { |path| _watch_file(path, @worker) } + end + + def _run + @worker.run + end + + def _process_event(dir, event) + full_path = _event_path(event) + if full_path.directory? + # Force dir content tracking to kick in, or we won't have + # names of added files + _queue_change(:dir, dir, '.', recursive: true) + elsif full_path.exist? + path = full_path.relative_path_from(dir) + _queue_change(:file, dir, path.to_s, change: _change(event.flags)) + end + + # If it is a directory, and it has a write flag, it means a + # file has been added so find out which and deal with it. + # No need to check for removed files, kqueue will forget them + # when the vfs does. + _watch_for_new_file(event) if full_path.directory? + end + + def _change(event_flags) + { modified: [:attrib, :extend], + added: [:write], + removed: [:rename, :delete] + }.each do |change, flags| + return change unless (flags & event_flags).empty? + end + nil + end + + def _event_path(event) + Pathname.new(event.watcher.path) + end + + def _watch_for_new_file(event) + queue = event.watcher.queue + _find(_event_path(event).to_s) do |file_path| + unless queue.watchers.detect { |_, v| v.path == file_path.to_s } + _watch_file(file_path, queue) + end + end + end + + def _watch_file(path, queue) + queue.watch_file(path, *options.events, &@callback) + rescue Errno::ENOENT => e + _log :warn, "kqueue: watch file failed: #{e.message}" + end + + # Quick rubocop workaround + def _find(*paths, &block) + Find.send(:find, *paths, &block) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/config.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/config.rb new file mode 100644 index 0000000..fbd60e0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/config.rb @@ -0,0 +1,26 @@ +require 'pathname' + +module Listen + module Adapter + class Config + attr_reader :directories + attr_reader :silencer + attr_reader :queue + attr_reader :adapter_options + + def initialize(directories, queue, silencer, adapter_options) + # Default to current directory if no directories are supplied + directories = [Dir.pwd] if directories.to_a.empty? + + # TODO: fix (flatten, array, compact?) + @directories = directories.map do |directory| + Pathname.new(directory.to_s).realpath + end + + @silencer = silencer + @queue = queue + @adapter_options = adapter_options + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/darwin.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/darwin.rb new file mode 100644 index 0000000..d65779f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/darwin.rb @@ -0,0 +1,92 @@ +require 'thread' +require 'listen/internals/thread_pool' + +module Listen + module Adapter + # Adapter implementation for Mac OS X `FSEvents`. + # + class Darwin < Base + OS_REGEXP = /darwin(?1\d+)/i + + # The default delay between checking for changes. + DEFAULTS = { latency: 0.1 }.freeze + + INCOMPATIBLE_GEM_VERSION = <<-EOS.gsub(/^ {8}/, '') + rb-fsevent > 0.9.4 no longer supports OS X 10.6 through 10.8. + + Please add the following to your Gemfile to avoid polling for changes: + require 'rbconfig' + if RbConfig::CONFIG['target_os'] =~ /darwin(1[0-3])/i + gem 'rb-fsevent', '<= 0.9.4' + end + EOS + + def self.usable? + require 'rb-fsevent' + version = RbConfig::CONFIG['target_os'][OS_REGEXP, :major_version] + return false unless version + return true if version.to_i >= 13 # darwin13 is OS X 10.9 + + fsevent_version = Gem::Version.new(FSEvent::VERSION) + return true if fsevent_version <= Gem::Version.new('0.9.4') + Kernel.warn INCOMPATIBLE_GEM_VERSION + false + end + + private + + # NOTE: each directory gets a DIFFERENT callback! + def _configure(dir, &callback) + opts = { latency: options.latency } + + @workers ||= ::Queue.new + @workers << FSEvent.new.tap do |worker| + _log :debug, "fsevent: watching: #{dir.to_s.inspect}" + worker.watch(dir.to_s, opts, &callback) + end + end + + def _run + first = @workers.pop + + # NOTE: _run is called within a thread, so run every other + # worker in it's own thread + _run_workers_in_background(_to_array(@workers)) + _run_worker(first) + end + + def _process_event(dir, event) + _log :debug, "fsevent: processing event: #{event.inspect}" + event.each do |path| + new_path = Pathname.new(path.sub(%r{\/$}, '')) + _log :debug, "fsevent: #{new_path}" + # TODO: does this preserve symlinks? + rel_path = new_path.relative_path_from(dir).to_s + _queue_change(:dir, dir, rel_path, recursive: true) + end + end + + def _run_worker(worker) + _log :debug, "fsevent: running worker: #{worker.inspect}" + worker.run + rescue + format_string = 'fsevent: running worker failed: %s:%s called from: %s' + _log_exception format_string, caller + end + + def _run_workers_in_background(workers) + workers.each do |worker| + # NOTE: while passing local variables to the block below is not + # thread safe, using 'worker' from the enumerator above is ok + Listen::Internals::ThreadPool.add { _run_worker(worker) } + end + end + + def _to_array(queue) + workers = [] + workers << queue.pop until queue.empty? + workers + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/linux.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/linux.rb new file mode 100644 index 0000000..c1ddf73 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/linux.rb @@ -0,0 +1,106 @@ +module Listen + module Adapter + # @see https://github.com/nex3/rb-inotify + class Linux < Base + OS_REGEXP = /linux/i + + DEFAULTS = { + events: [ + :recursive, + :attrib, + :create, + :delete, + :move, + :close_write + ], + wait_for_delay: 0.1 + }.freeze + + private + + WIKI_URL = 'https://github.com/guard/listen'\ + '/wiki/Increasing-the-amount-of-inotify-watchers'.freeze + + INOTIFY_LIMIT_MESSAGE = <<-EOS.gsub(/^\s*/, '') + FATAL: Listen error: unable to monitor directories for changes. + Visit #{WIKI_URL} for info on how to fix this. + EOS + + def _configure(directory, &callback) + require 'rb-inotify' + @worker ||= ::INotify::Notifier.new + @worker.watch(directory.to_s, *options.events, &callback) + rescue Errno::ENOSPC + abort(INOTIFY_LIMIT_MESSAGE) + end + + def _run + Thread.current[:listen_blocking_read_thread] = true + @worker.run + Thread.current[:listen_blocking_read_thread] = false + end + + def _process_event(dir, event) + # NOTE: avoid using event.absolute_name since new API + # will need to have a custom recursion implemented + # to properly match events to configured directories + path = Pathname.new(event.watcher.path) + event.name + rel_path = path.relative_path_from(dir).to_s + + _log(:debug) { "inotify: #{rel_path} (#{event.flags.inspect})" } + + if /1|true/ =~ ENV['LISTEN_GEM_SIMULATE_FSEVENT'] + if (event.flags & [:moved_to, :moved_from]) || _dir_event?(event) + rel_path = path.dirname.relative_path_from(dir).to_s + end + _queue_change(:dir, dir, rel_path, {}) + return + end + + return if _skip_event?(event) + + cookie_params = event.cookie.zero? ? {} : { cookie: event.cookie } + + # Note: don't pass options to force rescanning the directory, so we can + # detect moving/deleting a whole tree + if _dir_event?(event) + _queue_change(:dir, dir, rel_path, cookie_params) + return + end + + params = cookie_params.merge(change: _change(event.flags)) + + _queue_change(:file, dir, rel_path, params) + end + + def _skip_event?(event) + # Event on root directory + return true if event.name == '' + # INotify reports changes to files inside directories as events + # on the directories themselves too. + # + # @see http://linux.die.net/man/7/inotify + _dir_event?(event) && (event.flags & [:close, :modify]).any? + end + + def _change(event_flags) + { modified: [:attrib, :close_write], + moved_to: [:moved_to], + moved_from: [:moved_from], + added: [:create], + removed: [:delete] }.each do |change, flags| + return change unless (flags & event_flags).empty? + end + nil + end + + def _dir_event?(event) + event.flags.include?(:isdir) + end + + def _stop + @worker && @worker.close + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/polling.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/polling.rb new file mode 100644 index 0000000..486eafe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/polling.rb @@ -0,0 +1,37 @@ +module Listen + module Adapter + # Polling Adapter that works cross-platform and + # has no dependencies. This is the adapter that + # uses the most CPU processing power and has higher + # file IO than the other implementations. + # + class Polling < Base + OS_REGEXP = // # match every OS + + DEFAULTS = { latency: 1.0, wait_for_delay: 0.05 }.freeze + + private + + def _configure(_, &callback) + @polling_callbacks ||= [] + @polling_callbacks << callback + end + + def _run + loop do + start = Time.now.to_f + @polling_callbacks.each do |callback| + callback.call(nil) + nap_time = options.latency - (Time.now.to_f - start) + # TODO: warn if nap_time is negative (polling too slow) + sleep(nap_time) if nap_time > 0 + end + end + end + + def _process_event(dir, _) + _queue_change(:dir, dir, '.', recursive: true) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/windows.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/windows.rb new file mode 100644 index 0000000..35dcca7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/windows.rb @@ -0,0 +1,98 @@ +module Listen + module Adapter + # Adapter implementation for Windows `wdm`. + # + class Windows < Base + OS_REGEXP = /mswin|mingw|cygwin/i + + BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '') + Please add the following to your Gemfile to avoid polling for changes: + gem 'wdm', '>= 0.1.0' if Gem.win_platform? + EOS + + def self.usable? + return false unless super + require 'wdm' + true + rescue LoadError + _log :debug, format('wdm - load failed: %s:%s', $ERROR_INFO, + $ERROR_POSITION * "\n") + + Kernel.warn BUNDLER_DECLARE_GEM + false + end + + private + + def _configure(dir) + require 'wdm' + _log :debug, 'wdm - starting...' + @worker ||= WDM::Monitor.new + @worker.watch_recursively(dir.to_s, :files) do |change| + yield([:file, change]) + end + + @worker.watch_recursively(dir.to_s, :directories) do |change| + yield([:dir, change]) + end + + events = [:attributes, :last_write] + @worker.watch_recursively(dir.to_s, *events) do |change| + yield([:attr, change]) + end + end + + def _run + @worker.run! + end + + def _process_event(dir, event) + _log :debug, "wdm - callback: #{event.inspect}" + + type, change = event + + full_path = Pathname(change.path) + + rel_path = full_path.relative_path_from(dir).to_s + + options = { change: _change(change.type) } + + case type + when :file + _queue_change(:file, dir, rel_path, options) + when :attr + unless full_path.directory? + _queue_change(:file, dir, rel_path, options) + end + when :dir + if change.type == :removed + # TODO: check if watched dir? + _queue_change(:dir, dir, Pathname(rel_path).dirname.to_s, {}) + elsif change.type == :added + _queue_change(:dir, dir, rel_path, {}) + # do nothing - changed directory means either: + # - removed subdirs (handled above) + # - added subdirs (handled above) + # - removed files (handled by _file_callback) + # - added files (handled by _file_callback) + # so what's left? + end + end + rescue + details = event.inspect + _log :error, format('wdm - callback (%s): %s:%s', details, $ERROR_INFO, + $ERROR_POSITION * "\n") + raise + end + + def _change(type) + { modified: [:modified, :attrib], # TODO: is attrib really passed? + added: [:added, :renamed_new_file], + removed: [:removed, :renamed_old_file] }.each do |change, types| + return change if types.include?(type) + end + nil + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/backend.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/backend.rb new file mode 100644 index 0000000..ff25495 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/backend.rb @@ -0,0 +1,38 @@ +require 'listen/adapter' +require 'listen/adapter/base' +require 'listen/adapter/config' + +require 'forwardable' + +# This class just aggregates configuration object to avoid Listener specs +# from exploding with huge test setup blocks +module Listen + class Backend + extend Forwardable + + def initialize(directories, queue, silencer, config) + adapter_select_opts = config.adapter_select_options + + adapter_class = Adapter.select(adapter_select_opts) + + # Use default from adapter if possible + @min_delay_between_events = config.min_delay_between_events + @min_delay_between_events ||= adapter_class::DEFAULTS[:wait_for_delay] + @min_delay_between_events ||= 0.1 + + adapter_opts = config.adapter_instance_options(adapter_class) + + aconfig = Adapter::Config.new(directories, queue, silencer, adapter_opts) + @adapter = adapter_class.new(aconfig) + end + + delegate start: :adapter + delegate stop: :adapter + + attr_reader :min_delay_between_events + + private + + attr_reader :adapter + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/change.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/change.rb new file mode 100644 index 0000000..3d49c79 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/change.rb @@ -0,0 +1,76 @@ +require 'listen/file' +require 'listen/directory' + +module Listen + # TODO: rename to Snapshot + class Change + # TODO: test this class for coverage + class Config + def initialize(queue, silencer) + @queue = queue + @silencer = silencer + end + + def silenced?(path, type) + @silencer.silenced?(Pathname(path), type) + end + + def queue(*args) + @queue << args + end + end + + attr_reader :record + + def initialize(config, record) + @config = config + @record = record + end + + # Invalidate some part of the snapshot/record (dir, file, subtree, etc.) + def invalidate(type, rel_path, options) + watched_dir = Pathname.new(record.root) + + change = options[:change] + cookie = options[:cookie] + + if !cookie && config.silenced?(rel_path, type) + Listen::Logger.debug { "(silenced): #{rel_path.inspect}" } + return + end + + path = watched_dir + rel_path + + Listen::Logger.debug do + log_details = options[:silence] && 'recording' || change || 'unknown' + "#{log_details}: #{type}:#{path} (#{options.inspect})" + end + + if change + options = cookie ? { cookie: cookie } : {} + config.queue(type, change, watched_dir, rel_path, options) + elsif type == :dir + # NOTE: POSSIBLE RECURSION + # TODO: fix - use a queue instead + Directory.scan(self, rel_path, options) + else + change = File.change(record, rel_path) + return if !change || options[:silence] + config.queue(:file, change, watched_dir, rel_path) + end + rescue RuntimeError => ex + msg = format( + '%s#%s crashed %s:%s', + self.class, + __method__, + exinspect, + ex.backtrace * "\n") + Listen::Logger.error(msg) + raise + end + + private + + attr_reader :config + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/cli.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/cli.rb new file mode 100644 index 0000000..851f063 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/cli.rb @@ -0,0 +1,65 @@ +require 'thor' +require 'listen' +require 'logger' + +module Listen + class CLI < Thor + default_task :start + + desc 'start', 'Starts Listen' + + class_option :verbose, + type: :boolean, + default: false, + aliases: '-v', + banner: 'Verbose' + + class_option :directory, + type: :array, + default: '.', + aliases: '-d', + banner: 'The directory to listen to' + + class_option :relative, + type: :boolean, + default: false, + aliases: '-r', + banner: 'Convert paths relative to current directory' + + def start + Listen::Forwarder.new(options).start + end + end + + class Forwarder + attr_reader :logger + def initialize(options) + @options = options + @logger = ::Logger.new(STDOUT) + @logger.level = ::Logger::INFO + @logger.formatter = proc { |_, _, _, msg| "#{msg}\n" } + end + + def start + logger.info 'Starting listen...' + directory = @options[:directory] + relative = @options[:relative] + callback = proc do |modified, added, removed| + if @options[:verbose] + logger.info "+ #{added}" unless added.empty? + logger.info "- #{removed}" unless removed.empty? + logger.info "> #{modified}" unless modified.empty? + end + end + + listener = Listen.to( + directory, + relative: relative, + &callback) + + listener.start + + sleep 0.5 while listener.processing? + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/directory.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/directory.rb new file mode 100644 index 0000000..873a722 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/directory.rb @@ -0,0 +1,87 @@ +require 'set' + +module Listen + # TODO: refactor (turn it into a normal object, cache the stat, etc) + class Directory + def self.scan(snapshot, rel_path, options) + record = snapshot.record + dir = Pathname.new(record.root) + previous = record.dir_entries(rel_path) + + record.add_dir(rel_path) + + # TODO: use children(with_directory: false) + path = dir + rel_path + current = Set.new(_children(path)) + + Listen::Logger.debug do + format('%s: %s(%s): %s -> %s', + (options[:silence] ? 'Recording' : 'Scanning'), + rel_path, options.inspect, previous.inspect, current.inspect) + end + + begin + current.each do |full_path| + type = ::File.lstat(full_path.to_s).directory? ? :dir : :file + item_rel_path = full_path.relative_path_from(dir).to_s + _change(snapshot, type, item_rel_path, options) + end + rescue Errno::ENOENT + # The directory changed meanwhile, so rescan it + current = Set.new(_children(path)) + retry + end + + # TODO: this is not tested properly + previous = previous.reject { |entry, _| current.include? path + entry } + + _async_changes(snapshot, Pathname.new(rel_path), previous, options) + + rescue Errno::ENOENT, Errno::EHOSTDOWN + record.unset_path(rel_path) + _async_changes(snapshot, Pathname.new(rel_path), previous, options) + + rescue Errno::ENOTDIR + # TODO: path not tested + record.unset_path(rel_path) + _async_changes(snapshot, path, previous, options) + _change(snapshot, :file, rel_path, options) + rescue + Listen::Logger.warn do + format('scan DIED: %s:%s', $ERROR_INFO, $ERROR_POSITION * "\n") + end + raise + end + + def self._async_changes(snapshot, path, previous, options) + fail "Not a Pathname: #{path.inspect}" unless path.respond_to?(:children) + previous.each do |entry, data| + # TODO: this is a hack with insufficient testing + type = data.key?(:mtime) ? :file : :dir + rel_path_s = (path + entry).to_s + _change(snapshot, type, rel_path_s, options) + end + end + + def self._change(snapshot, type, path, options) + return snapshot.invalidate(type, path, options) if type == :dir + + # Minor param cleanup for tests + # TODO: use a dedicated Event class + opts = options.dup + opts.delete(:recursive) + snapshot.invalidate(type, path, opts) + end + + def self._children(path) + return path.children unless RUBY_ENGINE == 'jruby' + + # JRuby inconsistency workaround, see: + # https://github.com/jruby/jruby/issues/3840 + exists = path.exist? + directory = path.directory? + return path.children unless exists && !directory + raise Errno::ENOTDIR, path.to_s + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/config.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/config.rb new file mode 100644 index 0000000..d49a8f2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/config.rb @@ -0,0 +1,55 @@ +module Listen + module Event + class Config + def initialize( + listener, + event_queue, + queue_optimizer, + wait_for_delay, + &block) + + @listener = listener + @event_queue = event_queue + @queue_optimizer = queue_optimizer + @min_delay_between_events = wait_for_delay + @block = block + end + + def sleep(*args) + Kernel.sleep(*args) + end + + def call(*args) + @block.call(*args) if @block + end + + def timestamp + Time.now.to_f + end + + attr_reader :event_queue + + def callable? + @block + end + + def optimize_changes(changes) + @queue_optimizer.smoosh_changes(changes) + end + + attr_reader :min_delay_between_events + + def stopped? + listener.state == :stopped + end + + def paused? + listener.state == :paused + end + + private + + attr_reader :listener + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/loop.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/loop.rb new file mode 100644 index 0000000..008dbfb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/loop.rb @@ -0,0 +1,117 @@ +require 'thread' + +require 'timeout' +require 'listen/event/processor' + +module Listen + module Event + class Loop + class Error < RuntimeError + class NotStarted < Error + end + end + + def initialize(config) + @config = config + @wait_thread = nil + @state = :paused + @reasons = ::Queue.new + end + + def wakeup_on_event + return if stopped? + return unless processing? + return unless wait_thread.alive? + _wakeup(:event) + end + + def paused? + wait_thread && state == :paused + end + + def processing? + return false if stopped? + return false if paused? + state == :processing + end + + def setup + # TODO: use a Fiber instead? + q = ::Queue.new + @wait_thread = Internals::ThreadPool.add do + _wait_for_changes(q, config) + end + + Listen::Logger.debug('Waiting for processing to start...') + Timeout.timeout(5) { q.pop } + end + + def resume + fail Error::NotStarted if stopped? + return unless wait_thread + _wakeup(:resume) + end + + def pause + # TODO: works? + # fail NotImplementedError + end + + def teardown + return unless wait_thread + if wait_thread.alive? + _wakeup(:teardown) + wait_thread.join + end + @wait_thread = nil + end + + def stopped? + !wait_thread + end + + private + + attr_reader :config + attr_reader :wait_thread + + attr_accessor :state + + def _wait_for_changes(ready_queue, config) + processor = Event::Processor.new(config, @reasons) + + _wait_until_resumed(ready_queue) + processor.loop_for(config.min_delay_between_events) + rescue StandardError => ex + _nice_error(ex) + end + + def _sleep(*args) + Kernel.sleep(*args) + end + + def _wait_until_resumed(ready_queue) + self.state = :paused + ready_queue << :ready + sleep + self.state = :processing + end + + def _nice_error(ex) + indent = "\n -- " + msg = format( + 'exception while processing events: %s Backtrace:%s%s', + ex, + indent, + ex.backtrace * indent + ) + Listen::Logger.error(msg) + end + + def _wakeup(reason) + @reasons << reason + wait_thread.wakeup + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/processor.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/processor.rb new file mode 100644 index 0000000..ab492e7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/processor.rb @@ -0,0 +1,122 @@ +module Listen + module Event + class Processor + def initialize(config, reasons) + @config = config + @reasons = reasons + _reset_no_unprocessed_events + end + + # TODO: implement this properly instead of checking the state at arbitrary + # points in time + def loop_for(latency) + @latency = latency + + loop do + _wait_until_events + _wait_until_events_calm_down + _wait_until_no_longer_paused + _process_changes + end + rescue Stopped + Listen::Logger.debug('Processing stopped') + end + + private + + class Stopped < RuntimeError + end + + def _wait_until_events_calm_down + loop do + now = _timestamp + + # Assure there's at least latency between callbacks to allow + # for accumulating changes + diff = _deadline - now + break if diff <= 0 + + # give events a bit of time to accumulate so they can be + # compressed/optimized + _sleep(:waiting_until_latency, diff) + end + end + + def _wait_until_no_longer_paused + # TODO: may not be a good idea? + _sleep(:waiting_for_unpause) while config.paused? + end + + def _check_stopped + return unless config.stopped? + + _flush_wakeup_reasons + raise Stopped + end + + def _sleep(_local_reason, *args) + _check_stopped + sleep_duration = config.sleep(*args) + _check_stopped + + _flush_wakeup_reasons do |reason| + next unless reason == :event + _remember_time_of_first_unprocessed_event unless config.paused? + end + + sleep_duration + end + + def _remember_time_of_first_unprocessed_event + @first_unprocessed_event_time ||= _timestamp + end + + def _reset_no_unprocessed_events + @first_unprocessed_event_time = nil + end + + def _deadline + @first_unprocessed_event_time + @latency + end + + def _wait_until_events + # TODO: long sleep may not be a good idea? + _sleep(:waiting_for_events) while config.event_queue.empty? + @first_unprocessed_event_time ||= _timestamp + end + + def _flush_wakeup_reasons + reasons = @reasons + until reasons.empty? + reason = reasons.pop + yield reason if block_given? + end + end + + def _timestamp + config.timestamp + end + + # for easier testing without sleep loop + def _process_changes + _reset_no_unprocessed_events + + changes = [] + changes << config.event_queue.pop until config.event_queue.empty? + + callable = config.callable? + return unless callable + + hash = config.optimize_changes(changes) + result = [hash[:modified], hash[:added], hash[:removed]] + return if result.all?(&:empty?) + + block_start = _timestamp + config.call(*result) + Listen::Logger.debug "Callback took #{_timestamp - block_start} sec" + end + + attr_reader :config + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/queue.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/queue.rb new file mode 100644 index 0000000..9daf175 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/queue.rb @@ -0,0 +1,55 @@ +require 'thread' + +require 'forwardable' + +module Listen + module Event + class Queue + extend Forwardable + + class Config + def initialize(relative) + @relative = relative + end + + def relative? + @relative + end + end + + def initialize(config, &block) + @event_queue = ::Queue.new + @block = block + @config = config + end + + def <<(args) + type, change, dir, path, options = *args + fail "Invalid type: #{type.inspect}" unless [:dir, :file].include? type + fail "Invalid change: #{change.inspect}" unless change.is_a?(Symbol) + fail "Invalid path: #{path.inspect}" unless path.is_a?(String) + + dir = _safe_relative_from_cwd(dir) + event_queue.public_send(:<<, [type, change, dir, path, options]) + + block.call(args) if block + end + + delegate empty?: :event_queue + delegate pop: :event_queue + + private + + attr_reader :event_queue + attr_reader :block + attr_reader :config + + def _safe_relative_from_cwd(dir) + return dir unless config.relative? + dir.relative_path_from(Pathname.pwd) + rescue ArgumentError + dir + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/file.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/file.rb new file mode 100644 index 0000000..32fc6c3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/file.rb @@ -0,0 +1,80 @@ +require 'digest/md5' + +module Listen + class File + def self.change(record, rel_path) + path = Pathname.new(record.root) + rel_path + lstat = path.lstat + + data = { mtime: lstat.mtime.to_f, mode: lstat.mode } + + record_data = record.file_data(rel_path) + + if record_data.empty? + record.update_file(rel_path, data) + return :added + end + + if data[:mode] != record_data[:mode] + record.update_file(rel_path, data) + return :modified + end + + if data[:mtime] != record_data[:mtime] + record.update_file(rel_path, data) + return :modified + end + + return if /1|true/ =~ ENV['LISTEN_GEM_DISABLE_HASHING'] + return unless inaccurate_mac_time?(lstat) + + # Check if change happened within 1 second (maybe it's even + # too much, e.g. 0.3-0.5 could be sufficient). + # + # With rb-fsevent, there's a (configurable) latency between + # when file was changed and when the event was triggered. + # + # If a file is saved at ???14.998, by the time the event is + # actually received by Listen, the time could already be e.g. + # ???15.7. + # + # And since Darwin adapter uses directory scanning, the file + # mtime may be the same (e.g. file was changed at ???14.001, + # then at ???14.998, but the fstat time would be ???14.0 in + # both cases). + # + # If change happend at ???14.999997, the mtime is 14.0, so for + # an mtime=???14.0 we assume it could even be almost ???15.0 + # + # So if Time.now.to_f is ???15.999998 and stat reports mtime + # at ???14.0, then event was due to that file'd change when: + # + # ???15.999997 - ???14.999998 < 1.0s + # + # So the "2" is "1 + 1" (1s to cover rb-fsevent latency + + # 1s maximum difference between real mtime and that recorded + # in the file system) + # + return if data[:mtime].to_i + 2 <= Time.now.to_f + + md5 = Digest::MD5.file(path).digest + record.update_file(rel_path, data.merge(md5: md5)) + :modified if record_data[:md5] && md5 != record_data[:md5] + rescue SystemCallError + record.unset_path(rel_path) + :removed + rescue + Listen::Logger.debug "lstat failed for: #{rel_path} (#{$ERROR_INFO})" + raise + end + + def self.inaccurate_mac_time?(stat) + # 'mac' means Modified/Accessed/Created + + # Since precision depends on mounted FS (e.g. you can have a FAT partiion + # mounted on Linux), check for fields with a remainder to detect this + + [stat.mtime, stat.ctime, stat.atime].map(&:usec).all?(&:zero?) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/fsm.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/fsm.rb new file mode 100644 index 0000000..882cc00 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/fsm.rb @@ -0,0 +1,132 @@ +# Code copied from https://github.com/celluloid/celluloid-fsm +module Listen + module FSM + DEFAULT_STATE = :default # Default state name unless one is explicitly set + + # Included hook to extend class methods + def self.included(klass) + klass.send :extend, ClassMethods + end + + module ClassMethods + # Obtain or set the default state + # Passing a state name sets the default state + def default_state(new_default = nil) + if new_default + @default_state = new_default.to_sym + else + defined?(@default_state) ? @default_state : DEFAULT_STATE + end + end + + # Obtain the valid states for this FSM + def states + @states ||= {} + end + + # Declare an FSM state and optionally provide a callback block to fire + # Options: + # * to: a state or array of states this state can transition to + def state(*args, &block) + if args.last.is_a? Hash + # Stringify keys :/ + options = args.pop.each_with_object({}) { |(k, v), h| h[k.to_s] = v } + else + options = {} + end + + args.each do |name| + name = name.to_sym + default_state name if options['default'] + states[name] = State.new(name, options['to'], &block) + end + end + end + + # Be kind and call super if you must redefine initialize + def initialize + @state = self.class.default_state + end + + # Obtain the current state of the FSM + attr_reader :state + + def transition(state_name) + new_state = validate_and_sanitize_new_state(state_name) + return unless new_state + transition_with_callbacks!(new_state) + end + + # Immediate state transition with no checks, or callbacks. "Dangerous!" + def transition!(state_name) + @state = state_name + end + + protected + + def validate_and_sanitize_new_state(state_name) + state_name = state_name.to_sym + + return if current_state_name == state_name + + if current_state && !current_state.valid_transition?(state_name) + valid = current_state.transitions.map(&:to_s).join(', ') + msg = "#{self.class} can't change state from '#{@state}'"\ + " to '#{state_name}', only to: #{valid}" + fail ArgumentError, msg + end + + new_state = states[state_name] + + unless new_state + return if state_name == default_state + fail ArgumentError, "invalid state for #{self.class}: #{state_name}" + end + + new_state + end + + def transition_with_callbacks!(state_name) + transition! state_name.name + state_name.call(self) + end + + def states + self.class.states + end + + def default_state + self.class.default_state + end + + def current_state + states[@state] + end + + def current_state_name + current_state && current_state.name || '' + end + + class State + attr_reader :name, :transitions + + def initialize(name, transitions = nil, &block) + @name = name + @block = block + @transitions = nil + @transitions = Array(transitions).map(&:to_sym) if transitions + end + + def call(obj) + obj.instance_eval(&@block) if @block + end + + def valid_transition?(new_state) + # All transitions are allowed unless expressly + return true unless @transitions + + @transitions.include? new_state.to_sym + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/internals/thread_pool.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/internals/thread_pool.rb new file mode 100644 index 0000000..e112d90 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/internals/thread_pool.rb @@ -0,0 +1,29 @@ +module Listen + # @private api + module Internals + module ThreadPool + def self.add(&block) + Thread.new { block.call }.tap do |th| + (@threads ||= Queue.new) << th + end + end + + def self.stop + return unless @threads ||= nil + return if @threads.empty? # return to avoid using possibly stubbed Queue + + killed = Queue.new + # You can't kill a read on a descriptor in JRuby, so let's just + # ignore running threads (listen rb-inotify waiting for disk activity + # before closing) pray threads die faster than they are created... + limit = RUBY_ENGINE == 'jruby' ? [1] : [] + + killed << @threads.pop.kill until @threads.empty? + until killed.empty? + th = killed.pop + th.join(*limit) unless th[:listen_blocking_read_thread] + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener.rb new file mode 100644 index 0000000..e0fe656 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener.rb @@ -0,0 +1,133 @@ +require 'English' + +require 'listen/version' + +require 'listen/backend' + +require 'listen/silencer' +require 'listen/silencer/controller' + +require 'listen/queue_optimizer' + +require 'listen/fsm' + +require 'listen/event/loop' +require 'listen/event/queue' +require 'listen/event/config' + +require 'listen/listener/config' + +module Listen + class Listener + # TODO: move the state machine's methods private + include Listen::FSM + + # Initializes the directories listener. + # + # @param [String] directory the directories to listen to + # @param [Hash] options the listen options (see Listen::Listener::Options) + # + # @yield [modified, added, removed] the changed files + # @yieldparam [Array] modified the list of modified files + # @yieldparam [Array] added the list of added files + # @yieldparam [Array] removed the list of removed files + # + def initialize(*dirs, &block) + options = dirs.last.is_a?(Hash) ? dirs.pop : {} + + @config = Config.new(options) + + eq_config = Event::Queue::Config.new(@config.relative?) + queue = Event::Queue.new(eq_config) { @processor.wakeup_on_event } + + silencer = Silencer.new + rules = @config.silencer_rules + @silencer_controller = Silencer::Controller.new(silencer, rules) + + @backend = Backend.new(dirs, queue, silencer, @config) + + optimizer_config = QueueOptimizer::Config.new(@backend, silencer) + + pconfig = Event::Config.new( + self, + queue, + QueueOptimizer.new(optimizer_config), + @backend.min_delay_between_events, + &block) + + @processor = Event::Loop.new(pconfig) + + super() # FSM + end + + default_state :initializing + + state :initializing, to: [:backend_started, :stopped] + + state :backend_started, to: [:frontend_ready, :stopped] do + backend.start + end + + state :frontend_ready, to: [:processing_events, :stopped] do + processor.setup + end + + state :processing_events, to: [:paused, :stopped] do + processor.resume + end + + state :paused, to: [:processing_events, :stopped] do + processor.pause + end + + state :stopped, to: [:backend_started] do + backend.stop # should be before processor.teardown to halt events ASAP + processor.teardown + end + + # Starts processing events and starts adapters + # or resumes invoking callbacks if paused + def start + transition :backend_started if state == :initializing + transition :frontend_ready if state == :backend_started + transition :processing_events if state == :frontend_ready + transition :processing_events if state == :paused + end + + # Stops both listening for events and processing them + def stop + transition :stopped + end + + # Stops invoking callbacks (messages pile up) + def pause + transition :paused + end + + # processing means callbacks are called + def processing? + state == :processing_events + end + + def paused? + state == :paused + end + + def ignore(regexps) + @silencer_controller.append_ignores(regexps) + end + + def ignore!(regexps) + @silencer_controller.replace_with_bang_ignores(regexps) + end + + def only(regexps) + @silencer_controller.replace_with_only(regexps) + end + + private + + attr_reader :processor + attr_reader :backend + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener/config.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener/config.rb new file mode 100644 index 0000000..d135322 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener/config.rb @@ -0,0 +1,41 @@ +module Listen + class Listener + class Config + DEFAULTS = { + # Listener options + debug: false, # TODO: is this broken? + wait_for_delay: nil, # NOTE: should be provided by adapter if possible + relative: false, + + # Backend selecting options + force_polling: false, + polling_fallback_message: nil + }.freeze + + def initialize(opts) + @options = DEFAULTS.merge(opts) + @relative = @options[:relative] + @min_delay_between_events = @options[:wait_for_delay] + @silencer_rules = @options # silencer will extract what it needs + end + + def relative? + @relative + end + + attr_reader :min_delay_between_events + + attr_reader :silencer_rules + + def adapter_instance_options(klass) + valid_keys = klass.const_get('DEFAULTS').keys + Hash[@options.select { |key, _| valid_keys.include?(key) }] + end + + def adapter_select_options + valid_keys = %w(force_polling polling_fallback_message).map(&:to_sym) + Hash[@options.select { |key, _| valid_keys.include?(key) }] + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/logger.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/logger.rb new file mode 100644 index 0000000..b0e6333 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/logger.rb @@ -0,0 +1,32 @@ +module Listen + def self.logger + @logger ||= nil + end + + def self.logger=(logger) + @logger = logger + end + + def self.setup_default_logger_if_unset + self.logger ||= ::Logger.new(STDERR).tap do |logger| + debugging = ENV['LISTEN_GEM_DEBUGGING'] + logger.level = + case debugging.to_s + when /2/ + ::Logger::DEBUG + when /true|yes|1/i + ::Logger::INFO + else + ::Logger::ERROR + end + end + end + + class Logger + [:fatal, :error, :warn, :info, :debug].each do |meth| + define_singleton_method(meth) do |*args, &block| + Listen.logger.public_send(meth, *args, &block) if Listen.logger + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/options.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/options.rb new file mode 100644 index 0000000..7ae36a7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/options.rb @@ -0,0 +1,23 @@ +module Listen + class Options + def initialize(opts, defaults) + @options = {} + given_options = opts.dup + defaults.keys.each do |key| + @options[key] = given_options.delete(key) || defaults[key] + end + + return if given_options.empty? + + msg = "Unknown options: #{given_options.inspect}" + Listen::Logger.warn msg + fail msg + end + + def method_missing(name, *_) + return @options[name] if @options.key?(name) + msg = "Bad option: #{name.inspect} (valid:#{@options.keys.inspect})" + fail NameError, msg + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/queue_optimizer.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/queue_optimizer.rb new file mode 100644 index 0000000..752297a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/queue_optimizer.rb @@ -0,0 +1,132 @@ +module Listen + class QueueOptimizer + class Config + def initialize(adapter_class, silencer) + @adapter_class = adapter_class + @silencer = silencer + end + + def exist?(path) + Pathname(path).exist? + end + + def silenced?(path, type) + @silencer.silenced?(path, type) + end + + def debug(*args, &block) + Listen.logger.debug(*args, &block) + end + end + + def smoosh_changes(changes) + # TODO: adapter could be nil at this point (shutdown) + cookies = changes.group_by do |_, _, _, _, options| + (options || {})[:cookie] + end + _squash_changes(_reinterpret_related_changes(cookies)) + end + + def initialize(config) + @config = config + end + + private + + attr_reader :config + + # groups changes into the expected structure expected by + # clients + def _squash_changes(changes) + # We combine here for backward compatibility + # Newer clients should receive dir and path separately + changes = changes.map { |change, dir, path| [change, dir + path] } + + actions = changes.group_by(&:last).map do |path, action_list| + [_logical_action_for(path, action_list.map(&:first)), path.to_s] + end + + config.debug("listen: raw changes: #{actions.inspect}") + + { modified: [], added: [], removed: [] }.tap do |squashed| + actions.each do |type, path| + squashed[type] << path unless type.nil? + end + config.debug("listen: final changes: #{squashed.inspect}") + end + end + + def _logical_action_for(path, actions) + actions << :added if actions.delete(:moved_to) + actions << :removed if actions.delete(:moved_from) + + modified = actions.detect { |x| x == :modified } + _calculate_add_remove_difference(actions, path, modified) + end + + def _calculate_add_remove_difference(actions, path, default_if_exists) + added = actions.count { |x| x == :added } + removed = actions.count { |x| x == :removed } + diff = added - removed + + # TODO: avoid checking if path exists and instead assume the events are + # in order (if last is :removed, it doesn't exist, etc.) + if config.exist?(path) + if diff > 0 + :added + elsif diff.zero? && added > 0 + :modified + else + default_if_exists + end + else + diff < 0 ? :removed : nil + end + end + + # remove extraneous rb-inotify events, keeping them only if it's a possible + # editor rename() call (e.g. Kate and Sublime) + def _reinterpret_related_changes(cookies) + table = { moved_to: :added, moved_from: :removed } + cookies.flat_map do |_, changes| + data = _detect_possible_editor_save(changes) + if data + to_dir, to_file = data + [[:modified, to_dir, to_file]] + else + not_silenced = changes.reject do |type, _, _, path, _| + config.silenced?(Pathname(path), type) + end + not_silenced.map do |_, change, dir, path, _| + [table.fetch(change, change), dir, path] + end + end + end + end + + def _detect_possible_editor_save(changes) + return unless changes.size == 2 + + from_type = from_change = from = nil + to_type = to_change = to_dir = to = nil + + changes.each do |data| + case data[1] + when :moved_from + from_type, from_change, _, from, = data + when :moved_to + to_type, to_change, to_dir, to, = data + else + return nil + end + end + + return unless from && to + + # Expect an ignored moved_from and non-ignored moved_to + # to qualify as an "editor modify" + return unless config.silenced?(Pathname(from), from_type) + config.silenced?(Pathname(to), to_type) ? nil : [to_dir, to] + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record.rb new file mode 100644 index 0000000..ad374ce --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record.rb @@ -0,0 +1,118 @@ +require 'thread' +require 'listen/record/entry' +require 'listen/record/symlink_detector' + +module Listen + class Record + # TODO: one Record object per watched directory? + # TODO: deprecate + + attr_reader :root + def initialize(directory) + @tree = _auto_hash + @root = directory.to_s + end + + def add_dir(rel_path) + return if [nil, '', '.'].include? rel_path + @tree[rel_path] ||= {} + end + + def update_file(rel_path, data) + dirname, basename = Pathname(rel_path).split.map(&:to_s) + _fast_update_file(dirname, basename, data) + end + + def unset_path(rel_path) + dirname, basename = Pathname(rel_path).split.map(&:to_s) + _fast_unset_path(dirname, basename) + end + + def file_data(rel_path) + dirname, basename = Pathname(rel_path).split.map(&:to_s) + if [nil, '', '.'].include? dirname + tree[basename] ||= {} + tree[basename].dup + else + tree[dirname] ||= {} + tree[dirname][basename] ||= {} + tree[dirname][basename].dup + end + end + + def dir_entries(rel_path) + subtree = + if [nil, '', '.'].include? rel_path.to_s + tree + else + tree[rel_path.to_s] ||= _auto_hash + tree[rel_path.to_s] + end + + result = {} + subtree.each do |key, values| + # only get data for file entries + result[key] = values.key?(:mtime) ? values : {} + end + result + end + + def build + @tree = _auto_hash + # TODO: test with a file name given + # TODO: test other permissions + # TODO: test with mixed encoding + symlink_detector = SymlinkDetector.new + remaining = ::Queue.new + remaining << Entry.new(root, nil, nil) + _fast_build_dir(remaining, symlink_detector) until remaining.empty? + end + + private + + def _auto_hash + Hash.new { |h, k| h[k] = Hash.new } + end + + attr_reader :tree + + def _fast_update_file(dirname, basename, data) + if [nil, '', '.'].include? dirname + tree[basename] = (tree[basename] || {}).merge(data) + else + tree[dirname] ||= {} + tree[dirname][basename] = (tree[dirname][basename] || {}).merge(data) + end + end + + def _fast_unset_path(dirname, basename) + # this may need to be reworked to properly remove + # entries from a tree, without adding non-existing dirs to the record + if [nil, '', '.'].include? dirname + return unless tree.key?(basename) + tree.delete(basename) + else + return unless tree.key?(dirname) + tree[dirname].delete(basename) + end + end + + def _fast_build_dir(remaining, symlink_detector) + entry = remaining.pop + children = entry.children # NOTE: children() implicitly tests if dir + symlink_detector.verify_unwatched!(entry) + children.each { |child| remaining << child } + add_dir(entry.record_dir_key) + rescue Errno::ENOTDIR + _fast_try_file(entry) + rescue SystemCallError, SymlinkDetector::Error + _fast_unset_path(entry.relative, entry.name) + end + + def _fast_try_file(entry) + _fast_update_file(entry.relative, entry.name, entry.meta) + rescue SystemCallError + _fast_unset_path(entry.relative, entry.name) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/entry.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/entry.rb new file mode 100644 index 0000000..759be61 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/entry.rb @@ -0,0 +1,64 @@ +module Listen + # @private api + class Record + # Represents a directory entry (dir or file) + class Entry + # file: "/home/me/watched_dir", "app/models", "foo.rb" + # dir, "/home/me/watched_dir", "." + def initialize(root, relative, name = nil) + @root = root + @relative = relative + @name = name + end + + attr_reader :root, :relative, :name + + def children + child_relative = _join + (_entries(sys_path) - %w(. ..)).map do |name| + Entry.new(@root, child_relative, name) + end + end + + def meta + lstat = ::File.lstat(sys_path) + { mtime: lstat.mtime.to_f, mode: lstat.mode } + end + + # record hash is e.g. + # if @record["/home/me/watched_dir"]["project/app/models"]["foo.rb"] + # if @record["/home/me/watched_dir"]["project/app"]["models"] + # record_dir_key is "project/app/models" + def record_dir_key + ::File.join(*[@relative, @name].compact) + end + + def sys_path + # Use full path in case someone uses chdir + ::File.join(*[@root, @relative, @name].compact) + end + + def real_path + @real_path ||= ::File.realpath(sys_path) + end + + private + + def _join + args = [@relative, @name].compact + args.empty? ? nil : ::File.join(*args) + end + + def _entries(dir) + return Dir.entries(dir) unless RUBY_ENGINE == 'jruby' + + # JRuby inconsistency workaround, see: + # https://github.com/jruby/jruby/issues/3840 + exists = ::File.exist?(dir) + directory = ::File.directory?(dir) + return Dir.entries(dir) unless exists && !directory + raise Errno::ENOTDIR, dir + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/symlink_detector.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/symlink_detector.rb new file mode 100644 index 0000000..5884092 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/symlink_detector.rb @@ -0,0 +1,39 @@ +require 'set' + +module Listen + # @private api + class Record + class SymlinkDetector + WIKI = 'https://github.com/guard/listen/wiki/Duplicate-directory-errors'.freeze + + SYMLINK_LOOP_ERROR = <<-EOS.freeze + ** ERROR: directory is already being watched! ** + + Directory: %s + + is already being watched through: %s + + MORE INFO: #{WIKI} + EOS + + class Error < RuntimeError + end + + def initialize + @real_dirs = Set.new + end + + def verify_unwatched!(entry) + real_path = entry.real_path + @real_dirs.add?(real_path) || _fail(entry.sys_path, real_path) + end + + private + + def _fail(symlinked, real_path) + STDERR.puts format(SYMLINK_LOOP_ERROR, symlinked, real_path) + fail Error, 'Failed due to looped symlinks' + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer.rb new file mode 100644 index 0000000..4addd34 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer.rb @@ -0,0 +1,97 @@ +module Listen + class Silencer + # The default list of directories that get ignored. + DEFAULT_IGNORED_DIRECTORIES = %r{^(?: + \.git + | \.svn + | \.hg + | \.rbx + | \.bundle + | bundle + | vendor/bundle + | log + | tmp + |vendor/ruby + )(/|$)}x + + # The default list of files that get ignored. + DEFAULT_IGNORED_EXTENSIONS = %r{(?: + # Kate's tmp\/swp files + \..*\d+\.new + | \.kate-swp + + # Gedit tmp files + | \.goutputstream-.{6} + + # Intellij files + | ___jb_bak___ + | ___jb_old___ + + # Vim swap files and write test + | \.sw[px] + | \.swpx + | ^4913 + + # Sed temporary files - but without actual words, like 'sedatives' + | (?:^ + sed + + (?: + [a-zA-Z0-9]{0}[A-Z]{1}[a-zA-Z0-9]{5} | + [a-zA-Z0-9]{1}[A-Z]{1}[a-zA-Z0-9]{4} | + [a-zA-Z0-9]{2}[A-Z]{1}[a-zA-Z0-9]{3} | + [a-zA-Z0-9]{3}[A-Z]{1}[a-zA-Z0-9]{2} | + [a-zA-Z0-9]{4}[A-Z]{1}[a-zA-Z0-9]{1} | + [a-zA-Z0-9]{5}[A-Z]{1}[a-zA-Z0-9]{0} + ) + ) + + # other files + | \.DS_Store + | \.tmp + | ~ + )$}x + + attr_accessor :only_patterns, :ignore_patterns + + def initialize + configure({}) + end + + def configure(options) + @only_patterns = options[:only] ? Array(options[:only]) : nil + @ignore_patterns = _init_ignores(options[:ignore], options[:ignore!]) + end + + # Note: relative_path is temporarily expected to be a relative Pathname to + # make refactoring easier (ideally, it would take a string) + + # TODO: switch type and path places - and verify + def silenced?(relative_path, type) + path = relative_path.to_s + + if only_patterns && type == :file + return true unless only_patterns.any? { |pattern| path =~ pattern } + end + + ignore_patterns.any? { |pattern| path =~ pattern } + end + + private + + attr_reader :options + + def _init_ignores(ignores, overrides) + patterns = [] + unless overrides + patterns << DEFAULT_IGNORED_DIRECTORIES + patterns << DEFAULT_IGNORED_EXTENSIONS + end + + patterns << ignores + patterns << overrides + + patterns.compact.flatten + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer/controller.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer/controller.rb new file mode 100644 index 0000000..a07e0ae --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer/controller.rb @@ -0,0 +1,48 @@ +module Listen + class Silencer + class Controller + def initialize(silencer, default_options) + @silencer = silencer + + opts = default_options + + @prev_silencer_options = {} + rules = [:only, :ignore, :ignore!].map do |option| + [option, opts[option]] if opts.key? option + end + + _reconfigure_silencer(Hash[rules.compact]) + end + + def append_ignores(*regexps) + prev_ignores = Array(@prev_silencer_options[:ignore]) + _reconfigure_silencer(ignore: [prev_ignores + regexps]) + end + + def replace_with_bang_ignores(regexps) + _reconfigure_silencer(ignore!: regexps) + end + + def replace_with_only(regexps) + _reconfigure_silencer(only: regexps) + end + + private + + def _reconfigure_silencer(extra_options) + opts = extra_options.dup + opts = opts.map do |key, value| + [key, Array(value).flatten.compact] + end + opts = Hash[opts] + + if opts.key?(:ignore) && opts[:ignore].empty? + opts.delete(:ignore) + end + + @prev_silencer_options = opts + @silencer.configure(@prev_silencer_options.dup.freeze) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/version.rb b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/version.rb new file mode 100644 index 0000000..2a19c7f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/version.rb @@ -0,0 +1,3 @@ +module Listen + VERSION = '3.1.5'.freeze +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.gitignore b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.gitignore new file mode 100644 index 0000000..d87d4be --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.gitignore @@ -0,0 +1,17 @@ +*.gem +*.rbc +.bundle +.config +.yardoc +Gemfile.lock +InstalledFiles +_yardoc +coverage +doc/ +lib/bundler/man +pkg +rdoc +spec/reports +test/tmp +test/version_tmp +tmp diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.rspec b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.rspec new file mode 100644 index 0000000..5f16476 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.rspec @@ -0,0 +1,2 @@ +--color +--format progress diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.travis.yml b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.travis.yml new file mode 100644 index 0000000..d7c261d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.travis.yml @@ -0,0 +1,15 @@ +language: ruby +rvm: + - 1.9.3 + - 2.0.0 + - 2.1 +sudo: false +cache: bundler +before_script: bundle update +script: "./script/cibuild" +notifications: + email: + recipients: + - mercenary@jekyllrb.com + on_success: change + on_failure: change diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Gemfile b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Gemfile new file mode 100644 index 0000000..50c90db --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in mercenary.gemspec +gemspec diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/History.markdown b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/History.markdown new file mode 100644 index 0000000..360b83f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/History.markdown @@ -0,0 +1,109 @@ +## 0.3.6 / 2016-04-07 + +### Bug Fixes + + * Presenter: Options should include those from parent command (#42) + +## 0.3.5 / 2014-11-12 + +### Bug Fixes + + * Capture `OptionsParser::InvalidOption` and show a nice error message (#38) + * Absolute paths for requires and autoloads (#39) + +### Development Fixes + + * Bump to RSpec 3 (#40) + +## 0.3.4 / 2014-07-11 + +### Bug Fixes + + * Use option object as key in the command's `@map` hash (#35) + +## 0.3.3 / 2014-05-07 + +### Bug Fixes + + * The `--version` flag should not exit with code 1, but instead code 0. (#33) + +## 0.3.2 / 2014-03-18 + +### Bug Fixes + + * Remove duplicate commands from help output; show aliases w/command names (#29) + +## 0.3.1 / 2014-02-21 + +### Minor Enhancements + + * Add `-t/--trace` to list of options in help message (#19) + +### Bug Fixes + + * `Mercenary::Option` now accepts return values in the form of Class constants (#22) + +## 0.3.0 / 2014-02-20 + +### Major Enhancements + + * Officially drop 1.8.7 support (#14) + * Allow Commands to set their own versions (#17) + * Show subcommands, options and usage in help and attach to all commands (#18) + * Add `-t, --trace` to allow full exception backtrace to print, otherwise print just the error message (#19) + +### Minor Enhancements + + * Logging state is maintained throughout process (#12) + * Tidy up Command#logger output (#21) + +### Development Fixes + + * Added specs for `Program` (#13) + +## 0.2.1 / 2013-12-25 + +### Bug Fixes + + * Added missing comma to fix '-v' and '--version' options (#9) + +## 0.2.0 / 2013-11-30 + +### Major Enhancements + + * Add `Command#default_command` to specify a default command if none is given by the user at runtime (#7) + +### Minor Enhancements + + * Add `Command#execute` to execute the actions of a command (#6) + +### Development Fixes + + * Add standard GitHub bootstrap and cibuild scripts to `script/` (#2) + +## 0.1.0 / 2013-11-08 + +### Major Enhancements + + * It works! + +### Minor Enhancements + + * Add a logger to `Command` + * Add `--version` switch to all programs + +### Bug Fixes + + * Fix `Command#syntax` and `Command#description`'s handing of setting vs getting + * Fix load path problem in `lib/mercenary.rb` + +### Development Fixes + + * Add TomDoc to everything + * Add a couple starter specs + * Add TravisCI badge + * Add Travis configuration + +## 0.0.1 / 2013-11-06 + + * Birthday! diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/LICENSE.txt b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/LICENSE.txt new file mode 100644 index 0000000..354c0b2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2013-2014 Parker Moore + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/README.md b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/README.md new file mode 100644 index 0000000..ed9b1a1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/README.md @@ -0,0 +1,250 @@ +# Mercenary + +Lightweight and flexible library for writing command-line apps in Ruby. + +[![Build Status](https://secure.travis-ci.org/jekyll/mercenary.png)](https://travis-ci.org/jekyll/mercenary) + +## Installation + +Add this line to your application's Gemfile: + + gem 'mercenary' + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install mercenary + +**Note: Mercenary may not work with Ruby < 1.9.3.** + +## Usage + +Creating programs and commands with Mercenary is easy: + +```ruby +Mercenary.program(:jekyll) do |p| + p.version Jekyll::VERSION + p.description 'Jekyll is a blog-aware, static site generator in Ruby' + p.syntax "jekyll [options]" + + p.command(:new) do |c| + c.syntax "new PATH" # do not include the program name or super commands + c.description "Creates a new Jekyll site scaffold in PATH" + c.option 'blank', '--blank', 'Initialize the new site without any content.' + + c.action do |args, options| + Jekyll::Commands::New.process(args, blank: options['blank']) + end + end + + p.command(:build) do |c| + c.syntax "build [options]" + c.description "Builds your Jekyll site" + + c.option 'safe', '--safe', 'Run in safe mode' + c.option 'source', '--source DIR', 'From where to collect the source files' + c.option 'destination', '--dest DIR', 'To where the compiled files should be written' + + c.action do |_, options| + Jekyll::Commands::Build.process(options) + end + end + + # Bring in command bundled in external gem + begin + require "jekyll-import" + JekyllImport.init_with_program(p) + rescue LoadError + end + + p.default_command(:build) +end +``` + +All commands have the following default options: + +- `-h/--help` - show a help message +- `-v/--version` - show the program version +- `-t/--trace` - show the full backtrace when an error occurs + +## API + +### `Mercenary` + +#### `.program` + +Creates and executes a program. Accepts two arguments: + +- `name` - program name as a Symbol +- `block` - the specification for the program, passed the program instance as an + argument. + +Example is above, under the heading [Usage](#usage). + +### `Program` + +`Program` is a subclass of `Command`, so it has all of the methods documented +below as well as those for `Command`. + +#### `#config` + +Fetches the program configuration hash. + +### `Command` + +#### `#new` + +Create a new command. Accepts two arguments: + +- `name` - the name of your command, as a symbol +- `parent` - (optional) the parent Command + +#### `#version` + +Sets or gets the version of the command. Accepts an optional argument: + +- `version` - (optional) the version to set for the command. If present, this + becomes the new version for the command and persists. + +#### `#syntax` + +Sets or gets the syntax of the command. Built on parent syntaxes if a parent +exists. Accepts one optional argument: + +- `syntax` - (optional) the syntax to set for the command. Will inherit from the + parent commands or program. Usually in the form of + `"command_name [OPTIONS]"` + +When a parent command exists, say `supercommand`, with syntax set as +`supercommand [OPTIONS]`, the syntax of the command in question +will be `supercommand command_name [OPTIONS]` with both +`` and `[OPTIONS]` stripped out. Any text between `<` and `>` or +between `[` and `]` will be stripped from parent command syntaxes. The purpose +of this chaining is to reduce redundancy. + +#### `#description` + +Sets or gets the description of the command. Accepts one optional argument: + +- `desc` - (optional) the description to set for the command. If + provided, will override any previous description set for the command. + +#### `#default_command` + +Sets or gets the default subcommand of the command to execute in the event no +subcommand is passed during execution. Accepts one optional argument: + +- `command_name` - (optional) the `Symbol` name of the subcommand to be + executed. Raises an `ArgumentError` if the subcommand doesn't exist. + Overwrites previously-set default commands. + +#### `#option` + +Adds a new option to the command. Accepts many arguments: + +- `config_key` - the configuration key that the value of this option maps to. +- `*options` - all the options, globbed, to be passed to `OptionParser`, namely the + switches and the option description. Usually in the format + `"-s", "--switch", "Sets the 'switch' flag"`. + +Valid option calls: + +```ruby +cmd.option 'config_key', '-c', 'Sets the "config" flag' +cmd.option 'config_key', '--config', 'Sets the "config" flag' +cmd.option 'config_key', '-c', '--config', 'Sets the "config" flag.' +cmd.option 'config_key', '-c FILE', '--config FILE', 'The config file.' +cmd.option 'config_key', '-c FILE1[,FILE2[,FILE3...]]', '--config FILE1[,FILE2[,FILE3...]]', Array, 'The config files.' +``` + +Notice that you can specify either a short switch, a long switch, or both. If +you want to accept an argument, you have to specify it in the switch strings. +The class of the argument defaults to `String`, but you can optionally set a +different class to create, e.g. `Array`, if you are expecting a particular class +in your code from this option's value. The description is also optional, but +it's highly recommended to include a description. + +#### `#alias` + +Specifies an alias for this command such that the alias may be used in place of +the command during execution. Accepts one argument: + +- `cmd_name` - the alias name for this command as a `Symbol` + +Example: + +```ruby +cmd.alias(:my_alias) +# Now `cmd` is now also executable via "my_alias" +``` + +#### `#action` + +Specifies a block to be executed in the event the command is specified at +runtime. The block is given two arguments: + +- `args` - the non-switch arguments given from the command-line +- `options` - the options hash built via the switches passed + +**Note that actions are additive**, meaning any new call to `#action` will +result in another action to be executed at runtime. Actions will be executed in +the order they are specified in. + +Example: + +```ruby +cmd.action do |args, options| + # do something! +end +``` + +#### `#logger` + +Access the logger for this command. Useful for outputting information to STDOUT. +Accepts one optional argument: + +- `level` - (optional) the severity threshold at which to begin logging. Uses + Ruby's built-in + [`Logger`](http://www.ruby-doc.org/stdlib-2.1.0/libdoc/logger/rdoc/Logger.html) + levels. + +Log level defaults to `Logger::INFO`. + +Examples: + +```ruby +cmd.logger(Logger::DEBUG) +cmd.logger.debug "My debug message." +cmd.logger.info "My informative message." +cmd.logger.warn "ACHTUNG!!" +cmd.logger.error "Something terrible has happened." +cmd.logger.fatal "I can't continue doing what I'm doing." +``` + +#### `#command` + +Creates a new subcommand for the current command. Accepts two arguments: + +- `cmd_name` - the command name, as a Symbol +- `block` - the specification of the subcommand in a block + +Example: + +```ruby +my_command.command(:my_subcommand) do |subcmd| + subcmd.description 'My subcommand' + subcmd.syntax 'my_subcommand [OPTIONS]' + # ... +end +``` + +## Contributing + +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new Pull Request diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Rakefile b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Rakefile new file mode 100644 index 0000000..2995527 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Rakefile @@ -0,0 +1 @@ +require "bundler/gem_tasks" diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/help_dialogue.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/help_dialogue.rb new file mode 100755 index 0000000..807e587 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/help_dialogue.rb @@ -0,0 +1,46 @@ +#!/usr/bin/env ruby + +$:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) + +require "mercenary" + +# This example sets the logging mode of mercenary to +# debug. Logging messages from "p.logger.debug" will +# be output to STDOUT. + +Mercenary.program(:help_dialogue) do |p| + + p.version "2.0.1" + p.description 'An example of the help dialogue in Mercenary' + p.syntax 'help_dialogue ' + + p.command(:some_subcommand) do |c| + c.version '1.4.2' + c.syntax 'some_subcommand [options]' + c.description 'Some subcommand to do something' + c.option 'an_option', '-o', '--option', 'Some option' + c.alias(:blah) + + c.command(:yet_another_sub) do |f| + f.syntax 'yet_another_sub [options]' + f.description 'Do amazing things' + f.option 'blah', '-b', '--blah', 'Trigger blah flag' + f.option 'heh', '-H ARG', '--heh ARG', 'Give a heh' + + f.action do |args, options| + print "Args: " + p args + print "Opts: " + p options + end + end + end + + p.command(:another_subcommand) do |c| + c.syntax 'another_subcommand [options]' + c.description 'Another subcommand to do something different.' + c.option 'an_option', '-O', '--option', 'Some option' + c.option 'another_options', '--pluginzzz', 'Set where the plugins should be found from' + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/logging.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/logging.rb new file mode 100644 index 0000000..2cb867a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/logging.rb @@ -0,0 +1,39 @@ +#!/usr/bin/env ruby + +$:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) + +require "mercenary" + +# This example sets the logging mode of mercenary to +# debug. Logging messages from "p.logger.debug" will +# be output to STDOUT. + +Mercenary.program(:logger_output) do |p| + + p.version "5.2.6" + p.description 'An example of turning on logging for Mercenary.' + p.syntax 'logger_output' + + + p.logger.info "The default log level is INFO. So this will output." + p.logger.debug "Since DEBUG is below INFO, this will not output." + + p.logger(Logger::DEBUG) + p.logger.debug "Logger level now set to DEBUG. So everything will output." + + p.logger.debug "Example of DEBUG level message." + p.logger.info "Example of INFO level message." + p.logger.warn "Example of WARN level message." + p.logger.error "Example of ERROR level message." + p.logger.fatal "Example of FATAL level message." + p.logger.unknown "Example of UNKNOWN level message." + + p.action do |args, options| + + p.logger(Logger::INFO) + p.logger.debug "Logger level back to INFO. This line will not output." + p.logger.info "This INFO message will output." + + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/trace.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/trace.rb new file mode 100644 index 0000000..0aaa365 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/trace.rb @@ -0,0 +1,21 @@ +#!/usr/bin/env ruby + +$:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) + +require "mercenary" + +# This example sets the logging mode of mercenary to +# debug. Logging messages from "p.logger.debug" will +# be output to STDOUT. + +Mercenary.program(:trace) do |p| + + p.version "2.0.1" + p.description 'An example of traces in Mercenary' + p.syntax 'trace ' + + p.action do |_, _| + raise ArgumentError.new("YOU DID SOMETHING TERRIBLE YOU BUFFOON") + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary.rb new file mode 100644 index 0000000..1c4be62 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary.rb @@ -0,0 +1,21 @@ +require File.expand_path("../mercenary/version", __FILE__) +require "optparse" +require "logger" + +module Mercenary + autoload :Command, File.expand_path("../mercenary/command", __FILE__) + autoload :Option, File.expand_path("../mercenary/option", __FILE__) + autoload :Presenter, File.expand_path("../mercenary/presenter", __FILE__) + autoload :Program, File.expand_path("../mercenary/program", __FILE__) + + # Public: Instantiate a new program and execute. + # + # name - the name of your program + # + # Returns nothing. + def self.program(name) + program = Program.new(name) + yield program + program.go(ARGV) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb new file mode 100644 index 0000000..0bcc4dd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb @@ -0,0 +1,280 @@ +module Mercenary + class Command + attr_reader :name + attr_reader :description + attr_reader :syntax + attr_accessor :options + attr_accessor :commands + attr_accessor :actions + attr_reader :map + attr_accessor :parent + attr_reader :trace + attr_reader :aliases + + # Public: Creates a new Command + # + # name - the name of the command + # parent - (optional) the instancce of Mercenary::Command which you wish to + # be the parent of this command + # + # Returns nothing + def initialize(name, parent = nil) + @name = name + @options = [] + @commands = {} + @actions = [] + @map = {} + @parent = parent + @trace = false + @aliases = [] + end + + # Public: Sets or gets the command version + # + # version - the command version (optional) + # + # Returns the version and sets it if an argument is non-nil + def version(version = nil) + @version = version if version + @version + end + + # Public: Sets or gets the syntax string + # + # syntax - the string which describes this command's usage syntax (optional) + # + # Returns the syntax string and sets it if an argument is present + def syntax(syntax = nil) + @syntax = syntax if syntax + syntax_list = [] + if parent + syntax_list << parent.syntax.to_s.gsub(/<[\w\s-]+>/, '').gsub(/\[[\w\s-]+\]/, '').strip + end + syntax_list << (@syntax || name.to_s) + syntax_list.join(" ") + end + + # Public: Sets or gets the command description + # + # description - the description of what the command does (optional) + # + # Returns the description and sets it if an argument is present + def description(desc = nil) + @description = desc if desc + @description + end + + # Public: Sets the default command + # + # command_name - the command name to be executed in the event no args are + # present + # + # Returns the default command if there is one, `nil` otherwise + def default_command(command_name = nil) + if command_name + if commands.has_key?(command_name) + @default_command = commands[command_name] if command_name + @default_command + else + raise ArgumentError.new("'#{command_name}' couldn't be found in this command's list of commands.") + end + else + @default_command + end + end + + # Public: Adds an option switch + # + # sym - the variable key which is used to identify the value of the switch + # at runtime in the options hash + # + # Returns nothing + def option(sym, *options) + new_option = Option.new(sym, options) + @options << new_option + @map[new_option] = sym + end + + # Public: Adds a subcommand + # + # cmd_name - the name of the command + # block - a block accepting the new instance of Mercenary::Command to be + # modified (optional) + # + # Returns nothing + def command(cmd_name) + cmd = Command.new(cmd_name, self) + yield cmd + @commands[cmd_name] = cmd + end + + # Public: Add an alias for this command's name to be attached to the parent + # + # cmd_name - the name of the alias + # + # Returns nothing + def alias(cmd_name) + logger.debug "adding alias to parent for self: '#{cmd_name}'" + aliases << cmd_name + @parent.commands[cmd_name] = self + end + + # Public: Add an action Proc to be executed at runtime + # + # block - the Proc to be executed at runtime + # + # Returns nothing + def action(&block) + @actions << block + end + + # Public: Fetch a Logger (stdlib) + # + # level - the logger level (a Logger constant, see docs for more info) + # + # Returns the instance of Logger + def logger(level = nil) + unless @logger + @logger = Logger.new(STDOUT) + @logger.level = level || Logger::INFO + @logger.formatter = proc do |severity, datetime, progname, msg| + "#{identity} | " << "#{severity.downcase.capitalize}:".ljust(7) << " #{msg}\n" + end + end + + @logger.level = level unless level.nil? + @logger + end + + # Public: Run the command + # + # argv - an array of string args + # opts - the instance of OptionParser + # config - the output config hash + # + # Returns the command to be executed + def go(argv, opts, config) + opts.banner = "Usage: #{syntax}" + process_options(opts, config) + add_default_options(opts) + + if argv[0] && cmd = commands[argv[0].to_sym] + logger.debug "Found subcommand '#{cmd.name}'" + argv.shift + cmd.go(argv, opts, config) + else + logger.debug "No additional command found, time to exec" + self + end + end + + # Public: Add this command's options to OptionParser and set a default + # action of setting the value of the option to the inputted hash + # + # opts - instance of OptionParser + # config - the Hash in which the option values should be placed + # + # Returns nothing + def process_options(opts, config) + options.each do |option| + opts.on(*option.for_option_parser) do |x| + config[map[option]] = x + end + end + end + + # Public: Add version and help options to the command + # + # opts - instance of OptionParser + # + # Returns nothing + def add_default_options(opts) + option 'show_help', '-h', '--help', 'Show this message' + option 'show_version', '-v', '--version', 'Print the name and version' + option 'show_backtrace', '-t', '--trace', 'Show the full backtrace when an error occurs' + opts.on("-v", "--version", "Print the version") do + puts "#{name} #{version}" + exit(0) + end + + opts.on('-t', '--trace', 'Show full backtrace if an error occurs') do + @trace = true + end + + opts.on_tail("-h", "--help", "Show this message") do + puts self + exit + end + end + + # Public: Execute all actions given the inputted args and options + # + # argv - (optional) command-line args (sans opts) + # config - (optional) the Hash configuration of string key to value + # + # Returns nothing + def execute(argv = [], config = {}) + if actions.empty? && !default_command.nil? + default_command.execute + else + actions.each { |a| a.call(argv, config) } + end + end + + # Public: Check if this command has a subcommand + # + # sub_command - the name of the subcommand + # + # Returns true if this command is the parent of a command of name + # 'sub_command' and false otherwise + def has_command?(sub_command) + commands.keys.include?(sub_command) + end + + # Public: Identify this command + # + # Returns a string which identifies this command + def ident + "" + end + + # Public: Get the full identity (name & version) of this command + # + # Returns a string containing the name and version if it exists + def identity + "#{full_name} #{version if version}".strip + end + + # Public: Get the name of the current command plus that of + # its parent commands + # + # Returns the full name of the command + def full_name + the_name = [] + the_name << parent.full_name if parent && parent.full_name + the_name << name + the_name.join(" ") + end + + # Public: Return all the names and aliases for this command. + # + # Returns a comma-separated String list of the name followed by its aliases + def names_and_aliases + ([name.to_s] + aliases).compact.join(", ") + end + + # Public: Build a string containing a summary of the command + # + # Returns a one-line summary of the command. + def summarize + " #{names_and_aliases.ljust(20)} #{description}" + end + + # Public: Build a string containing the command name, options and any subcommands + # + # Returns the string identifying this command, its options and its subcommands + def to_s + Presenter.new(self).print_command + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/option.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/option.rb new file mode 100644 index 0000000..56a49b6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/option.rb @@ -0,0 +1,87 @@ +module Mercenary + class Option + attr_reader :config_key, :description, :short, :long, :return_type + + # Public: Create a new Option + # + # config_key - the key in the config hash to which the value of this option + # will map + # info - an array containing first the switches, then an optional + # return type (e.g. Array), then a description of the option + # + # Returns nothing + def initialize(config_key, info) + @config_key = config_key + while arg = info.shift + begin + @return_type = Object.const_get("#{arg}") + next + rescue NameError + end + if arg.start_with?("-") + if arg.start_with?("--") + @long = arg + else + @short = arg + end + next + end + @description = arg + end + end + + # Public: Fetch the array containing the info OptionParser is interested in + # + # Returns the array which OptionParser#on wants + def for_option_parser + [short, long, return_type, description].flatten.reject{ |o| o.to_s.empty? } + end + + # Public: Build a string representation of this option including the + # switches and description + # + # Returns a string representation of this option + def to_s + "#{formatted_switches} #{description}" + end + + # Public: Build a beautifully-formatted string representation of the switches + # + # Returns a formatted string representation of the switches + def formatted_switches + [ + switches.first.rjust(10), + switches.last.ljust(13) + ].join(", ").gsub(/ , /, ' ').gsub(/, /, ' ') + end + + # Public: Hash based on the hash value of instance variables + # + # Returns a Fixnum which is unique to this Option based on the instance variables + def hash + instance_variables.map do |var| + instance_variable_get(var).hash + end.reduce(:^) + end + + # Public: Check equivalence of two Options based on equivalence of their + # instance variables + # + # Returns true if all the instance variables are equal, false otherwise + def eql?(other) + return false unless self.class.eql?(other.class) + instance_variables.map do |var| + instance_variable_get(var).eql?(other.instance_variable_get(var)) + end.all? + end + + # Public: Fetch an array of switches, including the short and long versions + # + # Returns an array of two strings. An empty string represents no switch in + # that position. + def switches + [short, long].map(&:to_s) + end + + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb new file mode 100644 index 0000000..0521ee0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb @@ -0,0 +1,94 @@ +module Mercenary + class Presenter + attr_accessor :command + + # Public: Make a new Presenter + # + # command - a Mercenary::Command to present + # + # Returns nothing + def initialize(command) + @command = command + end + + # Public: Builds a string representation of the command usage + # + # Returns the string representation of the command usage + def usage_presentation + " #{command.syntax}" + end + + # Public: Builds a string representation of the options + # + # Returns the string representation of the options + def options_presentation + return nil unless command_options_presentation || parent_command_options_presentation + [command_options_presentation, parent_command_options_presentation].compact.join("\n") + end + + def command_options_presentation + return nil unless command.options.size > 0 + command.options.map(&:to_s).join("\n") + end + + # Public: Builds a string representation of the options for parent + # commands + # + # Returns the string representation of the options for parent commands + def parent_command_options_presentation + return nil unless command.parent + Presenter.new(command.parent).options_presentation + end + + # Public: Builds a string representation of the subcommands + # + # Returns the string representation of the subcommands + def subcommands_presentation + return nil unless command.commands.size > 0 + command.commands.values.uniq.map(&:summarize).join("\n") + end + + # Public: Builds the command header, including the command identity and description + # + # Returns the command header as a String + def command_header + header = "#{command.identity}" + header << " -- #{command.description}" if command.description + header + end + + # Public: Builds a string representation of the whole command + # + # Returns the string representation of the whole command + def command_presentation + msg = [] + msg << command_header + msg << "Usage:" + msg << usage_presentation + + if opts = options_presentation + msg << "Options:\n#{opts}" + end + if subcommands = subcommands_presentation + msg << "Subcommands:\n#{subcommands_presentation}" + end + msg.join("\n\n") + end + + # Public: Turn a print_* into a *_presentation or freak out + # + # meth - the method being called + # args - an array of arguments passed to the missing method + # block - the block passed to the missing method + # + # Returns the value of whatever function is called + def method_missing(meth, *args, &block) + if meth.to_s =~ /^print_(.+)$/ + send("#{$1.downcase}_presentation") + else + super # You *must* call super if you don't handle the method, + # otherwise you'll mess up Ruby's method lookup. + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/program.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/program.rb new file mode 100644 index 0000000..53591c0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/program.rb @@ -0,0 +1,53 @@ +module Mercenary + class Program < Command + attr_reader :optparse + attr_reader :config + + # Public: Creates a new Program + # + # name - the name of the program + # + # Returns nothing + def initialize(name) + @config = {} + super(name) + end + + # Public: Run the program + # + # argv - an array of string args (usually ARGV) + # + # Returns nothing + def go(argv) + logger.debug("Using args passed in: #{argv.inspect}") + + cmd = nil + + @optparse = OptionParser.new do |opts| + cmd = super(argv, opts, @config) + end + + begin + @optparse.parse!(argv) + rescue OptionParser::InvalidOption => e + logger.error "Whoops, we can't understand your command." + logger.error "#{e.message}" + logger.error "Run your command again with the --help switch to see available options." + abort + end + + logger.debug("Parsed config: #{@config.inspect}") + + begin + cmd.execute(argv, @config) + rescue => e + if cmd.trace + raise e + else + logger.error e.message + abort + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/version.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/version.rb new file mode 100644 index 0000000..296046b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/version.rb @@ -0,0 +1,3 @@ +module Mercenary + VERSION = "0.3.6" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/mercenary.gemspec b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/mercenary.gemspec new file mode 100644 index 0000000..e9f8294 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/mercenary.gemspec @@ -0,0 +1,24 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'mercenary/version' + +Gem::Specification.new do |spec| + spec.name = "mercenary" + spec.version = Mercenary::VERSION + spec.authors = ["Tom Preston-Werner", "Parker Moore"] + spec.email = ["tom@mojombo.com", "parkrmoore@gmail.com"] + spec.description = %q{Lightweight and flexible library for writing command-line apps in Ruby.} + spec.summary = %q{Lightweight and flexible library for writing command-line apps in Ruby.} + spec.homepage = "https://github.com/jekyll/mercenary" + spec.license = "MIT" + + spec.files = `git ls-files`.split($/) + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ["lib"] + + spec.add_development_dependency "bundler", "~> 1.3" + spec.add_development_dependency "rake" + spec.add_development_dependency "rspec", "~> 3.0" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/bootstrap b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/bootstrap new file mode 100755 index 0000000..a0cf262 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/bootstrap @@ -0,0 +1,7 @@ +#! /bin/sh + +set -e + +echo "Time to get set up." +bundle install +echo "Boom." diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/cibuild b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/cibuild new file mode 100755 index 0000000..260e363 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/cibuild @@ -0,0 +1,6 @@ +#! /bin/sh + +set -ex + +bundle exec rspec +./script/examples diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/console b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/console new file mode 100755 index 0000000..27ed279 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/console @@ -0,0 +1,3 @@ +#! /bin/bash + +irb -r./lib/mercenary.rb diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/examples b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/examples new file mode 100755 index 0000000..a722ab3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/examples @@ -0,0 +1,18 @@ +#! /bin/bash + +set -e + +function run () { + echo "+ ruby ./examples/$@" + ruby -e "puts '=' * 79" + ruby ./examples/$@ + ruby -e "puts '=' * 79" +} + +run logging.rb +run logging.rb -v +run help_dialogue.rb -h +run help_dialogue.rb some_subcommand -h +run help_dialogue.rb another_subcommand -h +run help_dialogue.rb some_subcommand yet_another_sub -h +run help_dialogue.rb some_subcommand yet_another_sub -b diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/command_spec.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/command_spec.rb new file mode 100644 index 0000000..e1c029a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/command_spec.rb @@ -0,0 +1,98 @@ +require "spec_helper" + +describe(Mercenary::Command) do + + context "a basic command" do + let(:command) { Mercenary::Command.new(:my_name) } + let(:parent) { Mercenary::Command.new(:my_parent) } + let(:with_sub) do + c = Mercenary::Command.new(:i_have_subcommand) + add_sub.call(c) + c + end + let(:command_with_parent) do + Mercenary::Command.new( + :i_have_parent, + parent + ) + end + let(:add_sub) do + Proc.new do |c| + c.command(:sub_command) { |p| } + end + end + + it "can be created with just a name" do + expect(command.name).to eql(:my_name) + end + + it "can hold a parent command" do + expect(command_with_parent.parent).to eql(parent) + end + + it "can create subcommands" do + expect(add_sub.call(command)).to be_a(Mercenary::Command) + expect(add_sub.call(command).parent).to eq(command) + end + + it "can set its version" do + version = "1.4.2" + command.version version + expect(command.version).to eq(version) + end + + it "can set its syntax" do + syntax_string = "my_name [options]" + cmd = described_class.new(:my_name) + cmd.syntax syntax_string + expect(cmd.syntax).to eq(syntax_string) + end + + it "can set its description" do + desc = "run all the things" + command.description desc + expect(command.description).to eq(desc) + end + + it "can set its options" do + name = "show_drafts" + opts = ['--drafts', 'Render posts in the _drafts folder'] + option = Mercenary::Option.new(name, opts) + command.option name, *opts + expect(command.options).to eql([option]) + expect(command.map.values).to include(name) + end + + it "knows its full name" do + expect(command_with_parent.full_name).to eql("my_parent i_have_parent") + end + + it "knows its identity" do + command_with_parent.version '1.8.7' + expect(command_with_parent.identity).to eql("my_parent i_have_parent 1.8.7") + end + + it "raises an ArgumentError if I specify a default_command that isn't there" do + c = command # some weird NameError with the block below? + expect { c.default_command(:nope) }.to raise_error(ArgumentError) + end + + it "sets the default_command" do + expect(with_sub.default_command(:sub_command).name).to eq(:sub_command) + end + + context "with an alias" do + before(:each) do + command_with_parent.alias(:an_alias) + end + it "shows the alias in the summary" do + expect(command_with_parent.summarize).to eql(" i_have_parent, an_alias ") + end + + it "its names_and_aliases method reports both the name and alias" do + expect(command_with_parent.names_and_aliases).to eql("i_have_parent, an_alias") + end + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/option_spec.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/option_spec.rb new file mode 100644 index 0000000..83e58fd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/option_spec.rb @@ -0,0 +1,83 @@ +require 'spec_helper' + +describe(Mercenary::Option) do + let(:config_key) { "largo" } + let(:description) { "This is a description" } + let(:switches) { ['-l', '--largo'] } + let(:option) { described_class.new(config_key, [switches, description].flatten.reject(&:nil?)) } + + it "knows its config key" do + expect(option.config_key).to eql(config_key) + end + + it "knows its description" do + expect(option.description).to eql(description) + end + + it "knows its switches" do + expect(option.switches).to eql(switches) + end + + it "knows how to present itself" do + expect(option.to_s).to eql(" -l, --largo #{description}") + end + + it "has an OptionParser representation" do + expect(option.for_option_parser).to eql([switches, description].flatten) + end + + it "compares itself with other options well" do + new_option = described_class.new(config_key, ['-l', '--largo', description]) + expect(option.eql?(new_option)).to be(true) + expect(option.hash.eql?(new_option.hash)).to be(true) + end + + it "has a custom #hash" do + expect(option.hash.to_s).to match(/\d+/) + end + + context "with just the long switch" do + let(:switches) { ['--largo'] } + + it "adds an empty string in place of the short switch" do + expect(option.switches).to eql(['', '--largo']) + end + + it "sets its description properly" do + expect(option.description).to eql(description) + end + + it "knows how to present the switch" do + expect(option.formatted_switches).to eql(" --largo ") + end + end + + context "with just the short switch" do + let(:switches) { ['-l'] } + + it "adds an empty string in place of the long switch" do + expect(option.switches).to eql(['-l', '']) + end + + it "sets its description properly" do + expect(option.description).to eql(description) + end + + it "knows how to present the switch" do + expect(option.formatted_switches).to eql(" -l ") + end + end + + context "without a description" do + let(:description) { nil } + + it "knows there is no description" do + expect(option.description).to be(nil) + end + + it "knows both inputs are switches" do + expect(option.switches).to eql(switches) + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/presenter_spec.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/presenter_spec.rb new file mode 100644 index 0000000..f61ed45 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/presenter_spec.rb @@ -0,0 +1,39 @@ +require 'spec_helper' + +describe(Mercenary::Presenter) do + let(:supercommand) { Mercenary::Command.new(:script_name) } + let(:command) { Mercenary::Command.new(:subcommand, supercommand) } + let(:presenter) { described_class.new(command) } + + before(:each) do + command.version '1.4.2' + command.description 'Do all the things.' + command.option 'one', '-1', '--one', 'The first option' + command.option 'two', '-2', '--two', 'The second option' + command.alias :cmd + supercommand.commands[command.name] = command + end + + it "knows how to present the command" do + expect(presenter.command_presentation).to eql("script_name subcommand 1.4.2 -- Do all the things.\n\nUsage:\n\n script_name subcommand\n\nOptions:\n -1, --one The first option\n -2, --two The second option") + end + + it "knows how to present the subcommands, without duplicates for aliases" do + expect(described_class.new(supercommand).subcommands_presentation).to eql(" subcommand, cmd Do all the things.") + end + + it "knows how to present the usage" do + expect(presenter.usage_presentation).to eql(" script_name subcommand") + end + + it "knows how to present the options" do + expect(presenter.options_presentation).to eql(" -1, --one The first option\n -2, --two The second option") + end + + it "allows you to say print_* instead of *_presentation" do + expect(presenter.print_usage).to eql(presenter.usage_presentation) + expect(presenter.print_subcommands).to eql(presenter.subcommands_presentation) + expect(presenter.print_options).to eql(presenter.options_presentation) + expect(presenter.print_command).to eql(presenter.command_presentation) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/program_spec.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/program_spec.rb new file mode 100644 index 0000000..f5d961e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/program_spec.rb @@ -0,0 +1,19 @@ +require "spec_helper" + +describe(Mercenary::Program) do + + context "a basic program" do + let(:program) { Mercenary::Program.new(:my_name) } + + it "can be created with just a name" do + expect(program.name).to eql(:my_name) + end + + it "can set its version" do + version = Mercenary::VERSION + program.version version + expect(program.version).to eq(version) + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/spec_helper.rb b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/spec_helper.rb new file mode 100644 index 0000000..c379985 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/spec_helper.rb @@ -0,0 +1,14 @@ +lib = File.expand_path('../../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'mercenary' + +RSpec.configure do |config| + config.run_all_when_everything_filtered = true + config.filter_run :focus + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = 'random' +end diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/LICENSE.txt b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/LICENSE.txt new file mode 100644 index 0000000..e8c3c2d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Parker Moore + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/README.md b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/README.md new file mode 100644 index 0000000..182ee5d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/README.md @@ -0,0 +1,147 @@ +# minima + +*Minima is a one-size-fits-all Jekyll theme for writers*. It's Jekyll's default (and first) theme. It's what you get when you run `jekyll new`. + +[Theme preview](https://jekyll.github.io/minima/) + +![minima theme preview](/screenshot.png) + +## Installation + +Add this line to your Jekyll site's Gemfile: + +```ruby +gem "minima" +``` + +And add this line to your Jekyll site: + +```yaml +theme: minima +``` + +And then execute: + + $ bundle + + +## Contents At-A-Glance + +Minima has been scaffolded by the `jekyll new-theme` command and therefore has all the necessary files and directories to have a new Jekyll site up and running with zero-configuration. + +### Layouts + +Refers to files within the `_layouts` directory, that define the markup for your theme. + + - `default.html` — The base layout that lays the foundation for subsequent layouts. The derived layouts inject their contents into this file at the line that says ` {{ content }} ` and are linked to this file via [FrontMatter](https://jekyllrb.com/docs/frontmatter/) declaration `layout: default`. + - `home.html` — The layout for your landing-page / home-page / index-page. + - `page.html` — The layout for your documents that contain FrontMatter, but are not posts. + - `post.html` — The layout for your posts. + +### Includes + +Refers to snippets of code within the `_includes` directory that can be inserted in multiple layouts (and another include-file as well) within the same theme-gem. + + - `disqus_comments.html` — Code to markup disqus comment box. + - `footer.html` — Defines the site's footer section. + - `google-analytics.html` — Inserts Google Analytics module (active only in production environment). + - `head.html` — Code-block that defines the `` in *default* layout. + - `header.html` — Defines the site's main header section. + - `icon-* files` — Inserts github and twitter ids with respective icons. + +### Sass + +Refers to `.scss` files within the `_sass` directory that define the theme's styles. + + - `minima.scss` — The core file imported by preprocessed `main.scss`, it defines the variable defaults for the theme and also further imports sass partials to supplement itself. + - `minima/_base.scss` — Resets and defines base styles for various HTML elements. + - `minima/_layout.scss` — Defines the visual style for various layouts. + - `minima/_syntax-highlighting.scss` — Defines the styles for syntax-highlighting. + +### Assets + +Refers to various asset files within the `assets` directory. +Contains the `main.scss` that imports sass files from within the `_sass` directory. This `main.scss` is what gets processed into the theme's main stylesheet `main.css` called by `_layouts/default.html` via `_includes/head.html`. + +This directory can include sub-directories to manage assets of similar type, and will be copied over as is, to the final transformed site directory. + + +## Usage + +### Customization + +To override the default structure and style of minima, simply create the concerned directory at the root of your site, copy the file you wish to customize to that directory, and then edit the file. +e.g., to override the [`_includes/head.html `](_includes/head.html) file to specify a custom style path, create an `_includes` directory, copy `_includes/head.html` from minima gem folder to `/_includes` and start editing that file. + +The site's default CSS has now moved to a new place within the gem itself, [`assets/main.scss`](assets/main.scss). To **override the default CSS**, the file has to exist at your site source. Do either of the following: +- Create a new instance of `main.scss` at site source. + - Create a new file `main.scss` at `/assets/` + - Add the frontmatter dashes, and + - Add `@import "minima";`, to `/assets/main.scss` + - Add your custom CSS. +- Download the file from this repo + - Create a new file `main.scss` at `/assets/` + - Copy the contents at [assets/main.scss](assets/main.scss) onto the `main.scss` you just created, and edit away! +- Copy directly from Minima 2.0 gem + - Go to your local minima gem installation directory ( run `bundle show minima` to get the path to it ). + - Copy the `assets/` folder from there into the root of `` + - Change whatever values you want, inside `/assets/main.scss` + +-- + +### Change default date format + +You can change the default date format by specifying `site.minima.date_format` +in `_config.yml`. + +``` +# Minima date format +# refer to http://shopify.github.io/liquid/filters/date/ if you want to customize this +minima: + date_format: "%b %-d, %Y" +``` + +-- + +### Enabling comments (via Disqus) + +Optionally, if you have a Disqus account, you can tell Jekyll to use it to show a comments section below each post. + +To enable it, add the following lines to your Jekyll site: + +```yaml + disqus: + shortname: my_disqus_shortname +``` + +You can find out more about Disqus' shortnames [here](https://help.disqus.com/customer/portal/articles/466208). + +Comments are enabled by default and will only appear in production, i.e., `JEKYLL_ENV=production` + +If you don't want to display comments for a particular post you can disable them by adding `comments: false` to that post's YAML Front Matter. + +-- + +### Enabling Google Analytics + +To enable Google Anaytics, add the following lines to your Jekyll site: + +```yaml + google_analytics: UA-NNNNNNNN-N +``` + +Google Analytics will only appear in production, i.e., `JEKYLL_ENV=production` + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/jekyll/minima. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. + +## Development + +To set up your environment to develop this theme, run `script/bootstrap`. + +To test your theme, run `script/server` (or `bundle exec jekyll serve`) and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme and the contents. As you make modifications, your site will regenerate and you should see the changes in the browser after a refresh. + +## License + +The theme is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/disqus_comments.html b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/disqus_comments.html new file mode 100644 index 0000000..87fa309 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/disqus_comments.html @@ -0,0 +1,20 @@ +{% if page.comments != false and jekyll.environment == "production" %} + +
      + + +{% endif %} diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/footer.html b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/footer.html new file mode 100644 index 0000000..dc26507 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/footer.html @@ -0,0 +1,46 @@ +
      + +
      + + + + + +
      + +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/google-analytics.html b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/google-analytics.html new file mode 100644 index 0000000..eb2a692 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/google-analytics.html @@ -0,0 +1,11 @@ + + diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/head.html b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/head.html new file mode 100644 index 0000000..99b698f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/head.html @@ -0,0 +1,16 @@ + + + + + + {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %} + + + + + + + {% if jekyll.environment == 'production' and site.google_analytics %} + {% include google-analytics.html %} + {% endif %} + diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/header.html b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/header.html new file mode 100644 index 0000000..db72550 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/header.html @@ -0,0 +1,32 @@ + diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-github.html b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-github.html new file mode 100644 index 0000000..e501a16 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-github.html @@ -0,0 +1 @@ +{% include icon-github.svg %}{{ include.username }} diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-github.svg b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-github.svg new file mode 100644 index 0000000..e6c5f6d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-github.svg @@ -0,0 +1 @@ + diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-twitter.html b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-twitter.html new file mode 100644 index 0000000..e623dbd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-twitter.html @@ -0,0 +1 @@ +{{ include.username }} diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-twitter.svg b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-twitter.svg new file mode 100644 index 0000000..efc0ecf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_includes/icon-twitter.svg @@ -0,0 +1 @@ + diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/default.html b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/default.html new file mode 100644 index 0000000..52085bf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/default.html @@ -0,0 +1,20 @@ + + + + {% include head.html %} + + + + {% include header.html %} + +
      +
      + {{ content }} +
      +
      + + {% include footer.html %} + + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/home.html b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/home.html new file mode 100644 index 0000000..6e2f604 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/home.html @@ -0,0 +1,26 @@ +--- +layout: default +--- + +
      + +

      Posts

      + + {{ content }} + +
        + {% for post in site.posts %} +
      • + {% assign date_format = site.minima.date_format | default: "%b %-d, %Y" %} + + +

        + {{ post.title | escape }} +

        +
      • + {% endfor %} +
      + +

      subscribe via RSS

      + +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/page.html b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/page.html new file mode 100644 index 0000000..01e4b2a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/page.html @@ -0,0 +1,14 @@ +--- +layout: default +--- +
      + +
      +

      {{ page.title | escape }}

      +
      + +
      + {{ content }} +
      + +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/post.html b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/post.html new file mode 100644 index 0000000..55ec11b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_layouts/post.html @@ -0,0 +1,25 @@ +--- +layout: default +--- +
      + +
      +

      {{ page.title | escape }}

      + +
      + +
      + {{ content }} +
      + + {% if site.disqus.shortname %} + {% include disqus_comments.html %} + {% endif %} +
      diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima.scss b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima.scss new file mode 100644 index 0000000..ff94a8a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima.scss @@ -0,0 +1,49 @@ +@charset "utf-8"; + +// Define defaults for each variable. + +$base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !default; +$base-font-size: 16px !default; +$base-font-weight: 400 !default; +$small-font-size: $base-font-size * 0.875 !default; +$base-line-height: 1.5 !default; + +$spacing-unit: 30px !default; + +$text-color: #111 !default; +$background-color: #fdfdfd !default; +$brand-color: #2a7ae2 !default; + +$grey-color: #828282 !default; +$grey-color-light: lighten($grey-color, 40%) !default; +$grey-color-dark: darken($grey-color, 25%) !default; + +// Width of the content area +$content-width: 800px !default; + +$on-palm: 600px !default; +$on-laptop: 800px !default; + +// Use media queries like this: +// @include media-query($on-palm) { +// .wrapper { +// padding-right: $spacing-unit / 2; +// padding-left: $spacing-unit / 2; +// } +// } +@mixin media-query($device) { + @media screen and (max-width: $device) { + @content; + } +} + +@mixin relative-font-size($ratio) { + font-size: $base-font-size * $ratio; +} + +// Import partials. +@import + "minima/base", + "minima/layout", + "minima/syntax-highlighting" +; diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_base.scss b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_base.scss new file mode 100644 index 0000000..a10fd98 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_base.scss @@ -0,0 +1,215 @@ +/** + * Reset some basic elements + */ +body, h1, h2, h3, h4, h5, h6, +p, blockquote, pre, hr, +dl, dd, ol, ul, figure { + margin: 0; + padding: 0; +} + + + +/** + * Basic styling + */ +body { + font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family; + color: $text-color; + background-color: $background-color; + -webkit-text-size-adjust: 100%; + -webkit-font-feature-settings: "kern" 1; + -moz-font-feature-settings: "kern" 1; + -o-font-feature-settings: "kern" 1; + font-feature-settings: "kern" 1; + font-kerning: normal; +} + + + +/** + * Set `margin-bottom` to maintain vertical rhythm + */ +h1, h2, h3, h4, h5, h6, +p, blockquote, pre, +ul, ol, dl, figure, +%vertical-rhythm { + margin-bottom: $spacing-unit / 2; +} + + + +/** + * Images + */ +img { + max-width: 100%; + vertical-align: middle; +} + + + +/** + * Figures + */ +figure > img { + display: block; +} + +figcaption { + font-size: $small-font-size; +} + + + +/** + * Lists + */ +ul, ol { + margin-left: $spacing-unit; +} + +li { + > ul, + > ol { + margin-bottom: 0; + } +} + + + +/** + * Headings + */ +h1, h2, h3, h4, h5, h6 { + font-weight: $base-font-weight; +} + + + +/** + * Links + */ +a { + color: $brand-color; + text-decoration: none; + + &:visited { + color: darken($brand-color, 15%); + } + + &:hover { + color: $text-color; + text-decoration: underline; + } + + .social-media-list &:hover { + text-decoration: none; + + .username { + text-decoration: underline; + } + } +} + + +/** + * Blockquotes + */ +blockquote { + color: $grey-color; + border-left: 4px solid $grey-color-light; + padding-left: $spacing-unit / 2; + @include relative-font-size(1.125); + letter-spacing: -1px; + font-style: italic; + + > :last-child { + margin-bottom: 0; + } +} + + + +/** + * Code formatting + */ +pre, +code { + @include relative-font-size(0.9375); + border: 1px solid $grey-color-light; + border-radius: 3px; + background-color: #eef; +} + +code { + padding: 1px 5px; +} + +pre { + padding: 8px 12px; + overflow-x: auto; + + > code { + border: 0; + padding-right: 0; + padding-left: 0; + } +} + + + +/** + * Wrapper + */ +.wrapper { + max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2)); + max-width: calc(#{$content-width} - (#{$spacing-unit} * 2)); + margin-right: auto; + margin-left: auto; + padding-right: $spacing-unit; + padding-left: $spacing-unit; + @extend %clearfix; + + @include media-query($on-laptop) { + max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit})); + max-width: calc(#{$content-width} - (#{$spacing-unit})); + padding-right: $spacing-unit / 2; + padding-left: $spacing-unit / 2; + } +} + + + +/** + * Clearfix + */ +%clearfix:after { + content: ""; + display: table; + clear: both; +} + + + +/** + * Icons + */ +.icon > svg { + display: inline-block; + vertical-align: middle; + + path { + fill: $grey-color; + } +} + +.social-media-list { + .icon { + padding-right: 5px; + } + + li + li { + padding-top: 5px; + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_layout.scss b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_layout.scss new file mode 100644 index 0000000..121042b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_layout.scss @@ -0,0 +1,250 @@ +/** + * Site header + */ +.site-header { + border-top: 5px solid $grey-color-dark; + border-bottom: 1px solid $grey-color-light; + min-height: $spacing-unit * 1.865; + + // Positioning context for the mobile navigation icon + position: relative; +} + +.site-title { + @include relative-font-size(1.625); + font-weight: 300; + line-height: $base-line-height * $base-font-size * 2.25; + letter-spacing: -1px; + margin-bottom: 0; + float: left; + + &, + &:visited { + color: $grey-color-dark; + } +} + +.site-nav { + float: right; + line-height: $base-line-height * $base-font-size * 2.25; + + .nav-trigger { + display: none; + } + + .menu-icon { + display: none; + } + + .page-link { + color: $text-color; + line-height: $base-line-height; + + // Gaps between nav items, but not on the last one + &:not(:last-child) { + margin-right: 20px; + } + } + + @include media-query($on-palm) { + position: absolute; + top: 9px; + right: $spacing-unit / 2; + background-color: $background-color; + border: 1px solid $grey-color-light; + border-radius: 5px; + text-align: right; + + label[for="nav-trigger"] { + display: block; + float: right; + width: 36px; + height: 36px; + z-index: 2; + cursor: pointer; + } + + .menu-icon { + display: block; + float: right; + width: 36px; + height: 26px; + line-height: 0; + padding-top: 10px; + text-align: center; + + > svg path { + fill: $grey-color-dark; + } + } + + input ~ .trigger { + clear: both; + display: none; + } + + input:checked ~ .trigger { + display: block; + padding-bottom: 5px; + } + + .page-link { + display: block; + padding: 5px 10px; + + &:not(:last-child) { + margin-right: 0; + } + margin-left: 20px; + } + } +} + + + +/** + * Site footer + */ +.site-footer { + border-top: 1px solid $grey-color-light; + padding: $spacing-unit 0; +} + +.footer-heading { + @include relative-font-size(1.125); + margin-bottom: $spacing-unit / 2; +} + +.contact-list, +.social-media-list { + list-style: none; + margin-left: 0; +} + +.footer-col-wrapper { + @include relative-font-size(0.9375); + color: $grey-color; + margin-left: -$spacing-unit / 2; + @extend %clearfix; +} + +.footer-col { + float: left; + margin-bottom: $spacing-unit / 2; + padding-left: $spacing-unit / 2; +} + +.footer-col-1 { + width: -webkit-calc(35% - (#{$spacing-unit} / 2)); + width: calc(35% - (#{$spacing-unit} / 2)); +} + +.footer-col-2 { + width: -webkit-calc(20% - (#{$spacing-unit} / 2)); + width: calc(20% - (#{$spacing-unit} / 2)); +} + +.footer-col-3 { + width: -webkit-calc(45% - (#{$spacing-unit} / 2)); + width: calc(45% - (#{$spacing-unit} / 2)); +} + +@include media-query($on-laptop) { + .footer-col-1, + .footer-col-2 { + width: -webkit-calc(50% - (#{$spacing-unit} / 2)); + width: calc(50% - (#{$spacing-unit} / 2)); + } + + .footer-col-3 { + width: -webkit-calc(100% - (#{$spacing-unit} / 2)); + width: calc(100% - (#{$spacing-unit} / 2)); + } +} + +@include media-query($on-palm) { + .footer-col { + float: none; + width: -webkit-calc(100% - (#{$spacing-unit} / 2)); + width: calc(100% - (#{$spacing-unit} / 2)); + } +} + + + +/** + * Page content + */ +.page-content { + padding: $spacing-unit 0; +} + +.page-heading { + @include relative-font-size(1.25); +} + +.post-list { + margin-left: 0; + list-style: none; + + > li { + margin-bottom: $spacing-unit; + } +} + +.post-meta { + font-size: $small-font-size; + color: $grey-color; +} + +.post-link { + display: block; + @include relative-font-size(1.5); +} + + + +/** + * Posts + */ +.post-header { + margin-bottom: $spacing-unit; +} + +.post-title { + @include relative-font-size(2.625); + letter-spacing: -1px; + line-height: 1; + + @include media-query($on-laptop) { + @include relative-font-size(2.25); + } +} + +.post-content { + margin-bottom: $spacing-unit; + + h2 { + @include relative-font-size(2); + + @include media-query($on-laptop) { + @include relative-font-size(1.75); + } + } + + h3 { + @include relative-font-size(1.625); + + @include media-query($on-laptop) { + @include relative-font-size(1.375); + } + } + + h4 { + @include relative-font-size(1.25); + + @include media-query($on-laptop) { + @include relative-font-size(1.125); + } + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_syntax-highlighting.scss b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_syntax-highlighting.scss new file mode 100644 index 0000000..bccdb89 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/_sass/minima/_syntax-highlighting.scss @@ -0,0 +1,71 @@ +/** + * Syntax highlighting styles + */ +.highlight { + background: #fff; + @extend %vertical-rhythm; + + .highlighter-rouge & { + background: #eef; + } + + .c { color: #998; font-style: italic } // Comment + .err { color: #a61717; background-color: #e3d2d2 } // Error + .k { font-weight: bold } // Keyword + .o { font-weight: bold } // Operator + .cm { color: #998; font-style: italic } // Comment.Multiline + .cp { color: #999; font-weight: bold } // Comment.Preproc + .c1 { color: #998; font-style: italic } // Comment.Single + .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special + .gd { color: #000; background-color: #fdd } // Generic.Deleted + .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific + .ge { font-style: italic } // Generic.Emph + .gr { color: #a00 } // Generic.Error + .gh { color: #999 } // Generic.Heading + .gi { color: #000; background-color: #dfd } // Generic.Inserted + .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific + .go { color: #888 } // Generic.Output + .gp { color: #555 } // Generic.Prompt + .gs { font-weight: bold } // Generic.Strong + .gu { color: #aaa } // Generic.Subheading + .gt { color: #a00 } // Generic.Traceback + .kc { font-weight: bold } // Keyword.Constant + .kd { font-weight: bold } // Keyword.Declaration + .kp { font-weight: bold } // Keyword.Pseudo + .kr { font-weight: bold } // Keyword.Reserved + .kt { color: #458; font-weight: bold } // Keyword.Type + .m { color: #099 } // Literal.Number + .s { color: #d14 } // Literal.String + .na { color: #008080 } // Name.Attribute + .nb { color: #0086B3 } // Name.Builtin + .nc { color: #458; font-weight: bold } // Name.Class + .no { color: #008080 } // Name.Constant + .ni { color: #800080 } // Name.Entity + .ne { color: #900; font-weight: bold } // Name.Exception + .nf { color: #900; font-weight: bold } // Name.Function + .nn { color: #555 } // Name.Namespace + .nt { color: #000080 } // Name.Tag + .nv { color: #008080 } // Name.Variable + .ow { font-weight: bold } // Operator.Word + .w { color: #bbb } // Text.Whitespace + .mf { color: #099 } // Literal.Number.Float + .mh { color: #099 } // Literal.Number.Hex + .mi { color: #099 } // Literal.Number.Integer + .mo { color: #099 } // Literal.Number.Oct + .sb { color: #d14 } // Literal.String.Backtick + .sc { color: #d14 } // Literal.String.Char + .sd { color: #d14 } // Literal.String.Doc + .s2 { color: #d14 } // Literal.String.Double + .se { color: #d14 } // Literal.String.Escape + .sh { color: #d14 } // Literal.String.Heredoc + .si { color: #d14 } // Literal.String.Interpol + .sx { color: #d14 } // Literal.String.Other + .sr { color: #009926 } // Literal.String.Regex + .s1 { color: #d14 } // Literal.String.Single + .ss { color: #990073 } // Literal.String.Symbol + .bp { color: #999 } // Name.Builtin.Pseudo + .vc { color: #008080 } // Name.Variable.Class + .vg { color: #008080 } // Name.Variable.Global + .vi { color: #008080 } // Name.Variable.Instance + .il { color: #099 } // Literal.Number.Integer.Long +} diff --git a/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/assets/main.scss b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/assets/main.scss new file mode 100644 index 0000000..c60ebe4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/minima-2.1.1/assets/main.scss @@ -0,0 +1,5 @@ +--- +# Only the main Sass file needs front matter (the dashes are enough) +--- + +@import "minima"; diff --git a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Gemfile b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Gemfile new file mode 100644 index 0000000..60ea36c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Gemfile @@ -0,0 +1,22 @@ +# Frozen-string-literal: true +# Copyright: 2015 - 2017 Jordon Bedwell - MIT License +# Encoding: utf-8 + +source "https://rubygems.org" +gem "rake", :require => false +gemspec + +group :test do + gem "safe_yaml", :require => false + gem "luna-rspec-formatters", :require => false + gem "simplecov", :require => false +end + +group :development do + gem "rspec", :require => false + gem "rspec-helpers", :require => false + gem "rubocop", :github => "bbatsov/rubocop", :require => false + gem "benchmark-ips", :require => false + gem "simple-ansi", :require => false + gem "pry", :require => false +end diff --git a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/LICENSE b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/LICENSE new file mode 100644 index 0000000..139db79 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015 - 2017 Jordon Bedwell + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Rakefile b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Rakefile new file mode 100644 index 0000000..58aaac7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Rakefile @@ -0,0 +1,81 @@ +# Frozen-string-literal: true +# Copyright: 2015 - 2017 Jordon Bedwell - MIT License +# Encoding: utf-8 + +require "open3" +require "rspec/core/rake_task" +require_relative "benchmark/support/task" +require "rubocop/rake_task" +require "simple/ansi" +require "pathutil" +require "json" + +# -- + +task :default => [ + ENV["BENCHMARK"] ? :benchmark : :spec +] + +# -- + +BenchmarkTask.new :benchmark +RSpec::Core::RakeTask.new :spec +task :test => :spec + +# -- + +namespace :diff do + desc "List methods we have that Pathname doesn't." + task :methods do + methods = Pathutil.instance_methods - Pathname.instance_methods - Object.instance_methods + methods.each do |method| + $stdout.print "- ", "`", method, "`", "\n" + end + end +end + +# -- + +namespace :missing do + desc "List methods we are missing." + task :methods do + methods = Pathname.instance_methods - Pathutil.instance_methods - Object.instance_methods + methods-= [ + :cleanpath + ] + + methods.each do |method| + $stdout.puts method + end + end +end + +# -- + +namespace :pathname do + desc "List all of Pathnames methods." + task :methods do + methods = Pathname.instance_methods - Object.instance_methods + methods.each_with_index do |method, index| + $stdout.print method + unless index == methods.size - 1 + $stdout.print ", " + end + end + + $stdout.puts + end +end + +# -- + +desc "List all of Pathutils methods." +task :methods do + methods = Pathutil.instance_methods - Object.instance_methods + methods.each_with_index do |method, index| + $stdout.print "`", method, "`" + $stdout.print ", " unless index == methods.size - 1 + end + + $stdout.puts +end diff --git a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil.rb b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil.rb new file mode 100644 index 0000000..1a15873 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil.rb @@ -0,0 +1,909 @@ +# Frozen-string-literal: true +# Copyright: 2015 - 2017 Jordon Bedwell - MIT License +# Encoding: utf-8 + +require "pathutil/helpers" +require "forwardable/extended" +require "find" + +class Pathutil + attr_writer :encoding + extend Forwardable::Extended + extend Helpers + + # -- + # @note A lot of this class can be compatible with Pathname. + # Initialize a new instance. + # @return Pathutil + # -- + def initialize(path) + return @path = path if path.is_a?(String) + return @path = path.to_path if path.respond_to?(:to_path) + return @path = path.to_s + end + + # -- + # Make a path relative. + # -- + def relative + return self if relative? + self.class.new(strip_windows_drive.gsub( + %r!\A(\\+|/+)!, "" + )) + end + + # -- + # Make a path absolute + # -- + def absolute + return self if absolute? + self.class.new("/").join( + @path + ) + end + + # -- + # @see Pathname#cleanpath. + # @note This is a wholesale rip and cleanup of Pathname#cleanpath + # @return Pathutil + # -- + def cleanpath(symlink = false) + symlink ? conservative_cleanpath : aggressive_cleanpath + end + + # -- + # @yield Pathutil + # @note It will return all results that it finds across all ascending paths. + # @example Pathutil.new("~/").expand_path.search_backwards(".bashrc") => [#] + # Search backwards for a file (like Rakefile, _config.yml, opts.yml). + # @return Enum + # -- + def search_backwards(file, backwards: Float::INFINITY) + ary = [] + + ascend.with_index(1).each do |path, index| + if index > backwards + break + + else + Dir.chdir path do + if block_given? + file = self.class.new(file) + if yield(file) + ary.push( + file + ) + end + + elsif File.exist?(file) + ary.push(self.class.new( + path.join(file) + )) + end + end + end + end + + ary + end + + # -- + # Read the file as a YAML file turning it into an object. + # @see self.class.load_yaml as this a direct alias of that method. + # @return Hash + # -- + def read_yaml(throw_missing: false, **kwd) + self.class.load_yaml( + read, **kwd + ) + + rescue Errno::ENOENT + throw_missing ? raise : ( + return {} + ) + end + + # -- + # Read the file as a JSON file turning it into an object. + # @see self.class.read_json as this is a direct alias of that method. + # @return Hash + # -- + def read_json(throw_missing: false) + JSON.parse( + read + ) + + rescue Errno::ENOENT + throw_missing ? raise : ( + return {} + ) + end + + # -- + # @note The blank part is intentionally left there so that you can rejoin. + # Splits the path into all parts so that you can do step by step comparisons + # @example Pathutil.new("/my/path").split_path # => ["", "my", "path"] + # @return Array + # -- + def split_path + @path.split( + %r!\\+|/+! + ) + end + + # -- + # @see `String#==` for more details. + # A stricter version of `==` that also makes sure the object matches. + # @return true|false + # -- + def ===(other) + other.is_a?(self.class) && @path == other + end + + # -- + # @example Pathutil.new("/hello") >= Pathutil.new("/") # => true + # @example Pathutil.new("/hello") >= Pathutil.new("/hello") # => true + # Checks to see if a path falls within a path and deeper or is the other. + # @return true|false + # -- + def >=(other) + mine, other = expanded_paths(other) + return true if other == mine + mine.in_path?(other) + end + + # -- + # @example Pathutil.new("/hello/world") > Pathutil.new("/hello") # => true + # Strictly checks to see if a path is deeper but within the path of the other. + # @return true|false + # -- + def >(other) + mine, other = expanded_paths(other) + return false if other == mine + mine.in_path?(other) + end + + # -- + # @example Pathutil.new("/") < Pathutil.new("/hello") # => true + # Strictly check to see if a path is behind other path but within it. + # @return true|false + # -- + def <(other) + mine, other = expanded_paths(other) + return false if other == mine + other.in_path?(mine) + end + + # -- + # Check to see if a path is behind the other path but within it. + # @example Pathutil.new("/hello") < Pathutil.new("/hello") # => true + # @example Pathutil.new("/") < Pathutil.new("/hello") # => true + # @return true|false + # -- + def <=(other) + mine, other = expanded_paths(other) + return true if other == mine + other.in_path?(mine) + end + + # -- + # @note "./" is considered relative. + # Check to see if the path is absolute, as in: starts with "/" + # @return true|false + # -- + def absolute? + return !!( + @path =~ %r!\A(?:[A-Za-z]:)?(?:\\+|/+)! + ) + end + + # -- + # @yield Pathutil + # Break apart the path and yield each with the previous parts. + # @example Pathutil.new("/hello/world").ascend.to_a # => ["/", "/hello", "/hello/world"] + # @example Pathutil.new("/hello/world").ascend { |path| $stdout.puts path } + # @return Enum + # -- + def ascend + unless block_given? + return to_enum( + __method__ + ) + end + + yield( + path = self + ) + + while (new_path = path.dirname) + if path == new_path || new_path == "." + break + else + path = new_path + yield new_path + end + end + + nil + end + + # -- + # @yield Pathutil + # Break apart the path in reverse order and descend into the path. + # @example Pathutil.new("/hello/world").descend.to_a # => ["/hello/world", "/hello", "/"] + # @example Pathutil.new("/hello/world").descend { |path| $stdout.puts path } + # @return Enum + # -- + def descend + unless block_given? + return to_enum( + __method__ + ) + end + + ascend.to_a.reverse_each do |val| + yield val + end + + nil + end + + # -- + # @yield Pathutil + # @example Pathutil.new("/hello/world").each_line { |line| $stdout.puts line } + # Wraps `readlines` and allows you to yield on the result. + # @return Enum + # -- + def each_line + return to_enum(__method__) unless block_given? + readlines.each do |line| + yield line + end + + nil + end + + # -- + # @example Pathutil.new("/hello").fnmatch?("/hello") # => true + # Unlike traditional `fnmatch`, with this one `Regexp` is allowed. + # @example Pathutil.new("/hello").fnmatch?(/h/) # => true + # @see `File#fnmatch` for more information. + # @return true|false + # -- + def fnmatch?(matcher) + matcher.is_a?(Regexp) ? !!(self =~ matcher) : \ + File.fnmatch(matcher, self) + end + + # -- + # Allows you to quickly determine if the file is the root folder. + # @return true|false + # -- + def root? + !!(self =~ %r!\A(?:[A-Za-z]:)?(?:\\+|/+)\z!) + end + + # -- + # Allows you to check if the current path is in the path you want. + # @return true|false + # -- + def in_path?(path) + path = self.class.new(path).expand_path.split_path + mine = (symlink?? expand_path.realpath : expand_path).split_path + path.each_with_index { |part, index| return false if mine[index] != part } + true + end + + # -- + def inspect + "#<#{self.class}:#{@path}>" + end + + # -- + # @return Array + # Grab all of the children from the current directory, including hidden. + # @yield Pathutil + # -- + def children + ary = [] + + Dir.foreach(@path) do |path| + if path == "." || path == ".." + next + else + path = self.class.new(File.join(@path, path)) + yield path if block_given? + ary.push( + path + ) + end + end + + ary + end + + # -- + # @yield Pathutil + # Allows you to glob however you wish to glob in the current `Pathutil` + # @see `File::Constants` for a list of flags. + # @return Enum + # -- + def glob(pattern, flags = 0) + unless block_given? + return to_enum( + __method__, pattern, flags + ) + end + + chdir do + Dir.glob(pattern, flags).each do |file| + yield self.class.new( + File.join(@path, file) + ) + end + end + + nil + end + + # -- + # @yield &block + # Move to the current directory temporarily (or for good) and do work son. + # @note you do not need to ship a block at all. + # @return nil + # -- + def chdir + if !block_given? + Dir.chdir( + @path + ) + + else + Dir.chdir @path do + yield + end + end + end + + # -- + # @yield Pathutil + # Find all files without care and yield the given block. + # @return Enum + # -- + def find + return to_enum(__method__) unless block_given? + Find.find @path do |val| + yield self.class.new(val) + end + end + + # -- + # @yield Pathutil + # Splits the path returning each part (filename) back to you. + # @return Enum + # -- + def each_filename + return to_enum(__method__) unless block_given? + @path.split(File::SEPARATOR).delete_if(&:empty?).each do |file| + yield file + end + end + + # -- + # Get the parent of the current path. + # @note This will simply return self if "/". + # @return Pathutil + # -- + def parent + return self if @path == "/" + self.class.new(absolute?? File.dirname(@path) : File.join( + @path, ".." + )) + end + + # -- + # @yield Pathutil + # Split the file into its dirname and basename, so you can do stuff. + # @return nil + # -- + def split + File.split(@path).collect! do |path| + self.class.new(path) + end + end + + # -- + # @note Your extension should start with "." + # Replace a files extension with your given extension. + # @return Pathutil + # -- + def sub_ext(ext) + self.class.new(@path.chomp(File.extname(@path)) + ext) + end + + # -- + # A less complex version of `relative_path_from` that simply uses a + # `Regexp` and returns the full path if it cannot be determined. + # @return Pathutil + # -- + def relative_path_from(from) + from = self.class.new(from).expand_path.gsub(%r!/$!, "") + self.class.new(expand_path.gsub(%r!^#{ + from.regexp_escape + }/!, "")) + end + + # -- + # Expands the path and left joins the root to the path. + # @return Pathutil + # -- + def enforce_root(root) + return self if !relative? && in_path?(root) + self.class.new(root).join( + self + ) + end + + # -- + # Copy a directory, allowing symlinks if the link falls inside of the root. + # This is indented for people who wish some safety to their copies. + # @note Ignore is ignored on safe_copy file because it's explicit. + # @return nil + # -- + def safe_copy(to, root: nil, ignore: []) + raise ArgumentError, "must give a root" unless root + root = self.class.new(root) + to = self.class.new(to) + + if directory? + safe_copy_directory(to, { + :root => root, :ignore => ignore + }) + + else + safe_copy_file(to, { + :root => root + }) + end + end + + # -- + # @see `self.class.normalize` as this is an alias. + # -- + def normalize + return @normalize ||= begin + self.class.normalize + end + end + + # -- + # @see `self.class.encoding` as this is an alias. + # -- + def encoding + return @encoding ||= begin + self.class.encoding + end + end + + # -- + # @note You can set the default encodings via the class. + # Read took two steroid shots: it can normalize your string, and encode. + # @return String + # -- + def read(*args, **kwd) + kwd[:encoding] ||= encoding + + if normalize[:read] + File.read(self, *args, kwd).encode({ + :universal_newline => true + }) + + else + File.read( + self, *args, kwd + ) + end + end + + # -- + # @note You can set the default encodings via the class. + # Binread took two steroid shots: it can normalize your string, and encode. + # @return String + # -- + def binread(*args, **kwd) + kwd[:encoding] ||= encoding + + if normalize[:read] + File.binread(self, *args, kwd).encode({ + :universal_newline => true + }) + + else + File.read( + self, *args, kwd + ) + end + end + + # -- + # @note You can set the default encodings via the class. + # Readlines took two steroid shots: it can normalize your string, and encode. + # @return Array + # -- + def readlines(*args, **kwd) + kwd[:encoding] ||= encoding + + if normalize[:read] + File.readlines(self, *args, kwd).encode({ + :universal_newline => true + }) + + else + File.readlines( + self, *args, kwd + ) + end + end + + # -- + # @note You can set the default encodings via the class. + # Write took two steroid shots: it can normalize your string, and encode. + # @return Fixnum + # -- + def write(data, *args, **kwd) + kwd[:encoding] ||= encoding + + if normalize[:write] + File.write(self, data.encode( + :crlf_newline => true + ), *args, kwd) + + else + File.write( + self, data, *args, kwd + ) + end + end + + # -- + # @note You can set the default encodings via the class. + # Binwrite took two steroid shots: it can normalize your string, and encode. + # @return Fixnum + # -- + def binwrite(data, *args, **kwd) + kwd[:encoding] ||= encoding + + if normalize[:write] + File.binwrite(self, data.encode( + :crlf_newline => true + ), *args, kwd) + + else + File.binwrite( + self, data, *args, kwd + ) + end + end + + # -- + def to_regexp(guard: true) + Regexp.new((guard ? "\\A" : "") + Regexp.escape( + self + )) + end + + # -- + # Strips the windows drive from the path. + # -- + def strip_windows_drive(path = @path) + self.class.new(path.gsub( + %r!\A[A-Za-z]:(?:\\+|/+)!, "" + )) + end + + # -- + # rubocop:disable Metrics/AbcSize + # rubocop:disable Metrics/CyclomaticComplexity + # rubocop:disable Metrics/PerceivedComplexity + # -- + + def aggressive_cleanpath + return self.class.new("/") if root? + + _out = split_path.each_with_object([]) do |part, out| + next if part == "." || (part == ".." && out.last == "") + if part == ".." && out.last && out.last != ".." + out.pop + + else + out.push( + part + ) + end + end + + # -- + + return self.class.new("/") if _out == [""].freeze + return self.class.new(".") if _out.empty? && (end_with?(".") || relative?) + self.class.new(_out.join("/")) + end + + # -- + def conservative_cleanpath + _out = split_path.each_with_object([]) do |part, out| + next if part == "." || (part == ".." && out.last == "") + out.push( + part + ) + end + + # -- + + if !_out.empty? && basename == "." && _out.last != "" && _out.last != ".." + _out << "." + end + + # -- + + return self.class.new("/") if _out == [""].freeze + return self.class.new(".") if _out.empty? && (end_with?(".") || relative?) + return self.class.new(_out.join("/")).join("") if @path =~ %r!/\z! \ + && _out.last != "." && _out.last != ".." + self.class.new(_out.join("/")) + end + + # -- + # rubocop:enable Metrics/AbcSize + # rubocop:enable Metrics/CyclomaticComplexity + # rubocop:enable Metrics/PerceivedComplexity + # Expand the paths and return. + # -- + private + def expanded_paths(path) + return expand_path, self.class.new(path).expand_path + end + + # -- + # Safely copy a file. + # -- + private + def safe_copy_file(to, root: nil) + raise Errno::EPERM, "#{self} not in #{root}" unless in_path?(root) + FileUtils.cp(self, to, { + :preserve => true + }) + end + + # -- + # Safely copy a directory and it's sub-files. + # -- + private + def safe_copy_directory(to, root: nil, ignore: []) + ignore = [ignore].flatten.uniq + + if !in_path?(root) + raise Errno::EPERM, "#{self} not in #{ + root + }" + + else + to.mkdir_p unless to.exist? + children do |file| + unless ignore.any? { |path| file.in_path?(path) } + if !file.in_path?(root) + raise Errno::EPERM, "#{file} not in #{ + root + }" + + elsif file.file? + FileUtils.cp(file, to, { + :preserve => true + }) + + else + path = file.realpath + path.safe_copy(to.join(file.basename), { + :root => root, :ignore => ignore + }) + end + end + end + end + end + + class << self + attr_writer :encoding + + # -- + # @note We do nothing special here. + # Get the current directory that Ruby knows about. + # @return Pathutil + # -- + def pwd + new( + Dir.pwd + ) + end + + alias gcwd pwd + alias cwd pwd + + # -- + # @note you are encouraged to override this if you need to. + # Aliases the default system encoding to us so that we can do most read + # and write operations with that encoding, instead of being crazy. + # -- + def encoding + return @encoding ||= begin + Encoding.default_external + end + end + + # -- + # Normalize CRLF -> LF on Windows reads, to ease your troubles. + # Normalize LF -> CLRF on Windows write, to ease your troubles. + # -- + def normalize + return @normalize ||= { + :read => Gem.win_platform?, + :write => Gem.win_platform? + } + end + + # -- + # Make a temporary directory. + # @note if you adruptly exit it will not remove the dir. + # @note this directory is removed on exit. + # @return Pathutil + # -- + def tmpdir(*args) + rtn = new(make_tmpname(*args)).tap(&:mkdir) + ObjectSpace.define_finalizer(rtn, proc do + rtn.rm_rf + end) + + rtn + end + + # -- + # Make a temporary file. + # @note if you adruptly exit it will not remove the dir. + # @note this file is removed on exit. + # @return Pathutil + # -- + def tmpfile(*args) + rtn = new(make_tmpname(*args)).tap(&:touch) + ObjectSpace.define_finalizer(rtn, proc do + rtn.rm_rf + end) + + rtn + end + end + + # -- + + rb_delegate :gcwd, :to => :"self.class" + rb_delegate :pwd, :to => :"self.class" + + # -- + + rb_delegate :sub, :to => :@path, :wrap => true + rb_delegate :chomp, :to => :@path, :wrap => true + rb_delegate :gsub, :to => :@path, :wrap => true + rb_delegate :[], :to => :@path + rb_delegate :=~, :to => :@path + rb_delegate :==, :to => :@path + rb_delegate :to_s, :to => :@path + rb_delegate :freeze, :to => :@path + rb_delegate :end_with?, :to => :@path + rb_delegate :start_with?, :to => :@path + rb_delegate :frozen?, :to => :@path + rb_delegate :to_str, :to => :@path + rb_delegate :"!~", :to => :@path + rb_delegate :<=>, :to => :@path + + # -- + + rb_delegate :chmod, :to => :File, :args => { :after => :@path } + rb_delegate :lchown, :to => :File, :args => { :after => :@path } + rb_delegate :lchmod, :to => :File, :args => { :after => :@path } + rb_delegate :chown, :to => :File, :args => { :after => :@path } + rb_delegate :basename, :to => :File, :args => :@path, :wrap => true + rb_delegate :dirname, :to => :File, :args => :@path, :wrap => true + rb_delegate :readlink, :to => :File, :args => :@path, :wrap => true + rb_delegate :expand_path, :to => :File, :args => :@path, :wrap => true + rb_delegate :realdirpath, :to => :File, :args => :@path, :wrap => true + rb_delegate :realpath, :to => :File, :args => :@path, :wrap => true + rb_delegate :rename, :to => :File, :args => :@path, :wrap => true + rb_delegate :join, :to => :File, :args => :@path, :wrap => true + rb_delegate :empty?, :to => :file, :args => :@path + rb_delegate :size, :to => :File, :args => :@path + rb_delegate :link, :to => :File, :args => :@path + rb_delegate :atime, :to => :File, :args => :@path + rb_delegate :ctime, :to => :File, :args => :@path + rb_delegate :lstat, :to => :File, :args => :@path + rb_delegate :utime, :to => :File, :args => :@path + rb_delegate :sysopen, :to => :File, :args => :@path + rb_delegate :birthtime, :to => :File, :args => :@path + rb_delegate :mountpoint?, :to => :File, :args => :@path + rb_delegate :truncate, :to => :File, :args => :@path + rb_delegate :symlink, :to => :File, :args => :@path + rb_delegate :extname, :to => :File, :args => :@path + rb_delegate :zero?, :to => :File, :args => :@path + rb_delegate :ftype, :to => :File, :args => :@path + rb_delegate :mtime, :to => :File, :args => :@path + rb_delegate :open, :to => :File, :args => :@path + rb_delegate :stat, :to => :File, :args => :@path + + # -- + + rb_delegate :pipe?, :to => :FileTest, :args => :@path + rb_delegate :file?, :to => :FileTest, :args => :@path + rb_delegate :owned?, :to => :FileTest, :args => :@path + rb_delegate :setgid?, :to => :FileTest, :args => :@path + rb_delegate :socket?, :to => :FileTest, :args => :@path + rb_delegate :readable?, :to => :FileTest, :args => :@path + rb_delegate :blockdev?, :to => :FileTest, :args => :@path + rb_delegate :directory?, :to => :FileTest, :args => :@path + rb_delegate :readable_real?, :to => :FileTest, :args => :@path + rb_delegate :world_readable?, :to => :FileTest, :args => :@path + rb_delegate :executable_real?, :to => :FileTest, :args => :@path + rb_delegate :world_writable?, :to => :FileTest, :args => :@path + rb_delegate :writable_real?, :to => :FileTest, :args => :@path + rb_delegate :executable?, :to => :FileTest, :args => :@path + rb_delegate :writable?, :to => :FileTest, :args => :@path + rb_delegate :grpowned?, :to => :FileTest, :args => :@path + rb_delegate :chardev?, :to => :FileTest, :args => :@path + rb_delegate :symlink?, :to => :FileTest, :args => :@path + rb_delegate :sticky?, :to => :FileTest, :args => :@path + rb_delegate :setuid?, :to => :FileTest, :args => :@path + rb_delegate :exist?, :to => :FileTest, :args => :@path + rb_delegate :size?, :to => :FileTest, :args => :@path + + # -- + + rb_delegate :rm_rf, :to => :FileUtils, :args => :@path + rb_delegate :rm_r, :to => :FileUtils, :args => :@path + rb_delegate :rm_f, :to => :FileUtils, :args => :@path + rb_delegate :rm, :to => :FileUtils, :args => :@path + rb_delegate :cp_r, :to => :FileUtils, :args => :@path + rb_delegate :touch, :to => :FileUtils, :args => :@path + rb_delegate :mkdir_p, :to => :FileUtils, :args => :@path + rb_delegate :mkpath, :to => :FileUtils, :args => :@path + rb_delegate :cp, :to => :FileUtils, :args => :@path + + # -- + + rb_delegate :each_child, :to => :children + rb_delegate :each_entry, :to => :children + rb_delegate :to_a, :to => :children + + # -- + + rb_delegate :opendir, :to => :Dir, :alias_of => :open + rb_delegate :relative?, :to => :self, :alias_of => :absolute?, :bool => :reverse + rb_delegate :regexp_escape, :to => :Regexp, :args => :@path, :alias_of => :escape + rb_delegate :shellescape, :to => :Shellwords, :args => :@path + rb_delegate :mkdir, :to => :Dir, :args => :@path + + # -- + + alias + join + alias delete rm + alias rmtree rm_r + alias to_path to_s + alias last basename + alias entries children + alias make_symlink symlink + alias cleanpath_conservative conservative_cleanpath + alias cleanpath_aggressive aggressive_cleanpath + alias prepend enforce_root + alias fnmatch fnmatch? + alias make_link link + alias first dirname + alias rmdir rm_r + alias unlink rm + alias / join +end diff --git a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/helpers.rb b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/helpers.rb new file mode 100644 index 0000000..bec5f70 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/helpers.rb @@ -0,0 +1,111 @@ +# Frozen-string-literal: true +# Copyright: 2015 - 2017 Jordon Bedwell - MIT License +# Encoding: utf-8 + +class Pathutil + module Helpers + extend self + + # -- + + def allowed + return @allowed ||= begin + { + :yaml => { + :classes => [], + :symbols => [] + } + } + end + end + + # -- + # Wraps around YAML and SafeYAML to provide alternatives to Rubies. + # @note We default aliases to yes so we can detect if you explicit true. + # @return Hash + # -- + def load_yaml(data, safe: true, whitelist_classes: allowed[:yaml][:classes], \ + whitelist_symbols: allowed[:yaml][:symbols], aliases: :yes) + + require "yaml" + unless safe + return YAML.load( + data + ) + end + + if !YAML.respond_to?(:safe_load) + setup_safe_yaml whitelist_classes, aliases + SafeYAML.load( + data + ) + + else + YAML.safe_load( + data, + whitelist_classes, + whitelist_symbols, + aliases + ) + end + end + + # -- + # Make a temporary name suitable for temporary files and directories. + # @return String + # -- + def make_tmpname(prefix = "", suffix = nil, root = nil) + prefix = tmpname_prefix(prefix) + suffix = tmpname_suffix(suffix) + + root ||= Dir::Tmpname.tmpdir + File.join(root, Dir::Tmpname.make_tmpname( + prefix, suffix + )) + end + + # -- + private + def tmpname_suffix(suffix) + suffix = suffix.join("-") if suffix.is_a?(Array) + suffix = suffix.gsub(/\A\-/, "") unless !suffix || suffix.empty? + suffix + end + + # -- + # Cleanup the temp name prefix, joining if necessary. + # rubocop:disable Style/ParallelAssignment + # -- + private + def tmpname_prefix(prefix) + ext, prefix = prefix, "" if !prefix.is_a?(Array) && prefix.start_with?(".") + ext = prefix.pop if prefix.is_a?(Array) && prefix[-1].start_with?(".") + prefix = prefix.join("-") if prefix.is_a?(Array) + + unless prefix.empty? + prefix = prefix.gsub(/\-\Z/, "") \ + + "-" + end + + return [ + prefix, ext || "" + ] + end + + # -- + # Wrap around, cleanup, deprecate and use SafeYAML. + # rubocop:enable Style/ParallelAssignment + # -- + private + def setup_safe_yaml(whitelist_classes, aliases) + warn "WARN: SafeYAML does not support disabling of aliases." if aliases && aliases != :yes + warn "WARN: SafeYAML will be removed when Ruby 2.0 goes EOL." + require "safe_yaml/load" + + SafeYAML.restore_defaults! + whitelist_classes.map(&SafeYAML.method( + :whitelist_class! + )) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/version.rb b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/version.rb new file mode 100644 index 0000000..7bb2e86 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/version.rb @@ -0,0 +1,7 @@ +# Frozen-string-literal: true +# Copyright: 2015 - 2017 Jordon Bedwell - MIT License +# Encoding: utf-8 + +class Pathutil + VERSION = "0.16.1" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.gitignore b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.gitignore new file mode 100644 index 0000000..9e5a30a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.gitignore @@ -0,0 +1,11 @@ +# Bundler +.bundle +Gemfile.lock +pkg/* + +# Rubinius +*.rbc + +# YARD +.yardoc +yardoc/ diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.rubocop.yml b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.rubocop.yml new file mode 100644 index 0000000..38af0d3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.rubocop.yml @@ -0,0 +1,32 @@ +inherit_from: + - .rubocop_defaults.yml + +AllCops: + Exclude: + # Exclude .gemspec files because they are generally auto-generated + - '*.gemspec' + # Exclude vendored folders + - 'tmp/**/*' + - 'vendor/**/*' + # Exclude artifacts + - 'pkg/**/*' + # Other + - 'test/benchmarks/**/*' + - 'test/profilers/**/*' + +Style/ClassAndModuleChildren: + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# Dear Rubocop, I don't want to use String#strip_heredoc +Layout/IndentHeredoc: + Enabled: false + +Style/WordArray: + Enabled: false + MinSize: 3 + +Style/SymbolArray: + Enabled: false + MinSize: 3 diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.rubocop_defaults.yml b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.rubocop_defaults.yml new file mode 100644 index 0000000..1e73daa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.rubocop_defaults.yml @@ -0,0 +1,177 @@ +AllCops: + Exclude: + # Exclude .gemspec files because they are generally auto-generated + - '*.gemspec' + # Exclude vendored folders + - 'tmp/**/*' + - 'vendor/**/*' + +Lint/RescueWithoutErrorClass: + Enabled: false + +# [codesmell] +Metrics/AbcSize: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/BlockLength: + Enabled: false + +# [codesmell] +Metrics/CyclomaticComplexity: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/ClassLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/LineLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + Max: 100 + +# [codesmell] +Metrics/MethodLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + Max: 10 + +# [codesmell] +Metrics/ModuleLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/ParameterLists: + Enabled: false + Max: 5 + +# [codesmell] +Metrics/PerceivedComplexity: + Enabled: false + +# [codesmell] +# I don't really get the point of this cop. +Performance/RedundantMerge: + Enabled: false + +# Do not use "and" or "or" in conditionals, but for readability we can use it +# to chain executions. Just beware of operator order. +Style/AndOr: + EnforcedStyle: conditionals + +Style/Documentation: + Exclude: + - 'spec/**/*' + - 'test/**/*' + +# Double empty lines are useful to separate conceptually different methods +# in the same class or module. +Layout/EmptyLines: + Enabled: false + +# In most cases, a space is nice. Sometimes, it's not. +# Just be consistent with the rest of the surrounding code. +Layout/EmptyLinesAroundClassBody: + Enabled: false + +# In most cases, a space is nice. Sometimes, it's not. +# Just be consistent with the rest of the surrounding code. +Layout/EmptyLinesAroundModuleBody: + Enabled: false + +# This is quite buggy, as it doesn't recognize double lines. +# Double empty lines are useful to separate conceptually different methods +# in the same class or module. +Layout/EmptyLineBetweenDefs: + Enabled: false + +# I personally don't care about the format style. +# In most cases I like to use %, but not at the point I want to enforce it +# as a convention in the entire code. +Style/FormatString: + Enabled: false + +# Prefer the latest Hash syntax +Style/HashSyntax: + Exclude: + # But Rakefiles generally have some definition like + # :default => :test + # that looks nicer with the old rocket syntax. + - 'Rakefile' + +# Array indentation should be considered like MultilineMethodCallIndentation indentation +# and use 4 spaces instead of 2. +Layout/IndentArray: + IndentationWidth: 4 + +# Hash indentation should be considered like MultilineMethodCallIndentation indentation +# and use 4 spaces instead of 2. +Layout/IndentHash: + IndentationWidth: 4 + +# Multi-line differs from standard indentation, they are indented twice. +Layout/MultilineMethodCallIndentation: + EnforcedStyle: indented + IndentationWidth: 4 + +# unless is not always cool. +Style/NegatedIf: + Enabled: false + +# For years, %w() has been the de-facto standard. A lot of libraries are using (). +# Switching to [] would be a nightmare. +Style/PercentLiteralDelimiters: + Enabled: false + +# There are cases were the inline rescue is ok. We can either downgrade the severity, +# or rely on the developer judgement on a case-by-case basis. +Style/RescueModifier: + Enabled: false + +# Sorry, but using trailing spaces helps readability. +# +# %w( foo bar ) +# +# looks better to me than +# +# %w( foo bar ) +# +Layout/SpaceInsidePercentLiteralDelimiters: + Enabled: false + +# Hate It or Love It, I prefer double quotes as this is more consistent +# with several other programming languages and the output of puts and inspect. +Style/StringLiterals: + EnforcedStyle: double_quotes + +# It's nice to be consistent. The trailing comma also allows easy reordering, +# and doesn't cause a diff in Git when you add a line to the bottom. +Style/TrailingCommaInLiteral: + EnforcedStyleForMultiline: consistent_comma + +Style/TrivialAccessors: + # IgnoreClassMethods because I want to be able to define class-level accessors + # that sets an instance variable on the metaclass, such as: + # + # def self.default=(value) + # @default = value + # end + # + IgnoreClassMethods: true diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.ruby-gemset b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.ruby-gemset new file mode 100644 index 0000000..06070ae --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.ruby-gemset @@ -0,0 +1 @@ +publicsuffix \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.travis.yml b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.travis.yml new file mode 100644 index 0000000..3542f98 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.travis.yml @@ -0,0 +1,24 @@ +language: ruby + +rvm: + - 2.1 + - 2.2 + - 2.3 + - 2.4 + - jruby-9.1.5.0 + - ruby-head + +env: + - COVERALL=1 + +cache: + - bundler + +matrix: + allow_failures: + - rvm: ruby-head + - rvm: jruby-9.1.0.0 + +before_install: + - rvm get latest + - gem install bundler diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.yardopts b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.yardopts new file mode 100644 index 0000000..0a782de --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/.yardopts @@ -0,0 +1 @@ +--title 'Ruby Public Suffix API Documentation' diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/2.0-Upgrade.md b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/2.0-Upgrade.md new file mode 100644 index 0000000..1a10bfb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/2.0-Upgrade.md @@ -0,0 +1,52 @@ +# Welcome to PublicSuffix 2.0! + +PublicSuffix 2.0 contains a rewritten internal representation and comparison logic, that drastically increases the lookup performance. The new version also changes several internal and external API. + +This document documents the most relevant changes to help you upgrading from PublicSuffix 1.0 to 2.0. + +## What's New + +- The library is now 100% compliants with the official PublicSuffix tests. The major breaking change you may experience, is that if a domain passed as input doesn't match any rule, the rule `*` is assumed. You can override this behavior by passing a custom default rule with the `default_rule` option. The old behavior can be restored by passing `default_rule: nil`. +- `PublicSuffix.domain` is a new method that parses the input and returns the domain (combination of second level domain + suffix). This is a convenient helper to parse a domain name, for example when you need to determine the cookie or SSL scope. +- Added the ability to disable the use of private domains either at runtime, in addition to the ability to not load the private domains section when reading the list (`private_domains: false`). This feature also superseded the `private_domains` class-level attribute, that is no longer available. + +## Upgrade + +When upgrading, here's the most relevant changes to keep an eye on: + +- Several futile utility helpers were removed, such as `Domain#rule`, `Domain#is_a_domain?`, `Domain#is_a_subdomain?`, `Domain#valid?`. You can easily obtain the same result by having a custom method that reconstructs the logic, and/or calling `PublicSuffix.{domain|parse}(domain.to_s)`. +- `PublicSuffix::List.private_domains` is no longer available. Instead, you now have two ways to enable/disable the private domains: + + 1. At runtime, by using the `ignore_private` option + + ```ruby + PublicSuffix.domain("something.blogspot.com", ignore_private: true) + ``` + + 1. Loading a filtered list: + + ```ruby + # Disable support for private TLDs + PublicSuffix::List.default = PublicSuffix::List.parse(File.read(PublicSuffix::List::DEFAULT_LIST_PATH), private_domains: false) + # => "blogspot.com" + PublicSuffix.domain("something.blogspot.com") + # => "blogspot.com" + ``` +- Now that the library is 100% compliant with the official PublicSuffix algorithm, if a domain passed as input doesn't match any rule, the wildcard rule `*` is assumed. This means that unlisted TLDs will be considered valid by default, when they would have been invalid in 1.x. However, you can override this behavior to emulate the 1.x behavior if needed: + + ```ruby + # 1.x: + + PublicSuffix.valid?("google.commm") + # => false + + # 2.x: + + PublicSuffix.valid?("google.commm") + # => true + + # Overriding 2.x behavior if needed: + + PublicSuffix.valid?("google.commm", default_rule: nil) + # => false + ```` diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/CHANGELOG.md b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/CHANGELOG.md new file mode 100644 index 0000000..57cf390 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/CHANGELOG.md @@ -0,0 +1,330 @@ +# Changelog + + +#### Release 3.0.1 + +- CHANGED: Updated definitions. +- CHANGED: Improve performance and avoid allocation (GH-146). [Thanks @robholland] + + +#### Release 3.0.0 + +This new version includes a major redesign of the library internals, with the goal to drastically +improve the lookup time while reducing storage space. + +For this reason, several public methods that are no longer applicable have been deprecated +and/or removed. You can find more information at GH-133. + +- CHANGED: Updated definitions. +- CHANGED: Dropped support for Ruby < 2.1 +- CHANGED: `PublicSuffix::List#rules` is now protected. You should not rely on it as the internal rule representation is subject to change to optimize performances. +- CHANGED: Removed `PublicSuffix::List.clear`, it was an unnecessary accessor method. Use `PublicSuffix::List.default = nil` if you **really** need to reset the default list. You shouldn't. +- CHANGED: `PublicSuffix::List#select` is now private. You should not use it, instead use `PublicSuffix::List#find`. +- CHANGED: `PublicSuffix::List` no longer implements Enumerable. Instead, use `#each` to loop over, or get an Enumerator. +- CHANGED: Redesigned internal list storage and lookup algorithm to achieve O(1) lookup time (see GH-133). + + +#### Release 2.0.5 + +- CHANGED: Updated definitions. +- CHANGED: Initialization performance improvements (GH-128). [Thanks @casperisfine] + + +#### Release 2.0.4 + +- FIXED: Fix a bug that caused the GEM to be published with the wrong version number in the gemspec (GH-121). + +- CHANGED: Updated definitions. + + +#### Release 2.0.3 + +- CHANGED: Updated definitions. + + +#### Release 2.0.2 + +- CHANGED: Updated definitions. + + +#### Release 2.0.1 + +- FIXED: Fix bug that prevented .valid? to reset the default rule + + +#### Release 2.0.0 + +- NEW: Added PublicSuffix.domain # => sld.tld +- NEW: Added the ability to disable the use of private domains either at runtime, in addition to the ability to not load the private domains section when reading the list (`private_domains: false`). This feature also superseded the `private_domains` class-level attribute, that is no longer available. + +- CHANGED: Considerable performance improvements (GH-92) +- CHANGED: Updated definitions. +- CHANGED: Removed deprecated PublicSuffix::InvalidDomain exception +- CHANGED: If the suffix is now listed, then the prevaling rule is "*" as defined by the PSL algorithm (GH-91) +- CHANGED: Input validation is performed only if you call `PublicSuffix.parse` or `PublicSuffix.list` +- CHANGED: Input with leading dot is invalid per PSL acceptance tests +- CHANGED: Removed `private_domains` class-level attribute. It is replaced by the `private_domains: false` option in the list parse method. +- CHANGED: The default list now assumes you use UTF-8 for reading the input (GH-94), + +- REMOVED: Removed futile utility helpers such as `Domain#rule`, `Domain#is_a_domain?`, `Domain#is_a_subdomain?`, `Domain#valid?`. You can easily obtain the same result by having a custom method that reconstructs the logic, and/or calling `PublicSuffix.{domain|parse}(domain.to_s)`. + + +#### Release 1.5.3 + +- FIXED: Don't duplicate rule indices when creating index (GH-77). [Thanks @ags] + +- CHANGED: Updated definitions. + + +#### Release 1.5.2 + +- CHANGED: Updated definitions. + + +#### Release 1.5.1 + +- FIXED: Ignore case for parsing and validating (GH-62) + +- CHANGED: Updated definitions. + + +#### Release 1.5.0 + +- CHANGED: Dropped support for Ruby < 2.0 + +- CHANGED: Updated definitions. + + +#### Release 1.4.6 + +- CHANGED: Updated definitions. + + +#### Release 1.4.5 + +- CHANGED: Updated definitions. + + +#### Release 1.4.4 + +- CHANGED: Updated definitions. + + +#### Release 1.4.3 + +- CHANGED: Updated definitions. + + +#### Release 1.4.2 + +- CHANGED: Updated definitions. + + +#### Release 1.4.1 + +- CHANGED: Updated definitions. + + +#### Release 1.4.0 + +- CHANGED: Moved the definitions in the lib folder. + +- CHANGED: Updated definitions. + + +#### Release 1.3.3 + +- CHANGED: Updated definitions. + + +#### Release 1.3.2 + +- CHANGED: Updated definitions. + + +#### Release 1.3.1 + +- CHANGED: Updated definitions. + + +#### Release 1.3.0 + +- NEW: Ability to skip Private Domains (GH-28). [Thanks @rb2k] + +- CHANGED: Updated definitions. + + +#### Release 1.2.1 + +- CHANGED: Updated definitions. + + +#### Release 1.2.0 + +- NEW: Allow a custom List on `PublicSuffix.parse` (GH-26). [Thanks @itspriddle] + +- FIXED: PublicSuffix.parse and PublicSuffix.valid? crashes when input is nil (GH-20). + +- CHANGED: Updated definitions. + + +#### Release 1.1.3 + +- CHANGED: Updated definitions. + + +#### Release 1.1.2 + +- CHANGED: Updated definitions. + + +#### Release 1.1.1 + +- CHANGED: Updated definitions. + + +#### Release 1.1.0 + +- FIXED: #valid? and #parse consider URIs as valid domains (GH-15) + +- CHANGED: Updated definitions. + +- CHANGED: Removed deprecatd PublicSuffixService::RuleList. + + +#### Release 1.0.0 + +- CHANGED: Updated definitions. + + +#### Release 1.0.0.rc1 + +The library is now known as PublicSuffix. + + +#### Release 0.9.1 + +- CHANGED: Renamed PublicSuffixService::RuleList to PublicSuffixService::List. + +- CHANGED: Renamed PublicSuffixService::List#list to PublicSuffixService::List#rules. + +- CHANGED: Renamed PublicSuffixService to PublicSuffix. + +- CHANGED: Updated definitions. + + +#### Release 0.9.0 + +- CHANGED: Minimum Ruby version increased to Ruby 1.8.7. + +- CHANGED: rake/gempackagetask is deprecated. Use rubygems/package_task instead. + + +#### Release 0.8.4 + +- FIXED: Reverted bugfix for issue #12 for Ruby 1.8.6. + This is the latest version compatible with Ruby 1.8.6. + + +#### Release 0.8.3 + +- FIXED: Fixed ArgumentError: invalid byte sequence in US-ASCII with Ruby 1.9.2 (#12). + +- CHANGED: Updated definitions (#11). + +- CHANGED: Renamed definitions.txt to definitions.dat. + + +#### Release 0.8.2 + +- NEW: Added support for rubygems-test. + +- CHANGED: Integrated Bundler. + +- CHANGED: Updated definitions. + + +#### Release 0.8.1 + +- FIXED: The files in the release 0.8.0 have wrong permission 600 and can't be loaded (#10). + + +#### Release 0.8.0 + +- CHANGED: Update public suffix list to d1a5599b49fa 2010-10-25 15:10 +0100 (#9) + +- NEW: Add support for Fully Qualified Domain Names (#7) + + +#### Release 0.7.0 + +- CHANGED: Using YARD to document the code instead of RDoc. + +- FIXED: RuleList cache is not recreated when a new rule is appended to the list (#6) + +- FIXED: PublicSuffixService.valid? should return false if the domain is not defined or not allowed (#4, #5) + + +#### Release 0.6.0 + +- NEW: PublicSuffixService.parse raises DomainNotAllowed when trying to parse a domain name + which exists, but is not allowed by the current definition list (#3) + + PublicSuffixService.parse("nic.do") + # => PublicSuffixService::DomainNotAllowed + +- CHANGED: Renamed PublicSuffixService::InvalidDomain to PublicSuffixService::DomainInvalid + + +#### Release 0.5.2 + +- CHANGED: Update public suffix list to 248ea690d671 2010-09-16 18:02 +0100 + + +#### Release 0.5.1 + +- CHANGED: Update public suffix list to 14dc66dd53c1 2010-09-15 17:09 +0100 + + +#### Release 0.5.0 + +- CHANGED: Improve documentation for Domain#domain and Domain#subdomain (#1). + +- CHANGED: Performance improvements (#2). + + +#### Release 0.4.0 + +- CHANGED: Rename library from DomainName to PublicSuffixService to reduce the probability of name conflicts. + + +#### Release 0.3.1 + +- Deprecated DomainName library. + + +#### Release 0.3.0 + +- CHANGED: DomainName#domain and DomainName#subdomain are no longer alias of Domain#sld and Domain#tld. + +- CHANGED: Removed DomainName#labels and decoupled Rule from DomainName. + +- CHANGED: DomainName#valid? no longer instantiates new DomainName objects. This means less overhead. + +- CHANGED: Refactoring the entire DomainName API. Removed the internal on-the-fly parsing. Added a bunch of new methods to check and validate the DomainName. + + +#### Release 0.2.0 + +- NEW: DomainName#valid? + +- NEW: DomainName#parse and DomainName#parse! + +- NEW: DomainName#valid_domain? and DomainName#valid_subdomain? + +- CHANGED: Make sure RuleList lookup is only performed once. + + +#### Release 0.1.0 + +- Initial version diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/Gemfile b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/Gemfile new file mode 100644 index 0000000..db22b74 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/Gemfile @@ -0,0 +1,10 @@ +source "https://rubygems.org" + +gemspec + +gem "coveralls", require: false +gem "minitest" +gem "minitest-reporters" +gem "rubocop", require: false + +gem "memory_profiler", require: false diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/LICENSE.txt b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/LICENSE.txt new file mode 100644 index 0000000..81fe94d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2009-2017 Simone Carletti + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/README.md b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/README.md new file mode 100644 index 0000000..1e06682 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/README.md @@ -0,0 +1,202 @@ +# Public Suffix for Ruby + +PublicSuffix is a Ruby domain name parser based on the [Public Suffix List](https://publicsuffix.org/). + +[![Build Status](https://travis-ci.org/weppos/publicsuffix-ruby.svg?branch=master)](https://travis-ci.org/weppos/publicsuffix-ruby) + + +## Requirements + +- Ruby >= 2.1 + +For an older versions of Ruby use a previous release. + + +## Installation + +You can install the gem manually: + +```shell +$ gem install public_suffix +``` + +Or use Bundler and define it as a dependency in your `Gemfile`: + +```ruby +gem 'public_suffix' +``` + +If you are upgrading to 2.0, see [2.0-Upgrade.md](2.0-Upgrade.md). + +## Usage + +Extract the domain out from a name: + +```ruby +PublicSuffix.domain("google.com") +# => "google.com" +PublicSuffix.domain("www.google.com") +# => "google.com" +PublicSuffix.domain("www.google.co.uk") +# => "google.co.uk" +``` + +Parse a domain without subdomains: + +```ruby +domain = PublicSuffix.parse("google.com") +# => # +domain.tld +# => "com" +domain.sld +# => "google" +domain.trd +# => nil +domain.domain +# => "google.com" +domain.subdomain +# => nil +``` + +Parse a domain with subdomains: + +```ruby +domain = PublicSuffix.parse("www.google.com") +# => # +domain.tld +# => "com" +domain.sld +# => "google" +domain.trd +# => "www" +domain.domain +# => "google.com" +domain.subdomain +# => "www.google.com" +``` + +Simple validation example: + +```ruby +PublicSuffix.valid?("google.com") +# => true + +PublicSuffix.valid?("www.google.com") +# => true + +# Explicitly forbidden, it is listed as a private domain +PublicSuffix.valid?("blogspot.com") +# => false + +# Unknown/not-listed TLD domains are valid by default +PublicSuffix.valid?("example.tldnotlisted") +# => true +``` + +Strict validation (without applying the default * rule): + +```ruby +PublicSuffix.valid?("example.tldnotlisted", default_rule: nil) +# => false +``` + + +## Fully Qualified Domain Names + +This library automatically recognizes Fully Qualified Domain Names. A FQDN is a domain name that end with a trailing dot. + +```ruby +# Parse a standard domain name +PublicSuffix.domain("www.google.com") +# => "google.com" + +# Parse a fully qualified domain name +PublicSuffix.domain("www.google.com.") +# => "google.com" +``` + +## Private domains + +This library has support for switching off support for private (non-ICANN). + +```ruby +# Extract a domain including private domains (by default) +PublicSuffix.domain("something.blogspot.com") +# => "something.blogspot.com" + +# Extract a domain excluding private domains +PublicSuffix.domain("something.blogspot.com", ignore_private: true) +# => "blogspot.com" + +# It also works for #parse and #valid? +PublicSuffix.parse("something.blogspot.com", ignore_private: true) +PublicSuffix.valid?("something.blogspot.com", ignore_private: true) +``` + +If you don't care about private domains at all, it's more efficient to exclude them when the list is parsed: + +```ruby +# Disable support for private TLDs +PublicSuffix::List.default = PublicSuffix::List.parse(File.read(PublicSuffix::List::DEFAULT_LIST_PATH), private_domains: false) +# => "blogspot.com" +PublicSuffix.domain("something.blogspot.com") +# => "blogspot.com" +``` + + +## What is the Public Suffix List? + +The [Public Suffix List](https://publicsuffix.org) is a cross-vendor initiative to provide an accurate list of domain name suffixes. + +The Public Suffix List is an initiative of the Mozilla Project, but is maintained as a community resource. It is available for use in any software, but was originally created to meet the needs of browser manufacturers. + +A "public suffix" is one under which Internet users can directly register names. Some examples of public suffixes are ".com", ".co.uk" and "pvt.k12.wy.us". The Public Suffix List is a list of all known public suffixes. + + +## Why the Public Suffix List is better than any available Regular Expression parser? + +Previously, browsers used an algorithm which basically only denied setting wide-ranging cookies for top-level domains with no dots (e.g. com or org). However, this did not work for top-level domains where only third-level registrations are allowed (e.g. co.uk). In these cases, websites could set a cookie for co.uk which will be passed onto every website registered under co.uk. + +Clearly, this was a security risk as it allowed websites other than the one setting the cookie to read it, and therefore potentially extract sensitive information. + +Since there is no algorithmic method of finding the highest level at which a domain may be registered for a particular top-level domain (the policies differ with each registry), the only method is to create a list of all top-level domains and the level at which domains can be registered. This is the aim of the effective TLD list. + +As well as being used to prevent cookies from being set where they shouldn't be, the list can also potentially be used for other applications where the registry controlled and privately controlled parts of a domain name need to be known, for example when grouping by top-level domains. + +Source: https://wiki.mozilla.org/Public_Suffix_List + +Not convinced yet? Check out [this real world example](https://stackoverflow.com/q/288810/123527). + + +## Does PublicSuffix make requests to Public Suffix List website? + +No. PublicSuffix comes with a bundled list. It does not make any HTTP requests to parse or validate a domain. + + +## Feedback and bug reports + +If you use this library and find yourself missing any functionality, please [let me know](mailto:weppos@weppos.net). + +Pull requests are very welcome! Please include tests and/or feature coverage for every patch, and create a topic branch for every separate change you make. + +Report issues or feature requests to [GitHub Issues](https://github.com/weppos/publicsuffix-ruby/issues). + + +## More + +- [Homepage](https://simonecarletti.com/code/publicsuffix-ruby) +- [Repository](https://github.com/weppos/publicsuffix-ruby) +- [API Documentation](http://rubydoc.info/gems/public_suffix) +- [Introducing the Public Suffix List library for Ruby](https://simonecarletti.com/blog/2010/06/public-suffix-list-library-for-ruby/) + + +## Changelog + +See the [CHANGELOG.md](CHANGELOG.md) file for details. + + +## License + +Copyright (c) 2009-2017 Simone Carletti. This is Free Software distributed under the MIT license. + +The [Public Suffix List source](https://publicsuffix.org/list/) is subject to the terms of the Mozilla Public License, v. 2.0. diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/Rakefile b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/Rakefile new file mode 100644 index 0000000..d304b66 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/Rakefile @@ -0,0 +1,49 @@ +require "bundler/gem_tasks" + +# By default, run tests and linter. +task default: [:test, :rubocop] + + +require "rake/testtask" + +Rake::TestTask.new do |t| + t.libs = %w( lib test ) + t.pattern = "test/**/*_test.rb" + t.verbose = !ENV["VERBOSE"].nil? + t.warning = !ENV["WARNING"].nil? +end + +require "rubocop/rake_task" + +RuboCop::RakeTask.new + + +require "yard/rake/yardoc_task" + +YARD::Rake::YardocTask.new(:yardoc) do |y| + y.options = ["--output-dir", "yardoc"] +end + +CLOBBER.include "yardoc" + + +task :benchmarks do + Dir["benchmarks/bm_*.rb"].each do |file| + sh "ruby #{file}" + end +end +task default: [:benchmarks] if ENV["BENCHMARKS"] == "1" + + +desc "Downloads the Public Suffix List file from the repository and stores it locally." +task :"update-list" do + require "net/http" + + DEFINITION_URL = "https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat".freeze + + File.open("data/list.txt", "w+") do |f| + response = Net::HTTP.get_response(URI.parse(DEFINITION_URL)) + response.body + f.write(response.body) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/bin/console b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/bin/console new file mode 100755 index 0000000..fd0f739 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/bin/console @@ -0,0 +1,14 @@ +#!/usr/bin/env ruby + +require "bundler/setup" +require "public_suffix" + +# You can add fixtures and/or initialization code here to make experimenting +# with your gem easier. You can also use a different console, if you like. + +# (If you use this, don't forget to add pry to your Gemfile!) +# require "pry" +# Pry.start + +require "irb" +IRB.start diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/data/list.txt b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/data/list.txt new file mode 100644 index 0000000..ebd88d4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/data/list.txt @@ -0,0 +1,12288 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. + +// ===BEGIN ICANN DOMAINS=== + +// ac : https://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : https://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : https://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see https://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : https://en.wikipedia.org/wiki/.am +am + +// ao : https://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : https://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/nic-argentina/normativa-vigente +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +net.ar +org.ar +tur.ar + +// arpa : https://en.wikipedia.org/wiki/.arpa +// Confirmed by registry 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : https://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : https://en.wikipedia.org/wiki/.asia +asia + +// at : https://en.wikipedia.org/wiki/.at +// Confirmed by registry 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : https://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of +// nt.gov.au Bug 940478 - Removed at request of Greg Connors +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au + +// aw : https://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : https://en.wikipedia.org/wiki/.ax +ax + +// az : https://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba + +// bb : https://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : https://en.wikipedia.org/wiki/.bd +*.bd + +// be : https://en.wikipedia.org/wiki/.be +// Confirmed by registry 2008-06-08 +be +ac.be + +// bf : https://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : https://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : https://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : https://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : https://en.wikipedia.org/wiki/.biz +biz + +// bj : https://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : https://en.wikipedia.org/wiki/.bn +*.bn + +// bo : http://www.nic.bo/ +bo +com.bo +edu.bo +gov.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry +br +abc.br +adm.br +adv.br +agr.br +aju.br +am.br +aparecida.br +arq.br +art.br +ato.br +b.br +belem.br +bhz.br +bio.br +blog.br +bmd.br +boavista.br +bsb.br +campinas.br +caxias.br +cim.br +cng.br +cnt.br +com.br +contagem.br +coop.br +cri.br +cuiaba.br +def.br +ecn.br +eco.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +feira.br +flog.br +floripa.br +fm.br +fnd.br +fortal.br +fot.br +fst.br +g12.br +ggf.br +goiania.br +gov.br +// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil +ac.gov.br +al.gov.br +am.gov.br +ap.gov.br +ba.gov.br +ce.gov.br +df.gov.br +es.gov.br +go.gov.br +ma.gov.br +mg.gov.br +ms.gov.br +mt.gov.br +pa.gov.br +pb.gov.br +pe.gov.br +pi.gov.br +pr.gov.br +rj.gov.br +rn.gov.br +ro.gov.br +rr.gov.br +rs.gov.br +sc.gov.br +se.gov.br +sp.gov.br +to.gov.br +gru.br +imb.br +ind.br +inf.br +jab.br +jampa.br +jdf.br +joinville.br +jor.br +jus.br +leg.br +lel.br +londrina.br +macapa.br +maceio.br +mat.br +med.br +mil.br +morena.br +mp.br +mus.br +natal.br +net.br +niteroi.br +*.nom.br +not.br +ntr.br +odo.br +org.br +osasco.br +palmas.br +poa.br +ppg.br +pro.br +psc.br +psi.br +pvh.br +qsl.br +radio.br +rec.br +recife.br +ribeirao.br +rio.br +riobranco.br +salvador.br +sampa.br +sjc.br +slg.br +slz.br +sorocaba.br +srv.br +taxi.br +teo.br +the.br +tmp.br +trd.br +tur.br +tv.br +udi.br +vet.br +vix.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : https://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry +bv + +// bw : https://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : https://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : https://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : https://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : https://en.wikipedia.org/wiki/.cat +cat + +// cc : https://en.wikipedia.org/wiki/.cc +cc + +// cd : https://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : https://en.wikipedia.org/wiki/.cf +cf + +// cg : https://en.wikipedia.org/wiki/.cg +cg + +// ch : https://en.wikipedia.org/wiki/.ch +ch + +// ci : https://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : https://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : https://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : https://en.wikipedia.org/wiki/.cn +// Submitted by registry +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +å…¬å¸.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : https://en.wikipedia.org/wiki/.co +// Submitted by registry +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : https://en.wikipedia.org/wiki/.com +com + +// coop : https://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : https://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : https://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : https://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : https://en.wikipedia.org/wiki/.cz +cz + +// de : https://en.wikipedia.org/wiki/.de +// Confirmed by registry (with technical +// reservations) 2008-07-01 +de + +// dj : https://en.wikipedia.org/wiki/.dj +dj + +// dk : https://en.wikipedia.org/wiki/.dk +// Confirmed by registry 2008-06-17 +dk + +// dm : https://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : https://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : https://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : https://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : https://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : https://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : https://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : https://en.wikipedia.org/wiki/.eu +eu + +// fi : https://en.wikipedia.org/wiki/.fi +fi +// aland.fi : https://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : https://en.wikipedia.org/wiki/.fj +*.fj + +// fk : https://en.wikipedia.org/wiki/.fk +*.fk + +// fm : https://en.wikipedia.org/wiki/.fm +fm + +// fo : https://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs +fr +com.fr +asso.fr +nom.fr +prd.fr +presse.fr +tm.fr +// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels +aeroport.fr +assedic.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +gouv.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : https://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry +gb + +// gd : https://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : https://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : https://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : https://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : https://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : https://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : https://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/registration.txt +*.gu + +// gw : https://en.wikipedia.org/wiki/.gw +gw + +// gy : https://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy + +// hk : https://www.hkdnr.hk +// Submitted by registry +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +å…¬å¸.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : https://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://register.pandi.or.id/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +sch.id +web.id + +// ie : https://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://www.isoc.org.il/domains/ +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il + +// im : https://www.nic.im/ +// Submitted by registry +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : https://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an official eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : https://en.wikipedia.org/wiki/.info +info + +// int : https://en.wikipedia.org/wiki/.int +// Confirmed by registry 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two .ir entries added at request of , 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : https://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names: +// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf +// There is also a list of reserved geo-names corresponding to Italian municipalities +// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-sudtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosudtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +valleeaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesenaforli.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlicesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trentino.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : https://en.wikipedia.org/wiki/.jobs +jobs + +// jp : https://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海é“.jp +åƒè‘‰.jp +和歌山.jp +é•·å´Ž.jp +長野.jp +新潟.jp +é’æ£®.jp +é™å²¡.jp +æ±äº¬.jp +石å·.jp +埼玉.jp +三é‡.jp +京都.jp +ä½è³€.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +å±±å£.jp +山形.jp +山梨.jp +岩手.jp +å²é˜œ.jp +岡山.jp +å³¶æ ¹.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈å·.jp +ç¦äº•.jp +ç¦å²¡.jp +ç¦å³¶.jp +ç§‹ç”°.jp +群馬.jp +香å·.jp +高知.jp +é³¥å–.jp +鹿å…å³¶.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 +*.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : https://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// https://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : https://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : https://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : https://en.wikipedia.org/wiki/.kw +*.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : https://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : https://en.wikipedia.org/wiki/.la +// Submitted by registry +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : https://en.wikipedia.org/wiki/.lb +// Submitted by registry +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : https://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : https://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : https://en.wikipedia.org/wiki/.ls +ls +co.ls +org.ls + +// lt : https://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : https://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : https://en.wikipedia.org/wiki/.md +md + +// me : https://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://nic.mg/nicmg/?page_id=39 +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg +co.mg + +// mh : https://en.wikipedia.org/wiki/.mh +mh + +// mil : https://en.wikipedia.org/wiki/.mil +mil + +// mk : https://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: https://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : https://en.wikipedia.org/wiki/.mm +*.mm + +// mn : https://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : https://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry 2008-06-17 +mp + +// mq : https://en.wikipedia.org/wiki/.mq +mq + +// mr : https://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : https://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nuernberg.museum +nuremberg.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלי×.museum +иком.museum + +// mv : https://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.uem.mz/ +// Submitted by registry +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc +nom.nc + +// ne : https://en.wikipedia.org/wiki/.ne +ne + +// net : https://en.wikipedia.org/wiki/.net +net + +// nf : https://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng + +// ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni + +// nl : https://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// BV.nl will be a registry for dutch BV's (besloten vennootschap) +bv.nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +Ã¥krehamn.no +algard.no +Ã¥lgÃ¥rd.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevÃ¥g.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +rÃ¥holt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +Ã¥fjord.no +agdenes.no +al.no +Ã¥l.no +alesund.no +Ã¥lesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +Ã¥mli.no +amot.no +Ã¥mot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +Ã¥rdal.no +aremark.no +arendal.no +Ã¥s.no +aseral.no +Ã¥seral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +Ã¥snes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevÃ¥g.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bÃ¥dÃ¥ddjÃ¥.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +bÃ¥tsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flÃ¥.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskÃ¥l.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +krÃ¥anghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákÅ‹oluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtÃ¥len.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hÃ¥.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kÃ¥fjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaÅ‹gaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindÃ¥s.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +mÃ¥søy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +merÃ¥ker.no +moareke.no +moÃ¥reke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +mÃ¥lselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegÃ¥rd.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +rÃ¥de.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjÃ¥k.no +skodje.no +skanland.no +skÃ¥nland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snÃ¥sa.no +snoasa.no +snaase.no +snÃ¥ase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +Äáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegÃ¥rshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvÃ¥gøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vÃ¥gan.no +voagat.no +vagsoy.no +vÃ¥gsøy.no +vaga.no +vÃ¥gÃ¥.no +valer.ostfold.no +vÃ¥ler.østfold.no +valer.hedmark.no +vÃ¥ler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Submitted by registry +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : https://en.wikipedia.org/wiki/.nu +nu + +// nz : https://en.wikipedia.org/wiki/.nz +// Submitted by registry +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +mÄori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : https://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : https://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// Submitted by registry +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : https://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://registry.pro/get-pro +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro + +// ps : https://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : https://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Submitted by registry +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +asso.re +com.re +nom.re + +// ro : http://www.rotld.ro/ +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro + +// rs : https://www.rnids.rs/en/domains/national-domains +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs + +// ru : https://cctld.ru/en/domains/domens_ru/reserved/ +ru +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + +// rw : http://www.nic.rw/cgi-bin/policy.pl +rw +gov.rw +net.rw +edu.rw +ac.rw +com.rw +co.rw +int.rw +mil.rw +gouv.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : https://en.wikipedia.org/wiki/.se +// Submitted by registry +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : https://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry +sj + +// sk : https://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : https://en.wikipedia.org/wiki/.sm +sm + +// sn : https://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://www.soregistry.com/ +so +com.so +net.so +org.so + +// sr : https://en.wikipedia.org/wiki/.sr +sr + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : https://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : https://en.wikipedia.org/wiki/.sx +// Submitted by registry +sx +gov.sx + +// sy : https://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : https://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : https://en.wikipedia.org/wiki/.tc +tc + +// td : https://en.wikipedia.org/wiki/.td +td + +// tel: https://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : https://en.wikipedia.org/wiki/.tf +tf + +// tg : https://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : https://en.wikipedia.org/wiki/.th +// Submitted by registry +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : https://en.wikipedia.org/wiki/.tk +tk + +// tl : https://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : https://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : https://en.wikipedia.org/wiki/.to +// Submitted by registry +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// subTLDs: https://www.nic.tr/forms/eng/policies.pdf +// and: https://www.nic.tr/forms/politikalar.pdf +// Submitted by +tr +com.tr +info.tr +biz.tr +net.tr +org.tr +web.tr +gen.tr +tv.tr +av.tr +dr.tr +bbs.tr +name.tr +tel.tr +gov.tr +bel.tr +pol.tr +mil.tr +k12.tr +edu.tr +kep.tr + +// Used by Northern Cyprus +nc.tr + +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// travel : https://en.wikipedia.org/wiki/.travel +travel + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : https://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : https://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Submitted by registry +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +dominic.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : https://en.wikipedia.org/wiki/.uk +// Submitted by registry +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : https://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed independently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated directly to the +// 5LD operators. +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us +// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following +// see also: http://domreg.merit.edu +// see also: whois -h whois.domreg.merit.edu help +ann-arbor.mi.us +cog.mi.us +dst.mi.us +eaton.mi.us +gen.mi.us +mus.mi.us +tec.mi.us +washtenaw.mi.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : https://en.wikipedia.org/wiki/.va +va + +// vc : https://en.wikipedia.org/wiki/.vc +// Submitted by registry +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Submitted by registry +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : https://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : https://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : https://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("", [, variant info]) : +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +Õ°Õ¡Õµ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ae ("bg", Bulgarian) : BG +бг + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--e1a4c ("eu", Cyrillic) : EU +ею + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www2.hkirc.hk/register/rules.jsp +香港 + +// xn--2scrj9c ("Bharat", Kannada) : IN +// India +ಭಾರತ + +// xn--3hcrj9c ("Bharat", Oriya) : IN +// India +ଭାରତ + +// xn--45br5cyl ("Bharatam", Assamese) : IN +// India +ভাৰত + +// xn--h2breg3eve ("Bharatam", Sanskrit) : IN +// India +भारतमॠ+ +// xn--h2brj9c8c ("Bharot", Santali) : IN +// India +भारोत + +// xn--mgbgu82a ("Bharat", Sindhi) : IN +// India +ڀارت + +// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN +// India +ഭാരതം + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారతౠ+ +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இநà¯à®¤à®¿à®¯à®¾ + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// http://nic.lk +ලංක෠+ +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// http://nic.lk +இலஙà¯à®•ை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +Ùلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// https://www.rnids.rs/en/domains/national-domains +Ñрб +пр.Ñрб +орг.Ñрб +обр.Ñрб +од.Ñрб +упр.Ñрб +ак.Ñрб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// http://www.cctld.ru/en/docs/rulesrf.php +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +æ–°åŠ å¡ + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிஙà¯à®•பà¯à®ªà¯‚ர௠+ +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย +ศึà¸à¸©à¸².ไทย +ธุรà¸à¸´à¸ˆ.ไทย +รัà¸à¸šà¸²à¸¥.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์à¸à¸£.ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +å°ç£ + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +å°æ¹¾ + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +è‡ºç£ + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : http://www.zadna.org.za/content/page/domain-information +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : https://zicta.zm/ +// Submitted by registry +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + +// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z + +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. +abarth + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// abbvie : 2015-07-30 AbbVie Inc. +abbvie + +// abc : 2015-07-30 Disney Enterprises, Inc. +abc + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Top Level Domain Holdings Limited +abogado + +// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +abudhabi + +// academy : 2013-11-07 Half Oaks, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Knob Town, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// active : 2014-05-01 The Active Network, Inc +active + +// actor : 2013-12-12 United TLD Holdco Ltd. +actor + +// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) +adac + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. +afamilycompany + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Steel Falls, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. +aigo + +// airbus : 2015-07-30 Airbus S.A.S. +airbus + +// airforce : 2014-03-06 United TLD Holdco Ltd. +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. +alfaromeo + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +allstate + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 REGION D ALSACE +alsace + +// alstom : 2015-07-30 ALSTOM +alstom + +// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +americanexpress + +// americanfamily : 2015-07-23 AmFam, Inc. +americanfamily + +// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +amex + +// amfam : 2015-07-23 AmFam, Inc. +amfam + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +anquan + +// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +anz + +// aol : 2015-09-17 AOL Inc. +aol + +// apartments : 2014-12-11 June Maple, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// arab : 2015-11-12 League of Arab States +arab + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 STARTING DOT LIMITED +archi + +// army : 2014-03-06 United TLD Holdco Ltd. +army + +// art : 2016-03-24 UK Creative Ideas Limited +art + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// asda : 2015-07-31 Wal-Mart Stores, Inc. +asda + +// associates : 2014-03-06 Baxter Hill, LLC +associates + +// athleta : 2015-07-30 The Gap, Inc. +athleta + +// attorney : 2014-03-20 +attorney + +// auction : 2014-03-20 +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon EU S.à r.l. +audible + +// audio : 2014-03-20 Uniregistry, Corp. +audio + +// auspost : 2015-08-13 Australian Postal Corporation +auspost + +// author : 2014-12-18 Amazon EU S.à r.l. +author + +// auto : 2014-11-13 +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca +avianca + +// aws : 2015-06-25 Amazon EU S.à r.l. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 Johnson & Johnson Services, Inc. +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// banamex : 2015-07-30 Citigroup Inc. +banamex + +// bananarepublic : 2015-07-31 The Gap, Inc. +bananarepublic + +// band : 2014-06-12 +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Half Hallow, LLC +bargains + +// baseball : 2015-10-29 MLB Advanced Media DH, LLC +baseball + +// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +basketball + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbt : 2015-07-23 BB&T Corporation +bbt + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beauty : 2015-12-03 L'Oréal +beauty + +// beer : 2014-01-09 Top Level Domain Holdings Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bestbuy : 2015-07-31 BBY Solutions, Inc. +bestbuy + +// bet : 2015-05-07 Afilias plc +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Grand Hollow, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Sand Cedar, LLC +bingo + +// bio : 2014-03-06 STARTING DOT LIMITED +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 Uniregistry, Corp. +blackfriday + +// blanco : 2015-07-16 BLANCO GmbH + Co KG +blanco + +// blockbuster : 2015-07-30 Dish DBS Corporation +blockbuster + +// blog : 2015-05-14 +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnl : 2014-07-24 Banca Nazionale del Lavoro +bnl + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +boehringer + +// bofa : 2015-07-31 NMS Services, Inc. +bofa + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 Bond University Limited +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// book : 2015-08-27 Amazon EU S.à r.l. +book + +// booking : 2015-07-16 Booking.com B.V. +booking + +// boots : 2015-01-08 THE BOOTS COMPANY PLC +boots + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// boston : 2015-12-10 +boston + +// bot : 2014-12-18 Amazon EU S.à r.l. +bot + +// boutique : 2013-11-14 Over Galley, LLC +boutique + +// box : 2015-11-12 NS1 Limited +box + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 IG Group Holdings PLC +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Top Level Domain Holdings Limited +budapest + +// bugatti : 2015-07-23 Bugatti International SA +bugatti + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Atomic Madison, LLC +builders + +// business : 2013-11-07 Spring Cross, LLC +business + +// buy : 2014-12-18 Amazon EU S.à r.l. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Half Sunset, LLC +cab + +// cafe : 2015-02-11 Pioneer Canyon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon EU S.à r.l. +call + +// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +calvinklein + +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + +// camera : 2013-08-27 Atomic Maple, LLC +camera + +// camp : 2013-11-07 Delta Dynamite, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Delta Mill, LLC +capital + +// capitalone : 2015-08-06 Capital One Financial Corporation +capitalone + +// car : 2015-01-22 +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Foggy Hollow, LLC +cards + +// care : 2014-03-06 Goose Cross +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Wild Corner, LLC +careers + +// cars : 2014-11-13 +cars + +// cartier : 2014-06-23 Richemont DNS Inc. +cartier + +// casa : 2013-11-21 Top Level Domain Holdings Limited +casa + +// case : 2015-09-03 CNH Industrial N.V. +case + +// caseih : 2015-09-03 CNH Industrial N.V. +caseih + +// cash : 2014-03-06 Delta Lake, LLC +cash + +// casino : 2014-12-18 Binky Sky, LLC +casino + +// catering : 2013-12-05 New Falls. LLC +catering + +// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +catholic + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// cbs : 2015-08-06 CBS Domains Inc. +cbs + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Tin Mill, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 IG Group Holdings PLC +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// chase : 2015-04-30 JPMorgan Chase & Co. +chase + +// chat : 2014-12-04 Sand Fields, LLC +chat + +// cheap : 2013-11-14 Sand Cover, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// christmas : 2013-11-21 Uniregistry, Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// chrysler : 2015-07-30 FCA US LLC. +chrysler + +// church : 2014-02-06 Holly Fields, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon EU S.à r.l. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citadel : 2015-07-23 Citadel Domain LLC +citadel + +// citi : 2015-07-30 Citigroup Inc. +citi + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Snow Sky, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Black Corner, LLC +claims + +// cleaning : 2013-12-05 Fox Shadow, LLC +cleaning + +// click : 2014-06-05 Uniregistry, Corp. +click + +// clinic : 2014-03-20 Goose Park, LLC +clinic + +// clinique : 2015-10-01 The Estée Lauder Companies Inc. +clinique + +// clothing : 2013-08-27 Steel Lake, LLC +clothing + +// cloud : 2015-04-16 ARUBA S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Koko Island, LLC +coach + +// codes : 2013-10-31 Puff Willow, LLC +codes + +// coffee : 2013-10-17 Trixy Cover, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH +cologne + +// comcast : 2015-07-23 Comcast IP Holdings I, LLC +comcast + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Fox Orchard, LLC +community + +// company : 2013-11-07 Silver Avenue, LLC +company + +// compare : 2015-10-08 iSelect Ltd +compare + +// computer : 2013-10-24 Pine Mill, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Pine House, LLC +condos + +// construction : 2013-09-16 Fox Dynamite, LLC +construction + +// consulting : 2013-12-05 +consulting + +// contact : 2015-01-08 Top Level Spectrum, Inc. +contact + +// contractors : 2013-09-10 Magic Woods, LLC +contractors + +// cooking : 2013-11-21 Top Level Domain Holdings Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Koko Lake, LLC +cool + +// corsica : 2014-09-25 Collectivité Territoriale de Corse +corsica + +// country : 2013-12-19 Top Level Domain Holdings Limited +country + +// coupon : 2015-02-26 Amazon EU S.à r.l. +coupon + +// coupons : 2015-03-26 Black Island, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// credit : 2014-03-20 Snow Shadow, LLC +credit + +// creditcard : 2014-03-20 Binky Frostbite, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +cruise + +// cruises : 2013-12-05 Spring Way, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SALM S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 United TLD Holdco Ltd. +dance + +// data : 2016-06-02 Dish DBS Corporation +data + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Pine Fest, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Top Level Domain Holdings Limited +dds + +// deal : 2015-06-25 Amazon EU S.à r.l. +deal + +// dealer : 2014-12-22 Dealer Dot Com, Inc. +dealer + +// deals : 2014-05-22 Sand Sunset, LLC +deals + +// degree : 2014-03-06 +degree + +// delivery : 2014-09-11 Steel Station, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +deloitte + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 United TLD Holdco Ltd. +democrat + +// dental : 2014-03-20 Tin Birch, LLC +dental + +// dentist : 2014-03-20 +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// dhl : 2015-07-23 Deutsche Post AG +dhl + +// diamonds : 2013-09-22 John Edge, LLC +diamonds + +// diet : 2014-06-26 Uniregistry, Corp. +diet + +// digital : 2014-03-06 Dash Park, LLC +digital + +// direct : 2014-04-10 Half Trail, LLC +direct + +// directory : 2013-09-20 Extra Madison, LLC +directory + +// discount : 2014-03-06 Holly Hill, LLC +discount + +// discover : 2015-07-23 Discover Financial Services +discover + +// dish : 2015-07-30 Dish DBS Corporation +dish + +// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +diy + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// doctor : 2016-06-02 Brice Trail, LLC +doctor + +// dodge : 2015-07-30 FCA US LLC. +dodge + +// dog : 2014-12-04 Koko Mill, LLC +dog + +// doha : 2014-09-18 Communications Regulatory Authority (CRA) +doha + +// domains : 2013-10-17 Sugar Cross, LLC +domains + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// duck : 2015-07-23 Johnson Shareholdings, Inc. +duck + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// duns : 2015-08-06 The Dun & Bradstreet Corporation +duns + +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// dvr : 2016-05-26 Hughes Satellite Systems Corporation +dvr + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// eco : 2016-07-08 Big Room Inc. +eco + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Brice Way, LLC +education + +// email : 2013-10-31 Spring Madison, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Birch, LLC +energy + +// engineer : 2014-03-06 United TLD Holdco Ltd. +engineer + +// engineering : 2014-03-06 Romeo Canyon +engineering + +// enterprises : 2013-09-20 Snow Oaks, LLC +enterprises + +// epost : 2015-07-23 Deutsche Post AG +epost + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Corn Station, LLC +equipment + +// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +ericsson + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Trixy Park, LLC +estate + +// esurance : 2015-07-23 Esurance Insurance Company +esurance + +// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +etisalat + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Pioneer Maple, LLC +events + +// everbank : 2014-05-15 EverBank +everbank + +// exchange : 2014-03-06 Spring Falls, LLC +exchange + +// expert : 2013-11-21 Magic Pass, LLC +expert + +// exposed : 2013-12-05 Victor Beach, LLC +exposed + +// express : 2015-02-11 Sea Sunset, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Atomic Pipe, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 +family + +// fan : 2014-03-06 +fan + +// fans : 2014-11-07 Asiamix Digital Limited +fans + +// farm : 2013-11-07 Just Maple, LLC +farm + +// farmers : 2015-07-09 Farmers Insurance Exchange +farmers + +// fashion : 2014-07-03 Top Level Domain Holdings Limited +fashion + +// fast : 2014-12-18 Amazon EU S.à r.l. +fast + +// fedex : 2015-08-06 Federal Express Corporation +fedex + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +ferrari + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. +fiat + +// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +fidelity + +// fido : 2015-08-06 Rogers Communications Partnership +fido + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Cotton Cypress, LLC +finance + +// financial : 2014-03-06 Just Cover, LLC +financial + +// fire : 2015-06-25 Amazon EU S.à r.l. +fire + +// firestone : 2014-12-18 Bridgestone Corporation +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Fox Woods, LLC +fish + +// fishing : 2013-11-21 Top Level Domain Holdings Limited +fishing + +// fit : 2014-11-07 Top Level Domain Holdings Limited +fit + +// fitness : 2014-03-06 Brice Orchard, LLC +fitness + +// flickr : 2015-04-02 Yahoo! Domain Services Inc. +flickr + +// flights : 2013-12-05 Fox Station, LLC +flights + +// flir : 2015-07-23 FLIR Systems, Inc. +flir + +// florist : 2013-11-07 Half Cypress, LLC +florist + +// flowers : 2014-10-09 Uniregistry, Corp. +flowers + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Foggy Farms, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 IG Group Holdings PLC +forex + +// forsale : 2014-05-22 +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 John Dale, LLC +foundation + +// fox : 2015-09-11 FOX Registry, LLC +fox + +// free : 2015-12-10 Amazon EU S.à r.l. +free + +// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +fresenius + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// ftr : 2015-07-16 Frontier Communications Corporation +ftr + +// fujitsu : 2015-07-30 Fujitsu Limited +fujitsu + +// fujixerox : 2015-07-23 Xerox DNHC LLC +fujixerox + +// fun : 2016-01-14 +fun + +// fund : 2014-03-20 John Castle, LLC +fund + +// furniture : 2014-03-20 Lone Fields, LLC +furniture + +// futbol : 2013-09-20 +futbol + +// fyi : 2015-04-02 Silver Tigers, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Sugar House, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 Uniregistry, Corp. +game + +// games : 2015-05-28 +games + +// gap : 2015-07-31 The Gap, Inc. +gap + +// garden : 2014-06-26 Top Level Domain Holdings Limited +garden + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL GROUP NV/SA +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// george : 2015-07-31 Wal-Mart Stores, Inc. +george + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 Uniregistry, Corp. +gift + +// gifts : 2014-07-03 Goose Sky, LLC +gifts + +// gives : 2014-03-06 United TLD Holdco Ltd. +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glade : 2015-07-23 Johnson Shareholdings, Inc. +glade + +// glass : 2013-11-07 Black Cover, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot GLOBAL AS +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmbh : 2016-01-29 Extra Dynamite, LLC +gmbh + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// godaddy : 2015-07-23 Go Daddy East, LLC +godaddy + +// gold : 2015-01-22 June Edge, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Lone falls, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodhands : 2015-07-31 Allstate Fire and Casualty Insurance Company +goodhands + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon EU S.à r.l. +got + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Over Madison, LLC +graphics + +// gratis : 2014-03-20 Pioneer Tigers, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Corn Sunset, LLC +gripe + +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + +// group : 2014-08-15 Romeo Town, LLC +group + +// guardian : 2015-07-30 The Guardian Life Insurance Company of America +guardian + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Snow Moon, LLC +guide + +// guitars : 2013-11-14 Uniregistry, Corp. +guitars + +// guru : 2013-08-27 Pioneer Cypress, LLC +guru + +// hair : 2015-12-03 L'Oréal +hair + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 +haus + +// hbo : 2015-07-30 HBO Registry Services, Inc. +hbo + +// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +hdfc + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Silver Glen, LLC +healthcare + +// help : 2014-06-26 Uniregistry, Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Uniregistry, Corp. +hiphop + +// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +hisamitsu + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Half Willow, LLC +hockey + +// holdings : 2013-08-27 John Madison, LLC +holdings + +// holiday : 2013-11-07 Goose Woods, LLC +holiday + +// homedepot : 2015-04-02 Homer TLC, Inc. +homedepot + +// homegoods : 2015-07-16 The TJX Companies, Inc. +homegoods + +// homes : 2014-01-09 DERHomes, LLC +homes + +// homesense : 2015-07-16 The TJX Companies, Inc. +homesense + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// honeywell : 2015-07-23 Honeywell GTLD LLC +honeywell + +// horse : 2013-11-21 Top Level Domain Holdings Limited +horse + +// hospital : 2016-10-20 Ruby Pike, LLC +hospital + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 Uniregistry, Corp. +hosting + +// hot : 2015-08-27 Amazon EU S.à r.l. +hot + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotels : 2016-04-07 Booking.com B.V. +hotels + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Sugar Park, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Holdings PLC +hsbc + +// hughes : 2015-07-30 Hughes Satellite Systems Corporation +hughes + +// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +hyatt + +// hyundai : 2015-07-09 Hyundai Motor Company +hyundai + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 One.com A/S +icu + +// ieee : 2015-07-23 IEEE Global LLC +ieee + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// ikano : 2015-07-09 Ikano S.A. +ikano + +// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +imamat + +// imdb : 2015-06-25 Amazon EU S.à r.l. +imdb + +// immo : 2014-07-10 Auburn Bloom, LLC +immo + +// immobilien : 2013-11-07 United TLD Holdco Ltd. +immobilien + +// industries : 2013-12-05 Outer House, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Outer Maple, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Pioneer Willow, LLC +insure + +// intel : 2015-08-06 Intel Corporation +intel + +// international : 2013-11-07 Wild Way, LLC +international + +// intuit : 2015-07-30 Intuit Administrative Services, Inc. +intuit + +// investments : 2014-03-20 Holly Glen, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Dot-Irish LLC +irish + +// iselect : 2015-02-11 iSelect Ltd +iselect + +// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +ismaili + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// itv : 2015-07-09 ITV Services Limited +itv + +// iveco : 2015-09-03 CNH Industrial N.V. +iveco + +// iwc : 2014-06-23 Richemont DNS Inc. +iwc + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jeep : 2015-07-30 FCA US LLC. +jeep + +// jetzt : 2014-01-09 +jetzt + +// jewelry : 2015-03-05 Wild Bloom, LLC +jewelry + +// jio : 2015-04-02 Affinity Names, Inc. +jio + +// jlc : 2014-12-04 Richemont DNS Inc. +jlc + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon EU S.à r.l. +jot + +// joy : 2014-12-18 Amazon EU S.à r.l. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase & Co. +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 Uniregistry, Corp. +juegos + +// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +juniper + +// kaufen : 2013-11-07 United TLD Holdco Ltd. +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kia : 2015-07-09 KIA MOTORS CORPORATION +kia + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon EU S.à r.l. +kindle + +// kitchen : 2013-09-20 Just Goodbye, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kosher : 2015-08-20 Kosher Marketing Assets LLC +kosher + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA +lacaixa + +// ladbrokes : 2015-08-06 LADBROKES INTERNATIONAL PLC +ladbrokes + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lamer : 2015-10-01 The Estée Lauder Companies Inc. +lamer + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. +lancia + +// lancome : 2015-07-23 L'Oréal +lancome + +// land : 2013-09-10 Pine Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lanxess : 2015-07-30 LANXESS Corporation +lanxess + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latino : 2015-07-30 Dish DBS Corporation +latino + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 Minds + Machines Group Limited +law + +// lawyer : 2014-03-20 +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +lds + +// lease : 2014-03-06 Victor Trail, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// lefrak : 2015-07-16 LeFrak Organization, Inc. +lefrak + +// legal : 2014-10-16 Blue Falls, LLC +legal + +// lego : 2015-07-16 LEGO Juris A/S +lego + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// liaison : 2014-10-02 Liaison Technologies, Incorporated +liaison + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Trixy Oaks, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 John McCook, LLC +lighting + +// like : 2014-12-18 Amazon EU S.à r.l. +like + +// lilly : 2015-07-31 Eli Lilly and Company +lilly + +// limited : 2014-03-06 Big Fest, LLC +limited + +// limo : 2013-10-17 Hidden Frostbite, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 Uniregistry, Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 +live + +// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +living + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 June Woods, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// loft : 2015-07-30 Annco, Inc. +loft + +// lol : 2015-01-30 Uniregistry, Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// lpl : 2015-07-30 LPL Holdings, Inc. +lpl + +// lplfinancial : 2015-07-30 LPL Holdings, Inc. +lplfinancial + +// ltd : 2014-09-25 Over Corner, LLC +ltd + +// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA +ltda + +// lundbeck : 2015-08-06 H. Lundbeck A/S +lundbeck + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Top Level Domain Holdings Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// macys : 2015-07-31 Macys, Inc. +macys + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Victor Frostbite, LLC +maison + +// makeup : 2015-01-15 L'Oréal +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 John Goodbye, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// map : 2016-06-09 Charleston Road Registry Inc. +map + +// market : 2014-03-06 +market + +// marketing : 2013-11-07 Fern Pass, LLC +marketing + +// markets : 2014-12-11 IG Group Holdings PLC +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// marshalls : 2015-07-16 The TJX Companies, Inc. +marshalls + +// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. +maserati + +// mattel : 2015-08-06 Mattel Sites, Inc. +mattel + +// mba : 2015-04-02 Lone Hollow, LLC +mba + +// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +mckinsey + +// med : 2015-08-06 Medistry LLC +med + +// media : 2014-03-06 Grand Glen, LLC +media + +// meet : 2014-01-16 +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Wedding TLD2, LLC +menu + +// meo : 2014-11-07 PT Comunicacoes S.A. +meo + +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Top Level Domain Holdings Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mint : 2015-07-30 Intuit Administrative Services, Inc. +mint + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mitsubishi : 2015-07-23 Mitsubishi Corporation +mitsubishi + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mobile : 2016-06-02 Dish DBS Corporation +mobile + +// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. +mobily + +// moda : 2013-11-07 United TLD Holdco Ltd. +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon EU S.à r.l. +moi + +// mom : 2015-04-16 Uniregistry, Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Outer McCook, LLC +money + +// monster : 2015-09-11 Monster Worldwide, Inc. +monster + +// mopar : 2015-07-30 FCA US LLC. +mopar + +// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +mormon + +// mortgage : 2014-03-20 +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 New Frostbite, LLC +movie + +// movistar : 2014-10-16 Telefónica S.A. +movistar + +// msd : 2015-07-23 MSD Registry Holdings, Inc. +msd + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation +mtpc + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// nab : 2015-08-20 National Australia Bank Limited +nab + +// nadex : 2014-12-11 IG Group Holdings PLC +nadex + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// nationwide : 2015-07-23 Nationwide Mutual Insurance Company +nationwide + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 United TLD Holdco Ltd. +navy + +// nba : 2015-07-31 NBA REGISTRY, LLC +nba + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Trixy Manor, LLC +network + +// neustar : 2013-12-05 NeuStar, Inc. +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// newholland : 2015-09-03 CNH Industrial N.V. +newholland + +// news : 2014-12-18 +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// nfl : 2015-07-23 NFL Reg Ops LLC +nfl + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nike : 2015-07-23 NIKE, Inc. +nike + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 United TLD Holdco Ltd. +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nissay : 2015-10-29 Nippon Life Insurance Company +nissay + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon EU S.à r.l. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 +observer + +// off : 2015-07-23 Johnson Shareholdings, Inc. +off + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BusinessRalliart Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// oldnavy : 2015-07-31 The Gap, Inc. +oldnavy + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// onyourside : 2015-07-23 Nationwide Mutual Insurance Company +onyourside + +// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED +ooo + +// open : 2015-07-31 American Express Travel Related Services Company, Inc. +open + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// origins : 2015-10-01 The Estée Lauder Companies Inc. +origins + +// osaka : 2014-09-04 Interlink Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 OVH SAS +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// panasonic : 2015-07-30 Panasonic Corporation +panasonic + +// panerai : 2014-11-07 Richemont DNS Inc. +panerai + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Magic Glen, LLC +partners + +// parts : 2013-12-05 Sea Goodbye, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// pay : 2015-08-27 Amazon EU S.à r.l. +pay + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias plc +pet + +// pfizer : 2015-09-11 Pfizer Inc. +pfizer + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// phone : 2016-06-02 Dish DBS Corporation +phone + +// photo : 2013-11-14 Uniregistry, Corp. +photo + +// photography : 2013-09-20 Sugar Glen, LLC +photography + +// photos : 2013-10-17 Sea Corner, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// piaget : 2014-10-16 Richemont DNS Inc. +piaget + +// pics : 2013-11-14 Uniregistry, Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Foggy Sky, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon EU S.à r.l. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pioneer : 2015-07-16 Pioneer Corporation +pioneer + +// pizza : 2014-06-26 Foggy Moon, LLC +pizza + +// place : 2014-04-24 Snow Galley, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Computer Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Spring Tigers, LLC +plumbing + +// plus : 2015-02-05 Sugar Mill, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Domains No. 5 Limited +poker + +// politie : 2015-08-20 Politie Nederland +politie + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// pramerica : 2015-07-30 Prudential Financial, Inc. +pramerica + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon EU S.à r.l. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Magic Birch, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// progressive : 2015-07-23 Progressive Casualty Insurance Company +progressive + +// promo : 2014-12-18 +promo + +// properties : 2013-12-05 Big Pass, LLC +properties + +// property : 2014-05-22 Uniregistry, Corp. +property + +// protection : 2015-04-23 +protection + +// pru : 2015-07-30 Prudential Financial, Inc. +pru + +// prudential : 2015-07-30 Prudential Financial, Inc. +prudential + +// pub : 2013-12-12 United TLD Holdco Ltd. +pub + +// pwc : 2015-10-29 PricewaterhouseCoopers LLP +pwc + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 Quest ION Limited +quest + +// qvc : 2015-07-30 QVC, Inc. +qvc + +// racing : 2014-12-04 Premier Registry Limited +racing + +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + +// raid : 2015-07-23 Johnson Shareholdings, Inc. +raid + +// read : 2014-12-18 Amazon EU S.à r.l. +read + +// realestate : 2015-09-11 dotRealEstate LLC +realestate + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Grand Island, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 United TLD Holdco Ltd. +rehab + +// reise : 2014-03-13 +reise + +// reisen : 2014-03-06 New Cypress, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. +ren + +// rent : 2014-12-04 DERRent, LLC +rent + +// rentals : 2013-12-05 Big Hollow,LLC +rentals + +// repair : 2013-11-07 Lone Sunset, LLC +repair + +// report : 2013-12-05 Binky Glen, LLC +report + +// republican : 2014-03-20 United TLD Holdco Ltd. +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Snow Avenue, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// rightathome : 2015-07-23 Johnson Shareholdings, Inc. +rightathome + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 United TLD Holdco Ltd. +rip + +// rmit : 2015-11-19 Royal Melbourne Institute of Technology +rmit + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 +rocks + +// rodeo : 2013-12-19 Top Level Domain Holdings Limited +rodeo + +// rogers : 2015-08-06 Rogers Communications Partnership +rogers + +// room : 2014-12-18 Amazon EU S.à r.l. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Snow Park, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BusinessRalliart Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon EU S.à r.l. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 +sale + +// salon : 2014-12-11 Outer Orchard, LLC +salon + +// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +samsclub + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sapo : 2014-11-07 PT Comunicacoes S.A. +sapo + +// sarl : 2014-07-03 Delta Orchard, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon EU S.à r.l. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +schaeffler + +// schmidt : 2014-04-03 SALM S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Little Galley, LLC +school + +// schule : 2014-03-06 Outer Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. +scjohnson + +// scor : 2014-10-31 SCOR SE +scor + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// search : 2016-06-09 Charleston Road Registry Inc. +search + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// secure : 2015-08-27 Amazon EU S.à r.l. +secure + +// security : 2015-05-14 +security + +// seek : 2014-12-04 Seek Limited +seek + +// select : 2015-10-08 iSelect Ltd +select + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Fox Castle, LLC +services + +// ses : 2015-07-23 SES +ses + +// seven : 2015-08-06 Seven West Media Ltd +seven + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 Uniregistry, Corp. +sexy + +// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +sfr + +// shangrila : 2015-09-03 Shangriâ€La International Hotel Management Limited +shangrila + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shell : 2015-07-30 Shell Information Technology International Inc +shell + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Galley, LLC +shoes + +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 +shopping + +// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +shouji + +// show : 2015-03-05 Snow Beach, LLC +show + +// showtime : 2015-08-06 CBS Domains Inc. +showtime + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon EU S.à r.l. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Fern Madison, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 STARTING DOT LIMITED +ski + +// skin : 2015-01-15 L'Oréal +skin + +// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// sling : 2015-07-30 Hughes Satellite Systems Corporation +sling + +// smart : 2015-07-09 Smart Communications, Inc. (SMART) +smart + +// smile : 2014-12-18 Amazon EU S.à r.l. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Foggy Shadow, LLC +soccer + +// social : 2013-11-07 United TLD Holdco Ltd. +social + +// softbank : 2015-07-02 SoftBank Corp. +softbank + +// software : 2014-03-20 +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Ruby Town, LLC +solar + +// solutions : 2013-11-07 Silver Cover, LLC +solutions + +// song : 2015-02-26 Amazon EU S.à r.l. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// space : 2014-04-03 DotSpace Inc. +space + +// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG +spiegel + +// spot : 2015-02-26 Amazon EU S.à r.l. +spot + +// spreadbetting : 2014-12-11 IG Group Holdings PLC +spreadbetting + +// srl : 2015-05-07 mySRL GmbH +srl + +// srt : 2015-07-30 FCA US LLC. +srt + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// staples : 2015-07-30 Staples, Inc. +staples + +// star : 2015-01-08 Star India Private Limited +star + +// starhub : 2015-02-05 StarHub Ltd +starhub + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +statefarm + +// statoil : 2014-12-04 Statoil ASA +statoil + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 Self Storage Company LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// stream : 2016-01-08 dot Stream Limited +stream + +// studio : 2015-02-11 +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Inc. +sucks + +// supplies : 2013-12-19 Atomic Fields, LLC +supplies + +// supply : 2013-12-19 Half Falls, LLC +supply + +// support : 2013-10-24 Grand Orchard, LLC +support + +// surf : 2014-01-09 Top Level Domain Holdings Limited +surf + +// surgery : 2014-03-20 Tin Avenue, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited +swiftcover + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// symantec : 2014-12-04 Symantec Corporation +symantec + +// systems : 2013-11-07 Dash Cypress, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon EU S.à r.l. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// target : 2015-07-31 Target Domain Holdings, LLC +target + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 Uniregistry, Corp. +tattoo + +// tax : 2014-03-20 Storm Orchard, LLC +tax + +// taxi : 2015-03-19 Pine Falls, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Atomic Lake, LLC +team + +// tech : 2015-01-30 Dot Tech LLC +tech + +// technology : 2013-09-13 Auburn Falls +technology + +// telecity : 2015-02-19 TelecityGroup International Limited +telecity + +// telefonica : 2014-10-16 Telefónica S.A. +telefonica + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Cotton Bloom, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Homer TLC, Inc. +thd + +// theater : 2015-03-19 Blue Tigers, LLC +theater + +// theatre : 2015-05-07 +theatre + +// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +tiaa + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Victor Manor, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Corn Willow, LLC +tips + +// tires : 2014-11-07 Dog Edge, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tjmaxx : 2015-07-16 The TJX Companies, Inc. +tjmaxx + +// tjx : 2015-07-16 The TJX Companies, Inc. +tjx + +// tkmaxx : 2015-07-16 The TJX Companies, Inc. +tkmaxx + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Pearl Woods, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Pioneer North, LLC +tools + +// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// total : 2015-08-06 Total SA +total + +// tours : 2015-01-22 Sugar Station, LLC +tours + +// town : 2014-03-06 Koko Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Pioneer Orchard, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 IG Group Holdings PLC +trading + +// training : 2013-11-07 Wild Willow, LLC +training + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon EU S.à r.l. +tunes + +// tushu : 2014-12-18 Amazon EU S.à r.l. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubank : 2015-08-20 National Australia Bank Limited +ubank + +// ubs : 2014-12-11 UBS AG +ubs + +// uconnect : 2015-07-30 FCA US LLC. +uconnect + +// unicom : 2015-10-15 China United Network Communications Corporation Limited +unicom + +// university : 2014-03-06 Little Station, LLC +university + +// uno : 2013-09-11 Dot Latin LLC +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Atomic Tigers, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vanguard : 2015-09-03 The Vanguard Group, Inc. +vanguard + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Lake, LLC +ventures + +// verisign : 2015-08-13 VeriSign, Inc. +verisign + +// versicherung : 2014-03-20 +versicherung + +// vet : 2014-03-06 +vet + +// viajes : 2013-10-17 Black Madison, LLC +viajes + +// video : 2014-10-16 +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 New Sky, LLC +villas + +// vin : 2015-06-18 Holly Shadow, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// visa : 2015-07-30 Visa Worldwide Pte. Limited +visa + +// vision : 2013-12-05 Koko Station, LLC +vision + +// vista : 2014-09-18 Vistaprint Limited +vista + +// vistaprint : 2014-09-18 Vistaprint Limited +vistaprint + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vivo : 2015-07-31 Telefonica Brasil S.A. +vivo + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Top Level Domain Holdings Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +volvo + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Ruby House, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walmart : 2015-07-31 Wal-Mart Stores, Inc. +walmart + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Leo Limited +wang + +// wanggou : 2014-12-18 Amazon EU S.à r.l. +wanggou + +// warman : 2015-06-18 Weir Group IP Limited +warman + +// watch : 2013-11-14 Sand Shadow, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 The Weather Channel, LLC +weather + +// weatherchannel : 2015-03-12 The Weather Channel, LLC +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Top Level Domain Holdings Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 June Station, LLC +wine + +// winners : 2015-07-16 The TJX Companies, Inc. +winners + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +wolterskluwer + +// woodside : 2015-07-09 Woodside Petroleum Limited +woodside + +// work : 2013-12-19 Top Level Domain Holdings Limited +work + +// works : 2013-11-14 Little Dynamite, LLC +works + +// world : 2014-06-12 Bitter Fields, LLC +world + +// wow : 2015-10-08 Amazon EU S.à r.l. +wow + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Hidden Way, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xfinity : 2015-07-09 Comcast IP Holdings I, LLC +xfinity + +// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited +å…«å¦ + +// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +å…¬å¸ + +// xn--5su34j936bgsg : 2015-09-03 Shangriâ€La International Hotel Management Limited +香格里拉 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +моÑква + +// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +католик + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +Ñайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +è”通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +×§×•× + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +æ—¶å°š + +// xn--9krt00a : 2015-03-12 Sina Corporation +å¾®åš + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. +ストア + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited +商标 + +// xn--czrs0t : 2013-12-19 Wild Island, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet†+дети + +// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. +ãƒã‚¤ãƒ³ãƒˆ + +// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch æ–°åŽé€šè®¯ç¤¾å¹¿ä¸œåˆ†ç¤¾ +æ–°é—» + +// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited +工行 + +// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. +å®¶é›» + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Will Bloom, LLC +å¨±ä¹ + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +è°·æ­Œ + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. +クラウド + +// xn--gk3at1e : 2015-10-08 Amazon EU S.à r.l. +通販 + +// xn--hxt814e : 2014-05-15 Zodiac Libra Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited +é¤åŽ… + +// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. +é£Ÿå“ + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kpu716f : 2014-12-22 Richemont DNS Inc. +手表 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +اتصالات + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. +موبايلي + +// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +ابوظبي + +// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +كاثوليك + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +ë‹·ì»´ + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--ngbrx : 2015-11-12 League of Arab States +عرب + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +å¥åº· + +// xn--p1acf : 2013-12-12 Rusnames Limited +Ñ€ÑƒÑ + +// xn--pbt977c : 2014-12-22 Richemont DNS Inc. +ç å® + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +ã¿ã‚“㪠+ +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. +æ›¸ç± + +// xn--ses554g : 2014-01-16 +ç½‘å€ + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +ë‹·ë„· + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +天主教 + +// xn--unup4y : 2013-07-14 Spring Fields, LLC +æ¸¸æˆ + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Dash McCook, LLC +ä¼ä¸š + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +ä¿¡æ¯ + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +嘉里 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xperia : 2015-05-14 Sony Mobile Communications AB +xperia + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon EU S.à r.l. +yamaxun + +// yandex : 2014-04-10 YANDEX, LLC +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Top Level Domain Holdings Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon EU S.à r.l. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +yun + +// zappos : 2015-06-25 Amazon EU S.à r.l. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon EU S.à r.l. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zippo : 2015-07-02 Zadco Company +zippo + +// zone : 2013-11-14 Outer Falls, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC +cc.ua +inf.ua +ltd.ua + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa +beep.pl + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko +*.compute.estate +*.alces.network + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril +*.alwaysdata.net + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller +cloudfront.net + +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn +us-east-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Luke Wells +cn-north-1.eb.amazonaws.com.cn +elasticbeanstalk.com +ap-northeast-1.elasticbeanstalk.com +ap-northeast-2.elasticbeanstalk.com +ap-south-1.elasticbeanstalk.com +ap-southeast-1.elasticbeanstalk.com +ap-southeast-2.elasticbeanstalk.com +ca-central-1.elasticbeanstalk.com +eu-central-1.elasticbeanstalk.com +eu-west-1.elasticbeanstalk.com +eu-west-2.elasticbeanstalk.com +sa-east-1.elasticbeanstalk.com +us-east-1.elasticbeanstalk.com +us-east-2.elasticbeanstalk.com +us-gov-west-1.elasticbeanstalk.com +us-west-1.elasticbeanstalk.com +us-west-2.elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Luke Wells +*.elb.amazonaws.com +*.elb.amazonaws.com.cn + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Luke Wells +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-ca-central-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com +s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amune : https://amune.org/ +// Submitted by Team Amune +t3l3p0rt.net +tele.amune.org + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco +on-aptible.com + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise +myfritz.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy +*.awdev.ca +*.advisor.ws + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas +backplaneapp.io + +// BetaInABox +// Submitted by Adrian +betainabox.com + +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan +bnr.la + +// Boomla : https://boomla.com +// Submitted by Tibor Halter +boomla.net + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// BrowserSafetyMark +// Submitted by Dave Tharp +browsersafetymark.io + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp +mycd.eu + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry +ae.org +ar.com +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.com +gb.net +hu.com +hu.net +jp.net +jpn.com +kr.com +mex.com +no.com +qc.com +ru.com +sa.com +se.com +se.net +uk.com +uk.net +us.com +uy.com +za.bz +za.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown +in.net + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown +co.com + +// c.la : http://www.c.la/ +c.la + +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard +xenapponazure.com + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland +virtueeldomein.nl + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi +c66.me + +// CloudAccess.net : https://www.cloudaccess.net/ +// Submitted by Pawel Panek +jdevcloud.com +wpdevcloud.com +cloudaccess.host +freesite.host +cloudaccess.net + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken +cloudcontrolled.com +cloudcontrolapp.com + +// co.ca : http://registry.co.ca/ +co.ca + +// i-registry s.r.o. : http://www.i-registry.cz/ +// Submitted by Martin Semrad +co.cz + +// CDN77.com : http://www.cdn77.com +// Submitted by Jan Krpes +c.cdn77.org +cdn77-ssl.net +r.cdn77.net +rsc.cdn77.org +ssl.origin.cdn77-secure.org + +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + +// CoDNS B.V. +co.nl +co.no + +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady +*.cryptonomic.net + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg +cupcake.is + +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger +cyon.link +cyon.site + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal +daplie.me +localhost.daplie.me + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// Debian : https://www.debian.org/ +// Submitted by Peter Palfrader / Debian Sysadmin Team +debian.net + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen +dedyn.io + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler +dnshome.de + +// DrayTek Corp. : https://www.draytek.com/ +// Submitted by Paul Fang +drayddns.com + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer +dreamhosters.com + +// Drobo : http://www.drobo.com/ +// Submitted by Ricardo Padilha +mydrobo.com + +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges +drud.io +drud.us + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper +duckdns.org + +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen +dy.fi +tunk.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// Definima : http://www.definima.com/ +// Submitted by Maxence Bitterli +definima.net +definima.io + +// Dynu.com : https://www.dynu.com/ +// Submitted by Sue Ye +ddnsfree.com +ddnsgeek.com +giize.com +gleeze.com +kozow.com +loseyourip.com +ooguy.com +theworkpc.com +casacam.net +dynu.net +accesscam.org +camdvr.org +freeddns.org +mywire.org +webredirect.org +myddns.rocks +blogsite.xyz + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr +e4.cz + +// Enalean SAS: https://www.enalean.com +// Submitted by Thomas Cottier +mytuleap.com + +// Enonic : http://enonic.com/ +// Submitted by Erik Kaareng-Sunde +enonic.io +customer.enonic.io + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +eu-4.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com +us-4.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Facebook, Inc. +// Submitted by Peter Ruibal +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fancy Bits, LLC : http://getchannels.com +// Submitted by Aman Gupta +channelsdvr.net + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net + +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke +fhapp.xyz + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org + +// Filegear Inc. : https://www.filegear.com +// Submitted by Jason Zhu +filegear.me + +// Firebase, Inc. +// Submitted by Chris Raynor +firebaseapp.com + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg +flynnhub.com +flynnhosting.net + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// Fusion Intranet : https://www.fusion-intranet.com +// Submitted by Matthias Burtscher +myfusion.cloud + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner +*.futurecms.at +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley +service.gov.uk + +// GitHub, Inc. +// Submitted by Patrick Toomey +github.io +githubusercontent.com + +// GitLab, Inc. +// Submitted by Alex Hanselka +gitlab.io + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks +homeoffice.gov.uk + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi +ro.im +shop.ro + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter +goip.de + +// Google, Inc. +// Submitted by Eduardo Vela +*.0emm.com +appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +cloudfunctions.net +cloud.goog +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com + +// Hashbang : https://hashbang.sh +hashbang.sh + +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid +hepforge.org + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher +herokuapp.com +herokussl.com + +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan +moonscale.net + +// iki.fi +// Submitted by Hannu Aronsson +iki.fi + +// info.at : http://www.info.at/ +biz.at +info.at + +// info.cx : http://info.cx +// Submitted by Jacob Slater +info.cx + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// intermetrics GmbH : https://pixolino.com/ +// Submitted by Wolfgang Schwarz +pixolino.com + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman +ipifony.net + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim +js.org + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl +keymachine.de + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene +knightpoint.systems + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de +// Submitted by Lars Laehn +git-repos.de +lcube-server.de +svn-repos.de + +// LiquidNet Ltd : http://www.liquidnetlimited.com/ +// Submitted by Victor Velchev +we.bs + +// Lukanet Ltd : https://lukanet.com +// Submitted by Anton Avramov +barsy.bg +barsyonline.com +barsy.de +barsy.eu +barsy.in +barsy.net +barsy.online +barsy.support + +// Magento Commerce +// Submitted by Damien Tournoud +*.magentosite.cloud + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy +hb.cldmail.ru + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by ZdenÄ›k Å ustr +cloud.metacentrum.cz +custom.metacentrum.cz + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier +meteorapp.com +eu.meteorapp.com + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft : http://microsoft.com +// Submitted by Barry Dorrans +azurewebsites.net +azure-mobile.net +cloudapp.net + +// Mozilla Foundation : https://mozilla.org/ +// Submitted by glob +bmoattachments.org + +// MSK-IX : https://www.msk-ix.ru/ +// Submitted by Khannanov Roman +net.ru +org.ru +pp.ru + +// Netlify : https://www.netlify.com +// Submitted by Jessica Parsons +bitballoon.com +netlify.com + +// Neustar Inc. +// Submitted by Trung Tran +4u.com + +// ngrok : https://ngrok.com/ +// Submitted by Alan Shreve +ngrok.io + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse +nfshost.com + +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NodeArt : https://nodeart.io +// Submitted by Konstantin Nosov +stage.nodeart.io + +// Nodum B.V. : https://nodum.io/ +// Submitted by Wietse Wind +nodum.co +nodum.io + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown +nyc.mn + +// NymNom : https://nymnom.com/ +// Submitted by Dave McCormack +nom.ae +nom.ai +nom.al +nym.by +nym.bz +nom.cl +nom.gd +nom.gl +nym.gr +nom.gt +nom.hn +nom.im +nym.kz +nym.la +nom.li +nym.li +nym.lt +nym.lu +nym.me +nom.mk +nym.mx +nom.nu +nym.nz +nym.pe +nym.pt +nom.pw +nom.qa +nom.rs +nom.si +nym.sk +nym.su +nym.sx +nym.tw +nom.ug +nom.uy +nom.vc +nom.vg + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson +cya.gg + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones +nid.io + +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach +opencraft.hosting + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen +operaunite.com + +// OutSystems +// Submitted by Duarte Santos +outsystemscloud.com + +// OwnProvider : http://www.ownprovider.com +// Submitted by Jan Moennich +ownprovider.com + +// oy.lc +// Submitted by Charly Coste +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers +pgfog.com + +// Pagefront : https://www.pagefronthq.com/ +// Submitted by Jason Kriss +pagefrontapp.com + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// Pantheon Systems, Inc. : https://pantheon.io/ +// Submitted by Gary Dylina +pantheonsite.io +gotpantheon.com + +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung +mypep.link + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur +*.platform.sh +*.platformsh.site + +// prgmr.com : https://prgmr.com/ +// Submitted by Sarah Newman +xen.prgmr.com + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry +priv.at + +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama +chirurgiens-dentistes-en-france.fr +byen.site + +// QA2 +// Submitted by Daniel Dent (https://www.danieldent.com/) +qa2.com + +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz +vapor.cloud +vaporcloud.io + +// Rackmaze LLC : https://www.rackmaze.com +// Submitted by Kirill Pertsev +rackmaze.com +rackmaze.net + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer +rhcloud.com + +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price +wellbeingzone.eu +ptplus.fit +wellbeingzone.co.uk + +// Sandstorm Development Group, Inc. : https://sandcats.io/ +// Submitted by Asheesh Laroia +sandcats.io + +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick +logoip.de +logoip.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// SensioLabs, SAS : https://sensiolabs.com/ +// Submitted by Fabien Potencier +*.sensiosite.cloud + +// Service Online LLC : http://drs.ua/ +// Submitted by Serhii Bulakh +biz.ua +co.ua +pp.ua + +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers +myshopblocks.com + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine +1kapp.com +appchizi.com +applinzi.com +sinaapp.com +vipsinaapp.com + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// staticland : https://static.land +// Submitted by Seth Vincent +static.land +dev.static.land +sites.static.land + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan +spacekit.io + +// Stackspace : https://www.stackspace.io/ +// Submitted by Lina He +stackspace.space + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins +storj.farm + +// Sub 6 Limited: http://www.sub6.com +// Submitted by Dan Miller +temp-dns.com + +// Synology, Inc. : https://www.synology.com/ +// Submitted by Rony Weng +diskstation.me +dscloud.biz +dscloud.me +dscloud.mobi +dsmynas.com +dsmynas.net +dsmynas.org +familyds.com +familyds.net +familyds.org +i234.me +myds.me +synology.me +vpnplus.to + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke +taifun-dns.de + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// Thingdust AG : https://thingdust.com/ +// Submitted by Adrian Imboden +cust.dev.thingdust.io +cust.disrec.thingdust.io +cust.prod.thingdust.io +cust.testing.thingdust.io + +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward +bloxcms.com +townnews-staging.com + +// TrafficPlex GmbH : https://www.trafficplex.de/ +// Submitted by Phillipp Röll +12hp.at +2ix.at +4lima.at +lima-city.at +12hp.ch +2ix.ch +4lima.ch +lima-city.ch +trafficplex.cloud +de.cool +12hp.de +2ix.de +4lima.de +lima-city.de +1337.pictures +clan.rip +lima-city.rocks +webspace.rocks +lima.zone + +// TransIP : htts://www.transip.nl +// Submitted by Rory Breuk +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner +uber.space + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry +hk.com +hk.org +ltd.hk +inc.hk + +// .US +// Submitted by Ed Moore +lib.de.us + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel +router.management + +// Virtual-Info : https://www.virtual-info.info/ +// Submitted by Adnan RIHAN +v-info.info + +// WeDeploy by Liferay, Inc. : https://www.wedeploy.com +// Submitted by Henrique Vicente +wedeploy.io +wedeploy.me +wedeploy.sh + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin +remotewd.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Yuvi Panda +wmflabs.org + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman +cistron.nl +demon.nl +xs4all.space + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera +yolasite.com + +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + +// ZaNiC : http://www.za.net/ +// Submitted by registry +za.net +za.org + +// Zeit, Inc. : https://zeit.domains/ +// Submitted by Olli Vanhoja +now.sh + +// ===END PRIVATE DOMAINS=== diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix.rb new file mode 100644 index 0000000..7b79dd3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix.rb @@ -0,0 +1,175 @@ +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2017 Simone Carletti + +require_relative "public_suffix/domain" +require_relative "public_suffix/version" +require_relative "public_suffix/errors" +require_relative "public_suffix/rule" +require_relative "public_suffix/list" + +# PublicSuffix is a Ruby domain name parser based on the Public Suffix List. +# +# The [Public Suffix List](https://publicsuffix.org) is a cross-vendor initiative +# to provide an accurate list of domain name suffixes. +# +# The Public Suffix List is an initiative of the Mozilla Project, +# but is maintained as a community resource. It is available for use in any software, +# but was originally created to meet the needs of browser manufacturers. +module PublicSuffix + + DOT = ".".freeze + BANG = "!".freeze + STAR = "*".freeze + + # Parses +name+ and returns the {PublicSuffix::Domain} instance. + # + # @example Parse a valid domain + # PublicSuffix.parse("google.com") + # # => # + # + # @example Parse a valid subdomain + # PublicSuffix.parse("www.google.com") + # # => # + # + # @example Parse a fully qualified domain + # PublicSuffix.parse("google.com.") + # # => # + # + # @example Parse a fully qualified domain (subdomain) + # PublicSuffix.parse("www.google.com.") + # # => # + # + # @example Parse an invalid (unlisted) domain + # PublicSuffix.parse("x.yz") + # # => # + # + # @example Parse an invalid (unlisted) domain with strict checking (without applying the default * rule) + # PublicSuffix.parse("x.yz", default_rule: nil) + # # => PublicSuffix::DomainInvalid: `x.yz` is not a valid domain + # + # @example Parse an URL (not supported, only domains) + # PublicSuffix.parse("http://www.google.com") + # # => PublicSuffix::DomainInvalid: http://www.google.com is not expected to contain a scheme + # + # + # @param [String, #to_s] name The domain name or fully qualified domain name to parse. + # @param [PublicSuffix::List] list The rule list to search, defaults to the default {PublicSuffix::List} + # @param [Boolean] ignore_private + # @return [PublicSuffix::Domain] + # + # @raise [PublicSuffix::DomainInvalid] + # If domain is not a valid domain. + # @raise [PublicSuffix::DomainNotAllowed] + # If a rule for +domain+ is found, but the rule doesn't allow +domain+. + def self.parse(name, list: List.default, default_rule: list.default_rule, ignore_private: false) + what = normalize(name) + raise what if what.is_a?(DomainInvalid) + + rule = list.find(what, default: default_rule, ignore_private: ignore_private) + + # rubocop:disable Style/IfUnlessModifier + if rule.nil? + raise DomainInvalid, "`#{what}` is not a valid domain" + end + if rule.decompose(what).last.nil? + raise DomainNotAllowed, "`#{what}` is not allowed according to Registry policy" + end + # rubocop:enable Style/IfUnlessModifier + + decompose(what, rule) + end + + # Checks whether +domain+ is assigned and allowed, without actually parsing it. + # + # This method doesn't care whether domain is a domain or subdomain. + # The validation is performed using the default {PublicSuffix::List}. + # + # @example Validate a valid domain + # PublicSuffix.valid?("example.com") + # # => true + # + # @example Validate a valid subdomain + # PublicSuffix.valid?("www.example.com") + # # => true + # + # @example Validate a not-listed domain + # PublicSuffix.valid?("example.tldnotlisted") + # # => true + # + # @example Validate a not-listed domain with strict checking (without applying the default * rule) + # PublicSuffix.valid?("example.tldnotlisted") + # # => true + # PublicSuffix.valid?("example.tldnotlisted", default_rule: nil) + # # => false + # + # @example Validate a fully qualified domain + # PublicSuffix.valid?("google.com.") + # # => true + # PublicSuffix.valid?("www.google.com.") + # # => true + # + # @example Check an URL (which is not a valid domain) + # PublicSuffix.valid?("http://www.example.com") + # # => false + # + # + # @param [String, #to_s] name The domain name or fully qualified domain name to validate. + # @param [Boolean] ignore_private + # @return [Boolean] + def self.valid?(name, list: List.default, default_rule: list.default_rule, ignore_private: false) + what = normalize(name) + return false if what.is_a?(DomainInvalid) + + rule = list.find(what, default: default_rule, ignore_private: ignore_private) + + !rule.nil? && !rule.decompose(what).last.nil? + end + + # Attempt to parse the name and returns the domain, if valid. + # + # This method doesn't raise. Instead, it returns nil if the domain is not valid for whatever reason. + # + # @param [String, #to_s] name The domain name or fully qualified domain name to parse. + # @param [PublicSuffix::List] list The rule list to search, defaults to the default {PublicSuffix::List} + # @param [Boolean] ignore_private + # @return [String] + def self.domain(name, **options) + parse(name, **options).domain + rescue PublicSuffix::Error + nil + end + + + # private + + def self.decompose(name, rule) + left, right = rule.decompose(name) + + parts = left.split(DOT) + # If we have 0 parts left, there is just a tld and no domain or subdomain + # If we have 1 part left, there is just a tld, domain and not subdomain + # If we have 2 parts left, the last part is the domain, the other parts (combined) are the subdomain + tld = right + sld = parts.empty? ? nil : parts.pop + trd = parts.empty? ? nil : parts.join(DOT) + + Domain.new(tld, sld, trd) + end + + # Pretend we know how to deal with user input. + def self.normalize(name) + name = name.to_s.dup + name.strip! + name.chomp!(DOT) + name.downcase! + + return DomainInvalid.new("Name is blank") if name.empty? + return DomainInvalid.new("Name starts with a dot") if name.start_with?(DOT) + return DomainInvalid.new("%s is not expected to contain a scheme" % name) if name.include?("://") + name + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/domain.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/domain.rb new file mode 100644 index 0000000..4c4edd4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/domain.rb @@ -0,0 +1,235 @@ +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2017 Simone Carletti + +module PublicSuffix + + # Domain represents a domain name, composed by a TLD, SLD and TRD. + class Domain + + # Splits a string into the labels, that is the dot-separated parts. + # + # The input is not validated, but it is assumed to be a valid domain name. + # + # @example + # + # name_to_labels('example.com') + # # => ['example', 'com'] + # + # name_to_labels('example.co.uk') + # # => ['example', 'co', 'uk'] + # + # @param name [String, #to_s] The domain name to split. + # @return [Array] + def self.name_to_labels(name) + name.to_s.split(DOT) + end + + + attr_reader :tld, :sld, :trd + + # Creates and returns a new {PublicSuffix::Domain} instance. + # + # @overload initialize(tld) + # Initializes with a +tld+. + # @param [String] tld The TLD (extension) + # @overload initialize(tld, sld) + # Initializes with a +tld+ and +sld+. + # @param [String] tld The TLD (extension) + # @param [String] sld The TRD (domain) + # @overload initialize(tld, sld, trd) + # Initializes with a +tld+, +sld+ and +trd+. + # @param [String] tld The TLD (extension) + # @param [String] sld The SLD (domain) + # @param [String] tld The TRD (subdomain) + # + # @yield [self] Yields on self. + # @yieldparam [PublicSuffix::Domain] self The newly creates instance + # + # @example Initialize with a TLD + # PublicSuffix::Domain.new("com") + # # => # + # + # @example Initialize with a TLD and SLD + # PublicSuffix::Domain.new("com", "example") + # # => # + # + # @example Initialize with a TLD, SLD and TRD + # PublicSuffix::Domain.new("com", "example", "wwww") + # # => # + # + def initialize(*args) + @tld, @sld, @trd = args + yield(self) if block_given? + end + + # Returns a string representation of this object. + # + # @return [String] + def to_s + name + end + + # Returns an array containing the domain parts. + # + # @return [Array] + # + # @example + # + # PublicSuffix::Domain.new("google.com").to_a + # # => [nil, "google", "com"] + # + # PublicSuffix::Domain.new("www.google.com").to_a + # # => [nil, "google", "com"] + # + def to_a + [@trd, @sld, @tld] + end + + # Returns the full domain name. + # + # @return [String] + # + # @example Gets the domain name of a domain + # PublicSuffix::Domain.new("com", "google").name + # # => "google.com" + # + # @example Gets the domain name of a subdomain + # PublicSuffix::Domain.new("com", "google", "www").name + # # => "www.google.com" + # + def name + [@trd, @sld, @tld].compact.join(DOT) + end + + # Returns a domain-like representation of this object + # if the object is a {#domain?}, nil otherwise. + # + # PublicSuffix::Domain.new("com").domain + # # => nil + # + # PublicSuffix::Domain.new("com", "google").domain + # # => "google.com" + # + # PublicSuffix::Domain.new("com", "google", "www").domain + # # => "www.google.com" + # + # This method doesn't validate the input. It handles the domain + # as a valid domain name and simply applies the necessary transformations. + # + # This method returns a FQD, not just the domain part. + # To get the domain part, use #sld (aka second level domain). + # + # PublicSuffix::Domain.new("com", "google", "www").domain + # # => "google.com" + # + # PublicSuffix::Domain.new("com", "google", "www").sld + # # => "google" + # + # @see #domain? + # @see #subdomain + # + # @return [String] + def domain + [@sld, @tld].join(DOT) if domain? + end + + # Returns a subdomain-like representation of this object + # if the object is a {#subdomain?}, nil otherwise. + # + # PublicSuffix::Domain.new("com").subdomain + # # => nil + # + # PublicSuffix::Domain.new("com", "google").subdomain + # # => nil + # + # PublicSuffix::Domain.new("com", "google", "www").subdomain + # # => "www.google.com" + # + # This method doesn't validate the input. It handles the domain + # as a valid domain name and simply applies the necessary transformations. + # + # This method returns a FQD, not just the subdomain part. + # To get the subdomain part, use #trd (aka third level domain). + # + # PublicSuffix::Domain.new("com", "google", "www").subdomain + # # => "www.google.com" + # + # PublicSuffix::Domain.new("com", "google", "www").trd + # # => "www" + # + # @see #subdomain? + # @see #domain + # + # @return [String] + def subdomain + [@trd, @sld, @tld].join(DOT) if subdomain? + end + + # Checks whether self looks like a domain. + # + # This method doesn't actually validate the domain. + # It only checks whether the instance contains + # a value for the {#tld} and {#sld} attributes. + # If you also want to validate the domain, + # use {#valid_domain?} instead. + # + # @example + # + # PublicSuffix::Domain.new("com").domain? + # # => false + # + # PublicSuffix::Domain.new("com", "google").domain? + # # => true + # + # PublicSuffix::Domain.new("com", "google", "www").domain? + # # => true + # + # # This is an invalid domain, but returns true + # # because this method doesn't validate the content. + # PublicSuffix::Domain.new("com", nil).domain? + # # => true + # + # @see #subdomain? + # + # @return [Boolean] + def domain? + !(@tld.nil? || @sld.nil?) + end + + # Checks whether self looks like a subdomain. + # + # This method doesn't actually validate the subdomain. + # It only checks whether the instance contains + # a value for the {#tld}, {#sld} and {#trd} attributes. + # If you also want to validate the domain, + # use {#valid_subdomain?} instead. + # + # @example + # + # PublicSuffix::Domain.new("com").subdomain? + # # => false + # + # PublicSuffix::Domain.new("com", "google").subdomain? + # # => false + # + # PublicSuffix::Domain.new("com", "google", "www").subdomain? + # # => true + # + # # This is an invalid domain, but returns true + # # because this method doesn't validate the content. + # PublicSuffix::Domain.new("com", "example", nil).subdomain? + # # => true + # + # @see #domain? + # + # @return [Boolean] + def subdomain? + !(@tld.nil? || @sld.nil? || @trd.nil?) + end + + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/errors.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/errors.rb new file mode 100644 index 0000000..a636e76 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/errors.rb @@ -0,0 +1,39 @@ +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2017 Simone Carletti + +module PublicSuffix + + class Error < StandardError + end + + # Raised when trying to parse an invalid name. + # A name is considered invalid when no rule is found in the definition list. + # + # @example + # + # PublicSuffix.parse("nic.test") + # # => PublicSuffix::DomainInvalid + # + # PublicSuffix.parse("http://www.nic.it") + # # => PublicSuffix::DomainInvalid + # + class DomainInvalid < Error + end + + # Raised when trying to parse a name that matches a suffix. + # + # @example + # + # PublicSuffix.parse("nic.do") + # # => PublicSuffix::DomainNotAllowed + # + # PublicSuffix.parse("www.nic.do") + # # => PublicSuffix::Domain + # + class DomainNotAllowed < DomainInvalid + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/list.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/list.rb new file mode 100644 index 0000000..4bd432f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/list.rb @@ -0,0 +1,243 @@ +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2017 Simone Carletti + +module PublicSuffix + + # A {PublicSuffix::List} is a collection of one + # or more {PublicSuffix::Rule}. + # + # Given a {PublicSuffix::List}, + # you can add or remove {PublicSuffix::Rule}, + # iterate all items in the list or search for the first rule + # which matches a specific domain name. + # + # # Create a new list + # list = PublicSuffix::List.new + # + # # Push two rules to the list + # list << PublicSuffix::Rule.factory("it") + # list << PublicSuffix::Rule.factory("com") + # + # # Get the size of the list + # list.size + # # => 2 + # + # # Search for the rule matching given domain + # list.find("example.com") + # # => # + # list.find("example.org") + # # => nil + # + # You can create as many {PublicSuffix::List} you want. + # The {PublicSuffix::List.default} rule list is used + # to tokenize and validate a domain. + # + class List + + DEFAULT_LIST_PATH = File.expand_path("../../data/list.txt", __dir__) + + # Gets the default rule list. + # + # Initializes a new {PublicSuffix::List} parsing the content + # of {PublicSuffix::List.default_list_content}, if required. + # + # @return [PublicSuffix::List] + def self.default(**options) + @default ||= parse(File.read(DEFAULT_LIST_PATH), options) + end + + # Sets the default rule list to +value+. + # + # @param value [PublicSuffix::List] the new list + # @return [PublicSuffix::List] + def self.default=(value) + @default = value + end + + # Parse given +input+ treating the content as Public Suffix List. + # + # See http://publicsuffix.org/format/ for more details about input format. + # + # @param string [#each_line] the list to parse + # @param private_domains [Boolean] whether to ignore the private domains section + # @return [PublicSuffix::List] + def self.parse(input, private_domains: true) + comment_token = "//".freeze + private_token = "===BEGIN PRIVATE DOMAINS===".freeze + section = nil # 1 == ICANN, 2 == PRIVATE + + new do |list| + input.each_line do |line| + line.strip! + case # rubocop:disable Style/EmptyCaseCondition + + # skip blank lines + when line.empty? + next + + # include private domains or stop scanner + when line.include?(private_token) + break if !private_domains + section = 2 + + # skip comments + when line.start_with?(comment_token) + next + + else + list.add(Rule.factory(line, private: section == 2)) + + end + end + end + end + + + # Initializes an empty {PublicSuffix::List}. + # + # @yield [self] Yields on self. + # @yieldparam [PublicSuffix::List] self The newly created instance. + def initialize + @rules = {} + yield(self) if block_given? + end + + + # Checks whether two lists are equal. + # + # List one is equal to two, if two is an instance of + # {PublicSuffix::List} and each +PublicSuffix::Rule::*+ + # in list one is available in list two, in the same order. + # + # @param other [PublicSuffix::List] the List to compare + # @return [Boolean] + def ==(other) + return false unless other.is_a?(List) + equal?(other) || @rules == other.rules + end + alias eql? == + + # Iterates each rule in the list. + def each(&block) + Enumerator.new do |y| + @rules.each do |key, node| + y << entry_to_rule(node, key) + end + end.each(&block) + end + + + # Adds the given object to the list and optionally refreshes the rule index. + # + # @param rule [PublicSuffix::Rule::*] the rule to add to the list + # @return [self] + def add(rule) + @rules[rule.value] = rule_to_entry(rule) + self + end + alias << add + + # Gets the number of rules in the list. + # + # @return [Integer] + def size + @rules.size + end + + # Checks whether the list is empty. + # + # @return [Boolean] + def empty? + @rules.empty? + end + + # Removes all rules. + # + # @return [self] + def clear + @rules.clear + self + end + + # Finds and returns the rule corresponding to the longest public suffix for the hostname. + # + # @param name [#to_s] the hostname + # @param default [PublicSuffix::Rule::*] the default rule to return in case no rule matches + # @return [PublicSuffix::Rule::*] + def find(name, default: default_rule, **options) + rule = select(name, **options).inject do |l, r| + return r if r.class == Rule::Exception + l.length > r.length ? l : r + end + rule || default + end + + # Selects all the rules matching given hostame. + # + # If `ignore_private` is set to true, the algorithm will skip the rules that are flagged as + # private domain. Note that the rules will still be part of the loop. + # If you frequently need to access lists ignoring the private domains, + # you should create a list that doesn't include these domains setting the + # `private_domains: false` option when calling {.parse}. + # + # Note that this method is currently private, as you should not rely on it. Instead, + # the public interface is {#find}. The current internal algorithm allows to return all + # matching rules, but different data structures may not be able to do it, and instead would + # return only the match. For this reason, you should rely on {#find}. + # + # @param name [#to_s] the hostname + # @param ignore_private [Boolean] + # @return [Array] + def select(name, ignore_private: false) + name = name.to_s + + parts = name.split(DOT).reverse! + index = 0 + query = parts[index] + rules = [] + + loop do + match = @rules[query] + if !match.nil? && (ignore_private == false || match.private == false) + rules << entry_to_rule(match, query) + end + + index += 1 + break if index >= parts.size + query = parts[index] + DOT + query + end + + rules + end + private :select + + # Gets the default rule. + # + # @see PublicSuffix::Rule.default_rule + # + # @return [PublicSuffix::Rule::*] + def default_rule + PublicSuffix::Rule.default + end + + + protected + + attr_reader :rules + + + private + + def entry_to_rule(entry, value) + entry.type.new(value: value, length: entry.length, private: entry.private) + end + + def rule_to_entry(rule) + Rule::Entry.new(rule.class, rule.length, rule.private) + end + + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/rule.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/rule.rb new file mode 100644 index 0000000..735ad72 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/rule.rb @@ -0,0 +1,348 @@ +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2017 Simone Carletti + +module PublicSuffix + + # A Rule is a special object which holds a single definition + # of the Public Suffix List. + # + # There are 3 types of rules, each one represented by a specific + # subclass within the +PublicSuffix::Rule+ namespace. + # + # To create a new Rule, use the {PublicSuffix::Rule#factory} method. + # + # PublicSuffix::Rule.factory("ar") + # # => # + # + module Rule + + # @api internal + Entry = Struct.new(:type, :length, :private) + + # = Abstract rule class + # + # This represent the base class for a Rule definition + # in the {Public Suffix List}[https://publicsuffix.org]. + # + # This is intended to be an Abstract class + # and you shouldn't create a direct instance. The only purpose + # of this class is to expose a common interface + # for all the available subclasses. + # + # * {PublicSuffix::Rule::Normal} + # * {PublicSuffix::Rule::Exception} + # * {PublicSuffix::Rule::Wildcard} + # + # ## Properties + # + # A rule is composed by 4 properties: + # + # value - A normalized version of the rule name. + # The normalization process depends on rule tpe. + # + # Here's an example + # + # PublicSuffix::Rule.factory("*.google.com") + # # + # + # ## Rule Creation + # + # The best way to create a new rule is passing the rule name + # to the PublicSuffix::Rule.factory method. + # + # PublicSuffix::Rule.factory("com") + # # => PublicSuffix::Rule::Normal + # + # PublicSuffix::Rule.factory("*.com") + # # => PublicSuffix::Rule::Wildcard + # + # This method will detect the rule type and create an instance + # from the proper rule class. + # + # ## Rule Usage + # + # A rule describes the composition of a domain name and explains how to tokenize + # the name into tld, sld and trd. + # + # To use a rule, you first need to be sure the name you want to tokenize + # can be handled by the current rule. + # You can use the #match? method. + # + # rule = PublicSuffix::Rule.factory("com") + # + # rule.match?("google.com") + # # => true + # + # rule.match?("google.com") + # # => false + # + # Rule order is significant. A name can match more than one rule. + # See the {Public Suffix Documentation}[http://publicsuffix.org/format/] + # to learn more about rule priority. + # + # When you have the right rule, you can use it to tokenize the domain name. + # + # rule = PublicSuffix::Rule.factory("com") + # + # rule.decompose("google.com") + # # => ["google", "com"] + # + # rule.decompose("www.google.com") + # # => ["www.google", "com"] + # + # @abstract + # + class Base + + # @return [String] the rule definition + attr_reader :value + + # @return [String] the length of the rule + attr_reader :length + + # @return [Boolean] true if the rule is a private domain + attr_reader :private + + + # Initializes a new rule from the content. + # + # @param content [String] the content of the rule + # @param private [Boolean] + def self.build(content, private: false) + new(value: content, private: private) + end + + # Initializes a new rule. + # + # @param value [String] + # @param private [Boolean] + def initialize(value:, length: nil, private: false) + @value = value.to_s + @length = length || @value.count(DOT) + 1 + @private = private + end + + # Checks whether this rule is equal to other. + # + # @param [PublicSuffix::Rule::*] other The rule to compare + # @return [Boolean] + # Returns true if this rule and other are instances of the same class + # and has the same value, false otherwise. + def ==(other) + equal?(other) || (self.class == other.class && value == other.value) + end + alias eql? == + + # Checks if this rule matches +name+. + # + # A domain name is said to match a rule if and only if + # all of the following conditions are met: + # + # - When the domain and rule are split into corresponding labels, + # that the domain contains as many or more labels than the rule. + # - Beginning with the right-most labels of both the domain and the rule, + # and continuing for all labels in the rule, one finds that for every pair, + # either they are identical, or that the label from the rule is "*". + # + # @see https://publicsuffix.org/list/ + # + # @example + # PublicSuffix::Rule.factory("com").match?("example.com") + # # => true + # PublicSuffix::Rule.factory("com").match?("example.net") + # # => false + # + # @param name [String] the domain name to check + # @return [Boolean] + def match?(name) + # Note: it works because of the assumption there are no + # rules like foo.*.com. If the assumption is incorrect, + # we need to properly walk the input and skip parts according + # to wildcard component. + diff = name.chomp(value) + diff.empty? || diff.end_with?(DOT) + end + + # @abstract + def parts + raise NotImplementedError + end + + # @abstract + # @param [String, #to_s] name The domain name to decompose + # @return [Array] + def decompose(*) + raise NotImplementedError + end + + end + + # Normal represents a standard rule (e.g. com). + class Normal < Base + + # Gets the original rule definition. + # + # @return [String] The rule definition. + def rule + value + end + + # Decomposes the domain name according to rule properties. + # + # @param [String, #to_s] name The domain name to decompose + # @return [Array] The array with [trd + sld, tld]. + def decompose(domain) + suffix = parts.join('\.') + matches = domain.to_s.match(/^(.*)\.(#{suffix})$/) + matches ? matches[1..2] : [nil, nil] + end + + # dot-split rule value and returns all rule parts + # in the order they appear in the value. + # + # @return [Array] + def parts + @value.split(DOT) + end + + end + + # Wildcard represents a wildcard rule (e.g. *.co.uk). + class Wildcard < Base + + # Initializes a new rule from the content. + # + # @param content [String] the content of the rule + # @param private [Boolean] + def self.build(content, private: false) + new(value: content.to_s[2..-1], private: private) + end + + # Initializes a new rule. + # + # @param value [String] + # @param private [Boolean] + def initialize(value:, length: nil, private: false) + super(value: value, length: length, private: private) + length or @length += 1 # * counts as 1 + end + + # Gets the original rule definition. + # + # @return [String] The rule definition. + def rule + value == "" ? STAR : STAR + DOT + value + end + + # Decomposes the domain name according to rule properties. + # + # @param [String, #to_s] name The domain name to decompose + # @return [Array] The array with [trd + sld, tld]. + def decompose(domain) + suffix = ([".*?"] + parts).join('\.') + matches = domain.to_s.match(/^(.*)\.(#{suffix})$/) + matches ? matches[1..2] : [nil, nil] + end + + # dot-split rule value and returns all rule parts + # in the order they appear in the value. + # + # @return [Array] + def parts + @value.split(DOT) + end + + end + + # Exception represents an exception rule (e.g. !parliament.uk). + class Exception < Base + + # Initializes a new rule from the content. + # + # @param content [String] the content of the rule + # @param private [Boolean] + def self.build(content, private: false) + new(value: content.to_s[1..-1], private: private) + end + + # Gets the original rule definition. + # + # @return [String] The rule definition. + def rule + BANG + value + end + + # Decomposes the domain name according to rule properties. + # + # @param [String, #to_s] name The domain name to decompose + # @return [Array] The array with [trd + sld, tld]. + def decompose(domain) + suffix = parts.join('\.') + matches = domain.to_s.match(/^(.*)\.(#{suffix})$/) + matches ? matches[1..2] : [nil, nil] + end + + # dot-split rule value and returns all rule parts + # in the order they appear in the value. + # The leftmost label is not considered a label. + # + # See http://publicsuffix.org/format/: + # If the prevailing rule is a exception rule, + # modify it by removing the leftmost label. + # + # @return [Array] + def parts + @value.split(DOT)[1..-1] + end + + end + + + # Takes the +name+ of the rule, detects the specific rule class + # and creates a new instance of that class. + # The +name+ becomes the rule +value+. + # + # @example Creates a Normal rule + # PublicSuffix::Rule.factory("ar") + # # => # + # + # @example Creates a Wildcard rule + # PublicSuffix::Rule.factory("*.ar") + # # => # + # + # @example Creates an Exception rule + # PublicSuffix::Rule.factory("!congresodelalengua3.ar") + # # => # + # + # @param [String] content The rule content. + # @return [PublicSuffix::Rule::*] A rule instance. + def self.factory(content, private: false) + case content.to_s[0, 1] + when STAR + Wildcard + when BANG + Exception + else + Normal + end.build(content, private: private) + end + + # The default rule to use if no rule match. + # + # The default rule is "*". From https://publicsuffix.org/list/: + # + # > If no rules match, the prevailing rule is "*". + # + # @return [PublicSuffix::Rule::Wildcard] The default rule. + def self.default + factory(STAR) + end + + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/version.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/version.rb new file mode 100644 index 0000000..252da92 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/lib/public_suffix/version.rb @@ -0,0 +1,10 @@ +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2017 Simone Carletti + +module PublicSuffix + # The current library version. + VERSION = "3.0.1".freeze +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/public_suffix.gemspec b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/public_suffix.gemspec new file mode 100644 index 0000000..44bfccf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/public_suffix.gemspec @@ -0,0 +1,25 @@ +# -*- encoding: utf-8 -*- +$LOAD_PATH.push File.expand_path("../lib", __FILE__) +require "public_suffix/version" + +Gem::Specification.new do |s| + s.name = "public_suffix" + s.version = PublicSuffix::VERSION + s.authors = ["Simone Carletti"] + s.email = ["weppos@weppos.net"] + s.homepage = "https://simonecarletti.com/code/publicsuffix-ruby" + s.summary = "Domain name parser based on the Public Suffix List." + s.description = "PublicSuffix can parse and decompose a domain name into top level domain, domain and subdomains." + s.licenses = ["MIT"] + + s.required_ruby_version = ">= 2.1" + + s.require_paths = ["lib"] + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + s.extra_rdoc_files = %w( LICENSE.txt ) + + s.add_development_dependency "rake" + s.add_development_dependency "mocha" + s.add_development_dependency "yard" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/.empty b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/.empty new file mode 100644 index 0000000..e322015 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/.empty @@ -0,0 +1,2 @@ +# This is an empty file I use to force a non-empty commit when I only need to store notes +.. \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/acceptance_test.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/acceptance_test.rb new file mode 100644 index 0000000..147f41f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/acceptance_test.rb @@ -0,0 +1,127 @@ +require "test_helper" + +class AcceptanceTest < Minitest::Test + + VALID_CASES = [ + ["example.com", "example.com", [nil, "example", "com"]], + ["foo.example.com", "example.com", ["foo", "example", "com"]], + + ["verybritish.co.uk", "verybritish.co.uk", [nil, "verybritish", "co.uk"]], + ["foo.verybritish.co.uk", "verybritish.co.uk", ["foo", "verybritish", "co.uk"]], + + ["parliament.uk", "parliament.uk", [nil, "parliament", "uk"]], + ["foo.parliament.uk", "parliament.uk", ["foo", "parliament", "uk"]], + ].freeze + + def test_valid + VALID_CASES.each do |input, domain, results| + parsed = PublicSuffix.parse(input) + trd, sld, tld = results + assert_equal tld, parsed.tld, "Invalid tld for `#{name}`" + assert_equal sld, parsed.sld, "Invalid sld for `#{name}`" + if trd.nil? + assert_nil parsed.trd, "Invalid trd for `#{name}`" + else + assert_equal trd, parsed.trd, "Invalid trd for `#{name}`" + end + + assert_equal domain, PublicSuffix.domain(input) + assert PublicSuffix.valid?(input) + end + end + + + INVALID_CASES = [ + ["nic.ke", PublicSuffix::DomainNotAllowed], + [nil, PublicSuffix::DomainInvalid], + ["", PublicSuffix::DomainInvalid], + [" ", PublicSuffix::DomainInvalid], + ].freeze + + def test_invalid + INVALID_CASES.each do |(name, error)| + assert_raises(error) { PublicSuffix.parse(name) } + assert !PublicSuffix.valid?(name) + end + end + + + REJECTED_CASES = [ + ["www. .com", true], + ["foo.co..uk", true], + ["goo,gle.com", true], + ["-google.com", true], + ["google-.com", true], + + # This case was covered in GH-15. + # I decided to cover this case because it's not easily reproducible with URI.parse + # and can lead to several false positives. + ["http://google.com", false], + ].freeze + + def test_rejected + REJECTED_CASES.each do |name, expected| + assert_equal expected, PublicSuffix.valid?(name), + "Expected %s to be %s" % [name.inspect, expected.inspect] + assert !valid_domain?(name), + "#{name} expected to be invalid" + end + end + + + CASE_CASES = [ + ["Www.google.com", %w( www google com )], + ["www.Google.com", %w( www google com )], + ["www.google.Com", %w( www google com )], + ].freeze + + def test_ignore_case + CASE_CASES.each do |name, results| + domain = PublicSuffix.parse(name) + trd, sld, tld = results + assert_equal tld, domain.tld, "Invalid tld for `#{name}'" + assert_equal sld, domain.sld, "Invalid sld for `#{name}'" + assert_equal trd, domain.trd, "Invalid trd for `#{name}'" + assert PublicSuffix.valid?(name) + end + end + + + INCLUDE_PRIVATE_CASES = [ + ["blogspot.com", true, "blogspot.com"], + ["blogspot.com", false, nil], + ["subdomain.blogspot.com", true, "blogspot.com"], + ["subdomain.blogspot.com", false, "subdomain.blogspot.com"], + ].freeze + + def test_ignore_private + # test domain and parse + INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected| + if expected.nil? + assert_nil PublicSuffix.domain(given, ignore_private: ignore_private) + else + assert_equal expected, PublicSuffix.domain(given, ignore_private: ignore_private) + end + end + # test valid? + INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected| + assert_equal !expected.nil?, PublicSuffix.valid?(given, ignore_private: ignore_private) + end + end + + + def valid_uri?(name) + uri = URI.parse(name) + !uri.host.nil? + rescue + false + end + + def valid_domain?(name) + uri = URI.parse(name) + !uri.host.nil? && uri.scheme.nil? + rescue + false + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_find.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_find.rb new file mode 100644 index 0000000..0074f1d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_find.rb @@ -0,0 +1,66 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +NAME_SHORT = "example.de" +NAME_MEDIUM = "www.subdomain.example.de" +NAME_LONG = "one.two.three.four.five.example.de" +NAME_WILD = "one.two.three.four.five.example.bd" +NAME_EXCP = "one.two.three.four.five.www.ck" + +IAAA = "www.example.ac" +IZZZ = "www.example.zone" + +PAAA = "one.two.three.four.five.example.beep.pl" +PZZZ = "one.two.three.four.five.example.now.sh" + +JP = "www.yokoshibahikari.chiba.jp" +IT = "www.example.it" +COM = "www.example.com" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.find("example.com") + +Benchmark.bmbm(25) do |x| + x.report("NAME_SHORT") do + TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil } + end + x.report("NAME_MEDIUM") do + TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil } + end + x.report("NAME_LONG") do + TIMES.times { PublicSuffixList.find(NAME_LONG) != nil } + end + x.report("NAME_WILD") do + TIMES.times { PublicSuffixList.find(NAME_WILD) != nil } + end + x.report("NAME_EXCP") do + TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil } + end + + x.report("IAAA") do + TIMES.times { PublicSuffixList.find(IAAA) != nil } + end + x.report("IZZZ") do + TIMES.times { PublicSuffixList.find(IZZZ) != nil } + end + + x.report("PAAA") do + TIMES.times { PublicSuffixList.find(PAAA) != nil } + end + x.report("PZZZ") do + TIMES.times { PublicSuffixList.find(PZZZ) != nil } + end + + x.report("JP") do + TIMES.times { PublicSuffixList.find(JP) != nil } + end + x.report("IT") do + TIMES.times { PublicSuffixList.find(IT) != nil } + end + x.report("COM") do + TIMES.times { PublicSuffixList.find(COM) != nil } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_find_all.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_find_all.rb new file mode 100644 index 0000000..0bcfd42 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_find_all.rb @@ -0,0 +1,102 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +NAME_SHORT = "example.de" +NAME_MEDIUM = "www.subdomain.example.de" +NAME_LONG = "one.two.three.four.five.example.de" +NAME_WILD = "one.two.three.four.five.example.bd" +NAME_EXCP = "one.two.three.four.five.www.ck" + +IAAA = "www.example.ac" +IZZZ = "www.example.zone" + +PAAA = "one.two.three.four.five.example.beep.pl" +PZZZ = "one.two.three.four.five.example.now.sh" + +JP = "www.yokoshibahikari.chiba.jp" +IT = "www.example.it" +COM = "www.example.com" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.find("example.com") + +Benchmark.bmbm(25) do |x| + x.report("NAME_SHORT") do + TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil } + end + x.report("NAME_SHORT (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_SHORT, ignore_private: true) != nil } + end + x.report("NAME_MEDIUM") do + TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil } + end + x.report("NAME_MEDIUM (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_MEDIUM, ignore_private: true) != nil } + end + x.report("NAME_LONG") do + TIMES.times { PublicSuffixList.find(NAME_LONG) != nil } + end + x.report("NAME_LONG (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_LONG, ignore_private: true) != nil } + end + x.report("NAME_WILD") do + TIMES.times { PublicSuffixList.find(NAME_WILD) != nil } + end + x.report("NAME_WILD (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_WILD, ignore_private: true) != nil } + end + x.report("NAME_EXCP") do + TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil } + end + x.report("NAME_EXCP (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_EXCP, ignore_private: true) != nil } + end + + x.report("IAAA") do + TIMES.times { PublicSuffixList.find(IAAA) != nil } + end + x.report("IAAA (noprivate)") do + TIMES.times { PublicSuffixList.find(IAAA, ignore_private: true) != nil } + end + x.report("IZZZ") do + TIMES.times { PublicSuffixList.find(IZZZ) != nil } + end + x.report("IZZZ (noprivate)") do + TIMES.times { PublicSuffixList.find(IZZZ, ignore_private: true) != nil } + end + + x.report("PAAA") do + TIMES.times { PublicSuffixList.find(PAAA) != nil } + end + x.report("PAAA (noprivate)") do + TIMES.times { PublicSuffixList.find(PAAA, ignore_private: true) != nil } + end + x.report("PZZZ") do + TIMES.times { PublicSuffixList.find(PZZZ) != nil } + end + x.report("PZZZ (noprivate)") do + TIMES.times { PublicSuffixList.find(PZZZ, ignore_private: true) != nil } + end + + x.report("JP") do + TIMES.times { PublicSuffixList.find(JP) != nil } + end + x.report("JP (noprivate)") do + TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil } + end + x.report("IT") do + TIMES.times { PublicSuffixList.find(IT) != nil } + end + x.report("IT (noprivate)") do + TIMES.times { PublicSuffixList.find(IT, ignore_private: true) != nil } + end + x.report("COM") do + TIMES.times { PublicSuffixList.find(COM) != nil } + end + x.report("COM (noprivate)") do + TIMES.times { PublicSuffixList.find(COM, ignore_private: true) != nil } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_names.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_names.rb new file mode 100644 index 0000000..36b2bce --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_names.rb @@ -0,0 +1,91 @@ +require 'benchmark/ips' + +STRING = "www.subdomain.example.com" +ARRAY = %w( + com + example.com + subdomain.example.com + www.subdomain.example.com +) + +def tokenizer1(string) + parts = string.split(".").reverse! + index = 0 + query = parts[index] + names = [] + + loop do + names << query + + index += 1 + break if index >= parts.size + query = parts[index] + "." + query + end + names +end + +def tokenizer2(string) + parts = string.split(".") + index = parts.size - 1 + query = parts[index] + names = [] + + loop do + names << query + + index -= 1 + break if index < 0 + query = parts[index] + "." + query + end + names +end + +def tokenizer3(string) + isx = string.size + idx = string.size - 1 + names = [] + + loop do + isx = string.rindex(".", isx - 1) || -1 + names << string[isx + 1, idx - isx] + + break if isx <= 0 + end + names +end + +def tokenizer4(string) + isx = string.size + idx = string.size - 1 + names = [] + + loop do + isx = string.rindex(".", isx - 1) || -1 + names << string[(isx+1)..idx] + + break if isx <= 0 + end + names +end + +(x = tokenizer1(STRING)) == ARRAY or fail("tokenizer1 failed: #{x.inspect}") +(x = tokenizer2(STRING)) == ARRAY or fail("tokenizer2 failed: #{x.inspect}") +(x = tokenizer3(STRING)) == ARRAY or fail("tokenizer3 failed: #{x.inspect}") +(x = tokenizer4(STRING)) == ARRAY or fail("tokenizer4 failed: #{x.inspect}") + +Benchmark.ips do |x| + x.report("tokenizer1") do + tokenizer1(STRING).is_a?(Array) + end + x.report("tokenizer2") do + tokenizer2(STRING).is_a?(Array) + end + x.report("tokenizer3") do + tokenizer3(STRING).is_a?(Array) + end + x.report("tokenizer4") do + tokenizer4(STRING).is_a?(Array) + end + + x.compare! +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_select.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_select.rb new file mode 100644 index 0000000..66d908b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_select.rb @@ -0,0 +1,26 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +JP = "www.yokoshibahikari.chiba.jp" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +class PublicSuffix::List + public :select +end +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.select("example.jp") +PublicSuffixList.find("example.jp") + +Benchmark.bmbm(25) do |x| + x.report("JP select") do + TIMES.times { PublicSuffixList.select(JP) } + end + x.report("JP find") do + TIMES.times { PublicSuffixList.find(JP) } + end + # x.report("JP (noprivate)") do + # TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil } + # end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_select_incremental.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_select_incremental.rb new file mode 100644 index 0000000..f002c82 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_select_incremental.rb @@ -0,0 +1,25 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +JP = "www.yokoshibahikari.chiba.jp" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +class PublicSuffix::List + public :select +end +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.select("example.jp") + +Benchmark.bmbm(25) do |x| + x.report("select jp") do + TIMES.times { PublicSuffixList.select("jp") } + end + x.report("select example.jp") do + TIMES.times { PublicSuffixList.select("example.jp") } + end + x.report("select www.example.jp") do + TIMES.times { PublicSuffixList.select("www.example.jp") } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_valid.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_valid.rb new file mode 100644 index 0000000..a484451 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/benchmarks/bm_valid.rb @@ -0,0 +1,101 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +NAME_SHORT = "example.de" +NAME_MEDIUM = "www.subdomain.example.de" +NAME_LONG = "one.two.three.four.five.example.de" +NAME_WILD = "one.two.three.four.five.example.bd" +NAME_EXCP = "one.two.three.four.five.www.ck" + +IAAA = "www.example.ac" +IZZZ = "www.example.zone" + +PAAA = "one.two.three.four.five.example.beep.pl" +PZZZ = "one.two.three.four.five.example.now.sh" + +JP = "www.yokoshibahikari.chiba.jp" +IT = "www.example.it" +COM = "www.example.com" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +PublicSuffix.valid?("example.com") + +Benchmark.bmbm(25) do |x| + x.report("NAME_SHORT") do + TIMES.times { PublicSuffix.valid?(NAME_SHORT) == true } + end + x.report("NAME_SHORT (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_SHORT, ignore_private: true) == true } + end + x.report("NAME_MEDIUM") do + TIMES.times { PublicSuffix.valid?(NAME_MEDIUM) == true } + end + x.report("NAME_MEDIUM (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_MEDIUM, ignore_private: true) == true } + end + x.report("NAME_LONG") do + TIMES.times { PublicSuffix.valid?(NAME_LONG) == true } + end + x.report("NAME_LONG (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_LONG, ignore_private: true) == true } + end + x.report("NAME_WILD") do + TIMES.times { PublicSuffix.valid?(NAME_WILD) == true } + end + x.report("NAME_WILD (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_WILD, ignore_private: true) == true } + end + x.report("NAME_EXCP") do + TIMES.times { PublicSuffix.valid?(NAME_EXCP) == true } + end + x.report("NAME_EXCP (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_EXCP, ignore_private: true) == true } + end + + x.report("IAAA") do + TIMES.times { PublicSuffix.valid?(IAAA) == true } + end + x.report("IAAA (noprivate)") do + TIMES.times { PublicSuffix.valid?(IAAA, ignore_private: true) == true } + end + x.report("IZZZ") do + TIMES.times { PublicSuffix.valid?(IZZZ) == true } + end + x.report("IZZZ (noprivate)") do + TIMES.times { PublicSuffix.valid?(IZZZ, ignore_private: true) == true } + end + + x.report("PAAA") do + TIMES.times { PublicSuffix.valid?(PAAA) == true } + end + x.report("PAAA (noprivate)") do + TIMES.times { PublicSuffix.valid?(PAAA, ignore_private: true) == true } + end + x.report("PZZZ") do + TIMES.times { PublicSuffix.valid?(PZZZ) == true } + end + x.report("PZZZ (noprivate)") do + TIMES.times { PublicSuffix.valid?(PZZZ, ignore_private: true) == true } + end + + x.report("JP") do + TIMES.times { PublicSuffix.valid?(JP) == true } + end + x.report("JP (noprivate)") do + TIMES.times { PublicSuffix.valid?(JP, ignore_private: true) == true } + end + x.report("IT") do + TIMES.times { PublicSuffix.valid?(IT) == true } + end + x.report("IT (noprivate)") do + TIMES.times { PublicSuffix.valid?(IT, ignore_private: true) == true } + end + x.report("COM") do + TIMES.times { PublicSuffix.valid?(COM) == true } + end + x.report("COM (noprivate)") do + TIMES.times { PublicSuffix.valid?(COM, ignore_private: true) == true } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/domain_profiler.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/domain_profiler.rb new file mode 100644 index 0000000..1ed1050 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/domain_profiler.rb @@ -0,0 +1,12 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +PublicSuffix::List.default + +report = MemoryProfiler.report do + PublicSuffix.domain("www.example.com") +end + +report.pretty_print diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/find_profiler.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/find_profiler.rb new file mode 100644 index 0000000..53d28eb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/find_profiler.rb @@ -0,0 +1,12 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +PublicSuffix::List.default + +report = MemoryProfiler.report do + PublicSuffix::List.default.find("www.example.com") +end + +report.pretty_print diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/find_profiler_jp.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/find_profiler_jp.rb new file mode 100644 index 0000000..65c13fe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/find_profiler_jp.rb @@ -0,0 +1,12 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +PublicSuffix::List.default + +report = MemoryProfiler.report do + PublicSuffix::List.default.find("a.b.ide.kyoto.jp") +end + +report.pretty_print diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/initialization_profiler.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/initialization_profiler.rb new file mode 100644 index 0000000..008b1e7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/initialization_profiler.rb @@ -0,0 +1,11 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +report = MemoryProfiler.report do + PublicSuffix::List.default +end + +report.pretty_print +# report.pretty_print(to_file: 'profiler-%s-%d.txt' % [ARGV[0], Time.now.to_i]) diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/list_profsize.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/list_profsize.rb new file mode 100644 index 0000000..0b98b4b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/list_profsize.rb @@ -0,0 +1,11 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require_relative "object_binsize" +require "public_suffix" + +list = PublicSuffix::List.default +puts "#{list.size} rules:" + +prof = ObjectBinsize.new +prof.report(PublicSuffix::List.default, label: "PublicSuffix::List size") +prof.report(PublicSuffix::List.default.instance_variable_get(:@rules), label: "Size of rules") diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/object_binsize.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/object_binsize.rb new file mode 100644 index 0000000..dc60bdb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/profilers/object_binsize.rb @@ -0,0 +1,57 @@ +require 'tempfile' + +# A very simple memory profiles that checks the full size of a variable +# by serializing into a binary file. +# +# Yes, I know this is very rough, but there are cases where ObjectSpace.memsize_of +# doesn't cooperate, and this is one of the possible workarounds. +# +# For certain cases, it works (TM). +class ObjectBinsize + + def measure(var, label: nil) + dump(var, label: label) + end + + def report(var, label: nil, padding: 10) + file = measure(var, label: label) + + size = format_integer(file.size) + name = label || File.basename(file.path) + printf("%#{padding}s %s\n", size, name) + end + + private + + def dump(var, **args) + file = Tempfile.new(args[:label].to_s) + file.write(Marshal.dump(var)) + file + ensure + file.close + end + + def format_integer(int) + int.to_s.reverse.gsub(/...(?=.)/, '\&,').reverse + end + +end + +if __FILE__ == $0 + prof = ObjectBinsize.new + + prof.report(nil, label: "nil") + prof.report(false, label: "false") + prof.report(true, label: "true") + prof.report(0, label: "integer") + prof.report("", label: "empty string") + prof.report({}, label: "empty hash") + prof.report({}, label: "empty array") + + prof.report({ foo: "1" }, label: "hash 1 item (symbol)") + prof.report({ foo: "1", bar: 2 }, label: "hash 2 items (symbol)") + prof.report({ "foo" => "1" }, label: "hash 1 item (string)") + prof.report({ "foo" => "1", "bar" => 2 }, label: "hash 2 items (string)") + + prof.report("big string" * 200, label: "big string * 200") +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/psl_test.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/psl_test.rb new file mode 100644 index 0000000..81d3f9e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/psl_test.rb @@ -0,0 +1,49 @@ +require "test_helper" +require "public_suffix" + +# This test runs against the current PSL file and ensures +# the definitions satisfies the test suite. +class PslTest < Minitest::Test + + ROOT = File.expand_path("../../", __FILE__) + + # rubocop:disable Security/Eval + def self.tests + File.readlines(File.join(ROOT, "test/tests.txt")).map do |line| + line = line.strip + next if line.empty? + next if line.start_with?("//") + input, output = line.split(", ") + + # handle the case of eval("null"), it must be eval("nil") + input = "nil" if input == "null" + output = "nil" if output == "null" + + input = eval(input) + output = eval(output) + [input, output] + end + end + # rubocop:enable + + + def test_valid + # Parse the PSL and run the tests + data = File.read(PublicSuffix::List::DEFAULT_LIST_PATH) + PublicSuffix::List.default = PublicSuffix::List.parse(data) + + failures = [] + self.class.tests.each do |input, output| + # Punycode domains are not supported ATM + next if input =~ /xn\-\-/ + + domain = PublicSuffix.domain(input) rescue nil + failures << [input, output, domain] if output != domain + end + + message = "The following #{failures.size} tests fail:\n" + failures.each { |i, o, d| message += "Expected %s to be %s, got %s\n" % [i.inspect, o.inspect, d.inspect] } + assert_equal 0, failures.size, message + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/test_helper.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/test_helper.rb new file mode 100644 index 0000000..943e7c7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/test_helper.rb @@ -0,0 +1,13 @@ +if ENV["COVERALL"] + require "coveralls" + Coveralls.wear! +end + +require "minitest/autorun" +require "minitest/reporters" +require "mocha/setup" + +Minitest::Reporters.use! Minitest::Reporters::DefaultReporter.new(color: true) + +$LOAD_PATH.unshift File.expand_path("../../lib", __FILE__) +require "public_suffix" diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/tests.txt b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/tests.txt new file mode 100644 index 0000000..b11150a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/tests.txt @@ -0,0 +1,98 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// null input +null, null +// Mixed case +'COM', null +'example.COM', 'example.com' +'WwW.example.COM', 'example.com' +// Leading dot +'.com', null +'.example', null +'.example.com', null +'.example.example', null +// Unlisted TLD +'example', null +'example.example', 'example.example' +'b.example.example', 'example.example' +'a.b.example.example', 'example.example' +// Listed, but non-Internet, TLD +//'local', null +//'example.local', null +//'b.example.local', null +//'a.b.example.local', null +// TLD with only 1 rule +'biz', null +'domain.biz', 'domain.biz' +'b.domain.biz', 'domain.biz' +'a.b.domain.biz', 'domain.biz' +// TLD with some 2-level rules +'com', null +'example.com', 'example.com' +'b.example.com', 'example.com' +'a.b.example.com', 'example.com' +'uk.com', null +'example.uk.com', 'example.uk.com' +'b.example.uk.com', 'example.uk.com' +'a.b.example.uk.com', 'example.uk.com' +'test.ac', 'test.ac' +// TLD with only 1 (wildcard) rule +'mm', null +'c.mm', null +'b.c.mm', 'b.c.mm' +'a.b.c.mm', 'b.c.mm' +// More complex TLD +'jp', null +'test.jp', 'test.jp' +'www.test.jp', 'test.jp' +'ac.jp', null +'test.ac.jp', 'test.ac.jp' +'www.test.ac.jp', 'test.ac.jp' +'kyoto.jp', null +'test.kyoto.jp', 'test.kyoto.jp' +'ide.kyoto.jp', null +'b.ide.kyoto.jp', 'b.ide.kyoto.jp' +'a.b.ide.kyoto.jp', 'b.ide.kyoto.jp' +'c.kobe.jp', null +'b.c.kobe.jp', 'b.c.kobe.jp' +'a.b.c.kobe.jp', 'b.c.kobe.jp' +'city.kobe.jp', 'city.kobe.jp' +'www.city.kobe.jp', 'city.kobe.jp' +// TLD with a wildcard rule and exceptions +'ck', null +'test.ck', null +'b.test.ck', 'b.test.ck' +'a.b.test.ck', 'b.test.ck' +'www.ck', 'www.ck' +'www.www.ck', 'www.ck' +// US K12 +'us', null +'test.us', 'test.us' +'www.test.us', 'test.us' +'ak.us', null +'test.ak.us', 'test.ak.us' +'www.test.ak.us', 'test.ak.us' +'k12.ak.us', null +'test.k12.ak.us', 'test.k12.ak.us' +'www.test.k12.ak.us', 'test.k12.ak.us' +// IDN labels +'食狮.com.cn', '食狮.com.cn' +'食狮.å…¬å¸.cn', '食狮.å…¬å¸.cn' +'www.食狮.å…¬å¸.cn', '食狮.å…¬å¸.cn' +'shishi.å…¬å¸.cn', 'shishi.å…¬å¸.cn' +'å…¬å¸.cn', null +'食狮.中国', '食狮.中国' +'www.食狮.中国', '食狮.中国' +'shishi.中国', 'shishi.中国' +'中国', null +// Same as above, but punycoded +'xn--85x722f.com.cn', 'xn--85x722f.com.cn' +'xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn' +'www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn' +'shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn' +'xn--55qx5d.cn', null +'xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s' +'www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s' +'shishi.xn--fiqs8s', 'shishi.xn--fiqs8s' +'xn--fiqs8s', null diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/domain_test.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/domain_test.rb new file mode 100644 index 0000000..509ce1b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/domain_test.rb @@ -0,0 +1,104 @@ +require "test_helper" + +class PublicSuffix::DomainTest < Minitest::Test + + def setup + @klass = PublicSuffix::Domain + end + + # Tokenizes given input into labels. + def test_self_name_to_labels + assert_equal %w( someone spaces live com ), + PublicSuffix::Domain.name_to_labels("someone.spaces.live.com") + assert_equal %w( leontina23samiko wiki zoho com ), + PublicSuffix::Domain.name_to_labels("leontina23samiko.wiki.zoho.com") + end + + # Converts input into String. + def test_self_name_to_labels_converts_input_to_string + assert_equal %w( someone spaces live com ), + PublicSuffix::Domain.name_to_labels(:"someone.spaces.live.com") + end + + + def test_initialize_with_tld + domain = @klass.new("com") + assert_equal "com", domain.tld + assert_nil domain.sld + assert_nil domain.trd + end + + def test_initialize_with_tld_and_sld + domain = @klass.new("com", "google") + assert_equal "com", domain.tld + assert_equal "google", domain.sld + assert_nil domain.trd + end + + def test_initialize_with_tld_and_sld_and_trd + domain = @klass.new("com", "google", "www") + assert_equal "com", domain.tld + assert_equal "google", domain.sld + assert_equal "www", domain.trd + end + + + def test_to_s + assert_equal "com", @klass.new("com").to_s + assert_equal "google.com", @klass.new("com", "google").to_s + assert_equal "www.google.com", @klass.new("com", "google", "www").to_s + end + + def test_to_a + assert_equal [nil, nil, "com"], @klass.new("com").to_a + assert_equal [nil, "google", "com"], @klass.new("com", "google").to_a + assert_equal ["www", "google", "com"], @klass.new("com", "google", "www").to_a + end + + + def test_tld + assert_equal "com", @klass.new("com", "google", "www").tld + end + + def test_sld + assert_equal "google", @klass.new("com", "google", "www").sld + end + + def test_trd + assert_equal "www", @klass.new("com", "google", "www").trd + end + + + def test_name + assert_equal "com", @klass.new("com").name + assert_equal "google.com", @klass.new("com", "google").name + assert_equal "www.google.com", @klass.new("com", "google", "www").name + end + + def test_domain + assert_nil @klass.new("com").domain + assert_nil @klass.new("tldnotlisted").domain + assert_equal "google.com", @klass.new("com", "google").domain + assert_equal "google.tldnotlisted", @klass.new("tldnotlisted", "google").domain + assert_equal "google.com", @klass.new("com", "google", "www").domain + assert_equal "google.tldnotlisted", @klass.new("tldnotlisted", "google", "www").domain + end + + def test_subdomain + assert_nil @klass.new("com").subdomain + assert_nil @klass.new("tldnotlisted").subdomain + assert_nil @klass.new("com", "google").subdomain + assert_nil @klass.new("tldnotlisted", "google").subdomain + assert_equal "www.google.com", @klass.new("com", "google", "www").subdomain + assert_equal "www.google.tldnotlisted", @klass.new("tldnotlisted", "google", "www").subdomain + end + + + def test_domain_question + assert !@klass.new("com").domain? + assert @klass.new("com", "example").domain? + assert @klass.new("com", "example", "www").domain? + assert @klass.new("tldnotlisted", "example").domain? + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/errors_test.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/errors_test.rb new file mode 100644 index 0000000..47ac592 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/errors_test.rb @@ -0,0 +1,23 @@ +require "test_helper" + +class ErrorsTest < Minitest::Test + + # Inherits from StandardError + def test_error_inheritance + assert_kind_of StandardError, + PublicSuffix::Error.new + end + + # Inherits from PublicSuffix::Error + def test_domain_invalid_inheritance + assert_kind_of PublicSuffix::Error, + PublicSuffix::DomainInvalid.new + end + + # Inherits from PublicSuffix::DomainInvalid + def test_domain_not_allowed_inheritance + assert_kind_of PublicSuffix::DomainInvalid, + PublicSuffix::DomainNotAllowed.new + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/list_test.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/list_test.rb new file mode 100644 index 0000000..693945d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.1/test/unit/list_test.rb @@ -0,0 +1,239 @@ +require "test_helper" + +class PublicSuffix::ListTest < Minitest::Test + + def setup + @list = PublicSuffix::List.new + end + + def teardown + PublicSuffix::List.default = nil + end + + + def test_initialize + assert_instance_of PublicSuffix::List, @list + assert_equal 0, @list.size + end + + + def test_equality_with_self + list = PublicSuffix::List.new + assert_equal list, list + end + + def test_equality_with_internals + rule = PublicSuffix::Rule.factory("com") + assert_equal PublicSuffix::List.new.add(rule), PublicSuffix::List.new.add(rule) + end + + def test_each_without_block + list = PublicSuffix::List.parse(< 1.5, :no_defer => true } + +fsevent = FSEvent.new +fsevent.watch paths, options do |directories| + puts "Detected change inside: #{directories.inspect}" +end +fsevent.run +``` + +### Multiple paths and additional options as an Array + +```ruby +require 'rb-fsevent' + +paths = ['/tmp/path/one', '/tmp/path/two', Dir.pwd] +options = ['--latency', 1.5, '--no-defer'] + +fsevent = FSEvent.new +fsevent.watch paths, options do |directories| + puts "Detected change inside: #{directories.inspect}" +end +fsevent.run +``` + +### Using _full_ event information + +```ruby +require 'rb-fsevent' +fsevent = FSEvent.new +fsevent.watch Dir.pwd do |paths, event_meta| + event_meta.events.each do |event| + puts "event ID: #{event.id}" + puts "path: #{event.path}" + puts "c flags: #{event.cflags}" + puts "named flags: #{event.flags.join(', ')}" + # named flags will include strings such as `ItemInodeMetaMod` or `OwnEvent` + end +end +fsevent.run +``` + +## Options + +When defining options using a hash or hash-like object, it gets checked for validity and converted to the appropriate fsevent\_watch commandline arguments array when the FSEvent class is instantiated. This is obviously the safest and preferred method of passing in options. + +You may, however, choose to pass in an array of commandline arguments as your options value and it will be passed on, unmodified, to the fsevent\_watch binary when called. + +So far, the following options are supported: + +* :latency => 0.5 # in seconds +* :no\_defer => true +* :watch\_root => true +* :since\_when => 18446744073709551615 # an FSEventStreamEventId +* :file\_events => true + +### Latency + +The :latency parameter determines how long the service should wait after the first event before passing that information along to the client. If your latency is set to 4 seconds, and 300 changes occur in the first three, then the callback will be fired only once. If latency is set to 0.1 in the exact same scenario, you will see that callback fire somewhere closer to between 25 and 30 times. + +Setting a higher latency value allows for more effective temporal coalescing, resulting in fewer callbacks and greater overall efficiency... at the cost of apparent responsiveness. Setting this to a reasonably high value (and NOT setting :no\_defer) is particularly well suited for background, daemon, or batch processing applications. + +Implementation note: It appears that FSEvents will only coalesce events from a maximum of 32 distinct subpaths, making the above completely accurate only when events are to fewer than 32 subpaths. Creating 300 files in one directory, for example, or 30 files in 10 subdirectories, but not 300 files within 300 subdirectories. In the latter case, you may receive 31 callbacks in one go after the latency period. As this appears to be an implementation detail, the number could potentially differ across OS revisions. It is entirely possible that this number is somehow configurable, but I have not yet discovered an accepted method of doing so. + +### NoDefer + +The :no\_defer option changes the behavior of the latency parameter completely. Rather than waiting for $latency period of time before sending along events in an attempt to coalesce a potential deluge ahead of time, that first event is sent along to the client immediately and is followed by a $latency period of silence before sending along any additional events that occurred within that period. + +This behavior is particularly useful for interactive applications where that feeling of apparent responsiveness is most important, but you still don't want to get overwhelmed by a series of events that occur in rapid succession. + +### WatchRoot + +The :watch\_root option allows for catching the scenario where you start watching "~/src/demo\_project" and either it is later renamed to "~/src/awesome\_sauce\_3000" or the path changes in such a manner that the original directory is now at "~/clients/foo/iteration4/demo\_project". + +Unfortunately, while this behavior is somewhat supported in the fsevent\_watch binary built as part of this project, support for passing across detailed metadata is not (yet). As a result, you would not receive the appropriate RootChanged event and be able to react appropriately. Also, since the C code doesn't open watched directories and retain that file descriptor as part of path-specific callback metadata, we are unable to issue an F\_GETPATH fcntl() to determine the directory's new path. + +Please do not use this option until proper support is added (or, even better, add it and submit a pull request). + +### SinceWhen + +The FSEventStreamEventId passed in to :since\_when is used as a base for reacting to historic events. Unfortunately, not only is the metadata for transitioning from historic to live events not currently passed along, but it is incorrectly passed as a change event on the root path, and only per-host event streams are currently supported. When using per-host event streams, the event IDs are not guaranteed to be unique or contiguous when shared volumes (firewire/USB/net/etc) are used on multiple macs. + +Please do not use this option until proper support is added, unless it's acceptable for you to receive that one fake event that's handled incorrectly when events transition from historical to live. Even in that scenario, there's no metadata available for determining the FSEventStreamEventId of the last received event. + +WARNING: passing in 0 as the parameter to :since\_when will return events for every directory modified since "the beginning of time". + +### FileEvents ### + +Prepare yourself for an obscene number of callbacks. Realistically, an "Atomic Save" could easily fire maybe 6 events for the combination of creating the new file, changing metadata/permissions, writing content, swapping out the old file for the new may itself result in multiple events being fired, and so forth. By the time you get the event for the temporary file being created as part of the atomic save, it will already be gone and swapped with the original file. This and issues of a similar nature have prevented me from adding the option to the ruby code despite the fsevent\_watch binary supporting file level events for quite some time now. Mountain Lion seems to be better at coalescing needless events, but that might just be my imagination. + +## Debugging output + +If the gem is re-compiled with the environment variable FWDEBUG set, then fsevent\_watch will be built with its various DEBUG sections defined, and the output to STDERR is truly verbose (and hopefully helpful in debugging your application and not just fsevent\_watch itself). If enough people find this to be directly useful when developing code that makes use of rb-fsevent, then it wouldn't be hard to clean this up and make it a feature enabled by a commandline argument instead. Until somebody files an issue, however, I will assume otherwise. + + append_path called for: /tmp/moo/cow/ + resolved path to: /private/tmp/moo/cow + + config.sinceWhen 18446744073709551615 + config.latency 0.300000 + config.flags 00000000 + config.paths + /private/tmp/moo/cow + + FSEventStreamRef @ 0x100108540: + allocator = 0x7fff705a4ee0 + callback = 0x10000151e + context = {0, 0x0, 0x0, 0x0, 0x0} + numPathsToWatch = 1 + pathsToWatch = 0x7fff705a4ee0 + pathsToWatch[0] = '/private/tmp/moo/cow' + latestEventId = -1 + latency = 300000 (microseconds) + flags = 0x00000000 + runLoop = 0x0 + runLoopMode = 0x0 + + FSEventStreamCallback fired! + numEvents: 32 + event path: /private/tmp/moo/cow/1/a/ + event flags: 00000000 + event ID: 1023767 + event path: /private/tmp/moo/cow/1/b/ + event flags: 00000000 + event ID: 1023782 + event path: /private/tmp/moo/cow/1/c/ + event flags: 00000000 + event ID: 1023797 + event path: /private/tmp/moo/cow/1/d/ + event flags: 00000000 + event ID: 1023812 + [etc] + + +## Development + +* Source hosted at [GitHub](http://github.com/thibaudgg/rb-fsevent) +* Report issues/Questions/Feature requests on [GitHub Issues](http://github.com/thibaudgg/rb-fsevent/issues) + +Pull requests are quite welcome! Please ensure that your commits are in a topic branch for each individual changeset that can be reasonably isolated. It is also important to ensure that your changes are well tested... whether that means new tests, modified tests, or fixing a scenario where the existing tests currently fail. If you have rbenv and ruby-build, we have a helper task for running the testsuite in all of them: + + rake spec:portability + +The list of tested targets is currently: + + %w[2.4.1 rbx-3.72 jruby-1.7.26 jruby-9.1.8.0] + +## Authors + +* [Travis Tilley](http://github.com/ttilley) +* [Thibaud Guillaume-Gentil](http://github.com/thibaudgg) +* [Andrey Tarantsov](https://github.com/andreyvit) diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/Rakefile b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/Rakefile new file mode 100644 index 0000000..53a08a1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/Rakefile @@ -0,0 +1,33 @@ +# -*- encoding: utf-8 -*- +require 'bundler' +Bundler::GemHelper.install_tasks + +require 'rspec/core/rake_task' +RSpec::Core::RakeTask.new(:spec) +task :default => :spec + +namespace(:spec) do + desc "Run all specs on multiple ruby versions" + task(:portability) do + versions = %w[2.4.1 rbx-3.72 jruby-1.7.26 jruby-9.1.8.0] + versions.each do |version| + # system <<-BASH + # bash -c 'source ~/.rvm/scripts/rvm; + # rvm #{version}; + # echo "--------- version #{version} ----------\n"; + # bundle install; + # rake spec' + # BASH + system <<-BASH + bash -c 'export PATH="$HOME/.rbenv/bin:$PATH"; + [[ `which rbenv` ]] && eval "$(rbenv init -)"; + [[ ! -a $HOME/.rbenv/versions/#{version} ]] && rbenv install #{version}; + rbenv shell #{version}; + rbenv which bundle 2> /dev/null || gem install bundler; + rm Gemfile.lock; + bundle install; + rake spec;' + BASH + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/bin/fsevent_watch b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/bin/fsevent_watch new file mode 100755 index 0000000000000000000000000000000000000000..889204f817bb1d78d27a44090b3deff259732162 GIT binary patch literal 42376 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/LICENSE b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/LICENSE new file mode 100644 index 0000000..a35e195 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2011-2013 Travis Tilley + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.c new file mode 100644 index 0000000..60e3d37 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.c @@ -0,0 +1,626 @@ +/* + * FSEventsFix + * + * Resolves a long-standing bug in realpath() that prevents FSEvents API from + * monitoring certain folders on a wide range of OS X released (10.6-10.10 at least). + * + * The underlying issue is that for some folders, realpath() call starts returning + * a path with incorrect casing (e.g. "/users/smt" instead of "/Users/smt"). + * FSEvents is case-sensitive and calls realpath() on the paths you pass in, so + * an incorrect value returned by realpath() prevents FSEvents from seeing any + * change events. + * + * See the discussion at https://github.com/thibaudgg/rb-fsevent/issues/10 about + * the history of this bug and how this library came to exist. + * + * This library uses Facebook's fishhook to replace a custom implementation of + * realpath in place of the system realpath; FSEvents will then invoke our custom + * implementation (which does not screw up the names) and will thus work correctly. + * + * Our implementation of realpath is based on the open-source implementation from + * OS X 10.10, with a single change applied (enclosed in "BEGIN WORKAROUND FOR + * OS X BUG" ... "END WORKAROUND FOR OS X BUG"). + * + * Include FSEventsFix.{h,c} into your project and call FSEventsFixInstall(). + * + * It is recommended that you install FSEventsFix on demand, using FSEventsFixIsBroken + * to check if the folder you're about to pass to FSEventStreamCreate needs the fix. + * Note that the fix must be applied before calling FSEventStreamCreate. + * + * FSEventsFixIsBroken requires a path that uses the correct case for all folder names, + * i.e. a path provided by the system APIs or constructed from folder names provided + * by the directory enumeration APIs. + * + * Copyright (c) 2015 Andrey Tarantsov + * Copyright (c) 2003 Constantin S. Svintsoff + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * Based on a realpath implementation from Apple libc 498.1.7, taken from + * http://www.opensource.apple.com/source/Libc/Libc-498.1.7/stdlib/FreeBSD/realpath.c + * and provided under the following license: + * + * Copyright (c) 2003 Constantin S. Svintsoff + * + * 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 the authors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + + +#include "FSEventsFix.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +const char *const FSEventsFixVersionString = "0.11.0"; + + +#pragma mark - Forward declarations + +static char *(*orig_realpath)(const char *restrict file_name, char resolved_name[PATH_MAX]); +static char *CFURL_realpath(const char *restrict file_name, char resolved_name[PATH_MAX]); +static char *FSEventsFix_realpath_wrapper(const char *restrict src, char *restrict dst); + +static void _FSEventsFixHookInstall(); +static void _FSEventsFixHookUninstall(); + + +#pragma mark - Internal state + +static dispatch_queue_t g_queue = NULL; + +static int64_t g_enable_refcount = 0; + +static bool g_in_self_test = false; +static bool g_hook_operational = false; + +static void(^g_logging_block)(FSEventsFixMessageType type, const char *message); +static FSEventsFixDebugOptions g_debug_opt = 0; + +typedef struct { + char *name; + void *replacement; + void *original; + uint hooked_symbols; +} rebinding_t; + +static rebinding_t g_rebindings[] = { + { "_realpath$DARWIN_EXTSN", (void *) &FSEventsFix_realpath_wrapper, (void *) &realpath, 0 } +}; +static const uint g_rebindings_nel = sizeof(g_rebindings) / sizeof(g_rebindings[0]); + + +#pragma mark - Logging + +static void _FSEventsFixLog(FSEventsFixMessageType type, const char *__restrict fmt, ...) __attribute__((__format__ (__printf__, 2, 3))); + +static void _FSEventsFixLog(FSEventsFixMessageType type, const char *__restrict fmt, ...) { + if (g_logging_block) { + char *message = NULL; + va_list va; + va_start(va, fmt); + vasprintf(&message, fmt, va); + va_end(va); + + if (message) { + if (!!(g_debug_opt & FSEventsFixDebugOptionLogToStderr)) { + fprintf(stderr, "FSEventsFix: %s\n", message); + } + if (g_logging_block) { + g_logging_block(type, message); + } + free(message); + } + } +} + + +#pragma mark - API + +void _FSEventsFixInitialize() { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + g_queue = dispatch_queue_create("FSEventsFix", DISPATCH_QUEUE_SERIAL); + }); +} + +void FSEventsFixConfigure(FSEventsFixDebugOptions debugOptions, void(^loggingBlock)(FSEventsFixMessageType severity, const char *message)) { + _FSEventsFixInitialize(); + loggingBlock = Block_copy(loggingBlock); + dispatch_sync(g_queue, ^{ + g_debug_opt = debugOptions; + g_logging_block = loggingBlock; + }); +} + +// Must be called from the private serial queue. +void _FSEventsFixSelfTest() { + g_in_self_test = true; + g_hook_operational = false; + static char result[1024]; + realpath("/Etc/__!FSEventsFixSelfTest!__", result); + g_in_self_test = false; +} + +void FSEventsFixEnable() { + _FSEventsFixInitialize(); + dispatch_sync(g_queue, ^{ + if (++g_enable_refcount == 1) { + orig_realpath = dlsym(RTLD_DEFAULT, "realpath"); + _FSEventsFixHookInstall(); + _FSEventsFixSelfTest(); + if (g_hook_operational) { + _FSEventsFixLog(FSEventsFixMessageTypeStatusChange, "Enabled"); + } else { + _FSEventsFixLog(FSEventsFixMessageTypeFatalError, "Failed to enable (hook not called)"); + } + } + }); +} + +void FSEventsFixDisable() { + _FSEventsFixInitialize(); + dispatch_sync(g_queue, ^{ + if (g_enable_refcount == 0) { + abort(); + } + if (--g_enable_refcount == 0) { + _FSEventsFixHookUninstall(); + _FSEventsFixSelfTest(); + if (!g_hook_operational) { + _FSEventsFixLog(FSEventsFixMessageTypeStatusChange, "Disabled"); + } else { + _FSEventsFixLog(FSEventsFixMessageTypeFatalError, "Failed to disable (hook still called)"); + } + } + }); +} + +bool FSEventsFixIsOperational() { + _FSEventsFixInitialize(); + __block bool result = false; + dispatch_sync(g_queue, ^{ + result = g_hook_operational; + }); + return result; +} + +bool _FSEventsFixIsBroken_noresolve(const char *resolved) { + if (!!(g_debug_opt & FSEventsFixDebugOptionSimulateBroken)) { + if (strstr(resolved, FSEventsFixSimulatedBrokenFolderMarker)) { + return true; + } + } + + char *reresolved = realpath(resolved, NULL); + if (reresolved) { + bool broken = (0 != strcmp(resolved, reresolved)); + free(reresolved); + return broken; + } else { + return true; + } +} + +bool FSEventsFixIsBroken(const char *path) { + char *resolved = CFURL_realpath(path, NULL); + if (!resolved) { + return true; + } + bool broken = _FSEventsFixIsBroken_noresolve(resolved); + free(resolved); + return broken; +} + +char *FSEventsFixCopyRootBrokenFolderPath(const char *inpath) { + if (!FSEventsFixIsBroken(inpath)) { + return NULL; + } + + // get a mutable copy of an absolute path + char *path = CFURL_realpath(inpath, NULL); + if (!path) { + return NULL; + } + + for (;;) { + char *sep = strrchr(path, '/'); + if ((sep == NULL) || (sep == path)) { + break; + } + *sep = 0; + if (!_FSEventsFixIsBroken_noresolve(path)) { + *sep = '/'; + break; + } + } + + return path; +} + +static void _FSEventsFixAttemptRepair(const char *folder) { + int rv = rename(folder, folder); + + if (!!(g_debug_opt & FSEventsFixDebugOptionSimulateRepair)) { + const char *pos = strstr(folder, FSEventsFixSimulatedBrokenFolderMarker); + if (pos) { + char *fixed = strdup(folder); + fixed[pos - folder] = 0; + strcat(fixed, pos + strlen(FSEventsFixSimulatedBrokenFolderMarker)); + + rv = rename(folder, fixed); + free(fixed); + } + } + + if (rv != 0) { + if (errno == EPERM) { + _FSEventsFixLog(FSEventsFixMessageTypeResult, "Permission error when trying to repair '%s'", folder); + } else { + _FSEventsFixLog(FSEventsFixMessageTypeExpectedFailure, "Unknown error when trying to repair '%s': errno = %d", folder, errno); + } + } +} + +FSEventsFixRepairStatus FSEventsFixRepairIfNeeded(const char *inpath) { + char *root = FSEventsFixCopyRootBrokenFolderPath(inpath); + if (root == NULL) { + return FSEventsFixRepairStatusNotBroken; + } + + for (;;) { + _FSEventsFixAttemptRepair(root); + char *newRoot = FSEventsFixCopyRootBrokenFolderPath(inpath); + if (newRoot == NULL) { + _FSEventsFixLog(FSEventsFixMessageTypeResult, "Repaired '%s' in '%s'", root, inpath); + free(root); + return FSEventsFixRepairStatusRepaired; + } + if (0 == strcmp(root, newRoot)) { + _FSEventsFixLog(FSEventsFixMessageTypeResult, "Failed to repair '%s' in '%s'", root, inpath); + free(root); + free(newRoot); + return FSEventsFixRepairStatusFailed; + } + _FSEventsFixLog(FSEventsFixMessageTypeResult, "Partial success, repaired '%s' in '%s'", root, inpath); + free(root); + root = newRoot; + } +} + + +#pragma mark - FSEventsFix realpath wrapper + +static char *FSEventsFix_realpath_wrapper(const char * __restrict src, char * __restrict dst) { + if (g_in_self_test) { + if (strstr(src, "__!FSEventsFixSelfTest!__")) { + g_hook_operational = true; + } + } + + // CFURL_realpath doesn't support putting where resolution failed into the + // dst buffer, so we call the original realpath here first and if it gets a + // result, replace that with the output of CFURL_realpath. that way all the + // features of the original realpath are available. + char *rv = NULL; + char *orv = orig_realpath(src, dst); + if (orv != NULL) { rv = CFURL_realpath(src, dst); } + + if (!!(g_debug_opt & FSEventsFixDebugOptionLogCalls)) { + char *result = rv ?: dst; + _FSEventsFixLog(FSEventsFixMessageTypeCall, "realpath(%s) => %s\n", src, result); + } + + if (!!(g_debug_opt & FSEventsFixDebugOptionUppercaseReturn)) { + char *result = rv ?: dst; + if (result) { + for (char *pch = result; *pch; ++pch) { + *pch = (char)toupper(*pch); + } + } + } + + return rv; +} + + +#pragma mark - realpath + +// naive implementation of realpath on top of CFURL +// NOTE: doesn't quite support the full range of errno results one would +// expect here, in part because some of these functions just return a boolean, +// and in part because i'm not dealing with messy CFErrorRef objects and +// attempting to translate those to sane errno values. +// NOTE: the OSX realpath will return _where_ resolution failed in resolved_name +// if passed in and return NULL. we can't properly support that extension here +// since the resolution happens entirely behind the scenes to us in CFURL. +static char* CFURL_realpath(const char *file_name, char resolved_name[PATH_MAX]) +{ + char* resolved; + CFURLRef url1; + CFURLRef url2; + CFStringRef path; + + if (file_name == NULL) { + errno = EINVAL; + return (NULL); + } + +#if __DARWIN_UNIX03 + if (*file_name == 0) { + errno = ENOENT; + return (NULL); + } +#endif + + // create a buffer to store our result if we weren't passed one + if (!resolved_name) { + if ((resolved = malloc(PATH_MAX)) == NULL) return (NULL); + } else { + resolved = resolved_name; + } + + url1 = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)file_name, (CFIndex)strlen(file_name), false); + if (url1 == NULL) { goto error_return; } + + url2 = CFURLCopyAbsoluteURL(url1); + CFRelease(url1); + if (url2 == NULL) { goto error_return; } + + url1 = CFURLCreateFileReferenceURL(NULL, url2, NULL); + CFRelease(url2); + if (url1 == NULL) { goto error_return; } + + // if there are multiple hard links to the original path, this may end up + // being _completely_ different from what was intended + url2 = CFURLCreateFilePathURL(NULL, url1, NULL); + CFRelease(url1); + if (url2 == NULL) { goto error_return; } + + path = CFURLCopyFileSystemPath(url2, kCFURLPOSIXPathStyle); + CFRelease(url2); + if (path == NULL) { goto error_return; } + + bool success = CFStringGetCString(path, resolved, PATH_MAX, kCFStringEncodingUTF8); + CFRelease(path); + if (!success) { goto error_return; } + + return resolved; + +error_return: + if (!resolved_name) { + // we weren't passed in an output buffer and created our own. free it + int e = errno; + free(resolved); + errno = e; + } + return (NULL); +} + + +#pragma mark - fishhook + +// Copyright (c) 2013, Facebook, Inc. +// All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * 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. +// * Neither the name Facebook nor the names of its contributors may 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 HOLDER 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. + +#import +#import +#import +#import +#import +#import + +#ifdef __LP64__ +typedef struct mach_header_64 mach_header_t; +typedef struct segment_command_64 segment_command_t; +typedef struct section_64 section_t; +typedef struct nlist_64 nlist_t; +#define LC_SEGMENT_ARCH_DEPENDENT LC_SEGMENT_64 +#else +typedef struct mach_header mach_header_t; +typedef struct segment_command segment_command_t; +typedef struct section section_t; +typedef struct nlist nlist_t; +#define LC_SEGMENT_ARCH_DEPENDENT LC_SEGMENT +#endif + +static volatile bool g_hook_installed = false; + +static void _FSEventsFixHookUpdateSection(section_t *section, intptr_t slide, nlist_t *symtab, char *strtab, uint32_t *indirect_symtab) +{ + uint32_t *indirect_symbol_indices = indirect_symtab + section->reserved1; + void **indirect_symbol_bindings = (void **)((uintptr_t)slide + section->addr); + for (uint i = 0; i < section->size / sizeof(void *); i++) { + uint32_t symtab_index = indirect_symbol_indices[i]; + if (symtab_index == INDIRECT_SYMBOL_ABS || symtab_index == INDIRECT_SYMBOL_LOCAL || + symtab_index == (INDIRECT_SYMBOL_LOCAL | INDIRECT_SYMBOL_ABS)) { + continue; + } + uint32_t strtab_offset = symtab[symtab_index].n_un.n_strx; + char *symbol_name = strtab + strtab_offset; + for (rebinding_t *cur = g_rebindings, *end = g_rebindings + g_rebindings_nel; cur < end; ++cur) { + if (strcmp(symbol_name, cur->name) == 0) { + if (g_hook_installed) { + if (indirect_symbol_bindings[i] != cur->replacement) { + indirect_symbol_bindings[i] = cur->replacement; + ++cur->hooked_symbols; + } + } else if (cur->original != NULL) { + if (indirect_symbol_bindings[i] == cur->replacement) { + indirect_symbol_bindings[i] = cur->original; + if (cur->hooked_symbols > 0) { + --cur->hooked_symbols; + } + } + } + goto symbol_loop; + } + } + symbol_loop:; + } +} + +static void _FSEventsFixHookUpdateImage(const struct mach_header *header, intptr_t slide) { + Dl_info info; + if (dladdr(header, &info) == 0) { + return; + } + + segment_command_t *cur_seg_cmd; + segment_command_t *linkedit_segment = NULL; + struct symtab_command* symtab_cmd = NULL; + struct dysymtab_command* dysymtab_cmd = NULL; + + uintptr_t cur = (uintptr_t)header + sizeof(mach_header_t); + for (uint i = 0; i < header->ncmds; i++, cur += cur_seg_cmd->cmdsize) { + cur_seg_cmd = (segment_command_t *)cur; + if (cur_seg_cmd->cmd == LC_SEGMENT_ARCH_DEPENDENT) { + if (strcmp(cur_seg_cmd->segname, SEG_LINKEDIT) == 0) { + linkedit_segment = cur_seg_cmd; + } + } else if (cur_seg_cmd->cmd == LC_SYMTAB) { + symtab_cmd = (struct symtab_command*)cur_seg_cmd; + } else if (cur_seg_cmd->cmd == LC_DYSYMTAB) { + dysymtab_cmd = (struct dysymtab_command*)cur_seg_cmd; + } + } + + if (!symtab_cmd || !dysymtab_cmd || !linkedit_segment || + !dysymtab_cmd->nindirectsyms) { + return; + } + + // Find base symbol/string table addresses + uintptr_t linkedit_base = (uintptr_t)slide + linkedit_segment->vmaddr - linkedit_segment->fileoff; + nlist_t *symtab = (nlist_t *)(linkedit_base + symtab_cmd->symoff); + char *strtab = (char *)(linkedit_base + symtab_cmd->stroff); + + // Get indirect symbol table (array of uint32_t indices into symbol table) + uint32_t *indirect_symtab = (uint32_t *)(linkedit_base + dysymtab_cmd->indirectsymoff); + + cur = (uintptr_t)header + sizeof(mach_header_t); + for (uint i = 0; i < header->ncmds; i++, cur += cur_seg_cmd->cmdsize) { + cur_seg_cmd = (segment_command_t *)cur; + if (cur_seg_cmd->cmd == LC_SEGMENT_ARCH_DEPENDENT) { + if (strcmp(cur_seg_cmd->segname, SEG_DATA) != 0) { + continue; + } + for (uint j = 0; j < cur_seg_cmd->nsects; j++) { + section_t *sect = + (section_t *)(cur + sizeof(segment_command_t)) + j; + if ((sect->flags & SECTION_TYPE) == S_LAZY_SYMBOL_POINTERS) { + _FSEventsFixHookUpdateSection(sect, slide, symtab, strtab, indirect_symtab); + } + if ((sect->flags & SECTION_TYPE) == S_NON_LAZY_SYMBOL_POINTERS) { + _FSEventsFixHookUpdateSection(sect, slide, symtab, strtab, indirect_symtab); + } + } + } + } +} + +static void _FSEventsFixHookSaveOriginals() { + for (rebinding_t *cur = g_rebindings, *end = g_rebindings + g_rebindings_nel; cur < end; ++cur) { + void *original = cur->original = dlsym(RTLD_DEFAULT, cur->name+1); + if (!original) { + const char *error = dlerror(); + _FSEventsFixLog(FSEventsFixMessageTypeFatalError, "Cannot find symbol %s, dlsym says: %s\n", cur->name, error); + } + } +} + +static void _FSEventsFixHookUpdate() { + uint32_t c = _dyld_image_count(); + for (uint32_t i = 0; i < c; i++) { + _FSEventsFixHookUpdateImage(_dyld_get_image_header(i), _dyld_get_image_vmaddr_slide(i)); + } +} + +static void _FSEventsFixHookInstall() { + static bool first_rebinding_done = false; + + if (!g_hook_installed) { + g_hook_installed = true; + + if (!first_rebinding_done) { + first_rebinding_done = true; + _FSEventsFixHookSaveOriginals(); + _dyld_register_func_for_add_image(_FSEventsFixHookUpdateImage); + } else { + _FSEventsFixHookUpdate(); + } + } +} + +static void _FSEventsFixHookUninstall() { + if (g_hook_installed) { + g_hook_installed = false; + _FSEventsFixHookUpdate(); + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.h new file mode 100644 index 0000000..b70b880 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.h @@ -0,0 +1,105 @@ +/* + * FSEventsFix + * + * Works around a long-standing bug in realpath() that prevents FSEvents API from + * monitoring certain folders on a wide range of OS X releases (10.6-10.10 at least). + * + * The underlying issue is that for some folders, realpath() call starts returning + * a path with incorrect casing (e.g. "/users/smt" instead of "/Users/smt"). + * FSEvents is case-sensitive and calls realpath() on the paths you pass in, so + * an incorrect value returned by realpath() prevents FSEvents from seeing any + * change events. + * + * See the discussion at https://github.com/thibaudgg/rb-fsevent/issues/10 about + * the history of this bug and how this library came to exist. + * + * This library uses Facebook's fishhook to replace a custom implementation of + * realpath in place of the system realpath; FSEvents will then invoke our custom + * implementation (which does not screw up the names) and will thus work correctly. + * + * Our implementation of realpath is based on the open-source implementation from + * OS X 10.10, with a single change applied (enclosed in "BEGIN WORKAROUND FOR + * OS X BUG" ... "END WORKAROUND FOR OS X BUG"). + * + * Include FSEventsFix.{h,c} into your project and call FSEventsFixInstall(). + * + * It is recommended that you install FSEventsFix on demand, using FSEventsFixIsBroken + * to check if the folder you're about to pass to FSEventStreamCreate needs the fix. + * Note that the fix must be applied before calling FSEventStreamCreate. + * + * FSEventsFixIsBroken requires a path that uses the correct case for all folder names, + * i.e. a path provided by the system APIs or constructed from folder names provided + * by the directory enumeration APIs. + * + * See .c file for license & copyrights, but basically this is available under a mix + * of MIT and BSD licenses. + */ + +#ifndef __FSEventsFix__ +#define __FSEventsFix__ + +#include + +/// A library version string (e.g. 1.2.3) for displaying and logging purposes +extern const char *const FSEventsFixVersionString; + +/// See FSEventsFixDebugOptionSimulateBroken +#define FSEventsFixSimulatedBrokenFolderMarker "__!FSEventsBroken!__" + +typedef CF_OPTIONS(unsigned, FSEventsFixDebugOptions) { + /// Always return an uppercase string from realpath + FSEventsFixDebugOptionUppercaseReturn = 0x01, + + /// Log all calls to realpath using the logger configured via FSEventsFixConfigure + FSEventsFixDebugOptionLogCalls = 0x02, + + /// In addition to the logging block (if any), log everything to stderr + FSEventsFixDebugOptionLogToStderr = 0x08, + + /// Report paths containing FSEventsFixSimulatedBrokenFolderMarker as broken + FSEventsFixDebugOptionSimulateBroken = 0x10, + + /// Repair paths containing FSEventsFixSimulatedBrokenFolderMarker by renaming them + FSEventsFixDebugOptionSimulateRepair = 0x20, +}; + +typedef CF_ENUM(int, FSEventsFixMessageType) { + /// Call logging requested via FSEventsFixDebugOptionLogCalls + FSEventsFixMessageTypeCall, + + /// Results of actions like repair, and other pretty verbose, but notable, stuff. + FSEventsFixMessageTypeResult, + + /// Enabled/disabled status change + FSEventsFixMessageTypeStatusChange, + + /// Expected failure (treat as a warning) + FSEventsFixMessageTypeExpectedFailure, + + /// Severe failure that most likely means that the library won't work + FSEventsFixMessageTypeFatalError +}; + +typedef CF_ENUM(int, FSEventsFixRepairStatus) { + FSEventsFixRepairStatusNotBroken, + FSEventsFixRepairStatusRepaired, + FSEventsFixRepairStatusFailed, +}; + +/// Note that the logging block can be called on any dispatch queue. +void FSEventsFixConfigure(FSEventsFixDebugOptions debugOptions, void(^loggingBlock)(FSEventsFixMessageType type, const char *message)); + +void FSEventsFixEnable(); +void FSEventsFixDisable(); + +bool FSEventsFixIsOperational(); + +bool FSEventsFixIsBroken(const char *path); + +/// If the path is broken, returns a string identifying the root broken folder, +/// otherwise, returns NULL. You need to free() the returned string. +char *FSEventsFixCopyRootBrokenFolderPath(const char *path); + +FSEventsFixRepairStatus FSEventsFixRepairIfNeeded(const char *path); + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.c new file mode 100644 index 0000000..6e033d0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.c @@ -0,0 +1,373 @@ +// +// TSICTString.c +// TSITString +// +// Created by Travis Tilley on 9/27/11. +// + +#include "TSICTString.h" + + +const char* const TNetstringTypes = ",#^!~}]Z"; +const char* const OTNetstringTypes = ",#^!~{[Z"; +const UInt8 TNetstringSeparator = ':'; + +TSITStringFormat TSITStringDefaultFormat = kTSITStringFormatTNetstring; + +static const CFRange BeginningRange = {0,0}; + +static CFTypeID kCFDataTypeID = -1UL; +static CFTypeID kCFStringTypeID = -1UL; +static CFTypeID kCFNumberTypeID = -1UL; +static CFTypeID kCFBooleanTypeID = -1UL; +static CFTypeID kCFNullTypeID = -1UL; +static CFTypeID kCFArrayTypeID = -1UL; +static CFTypeID kCFDictionaryTypeID = -1UL; + + +__attribute__((constructor)) void Init_TSICTString(void) +{ + kCFDataTypeID = CFDataGetTypeID(); + kCFStringTypeID = CFStringGetTypeID(); + kCFNumberTypeID = CFNumberGetTypeID(); + kCFBooleanTypeID = CFBooleanGetTypeID(); + kCFNullTypeID = CFNullGetTypeID(); + kCFArrayTypeID = CFArrayGetTypeID(); + kCFDictionaryTypeID = CFDictionaryGetTypeID(); +} + + +void TSICTStringSetDefaultFormat(TSITStringFormat format) +{ + if (format == kTSITStringFormatDefault) { + TSITStringDefaultFormat = kTSITStringFormatTNetstring; + } else { + TSITStringDefaultFormat = format; + } +} + +TSITStringFormat TSICTStringGetDefaultFormat(void) +{ + return TSITStringDefaultFormat; +} + + +void TSICTStringDestroy(TStringIRep* rep) +{ + CFRelease(rep->data); + free(rep->length); + free(rep); +} + + +static inline TStringIRep* TSICTStringCreateWithDataOfTypeAndFormat(CFDataRef data, TSITStringTag type, TSITStringFormat format) +{ + if (format == kTSITStringFormatDefault) { + format = TSICTStringGetDefaultFormat(); + } + + TStringIRep* rep = calloc(1, sizeof(TStringIRep)); + rep->data = CFDataCreateCopy(kCFAllocatorDefault, data); + rep->type = type; + rep->format = format; + rep->length = calloc(10, sizeof(char)); + + CFIndex len = CFDataGetLength(rep->data); + if (snprintf(rep->length, 10, "%lu", len)) { + return rep; + } else { + TSICTStringDestroy(rep); + return NULL; + } +} + +static inline CFDataRef TSICTStringCreateDataFromIntermediateRepresentation(TStringIRep* rep) +{ + CFIndex len = CFDataGetLength(rep->data); + CFMutableDataRef buffer = CFDataCreateMutableCopy(kCFAllocatorDefault, (len + 12), rep->data); + UInt8* bufferBytes = CFDataGetMutableBytePtr(buffer); + + size_t prefixLength = strlen(rep->length) + 1; + CFDataReplaceBytes(buffer, BeginningRange, (const UInt8*)rep->length, (CFIndex)prefixLength); + + if (rep->format == kTSITStringFormatTNetstring) { + const UInt8 ftag = (UInt8)TNetstringTypes[rep->type]; + CFDataAppendBytes(buffer, &ftag, 1); + bufferBytes[(prefixLength - 1)] = TNetstringSeparator; + } else if (rep->format == kTSITStringFormatOTNetstring) { + const UInt8 ftag = (UInt8)OTNetstringTypes[rep->type]; + bufferBytes[(prefixLength - 1)] = ftag; + } + + CFDataRef dataRep = CFDataCreateCopy(kCFAllocatorDefault, buffer); + CFRelease(buffer); + + return dataRep; +} + +static inline CFStringRef TSICTStringCreateStringFromIntermediateRepresentation(TStringIRep* rep) +{ + CFDataRef data = TSICTStringCreateDataFromIntermediateRepresentation(rep); + CFStringRef string = CFStringCreateFromExternalRepresentation(kCFAllocatorDefault, data, kCFStringEncodingUTF8); + CFRelease(data); + return string; +} + +static inline void TSICTStringAppendObjectToMutableDataWithFormat(CFTypeRef object, CFMutableDataRef buffer, TSITStringFormat format) +{ + if (object == NULL) { + object = kCFNull; + } + + CFRetain(object); + + TStringIRep* objRep = TSICTStringCreateWithObjectAndFormat(object, format); + CFDataRef objData = TSICTStringCreateDataFromIntermediateRepresentation(objRep); + CFDataAppendBytes(buffer, (CFDataGetBytePtr(objData)), CFDataGetLength(objData)); + CFRelease(objData); + TSICTStringDestroy(objRep); + + CFRelease(object); +} + +static void ArrayBufferAppendCallback(const void* item, void* context) +{ + TStringCollectionCallbackContext* cx = (TStringCollectionCallbackContext*)context; + CFMutableDataRef buffer = cx->buffer; + TSITStringFormat format = cx->format; + + TSICTStringAppendObjectToMutableDataWithFormat(item, buffer, format); +} + +static void DictionaryBufferAppendCallback(const void* key, const void* value, void* context) +{ + TStringCollectionCallbackContext* cx = (TStringCollectionCallbackContext*)context; + CFMutableDataRef buffer = cx->buffer; + TSITStringFormat format = cx->format; + + TSICTStringAppendObjectToMutableDataWithFormat(key, buffer, format); + TSICTStringAppendObjectToMutableDataWithFormat(value, buffer, format); +} + + +CFDataRef TSICTStringCreateRenderedData(TStringIRep* rep) +{ + return TSICTStringCreateDataFromIntermediateRepresentation(rep); +} + +CFDataRef TSICTStringCreateRenderedDataFromObjectWithFormat(CFTypeRef object, TSITStringFormat format) +{ + if (object == NULL) { + object = kCFNull; + } + + CFRetain(object); + + TStringIRep* rep = TSICTStringCreateWithObjectAndFormat(object, format); + CFDataRef data = TSICTStringCreateDataFromIntermediateRepresentation(rep); + + TSICTStringDestroy(rep); + CFRelease(object); + + return data; +} + +CFStringRef TSICTStringCreateRenderedString(TStringIRep* rep) +{ + return TSICTStringCreateStringFromIntermediateRepresentation(rep); +} + +CFStringRef TSICTStringCreateRenderedStringFromObjectWithFormat(CFTypeRef object, TSITStringFormat format) +{ + if (object == NULL) { + object = kCFNull; + } + + CFRetain(object); + + TStringIRep* rep = TSICTStringCreateWithObjectAndFormat(object, format); + CFStringRef string = TSICTStringCreateStringFromIntermediateRepresentation(rep); + + TSICTStringDestroy(rep); + CFRelease(object); + + return string; +} + + +TStringIRep* TSICTStringCreateWithObjectAndFormat(CFTypeRef object, TSITStringFormat format) +{ + if (object == NULL) { + return TSICTStringCreateNullWithFormat(format); + } + CFRetain(object); + + CFTypeID cfType = CFGetTypeID(object); + TStringIRep* rep = NULL; + + if (cfType == kCFDataTypeID) { + rep = TSICTStringCreateWithDataOfTypeAndFormat(object, kTSITStringTagString, format); + } else if (cfType == kCFStringTypeID) { + rep = TSICTStringCreateWithStringAndFormat(object, format); + } else if (cfType == kCFNumberTypeID) { + rep = TSICTStringCreateWithNumberAndFormat(object, format); + } else if (cfType == kCFBooleanTypeID) { + if (CFBooleanGetValue(object)) { + rep = TSICTStringCreateTrueWithFormat(format); + } else { + rep = TSICTStringCreateFalseWithFormat(format); + } + } else if (cfType == kCFNullTypeID) { + rep = TSICTStringCreateNullWithFormat(format); + } else if (cfType == kCFArrayTypeID) { + rep = TSICTStringCreateWithArrayAndFormat(object, format); + } else if (cfType == kCFDictionaryTypeID) { + rep = TSICTStringCreateWithDictionaryAndFormat(object, format); + } else { + rep = TSICTStringCreateInvalidWithFormat(format); + } + + CFRelease(object); + return rep; +} + +TStringIRep* TSICTStringCreateWithStringAndFormat(CFStringRef string, TSITStringFormat format) +{ + CFRetain(string); + CFDataRef data = CFStringCreateExternalRepresentation(kCFAllocatorDefault, string, kCFStringEncodingUTF8, '?'); + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagString, format); + CFRelease(data); + CFRelease(string); + return rep; +} + +TStringIRep* TSICTStringCreateWithNumberAndFormat(CFNumberRef number, TSITStringFormat format) +{ + CFRetain(number); + TSITStringTag tag = kTSITStringTagNumber; + CFDataRef data; + CFNumberType numType = CFNumberGetType(number); + + switch(numType) { + case kCFNumberCharType: + { + int value; + if (CFNumberGetValue(number, kCFNumberIntType, &value)) { + if (value == 0 || value == 1) { + tag = kTSITStringTagBool; + } else { + tag = kTSITStringTagString; + } + } + break; + } + case kCFNumberFloat32Type: + case kCFNumberFloat64Type: + case kCFNumberFloatType: + case kCFNumberDoubleType: + { + tag = kTSITStringTagFloat; + break; + } + } + + if (tag == kTSITStringTagBool) { + bool value; + CFNumberGetValue(number, kCFNumberIntType, &value); + if (value) { + data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"true", 4); + } else { + data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"false", 5); + } + } else if (tag == kTSITStringTagFloat) { + char buf[32]; + char *p, *e; + double value; + + CFNumberGetValue(number, numType, &value); + sprintf(buf, "%#.15g", value); + + e = buf + strlen(buf); + p = e; + while (p[-1]=='0' && ('0' <= p[-2] && p[-2] <= '9')) { + p--; + } + memmove(p, e, strlen(e)+1); + + data = CFDataCreate(kCFAllocatorDefault, (UInt8*)buf, (CFIndex)strlen(buf)); + } else { + char buf[32]; + SInt64 value; + CFNumberGetValue(number, numType, &value); + sprintf(buf, "%lli", value); + data = CFDataCreate(kCFAllocatorDefault, (UInt8*)buf, (CFIndex)strlen(buf)); + } + + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, tag, format); + CFRelease(data); + CFRelease(number); + return rep; +} + +TStringIRep* TSICTStringCreateTrueWithFormat(TSITStringFormat format) +{ + CFDataRef data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"true", 4); + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagBool, format); + CFRelease(data); + return rep; +} + +TStringIRep* TSICTStringCreateFalseWithFormat(TSITStringFormat format) +{ + CFDataRef data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"false", 5); + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagBool, format); + CFRelease(data); + return rep; +} + +TStringIRep* TSICTStringCreateNullWithFormat(TSITStringFormat format) +{ + CFDataRef data = CFDataCreate(kCFAllocatorDefault, NULL, 0); + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagNull, format); + CFRelease(data); + return rep; +} + +TStringIRep* TSICTStringCreateInvalidWithFormat(TSITStringFormat format) +{ + CFDataRef data = CFDataCreate(kCFAllocatorDefault, NULL, 0); + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagInvalid, format); + CFRelease(data); + return rep; +} + +TStringIRep* TSICTStringCreateWithArrayAndFormat(CFArrayRef array, TSITStringFormat format) +{ + CFRetain(array); + + CFMutableDataRef buffer = CFDataCreateMutable(kCFAllocatorDefault, 0); + + CFRange all = CFRangeMake(0, CFArrayGetCount(array)); + TStringCollectionCallbackContext cx = {buffer, format}; + CFArrayApplyFunction(array, all, ArrayBufferAppendCallback, &cx); + + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(buffer, kTSITStringTagList, format); + CFRelease(buffer); + CFRelease(array); + return rep; +} + +TStringIRep* TSICTStringCreateWithDictionaryAndFormat(CFDictionaryRef dictionary, TSITStringFormat format) +{ + CFRetain(dictionary); + + CFMutableDataRef buffer = CFDataCreateMutable(kCFAllocatorDefault, 0); + + TStringCollectionCallbackContext cx = {buffer, format}; + CFDictionaryApplyFunction(dictionary, DictionaryBufferAppendCallback, &cx); + + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(buffer, kTSITStringTagDict, format); + CFRelease(buffer); + CFRelease(dictionary); + return rep; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.h new file mode 100644 index 0000000..daf085c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.h @@ -0,0 +1,74 @@ +// +// TSICTString.h +// TSITString +// +// Created by Travis Tilley on 9/27/11. +// + +#ifndef TSICTString_H +#define TSICTString_H + +#include + + +typedef enum { + kTSITStringTagString = 0, + kTSITStringTagNumber = 1, + kTSITStringTagFloat = 2, + kTSITStringTagBool = 3, + kTSITStringTagNull = 4, + kTSITStringTagDict = 5, + kTSITStringTagList = 6, + kTSITStringTagInvalid = 7, +} TSITStringTag; + +extern const char* const TNetstringTypes; +extern const char* const OTNetstringTypes; +extern const UInt8 TNetstringSeparator; + +typedef enum { + kTSITStringFormatDefault = 0, + kTSITStringFormatOTNetstring = 1, + kTSITStringFormatTNetstring = 2, +} TSITStringFormat; + +extern TSITStringFormat TSITStringDefaultFormat; + +typedef struct TSITStringIntermediate { + CFDataRef data; + char* length; + TSITStringTag type; + TSITStringFormat format; +} TStringIRep; + +typedef struct { + CFMutableDataRef buffer; + TSITStringFormat format; +} TStringCollectionCallbackContext; + + +void Init_TSICTString(void); + +void TSICTStringSetDefaultFormat(TSITStringFormat format); +TSITStringFormat TSICTStringGetDefaultFormat(void); + +void TSICTStringDestroy(TStringIRep* rep); + +CFDataRef TSICTStringCreateRenderedData(TStringIRep* rep); +CFDataRef TSICTStringCreateRenderedDataFromObjectWithFormat(CFTypeRef object, TSITStringFormat format); + +CFStringRef TSICTStringCreateRenderedString(TStringIRep* rep); +CFStringRef TSICTStringCreateRenderedStringFromObjectWithFormat(CFTypeRef object, TSITStringFormat format); + +TStringIRep* TSICTStringCreateWithObjectAndFormat(CFTypeRef object, TSITStringFormat format); +TStringIRep* TSICTStringCreateWithStringAndFormat(CFStringRef string, TSITStringFormat format); +TStringIRep* TSICTStringCreateWithNumberAndFormat(CFNumberRef number, TSITStringFormat format); +TStringIRep* TSICTStringCreateTrueWithFormat(TSITStringFormat format); +TStringIRep* TSICTStringCreateFalseWithFormat(TSITStringFormat format); +TStringIRep* TSICTStringCreateNullWithFormat(TSITStringFormat format); +TStringIRep* TSICTStringCreateInvalidWithFormat(TSITStringFormat format); +TStringIRep* TSICTStringCreateWithArrayAndFormat(CFArrayRef array, TSITStringFormat format); +TStringIRep* TSICTStringCreateWithDictionaryAndFormat(CFDictionaryRef dictionary, TSITStringFormat format); + + +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.c new file mode 100644 index 0000000..6d36dd1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.c @@ -0,0 +1,201 @@ +#include +#include "cli.h" + +const char* cli_info_purpose = "A flexible command-line interface for the FSEvents API"; +const char* cli_info_usage = "Usage: fsevent_watch [OPTIONS]... [PATHS]..."; +const char* cli_info_help[] = { + " -h, --help you're looking at it", + " -V, --version print version number and exit", + " -p, --show-plist display the embedded Info.plist values", + " -s, --since-when=EventID fire historical events since ID", + " -l, --latency=seconds latency period (default='0.5')", + " -n, --no-defer enable no-defer latency modifier", + " -r, --watch-root watch for when the root path has changed", + // " -i, --ignore-self ignore current process", + " -F, --file-events provide file level event data", + " -f, --format=name output format (classic, niw, \n" + " tnetstring, otnetstring)", + 0 +}; + +static void default_args (struct cli_info* args_info) +{ + args_info->since_when_arg = kFSEventStreamEventIdSinceNow; + args_info->latency_arg = 0.5; + args_info->no_defer_flag = false; + args_info->watch_root_flag = false; + args_info->ignore_self_flag = false; + args_info->file_events_flag = false; + args_info->mark_self_flag = false; + args_info->format_arg = kFSEventWatchOutputFormatOTNetstring; +} + +static void cli_parser_release (struct cli_info* args_info) +{ + unsigned int i; + + for (i=0; i < args_info->inputs_num; ++i) { + free(args_info->inputs[i]); + } + + if (args_info->inputs_num) { + free(args_info->inputs); + } + + args_info->inputs_num = 0; +} + +void cli_parser_init (struct cli_info* args_info) +{ + default_args(args_info); + + args_info->inputs = 0; + args_info->inputs_num = 0; +} + +void cli_parser_free (struct cli_info* args_info) +{ + cli_parser_release(args_info); +} + +static void cli_print_info_dict (const void *key, + const void *value, + void *context) +{ + CFStringRef entry = CFStringCreateWithFormat(NULL, NULL, + CFSTR("%@:\n %@"), key, value); + if (entry) { + CFShow(entry); + CFRelease(entry); + } +} + +void cli_show_plist (void) +{ + CFBundleRef mainBundle = CFBundleGetMainBundle(); + CFRetain(mainBundle); + CFDictionaryRef mainBundleDict = CFBundleGetInfoDictionary(mainBundle); + if (mainBundleDict) { + CFRetain(mainBundleDict); + printf("Embedded Info.plist metadata:\n\n"); + CFDictionaryApplyFunction(mainBundleDict, cli_print_info_dict, NULL); + CFRelease(mainBundleDict); + } + CFRelease(mainBundle); + printf("\n"); +} + +void cli_print_version (void) +{ + printf("%s %s\n\n", CLI_NAME, CLI_VERSION); +#ifdef COMPILED_AT + printf("Compiled at: %s\n", COMPILED_AT); +#endif +#ifdef COMPILER + printf("Compiled with: %s\n", COMPILER); +#endif +#ifdef TARGET_CPU + printf("Compiled for: %s\n", TARGET_CPU); +#endif + printf("\n"); +} + +void cli_print_help (void) +{ + cli_print_version(); + + printf("\n%s\n", cli_info_purpose); + printf("\n%s\n", cli_info_usage); + printf("\n"); + + int i = 0; + while (cli_info_help[i]) { + printf("%s\n", cli_info_help[i++]); + } +} + +int cli_parser (int argc, const char** argv, struct cli_info* args_info) +{ + static struct option longopts[] = { + { "help", no_argument, NULL, 'h' }, + { "version", no_argument, NULL, 'V' }, + { "show-plist", no_argument, NULL, 'p' }, + { "since-when", required_argument, NULL, 's' }, + { "latency", required_argument, NULL, 'l' }, + { "no-defer", no_argument, NULL, 'n' }, + { "watch-root", no_argument, NULL, 'r' }, + { "ignore-self", no_argument, NULL, 'i' }, + { "file-events", no_argument, NULL, 'F' }, + { "mark-self", no_argument, NULL, 'm' }, + { "format", required_argument, NULL, 'f' }, + { 0, 0, 0, 0 } + }; + + const char* shortopts = "hVps:l:nriFf:"; + + int c = -1; + + while ((c = getopt_long(argc, (char * const*)argv, shortopts, longopts, NULL)) != -1) { + switch(c) { + case 's': // since-when + args_info->since_when_arg = strtoull(optarg, NULL, 0); + break; + case 'l': // latency + args_info->latency_arg = strtod(optarg, NULL); + break; + case 'n': // no-defer + args_info->no_defer_flag = true; + break; + case 'r': // watch-root + args_info->watch_root_flag = true; + break; + case 'i': // ignore-self + args_info->ignore_self_flag = true; + break; + case 'F': // file-events + args_info->file_events_flag = true; + break; + case 'm': // mark-self + args_info->mark_self_flag = true; + break; + case 'f': // format + if (strcmp(optarg, "classic") == 0) { + args_info->format_arg = kFSEventWatchOutputFormatClassic; + } else if (strcmp(optarg, "niw") == 0) { + args_info->format_arg = kFSEventWatchOutputFormatNIW; + } else if (strcmp(optarg, "tnetstring") == 0) { + args_info->format_arg = kFSEventWatchOutputFormatTNetstring; + } else if (strcmp(optarg, "otnetstring") == 0) { + args_info->format_arg = kFSEventWatchOutputFormatOTNetstring; + } else { + fprintf(stderr, "Unknown output format: %s\n", optarg); + exit(EXIT_FAILURE); + } + break; + case 'V': // version + cli_print_version(); + exit(EXIT_SUCCESS); + case 'p': // show-plist + cli_show_plist(); + exit(EXIT_SUCCESS); + case 'h': // help + case '?': // invalid option + case ':': // missing argument + cli_print_help(); + exit((c == 'h') ? EXIT_SUCCESS : EXIT_FAILURE); + } + } + + if (optind < argc) { + int i = 0; + args_info->inputs_num = (unsigned int)(argc - optind); + args_info->inputs = + (char**)(malloc ((args_info->inputs_num)*sizeof(char*))); + while (optind < argc) + if (argv[optind++] != argv[0]) { + args_info->inputs[i++] = strdup(argv[optind-1]); + } + } + + return EXIT_SUCCESS; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.h new file mode 100644 index 0000000..2164995 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.h @@ -0,0 +1,45 @@ +#ifndef CLI_H +#define CLI_H + +#include "common.h" + +#ifndef CLI_NAME +#define CLI_NAME "fsevent_watch" +#endif /* CLI_NAME */ + +#ifndef PROJECT_VERSION +#error "PROJECT_VERSION not set" +#endif /* PROJECT_VERSION */ + +#ifndef CLI_VERSION +#define CLI_VERSION _xstr(PROJECT_VERSION) +#endif /* CLI_VERSION */ + + +struct cli_info { + UInt64 since_when_arg; + double latency_arg; + bool no_defer_flag; + bool watch_root_flag; + bool ignore_self_flag; + bool file_events_flag; + bool mark_self_flag; + enum FSEventWatchOutputFormat format_arg; + + char** inputs; + unsigned inputs_num; +}; + +extern const char* cli_info_purpose; +extern const char* cli_info_usage; +extern const char* cli_info_help[]; + +void cli_print_help(void); +void cli_print_version(void); + +int cli_parser (int argc, const char** argv, struct cli_info* args_info); +void cli_parser_init (struct cli_info* args_info); +void cli_parser_free (struct cli_info* args_info); + + +#endif /* CLI_H */ diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/common.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/common.h new file mode 100644 index 0000000..b2d3e4e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/common.h @@ -0,0 +1,22 @@ +#ifndef fsevent_watch_common_h +#define fsevent_watch_common_h + +#include +#ifdef __OBJC__ +#import +#endif + +#include +#include +#include "compat.h" +#include "defines.h" +#include "TSICTString.h" + +enum FSEventWatchOutputFormat { + kFSEventWatchOutputFormatClassic, + kFSEventWatchOutputFormatNIW, + kFSEventWatchOutputFormatTNetstring, + kFSEventWatchOutputFormatOTNetstring +}; + +#endif /* fsevent_watch_common_h */ diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.c new file mode 100644 index 0000000..5f51baf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.c @@ -0,0 +1,41 @@ +#include "compat.h" + + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_6) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) +FSEventStreamCreateFlags kFSEventStreamCreateFlagIgnoreSelf = 0x00000008; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_7) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) +FSEventStreamCreateFlags kFSEventStreamCreateFlagFileEvents = 0x00000010; +FSEventStreamEventFlags kFSEventStreamEventFlagItemCreated = 0x00000100; +FSEventStreamEventFlags kFSEventStreamEventFlagItemRemoved = 0x00000200; +FSEventStreamEventFlags kFSEventStreamEventFlagItemInodeMetaMod = 0x00000400; +FSEventStreamEventFlags kFSEventStreamEventFlagItemRenamed = 0x00000800; +FSEventStreamEventFlags kFSEventStreamEventFlagItemModified = 0x00001000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemFinderInfoMod = 0x00002000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemChangeOwner = 0x00004000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemXattrMod = 0x00008000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsFile = 0x00010000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsDir = 0x00020000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsSymlink = 0x00040000; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_9) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0) +FSEventStreamCreateFlags kFSEventStreamCreateFlagMarkSelf = 0x00000020; +FSEventStreamEventFlags kFSEventStreamEventFlagOwnEvent = 0x00080000; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_10) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0) +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsHardlink = 0x00100000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsLastHardlink = 0x00200000; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_13) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_11_0) +FSEventStreamCreateFlags kFSEventStreamCreateFlagUseExtendedData = 0x00000040; +FSEventStreamEventFlags kFSEventStreamEventFlagItemCloned = 0x00400000; +#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.h new file mode 100644 index 0000000..757b413 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.h @@ -0,0 +1,100 @@ +/** + * @headerfile compat.h + * FSEventStream flag compatibility shim + * + * In order to compile a binary against an older SDK yet still support the + * features present in later OS releases, we need to define any missing enum + * constants not present in the older SDK. This allows us to safely defer + * feature detection to runtime (and avoid recompilation). + */ + + +#ifndef listen_fsevents_compat_h +#define listen_fsevents_compat_h + +#ifndef __CORESERVICES__ +#include +#endif // __CORESERVICES__ + +#ifndef __AVAILABILITY__ +#include +#endif // __AVAILABILITY__ + +#ifndef __MAC_10_6 +#define __MAC_10_6 1060 +#endif +#ifndef __MAC_10_7 +#define __MAC_10_7 1070 +#endif +#ifndef __MAC_10_9 +#define __MAC_10_9 1090 +#endif +#ifndef __MAC_10_10 +#define __MAC_10_10 101000 +#endif +#ifndef __MAC_10_13 +#define __MAC_10_13 101300 +#endif +#ifndef __IPHONE_6_0 +#define __IPHONE_6_0 60000 +#endif +#ifndef __IPHONE_7_0 +#define __IPHONE_7_0 70000 +#endif +#ifndef __IPHONE_9_0 +#define __IPHONE_9_0 90000 +#endif +#ifndef __IPHONE_11_0 +#define __IPHONE_11_0 110000 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_6) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) +extern FSEventStreamCreateFlags kFSEventStreamCreateFlagIgnoreSelf; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_7) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) +extern FSEventStreamCreateFlags kFSEventStreamCreateFlagFileEvents; +extern FSEventStreamEventFlags kFSEventStreamEventFlagItemCreated, + kFSEventStreamEventFlagItemRemoved, + kFSEventStreamEventFlagItemInodeMetaMod, + kFSEventStreamEventFlagItemRenamed, + kFSEventStreamEventFlagItemModified, + kFSEventStreamEventFlagItemFinderInfoMod, + kFSEventStreamEventFlagItemChangeOwner, + kFSEventStreamEventFlagItemXattrMod, + kFSEventStreamEventFlagItemIsFile, + kFSEventStreamEventFlagItemIsDir, + kFSEventStreamEventFlagItemIsSymlink; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_9) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0) +extern FSEventStreamCreateFlags kFSEventStreamCreateFlagMarkSelf; +extern FSEventStreamEventFlags kFSEventStreamEventFlagOwnEvent; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_10) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0) +extern FSEventStreamEventFlags kFSEventStreamEventFlagItemIsHardlink, + kFSEventStreamEventFlagItemIsLastHardlink; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_13) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_11_0) +extern FSEventStreamCreateFlags kFSEventStreamCreateFlagUseExtendedData; +extern FSEventStreamEventFlags kFSEventStreamEventFlagItemCloned; +#endif + + +#ifdef __cplusplus +} +#endif + +#endif // listen_fsevents_compat_h diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/defines.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/defines.h new file mode 100644 index 0000000..6f6e87b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/defines.h @@ -0,0 +1,40 @@ +#ifndef fsevent_watch_defines_h +#define fsevent_watch_defines_h + +#define _str(s) #s +#define _xstr(s) _str(s) + +#define COMPILED_AT __DATE__ " " __TIME__ + +#if defined (__clang__) +#define COMPILER "clang " __clang_version__ +#elif defined (__GNUC__) +#define COMPILER "gcc " __VERSION__ +#else +#define COMPILER "unknown" +#endif + +#if defined(__ppc__) +#define TARGET_CPU "ppc" +#elif defined(__ppc64__) +#define TARGET_CPU "ppc64" +#elif defined(__i386__) +#define TARGET_CPU "i386" +#elif defined(__x86_64__) +#define TARGET_CPU "x86_64" +#else +#define TARGET_CPU "unknown" +#endif + +#define FLAG_CHECK(flags, flag) ((flags) & (flag)) + +#define FPRINTF_FLAG_CHECK(flags, flag, msg, fd) \ + do { \ + if (FLAG_CHECK(flags, flag)) { \ + fprintf(fd, "%s", msg "\n"); } } \ + while (0) + +#define FLAG_CHECK_STDERR(flags, flag, msg) \ + FPRINTF_FLAG_CHECK(flags, flag, msg, stderr) + +#endif /* fsevent_watch_defines_h */ diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/main.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/main.c new file mode 100644 index 0000000..b18596a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/main.c @@ -0,0 +1,548 @@ +#include "common.h" +#include "signal_handlers.h" +#include "cli.h" +#include "FSEventsFix.h" + +// TODO: set on fire. cli.{h,c} handle both parsing and defaults, so there's +// no need to set those here. also, in order to scope metadata by path, +// each stream will need its own configuration... so this won't work as +// a global any more. In the end the goal is to make the output format +// able to declare not just that something happened and what flags were +// attached, but what path it was watching that caused those events (so +// that the path itself can be used for routing that information to the +// relevant callback). +// +// Structure for storing metadata parsed from the commandline +static struct { + FSEventStreamEventId sinceWhen; + CFTimeInterval latency; + FSEventStreamCreateFlags flags; + CFMutableArrayRef paths; + enum FSEventWatchOutputFormat format; +} config = { + (UInt64) kFSEventStreamEventIdSinceNow, + (double) 0.3, + (CFOptionFlags) kFSEventStreamCreateFlagNone, + NULL, + kFSEventWatchOutputFormatOTNetstring +}; + +// Prototypes +static void append_path(const char* path); +static inline void parse_cli_settings(int argc, const char* argv[]); +static void callback(FSEventStreamRef streamRef, + void* clientCallBackInfo, + size_t numEvents, + void* eventPaths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[]); +static bool needs_fsevents_fix = false; + +// Resolve a path and append it to the CLI settings structure +// The FSEvents API will, internally, resolve paths using a similar scheme. +// Performing this ahead of time makes things less confusing, IMHO. +static void append_path(const char* path) +{ +#ifdef DEBUG + fprintf(stderr, "\n"); + fprintf(stderr, "append_path called for: %s\n", path); +#endif + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + +#ifdef DEBUG + fprintf(stderr, "compiled against 10.6+, using CFURLCreateFileReferenceURL\n"); +#endif + + CFURLRef url = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)path, (CFIndex)strlen(path), false); + CFURLRef placeholder = CFURLCopyAbsoluteURL(url); + CFRelease(url); + + CFMutableArrayRef imaginary = NULL; + + // if we don't have an existing url, spin until we get to a parent that + // does exist, saving any imaginary components for appending back later + while(!CFURLResourceIsReachable(placeholder, NULL)) { +#ifdef DEBUG + fprintf(stderr, "path does not exist\n"); +#endif + + CFStringRef child; + + if (imaginary == NULL) { + imaginary = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); + } + + child = CFURLCopyLastPathComponent(placeholder); + CFArrayInsertValueAtIndex(imaginary, 0, child); + CFRelease(child); + + url = CFURLCreateCopyDeletingLastPathComponent(NULL, placeholder); + CFRelease(placeholder); + placeholder = url; + +#ifdef DEBUG + fprintf(stderr, "parent: "); + CFShow(placeholder); +#endif + } + +#ifdef DEBUG + fprintf(stderr, "path exists\n"); +#endif + + // realpath() doesn't always return the correct case for a path, so this + // is a funky workaround that converts a path into a (volId/inodeId) pair + // and asks what the path should be for that. since it looks at the actual + // inode instead of returning the same case passed in like realpath() + // appears to do for HFS+, it should always be correct. + url = CFURLCreateFileReferenceURL(NULL, placeholder, NULL); + CFRelease(placeholder); + placeholder = CFURLCreateFilePathURL(NULL, url, NULL); + CFRelease(url); + +#ifdef DEBUG + fprintf(stderr, "path resolved to: "); + CFShow(placeholder); +#endif + + // if we stripped off any imaginary path components, append them back on + if (imaginary != NULL) { + CFIndex count = CFArrayGetCount(imaginary); + for (CFIndex i = 0; i= 6)) { + config.flags |= kFSEventStreamCreateFlagIgnoreSelf; + } else { + fprintf(stderr, "MacOSX 10.6 or later is required for --ignore-self\n"); + exit(EXIT_FAILURE); + } + } + + if (args_info.file_events_flag) { + if ((osMajorVersion == 10) & (osMinorVersion >= 7)) { + config.flags |= kFSEventStreamCreateFlagFileEvents; + } else { + fprintf(stderr, "MacOSX 10.7 or later required for --file-events\n"); + exit(EXIT_FAILURE); + } + } + + if (args_info.mark_self_flag) { + if ((osMajorVersion == 10) & (osMinorVersion >= 9)) { + config.flags |= kFSEventStreamCreateFlagMarkSelf; + } else { + fprintf(stderr, "MacOSX 10.9 or later required for --mark-self\n"); + exit(EXIT_FAILURE); + } + } + + if (args_info.inputs_num == 0) { + append_path("."); + } else { + for (unsigned int i=0; i < args_info.inputs_num; ++i) { + append_path(args_info.inputs[i]); + } + } + + cli_parser_free(&args_info); + +#ifdef DEBUG + fprintf(stderr, "config.sinceWhen %llu\n", config.sinceWhen); + fprintf(stderr, "config.latency %f\n", config.latency); + +// STFU clang +#if defined(__LP64__) + fprintf(stderr, "config.flags %#.8x\n", config.flags); +#else + fprintf(stderr, "config.flags %#.8lx\n", config.flags); +#endif + + FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagUseCFTypes, + " Using CF instead of C types"); + FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagNoDefer, + " NoDefer latency modifier enabled"); + FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagWatchRoot, + " WatchRoot notifications enabled"); + FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagIgnoreSelf, + " IgnoreSelf enabled"); + FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagFileEvents, + " FileEvents enabled"); + + fprintf(stderr, "config.paths\n"); + + long numpaths = CFArrayGetCount(config.paths); + + for (long i = 0; i < numpaths; i++) { + char path[PATH_MAX]; + CFStringGetCString(CFArrayGetValueAtIndex(config.paths, i), + path, + PATH_MAX, + kCFStringEncodingUTF8); + fprintf(stderr, " %s\n", path); + } + + fprintf(stderr, "\n"); +#endif +} + +// original output format for rb-fsevent +static void classic_output_format(size_t numEvents, + char** paths) +{ + for (size_t i = 0; i < numEvents; i++) { + fprintf(stdout, "%s:", paths[i]); + } + fprintf(stdout, "\n"); +} + +// output format used in the Yoshimasa Niwa branch of rb-fsevent +static void niw_output_format(size_t numEvents, + char** paths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[]) +{ + for (size_t i = 0; i < numEvents; i++) { + fprintf(stdout, "%lu:%llu:%s\n", + (unsigned long)eventFlags[i], + (unsigned long long)eventIds[i], + paths[i]); + } + fprintf(stdout, "\n"); +} + +static void tstring_output_format(size_t numEvents, + char** paths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[], + TSITStringFormat format) +{ + CFMutableArrayRef events = CFArrayCreateMutable(kCFAllocatorDefault, + 0, &kCFTypeArrayCallBacks); + + for (size_t i = 0; i < numEvents; i++) { + CFMutableDictionaryRef event = CFDictionaryCreateMutable(kCFAllocatorDefault, + 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + CFStringRef path = CFStringCreateWithBytes(kCFAllocatorDefault, + (const UInt8*)paths[i], + (CFIndex)strlen(paths[i]), + kCFStringEncodingUTF8, + false); + CFDictionarySetValue(event, CFSTR("path"), path); + + CFNumberRef ident = CFNumberCreate(kCFAllocatorDefault, kCFNumberLongLongType, &eventIds[i]); + CFDictionarySetValue(event, CFSTR("id"), ident); + + CFNumberRef cflags = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &eventFlags[i]); + CFDictionarySetValue(event, CFSTR("cflags"), cflags); + + CFMutableArrayRef flags = CFArrayCreateMutable(kCFAllocatorDefault, + 0, &kCFTypeArrayCallBacks); + +#define FLAG_ADD_NAME(flagsnum, flagnum, flagname, flagarray) \ + do { \ + if (FLAG_CHECK(flagsnum, flagnum)) { \ + CFArrayAppendValue(flagarray, CFSTR(flagname)); } } \ + while(0) + + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagMustScanSubDirs, "MustScanSubDirs", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagUserDropped, "UserDropped", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagKernelDropped, "KernelDropped", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagEventIdsWrapped, "EventIdsWrapped", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagHistoryDone, "HistoryDone", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagRootChanged, "RootChanged", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagMount, "Mount", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagUnmount, "Unmount", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemCreated, "ItemCreated", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemRemoved, "ItemRemoved", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemInodeMetaMod, "ItemInodeMetaMod", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemRenamed, "ItemRenamed", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemModified, "ItemModified", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemFinderInfoMod, "ItemFinderInfoMod", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemChangeOwner, "ItemChangeOwner", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemXattrMod, "ItemXattrMod", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsFile, "ItemIsFile", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsDir, "ItemIsDir", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsSymlink, "ItemIsSymlink", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagOwnEvent, "OwnEvent", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsHardlink, "ItemIsHardLink", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsLastHardlink, "ItemIsLastHardLink", flags); + + CFDictionarySetValue(event, CFSTR("flags"), flags); + + + CFArrayAppendValue(events, event); + + CFRelease(event); + CFRelease(path); + CFRelease(ident); + CFRelease(cflags); + CFRelease(flags); + } + + CFMutableDictionaryRef meta = CFDictionaryCreateMutable(kCFAllocatorDefault, + 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(meta, CFSTR("events"), events); + + CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberCFIndexType, &numEvents); + CFDictionarySetValue(meta, CFSTR("numEvents"), num); + + CFDataRef data = TSICTStringCreateRenderedDataFromObjectWithFormat(meta, format); + fprintf(stdout, "%s", CFDataGetBytePtr(data)); + + CFRelease(events); + CFRelease(num); + CFRelease(meta); + CFRelease(data); +} + +static void callback(__attribute__((unused)) FSEventStreamRef streamRef, + __attribute__((unused)) void* clientCallBackInfo, + size_t numEvents, + void* eventPaths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[]) +{ + char** paths = eventPaths; + + +#ifdef DEBUG + fprintf(stderr, "\n"); + fprintf(stderr, "FSEventStreamCallback fired!\n"); + fprintf(stderr, " numEvents: %lu\n", numEvents); + + for (size_t i = 0; i < numEvents; i++) { + fprintf(stderr, "\n"); + fprintf(stderr, " event ID: %llu\n", eventIds[i]); + +// STFU clang +#if defined(__LP64__) + fprintf(stderr, " event flags: %#.8x\n", eventFlags[i]); +#else + fprintf(stderr, " event flags: %#.8lx\n", eventFlags[i]); +#endif + + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagMustScanSubDirs, + " Recursive scanning of directory required"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagUserDropped, + " Buffering problem: events dropped user-side"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagKernelDropped, + " Buffering problem: events dropped kernel-side"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagEventIdsWrapped, + " Event IDs have wrapped"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagHistoryDone, + " All historical events have been processed"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagRootChanged, + " Root path has changed"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagMount, + " A new volume was mounted at this path"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagUnmount, + " A volume was unmounted from this path"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemCreated, + " Item created"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemRemoved, + " Item removed"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemInodeMetaMod, + " Item metadata modified"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemRenamed, + " Item renamed"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemModified, + " Item modified"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemFinderInfoMod, + " Item Finder Info modified"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemChangeOwner, + " Item changed ownership"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemXattrMod, + " Item extended attributes modified"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsFile, + " Item is a file"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsDir, + " Item is a directory"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsSymlink, + " Item is a symbolic link"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsHardlink, + " Item is a hard link"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsLastHardlink, + " Item is the last hard link"); + fprintf(stderr, " event path: %s\n", paths[i]); + fprintf(stderr, "\n"); + } + + fprintf(stderr, "\n"); +#endif + + if (config.format == kFSEventWatchOutputFormatClassic) { + classic_output_format(numEvents, paths); + } else if (config.format == kFSEventWatchOutputFormatNIW) { + niw_output_format(numEvents, paths, eventFlags, eventIds); + } else if (config.format == kFSEventWatchOutputFormatTNetstring) { + tstring_output_format(numEvents, paths, eventFlags, eventIds, + kTSITStringFormatTNetstring); + } else if (config.format == kFSEventWatchOutputFormatOTNetstring) { + tstring_output_format(numEvents, paths, eventFlags, eventIds, + kTSITStringFormatOTNetstring); + } + + fflush(stdout); +} + +int main(int argc, const char* argv[]) +{ + install_signal_handlers(); + parse_cli_settings(argc, argv); + + if (needs_fsevents_fix) { + FSEventsFixEnable(); + } + + FSEventStreamContext context = {0, NULL, NULL, NULL, NULL}; + FSEventStreamRef stream; + stream = FSEventStreamCreate(kCFAllocatorDefault, + (FSEventStreamCallback)&callback, + &context, + config.paths, + config.sinceWhen, + config.latency, + config.flags); + +#ifdef DEBUG + FSEventStreamShow(stream); + fprintf(stderr, "\n"); +#endif + + if (needs_fsevents_fix) { + FSEventsFixDisable(); + } + + FSEventStreamScheduleWithRunLoop(stream, + CFRunLoopGetCurrent(), + kCFRunLoopDefaultMode); + FSEventStreamStart(stream); + CFRunLoopRun(); + FSEventStreamFlushSync(stream); + FSEventStreamStop(stream); + + return 0; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.c new file mode 100644 index 0000000..b20da3f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.c @@ -0,0 +1,66 @@ +#include "signal_handlers.h" +#include +#include +#include +#include +#include +#include + + +#define PPID_ALARM_INTERVAL 2 // send SIGALRM every this seconds + + +static pid_t orig_ppid; + + +static void signal_handler(int _) { + exit(EXIT_FAILURE); +} + +static void check_ppid(void) { + if (getppid() != orig_ppid) { + exit(EXIT_FAILURE); + } +} + +static void check_stdout_open(void) { + if (fcntl(STDOUT_FILENO, F_GETFD) < 0) { + exit(EXIT_FAILURE); + } +} + +static void alarm_handler(int _) { + check_ppid(); + check_stdout_open(); + alarm(PPID_ALARM_INTERVAL); + signal(SIGALRM, alarm_handler); +} + +static void die(const char *msg) { + fprintf(stderr, "\nFATAL: %s\n", msg); + abort(); +} + +static void install_signal_handler(int sig, void (*handler)(int)) { + if (signal(sig, handler) == SIG_ERR) { + die("Could not install signal handler"); + } +} + +void install_signal_handlers(void) { + // check pipe is still connected + check_stdout_open(); + + // watch getppid() every PPID_ALARM_INTERVAL seconds + orig_ppid = getppid(); + if (orig_ppid <= 1) { + die("prematurely zombied"); + } + install_signal_handler(SIGALRM, alarm_handler); + alarm(PPID_ALARM_INTERVAL); + + // be sure to exit on SIGHUP, SIGPIPE + install_signal_handler(SIGHUP, signal_handler); + install_signal_handler(SIGPIPE, signal_handler); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.h new file mode 100644 index 0000000..c31685d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.h @@ -0,0 +1,16 @@ +/** + * @headerfile signal_handlers.h + * Signal handlers to stop the zombie hordes + * + * Catch and handle signals better so that we die faster like a good meat puppet. + */ + + +#ifndef fsevent_watch_signal_handlers_h +#define fsevent_watch_signal_handlers_h + + +void install_signal_handlers(void); + + +#endif // fsevent_watch_signal_handlers_h diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/rakefile.rb b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/rakefile.rb new file mode 100644 index 0000000..d7789bd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/ext/rakefile.rb @@ -0,0 +1,226 @@ +# -*- encoding: utf-8 -*- +require 'rubygems' unless defined?(Gem) +require 'pathname' +require 'date' +require 'time' +require 'rake/clean' + +raise "unable to find xcodebuild" unless system('which', 'xcodebuild') + + +FSEVENT_WATCH_EXE_VERSION = '0.1.5' + +$this_dir = Pathname.new(__FILE__).dirname.expand_path +$final_exe = $this_dir.parent.join('bin/fsevent_watch') + +$src_dir = $this_dir.join('fsevent_watch') +$obj_dir = $this_dir.join('build') + +SRC = Pathname.glob("#{$src_dir}/*.c") +OBJ = SRC.map {|s| $obj_dir.join("#{s.basename('.c')}.o")} + +$now = DateTime.now.xmlschema rescue Time.now.xmlschema + +$CC = ENV['CC'] || `which clang || which gcc`.strip +$CFLAGS = ENV['CFLAGS'] || '-fconstant-cfstrings -fasm-blocks -fstrict-aliasing -Wall' +$ARCHFLAGS = ENV['ARCHFLAGS'] || '-arch x86_64' +$DEFINES = "-DNS_BUILD_32_LIKE_64 -DNS_BLOCK_ASSERTIONS -DPROJECT_VERSION=#{FSEVENT_WATCH_EXE_VERSION}" + +$GCC_C_LANGUAGE_STANDARD = ENV['GCC_C_LANGUAGE_STANDARD'] || 'gnu11' + +# generic developer id name so it'll match correctly for anyone who has only +# one developer id in their keychain (not that I expect anyone else to bother) +$CODE_SIGN_IDENTITY = 'Developer ID Application' + +$arch = `uname -m`.strip +$os_release = `uname -r`.strip +$BUILD_TRIPLE = "#{$arch}-apple-darwin#{$os_release}" + +$CCVersion = `#{$CC} --version | head -n 1`.strip + + +CLEAN.include OBJ.map(&:to_s) +CLEAN.include $obj_dir.join('Info.plist').to_s +CLEAN.include $obj_dir.join('fsevent_watch').to_s +CLOBBER.include $final_exe.to_s + + +task :sw_vers do + $mac_product_version = `sw_vers -productVersion`.strip + $mac_build_version = `sw_vers -buildVersion`.strip + $MACOSX_DEPLOYMENT_TARGET = ENV['MACOSX_DEPLOYMENT_TARGET'] || $mac_product_version.sub(/\.\d*$/, '') + $CFLAGS = "#{$CFLAGS} -mmacosx-version-min=#{$MACOSX_DEPLOYMENT_TARGET}" +end + +task :get_sdk_info => :sw_vers do + $SDK_INFO = {} + version_info = `xcodebuild -version -sdk macosx#{$MACOSX_DEPLOYMENT_TARGET}` + raise "invalid SDK" unless !!$?.exitstatus + version_info.strip.each_line do |line| + next if line.strip.empty? + next unless line.include?(':') + match = line.match(/([^:]*): (.*)/) + next unless match + $SDK_INFO[match[1]] = match[2] + end +end + +task :debug => :sw_vers do + $DEFINES = "-DDEBUG #{$DEFINES}" + $CFLAGS = "#{$CFLAGS} -O0 -fno-omit-frame-pointer -g" +end + +task :release => :sw_vers do + $DEFINES = "-DNDEBUG #{$DEFINES}" + $CFLAGS = "#{$CFLAGS} -Ofast" +end + +desc 'configure build type depending on whether ENV var FWDEBUG is set' +task :set_build_type => :sw_vers do + if ENV['FWDEBUG'] + Rake::Task[:debug].invoke + else + Rake::Task[:release].invoke + end +end + +desc 'set build arch to ppc' +task :ppc do + $ARCHFLAGS = '-arch ppc' +end + +desc 'set build arch to x86_64' +task :x86_64 do + $ARCHFLAGS = '-arch x86_64' +end + +desc 'set build arch to i386' +task :x86 do + $ARCHFLAGS = '-arch i386' +end + +task :setup_env => [:set_build_type, :sw_vers, :get_sdk_info] + +directory $obj_dir.to_s +file $obj_dir.to_s => :setup_env + +SRC.zip(OBJ).each do |source, object| + file object.to_s => [source.to_s, $obj_dir.to_s] do + cmd = [ + $CC, + $ARCHFLAGS, + "-std=#{$GCC_C_LANGUAGE_STANDARD}", + $CFLAGS, + $DEFINES, + "-I#{$src_dir}", + '-isysroot', + $SDK_INFO['Path'], + '-c', source, + '-o', object + ] + sh(cmd.map {|s| s.to_s}.join(' ')) + end +end + +file $obj_dir.join('Info.plist').to_s => [$obj_dir.to_s, :setup_env] do + File.open($obj_dir.join('Info.plist').to_s, 'w+') do |file| + indentation = '' + indent = lambda {|num| indentation = ' ' * num } + add = lambda {|str| file << "#{indentation}#{str}\n" } + key = lambda {|str| add["#{str}"] } + string = lambda {|str| add["#{str}"] } + + + add[''] + add[''] + add[''] + + indent[2] + add[''] + indent[4] + + key['CFBundleExecutable'] + string['fsevent_watch'] + key['CFBundleIdentifier'] + string['com.teaspoonofinsanity.fsevent_watch'] + key['CFBundleName'] + string['fsevent_watch'] + key['CFBundleDisplayName'] + string['FSEvent Watch CLI'] + key['NSHumanReadableCopyright'] + string['Copyright (C) 2011-2017 Travis Tilley'] + + key['CFBundleVersion'] + string["#{FSEVENT_WATCH_EXE_VERSION}"] + key['LSMinimumSystemVersion'] + string["#{$MACOSX_DEPLOYMENT_TARGET}"] + key['DTSDKBuild'] + string["#{$SDK_INFO['ProductBuildVersion']}"] + key['DTSDKName'] + string["macosx#{$SDK_INFO['SDKVersion']}"] + key['DTSDKPath'] + string["#{$SDK_INFO['Path']}"] + key['BuildMachineOSBuild'] + string["#{$mac_build_version}"] + key['BuildMachineOSVersion'] + string["#{$mac_product_version}"] + key['FSEWCompiledAt'] + string["#{$now}"] + key['FSEWVersionInfoBuilder'] + string["#{`whoami`.strip}"] + key['FSEWBuildTriple'] + string["#{$BUILD_TRIPLE}"] + key['FSEWCC'] + string["#{$CC}"] + key['FSEWCCVersion'] + string["#{$CCVersion}"] + key['FSEWCFLAGS'] + string["#{$CFLAGS}"] + + indent[2] + add[''] + indent[0] + + add[''] + end +end + +desc 'generate an Info.plist used for code signing as well as embedding build settings into the resulting binary' +task :plist => $obj_dir.join('Info.plist').to_s + + +file $obj_dir.join('fsevent_watch').to_s => [$obj_dir.to_s, $obj_dir.join('Info.plist').to_s] + OBJ.map(&:to_s) do + cmd = [ + $CC, + $ARCHFLAGS, + "-std=#{$GCC_C_LANGUAGE_STANDARD}", + $CFLAGS, + $DEFINES, + "-I#{$src_dir}", + '-isysroot', + $SDK_INFO['Path'], + '-framework CoreFoundation -framework CoreServices', + '-sectcreate __TEXT __info_plist', + $obj_dir.join('Info.plist') + ] + OBJ + [ + '-o', $obj_dir.join('fsevent_watch') + ] + sh(cmd.map {|s| s.to_s}.join(' ')) +end + +desc 'compile and link build/fsevent_watch' +task :build => $obj_dir.join('fsevent_watch').to_s + +desc 'codesign build/fsevent_watch binary' +task :codesign => :build do + sh "codesign -s '#{$CODE_SIGN_IDENTITY}' #{$obj_dir.join('fsevent_watch')}" +end + +directory $this_dir.parent.join('bin') + +desc 'replace bundled fsevent_watch binary with build/fsevent_watch' +task :replace_exe => [$this_dir.parent.join('bin'), :build] do + sh "mv #{$obj_dir.join('fsevent_watch')} #{$final_exe}" +end + +task :default => [:replace_exe, :clean] diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/otnetstring.rb b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/otnetstring.rb new file mode 100644 index 0000000..cd8de4c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/otnetstring.rb @@ -0,0 +1,85 @@ +# Copyright (c) 2011 Konstantin Haase +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +require 'stringio' + +module OTNetstring + class Error < StandardError; end + + class << self + def parse(io, encoding = 'internal', fallback_encoding = nil) + fallback_encoding = io.encoding if io.respond_to? :encoding + io = StringIO.new(io) if io.respond_to? :to_str + length, byte = "", nil + + while byte.nil? || byte =~ /\d/ + length << byte if byte + byte = io.read(1) + end + + if length.size > 9 + raise Error, "#{length} is longer than 9 digits" + elsif length !~ /\d+/ + raise Error, "Expected '#{byte}' to be a digit" + end + length = Integer(length) + + case byte + when '#' then Integer io.read(length) + when ',' then with_encoding io.read(length), encoding, fallback_encoding + when '~' then + raise Error, "nil has length of 0, #{length} given" unless length == 0 + when '!' then io.read(length) == 'true' + when '[', '{' + array = [] + start = io.pos + array << parse(io, encoding, fallback_encoding) while io.pos - start < length + raise Error, 'Nested element longer than container' if io.pos - start != length + byte == "{" ? Hash[*array] : array + else + raise Error, "Unknown type '#{byte}'" + end + end + + def encode(obj, string_sep = ',') + case obj + when String then with_encoding "#{obj.bytesize}#{string_sep}#{obj}", "binary" + when Integer then encode(obj.inspect, '#') + when NilClass then "0~" + when Array then encode(obj.map { |e| encode(e) }.join, '[') + when Hash then encode(obj.map { |a,b| encode(a)+encode(b) }.join, '{') + when FalseClass, TrueClass then encode(obj.inspect, '!') + else raise Error, 'cannot encode %p' % obj + end + end + + private + + def with_encoding(str, encoding, fallback = nil) + return str unless str.respond_to? :encode + encoding = Encoding.find encoding if encoding.respond_to? :to_str + encoding ||= fallback + encoding ? str.encode(encoding) : str + rescue EncodingError + str.force_encoding(encoding) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent.rb b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent.rb new file mode 100644 index 0000000..1ff68a3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent.rb @@ -0,0 +1,3 @@ +# -*- encoding: utf-8 -*- +require 'rb-fsevent/fsevent' +require 'rb-fsevent/version' diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/fsevent.rb b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/fsevent.rb new file mode 100644 index 0000000..808609d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/fsevent.rb @@ -0,0 +1,157 @@ +# -*- encoding: utf-8 -*- + +require 'otnetstring' + +class FSEvent + class << self + class_eval <<-END + def root_path + "#{File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))}" + end + END + class_eval <<-END + def watcher_path + "#{File.join(FSEvent.root_path, 'bin', 'fsevent_watch')}" + end + END + end + + attr_reader :paths, :callback + + def initialize args = nil, &block + watch(args, &block) unless args.nil? + end + + def watch(watch_paths, options=nil, &block) + @paths = watch_paths.kind_of?(Array) ? watch_paths : [watch_paths] + @callback = block + + if options.kind_of?(Hash) + @options = parse_options(options) + elsif options.kind_of?(Array) + @options = options + else + @options = [] + end + end + + def run + @pipe = open_pipe + @running = true + + # please note the use of IO::select() here, as it is used specifically to + # preserve correct signal handling behavior in ruby 1.8. + while @running && IO::select([@pipe], nil, nil, nil) + # managing the IO ourselves allows us to be careful and never pass an + # incomplete message to OTNetstring.parse() + message = "" + length = "" + byte = nil + + reading_length = true + found_length = false + + while reading_length + byte = @pipe.read(1) + if "#{byte}" =~ /\d/ + length << byte + found_length = true + elsif found_length == false + next + else + reading_length = false + end + end + length = Integer(length, 10) + type = byte + + message << "#{length}#{type}" + message << @pipe.read(length) + + decoded = OTNetstring.parse(message) + modified_paths = decoded["events"].map {|event| event["path"]} + # passing the full info as a second block param feels icky, but such is + # the trap of backward compatibility. + case callback.arity + when 1 + callback.call(modified_paths) + when 2 + callback.call(modified_paths, decoded) + end + end + rescue Interrupt, IOError, Errno::EBADF + ensure + stop + end + + def stop + unless @pipe.nil? + Process.kill('KILL', @pipe.pid) if process_running?(@pipe.pid) + @pipe.close + end + rescue IOError + ensure + @running = false + end + + def process_running?(pid) + begin + Process.kill(0, pid) + true + rescue Errno::ESRCH + false + end + end + + if RUBY_VERSION < '1.9' + def open_pipe + IO.popen("'#{self.class.watcher_path}' #{options_string} #{shellescaped_paths}") + end + + private + + def options_string + @options.join(' ') + end + + def shellescaped_paths + @paths.map {|path| shellescape(path)}.join(' ') + end + + # for Ruby 1.8.6 support + def shellescape(str) + # An empty argument will be skipped, so return empty quotes. + return "''" if str.empty? + + str = str.dup + + # Process as a single byte sequence because not all shell + # implementations are multibyte aware. + str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/n, "\\\\\\1") + + # A LF cannot be escaped with a backslash because a backslash + LF + # combo is regarded as line continuation and simply ignored. + str.gsub!(/\n/, "'\n'") + + return str + end + else + def open_pipe + IO.popen([self.class.watcher_path] + @options + @paths) + end + end + + private + + def parse_options(options={}) + opts = ['--format=otnetstring'] + opts.concat(['--since-when', options[:since_when]]) if options[:since_when] + opts.concat(['--latency', options[:latency]]) if options[:latency] + opts.push('--no-defer') if options[:no_defer] + opts.push('--watch-root') if options[:watch_root] + opts.push('--file-events') if options[:file_events] + # ruby 1.9's IO.popen(array-of-stuff) syntax requires all items to be strings + opts.map {|opt| "#{opt}"} + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/version.rb b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/version.rb new file mode 100644 index 0000000..57300ce --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/version.rb @@ -0,0 +1,5 @@ +# -*- encoding: utf-8 -*- + +class FSEvent + VERSION = '0.10.2' +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/rb-fsevent.gemspec b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/rb-fsevent.gemspec new file mode 100644 index 0000000..a7370db --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.2/rb-fsevent.gemspec @@ -0,0 +1,27 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'rb-fsevent/version' + +Gem::Specification.new do |s| + s.name = 'rb-fsevent' + s.version = FSEvent::VERSION + s.authors = ['Thibaud Guillaume-Gentil', 'Travis Tilley'] + s.email = ['thibaud@thibaud.gg', 'ttilley@gmail.com'] + s.homepage = 'http://rubygems.org/gems/rb-fsevent' + s.summary = 'Very simple & usable FSEvents API' + s.description = 'FSEvents API with Signals catching (without RubyCocoa)' + s.license = 'MIT' + + s.metadata = { + 'source_code_uri' => 'https://github.com/thibaudgg/rb-fsevent' + } + + s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^spec/}) } + s.require_path = 'lib' + + s.add_development_dependency 'bundler', '~> 1.0' + s.add_development_dependency 'rspec', '~> 3.6' + s.add_development_dependency 'guard-rspec', '~> 4.2' + s.add_development_dependency 'rake', '~> 12.0' +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.gitignore b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.gitignore new file mode 100644 index 0000000..db868c7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.gitignore @@ -0,0 +1,19 @@ +*.gem +*.rbc +.bundle +.config +.yardoc +Gemfile.lock +InstalledFiles +_yardoc +coverage +doc/ +lib/bundler/man +pkg +rdoc +spec/reports +test/tmp +test/version_tmp +tmp +.tags* +.rspec_status \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.travis.yml b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.travis.yml new file mode 100644 index 0000000..014f847 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.travis.yml @@ -0,0 +1,30 @@ +language: ruby +sudo: false +dist: trusty +cache: bundler +rvm: + - 1.8 + - 1.9 + - 2.0 + - 2.1 + - 2.2 + - 2.3 + - 2.4 + - jruby-head + - ruby-head + - jruby-9.1.8.0 + - jruby-head + - rbx-3 +matrix: + allow_failures: + - rvm: ruby-head + - rvm: jruby-head + - rvm: rbx-3 + fast_finish: true +script: + # Unit test + - bundle exec rake + # Install test + - gem build rb-inotify.gemspec + - gem install rb-inotify-*.gem + - sh -c "gem list | grep rb-inotify" diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.yardopts b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.yardopts new file mode 100644 index 0000000..cd347c5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.yardopts @@ -0,0 +1,4 @@ +--readme README.md +--markup markdown +--markup-provider maruku +--no-private diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Gemfile b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Gemfile new file mode 100644 index 0000000..fa75df1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Gemfile @@ -0,0 +1,3 @@ +source 'https://rubygems.org' + +gemspec diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/README.md b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/README.md new file mode 100644 index 0000000..5c38acb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/README.md @@ -0,0 +1,103 @@ +# rb-inotify + +This is a simple wrapper over the [inotify](http://en.wikipedia.org/wiki/Inotify) Linux kernel subsystem +for monitoring changes to files and directories. +It uses the [FFI](http://wiki.github.com/ffi/ffi) gem to avoid having to compile a C extension. + +[API documentation is available on rdoc.info](http://rdoc.info/projects/nex3/rb-inotify). + +[![Build Status](https://secure.travis-ci.org/guard/rb-inotify.svg)](http://travis-ci.org/guard/rb-inotify) +[![Code Climate](https://codeclimate.com/github/guard/rb-inotify.svg)](https://codeclimate.com/github/guard/rb-inotify) +[![Coverage Status](https://coveralls.io/repos/guard/rb-inotify/badge.svg)](https://coveralls.io/r/guard/rb-inotify) + +## Basic Usage + +The API is similar to the inotify C API, but with a more Rubyish feel. +First, create a notifier: + + notifier = INotify::Notifier.new + +Then, tell it to watch the paths you're interested in +for the events you care about: + + notifier.watch("path/to/foo.txt", :modify) {puts "foo.txt was modified!"} + notifier.watch("path/to/bar", :moved_to, :create) do |event| + puts "#{event.name} is now in path/to/bar!" + end + +Inotify can watch directories or individual files. +It can pay attention to all sorts of events; +for a full list, see [the inotify man page](http://www.tin.org/bin/man.cgi?section=7&topic=inotify). + +Finally, you get at the events themselves: + + notifier.run + +This will loop infinitely, calling the appropriate callbacks when the files are changed. +If you don't want infinite looping, +you can also block until there are available events, +process them all at once, +and then continue on your merry way: + + notifier.process + +## Advanced Usage + +Sometimes it's necessary to have finer control over the underlying IO operations +than is provided by the simple callback API. +The trick to this is that the \{INotify::Notifier#to_io Notifier#to_io} method +returns a fully-functional IO object, +with a file descriptor and everything. +This means, for example, that it can be passed to `IO#select`: + + # Wait 10 seconds for an event then give up + if IO.select([notifier.to_io], [], [], 10) + notifier.process + end + +It can even be used with EventMachine: + + require 'eventmachine' + + EM.run do + EM.watch notifier.to_io do + notifier.process + end + end + +Unfortunately, this currently doesn't work under JRuby. +JRuby currently doesn't use native file descriptors for the IO object, +so we can't use the notifier's file descriptor as a stand-in. + +## Contributing + +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new Pull Request + +## License + +Released under the MIT license. + +Copyright, 2009, by Nathan Weizenbaum. +Copyright, 2017, by [Samuel G. D. Williams](http://www.codeotaku.com/samuel-williams). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Rakefile b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Rakefile new file mode 100644 index 0000000..bc3a3b6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Rakefile @@ -0,0 +1,14 @@ +require "bundler/gem_tasks" +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new(:spec) + +desc "Run tests" +task :default => :spec + +task :console do + require 'rb-inotify' + require 'pry' + + binding.pry +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify.rb b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify.rb new file mode 100644 index 0000000..8897aef --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify.rb @@ -0,0 +1,15 @@ +require 'rb-inotify/version' +require 'rb-inotify/native' +require 'rb-inotify/native/flags' +require 'rb-inotify/notifier' +require 'rb-inotify/watcher' +require 'rb-inotify/event' +require 'rb-inotify/errors' + +# The root module of the library, which is laid out as so: +# +# * {Notifier} -- The main class, where the notifications are set up +# * {Watcher} -- A watcher for a single file or directory +# * {Event} -- An filesystem event notification +module INotify +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/errors.rb b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/errors.rb new file mode 100644 index 0000000..afee709 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/errors.rb @@ -0,0 +1,3 @@ +module INotify + class QueueOverflowError < RuntimeError; end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/event.rb b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/event.rb new file mode 100644 index 0000000..11701ac --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/event.rb @@ -0,0 +1,146 @@ +module INotify + # An event caused by a change on the filesystem. + # Each {Watcher} can fire many events, + # which are passed to that watcher's callback. + class Event + # A list of other events that are related to this one. + # Currently, this is only used for files that are moved within the same directory: + # the `:moved_from` and the `:moved_to` events will be related. + # + # @return [Array] + attr_reader :related + + # The name of the file that the event occurred on. + # This is only set for events that occur on files in directories; + # otherwise, it's `""`. + # Similarly, if the event is being fired for the directory itself + # the name will be `""` + # + # This pathname is relative to the enclosing directory. + # For the absolute pathname, use \{#absolute\_name}. + # Note that when the `:recursive` flag is passed to {Notifier#watch}, + # events in nested subdirectories will still have a `#name` field + # relative to their immediately enclosing directory. + # For example, an event on the file `"foo/bar/baz"` + # will have name `"baz"`. + # + # @return [String] + attr_reader :name + + # The {Notifier} that fired this event. + # + # @return [Notifier] + attr_reader :notifier + + # An integer specifying that this event is related to some other event, + # which will have the same cookie. + # + # Currently, this is only used for files that are moved within the same directory. + # Both the `:moved_from` and the `:moved_to` events will have the same cookie. + # + # @private + # @return [Fixnum] + attr_reader :cookie + + # The {Watcher#id id} of the {Watcher} that fired this event. + # + # @private + # @return [Fixnum] + attr_reader :watcher_id + + # Returns the {Watcher} that fired this event. + # + # @return [Watcher] + def watcher + @watcher ||= @notifier.watchers[@watcher_id] + end + + # The absolute path of the file that the event occurred on. + # + # This is actually only as absolute as the path passed to the {Watcher} + # that created this event. + # However, it is relative to the working directory, + # assuming that hasn't changed since the watcher started. + # + # @return [String] + def absolute_name + return watcher.path if name.empty? + return File.join(watcher.path, name) + end + + # Returns the flags that describe this event. + # This is generally similar to the input to {Notifier#watch}, + # except that it won't contain options flags nor `:all_events`, + # and it may contain one or more of the following flags: + # + # `:unmount` + # : The filesystem containing the watched file or directory was unmounted. + # + # `:ignored` + # : The \{#watcher watcher} was closed, or the watched file or directory was deleted. + # + # `:isdir` + # : The subject of this event is a directory. + # + # @return [Array] + def flags + @flags ||= Native::Flags.from_mask(@native[:mask]) + end + + # Constructs an {Event} object from a string of binary data, + # and destructively modifies the string to get rid of the initial segment + # used to construct the Event. + # + # @private + # @param data [String] The string to be modified + # @param notifier [Notifier] The {Notifier} that fired the event + # @return [Event, nil] The event, or `nil` if the string is empty + def self.consume(data, notifier) + return nil if data.empty? + ev = new(data, notifier) + data.replace data[ev.size..-1] + ev + end + + # Creates an event from a string of binary data. + # Differs from {Event.consume} in that it doesn't modify the string. + # + # @private + # @param data [String] The data string + # @param notifier [Notifier] The {Notifier} that fired the event + def initialize(data, notifier) + ptr = FFI::MemoryPointer.from_string(data) + @native = Native::Event.new(ptr) + @related = [] + @cookie = @native[:cookie] + @name = fix_encoding(data[@native.size, @native[:len]].gsub(/\0+$/, '')) + @notifier = notifier + @watcher_id = @native[:wd] + + raise QueueOverflowError.new("inotify event queue has overflowed.") if @native[:mask] & Native::Flags::IN_Q_OVERFLOW != 0 + end + + # Calls the callback of the watcher that fired this event, + # passing in the event itself. + # + # @private + def callback! + watcher && watcher.callback!(self) + end + + # Returns the size of this event object in bytes, + # including the \{#name} string. + # + # @return [Fixnum] + def size + @native.size + @native[:len] + end + + private + + def fix_encoding(name) + name.force_encoding('filesystem') if name.respond_to?(:force_encoding) + name + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native.rb b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native.rb new file mode 100644 index 0000000..ee51f7c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native.rb @@ -0,0 +1,36 @@ +require 'ffi' + +module INotify + # This module contains the low-level foreign-function interface code + # for dealing with the inotify C APIs. + # It's an implementation detail, and not meant for users to deal with. + # + # @private + module Native + extend FFI::Library + ffi_lib FFI::Library::LIBC + begin + ffi_lib 'inotify' + rescue LoadError + end + + # The C struct describing an inotify event. + # + # @private + class Event < FFI::Struct + layout( + :wd, :int, + :mask, :uint32, + :cookie, :uint32, + :len, :uint32) + end + + attach_function :inotify_init, [], :int + attach_function :inotify_add_watch, [:int, :string, :uint32], :int + attach_function :inotify_rm_watch, [:int, :uint32], :int + attach_function :fpathconf, [:int, :int], :long + + attach_function :read, [:int, :pointer, :size_t], :ssize_t + attach_function :close, [:int], :int + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native/flags.rb b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native/flags.rb new file mode 100644 index 0000000..5640130 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native/flags.rb @@ -0,0 +1,94 @@ +module INotify + module Native + # A module containing all the inotify flags + # to be passed to {Notifier#watch}. + # + # @private + module Flags + # File was accessed. + IN_ACCESS = 0x00000001 + # Metadata changed. + IN_ATTRIB = 0x00000004 + # Writtable file was closed. + IN_CLOSE_WRITE = 0x00000008 + # File was modified. + IN_MODIFY = 0x00000002 + # Unwrittable file closed. + IN_CLOSE_NOWRITE = 0x00000010 + # File was opened. + IN_OPEN = 0x00000020 + # File was moved from X. + IN_MOVED_FROM = 0x00000040 + # File was moved to Y. + IN_MOVED_TO = 0x00000080 + # Subfile was created. + IN_CREATE = 0x00000100 + # Subfile was deleted. + IN_DELETE = 0x00000200 + # Self was deleted. + IN_DELETE_SELF = 0x00000400 + # Self was moved. + IN_MOVE_SELF = 0x00000800 + + ## Helper events. + + # Close. + IN_CLOSE = (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) + # Moves. + IN_MOVE = (IN_MOVED_FROM | IN_MOVED_TO) + # All events which a program can wait on. + IN_ALL_EVENTS = (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | + IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | IN_MOVED_TO | IN_CREATE | + IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF) + + + ## Special flags. + + # Only watch the path if it is a directory. + IN_ONLYDIR = 0x01000000 + # Do not follow a sym link. + IN_DONT_FOLLOW = 0x02000000 + # Add to the mask of an already existing watch. + IN_MASK_ADD = 0x20000000 + # Only send event once. + IN_ONESHOT = 0x80000000 + + + ## Events sent by the kernel. + + # Backing fs was unmounted. + IN_UNMOUNT = 0x00002000 + # Event queued overflowed. + IN_Q_OVERFLOW = 0x00004000 + # File was ignored. + IN_IGNORED = 0x00008000 + # Event occurred against dir. + IN_ISDIR = 0x40000000 + + ## fpathconf Macros + + # returns the maximum length of a filename in the directory path or fd that the process is allowed to create. The corresponding macro is _POSIX_NAME_MAX. + PC_NAME_MAX = 3 + + # Converts a list of flags to the bitmask that the C API expects. + # + # @param flags [Array] + # @return [Fixnum] + def self.to_mask(flags) + flags.map {|flag| const_get("IN_#{flag.to_s.upcase}")}. + inject(0) {|mask, flag| mask | flag} + end + + # Converts a bitmask from the C API into a list of flags. + # + # @param mask [Fixnum] + # @return [Array] + def self.from_mask(mask) + constants.map {|c| c.to_s}.select do |c| + next false unless c =~ /^IN_/ + const_get(c) & mask != 0 + end.map {|c| c.sub("IN_", "").downcase.to_sym} - [:all_events] + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/notifier.rb b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/notifier.rb new file mode 100644 index 0000000..043bc20 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/notifier.rb @@ -0,0 +1,339 @@ +module INotify + # Notifier wraps a single instance of inotify. + # It's possible to have more than one instance, + # but usually unnecessary. + # + # @example + # # Create the notifier + # notifier = INotify::Notifier.new + # + # # Run this callback whenever the file path/to/foo.txt is read + # notifier.watch("path/to/foo.txt", :access) do + # puts "Foo.txt was accessed!" + # end + # + # # Watch for any file in the directory being deleted + # # or moved out of the directory. + # notifier.watch("path/to/directory", :delete, :moved_from) do |event| + # # The #name field of the event object contains the name of the affected file + # puts "#{event.name} is no longer in the directory!" + # end + # + # # Nothing happens until you run the notifier! + # notifier.run + class Notifier + # A list of directories that should never be recursively watched. + # + # * Files in `/dev/fd` sometimes register as directories, but are not enumerable. + RECURSIVE_BLACKLIST = %w[/dev/fd] + + # A hash from {Watcher} ids to the instances themselves. + # + # @private + # @return [{Fixnum => Watcher}] + attr_reader :watchers + + # The underlying file descriptor for this notifier. + # This is a valid OS file descriptor, and can be used as such + # (except under JRuby -- see \{#to\_io}). + # + # @return [Fixnum] + attr_reader :fd + + # @return [Boolean] Whether or not this Ruby implementation supports + # wrapping the native file descriptor in a Ruby IO wrapper. + def self.supports_ruby_io? + RUBY_PLATFORM !~ /java/ + end + + # Creates a new {Notifier}. + # + # @return [Notifier] + # @raise [SystemCallError] if inotify failed to initialize for some reason + def initialize + @fd = Native.inotify_init + @watchers = {} + return unless @fd < 0 + + raise SystemCallError.new( + "Failed to initialize inotify" + + case FFI.errno + when Errno::EMFILE::Errno; ": the user limit on the total number of inotify instances has been reached." + when Errno::ENFILE::Errno; ": the system limit on the total number of file descriptors has been reached." + when Errno::ENOMEM::Errno; ": insufficient kernel memory is available." + else; "" + end, + FFI.errno) + end + + # Returns a Ruby IO object wrapping the underlying file descriptor. + # Since this file descriptor is fully functional (except under JRuby), + # this IO object can be used in any way a Ruby-created IO object can. + # This includes passing it to functions like `#select`. + # + # Note that this always returns the same IO object. + # Creating lots of IO objects for the same file descriptor + # can cause some odd problems. + # + # **This is not supported under JRuby**. + # JRuby currently doesn't use native file descriptors for the IO object, + # so we can't use this file descriptor as a stand-in. + # + # @return [IO] An IO object wrapping the file descriptor + # @raise [NotImplementedError] if this is being called in JRuby + def to_io + unless self.class.supports_ruby_io? + raise NotImplementedError.new("INotify::Notifier#to_io is not supported under JRuby") + end + @io ||= IO.new(@fd) + end + + # Watches a file or directory for changes, + # calling the callback when there are. + # This is only activated once \{#process} or \{#run} is called. + # + # **Note that by default, this does not recursively watch subdirectories + # of the watched directory**. + # To do so, use the `:recursive` flag. + # + # ## Flags + # + # `:access` + # : A file is accessed (that is, read). + # + # `:attrib` + # : A file's metadata is changed (e.g. permissions, timestamps, etc). + # + # `:close_write` + # : A file that was opened for writing is closed. + # + # `:close_nowrite` + # : A file that was not opened for writing is closed. + # + # `:modify` + # : A file is modified. + # + # `:open` + # : A file is opened. + # + # ### Directory-Specific Flags + # + # These flags only apply when a directory is being watched. + # + # `:moved_from` + # : A file is moved out of the watched directory. + # + # `:moved_to` + # : A file is moved into the watched directory. + # + # `:create` + # : A file is created in the watched directory. + # + # `:delete` + # : A file is deleted in the watched directory. + # + # `:delete_self` + # : The watched file or directory itself is deleted. + # + # `:move_self` + # : The watched file or directory itself is moved. + # + # ### Helper Flags + # + # These flags are just combinations of the flags above. + # + # `:close` + # : Either `:close_write` or `:close_nowrite` is activated. + # + # `:move` + # : Either `:moved_from` or `:moved_to` is activated. + # + # `:all_events` + # : Any event above is activated. + # + # ### Options Flags + # + # These flags don't actually specify events. + # Instead, they specify options for the watcher. + # + # `:onlydir` + # : Only watch the path if it's a directory. + # + # `:dont_follow` + # : Don't follow symlinks. + # + # `:mask_add` + # : Add these flags to the pre-existing flags for this path. + # + # `:oneshot` + # : Only send the event once, then shut down the watcher. + # + # `:recursive` + # : Recursively watch any subdirectories that are created. + # Note that this is a feature of rb-inotify, + # rather than of inotify itself, which can only watch one level of a directory. + # This means that the {Event#name} field + # will contain only the basename of the modified file. + # When using `:recursive`, {Event#absolute_name} should always be used. + # + # @param path [String] The path to the file or directory + # @param flags [Array] Which events to watch for + # @yield [event] A block that will be called + # whenever one of the specified events occur + # @yieldparam event [Event] The Event object containing information + # about the event that occured + # @return [Watcher] A Watcher set up to watch this path for these events + # @raise [SystemCallError] if the file or directory can't be watched, + # e.g. if the file isn't found, read access is denied, + # or the flags don't contain any events + def watch(path, *flags, &callback) + return Watcher.new(self, path, *flags, &callback) unless flags.include?(:recursive) + + dir = Dir.new(path) + + dir.each do |base| + d = File.join(path, base) + binary_d = d.respond_to?(:force_encoding) ? d.dup.force_encoding('BINARY') : d + next if binary_d =~ /\/\.\.?$/ # Current or parent directory + next if RECURSIVE_BLACKLIST.include?(d) + next if flags.include?(:dont_follow) && File.symlink?(d) + next if !File.directory?(d) + + watch(d, *flags, &callback) + end + + dir.close + + rec_flags = [:create, :moved_to] + return watch(path, *((flags - [:recursive]) | rec_flags)) do |event| + callback.call(event) if flags.include?(:all_events) || !(flags & event.flags).empty? + next if (rec_flags & event.flags).empty? || !event.flags.include?(:isdir) + begin + watch(event.absolute_name, *flags, &callback) + rescue Errno::ENOENT + # If the file has been deleted since the glob was run, we don't want to error out. + end + end + end + + # Starts the notifier watching for filesystem events. + # Blocks until \{#stop} is called. + # + # @see #process + def run + @stop = false + process until @stop + end + + # Stop watching for filesystem events. + # That is, if we're in a \{#run} loop, + # exit out as soon as we finish handling the events. + def stop + @stop = true + end + + # Blocks until there are one or more filesystem events + # that this notifier has watchers registered for. + # Once there are events, the appropriate callbacks are called + # and this function returns. + # + # @see #run + def process + read_events.each do |event| + event.callback! + event.flags.include?(:ignored) && event.notifier.watchers.delete(event.watcher_id) + end + end + + # Close the notifier. + # + # @raise [SystemCallError] if closing the underlying file descriptor fails. + def close + stop + if Native.close(@fd) == 0 + @watchers.clear + return + end + + raise SystemCallError.new("Failed to properly close inotify socket" + + case FFI.errno + when Errno::EBADF::Errno; ": invalid or closed file descriptior" + when Errno::EIO::Errno; ": an I/O error occured" + end, + FFI.errno) + end + + # Blocks until there are one or more filesystem events that this notifier + # has watchers registered for. Once there are events, returns their {Event} + # objects. + # + # This can return an empty list if the watcher was closed elsewhere. + # + # {#run} or {#process} are ususally preferable to calling this directly. + def read_events + size = Native::Event.size + Native.fpathconf(fd, Native::Flags::PC_NAME_MAX) + 1 + tries = 1 + + begin + data = readpartial(size) + rescue SystemCallError => er + # EINVAL means that there's more data to be read + # than will fit in the buffer size + raise er unless er.errno == Errno::EINVAL::Errno && tries < 5 + size *= 2 + tries += 1 + retry + end + return [] if data.nil? + + events = [] + cookies = {} + while event = Event.consume(data, self) + events << event + next if event.cookie == 0 + cookies[event.cookie] ||= [] + cookies[event.cookie] << event + end + cookies.each {|c, evs| evs.each {|ev| ev.related.replace(evs - [ev]).freeze}} + events + end + + private + + # Same as IO#readpartial, or as close as we need. + def readpartial(size) + # Use Ruby's readpartial if possible, to avoid blocking other threads. + begin + return to_io.readpartial(size) if self.class.supports_ruby_io? + rescue Errno::EBADF, IOError + # If the IO has already been closed, reading from it will cause + # Errno::EBADF. In JRuby it can raise IOError with invalid or + # closed file descriptor. + return nil + rescue IOError => ex + return nil if ex.message =~ /stream closed/ + raise + end + + tries = 0 + begin + tries += 1 + buffer = FFI::MemoryPointer.new(:char, size) + size_read = Native.read(fd, buffer, size) + return buffer.read_string(size_read) if size_read >= 0 + end while FFI.errno == Errno::EINTR::Errno && tries <= 5 + + raise SystemCallError.new("Error reading inotify events" + + case FFI.errno + when Errno::EAGAIN::Errno; ": no data available for non-blocking I/O" + when Errno::EBADF::Errno; ": invalid or closed file descriptor" + when Errno::EFAULT::Errno; ": invalid buffer" + when Errno::EINVAL::Errno; ": invalid file descriptor" + when Errno::EIO::Errno; ": I/O error" + when Errno::EISDIR::Errno; ": file descriptor is a directory" + else; "" + end, + FFI.errno) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/version.rb b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/version.rb new file mode 100644 index 0000000..661eb1c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/version.rb @@ -0,0 +1,24 @@ +# Copyright, 2012, by Natalie Weizenbaum. +# Copyright, 2017, by Samuel G. D. Williams. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +module INotify + VERSION = '0.9.10' +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/watcher.rb b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/watcher.rb new file mode 100644 index 0000000..1205e2d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/watcher.rb @@ -0,0 +1,88 @@ +module INotify + # Watchers monitor a single path for changes, + # specified by {INotify::Notifier#watch event flags}. + # A watcher is usually created via \{Notifier#watch}. + # + # One {Notifier} may have many {Watcher}s. + # The Notifier actually takes care of the checking for events, + # via \{Notifier#run #run} or \{Notifier#process #process}. + # The main purpose of having Watcher objects + # is to be able to disable them using \{#close}. + class Watcher + # The {Notifier} that this Watcher belongs to. + # + # @return [Notifier] + attr_reader :notifier + + # The path that this Watcher is watching. + # + # @return [String] + attr_reader :path + + # The {INotify::Notifier#watch flags} + # specifying the events that this Watcher is watching for, + # and potentially some options as well. + # + # @return [Array] + attr_reader :flags + + # The id for this Watcher. + # Used to retrieve this Watcher from {Notifier#watchers}. + # + # @private + # @return [Fixnum] + attr_reader :id + + # Calls this Watcher's callback with the given {Event}. + # + # @private + # @param event [Event] + def callback!(event) + @callback[event] + end + + # Disables this Watcher, so that it doesn't fire any more events. + # + # @raise [SystemCallError] if the watch fails to be disabled for some reason + def close + if Native.inotify_rm_watch(@notifier.fd, @id) == 0 + @notifier.watchers.delete(@id) + return + end + + raise SystemCallError.new("Failed to stop watching #{path.inspect}", + FFI.errno) + end + + # Creates a new {Watcher}. + # + # @private + # @see Notifier#watch + def initialize(notifier, path, *flags, &callback) + @notifier = notifier + @callback = callback || proc {} + @path = path + @flags = flags.freeze + @id = Native.inotify_add_watch(@notifier.fd, path.dup, + Native::Flags.to_mask(flags)) + + unless @id < 0 + @notifier.watchers[@id] = self + return + end + + raise SystemCallError.new( + "Failed to watch #{path.inspect}" + + case FFI.errno + when Errno::EACCES::Errno; ": read access to the given file is not permitted." + when Errno::EBADF::Errno; ": the given file descriptor is not valid." + when Errno::EFAULT::Errno; ": path points outside of the process's accessible address space." + when Errno::EINVAL::Errno; ": the given event mask contains no legal events; or fd is not an inotify file descriptor." + when Errno::ENOMEM::Errno; ": insufficient kernel memory was available." + when Errno::ENOSPC::Errno; ": The user limit on the total number of inotify watches was reached or the kernel failed to allocate a needed resource." + else; "" + end, + FFI.errno) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/rb-inotify.gemspec b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/rb-inotify.gemspec new file mode 100644 index 0000000..1dbc777 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/rb-inotify.gemspec @@ -0,0 +1,30 @@ +# -*- encoding: utf-8 -*- + +$LOAD_PATH.unshift File.expand_path('../lib', __FILE__) +require 'rb-inotify/version' + +Gem::Specification.new do |spec| + spec.name = 'rb-inotify' + spec.version = INotify::VERSION + spec.platform = Gem::Platform::RUBY + + spec.summary = 'A Ruby wrapper for Linux inotify, using FFI' + spec.authors = ['Natalie Weizenbaum', 'Samuel Williams'] + spec.email = ['nex342@gmail.com', 'samuel.williams@oriontransfer.co.nz'] + spec.homepage = 'https://github.com/guard/rb-inotify' + spec.licenses = ['MIT'] + + spec.files = `git ls-files`.split($/) + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ["lib"] + + spec.required_ruby_version = '>= 0' + + spec.add_dependency 'ffi', '>= 0.5.0', '< 2' + + spec.add_development_dependency "rspec", "~> 3.4" + spec.add_development_dependency "bundler", "~> 1.3" + # rake 11.x requires Ruby >= 1.9.3 + spec.add_development_dependency "rake", ">= 10.5.0", "< 13" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify/errors_spec.rb b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify/errors_spec.rb new file mode 100644 index 0000000..f2f5e3e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify/errors_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe INotify do + describe "QueueOverflowError" do + it "exists" do + expect(INotify::QueueOverflowError).to be_truthy + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify_spec.rb b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify_spec.rb new file mode 100644 index 0000000..b73ea30 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe INotify do + describe "version" do + it "exists" do + expect(INotify::VERSION).to be_truthy + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/spec_helper.rb b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/spec_helper.rb new file mode 100644 index 0000000..7dceb7b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/spec_helper.rb @@ -0,0 +1,12 @@ + +require "bundler/setup" +require "rb-inotify" + +RSpec.configure do |config| + # Enable flags like --only-failures and --next-failure + config.example_status_persistence_file_path = ".rspec_status" + + config.expect_with :rspec do |c| + c.syntax = :expect + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/Gemfile b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/Gemfile new file mode 100644 index 0000000..bead207 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/Gemfile @@ -0,0 +1,26 @@ +source 'http://rubygems.org' + +gemspec + +gem 'bundler', '~> 1.15' +gem 'rake' + +gem 'minitest', '>= 5.0' +gem 'minitest-power_assert' + +gem 'rubocop', '~> 0.49.1' + +# don't try to install redcarpet under jruby +gem 'redcarpet', :platforms => :ruby + +group :development do + gem 'pry' + + # docs + gem 'yard' + gem 'github-markup' + + # for visual tests + gem 'sinatra' + gem 'shotgun' +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/LICENSE b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/LICENSE new file mode 100644 index 0000000..660592c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/LICENSE @@ -0,0 +1,186 @@ +# MIT license. See http://www.opensource.org/licenses/mit-license.php + +Copyright (c) 2012 Jeanine Adkisson. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +# SPECIAL NOTE: +Many of the lexers in this project are adaptations of those in Pygments +(pygments.org). The license for Pygments is as follows: + +# BEGIN pygments/LICENSE # + +Copyright (c) 2006-2012 by the respective authors (see AUTHORS file). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* 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. + +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. + +# END pygments/LICENSE # + +The contents of the AUTHORS file at the time of porting was: + +# BEGIN pygments/AUTHORS # + +Pygments is written and maintained by Georg Brandl . + +Major developers are Tim Hatch and Armin Ronacher +. + +Other contributors, listed alphabetically, are: + +* Sam Aaron -- Ioke lexer +* Kumar Appaiah -- Debian control lexer +* Ali Afshar -- image formatter +* Andreas Amann -- AppleScript lexer +* Jeffrey Arnold -- R/S lexer, BUGS lexers +* Jeremy Ashkenas -- CoffeeScript lexer +* Stefan Matthias Aust -- Smalltalk lexer +* Ben Bangert -- Mako lexers +* Max Battcher -- Darcs patch lexer +* Paul Baumgart, 280 North, Inc. -- Objective-J lexer +* Michael Bayer -- Myghty lexers +* John Benediktsson -- Factor lexer +* Christopher Bertels -- Fancy lexer +* Jarrett Billingsley -- MiniD lexer +* Adam Blinkinsop -- Haskell, Redcode lexers +* Frits van Bommel -- assembler lexers +* Pierre Bourdon -- bugfixes +* Hiram Chirino -- Scaml and Jade lexers +* Leaf Corcoran -- MoonScript lexer +* Christopher Creutzig -- MuPAD lexer +* Pete Curry -- bugfixes +* Owen Durni -- haXe lexer +* Nick Efford -- Python 3 lexer +* Sven Efftinge -- Xtend lexer +* Artem Egorkine -- terminal256 formatter +* James H. Fisher -- PostScript lexer +* Carlos Galdino -- Elixir and Elixir Console lexers +* Naveen Garg -- Autohotkey lexer +* Laurent Gautier -- R/S lexer +* Alex Gaynor -- PyPy log lexer +* Bertrand Goetzmann -- Groovy lexer +* Krzysiek Goj -- Scala lexer +* Matt Good -- Genshi, Cheetah lexers +* Patrick Gotthardt -- PHP namespaces support +* Olivier Guibe -- Asymptote lexer +* Martin Harriman -- SNOBOL lexer +* Matthew Harrison -- SVG formatter +* Steven Hazel -- Tcl lexer +* Aslak Hellesøy -- Gherkin lexer +* Greg Hendershott -- Racket lexer +* Jordi Gutiérrez Hermoso -- Octave lexer +* David Hess, Fish Software, Inc. -- Objective-J lexer +* Varun Hiremath -- Debian control lexer +* Doug Hogan -- Mscgen lexer +* Ben Hollis -- Mason lexer +* Tim Howard -- BlitzMax lexer +* Ivan Inozemtsev -- Fantom lexer +* Brian R. Jackson -- Tea lexer +* Dennis Kaarsemaker -- sources.list lexer +* Igor Kalnitsky -- vhdl lexer +* Eric Knibbe -- Lasso lexer +* Adam Koprowski -- Opa lexer +* Benjamin Kowarsch -- Modula-2 lexer +* Alexander Kriegisch -- Kconfig and AspectJ lexers +* Marek Kubica -- Scheme lexer +* Jochen Kupperschmidt -- Markdown processor +* Gerd Kurzbach -- Modelica lexer +* Olov Lassus -- Dart lexer +* Sylvestre Ledru -- Scilab lexer +* Mark Lee -- Vala lexer +* Ben Mabey -- Gherkin lexer +* Simone Margaritelli -- Hybris lexer +* Kirk McDonald -- D lexer +* Gordon McGregor -- SystemVerilog lexer +* Stephen McKamey -- Duel/JBST lexer +* Brian McKenna -- F# lexer +* Lukas Meuser -- BBCode formatter, Lua lexer +* Paul Miller -- LiveScript lexer +* Hong Minhee -- HTTP lexer +* Michael Mior -- Awk lexer +* Jon Morton -- Rust lexer +* Paulo Moura -- Logtalk lexer +* Mher Movsisyan -- DTD lexer +* Ana Nelson -- Ragel, ANTLR, R console lexers +* Nam T. Nguyen -- Monokai style +* Jesper Noehr -- HTML formatter "anchorlinenos" +* Mike Nolta -- Julia lexer +* Jonas Obrist -- BBCode lexer +* David Oliva -- Rebol lexer +* Jon Parise -- Protocol buffers lexer +* Ronny Pfannschmidt -- BBCode lexer +* Benjamin Peterson -- Test suite refactoring +* Dominik Picheta -- Nimrod lexer +* Clément Prévost -- UrbiScript lexer +* Kashif Rasul -- CUDA lexer +* Justin Reidy -- MXML lexer +* Norman Richards -- JSON lexer +* Lubomir Rintel -- GoodData MAQL and CL lexers +* Andre Roberge -- Tango style +* Konrad Rudolph -- LaTeX formatter enhancements +* Mario Ruggier -- Evoque lexers +* Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers +* Matteo Sasso -- Common Lisp lexer +* Joe Schafer -- Ada lexer +* Ken Schutte -- Matlab lexers +* Tassilo Schweyer -- Io, MOOCode lexers +* Joerg Sieker -- ABAP lexer +* Robert Simmons -- Standard ML lexer +* Kirill Simonov -- YAML lexer +* Steve Spigarelli -- XQuery lexer +* Jerome St-Louis -- eC lexer +* James Strachan -- Kotlin lexer +* Tiberius Teng -- default style overhaul +* Jeremy Thurgood -- Erlang, Squid config lexers +* Erick Tryzelaar -- Felix lexer +* Daniele Varrazzo -- PostgreSQL lexers +* Abe Voelker -- OpenEdge ABL lexer +* Whitney Young -- ObjectiveC lexer +* Matthias Vallentin -- Bro lexer +* Nathan Weizenbaum -- Haml and Sass lexers +* Dietmar Winkler -- Modelica lexer +* Nils Winter -- Smalltalk lexer +* Davy Wybiral -- Clojure lexer +* Diego Zamboni -- CFengine3 lexer +* Alex Zimin -- Nemerle lexer + +Many thanks for all contributions! + +# END pygments/AUTHORS # diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/bin/rougify b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/bin/rougify new file mode 100755 index 0000000..a7d7df2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/bin/rougify @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +require 'pathname' +ROOT_DIR = Pathname.new(__FILE__).dirname.parent +load ROOT_DIR.join('lib/rouge.rb') +load ROOT_DIR.join('lib/rouge/cli.rb') +Signal.trap('PIPE', 'SYSTEM_DEFAULT') if Signal.list.include? 'PIPE' + +begin + Rouge::CLI.parse(ARGV).run +rescue Rouge::CLI::Error => e + puts e.message + exit e.status +rescue Interrupt + $stderr.puts "\nrouge: interrupted" + exit 2 +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge.rb b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge.rb new file mode 100644 index 0000000..ac049c3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge.rb @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- # + +# stdlib +require 'pathname' + +# The containing module for Rouge +module Rouge + class << self + def reload! + Object.send :remove_const, :Rouge + load __FILE__ + end + + # Highlight some text with a given lexer and formatter. + # + # @example + # Rouge.highlight('@foo = 1', 'ruby', 'html') + # Rouge.highlight('var foo = 1;', 'js', 'terminal256') + # + # # streaming - chunks become available as they are lexed + # Rouge.highlight(large_string, 'ruby', 'html') do |chunk| + # $stdout.print chunk + # end + def highlight(text, lexer, formatter, &b) + lexer = Lexer.find(lexer) unless lexer.respond_to? :lex + raise "unknown lexer #{lexer}" unless lexer + + formatter = Formatter.find(formatter) unless formatter.respond_to? :format + raise "unknown formatter #{formatter}" unless formatter + + formatter.format(lexer.lex(text), &b) + end + end +end + +load_dir = Pathname.new(__FILE__).dirname +load load_dir.join('rouge/version.rb') + +load load_dir.join('rouge/util.rb') + +load load_dir.join('rouge/text_analyzer.rb') +load load_dir.join('rouge/token.rb') + +load load_dir.join('rouge/lexer.rb') +load load_dir.join('rouge/regex_lexer.rb') +load load_dir.join('rouge/template_lexer.rb') + +lexers_dir = load_dir.join('rouge/lexers') +Dir.glob(lexers_dir.join('*.rb')).each do |f| + Rouge::Lexers.load_lexer(Pathname.new(f).relative_path_from(lexers_dir).to_s) +end + +load load_dir.join('rouge/guesser.rb') +load load_dir.join('rouge/guessers/util.rb') +load load_dir.join('rouge/guessers/glob_mapping.rb') +load load_dir.join('rouge/guessers/modeline.rb') +load load_dir.join('rouge/guessers/filename.rb') +load load_dir.join('rouge/guessers/mimetype.rb') +load load_dir.join('rouge/guessers/source.rb') +load load_dir.join('rouge/guessers/disambiguation.rb') + +load load_dir.join('rouge/formatter.rb') +load load_dir.join('rouge/formatters/html.rb') +load load_dir.join('rouge/formatters/html_table.rb') +load load_dir.join('rouge/formatters/html_pygments.rb') +load load_dir.join('rouge/formatters/html_legacy.rb') +load load_dir.join('rouge/formatters/html_linewise.rb') +load load_dir.join('rouge/formatters/html_inline.rb') +load load_dir.join('rouge/formatters/terminal256.rb') +load load_dir.join('rouge/formatters/null.rb') + +load load_dir.join('rouge/theme.rb') +load load_dir.join('rouge/themes/thankful_eyes.rb') +load load_dir.join('rouge/themes/colorful.rb') +load load_dir.join('rouge/themes/base16.rb') +load load_dir.join('rouge/themes/github.rb') +load load_dir.join('rouge/themes/igor_pro.rb') +load load_dir.join('rouge/themes/monokai.rb') +load load_dir.join('rouge/themes/molokai.rb') +load load_dir.join('rouge/themes/monokai_sublime.rb') +load load_dir.join('rouge/themes/gruvbox.rb') +load load_dir.join('rouge/themes/tulip.rb') diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/cli.rb b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/cli.rb new file mode 100644 index 0000000..a8ce3d1 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/cli.rb @@ -0,0 +1,429 @@ +# -*- coding: utf-8 -*- # + +# not required by the main lib. +# to use this module, require 'rouge/cli'. + +module Rouge + class FileReader + attr_reader :input + def initialize(input) + @input = input + end + + def file + case input + when '-' + IO.new($stdin.fileno, 'rt:bom|utf-8') + when String + File.new(input, 'rt:bom|utf-8') + when ->(i){ i.respond_to? :read } + input + end + end + + def read + @read ||= begin + file.read + rescue => e + $stderr.puts "unable to open #{input}: #{e.message}" + exit 1 + ensure + file.close + end + end + end + + class CLI + def self.doc + return enum_for(:doc) unless block_given? + + yield %|usage: rougify [command] [args...]| + yield %|| + yield %|where is one of:| + yield %| highlight #{Highlight.desc}| + yield %| help #{Help.desc}| + yield %| style #{Style.desc}| + yield %| list #{List.desc}| + yield %| guess #{Guess.desc}| + yield %| version #{Version.desc}| + yield %|| + yield %|See `rougify help ` for more info.| + end + + class Error < StandardError + attr_reader :message, :status + def initialize(message, status=1) + @message = message + @status = status + end + end + + def self.parse(argv=ARGV) + argv = normalize_syntax(argv) + + mode = argv.shift + + klass = class_from_arg(mode) + return klass.parse(argv) if klass + + case mode + when '-h', '--help', 'help', '-help', nil + Help.parse(argv) + else + argv.unshift(mode) if mode + Highlight.parse(argv) + end + end + + def initialize(options={}) + end + + def self.error!(msg, status=1) + raise Error.new(msg, status) + end + + def error!(*a) + self.class.error!(*a) + end + + def self.class_from_arg(arg) + case arg + when 'version', '--version', '-v' + Version + when 'help' + Help + when 'highlight', 'hi' + Highlight + when 'style' + Style + when 'list' + List + when 'guess' + Guess + end + end + + class Version < CLI + def self.desc + "print the rouge version number" + end + + def self.parse(*); new; end + + def run + puts Rouge.version + end + end + + class Help < CLI + def self.desc + "print help info" + end + + def self.doc + return enum_for(:doc) unless block_given? + + yield %|usage: rougify help | + yield %|| + yield %|print help info for .| + end + + def self.parse(argv) + opts = { :mode => CLI } + until argv.empty? + arg = argv.shift + klass = class_from_arg(arg) + if klass + opts[:mode] = klass + next + end + end + new(opts) + end + + def initialize(opts={}) + @mode = opts[:mode] + end + + def run + @mode.doc.each(&method(:puts)) + end + end + + class Highlight < CLI + def self.desc + "highlight code" + end + + def self.doc + return enum_for(:doc) unless block_given? + + yield %[usage: rougify highlight [options...]] + yield %[ rougify highlight [options...]] + yield %[] + yield %[--input-file|-i specify a file to read, or - to use stdin] + yield %[] + yield %[--lexer|-l specify the lexer to use.] + yield %[ If not provided, rougify will try to guess] + yield %[ based on --mimetype, the filename, and the] + yield %[ file contents.] + yield %[] + yield %[--formatter|-f specify the output formatter to use.] + yield %[ If not provided, rougify will default to] + yield %[ terminal256.] + yield %[] + yield %[--theme|-t specify the theme to use for highlighting] + yield %[ the file. (only applies to some formatters)] + yield %[] + yield %[--mimetype|-m specify a mimetype for lexer guessing] + yield %[] + yield %[--lexer-opts|-L specify lexer options in CGI format] + yield %[ (opt1=val1&opt2=val2)] + yield %[] + yield %[--formatter-opts|-F specify formatter options in CGI format] + yield %[ (opt1=val1&opt2=val2)] + yield %[] + yield %[--require|-r require a filename or library before] + yield %[ highlighting] + end + + def self.parse(argv) + opts = { + :formatter => 'terminal256', + :theme => 'thankful_eyes', + :css_class => 'codehilite', + :input_file => '-', + :lexer_opts => {}, + :formatter_opts => {}, + :requires => [], + } + + until argv.empty? + arg = argv.shift + case arg + when '-r', '--require' + opts[:requires] << argv.shift + when '--input-file', '-i' + opts[:input_file] = argv.shift + when '--mimetype', '-m' + opts[:mimetype] = argv.shift + when '--lexer', '-l' + opts[:lexer] = argv.shift + when '--formatter-preset', '-f' + opts[:formatter] = argv.shift + when '--theme', '-t' + opts[:theme] = argv.shift + when '--css-class', '-c' + opts[:css_class] = argv.shift + when '--lexer-opts', '-L' + opts[:lexer_opts] = parse_cgi(argv.shift) + when /^--/ + error! "unknown option #{arg.inspect}" + else + opts[:input_file] = arg + end + end + + new(opts) + end + + def input_stream + @input_stream ||= FileReader.new(@input_file) + end + + def input + @input ||= input_stream.read + end + + def lexer_class + @lexer_class ||= Lexer.guess( + :filename => @input_file, + :mimetype => @mimetype, + :source => input_stream, + ) + end + + def lexer + @lexer ||= lexer_class.new(@lexer_opts) + end + + attr_reader :input_file, :lexer_name, :mimetype, :formatter + + def initialize(opts={}) + Rouge::Lexer.enable_debug! + + opts[:requires].each do |r| + require r + end + + @input_file = opts[:input_file] + + if opts[:lexer] + @lexer_class = Lexer.find(opts[:lexer]) \ + or error! "unknown lexer #{opts[:lexer].inspect}" + else + @lexer_name = opts[:lexer] + @mimetype = opts[:mimetype] + end + + @lexer_opts = opts[:lexer_opts] + + theme = Theme.find(opts[:theme]).new or error! "unknown theme #{opts[:theme]}" + + @formatter = case opts[:formatter] + when 'terminal256' then Formatters::Terminal256.new(theme) + when 'html' then Formatters::HTML.new + when 'html-pygments' then Formatters::HTMLPygments.new(Formatters::HTML.new, opts[:css_class]) + when 'html-inline' then Formatters::HTMLInline.new(theme) + when 'html-table' then Formatters::HTMLTable.new(Formatters::HTML.new) + when 'null', 'raw', 'tokens' then Formatters::Null.new + else + error! "unknown formatter preset #{opts[:formatter]}" + end + end + + def run + formatter.format(lexer.lex(input), &method(:print)) + end + + private_class_method + def self.parse_cgi(str) + pairs = CGI.parse(str).map { |k, v| [k.to_sym, v.first] } + Hash[pairs] + end + end + + class Style < CLI + def self.desc + "print CSS styles" + end + + def self.doc + return enum_for(:doc) unless block_given? + + yield %|usage: rougify style [] []| + yield %|| + yield %|Print CSS styles for the given theme. Extra options are| + yield %|passed to the theme. Theme defaults to thankful_eyes.| + yield %|| + yield %|options:| + yield %| --scope (default: .highlight) a css selector to scope by| + yield %|| + yield %|available themes:| + yield %| #{Theme.registry.keys.sort.join(', ')}| + end + + def self.parse(argv) + opts = { :theme_name => 'thankful_eyes' } + + until argv.empty? + arg = argv.shift + case arg + when /--(\w+)/ + opts[$1.tr('-', '_').to_sym] = argv.shift + else + opts[:theme_name] = arg + end + end + + new(opts) + end + + def initialize(opts) + theme_name = opts.delete(:theme_name) + theme_class = Theme.find(theme_name) \ + or error! "unknown theme: #{theme_name}" + + @theme = theme_class.new(opts) + end + + def run + @theme.render(&method(:puts)) + end + end + + class List < CLI + def self.desc + "list available lexers" + end + + def self.doc + return enum_for(:doc) unless block_given? + + yield %|usage: rouge list| + yield %|| + yield %|print a list of all available lexers with their descriptions.| + end + + def self.parse(argv) + new + end + + def run + puts "== Available Lexers ==" + + Lexer.all.sort_by(&:tag).each do |lexer| + desc = "#{lexer.desc}" + if lexer.aliases.any? + desc << " [aliases: #{lexer.aliases.join(',')}]" + end + puts "%s: %s" % [lexer.tag, desc] + + lexer.option_docs.keys.sort.each do |option| + puts " ?#{option}= #{lexer.option_docs[option]}" + end + + puts + end + end + end + + class Guess < CLI + def self.desc + "guess the languages of file" + end + + def self.parse(args) + new(input_file: args.shift) + end + + attr_reader :input_file, :input_source + + def initialize(opts) + @input_file = opts[:input_file] || '-' + @input_source = FileReader.new(@input_file).read + end + + def lexers + Lexer.guesses( + filename: input_file, + source: input_source, + ) + end + + def run + lexers.each do |l| + puts "{ tag: #{l.tag.inspect}, title: #{l.title.inspect}, desc: #{l.desc.inspect} }" + end + end + end + + + private_class_method + def self.normalize_syntax(argv) + out = [] + argv.each do |arg| + case arg + when /^(--\w+)=(.*)$/ + out << $1 << $2 + when /^(-\w)(.+)$/ + out << $1 << $2 + else + out << arg + end + end + + out + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/abap b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/abap new file mode 100644 index 0000000..1f0171b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/abap @@ -0,0 +1,6 @@ +lo_obj ?= lo_obj->do_nothing( 'Char' && ` String` ). + +SELECT SINGLE * FROM mara INTO ls_mara WHERE matkl EQ '1324'. +LOOP AT lt_mara ASSIGNING . + CHECK -mtart EQ '0001'. +ENDLOOP. diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/actionscript b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/actionscript new file mode 100644 index 0000000..f081e25 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/actionscript @@ -0,0 +1,4 @@ +function hello(name:String):void +{ + trace("hello " + name); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/apache b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/apache new file mode 100644 index 0000000..ce3e5fc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/apache @@ -0,0 +1,21 @@ +AddDefaultCharset UTF-8 + +RewriteEngine On + +# Serve gzipped version if available and accepted +AddEncoding x-gzip .gz +RewriteCond %{HTTP:Accept-Encoding} gzip +RewriteCond %{REQUEST_FILENAME}.gz -f +RewriteRule ^(.*)$ $1.gz [QSA,L] + + ForceType text/css + Header append Vary Accept-Encoding + + + ForceType application/javascript + Header append Vary Accept-Encoding + + + ForceType text/html + Header append Vary Accept-Encoding + diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/apiblueprint b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/apiblueprint new file mode 100644 index 0000000..25dc577 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/apiblueprint @@ -0,0 +1,33 @@ +FORMAT: 1A +HOST: http://polls.apiblueprint.org/ + +# Polls + +Polls is a simple API allowing consumers to view polls and vote in them. + +# Polls API Root [/] + +## Group Question + +Resources related to questions in the API. + +## Question [/questions/{question_id}] + ++ Parameters + + question_id: 1 (number, required) - ID of the Question in form of an integer + ++ Attributes + + question: `Favourite programming language?` (required) + + published_at: `2014-11-11T08:40:51.620Z` - An ISO8601 date when the question was published + + choices (array[Choice], required) - An array of Choice objects + + url: /questions/1 + +### View a Questions Detail [GET] + ++ Response 200 (application/json) + + Attributes (Question) + +### Delete a Question [DELETE] + ++ Relation: delete ++ Response 204 diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/applescript b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/applescript new file mode 100644 index 0000000..c824919 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/applescript @@ -0,0 +1,2 @@ +-- AppleScript playing with iTunes +tell application "iTunes" to get current selection diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/awk b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/awk new file mode 100644 index 0000000..fb6ca72 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/awk @@ -0,0 +1,4 @@ +BEGIN { # Simulate echo(1) + for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i] + printf "\n" + exit } diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/biml b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/biml new file mode 100644 index 0000000..e4d5f68 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/biml @@ -0,0 +1,38 @@ +<#@ template language="C#" #> +<#@ import namespace="System.Data" #> + + + + + + + + + + + + + EXEC usp_StoredProc + + <# foreach (var table in RootNode.Tables) { #> + + + + SELECT * FROM <#=table.Name#> + + + + + + + <# } #> + + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/bsl b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/bsl new file mode 100644 index 0000000..a71bca2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/bsl @@ -0,0 +1,7 @@ +#ОблаÑть ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ñ‹Ð¹Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ + +Процедура ПриветМир() ЭкÑпорт + Сообщить("Привет мир"); +КонецПроцедуры + +#КонецОблаÑти \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/c b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/c new file mode 100644 index 0000000..34771c8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/c @@ -0,0 +1,8 @@ +#include "ruby/ruby.h" + +static int +clone_method_i(st_data_t key, st_data_t value, st_data_t data) +{ + clone_method((VALUE)data, (ID)key, (const rb_method_entry_t *)value); + return ST_CONTINUE; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/ceylon b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/ceylon new file mode 100644 index 0000000..fcf19e0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/ceylon @@ -0,0 +1,7 @@ +shared class CeylonClass() + given Parameter satisfies Object { + + shared String name => "CeylonClass"; +} + +shared void run() => CeylonClass(); diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cfscript b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cfscript new file mode 100644 index 0000000..9006416 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cfscript @@ -0,0 +1,18 @@ +component accessors="true" { + + property type="string" name="firstName" default=""; + property string username; + + function init(){ + return this; + } + + public any function submitOrder( required product, coupon="", boolean results=true ){ + + var foo = function( required string baz, x=true, y=false ){ + return "bar!"; + }; + + return foo; + } +} \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/clojure b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/clojure new file mode 100644 index 0000000..a9b682e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/clojure @@ -0,0 +1,5 @@ +(defn make-adder [x] + (let [y x] + (fn [z] (+ y z)))) +(def add2 (make-adder 2)) +(add2 4) diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cmake b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cmake new file mode 100644 index 0000000..89fcc51 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cmake @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 2.8.3) + +project(foo C) + +# some note +add_executable(foo utils.c "foo.c") +target_link_libraries(foo ${LIBRARIES}) diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/coffeescript b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/coffeescript new file mode 100644 index 0000000..a562db6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/coffeescript @@ -0,0 +1,5 @@ +# Objects: +math = + root: Math.sqrt + square: square + cube: (x) -> x * square x diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/common_lisp b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/common_lisp new file mode 100644 index 0000000..c6d2861 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/common_lisp @@ -0,0 +1 @@ +(defun square (x) (* x x)) diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/conf b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/conf new file mode 100644 index 0000000..5386d4e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/conf @@ -0,0 +1,4 @@ +# A generic configuration file +option1 "val1" +option2 23 +option3 'val3' diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/console b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/console new file mode 100644 index 0000000..9d6ed1c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/console @@ -0,0 +1,6 @@ +# prints "hello, world" to the screen +~# echo Hello, World +Hello, World + +# don't run this +~# rm -rf --no-preserve-root / diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/coq b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/coq new file mode 100644 index 0000000..1d8d68f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/coq @@ -0,0 +1,13 @@ +Require Import Coq.Lists.List. + +Section with_T. + Context {T : Type}. + + Fixpoint length (ls : list T) : nat := + match ls with + | nil => 0 + | _ :: ls => S (length ls) + end. +End with_T. + +Definition a_string := "hello \" world". \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cpp b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cpp new file mode 100644 index 0000000..c20cf27 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/cpp @@ -0,0 +1,8 @@ +#include + +using namespace std; + +int main() +{ + cout << "Hello World" << endl; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/csharp b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/csharp new file mode 100644 index 0000000..04e4a8e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/csharp @@ -0,0 +1,5 @@ +// reverse byte order (16-bit) +public static UInt16 ReverseBytes(UInt16 value) +{ + return (UInt16)((value & 0xFFU) << 8 | (value & 0xFF00U) >> 8); +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/css b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/css new file mode 100644 index 0000000..0d1fe74 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/css @@ -0,0 +1,4 @@ +body { + font-size: 12pt; + background: #fff url(temp.png) top left no-repeat; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/d b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/d new file mode 100644 index 0000000..65d4945 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/d @@ -0,0 +1,16 @@ +import std.algorithm, std.conv, std.functional, + std.math, std.regex, std.stdio; + +alias round = pipe!(to!real, std.math.round, to!string); +static reFloatingPoint = ctRegex!`[0-9]+\.[0-9]+`; + +void main() +{ + // Replace anything that looks like a real + // number with the rounded equivalent. + stdin + .byLine + .map!(l => l.replaceAll!(c => c.hit.round) + (reFloatingPoint)) + .each!writeln; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/dart b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/dart new file mode 100644 index 0000000..4b40da5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/dart @@ -0,0 +1,6 @@ +void main() { + var collection=[1,2,3,4,5]; + for(var a in collection){ + print(a); + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/diff b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/diff new file mode 100644 index 0000000..ab4f316 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/diff @@ -0,0 +1,7 @@ +--- file1 2012-10-16 15:07:58.086886874 +0100 ++++ file2 2012-10-16 15:08:07.642887236 +0100 +@@ -1,3 +1,3 @@ + a b c +-d e f ++D E F + g h i diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/digdag b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/digdag new file mode 100644 index 0000000..f7dbad0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/digdag @@ -0,0 +1,19 @@ +# this is digdag task definitions +timezone: UTC + ++setup: + echo>: start ${session_time} + ++disp_current_date: + echo>: ${moment(session_time).utc().format('YYYY-MM-DD HH:mm:ss Z')} + ++repeat: + for_each>: + order: [first, second, third] + animal: [dog, cat] + _do: + echo>: ${order} ${animal} + _parallel: true + ++teardown: + echo>: finish ${session_time} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/docker b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/docker new file mode 100644 index 0000000..656d2bc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/docker @@ -0,0 +1,9 @@ +maintainer First O'Last + +run echo \ + 123 $bar +# comment +onbuild add . /app/src +onbuild run echo \ + 123 $bar +CMD /bin/bash diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/dot b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/dot new file mode 100644 index 0000000..243ee73 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/dot @@ -0,0 +1,5 @@ +// The graph name and the semicolons are optional +graph G { + a -- b -- c; + b -- d; +} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/eiffel b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/eiffel new file mode 100644 index 0000000..ec025cc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/eiffel @@ -0,0 +1,30 @@ +note + description: "Represents a person." + +class + PERSON + +create + make, make_unknown + +feature {NONE} -- Creation + + make (a_name: like name) + -- Create a person with `a_name' as `name'. + do + name := a_name + ensure + name = a_name + end + + make_unknown + do ensure + name = Void + end + +feature -- Access + + name: detachable STRING + -- Full name or Void if unknown. + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/elixir b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/elixir new file mode 100644 index 0000000..f81d641 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/elixir @@ -0,0 +1 @@ +Enum.map([1,2,3], fn(x) -> x * 2 end) diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/elm b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/elm new file mode 100644 index 0000000..8d38380 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/elm @@ -0,0 +1,4 @@ +import Html exposing (text) + +main = + text "Hello, World!" diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/erb b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/erb new file mode 100644 index 0000000..1f922b6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/erb @@ -0,0 +1 @@ +<%= @title %> diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/erlang b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/erlang new file mode 100644 index 0000000..c942b60 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/erlang @@ -0,0 +1,7 @@ +%%% Geometry module. +-module(geometry). +-export([area/1]). + +%% Compute rectangle and circle area. +area({rectangle, Width, Ht}) -> Width * Ht; +area({circle, R}) -> 3.14159 * R * R. \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/factor b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/factor new file mode 100644 index 0000000..2538dff --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/factor @@ -0,0 +1,5 @@ +USING: io kernel sequences ; + +4 iota [ + "Happy Birthday " write 2 = "dear NAME" "to You" ? print +] each diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/fortran b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/fortran new file mode 100644 index 0000000..4fc52c5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/fortran @@ -0,0 +1,22 @@ +program bottles + + implicit none + integer :: nbottles + + do nbottles = 99, 1, -1 + call print_bottles(nbottles) + end do + +contains + + subroutine print_bottles(n) + implicit none + integer, intent(in) :: n + + write(*, "(I0, 1X, 'bottles of beer on the wall,')") n + write(*, "(I0, 1X, 'bottles of beer.')") n + write(*, "('Take one down, pass it around,')") + write(*, "(I0, 1X, 'bottles of beer on the wall.', /)") n - 1 + end subroutine print_bottles + +end program bottles diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/fsharp b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/fsharp new file mode 100644 index 0000000..b1812ee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/fsharp @@ -0,0 +1,12 @@ +(* Binary tree with leaves car­rying an integer. *) +type Tree = Leaf of int | Node of Tree * Tree + +let rec existsLeaf test tree = + match tree with + | Leaf v -> test v + | Node (left, right) -> + existsLeaf test left + || existsLeaf test right + +let hasEvenLeaf tree = + existsLeaf (fun n -> n % 2 = 0) tree \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/gherkin b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/gherkin new file mode 100644 index 0000000..78e4ba6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/rouge-3.1.0/lib/rouge/demos/gherkin @@ -0,0 +1,17 @@ +# language: en +Feature: Addition + In order to avoid silly mistakes + As someone who has trouble with mental math + I want to be told the sum of two numbers + + Scenario Outline: Add two numbers + Given I have entered into the calculator + And I have entered into the calculator + When I press

      qJyx&h)3nD+s)i0IaV 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�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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/.classpath b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/.classpath new file mode 100644 index 0000000..11672dd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/.project b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/.project new file mode 100644 index 0000000..c7766db --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/.project @@ -0,0 +1,17 @@ + + + em_reactor + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EmReactor.java b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EmReactor.java new file mode 100644 index 0000000..31642f3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EmReactor.java @@ -0,0 +1,613 @@ +/** + * $Id$ + * + * Author:: Francis Cianfrocca (gmail: blackhedd) + * Homepage:: http://rubyeventmachine.com + * Date:: 15 Jul 2007 + * + * See EventMachine and EventMachine::Connection for documentation and + * usage examples. + * + * + *---------------------------------------------------------------------------- + * + * Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + * Gmail: blackhedd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of either: 1) the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version; or 2) Ruby's License. + * + * See the file COPYING for complete licensing information. + * + *--------------------------------------------------------------------------- + * + * + */ + +package com.rubyeventmachine; + +import java.io.*; +import java.nio.channels.*; +import java.util.*; +import java.nio.*; +import java.net.*; +import java.util.concurrent.atomic.*; +import java.security.*; + +public class EmReactor { + public final int EM_TIMER_FIRED = 100; + public final int EM_CONNECTION_READ = 101; + public final int EM_CONNECTION_UNBOUND = 102; + public final int EM_CONNECTION_ACCEPTED = 103; + public final int EM_CONNECTION_COMPLETED = 104; + public final int EM_LOOPBREAK_SIGNAL = 105; + public final int EM_CONNECTION_NOTIFY_READABLE = 106; + public final int EM_CONNECTION_NOTIFY_WRITABLE = 107; + public final int EM_SSL_HANDSHAKE_COMPLETED = 108; + public final int EM_SSL_VERIFY = 109; + public final int EM_PROXY_TARGET_UNBOUND = 110; + public final int EM_PROXY_COMPLETED = 111; + + public final int EM_PROTO_SSLv2 = 2; + public final int EM_PROTO_SSLv3 = 4; + public final int EM_PROTO_TLSv1 = 8; + public final int EM_PROTO_TLSv1_1 = 16; + public final int EM_PROTO_TLSv1_2 = 32; + + private Selector mySelector; + private TreeMap> Timers; + private HashMap Connections; + private HashMap Acceptors; + private ArrayList NewConnections; + private ArrayList UnboundConnections; + private ArrayList DetachedConnections; + + private boolean bRunReactor; + private long BindingIndex; + private AtomicBoolean loopBreaker; + private ByteBuffer myReadBuffer; + private int timerQuantum; + + public EmReactor() { + Timers = new TreeMap>(); + Connections = new HashMap(); + Acceptors = new HashMap(); + NewConnections = new ArrayList(); + UnboundConnections = new ArrayList(); + DetachedConnections = new ArrayList(); + + BindingIndex = 0; + loopBreaker = new AtomicBoolean(); + loopBreaker.set(false); + myReadBuffer = ByteBuffer.allocate(32*1024); // don't use a direct buffer. Ruby doesn't seem to like them. + timerQuantum = 98; + } + + /** + * This is a no-op stub, intended to be overridden in user code. + */ + public void eventCallback (long sig, int eventType, ByteBuffer data, long data2) { + System.out.println ("Default callback: "+sig+" "+eventType+" "+data+" "+data2); + } + public void eventCallback (long sig, int eventType, ByteBuffer data) { + eventCallback (sig, eventType, data, 0); + } + + + public void run() { + try { + mySelector = Selector.open(); + bRunReactor = true; + } catch (IOException e) { + throw new RuntimeException ("Could not open selector", e); + } + + while (bRunReactor) { + runLoopbreaks(); + if (!bRunReactor) break; + + runTimers(); + if (!bRunReactor) break; + + removeUnboundConnections(); + checkIO(); + addNewConnections(); + processIO(); + } + + close(); + } + + void addNewConnections() { + ListIterator iter = DetachedConnections.listIterator(0); + while (iter.hasNext()) { + EventableSocketChannel ec = iter.next(); + ec.cleanup(); + } + DetachedConnections.clear(); + + ListIterator iter2 = NewConnections.listIterator(0); + while (iter2.hasNext()) { + long b = iter2.next(); + + EventableChannel ec = Connections.get(b); + if (ec != null) { + try { + ec.register(); + } catch (ClosedChannelException e) { + UnboundConnections.add (ec.getBinding()); + } + } + } + NewConnections.clear(); + } + + void removeUnboundConnections() { + ListIterator iter = UnboundConnections.listIterator(0); + while (iter.hasNext()) { + long b = iter.next(); + + EventableChannel ec = Connections.remove(b); + if (ec != null) { + eventCallback (b, EM_CONNECTION_UNBOUND, null); + ec.close(); + + EventableSocketChannel sc = (EventableSocketChannel) ec; + if (sc != null && sc.isAttached()) + DetachedConnections.add (sc); + } + } + UnboundConnections.clear(); + } + + void checkIO() { + long timeout; + + if (NewConnections.size() > 0) { + timeout = -1; + } else if (!Timers.isEmpty()) { + long now = new Date().getTime(); + long k = Timers.firstKey(); + long diff = k-now; + + if (diff <= 0) + timeout = -1; // don't wait, just poll once + else + timeout = diff; + } else { + timeout = 0; // wait indefinitely + } + + try { + if (timeout == -1) + mySelector.selectNow(); + else + mySelector.select(timeout); + } catch (IOException e) { + e.printStackTrace(); + } + } + + void processIO() { + Iterator it = mySelector.selectedKeys().iterator(); + while (it.hasNext()) { + SelectionKey k = it.next(); + it.remove(); + + if (k.isConnectable()) + isConnectable(k); + + else if (k.isAcceptable()) + isAcceptable(k); + + else { + if (k.isWritable()) + isWritable(k); + + if (k.isReadable()) + isReadable(k); + } + } + } + + void isAcceptable (SelectionKey k) { + ServerSocketChannel ss = (ServerSocketChannel) k.channel(); + SocketChannel sn; + long b; + + for (int n = 0; n < 10; n++) { + try { + sn = ss.accept(); + if (sn == null) + break; + } catch (IOException e) { + e.printStackTrace(); + k.cancel(); + + ServerSocketChannel server = Acceptors.remove(k.attachment()); + if (server != null) + try{ server.close(); } catch (IOException ex) {}; + break; + } + + try { + sn.configureBlocking(false); + } catch (IOException e) { + e.printStackTrace(); + continue; + } + + b = createBinding(); + EventableSocketChannel ec = new EventableSocketChannel (sn, b, mySelector); + Connections.put (b, ec); + NewConnections.add (b); + + eventCallback (((Long)k.attachment()).longValue(), EM_CONNECTION_ACCEPTED, null, b); + } + } + + void isReadable (SelectionKey k) { + EventableChannel ec = (EventableChannel) k.attachment(); + long b = ec.getBinding(); + + if (ec.isWatchOnly()) { + if (ec.isNotifyReadable()) + eventCallback (b, EM_CONNECTION_NOTIFY_READABLE, null); + } else { + myReadBuffer.clear(); + + try { + ec.readInboundData (myReadBuffer); + myReadBuffer.flip(); + if (myReadBuffer.limit() > 0) + eventCallback (b, EM_CONNECTION_READ, myReadBuffer); + } catch (IOException e) { + UnboundConnections.add (b); + } + } + } + + void isWritable (SelectionKey k) { + EventableChannel ec = (EventableChannel) k.attachment(); + long b = ec.getBinding(); + + if (ec.isWatchOnly()) { + if (ec.isNotifyWritable()) + eventCallback (b, EM_CONNECTION_NOTIFY_WRITABLE, null); + } + else { + try { + if (!ec.writeOutboundData()) + UnboundConnections.add (b); + } catch (IOException e) { + UnboundConnections.add (b); + } + } + } + + void isConnectable (SelectionKey k) { + EventableSocketChannel ec = (EventableSocketChannel) k.attachment(); + long b = ec.getBinding(); + + try { + if (ec.finishConnecting()) + eventCallback (b, EM_CONNECTION_COMPLETED, null); + else + UnboundConnections.add (b); + } catch (IOException e) { + UnboundConnections.add (b); + } + } + + void close() { + try { + if (mySelector != null) + mySelector.close(); + } catch (IOException e) {} + mySelector = null; + + // run down open connections and sockets. + Iterator i = Acceptors.values().iterator(); + while (i.hasNext()) { + try { + i.next().close(); + } catch (IOException e) {} + } + + // 29Sep09: We create an ArrayList of the existing connections, then iterate over + // that to call unbind on them. This is because an unbind can trigger a reconnect, + // which will add to the Connections HashMap, causing a ConcurrentModificationException. + // XXX: The correct behavior here would be to latch the various reactor methods to return + // immediately if the reactor is shutting down. + ArrayList conns = new ArrayList(); + Iterator i2 = Connections.values().iterator(); + while (i2.hasNext()) { + EventableChannel ec = i2.next(); + if (ec != null) { + conns.add (ec); + } + } + Connections.clear(); + + ListIterator i3 = conns.listIterator(0); + while (i3.hasNext()) { + EventableChannel ec = i3.next(); + eventCallback (ec.getBinding(), EM_CONNECTION_UNBOUND, null); + ec.close(); + + EventableSocketChannel sc = (EventableSocketChannel) ec; + if (sc != null && sc.isAttached()) + DetachedConnections.add (sc); + } + + ListIterator i4 = DetachedConnections.listIterator(0); + while (i4.hasNext()) { + EventableSocketChannel ec = i4.next(); + ec.cleanup(); + } + DetachedConnections.clear(); + } + + void runLoopbreaks() { + if (loopBreaker.getAndSet(false)) { + eventCallback (0, EM_LOOPBREAK_SIGNAL, null); + } + } + + public void stop() { + bRunReactor = false; + signalLoopbreak(); + } + + void runTimers() { + long now = new Date().getTime(); + while (!Timers.isEmpty()) { + long k = Timers.firstKey(); + if (k > now) + break; + + ArrayList callbacks = Timers.get(k); + Timers.remove(k); + + // Fire all timers at this timestamp + ListIterator iter = callbacks.listIterator(0); + while (iter.hasNext()) { + eventCallback (0, EM_TIMER_FIRED, null, iter.next().longValue()); + } + } + } + + public long installOneshotTimer (long milliseconds) { + long s = createBinding(); + long deadline = new Date().getTime() + milliseconds; + + if (Timers.containsKey(deadline)) { + Timers.get(deadline).add(s); + } else { + ArrayList callbacks = new ArrayList(); + callbacks.add(s); + Timers.put(deadline, callbacks); + } + + return s; + } + + public long startTcpServer (SocketAddress sa) throws EmReactorException { + try { + ServerSocketChannel server = ServerSocketChannel.open(); + server.configureBlocking(false); + server.socket().bind (sa); + long s = createBinding(); + Acceptors.put(s, server); + server.register(mySelector, SelectionKey.OP_ACCEPT, s); + return s; + } catch (IOException e) { + throw new EmReactorException ("unable to open socket acceptor: " + e.toString()); + } + } + + public long startTcpServer (String address, int port) throws EmReactorException { + return startTcpServer (new InetSocketAddress (address, port)); + } + + public void stopTcpServer (long signature) throws IOException { + ServerSocketChannel server = Acceptors.remove(signature); + if (server != null) + server.close(); + else + throw new RuntimeException ("failed to close unknown acceptor"); + } + + public long openUdpSocket (InetSocketAddress address) throws IOException { + // TODO, don't throw an exception out of here. + DatagramChannel dg = DatagramChannel.open(); + dg.configureBlocking(false); + dg.socket().bind(address); + long b = createBinding(); + EventableChannel ec = new EventableDatagramChannel (dg, b, mySelector); + dg.register(mySelector, SelectionKey.OP_READ, ec); + Connections.put(b, ec); + return b; + } + + public long openUdpSocket (String address, int port) throws IOException { + return openUdpSocket (new InetSocketAddress (address, port)); + } + + public void sendData (long sig, ByteBuffer bb) throws IOException { + Connections.get(sig).scheduleOutboundData( bb ); + } + + public void sendData (long sig, byte[] data) throws IOException { + sendData (sig, ByteBuffer.wrap(data)); + } + + public void setCommInactivityTimeout (long sig, long mills) { + Connections.get(sig).setCommInactivityTimeout (mills); + } + + public void sendDatagram (long sig, byte[] data, int length, String recipAddress, int recipPort) { + sendDatagram (sig, ByteBuffer.wrap(data), recipAddress, recipPort); + } + + public void sendDatagram (long sig, ByteBuffer bb, String recipAddress, int recipPort) { + (Connections.get(sig)).scheduleOutboundDatagram( bb, recipAddress, recipPort); + } + + public long connectTcpServer (String address, int port) { + return connectTcpServer(null, 0, address, port); + } + + public long connectTcpServer (String bindAddr, int bindPort, String address, int port) { + long b = createBinding(); + + try { + SocketChannel sc = SocketChannel.open(); + sc.configureBlocking(false); + if (bindAddr != null) + sc.socket().bind(new InetSocketAddress (bindAddr, bindPort)); + + EventableSocketChannel ec = new EventableSocketChannel (sc, b, mySelector); + + if (sc.connect (new InetSocketAddress (address, port))) { + // Connection returned immediately. Can happen with localhost connections. + // WARNING, this code is untested due to lack of available test conditions. + // Ought to be be able to come here from a localhost connection, but that + // doesn't happen on Linux. (Maybe on FreeBSD?) + // The reason for not handling this until we can test it is that we + // really need to return from this function WITHOUT triggering any EM events. + // That's because until the user code has seen the signature we generated here, + // it won't be able to properly dispatch them. The C++ EM deals with this + // by setting pending mode as a flag in ALL eventable descriptors and making + // the descriptor select for writable. Then, it can send UNBOUND and + // CONNECTION_COMPLETED on the next pass through the loop, because writable will + // fire. + throw new RuntimeException ("immediate-connect unimplemented"); + } + else { + ec.setConnectPending(); + Connections.put (b, ec); + NewConnections.add (b); + } + } catch (IOException e) { + // Can theoretically come here if a connect failure can be determined immediately. + // I don't know how to make that happen for testing purposes. + throw new RuntimeException ("immediate-connect unimplemented: " + e.toString()); + } + return b; + } + + public void closeConnection (long sig, boolean afterWriting) { + EventableChannel ec = Connections.get(sig); + if (ec != null) + if (ec.scheduleClose (afterWriting)) + UnboundConnections.add (sig); + } + + long createBinding() { + return ++BindingIndex; + } + + public void signalLoopbreak() { + loopBreaker.set(true); + if (mySelector != null) + mySelector.wakeup(); + } + + public void startTls (long sig) throws NoSuchAlgorithmException, KeyManagementException { + Connections.get(sig).startTls(); + } + + public void setTimerQuantum (int mills) { + if (mills < 5 || mills > 2500) + throw new RuntimeException ("attempt to set invalid timer-quantum value: "+mills); + timerQuantum = mills; + } + + public Object[] getPeerName (long sig) { + EventableChannel channel = Connections.get(sig); + if (channel != null) { + return Connections.get(sig).getPeerName(); + } + else { + ServerSocketChannel acceptor = Acceptors.get(sig); + return new Object[] { acceptor.socket().getLocalPort(), + acceptor.socket().getInetAddress().getHostAddress() }; + } + } + + public Object[] getSockName (long sig) { + EventableChannel channel = Connections.get(sig); + if (channel != null) { + return Connections.get(sig).getSockName(); + } + else { + ServerSocketChannel acceptor = Acceptors.get(sig); + return new Object[] { acceptor.socket().getLocalPort(), + acceptor.socket().getInetAddress().getHostAddress() }; + } + } + + public long attachChannel (SocketChannel sc, boolean watch_mode) { + long b = createBinding(); + + EventableSocketChannel ec = new EventableSocketChannel (sc, b, mySelector); + + ec.setAttached(); + if (watch_mode) + ec.setWatchOnly(); + + Connections.put (b, ec); + NewConnections.add (b); + + return b; + } + + public SocketChannel detachChannel (long sig) { + EventableSocketChannel ec = (EventableSocketChannel) Connections.get (sig); + if (ec != null) { + UnboundConnections.add (sig); + return ec.getChannel(); + } else { + return null; + } + } + + public void setNotifyReadable (long sig, boolean mode) { + ((EventableSocketChannel) Connections.get(sig)).setNotifyReadable(mode); + } + + public void setNotifyWritable (long sig, boolean mode) { + ((EventableSocketChannel) Connections.get(sig)).setNotifyWritable(mode); + } + + public boolean isNotifyReadable (long sig) { + return Connections.get(sig).isNotifyReadable(); + } + + public boolean isNotifyWritable (long sig) { + return Connections.get(sig).isNotifyWritable(); + } + + public boolean pauseConnection (long sig) { + return ((EventableSocketChannel) Connections.get(sig)).pause(); + } + + public boolean resumeConnection (long sig) { + return ((EventableSocketChannel) Connections.get(sig)).resume(); + } + + public boolean isConnectionPaused (long sig) { + return ((EventableSocketChannel) Connections.get(sig)).isPaused(); + } + + public long getOutboundDataSize (long sig) { + return Connections.get(sig).getOutboundDataSize(); + } + + public int getConnectionCount() { + return Connections.size() + Acceptors.size(); + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EmReactorException.java b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EmReactorException.java new file mode 100644 index 0000000..69efaa3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EmReactorException.java @@ -0,0 +1,40 @@ +/** + * $Id$ + * + * Author:: Francis Cianfrocca (gmail: blackhedd) + * Homepage:: http://rubyeventmachine.com + * Date:: 15 Jul 2007 + * + * See EventMachine and EventMachine::Connection for documentation and + * usage examples. + * + * + *---------------------------------------------------------------------------- + * + * Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + * Gmail: blackhedd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of either: 1) the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version; or 2) Ruby's License. + * + * See the file COPYING for complete licensing information. + * + *--------------------------------------------------------------------------- + * + * + */ + +package com.rubyeventmachine; + +/** + * @author francis + * + */ +public class EmReactorException extends Exception { + static final long serialVersionUID = 0; + public EmReactorException (String msg) { + super (msg); + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableChannel.java b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableChannel.java new file mode 100644 index 0000000..3d4f5fd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableChannel.java @@ -0,0 +1,72 @@ +/** + * $Id$ + * + * Author:: Francis Cianfrocca (gmail: blackhedd) + * Homepage:: http://rubyeventmachine.com + * Date:: 15 Jul 2007 + * + * See EventMachine and EventMachine::Connection for documentation and + * usage examples. + * + * + *---------------------------------------------------------------------------- + * + * Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + * Gmail: blackhedd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of either: 1) the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version; or 2) Ruby's License. + * + * See the file COPYING for complete licensing information. + * + *--------------------------------------------------------------------------- + * + * + */ + + +package com.rubyeventmachine; + +import java.nio.ByteBuffer; +import java.io.IOException; +import java.nio.channels.ClosedChannelException; + +public interface EventableChannel { + + public void scheduleOutboundData (ByteBuffer bb); + + public void scheduleOutboundDatagram (ByteBuffer bb, String recipAddress, int recipPort); + + public boolean scheduleClose (boolean afterWriting); + + public void startTls(); + + public long getBinding(); + + public void readInboundData (ByteBuffer dst) throws IOException; + + public void register() throws ClosedChannelException; + + /** + * This is called by the reactor after it finishes running. + * The idea is to free network resources. + */ + public void close(); + + public boolean writeOutboundData() throws IOException; + + public long getOutboundDataSize(); + + public void setCommInactivityTimeout (long seconds); + + public Object[] getPeerName(); + public Object[] getSockName(); + + public boolean isWatchOnly(); + + public boolean isNotifyReadable(); + public boolean isNotifyWritable(); + +} diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableDatagramChannel.java b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableDatagramChannel.java new file mode 100644 index 0000000..df1c9fd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableDatagramChannel.java @@ -0,0 +1,201 @@ +/** + * $Id$ + * + * Author:: Francis Cianfrocca (gmail: blackhedd) + * Homepage:: http://rubyeventmachine.com + * Date:: 15 Jul 2007 + * + * See EventMachine and EventMachine::Connection for documentation and + * usage examples. + * + * + *---------------------------------------------------------------------------- + * + * Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + * Gmail: blackhedd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of either: 1) the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version; or 2) Ruby's License. + * + * See the file COPYING for complete licensing information. + * + *--------------------------------------------------------------------------- + * + * + */ + + +package com.rubyeventmachine; + +import java.nio.ByteBuffer; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.DatagramChannel; +import java.util.LinkedList; +import java.io.*; +import java.net.*; + +public class EventableDatagramChannel implements EventableChannel { + + class Packet { + public ByteBuffer bb; + public SocketAddress recipient; + public Packet (ByteBuffer _bb, SocketAddress _recipient) { + bb = _bb; + recipient = _recipient; + } + } + + DatagramChannel channel; + long binding; + Selector selector; + boolean bCloseScheduled; + LinkedList outboundQ; + long outboundS; + SocketAddress returnAddress; + + + public EventableDatagramChannel (DatagramChannel dc, long _binding, Selector sel) throws ClosedChannelException { + channel = dc; + binding = _binding; + selector = sel; + bCloseScheduled = false; + outboundQ = new LinkedList(); + outboundS = 0; + + dc.register(selector, SelectionKey.OP_READ, this); + } + + public void scheduleOutboundData (ByteBuffer bb) { + try { + if ((!bCloseScheduled) && (bb.remaining() > 0)) { + outboundQ.addLast(new Packet(bb, returnAddress)); + outboundS += bb.remaining(); + channel.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ, this); + } + } catch (ClosedChannelException e) { + throw new RuntimeException ("no outbound data"); + } + } + + public void scheduleOutboundDatagram (ByteBuffer bb, String recipAddress, int recipPort) { + try { + if ((!bCloseScheduled) && (bb.remaining() > 0)) { + outboundQ.addLast(new Packet (bb, new InetSocketAddress (recipAddress, recipPort))); + outboundS += bb.remaining(); + channel.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ, this); + } + } catch (ClosedChannelException e) { + throw new RuntimeException ("no outbound data"); + } + } + + public boolean scheduleClose (boolean afterWriting) { + System.out.println ("NOT SCHEDULING CLOSE ON DATAGRAM"); + return false; + } + + public void startTls() { + throw new RuntimeException ("TLS is unimplemented on this Channel"); + } + + public long getBinding() { + return binding; + } + + public void register() throws ClosedChannelException { + // TODO + } + + /** + * Terminate with extreme prejudice. Don't assume there will be another pass through + * the reactor core. + */ + public void close() { + try { + channel.close(); + } catch (IOException e) { + } + } + + public void readInboundData (ByteBuffer dst) { + returnAddress = null; + try { + // If there is no datagram available (we're nonblocking after all), + // then channel.receive returns null. + returnAddress = channel.receive(dst); + } catch (IOException e) { + // probably a no-op. The caller will see the empty (or even partial) buffer + // and presumably do the right thing. + } + } + + public boolean writeOutboundData() { + while (!outboundQ.isEmpty()) { + Packet p = outboundQ.getFirst(); + int written = 0; + try { + // With a datagram socket, it's ok to send an empty buffer. + written = channel.send(p.bb, p.recipient); + outboundS -= written; + } + catch (IOException e) { + return false; + } + + /* Did we consume the whole outbound buffer? If yes, pop it off and + * keep looping. If no, the outbound network buffers are full, so break + * out of here. There's a flaw that affects outbound buffers that are intentionally + * empty. We can tell whether they got sent or not. So we assume they were. + * TODO: As implemented, this ALWAYS discards packets if they were at least + * partially written. This matches the behavior of the C++ EM. My judgment + * is that this is less surprising than fragmenting the data and sending multiple + * packets would be. I could be wrong, so this is subject to change. + */ + + if ((written > 0) || (p.bb.remaining() == 0)) + outboundQ.removeFirst(); + else + break; + } + + if (outboundQ.isEmpty()) { + try { + channel.register(selector, SelectionKey.OP_READ, this); + } catch (ClosedChannelException e) {} + } + + // ALWAYS drain the outbound queue before triggering a connection close. + // If anyone wants to close immediately, they're responsible for clearing + // the outbound queue. + return (bCloseScheduled && outboundQ.isEmpty()) ? false : true; + } + + public void setCommInactivityTimeout (long seconds) { + // TODO + System.out.println ("DATAGRAM: SET COMM INACTIVITY UNIMPLEMENTED " + seconds); + } + + public Object[] getPeerName () { + if (returnAddress != null) { + InetSocketAddress inetAddr = (InetSocketAddress) returnAddress; + return new Object[]{ inetAddr.getPort(), inetAddr.getHostName() }; + } else { + return null; + } + } + + public Object[] getSockName () { + DatagramSocket socket = channel.socket(); + return new Object[]{ socket.getLocalPort(), + socket.getLocalAddress().getHostAddress() }; + } + + public boolean isWatchOnly() { return false; } + public boolean isNotifyReadable() { return false; } + public boolean isNotifyWritable() { return false; } + public long getOutboundDataSize() { return outboundS; } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableSocketChannel.java b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableSocketChannel.java new file mode 100644 index 0000000..2905ec6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/java/src/com/rubyeventmachine/EventableSocketChannel.java @@ -0,0 +1,415 @@ +/** + * $Id$ + * + * Author:: Francis Cianfrocca (gmail: blackhedd) + * Homepage:: http://rubyeventmachine.com + * Date:: 15 Jul 2007 + * + * See EventMachine and EventMachine::Connection for documentation and + * usage examples. + * + * + *---------------------------------------------------------------------------- + * + * Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + * Gmail: blackhedd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of either: 1) the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version; or 2) Ruby's License. + * + * See the file COPYING for complete licensing information. + * + *--------------------------------------------------------------------------- + * + * + */ + +/** + * + */ +package com.rubyeventmachine; + +/** + * @author francis + * + */ + +import java.nio.channels.*; +import java.nio.*; +import java.util.*; +import java.io.*; +import java.net.Socket; +import javax.net.ssl.*; +import javax.net.ssl.SSLEngineResult.*; +import java.lang.reflect.Field; + +import java.security.*; + +public class EventableSocketChannel implements EventableChannel { + Selector selector; + SelectionKey channelKey; + SocketChannel channel; + + long binding; + LinkedList outboundQ; + long outboundS; + + boolean bCloseScheduled; + boolean bConnectPending; + boolean bWatchOnly; + boolean bAttached; + boolean bNotifyReadable; + boolean bNotifyWritable; + boolean bPaused; + + SSLEngine sslEngine; + SSLContext sslContext; + + public EventableSocketChannel (SocketChannel sc, long _binding, Selector sel) { + channel = sc; + binding = _binding; + selector = sel; + bCloseScheduled = false; + bConnectPending = false; + bWatchOnly = false; + bAttached = false; + bNotifyReadable = false; + bNotifyWritable = false; + outboundQ = new LinkedList(); + outboundS = 0; + } + + public long getBinding() { + return binding; + } + + public SocketChannel getChannel() { + return channel; + } + + public void register() throws ClosedChannelException { + if (channelKey == null) { + int events = currentEvents(); + channelKey = channel.register(selector, events, this); + } + } + + /** + * Terminate with extreme prejudice. Don't assume there will be another pass through + * the reactor core. + */ + public void close() { + if (channelKey != null) { + channelKey.cancel(); + channelKey = null; + } + + if (bAttached) { + // attached channels are copies, so reset the file descriptor to prevent java from close()ing it + Field f; + FileDescriptor fd; + + try { + /* do _NOT_ clobber fdVal here, it will break epoll/kqueue on jdk6! + * channelKey.cancel() above does not occur until the next call to select + * and if fdVal is gone, we will continue to get events for this fd. + * + * instead, remove fdVal in cleanup(), which is processed via DetachedConnections, + * after UnboundConnections but before NewConnections. + */ + + f = channel.getClass().getDeclaredField("fd"); + f.setAccessible(true); + fd = (FileDescriptor) f.get(channel); + + f = fd.getClass().getDeclaredField("fd"); + f.setAccessible(true); + f.set(fd, -1); + } catch (java.lang.NoSuchFieldException e) { + e.printStackTrace(); + } catch (java.lang.IllegalAccessException e) { + e.printStackTrace(); + } + + return; + } + + try { + channel.close(); + } catch (IOException e) { + } + } + + public void cleanup() { + if (bAttached) { + Field f; + try { + f = channel.getClass().getDeclaredField("fdVal"); + f.setAccessible(true); + f.set(channel, -1); + } catch (java.lang.NoSuchFieldException e) { + e.printStackTrace(); + } catch (java.lang.IllegalAccessException e) { + e.printStackTrace(); + } + } + + channel = null; + } + + public void scheduleOutboundData (ByteBuffer bb) { + if (!bCloseScheduled && bb.remaining() > 0) { + if (sslEngine != null) { + try { + ByteBuffer b = ByteBuffer.allocate(32*1024); // TODO, preallocate this buffer. + sslEngine.wrap(bb, b); + b.flip(); + outboundQ.addLast(b); + outboundS += b.remaining(); + } catch (SSLException e) { + throw new RuntimeException ("ssl error"); + } + } + else { + outboundQ.addLast(bb); + outboundS += bb.remaining(); + } + + updateEvents(); + } + } + + public void scheduleOutboundDatagram (ByteBuffer bb, String recipAddress, int recipPort) { + throw new RuntimeException ("datagram sends not supported on this channel"); + } + + /** + * Called by the reactor when we have selected readable. + */ + public void readInboundData (ByteBuffer bb) throws IOException { + if (channel.read(bb) == -1) + throw new IOException ("eof"); + } + + public long getOutboundDataSize() { return outboundS; } + + /** + * Called by the reactor when we have selected writable. + * Return false to indicate an error that should cause the connection to close. + * TODO, VERY IMPORTANT: we're here because we selected writable, but it's always + * possible to become unwritable between the poll and when we get here. The way + * this code is written, we're depending on a nonblocking write NOT TO CONSUME + * the whole outbound buffer in this case, rather than firing an exception. + * We should somehow verify that this is indeed Java's defined behavior. + * @return + */ + public boolean writeOutboundData() throws IOException { + ByteBuffer[] bufs = new ByteBuffer[64]; + int i; + long written, toWrite; + while (!outboundQ.isEmpty()) { + i = 0; + toWrite = 0; + written = 0; + while (i < 64 && !outboundQ.isEmpty()) { + bufs[i] = outboundQ.removeFirst(); + toWrite += bufs[i].remaining(); + i++; + } + if (toWrite > 0) + written = channel.write(bufs, 0, i); + + outboundS -= written; + // Did we consume the whole outbound buffer? If yes, + // pop it off and keep looping. If no, the outbound network + // buffers are full, so break out of here. + if (written < toWrite) { + while (i > 0 && bufs[i-1].remaining() > 0) { + outboundQ.addFirst(bufs[i-1]); + i--; + } + break; + } + } + + if (outboundQ.isEmpty() && !bCloseScheduled) { + updateEvents(); + } + + // ALWAYS drain the outbound queue before triggering a connection close. + // If anyone wants to close immediately, they're responsible for clearing + // the outbound queue. + return (bCloseScheduled && outboundQ.isEmpty()) ? false : true; + } + + public void setConnectPending() { + bConnectPending = true; + updateEvents(); + } + + /** + * Called by the reactor when we have selected connectable. + * Return false to indicate an error that should cause the connection to close. + */ + public boolean finishConnecting() throws IOException { + channel.finishConnect(); + + bConnectPending = false; + updateEvents(); + return true; + } + + public boolean scheduleClose (boolean afterWriting) { + // TODO: What the hell happens here if bConnectPending is set? + if (!afterWriting) { + outboundQ.clear(); + outboundS = 0; + } + + if (outboundQ.isEmpty()) + return true; + else { + updateEvents(); + bCloseScheduled = true; + return false; + } + } + + public void startTls() { + if (sslEngine == null) { + try { + sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, null, null); // TODO, fill in the parameters. + sslEngine = sslContext.createSSLEngine(); // TODO, should use the parameterized version, to get Kerb stuff and session re-use. + sslEngine.setUseClientMode(false); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException ("unable to start TLS"); // TODO, get rid of this. + } catch (KeyManagementException e) { + throw new RuntimeException ("unable to start TLS"); // TODO, get rid of this. + } + } + System.out.println ("Starting TLS"); + } + + public ByteBuffer dispatchInboundData (ByteBuffer bb) throws SSLException { + if (sslEngine != null) { + if (true) throw new RuntimeException ("TLS currently unimplemented"); + System.setProperty("javax.net.debug", "all"); + ByteBuffer w = ByteBuffer.allocate(32*1024); // TODO, WRONG, preallocate this buffer. + SSLEngineResult res = sslEngine.unwrap(bb, w); + if (res.getHandshakeStatus() == HandshakeStatus.NEED_TASK) { + Runnable r; + while ((r = sslEngine.getDelegatedTask()) != null) { + r.run(); + } + } + System.out.println (bb); + w.flip(); + return w; + } + else + return bb; + } + + public void setCommInactivityTimeout (long seconds) { + // TODO + System.out.println ("SOCKET: SET COMM INACTIVITY UNIMPLEMENTED " + seconds); + } + + public Object[] getPeerName () { + Socket sock = channel.socket(); + return new Object[]{ sock.getPort(), sock.getInetAddress().getHostAddress() }; + } + + public Object[] getSockName () { + Socket sock = channel.socket(); + return new Object[]{ sock.getLocalPort(), + sock.getLocalAddress().getHostAddress() }; + } + + public void setWatchOnly() { + bWatchOnly = true; + updateEvents(); + } + public boolean isWatchOnly() { return bWatchOnly; } + + public void setAttached() { + bAttached = true; + } + public boolean isAttached() { return bAttached; } + + public void setNotifyReadable (boolean mode) { + bNotifyReadable = mode; + updateEvents(); + } + public boolean isNotifyReadable() { return bNotifyReadable; } + + public void setNotifyWritable (boolean mode) { + bNotifyWritable = mode; + updateEvents(); + } + public boolean isNotifyWritable() { return bNotifyWritable; } + + public boolean pause() { + if (bWatchOnly) { + throw new RuntimeException ("cannot pause/resume 'watch only' connections, set notify readable/writable instead"); + } + boolean old = bPaused; + bPaused = true; + updateEvents(); + return !old; + } + + public boolean resume() { + if (bWatchOnly) { + throw new RuntimeException ("cannot pause/resume 'watch only' connections, set notify readable/writable instead"); + } + boolean old = bPaused; + bPaused = false; + updateEvents(); + return old; + } + + public boolean isPaused() { + return bPaused; + } + + private void updateEvents() { + if (channelKey == null) + return; + + int events = currentEvents(); + + if (channelKey.interestOps() != events) { + channelKey.interestOps(events); + } + } + + private int currentEvents() { + int events = 0; + + if (bWatchOnly) + { + if (bNotifyReadable) + events |= SelectionKey.OP_READ; + + if (bNotifyWritable) + events |= SelectionKey.OP_WRITE; + } + else if (!bPaused) + { + if (bConnectPending) + events |= SelectionKey.OP_CONNECT; + else { + events |= SelectionKey.OP_READ; + + if (!outboundQ.isEmpty()) + events |= SelectionKey.OP_WRITE; + } + } + + return events; + } +} diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/buftok.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/buftok.rb new file mode 100644 index 0000000..caf4f77 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/buftok.rb @@ -0,0 +1,59 @@ +# BufferedTokenizer takes a delimiter upon instantiation, or acts line-based +# by default. It allows input to be spoon-fed from some outside source which +# receives arbitrary length datagrams which may-or-may-not contain the token +# by which entities are delimited. In this respect it's ideally paired with +# something like EventMachine (http://rubyeventmachine.com/). +class BufferedTokenizer + # New BufferedTokenizers will operate on lines delimited by a delimiter, + # which is by default the global input delimiter $/ ("\n"). + # + # The input buffer is stored as an array. This is by far the most efficient + # approach given language constraints (in C a linked list would be a more + # appropriate data structure). Segments of input data are stored in a list + # which is only joined when a token is reached, substantially reducing the + # number of objects required for the operation. + def initialize(delimiter = $/) + @delimiter = delimiter + @input = [] + @tail = '' + @trim = @delimiter.length - 1 + end + + # Extract takes an arbitrary string of input data and returns an array of + # tokenized entities, provided there were any available to extract. This + # makes for easy processing of datagrams using a pattern like: + # + # tokenizer.extract(data).map { |entity| Decode(entity) }.each do ... + # + # Using -1 makes split to return "" if the token is at the end of + # the string, meaning the last element is the start of the next chunk. + def extract(data) + if @trim > 0 + tail_end = @tail.slice!(-@trim, @trim) # returns nil if string is too short + data = tail_end + data if tail_end + end + + @input << @tail + entities = data.split(@delimiter, -1) + @tail = entities.shift + + unless entities.empty? + @input << @tail + entities.unshift @input.join + @input.clear + @tail = entities.pop + end + + entities + end + + # Flush the contents of the input buffer, i.e. return the input buffer even though + # a token has not yet been encountered + def flush + @input << @tail + buffer = @input.join + @input.clear + @tail = "" # @tail.clear is slightly faster, but not supported on 1.8.7 + buffer + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/callback.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/callback.rb new file mode 100644 index 0000000..4928feb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/callback.rb @@ -0,0 +1,58 @@ +module EventMachine + # Utility method for coercing arguments to an object that responds to :call. + # Accepts an object and a method name to send to, or a block, or an object + # that responds to :call. + # + # @example EventMachine.Callback used with a block. Returns that block. + # + # cb = EventMachine.Callback do |msg| + # puts(msg) + # end + # # returned object is a callable + # cb.call('hello world') + # + # + # @example EventMachine.Callback used with an object (to be more specific, class object) and a method name, returns an object that responds to #call + # + # cb = EventMachine.Callback(Object, :puts) + # # returned object is a callable that delegates to Kernel#puts (in this case Object.puts) + # cb.call('hello world') + # + # + # @example EventMachine.Callback used with an object that responds to #call. Returns the argument. + # + # cb = EventMachine.Callback(proc{ |msg| puts(msg) }) + # # returned object is a callable + # cb.call('hello world') + # + # + # @overload Callback(object, method) + # Wraps `method` invocation on `object` into an object that responds to #call that proxies all the arguments to that method + # @param [Object] Object to invoke method on + # @param [Symbol] Method name + # @return [<#call>] An object that responds to #call that takes any number of arguments and invokes method on object with those arguments + # + # @overload Callback(object) + # Returns callable object as is, without any coercion + # @param [<#call>] An object that responds to #call + # @return [<#call>] Its argument + # + # @overload Callback(&block) + # Returns block passed to it without any coercion + # @return [<#call>] Block passed to this method + # + # @raise [ArgumentError] When argument doesn't respond to #call, method name is missing or when invoked without arguments and block isn't given + # + # @return [<#call>] + def self.Callback(object = nil, method = nil, &blk) + if object && method + lambda { |*args| object.__send__ method, *args } + else + if object.respond_to? :call + object + else + blk || raise(ArgumentError) + end # if + end # if + end # self.Callback +end # EventMachine diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/channel.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/channel.rb new file mode 100644 index 0000000..a919adf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/channel.rb @@ -0,0 +1,69 @@ +module EventMachine + # Provides a simple thread-safe way to transfer data between (typically) long running + # tasks in {EventMachine.defer} and event loop thread. + # + # @example + # + # channel = EventMachine::Channel.new + # sid = channel.subscribe { |msg| p [:got, msg] } + # + # channel.push('hello world') + # channel.unsubscribe(sid) + # + # + class Channel + def initialize + @subs = {} + @uid = 0 + end + + # Return the number of current subscribers. + def num_subscribers + return @subs.size + end + + # Takes any arguments suitable for EM::Callback() and returns a subscriber + # id for use when unsubscribing. + # + # @return [Integer] Subscribe identifier + # @see #unsubscribe + def subscribe(*a, &b) + name = gen_id + EM.schedule { @subs[name] = EM::Callback(*a, &b) } + + name + end + + # Removes subscriber from the list. + # + # @param [Integer] Subscriber identifier + # @see #subscribe + def unsubscribe(name) + EM.schedule { @subs.delete name } + end + + # Add items to the channel, which are pushed out to all subscribers. + def push(*items) + items = items.dup + EM.schedule { items.each { |i| @subs.values.each { |s| s.call i } } } + end + alias << push + + # Fetches one message from the channel. + def pop(*a, &b) + EM.schedule { + name = subscribe do |*args| + unsubscribe(name) + EM::Callback(*a, &b).call(*args) + end + } + end + + private + + # @private + def gen_id + @uid += 1 + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/completion.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/completion.rb new file mode 100644 index 0000000..926535f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/completion.rb @@ -0,0 +1,304 @@ +# = EM::Completion +# +# A completion is a callback container for various states of completion. In +# its most basic form it has a start state and a finish state. +# +# This implementation includes some hold-back from the EM::Deferrable +# interface in order to be compatible - but it has a much cleaner +# implementation. +# +# In general it is preferred that this implementation be used as a state +# callback container than EM::DefaultDeferrable or other classes including +# EM::Deferrable. This is because it is generally more sane to keep this level +# of state in a dedicated state-back container. This generally leads to more +# malleable interfaces and software designs, as well as eradicating nasty bugs +# that result from abstraction leakage. +# +# == Basic Usage +# +# As already mentioned, the basic usage of a Completion is simply for its two +# final states, :succeeded and :failed. +# +# An asynchronous operation will complete at some future point in time, and +# users often want to react to this event. API authors will want to expose +# some common interface to react to these events. +# +# In the following example, the user wants to know when a short lived +# connection has completed its exchange with the remote server. The simple +# protocol just waits for an ack to its message. +# +# class Protocol < EM::Connection +# include EM::P::LineText2 +# +# def initialize(message, completion) +# @message, @completion = message, completion +# @completion.completion { close_connection } +# @completion.timeout(1, :timeout) +# end +# +# def post_init +# send_data(@message) +# end +# +# def receive_line(line) +# case line +# when /ACK/i +# @completion.succeed line +# when /ERR/i +# @completion.fail :error, line +# else +# @completion.fail :unknown, line +# end +# end +# +# def unbind +# @completion.fail :disconnected unless @completion.completed? +# end +# end +# +# class API +# attr_reader :host, :port +# +# def initialize(host = 'example.org', port = 8000) +# @host, @port = host, port +# end +# +# def request(message) +# completion = EM::Deferrable::Completion.new +# EM.connect(host, port, Protocol, message, completion) +# completion +# end +# end +# +# api = API.new +# completion = api.request('stuff') +# completion.callback do |line| +# puts "API responded with: #{line}" +# end +# completion.errback do |type, line| +# case type +# when :error +# puts "API error: #{line}" +# when :unknown +# puts "API returned unknown response: #{line}" +# when :disconnected +# puts "API server disconnected prematurely" +# when :timeout +# puts "API server did not respond in a timely fashion" +# end +# end +# +# == Advanced Usage +# +# This completion implementation also supports more state callbacks and +# arbitrary states (unlike the original Deferrable API). This allows for basic +# stateful process encapsulation. One might use this to setup state callbacks +# for various states in an exchange like in the basic usage example, except +# where the applicaiton could be made to react to "connected" and +# "disconnected" states additionally. +# +# class Protocol < EM::Connection +# def initialize(completion) +# @response = [] +# @completion = completion +# @completion.stateback(:disconnected) do +# @completion.succeed @response.join +# end +# end +# +# def connection_completed +# @host, @port = Socket.unpack_sockaddr_in get_peername +# @completion.change_state(:connected, @host, @port) +# send_data("GET http://example.org/ HTTP/1.0\r\n\r\n") +# end +# +# def receive_data(data) +# @response << data +# end +# +# def unbind +# @completion.change_state(:disconnected, @host, @port) +# end +# end +# +# completion = EM::Deferrable::Completion.new +# completion.stateback(:connected) do |host, port| +# puts "Connected to #{host}:#{port}" +# end +# completion.stateback(:disconnected) do |host, port| +# puts "Disconnected from #{host}:#{port}" +# end +# completion.callback do |response| +# puts response +# end +# +# EM.connect('example.org', 80, Protocol, completion) +# +# == Timeout +# +# The Completion also has a timeout. The timeout is global and is not aware of +# states apart from completion states. The timeout is only engaged if #timeout +# is called, and it will call fail if it is reached. +# +# == Completion states +# +# By default there are two completion states, :succeeded and :failed. These +# states can be modified by subclassing and overrding the #completion_states +# method. Completion states are special, in that callbacks for all completion +# states are explcitly cleared when a completion state is entered. This +# prevents errors that could arise from accidental unterminated timeouts, and +# other such user errors. +# +# == Other notes +# +# Several APIs have been carried over from EM::Deferrable for compatibility +# reasons during a transitionary period. Specifically cancel_errback and +# cancel_callback are implemented, but their usage is to be strongly +# discouraged. Due to the already complex nature of reaction systems, dynamic +# callback deletion only makes the problem much worse. It is always better to +# add correct conditionals to the callback code, or use more states, than to +# address such implementaiton issues with conditional callbacks. + +module EventMachine + + class Completion + # This is totally not used (re-implemented), it's here in case people check + # for kind_of? + include EventMachine::Deferrable + + attr_reader :state, :value + + def initialize + @state = :unknown + @callbacks = Hash.new { |h,k| h[k] = [] } + @value = [] + @timeout_timer = nil + end + + # Enter the :succeeded state, setting the result value if given. + def succeed(*args) + change_state(:succeeded, *args) + end + # The old EM method: + alias set_deferred_success succeed + + # Enter the :failed state, setting the result value if given. + def fail(*args) + change_state(:failed, *args) + end + # The old EM method: + alias set_deferred_failure fail + + # Statebacks are called when you enter (or are in) the named state. + def stateback(state, *a, &b) + # The following is quite unfortunate special casing for :completed + # statebacks, but it's a necessary evil for latent completion + # definitions. + + if :completed == state || !completed? || @state == state + @callbacks[state] << EM::Callback(*a, &b) + end + execute_callbacks + self + end + + # Callbacks are called when you enter (or are in) a :succeeded state. + def callback(*a, &b) + stateback(:succeeded, *a, &b) + end + + # Errbacks are called when you enter (or are in) a :failed state. + def errback(*a, &b) + stateback(:failed, *a, &b) + end + + # Completions are called when you enter (or are in) either a :failed or a + # :succeeded state. They are stored as a special (reserved) state called + # :completed. + def completion(*a, &b) + stateback(:completed, *a, &b) + end + + # Enter a new state, setting the result value if given. If the state is one + # of :succeeded or :failed, then :completed callbacks will also be called. + def change_state(state, *args) + @value = args + @state = state + + EM.schedule { execute_callbacks } + end + + # The old EM method: + alias set_deferred_status change_state + + # Indicates that we've reached some kind of completion state, by default + # this is :succeeded or :failed. Due to these semantics, the :completed + # state is reserved for internal use. + def completed? + completion_states.any? { |s| state == s } + end + + # Completion states simply returns a list of completion states, by default + # this is :succeeded and :failed. + def completion_states + [:succeeded, :failed] + end + + # Schedule a time which if passes before we enter a completion state, this + # deferrable will be failed with the given arguments. + def timeout(time, *args) + cancel_timeout + @timeout_timer = EM::Timer.new(time) do + fail(*args) unless completed? + end + end + + # Disable the timeout + def cancel_timeout + if @timeout_timer + @timeout_timer.cancel + @timeout_timer = nil + end + end + + # Remove an errback. N.B. Some errbacks cannot be deleted. Usage is NOT + # recommended, this is an anti-pattern. + def cancel_errback(*a, &b) + @callbacks[:failed].delete(EM::Callback(*a, &b)) + end + + # Remove a callback. N.B. Some callbacks cannot be deleted. Usage is NOT + # recommended, this is an anti-pattern. + def cancel_callback(*a, &b) + @callbacks[:succeeded].delete(EM::Callback(*a, &b)) + end + + private + # Execute all callbacks for the current state. If in a completed state, then + # call any statebacks associated with the completed state. + def execute_callbacks + execute_state_callbacks(state) + if completed? + execute_state_callbacks(:completed) + clear_dead_callbacks + cancel_timeout + end + end + + # Iterate all callbacks for a given state, and remove then call them. + def execute_state_callbacks(state) + while callback = @callbacks[state].shift + callback.call(*value) + end + end + + # If we enter a completion state, clear other completion states after all + # callback chains are completed. This means that operation specific + # callbacks can't be dual-called, which is most common user error. + def clear_dead_callbacks + completion_states.each do |state| + @callbacks[state].clear + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/connection.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/connection.rb new file mode 100644 index 0000000..267aec2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/connection.rb @@ -0,0 +1,770 @@ +module EventMachine + class FileNotFoundException < Exception + end + + # EventMachine::Connection is a class that is instantiated + # by EventMachine's processing loop whenever a new connection + # is created. (New connections can be either initiated locally + # to a remote server or accepted locally from a remote client.) + # When a Connection object is instantiated, it mixes in + # the functionality contained in the user-defined module + # specified in calls to {EventMachine.connect} or {EventMachine.start_server}. + # User-defined handler modules may redefine any or all of the standard + # methods defined here, as well as add arbitrary additional code + # that will also be mixed in. + # + # EventMachine manages one object inherited from EventMachine::Connection + # (and containing the mixed-in user code) for every network connection + # that is active at any given time. + # The event loop will automatically call methods on EventMachine::Connection + # objects whenever specific events occur on the corresponding connections, + # as described below. + # + # This class is never instantiated by user code, and does not publish an + # initialize method. The instance methods of EventMachine::Connection + # which may be called by the event loop are: + # + # * {#post_init} + # * {#connection_completed} + # * {#receive_data} + # * {#unbind} + # * {#ssl_verify_peer} (if TLS is used) + # * {#ssl_handshake_completed} + # + # All of the other instance methods defined here are called only by user code. + # + # @see file:docs/GettingStarted.md EventMachine tutorial + class Connection + # @private + attr_accessor :signature + + # @private + alias original_method method + + # Override .new so subclasses don't have to call super and can ignore + # connection-specific arguments + # + # @private + def self.new(sig, *args) + allocate.instance_eval do + # Store signature + @signature = sig + # associate_callback_target sig + + # Call a superclass's #initialize if it has one + initialize(*args) + + # post initialize callback + post_init + + self + end + end + + # Stubbed initialize so legacy superclasses can safely call super + # + # @private + def initialize(*args) + end + + # Called by the event loop immediately after the network connection has been established, + # and before resumption of the network loop. + # This method is generally not called by user code, but is called automatically + # by the event loop. The base-class implementation is a no-op. + # This is a very good place to initialize instance variables that will + # be used throughout the lifetime of the network connection. + # + # @see #connection_completed + # @see #unbind + # @see #send_data + # @see #receive_data + def post_init + end + + # Called by the event loop whenever data has been received by the network connection. + # It is never called by user code. {#receive_data} is called with a single parameter, a String containing + # the network protocol data, which may of course be binary. You will + # generally redefine this method to perform your own processing of the incoming data. + # + # Here's a key point which is essential to understanding the event-driven + # programming model: EventMachine knows absolutely nothing about the protocol + # which your code implements. You must not make any assumptions about + # the size of the incoming data packets, or about their alignment on any + # particular intra-message or PDU boundaries (such as line breaks). + # receive_data can and will send you arbitrary chunks of data, with the + # only guarantee being that the data is presented to your code in the order + # it was collected from the network. Don't even assume that the chunks of + # data will correspond to network packets, as EventMachine can and will coalesce + # several incoming packets into one, to improve performance. The implication for your + # code is that you generally will need to implement some kind of a state machine + # in your redefined implementation of receive_data. For a better understanding + # of this, read through the examples of specific protocol handlers in EventMachine::Protocols + # + # The base-class implementation (which will be invoked only if you didn't override it in your protocol handler) + # simply prints incoming data packet size to stdout. + # + # @param [String] data Opaque incoming data. + # @note Depending on the protocol, buffer sizes and OS networking stack configuration, incoming data may or may not be "a complete message". + # It is up to this handler to detect content boundaries to determine whether all the content (for example, full HTTP request) + # has been received and can be processed. + # + # @see #post_init + # @see #connection_completed + # @see #unbind + # @see #send_data + # @see file:docs/GettingStarted.md EventMachine tutorial + def receive_data data + puts "............>>>#{data.length}" + end + + # Called by EventMachine when the SSL/TLS handshake has + # been completed, as a result of calling #start_tls to initiate SSL/TLS on the connection. + # + # This callback exists because {#post_init} and {#connection_completed} are **not** reliable + # for indicating when an SSL/TLS connection is ready to have its certificate queried for. + # + # @see #get_peer_cert + def ssl_handshake_completed + end + + # Called by EventMachine when :verify_peer => true has been passed to {#start_tls}. + # It will be called with each certificate in the certificate chain provided by the remote peer. + # + # The cert will be passed as a String in PEM format, the same as in {#get_peer_cert}. It is up to user defined + # code to perform a check on the certificates. The return value from this callback is used to accept or deny the peer. + # A return value that is not nil or false triggers acceptance. If the peer is not accepted, the connection + # will be subsequently closed. + # + # @example This server always accepts all peers + # + # module AcceptServer + # def post_init + # start_tls(:verify_peer => true) + # end + # + # def ssl_verify_peer(cert) + # true + # end + # + # def ssl_handshake_completed + # $server_handshake_completed = true + # end + # end + # + # + # @example This server never accepts any peers + # + # module DenyServer + # def post_init + # start_tls(:verify_peer => true) + # end + # + # def ssl_verify_peer(cert) + # # Do not accept the peer. This should now cause the connection to shut down + # # without the SSL handshake being completed. + # false + # end + # + # def ssl_handshake_completed + # $server_handshake_completed = true + # end + # end + # + # @see #start_tls + def ssl_verify_peer(cert) + end + + # called by the framework whenever a connection (either a server or client connection) is closed. + # The close can occur because your code intentionally closes it (using {#close_connection} and {#close_connection_after_writing}), + # because the remote peer closed the connection, or because of a network error. + # You may not assume that the network connection is still open and able to send or + # receive data when the callback to unbind is made. This is intended only to give + # you a chance to clean up associations your code may have made to the connection + # object while it was open. + # + # If you want to detect which peer has closed the connection, you can override {#close_connection} in your protocol handler + # and set an @ivar. + # + # @example Overriding Connection#close_connection to distinguish connections closed on our side + # + # class MyProtocolHandler < EventMachine::Connection + # + # # ... + # + # def close_connection(*args) + # @intentionally_closed_connection = true + # super(*args) + # end + # + # def unbind + # if @intentionally_closed_connection + # # ... + # end + # end + # + # # ... + # + # end + # + # @see #post_init + # @see #connection_completed + # @see file:docs/GettingStarted.md EventMachine tutorial + def unbind + end + + # Called by the reactor after attempting to relay incoming data to a descriptor (set as a proxy target descriptor with + # {EventMachine.enable_proxy}) that has already been closed. + # + # @see EventMachine.enable_proxy + def proxy_target_unbound + end + + # called when the reactor finished proxying all + # of the requested bytes. + def proxy_completed + end + + # EventMachine::Connection#proxy_incoming_to is called only by user code. It sets up + # a low-level proxy relay for all data inbound for this connection, to the connection given + # as the argument. This is essentially just a helper method for enable_proxy. + # + # @see EventMachine.enable_proxy + def proxy_incoming_to(conn,bufsize=0) + EventMachine::enable_proxy(self, conn, bufsize) + end + + # A helper method for {EventMachine.disable_proxy} + def stop_proxying + EventMachine::disable_proxy(self) + end + + # The number of bytes proxied to another connection. Reset to zero when + # EventMachine::Connection#proxy_incoming_to is called, and incremented whenever data is proxied. + def get_proxied_bytes + EventMachine::get_proxied_bytes(@signature) + end + + # EventMachine::Connection#close_connection is called only by user code, and never + # by the event loop. You may call this method against a connection object in any + # callback handler, whether or not the callback was made against the connection + # you want to close. close_connection schedules the connection to be closed + # at the next available opportunity within the event loop. You may not assume that + # the connection is closed when close_connection returns. In particular, the framework + # will callback the unbind method for the particular connection at a point shortly + # after you call close_connection. You may assume that the unbind callback will + # take place sometime after your call to close_connection completes. In other words, + # the unbind callback will not re-enter your code "inside" of your call to close_connection. + # However, it's not guaranteed that a future version of EventMachine will not change + # this behavior. + # + # {#close_connection} will *silently discard* any outbound data which you have + # sent to the connection using {EventMachine::Connection#send_data} but which has not + # yet been sent across the network. If you want to avoid this behavior, use + # {EventMachine::Connection#close_connection_after_writing}. + # + def close_connection after_writing = false + EventMachine::close_connection @signature, after_writing + end + + # Removes given connection from the event loop. + # The connection's socket remains open and its file descriptor number is returned. + def detach + EventMachine::detach_fd @signature + end + + def get_sock_opt level, option + EventMachine::get_sock_opt @signature, level, option + end + + def set_sock_opt level, optname, optval + EventMachine::set_sock_opt @signature, level, optname, optval + end + + # A variant of {#close_connection}. + # All of the descriptive comments given for close_connection also apply to + # close_connection_after_writing, *with one exception*: if the connection has + # outbound data sent using send_dat but which has not yet been sent across the network, + # close_connection_after_writing will schedule the connection to be closed *after* + # all of the outbound data has been safely written to the remote peer. + # + # Depending on the amount of outgoing data and the speed of the network, + # considerable time may elapse between your call to close_connection_after_writing + # and the actual closing of the socket (at which time the unbind callback will be called + # by the event loop). During this time, you *may not* call send_data to transmit + # additional data (that is, the connection is closed for further writes). In very + # rare cases, you may experience a receive_data callback after your call to {#close_connection_after_writing}, + # depending on whether incoming data was in the process of being received on the connection + # at the moment when you called {#close_connection_after_writing}. Your protocol handler must + # be prepared to properly deal with such data (probably by ignoring it). + # + # @see #close_connection + # @see #send_data + def close_connection_after_writing + close_connection true + end + + # Call this method to send data to the remote end of the network connection. It takes a single String argument, + # which may contain binary data. Data is buffered to be sent at the end of this event loop tick (cycle). + # + # When used in a method that is event handler (for example, {#post_init} or {#connection_completed}, it will send + # data to the other end of the connection that generated the event. + # You can also call {#send_data} to write to other connections. For more information see The Chat Server Example in the + # {file:docs/GettingStarted.md EventMachine tutorial}. + # + # If you want to send some data and then immediately close the connection, make sure to use {#close_connection_after_writing} + # instead of {#close_connection}. + # + # + # @param [String] data Data to send asynchronously + # + # @see file:docs/GettingStarted.md EventMachine tutorial + # @see Connection#receive_data + # @see Connection#post_init + # @see Connection#unbind + def send_data data + data = data.to_s + size = data.bytesize if data.respond_to?(:bytesize) + size ||= data.size + EventMachine::send_data @signature, data, size + end + + # Returns true if the connection is in an error state, false otherwise. + # + # In general, you can detect the occurrence of communication errors or unexpected + # disconnection by the remote peer by handing the {#unbind} method. In some cases, however, + # it's useful to check the status of the connection using {#error?} before attempting to send data. + # This function is synchronous but it will return immediately without blocking. + # + # @return [Boolean] true if the connection is in an error state, false otherwise + def error? + errno = EventMachine::report_connection_error_status(@signature) + case errno + when 0 + false + when -1 + true + else + EventMachine::ERRNOS[errno] + end + end + + # Called by the event loop when a remote TCP connection attempt completes successfully. + # You can expect to get this notification after calls to {EventMachine.connect}. Remember that EventMachine makes remote connections + # asynchronously, just as with any other kind of network event. This method + # is intended primarily to assist with network diagnostics. For normal protocol + # handling, use #post_init to perform initial work on a new connection (such as sending initial set of data). + # {Connection#post_init} will always be called. This method will only be called in case of a successful completion. + # A connection attempt which fails will result a call to {Connection#unbind} after the failure. + # + # @see Connection#post_init + # @see Connection#unbind + # @see file:docs/GettingStarted.md EventMachine tutorial + def connection_completed + end + + # Call {#start_tls} at any point to initiate TLS encryption on connected streams. + # The method is smart enough to know whether it should perform a server-side + # or a client-side handshake. An appropriate place to call {#start_tls} is in + # your redefined {#post_init} method, or in the {#connection_completed} handler for + # an outbound connection. + # + # + # @option args [String] :cert_chain_file (nil) local path of a readable file that contants a chain of X509 certificates in + # the [PEM format](http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail), + # with the most-resolved certificate at the top of the file, successive intermediate + # certs in the middle, and the root (or CA) cert at the bottom. + # + # @option args [String] :private_key_file (nil) local path of a readable file that must contain a private key in the [PEM format](http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail). + # + # @option args [Boolean] :verify_peer (false) indicates whether a server should request a certificate from a peer, to be verified by user code. + # If true, the {#ssl_verify_peer} callback on the {EventMachine::Connection} object is called with each certificate + # in the certificate chain provided by the peer. See documentation on {#ssl_verify_peer} for how to use this. + # + # @option args [Boolean] :fail_if_no_peer_cert (false) Used in conjunction with verify_peer. If set the SSL handshake will be terminated if the peer does not provide a certificate. + # + # + # @option args [String] :cipher_list ("ALL:!ADH:!LOW:!EXP:!DES-CBC3-SHA:@STRENGTH") indicates the available SSL cipher values. Default value is "ALL:!ADH:!LOW:!EXP:!DES-CBC3-SHA:@STRENGTH". Check the format of the OpenSSL cipher string at http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT. + # + # @option args [String] :ecdh_curve (nil) The curve for ECDHE ciphers. See available ciphers with 'openssl ecparam -list_curves' + # + # @option args [String] :dhparam (nil) The local path of a file containing DH parameters for EDH ciphers in [PEM format](http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail) See: 'openssl dhparam' + # + # @option args [Array] :ssl_version (TLSv1 TLSv1_1 TLSv1_2) indicates the allowed SSL/TLS versions. Possible values are: {SSLv2}, {SSLv3}, {TLSv1}, {TLSv1_1}, {TLSv1_2}. + # + # @example Using TLS with EventMachine + # + # require 'rubygems' + # require 'eventmachine' + # + # module Handler + # def post_init + # start_tls(:private_key_file => '/tmp/server.key', :cert_chain_file => '/tmp/server.crt', :verify_peer => false) + # end + # end + # + # EventMachine.run do + # EventMachine.start_server("127.0.0.1", 9999, Handler) + # end + # + # @param [Hash] args + # + # @todo support passing an encryption parameter, which can be string or Proc, to get a passphrase + # for encrypted private keys. + # @todo support passing key material via raw strings or Procs that return strings instead of + # just filenames. + # + # @see #ssl_verify_peer + def start_tls args={} + priv_key = args[:private_key_file] + cert_chain = args[:cert_chain_file] + verify_peer = args[:verify_peer] + sni_hostname = args[:sni_hostname] + cipher_list = args[:cipher_list] + ssl_version = args[:ssl_version] + ecdh_curve = args[:ecdh_curve] + dhparam = args[:dhparam] + fail_if_no_peer_cert = args[:fail_if_no_peer_cert] + + [priv_key, cert_chain].each do |file| + next if file.nil? or file.empty? + raise FileNotFoundException, + "Could not find #{file} for start_tls" unless File.exist? file + end + + protocols_bitmask = 0 + if ssl_version.nil? + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1 + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1_1 + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1_2 + else + [ssl_version].flatten.each do |p| + case p.to_s.downcase + when 'sslv2' + protocols_bitmask |= EventMachine::EM_PROTO_SSLv2 + when 'sslv3' + protocols_bitmask |= EventMachine::EM_PROTO_SSLv3 + when 'tlsv1' + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1 + when 'tlsv1_1' + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1_1 + when 'tlsv1_2' + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1_2 + else + raise("Unrecognized SSL/TLS Protocol: #{p}") + end + end + end + + EventMachine::set_tls_parms(@signature, priv_key || '', cert_chain || '', verify_peer, fail_if_no_peer_cert, sni_hostname || '', cipher_list || '', ecdh_curve || '', dhparam || '', protocols_bitmask) + EventMachine::start_tls @signature + end + + # If [TLS](http://en.wikipedia.org/wiki/Transport_Layer_Security) is active on the connection, returns the remote [X509 certificate](http://en.wikipedia.org/wiki/X.509) + # as a string, in the popular [PEM format](http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail). This can then be used for arbitrary validation + # of a peer's certificate in your code. + # + # This should be called in/after the {#ssl_handshake_completed} callback, which indicates + # that SSL/TLS is active. Using this callback is important, because the certificate may not + # be available until the time it is executed. Using #post_init or #connection_completed is + # not adequate, because the SSL handshake may still be taking place. + # + # This method will return `nil` if: + # + # * EventMachine is not built with [OpenSSL](http://www.openssl.org) support + # * [TLS](http://en.wikipedia.org/wiki/Transport_Layer_Security) is not active on the connection + # * TLS handshake is not yet complete + # * Remote peer for any other reason has not presented a certificate + # + # + # @example Getting peer TLS certificate information in EventMachine + # + # module Handler + # def post_init + # puts "Starting TLS" + # start_tls + # end + # + # def ssl_handshake_completed + # puts get_peer_cert + # close_connection + # end + # + # def unbind + # EventMachine::stop_event_loop + # end + # end + # + # EventMachine.run do + # EventMachine.connect "mail.google.com", 443, Handler + # end + # + # # Will output: + # # -----BEGIN CERTIFICATE----- + # # MIIDIjCCAougAwIBAgIQbldpChBPqv+BdPg4iwgN8TANBgkqhkiG9w0BAQUFADBM + # # MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg + # # THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wODA1MDIxNjMyNTRaFw0w + # # OTA1MDIxNjMyNTRaMGkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh + # # MRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRgw + # # FgYDVQQDEw9tYWlsLmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ + # # AoGBALlkxdh2QXegdElukCSOV2+8PKiONIS+8Tu9K7MQsYpqtLNC860zwOPQ2NLI + # # 3Zp4jwuXVTrtzGuiqf5Jioh35Ig3CqDXtLyZoypjZUQcq4mlLzHlhIQ4EhSjDmA7 + # # Ffw9y3ckSOQgdBQWNLbquHh9AbEUjmhkrYxIqKXeCnRKhv6nAgMBAAGjgecwgeQw + # # KAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUFBwMCBglghkgBhvhCBAEwNgYDVR0f + # # BC8wLTAroCmgJ4YlaHR0cDovL2NybC50aGF3dGUuY29tL1RoYXd0ZVNHQ0NBLmNy + # # bDByBggrBgEFBQcBAQRmMGQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnRoYXd0 + # # ZS5jb20wPgYIKwYBBQUHMAKGMmh0dHA6Ly93d3cudGhhd3RlLmNvbS9yZXBvc2l0 + # # b3J5L1RoYXd0ZV9TR0NfQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEF + # # BQADgYEAsRwpLg1dgCR1gYDK185MFGukXMeQFUvhGqF8eT/CjpdvezyKVuz84gSu + # # 6ccMXgcPQZGQN/F4Xug+Q01eccJjRSVfdvR5qwpqCj+6BFl5oiKDBsveSkrmL5dz + # # s2bn7TdTSYKcLeBkjXxDLHGBqLJ6TNCJ3c4/cbbG5JhGvoema94= + # # -----END CERTIFICATE----- + # + # You can do whatever you want with the certificate String, such as load it + # as a certificate object using the OpenSSL library, and check its fields. + # + # @return [String] the remote [X509 certificate](http://en.wikipedia.org/wiki/X.509), in the popular [PEM format](http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail), + # if TLS is active on the connection + # + # @see Connection#start_tls + # @see Connection#ssl_handshake_completed + def get_peer_cert + EventMachine::get_peer_cert @signature + end + + def get_cipher_bits + EventMachine::get_cipher_bits @signature + end + + def get_cipher_name + EventMachine::get_cipher_name @signature + end + + def get_cipher_protocol + EventMachine::get_cipher_protocol @signature + end + + def get_sni_hostname + EventMachine::get_sni_hostname @signature + end + + # Sends UDP messages. + # + # This method may be called from any Connection object that refers + # to an open datagram socket (see EventMachine#open_datagram_socket). + # The method sends a UDP (datagram) packet containing the data you specify, + # to a remote peer specified by the IP address and port that you give + # as parameters to the method. + # Observe that you may send a zero-length packet (empty string). + # However, you may not send an arbitrarily-large data packet because + # your operating system will enforce a platform-specific limit on + # the size of the outbound packet. (Your kernel + # will respond in a platform-specific way if you send an overlarge + # packet: some will send a truncated packet, some will complain, and + # some will silently drop your request). + # On LANs, it's usually OK to send datagrams up to about 4000 bytes in length, + # but to be really safe, send messages smaller than the Ethernet-packet + # size (typically about 1400 bytes). Some very restrictive WANs + # will either drop or truncate packets larger than about 500 bytes. + # + # @param [String] data Data to send asynchronously + # @param [String] recipient_address IP address of the recipient + # @param [String] recipient_port Port of the recipient + def send_datagram data, recipient_address, recipient_port + data = data.to_s + size = data.bytesize if data.respond_to?(:bytesize) + size ||= data.size + EventMachine::send_datagram @signature, data, size, recipient_address, Integer(recipient_port) + end + + + # This method is used with stream-connections to obtain the identity + # of the remotely-connected peer. If a peername is available, this method + # returns a sockaddr structure. The method returns nil if no peername is available. + # You can use Socket.unpack_sockaddr_in and its variants to obtain the + # values contained in the peername structure returned from #get_peername. + # + # @example How to get peer IP address and port with EventMachine + # + # require 'socket' + # + # module Handler + # def receive_data data + # port, ip = Socket.unpack_sockaddr_in(get_peername) + # puts "got #{data.inspect} from #{ip}:#{port}" + # end + # end + def get_peername + EventMachine::get_peername @signature + end + + # Used with stream-connections to obtain the identity + # of the local side of the connection. If a local name is available, this method + # returns a sockaddr structure. The method returns nil if no local name is available. + # You can use {Socket.unpack_sockaddr_in} and its variants to obtain the + # values contained in the local-name structure returned from this method. + # + # @example + # + # require 'socket' + # + # module Handler + # def receive_data data + # port, ip = Socket.unpack_sockaddr_in(get_sockname) + # puts "got #{data.inspect}" + # end + # end + def get_sockname + EventMachine::get_sockname @signature + end + + # Returns the PID (kernel process identifier) of a subprocess + # associated with this Connection object. For use with {EventMachine.popen} + # and similar methods. Returns nil when there is no meaningful subprocess. + # + # @return [Integer] + def get_pid + EventMachine::get_subprocess_pid @signature + end + + # Returns a subprocess exit status. Only useful for {EventMachine.popen}. Call it in your + # {#unbind} handler. + # + # @return [Integer] + def get_status + EventMachine::get_subprocess_status @signature + end + + # The number of seconds since the last send/receive activity on this connection. + def get_idle_time + EventMachine::get_idle_time @signature + end + + # comm_inactivity_timeout returns the current value (float in seconds) of the inactivity-timeout + # property of network-connection and datagram-socket objects. A nonzero value + # indicates that the connection or socket will automatically be closed if no read or write + # activity takes place for at least that number of seconds. + # A zero value (the default) specifies that no automatic timeout will take place. + def comm_inactivity_timeout + EventMachine::get_comm_inactivity_timeout @signature + end + + # Allows you to set the inactivity-timeout property for + # a network connection or datagram socket. Specify a non-negative float value in seconds. + # If the value is greater than zero, the connection or socket will automatically be closed + # if no read or write activity takes place for at least that number of seconds. + # Specify a value of zero to indicate that no automatic timeout should take place. + # Zero is the default value. + def comm_inactivity_timeout= value + EventMachine::set_comm_inactivity_timeout @signature, value.to_f + end + alias set_comm_inactivity_timeout comm_inactivity_timeout= + + # The duration after which a TCP connection in the connecting state will fail. + # It is important to distinguish this value from {EventMachine::Connection#comm_inactivity_timeout}, + # which looks at how long since data was passed on an already established connection. + # The value is a float in seconds. + # + # @return [Float] The duration after which a TCP connection in the connecting state will fail, in seconds. + def pending_connect_timeout + EventMachine::get_pending_connect_timeout @signature + end + + # Sets the duration after which a TCP connection in a + # connecting state will fail. + # + # @param [Float, #to_f] value Connection timeout in seconds + def pending_connect_timeout= value + EventMachine::set_pending_connect_timeout @signature, value.to_f + end + alias set_pending_connect_timeout pending_connect_timeout= + + # Reconnect to a given host/port with the current instance + # + # @param [String] server Hostname or IP address + # @param [Integer] port Port to reconnect to + def reconnect server, port + EventMachine::reconnect server, port, self + end + + + # Like {EventMachine::Connection#send_data}, this sends data to the remote end of + # the network connection. {EventMachine::Connection#send_file_data} takes a + # filename as an argument, though, and sends the contents of the file, in one + # chunk. + # + # @param [String] filename Local path of the file to send + # + # @see #send_data + # @author Kirk Haines + def send_file_data filename + EventMachine::send_file_data @signature, filename + end + + # Open a file on the filesystem and send it to the remote peer. This returns an + # object of type {EventMachine::Deferrable}. The object's callbacks will be executed + # on the reactor main thread when the file has been completely scheduled for + # transmission to the remote peer. Its errbacks will be called in case of an error (such as file-not-found). + # This method employs various strategies to achieve the fastest possible performance, + # balanced against minimum consumption of memory. + # + # Warning: this feature has an implicit dependency on an outboard extension, + # evma_fastfilereader. You must install this extension in order to use {#stream_file_data} + # with files larger than a certain size (currently 8192 bytes). + # + # @option args [Boolean] :http_chunks (false) If true, this method will stream the file data in a format + # compatible with the HTTP chunked-transfer encoding + # + # @param [String] filename Local path of the file to stream + # @param [Hash] args Options + # + # @return [EventMachine::Deferrable] + def stream_file_data filename, args={} + EventMachine::FileStreamer.new( self, filename, args ) + end + + # Watches connection for readability. Only possible if the connection was created + # using {EventMachine.attach} and had {EventMachine.notify_readable}/{EventMachine.notify_writable} defined on the handler. + # + # @see #notify_readable? + def notify_readable= mode + EventMachine::set_notify_readable @signature, mode + end + + # @return [Boolean] true if the connection is being watched for readability. + def notify_readable? + EventMachine::is_notify_readable @signature + end + + # Watches connection for writeability. Only possible if the connection was created + # using {EventMachine.attach} and had {EventMachine.notify_readable}/{EventMachine.notify_writable} defined on the handler. + # + # @see #notify_writable? + def notify_writable= mode + EventMachine::set_notify_writable @signature, mode + end + + # Returns true if the connection is being watched for writability. + def notify_writable? + EventMachine::is_notify_writable @signature + end + + # Pause a connection so that {#send_data} and {#receive_data} events are not fired until {#resume} is called. + # @see #resume + def pause + EventMachine::pause_connection @signature + end + + # Resume a connection's {#send_data} and {#receive_data} events. + # @see #pause + def resume + EventMachine::resume_connection @signature + end + + # @return [Boolean] true if the connect was paused using {EventMachine::Connection#pause}. + # @see #pause + # @see #resume + def paused? + EventMachine::connection_paused? @signature + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/deferrable.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/deferrable.rb new file mode 100644 index 0000000..18a6d31 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/deferrable.rb @@ -0,0 +1,210 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 Jul 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Deferrable + autoload :Pool, 'em/deferrable/pool' + + # Specify a block to be executed if and when the Deferrable object receives + # a status of :succeeded. See #set_deferred_status for more information. + # + # Calling this method on a Deferrable object whose status is not yet known + # will cause the callback block to be stored on an internal list. + # If you call this method on a Deferrable whose status is :succeeded, the + # block will be executed immediately, receiving the parameters given to the + # prior #set_deferred_status call. + # + #-- + # If there is no status, add a callback to an internal list. + # If status is succeeded, execute the callback immediately. + # If status is failed, do nothing. + # + def callback &block + return unless block + @deferred_status ||= :unknown + if @deferred_status == :succeeded + block.call(*@deferred_args) + elsif @deferred_status != :failed + @callbacks ||= [] + @callbacks.unshift block # << block + end + self + end + + # Cancels an outstanding callback to &block if any. Undoes the action of #callback. + # + def cancel_callback block + @callbacks ||= [] + @callbacks.delete block + end + + # Specify a block to be executed if and when the Deferrable object receives + # a status of :failed. See #set_deferred_status for more information. + #-- + # If there is no status, add an errback to an internal list. + # If status is failed, execute the errback immediately. + # If status is succeeded, do nothing. + # + def errback &block + return unless block + @deferred_status ||= :unknown + if @deferred_status == :failed + block.call(*@deferred_args) + elsif @deferred_status != :succeeded + @errbacks ||= [] + @errbacks.unshift block # << block + end + self + end + + # Cancels an outstanding errback to &block if any. Undoes the action of #errback. + # + def cancel_errback block + @errbacks ||= [] + @errbacks.delete block + end + + # Sets the "disposition" (status) of the Deferrable object. See also the large set of + # sugarings for this method. + # Note that if you call this method without arguments, + # no arguments will be passed to the callback/errback. + # If the user has coded these with arguments, then the + # user code will throw an argument exception. + # Implementors of deferrable classes must + # document the arguments they will supply to user callbacks. + # + # OBSERVE SOMETHING VERY SPECIAL here: you may call this method even + # on the INSIDE of a callback. This is very useful when a previously-registered + # callback wants to change the parameters that will be passed to subsequently-registered + # ones. + # + # You may give either :succeeded or :failed as the status argument. + # + # If you pass :succeeded, then all of the blocks passed to the object using the #callback + # method (if any) will be executed BEFORE the #set_deferred_status method returns. All of the blocks + # passed to the object using #errback will be discarded. + # + # If you pass :failed, then all of the blocks passed to the object using the #errback + # method (if any) will be executed BEFORE the #set_deferred_status method returns. All of the blocks + # passed to the object using # callback will be discarded. + # + # If you pass any arguments to #set_deferred_status in addition to the status argument, + # they will be passed as arguments to any callbacks or errbacks that are executed. + # It's your responsibility to ensure that the argument lists specified in your callbacks and + # errbacks match the arguments given in calls to #set_deferred_status, otherwise Ruby will raise + # an ArgumentError. + # + #-- + # We're shifting callbacks off and discarding them as we execute them. + # This is valid because by definition callbacks are executed no more than + # once. It also has the magic effect of permitting recursive calls, which + # means that a callback can call #set_deferred_status and change the parameters + # that will be sent to subsequent callbacks down the chain. + # + # Changed @callbacks and @errbacks from push/shift to unshift/pop, per suggestion + # by Kirk Haines, to work around the memory leak bug that still exists in many Ruby + # versions. + # + # Changed 15Sep07: after processing callbacks or errbacks, CLEAR the other set of + # handlers. This gets us a little closer to the behavior of Twisted's "deferred," + # which only allows status to be set once. Prior to making this change, it was possible + # to "succeed" a Deferrable (triggering its callbacks), and then immediately "fail" it, + # triggering its errbacks! That is clearly undesirable, but it's just as undesirable + # to raise an exception is status is set more than once on a Deferrable. The latter + # behavior would invalidate the idiom of resetting arguments by setting status from + # within a callback or errback, but more seriously it would cause spurious errors + # if a Deferrable was timed out and then an attempt was made to succeed it. See the + # comments under the new method #timeout. + # + def set_deferred_status status, *args + cancel_timeout + @errbacks ||= nil + @callbacks ||= nil + @deferred_status = status + @deferred_args = args + case @deferred_status + when :succeeded + if @callbacks + while cb = @callbacks.pop + cb.call(*@deferred_args) + end + end + @errbacks.clear if @errbacks + when :failed + if @errbacks + while eb = @errbacks.pop + eb.call(*@deferred_args) + end + end + @callbacks.clear if @callbacks + end + end + + + # Setting a timeout on a Deferrable causes it to go into the failed state after + # the Timeout expires (passing no arguments to the object's errbacks). + # Setting the status at any time prior to a call to the expiration of the timeout + # will cause the timer to be cancelled. + def timeout seconds, *args + cancel_timeout + me = self + @deferred_timeout = EventMachine::Timer.new(seconds) {me.fail(*args)} + self + end + + # Cancels an outstanding timeout if any. Undoes the action of #timeout. + # + def cancel_timeout + @deferred_timeout ||= nil + if @deferred_timeout + @deferred_timeout.cancel + @deferred_timeout = nil + end + end + + + # Sugar for set_deferred_status(:succeeded, ...) + # + def succeed *args + set_deferred_status :succeeded, *args + end + alias set_deferred_success succeed + + # Sugar for set_deferred_status(:failed, ...) + # + def fail *args + set_deferred_status :failed, *args + end + alias set_deferred_failure fail + end + + + # DefaultDeferrable is an otherwise empty class that includes Deferrable. + # This is very useful when you just need to return a Deferrable object + # as a way of communicating deferred status to some other part of a program. + class DefaultDeferrable + include Deferrable + end +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/deferrable/pool.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/deferrable/pool.rb new file mode 100644 index 0000000..3c278ee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/deferrable/pool.rb @@ -0,0 +1,2 @@ +warn "EM::Deferrable::Pool is deprecated, please use EM::Pool" +EM::Deferrable::Pool = EM::Pool \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/file_watch.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/file_watch.rb new file mode 100644 index 0000000..074ffed --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/file_watch.rb @@ -0,0 +1,73 @@ +module EventMachine + # Utility class that is useful for file monitoring. Supported events are + # + # * File is modified + # * File is deleted + # * File is moved + # + # @note On Mac OS X, file watching only works when kqueue is enabled + # + # @see EventMachine.watch_file + class FileWatch < Connection + # @private + Cmodified = 'modified'.freeze + # @private + Cdeleted = 'deleted'.freeze + # @private + Cmoved = 'moved'.freeze + + + # @private + def receive_data(data) + case data + when Cmodified + file_modified + when Cdeleted + file_deleted + when Cmoved + file_moved + end + end + + # Returns the path that is being monitored. + # + # @note Current implementation does not pick up on the new filename after a rename occurs. + # + # @return [String] + # @see EventMachine.watch_file + def path + @path + end + + # Will be called when the file is modified. Supposed to be redefined by subclasses. + # + # @abstract + def file_modified + end + + # Will be called when the file is deleted. Supposed to be redefined by subclasses. + # When the file is deleted, stop_watching will be called after this to make sure everything is + # cleaned up correctly. + # + # @note On Linux (with {http://en.wikipedia.org/wiki/Inotify inotify}), this method will not be called until *all* open file descriptors to + # the file have been closed. + # + # @abstract + def file_deleted + end + + # Will be called when the file is moved or renamed. Supposed to be redefined by subclasses. + # + # @abstract + def file_moved + end + + # Discontinue monitoring of the file. + # + # This involves cleaning up the underlying monitoring details with kqueue/inotify, and in turn firing {EventMachine::Connection#unbind}. + # This will be called automatically when a file is deleted. User code may call it as well. + def stop_watching + EventMachine::unwatch_filename(@signature) + end # stop_watching + end # FileWatch +end # EventMachine diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/future.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/future.rb new file mode 100644 index 0000000..4affbf5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/future.rb @@ -0,0 +1,61 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 Jul 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +#-- +# This defines EventMachine::Deferrable#future, which requires +# that the rest of EventMachine::Deferrable has already been seen. +# (It's in deferrable.rb.) + +module EventMachine + module Deferrable + + # A future is a sugaring of a typical deferrable usage. + #-- + # Evaluate arg (which may be an expression or a block). + # What's the class of arg? + # If arg is an ordinary expression, then return it. + # If arg is deferrable (responds to :set_deferred_status), + # then look at the arguments. If either callback or errback + # are defined, then use them. If neither are defined, then + # use the supplied block (if any) as the callback. + # Then return arg. + def self.future arg, cb=nil, eb=nil, &blk + arg = arg.call if arg.respond_to?(:call) + + if arg.respond_to?(:set_deferred_status) + if cb || eb + arg.callback(&cb) if cb + arg.errback(&eb) if eb + else + arg.callback(&blk) if blk + end + end + + arg + end + + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/iterator.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/iterator.rb new file mode 100644 index 0000000..a30b9dd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/iterator.rb @@ -0,0 +1,252 @@ +module EventMachine + # A simple iterator for concurrent asynchronous work. + # + # Unlike ruby's built-in iterators, the end of the current iteration cycle is signaled manually, + # instead of happening automatically after the yielded block finishes executing. For example: + # + # (0..10).each{ |num| } + # + # becomes: + # + # EM::Iterator.new(0..10).each{ |num,iter| iter.next } + # + # This is especially useful when doing asynchronous work via reactor libraries and + # functions. For example, given a sync and async http api: + # + # response = sync_http_get(url); ... + # async_http_get(url){ |response| ... } + # + # a synchronous iterator such as: + # + # responses = urls.map{ |url| sync_http_get(url) } + # ... + # puts 'all done!' + # + # could be written as: + # + # EM::Iterator.new(urls).map(proc{ |url,iter| + # async_http_get(url){ |res| + # iter.return(res) + # } + # }, proc{ |responses| + # ... + # puts 'all done!' + # }) + # + # Now, you can take advantage of the asynchronous api to issue requests in parallel. For example, + # to fetch 10 urls at a time, simply pass in a concurrency of 10: + # + # EM::Iterator.new(urls, 10).each do |url,iter| + # async_http_get(url){ iter.next } + # end + # + class Iterator + Stop = "EM::Stop" + # Create a new parallel async iterator with specified concurrency. + # + # i = EM::Iterator.new(1..100, 10) + # + # will create an iterator over the range that processes 10 items at a time. Iteration + # is started via #each, #map or #inject + # + # The list may either be an array-like object, or a proc that returns a new object + # to be processed each time it is called. If a proc is used, it must return + # EventMachine::Iterator::Stop to signal the end of the iterations. + # + def initialize(list, concurrency = 1) + raise ArgumentError, 'concurrency must be bigger than zero' unless (concurrency > 0) + if list.respond_to?(:call) + @list = nil + @list_proc = list + elsif list.respond_to?(:to_a) + @list = list.to_a.dup + @list_proc = nil + else + raise ArgumentError, 'argument must be a proc or an array' + end + @concurrency = concurrency + + @started = false + @ended = false + end + + # Change the concurrency of this iterator. Workers will automatically be spawned or destroyed + # to accomodate the new concurrency level. + # + def concurrency=(val) + old = @concurrency + @concurrency = val + + spawn_workers if val > old and @started and !@ended + end + attr_reader :concurrency + + # Iterate over a set of items using the specified block or proc. + # + # EM::Iterator.new(1..100).each do |num, iter| + # puts num + # iter.next + # end + # + # An optional second proc is invoked after the iteration is complete. + # + # EM::Iterator.new(1..100).each( + # proc{ |num,iter| iter.next }, + # proc{ puts 'all done' } + # ) + # + def each(foreach=nil, after=nil, &blk) + raise ArgumentError, 'proc or block required for iteration' unless foreach ||= blk + raise RuntimeError, 'cannot iterate over an iterator more than once' if @started or @ended + + @started = true + @pending = 0 + @workers = 0 + + all_done = proc{ + after.call if after and @ended and @pending == 0 + } + + @process_next = proc{ + # p [:process_next, :pending=, @pending, :workers=, @workers, :ended=, @ended, :concurrency=, @concurrency, :list=, @list] + unless @ended or @workers > @concurrency + item = next_item() + if item.equal?(Stop) + @ended = true + @workers -= 1 + all_done.call + else + @pending += 1 + + is_done = false + on_done = proc{ + raise RuntimeError, 'already completed this iteration' if is_done + is_done = true + + @pending -= 1 + + if @ended + all_done.call + else + EM.next_tick(@process_next) + end + } + class << on_done + alias :next :call + end + + foreach.call(item, on_done) + end + else + @workers -= 1 + end + } + + spawn_workers + + self + end + + # Collect the results of an asynchronous iteration into an array. + # + # EM::Iterator.new(%w[ pwd uptime uname date ], 2).map(proc{ |cmd,iter| + # EM.system(cmd){ |output,status| + # iter.return(output) + # } + # }, proc{ |results| + # p results + # }) + # + def map(foreach, after) + index = 0 + + inject([], proc{ |results,item,iter| + i = index + index += 1 + + is_done = false + on_done = proc{ |res| + raise RuntimeError, 'already returned a value for this iteration' if is_done + is_done = true + + results[i] = res + iter.return(results) + } + class << on_done + alias :return :call + def next + raise NoMethodError, 'must call #return on a map iterator' + end + end + + foreach.call(item, on_done) + }, proc{ |results| + after.call(results) + }) + end + + # Inject the results of an asynchronous iteration onto a given object. + # + # EM::Iterator.new(%w[ pwd uptime uname date ], 2).inject({}, proc{ |hash,cmd,iter| + # EM.system(cmd){ |output,status| + # hash[cmd] = status.exitstatus == 0 ? output.strip : nil + # iter.return(hash) + # } + # }, proc{ |results| + # p results + # }) + # + def inject(obj, foreach, after) + each(proc{ |item,iter| + is_done = false + on_done = proc{ |res| + raise RuntimeError, 'already returned a value for this iteration' if is_done + is_done = true + + obj = res + iter.next + } + class << on_done + alias :return :call + def next + raise NoMethodError, 'must call #return on an inject iterator' + end + end + + foreach.call(obj, item, on_done) + }, proc{ + after.call(obj) + }) + end + + private + + # Spawn workers to consume items from the iterator's enumerator based on the current concurrency level. + # + def spawn_workers + EM.next_tick(start_worker = proc{ + if @workers < @concurrency and !@ended + # p [:spawning_worker, :workers=, @workers, :concurrency=, @concurrency, :ended=, @ended] + @workers += 1 + @process_next.call + EM.next_tick(start_worker) + end + }) + nil + end + + # Return the next item from @list or @list_proc. + # Once items have run out, will return EM::Iterator::Stop. Procs must supply this themselves + def next_item + if @list_proc + @list_proc.call + else + @list.empty? ? Stop : @list.shift + end + end + end +end + +# TODO: pass in one object instead of two? .each{ |iter| puts iter.current; iter.next } +# TODO: support iter.pause/resume/stop/break/continue? +# TODO: create some exceptions instead of using RuntimeError diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/messages.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/messages.rb new file mode 100644 index 0000000..9a51c39 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/messages.rb @@ -0,0 +1,66 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 Jul 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +=begin + +Message Routing in EventMachine. + +The goal here is to enable "routing points," objects that can send and receive +"messages," which are delimited streams of bytes. The boundaries of a message +are preserved as it passes through the reactor system. + +There will be several module methods defined in EventMachine to create route-point +objects (which will probably have a base class of EventMachine::MessageRouter +until someone suggests a better name). + +As with I/O objects, routing objects will receive events by having the router +core call methods on them. And of course user code can and will define handlers +to deal with events of interest. + +The message router base class only really needs a receive_message method. There will +be an EM module-method to send messages, in addition to the module methods to create +the various kinds of message receivers. + +The simplest kind of message receiver object can receive messages by being named +explicitly in a parameter to EM#send_message. More sophisticated receivers can define +pub-sub selectors and message-queue names. And they can also define channels for +route-points in other processes or even on other machines. + +A message is NOT a marshallable entity. Rather, it's a chunk of flat content more like +an Erlang message. Initially, all content submitted for transmission as a message will +have the to_s method called on it. Eventually, we'll be able to transmit certain structured +data types (XML and YAML documents, Structs within limits) and have them reconstructed +on the other end. + +A fundamental goal of the message-routing capability is to interoperate seamlessly with +external systems, including non-Ruby systems like ActiveMQ. We will define various protocol +handlers for things like Stomp and possibly AMQP, but these will be wrapped up and hidden +from the users of the basic routing capability. + +As with Erlang, a critical goal is for programs that are built to use message-passing to work +WITHOUT CHANGE when the code is re-based on a multi-process system. + +=end + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/pool.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/pool.rb new file mode 100644 index 0000000..2cb3662 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/pool.rb @@ -0,0 +1,151 @@ +module EventMachine + # A simple async resource pool based on a resource and work queue. Resources + # are enqueued and work waits for resources to become available. + # + # @example + # require 'em-http-request' + # + # EM.run do + # pool = EM::Pool.new + # spawn = lambda { pool.add EM::HttpRequest.new('http://example.org') } + # 10.times { spawn[] } + # done, scheduled = 0, 0 + # + # check = lambda do + # done += 1 + # if done >= scheduled + # EM.stop + # end + # end + # + # pool.on_error { |conn| spawn[] } + # + # 100.times do |i| + # scheduled += 1 + # pool.perform do |conn| + # req = conn.get :path => '/', :keepalive => true + # + # req.callback do + # p [:success, conn.object_id, i, req.response.size] + # check[] + # end + # + # req.errback { check[] } + # + # req + # end + # end + # end + # + # Resources are expected to be controlled by an object responding to a + # deferrable/completion style API with callback and errback blocks. + # + class Pool + + def initialize + @resources = EM::Queue.new + @removed = [] + @contents = [] + @on_error = nil + end + + def add resource + @contents << resource + requeue resource + end + + def remove resource + @contents.delete resource + @removed << resource + end + + # Returns a list for introspection purposes only. You should *NEVER* call + # modification or work oriented methods on objects in this list. A good + # example use case is periodic statistics collection against a set of + # connection resources. + # + # @example + # pool.contents.inject(0) { |sum, connection| connection.num_bytes } + def contents + @contents.dup + end + + # Define a default catch-all for when the deferrables returned by work + # blocks enter a failed state. By default all that happens is that the + # resource is returned to the pool. If on_error is defined, this block is + # responsible for re-adding the resource to the pool if it is still usable. + # In other words, it is generally assumed that on_error blocks explicitly + # handle the rest of the lifetime of the resource. + def on_error *a, &b + @on_error = EM::Callback(*a, &b) + end + + # Perform a given #call-able object or block. The callable object will be + # called with a resource from the pool as soon as one is available, and is + # expected to return a deferrable. + # + # The deferrable will have callback and errback added such that when the + # deferrable enters a finished state, the object is returned to the pool. + # + # If on_error is defined, then objects are not automatically returned to the + # pool. + def perform(*a, &b) + work = EM::Callback(*a, &b) + + @resources.pop do |resource| + if removed? resource + @removed.delete resource + reschedule work + else + process work, resource + end + end + end + alias reschedule perform + + # A peek at the number of enqueued jobs waiting for resources + def num_waiting + @resources.num_waiting + end + + # Removed will show resources in a partial pruned state. Resources in the + # removed list may not appear in the contents list if they are currently in + # use. + def removed? resource + @removed.include? resource + end + + protected + def requeue resource + @resources.push resource + end + + def failure resource + if @on_error + @contents.delete resource + @on_error.call resource + # Prevent users from calling a leak. + @removed.delete resource + else + requeue resource + end + end + + def completion deferrable, resource + deferrable.callback { requeue resource } + deferrable.errback { failure resource } + end + + def process work, resource + deferrable = work.call resource + if deferrable.kind_of?(EM::Deferrable) + completion deferrable, resource + else + raise ArgumentError, "deferrable expected from work" + end + rescue + failure resource + raise + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/process_watch.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/process_watch.rb new file mode 100644 index 0000000..66e8943 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/process_watch.rb @@ -0,0 +1,45 @@ +module EventMachine + + # This is subclassed from EventMachine::Connection for use with the process monitoring API. Read the + # documentation on the instance methods of this class, and for a full explanation see EventMachine.watch_process. + class ProcessWatch < Connection + # @private + Cfork = 'fork'.freeze + # @private + Cexit = 'exit'.freeze + + # @private + def receive_data(data) + case data + when Cfork + process_forked + when Cexit + process_exited + end + end + + # Returns the pid that EventMachine::watch_process was originally called with. + def pid + @pid + end + + # Should be redefined with the user's custom callback that will be fired when the prcess is forked. + # + # There is currently not an easy way to get the pid of the forked child. + def process_forked + end + + # Should be redefined with the user's custom callback that will be fired when the process exits. + # + # stop_watching is called automatically after this callback + def process_exited + end + + # Discontinue monitoring of the process. + # This will be called automatically when a process dies. User code may call it as well. + def stop_watching + EventMachine::unwatch_pid(@signature) + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/processes.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/processes.rb new file mode 100644 index 0000000..4bbc14f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/processes.rb @@ -0,0 +1,123 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 13 Dec 07 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-08 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + + +module EventMachine + + # EM::DeferrableChildProcess is a sugaring of a common use-case + # involving EM::popen. + # Call the #open method on EM::DeferrableChildProcess, passing + # a command-string. #open immediately returns an EM::Deferrable + # object. It also schedules the forking of a child process, which + # will execute the command passed to #open. + # When the forked child terminates, the Deferrable will be signalled + # and execute its callbacks, passing the data that the child process + # wrote to stdout. + # + class DeferrableChildProcess < EventMachine::Connection + include EventMachine::Deferrable + + # @private + def initialize + super + @data = [] + end + + # Sugars a common use-case involving forked child processes. + # #open takes a String argument containing an shell command + # string (including arguments if desired). #open immediately + # returns an EventMachine::Deferrable object, without blocking. + # + # It also invokes EventMachine#popen to run the passed-in + # command in a forked child process. + # + # When the forked child terminates, the Deferrable that + # #open calls its callbacks, passing the data returned + # from the child process. + # + def self.open cmd + EventMachine.popen( cmd, DeferrableChildProcess ) + end + + # @private + def receive_data data + @data << data + end + + # @private + def unbind + succeed( @data.join ) + end + end + + # @private + class SystemCmd < EventMachine::Connection + def initialize cb + @cb = cb + @output = [] + end + def receive_data data + @output << data + end + def unbind + @cb.call @output.join(''), get_status if @cb + end + end + + # EM::system is a simple wrapper for EM::popen. It is similar to Kernel::system, but requires a + # single string argument for the command and performs no shell expansion. + # + # The block or proc passed to EM::system is called with two arguments: the output generated by the command, + # and a Process::Status that contains information about the command's execution. + # + # EM.run{ + # EM.system('ls'){ |output,status| puts output if status.exitstatus == 0 } + # } + # + # You can also supply an additional proc to send some data to the process: + # + # EM.run{ + # EM.system('sh', proc{ |process| + # process.send_data("echo hello\n") + # process.send_data("exit\n") + # }, proc{ |out,status| + # puts(out) + # }) + # } + # + # Like EventMachine.popen, EventMachine.system currently does not work on windows. + # It returns the pid of the spawned process. + def EventMachine::system cmd, *args, &cb + cb ||= args.pop if args.last.is_a? Proc + init = args.pop if args.last.is_a? Proc + + # merge remaining arguments into the command + cmd = [cmd, *args] if args.any? + + EM.get_subprocess_pid(EM.popen(cmd, SystemCmd, cb) do |c| + init[c] if init + end.signature) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols.rb new file mode 100644 index 0000000..0c17906 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols.rb @@ -0,0 +1,37 @@ +module EventMachine + # This module contains various protocol implementations, including: + # - HttpClient and HttpClient2 + # - Stomp + # - Memcache + # - SmtpClient and SmtpServer + # - SASLauth and SASLauthclient + # - LineProtocol, LineAndTextProtocol and LineText2 + # - HeaderAndContentProtocol + # - Postgres3 + # - ObjectProtocol + # + # The protocol implementations live in separate files in the protocols/ subdirectory, + # but are auto-loaded when they are first referenced in your application. + # + # EventMachine::Protocols is also aliased to EM::P for easier usage. + # + module Protocols + # TODO : various autotools are completely useless with the lack of naming + # convention, we need to correct that! + autoload :TcpConnectTester, 'em/protocols/tcptest' + autoload :HttpClient, 'em/protocols/httpclient' + autoload :HttpClient2, 'em/protocols/httpclient2' + autoload :LineAndTextProtocol, 'em/protocols/line_and_text' + autoload :HeaderAndContentProtocol, 'em/protocols/header_and_content' + autoload :LineText2, 'em/protocols/linetext2' + autoload :Stomp, 'em/protocols/stomp' + autoload :SmtpClient, 'em/protocols/smtpclient' + autoload :SmtpServer, 'em/protocols/smtpserver' + autoload :SASLauth, 'em/protocols/saslauth' + autoload :Memcache, 'em/protocols/memcache' + autoload :Postgres3, 'em/protocols/postgres3' + autoload :ObjectProtocol, 'em/protocols/object_protocol' + autoload :Socks4, 'em/protocols/socks4' + autoload :LineProtocol, 'em/protocols/line_protocol' + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/header_and_content.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/header_and_content.rb new file mode 100644 index 0000000..b5a465a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/header_and_content.rb @@ -0,0 +1,138 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 Nov 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Protocols + + # === Usage + # + # class RequestHandler < EM::P::HeaderAndContentProtocol + # def receive_request headers, content + # p [:request, headers, content] + # end + # end + # + # EM.run{ + # EM.start_server 'localhost', 80, RequestHandler + # } + # + #-- + # Originally, this subclassed LineAndTextProtocol, which in + # turn relies on BufferedTokenizer, which doesn't gracefully + # handle the transitions between lines and binary text. + # Changed 13Sep08 by FCianfrocca. + class HeaderAndContentProtocol < Connection + include LineText2 + + ContentLengthPattern = /Content-length:\s*(\d+)/i + + def initialize *args + super + init_for_request + end + + def receive_line line + case @hc_mode + when :discard_blanks + unless line == "" + @hc_mode = :headers + receive_line line + end + when :headers + if line == "" + raise "unrecognized state" unless @hc_headers.length > 0 + if respond_to?(:receive_headers) + receive_headers @hc_headers + end + # @hc_content_length will be nil, not 0, if there was no content-length header. + if @hc_content_length.to_i > 0 + set_binary_mode @hc_content_length + else + dispatch_request + end + else + @hc_headers << line + if ContentLengthPattern =~ line + # There are some attacks that rely on sending multiple content-length + # headers. This is a crude protection, but needs to become tunable. + raise "extraneous content-length header" if @hc_content_length + @hc_content_length = $1.to_i + end + if @hc_headers.length == 1 and respond_to?(:receive_first_header_line) + receive_first_header_line line + end + end + else + raise "internal error, unsupported mode" + end + end + + def receive_binary_data text + @hc_content = text + dispatch_request + end + + def dispatch_request + if respond_to?(:receive_request) + receive_request @hc_headers, @hc_content + end + init_for_request + end + private :dispatch_request + + def init_for_request + @hc_mode = :discard_blanks + @hc_headers = [] + # originally was @hc_headers ||= []; @hc_headers.clear to get a performance + # boost, but it's counterproductive because a subclassed handler will have to + # call dup to use the header array we pass in receive_headers. + + @hc_content_length = nil + @hc_content = "" + end + private :init_for_request + + # Basically a convenience method. We might create a subclass that does this + # automatically. But it's such a performance killer. + def headers_2_hash hdrs + self.class.headers_2_hash hdrs + end + + class << self + def headers_2_hash hdrs + hash = {} + hdrs.each {|h| + if /\A([^\s:]+)\s*:\s*/ =~ h + tail = $'.dup + hash[ $1.downcase.gsub(/-/,"_").intern ] = tail + end + } + hash + end + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/httpclient.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/httpclient.rb new file mode 100644 index 0000000..38b175c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/httpclient.rb @@ -0,0 +1,300 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 July 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Protocols + + # Note: This class is deprecated and will be removed. Please use EM-HTTP-Request instead. + # + # @example + # EventMachine.run { + # http = EventMachine::Protocols::HttpClient.request( + # :host => server, + # :port => 80, + # :request => "/index.html", + # :query_string => "parm1=value1&parm2=value2" + # ) + # http.callback {|response| + # puts response[:status] + # puts response[:headers] + # puts response[:content] + # } + # } + #-- + # TODO: + # Add streaming so we can support enormous POSTs. Current max is 20meg. + # Timeout for connections that run too long or hang somewhere in the middle. + # Persistent connections (HTTP/1.1), may need a associated delegate object. + # DNS: Some way to cache DNS lookups for hostnames we connect to. Ruby's + # DNS lookups are unbelievably slow. + # HEAD requests. + # Convenience methods for requests. get, post, url, etc. + # SSL. + # Handle status codes like 304, 100, etc. + # Refactor this code so that protocol errors all get handled one way (an exception?), + # instead of sprinkling set_deferred_status :failed calls everywhere. + class HttpClient < Connection + include EventMachine::Deferrable + + MaxPostContentLength = 20 * 1024 * 1024 + + def initialize + warn "HttpClient is deprecated and will be removed. EM-Http-Request should be used instead." + @connected = false + end + + # @param args [Hash] The request arguments + # @option args [String] :host The host IP/DNS name + # @option args [Integer] :port The port to connect too + # @option args [String] :verb The request type [GET | POST | DELETE | PUT] + # @option args [String] :request The request path + # @option args [Hash] :basic_auth The basic auth credentials (:username and :password) + # @option args [String] :content The request content + # @option args [String] :contenttype The content type (e.g. text/plain) + # @option args [String] :query_string The query string + # @option args [String] :host_header The host header to set + # @option args [String] :cookie Cookies to set + def self.request( args = {} ) + args[:port] ||= 80 + EventMachine.connect( args[:host], args[:port], self ) {|c| + # According to the docs, we will get here AFTER post_init is called. + c.instance_eval {@args = args} + } + end + + def post_init + @start_time = Time.now + @data = "" + @read_state = :base + end + + # We send the request when we get a connection. + # AND, we set an instance variable to indicate we passed through here. + # That allows #unbind to know whether there was a successful connection. + # NB: This naive technique won't work when we have to support multiple + # requests on a single connection. + def connection_completed + @connected = true + send_request @args + end + + def send_request args + args[:verb] ||= args[:method] # Support :method as an alternative to :verb. + args[:verb] ||= :get # IS THIS A GOOD IDEA, to default to GET if nothing was specified? + + verb = args[:verb].to_s.upcase + unless ["GET", "POST", "PUT", "DELETE", "HEAD"].include?(verb) + set_deferred_status :failed, {:status => 0} # TODO, not signalling the error type + return # NOTE THE EARLY RETURN, we're not sending any data. + end + + request = args[:request] || "/" + unless request[0,1] == "/" + request = "/" + request + end + + qs = args[:query_string] || "" + if qs.length > 0 and qs[0,1] != '?' + qs = "?" + qs + end + + version = args[:version] || "1.1" + + # Allow an override for the host header if it's not the connect-string. + host = args[:host_header] || args[:host] || "_" + # For now, ALWAYS tuck in the port string, although we may want to omit it if it's the default. + port = args[:port].to_i != 80 ? ":#{args[:port]}" : "" + + # POST items. + postcontenttype = args[:contenttype] || "application/octet-stream" + postcontent = args[:content] || "" + raise "oversized content in HTTP POST" if postcontent.length > MaxPostContentLength + + # ESSENTIAL for the request's line-endings to be CRLF, not LF. Some servers misbehave otherwise. + # TODO: We ASSUME the caller wants to send a 1.1 request. May not be a good assumption. + req = [ + "#{verb} #{request}#{qs} HTTP/#{version}", + "Host: #{host}#{port}", + "User-agent: Ruby EventMachine", + ] + + if verb == "POST" || verb == "PUT" + req << "Content-type: #{postcontenttype}" + req << "Content-length: #{postcontent.length}" + end + + # TODO, this cookie handler assumes it's getting a single, semicolon-delimited string. + # Eventually we will want to deal intelligently with arrays and hashes. + if args[:cookie] + req << "Cookie: #{args[:cookie]}" + end + + # Allow custom HTTP headers, e.g. SOAPAction + args[:custom_headers].each do |k,v| + req << "#{k}: #{v}" + end if args[:custom_headers] + + # Basic-auth stanza contributed by Matt Murphy. + if args[:basic_auth] + basic_auth_string = ["#{args[:basic_auth][:username]}:#{args[:basic_auth][:password]}"].pack('m').strip.gsub(/\n/,'') + req << "Authorization: Basic #{basic_auth_string}" + end + + req << "" + reqstring = req.map {|l| "#{l}\r\n"}.join + send_data reqstring + + if verb == "POST" || verb == "PUT" + send_data postcontent + end + end + + + def receive_data data + while data and data.length > 0 + case @read_state + when :base + # Perform any per-request initialization here and don't consume any data. + @data = "" + @headers = [] + @content_length = nil # not zero + @content = "" + @status = nil + @chunked = false + @chunk_length = nil + @read_state = :header + @connection_close = nil + when :header + ary = data.split( /\r?\n/m, 2 ) + if ary.length == 2 + data = ary.last + if ary.first == "" + if (@content_length and @content_length > 0) || @chunked || @connection_close + @read_state = :content + else + dispatch_response + @read_state = :base + end + else + @headers << ary.first + if @headers.length == 1 + parse_response_line + elsif ary.first =~ /\Acontent-length:\s*/i + # Only take the FIRST content-length header that appears, + # which we can distinguish because @content_length is nil. + # TODO, it's actually a fatal error if there is more than one + # content-length header, because the caller is presumptively + # a bad guy. (There is an exploit that depends on multiple + # content-length headers.) + @content_length ||= $'.to_i + elsif ary.first =~ /\Aconnection:\s*close/i + @connection_close = true + elsif ary.first =~ /\Atransfer-encoding:\s*chunked/i + @chunked = true + end + end + else + @data << data + data = "" + end + when :content + if @chunked && @chunk_length + bytes_needed = @chunk_length - @chunk_read + new_data = data[0, bytes_needed] + @chunk_read += new_data.length + @content += new_data + data = data[bytes_needed..-1] || "" + if @chunk_length == @chunk_read && data[0,2] == "\r\n" + @chunk_length = nil + data = data[2..-1] + end + elsif @chunked + if (m = data.match(/\A(\S*)\r\n/m)) + data = data[m[0].length..-1] + @chunk_length = m[1].to_i(16) + @chunk_read = 0 + if @chunk_length == 0 + dispatch_response + @read_state = :base + end + end + elsif @content_length + # If there was no content-length header, we have to wait until the connection + # closes. Everything we get until that point is content. + # TODO: Must impose a content-size limit, and also must implement chunking. + # Also, must support either temporary files for large content, or calling + # a content-consumer block supplied by the user. + bytes_needed = @content_length - @content.length + @content += data[0, bytes_needed] + data = data[bytes_needed..-1] || "" + if @content_length == @content.length + dispatch_response + @read_state = :base + end + else + @content << data + data = "" + end + end + end + end + + + # We get called here when we have received an HTTP response line. + # It's an opportunity to throw an exception or trigger other exceptional + # handling. + def parse_response_line + if @headers.first =~ /\AHTTP\/1\.[01] ([\d]{3})/ + @status = $1.to_i + else + set_deferred_status :failed, { + :status => 0 # crappy way of signifying an unrecognized response. TODO, find a better way to do this. + } + close_connection + end + end + private :parse_response_line + + def dispatch_response + @read_state = :base + set_deferred_status :succeeded, { + :content => @content, + :headers => @headers, + :status => @status + } + # TODO, we close the connection for now, but this is wrong for persistent clients. + close_connection + end + + def unbind + if !@connected + set_deferred_status :failed, {:status => 0} # YECCCCH. Find a better way to signal no-connect/network error. + elsif (@read_state == :content and @content_length == nil) + dispatch_response + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/httpclient2.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/httpclient2.rb new file mode 100644 index 0000000..0fb64e8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/httpclient2.rb @@ -0,0 +1,600 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 July 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Protocols + + # Note: This class is deprecated and will be removed. Please use EM-HTTP-Request instead. + # + # === Usage + # + # EM.run{ + # conn = EM::Protocols::HttpClient2.connect 'google.com', 80 + # + # req = conn.get('/') + # req.callback{ |response| + # p(response.status) + # p(response.headers) + # p(response.content) + # } + # } + class HttpClient2 < Connection + include LineText2 + + def initialize + warn "HttpClient2 is deprecated and will be removed. EM-Http-Request should be used instead." + + @authorization = nil + @closed = nil + @requests = nil + end + + # @private + class Request + include Deferrable + + attr_reader :version + attr_reader :status + attr_reader :header_lines + attr_reader :headers + attr_reader :content + attr_reader :internal_error + + def initialize conn, args + @conn = conn + @args = args + @header_lines = [] + @headers = {} + @blanks = 0 + @chunk_trailer = nil + @chunking = nil + end + + def send_request + az = @args[:authorization] and az = "Authorization: #{az}\r\n" + + r = [ + "#{@args[:verb]} #{@args[:uri]} HTTP/#{@args[:version] || "1.1"}\r\n", + "Host: #{@args[:host_header] || "_"}\r\n", + az || "", + "\r\n" + ] + @conn.send_data r.join + end + + + #-- + # + def receive_line ln + if @chunk_trailer + receive_chunk_trailer(ln) + elsif @chunking + receive_chunk_header(ln) + else + receive_header_line(ln) + end + end + + #-- + # + def receive_chunk_trailer ln + if ln.length == 0 + @conn.pop_request + succeed(self) + else + p "Received chunk trailer line" + end + end + + #-- + # Allow up to ten blank lines before we get a real response line. + # Allow no more than 100 lines in the header. + # + def receive_header_line ln + if ln.length == 0 + if @header_lines.length > 0 + process_header + else + @blanks += 1 + if @blanks > 10 + @conn.close_connection + end + end + else + @header_lines << ln + if @header_lines.length > 100 + @internal_error = :bad_header + @conn.close_connection + end + end + end + + #-- + # Cf RFC 2616 pgh 3.6.1 for the format of HTTP chunks. + # + def receive_chunk_header ln + if ln.length > 0 + chunksize = ln.to_i(16) + if chunksize > 0 + @conn.set_text_mode(ln.to_i(16)) + else + @content = @content ? @content.join : '' + @chunk_trailer = true + end + else + # We correctly come here after each chunk gets read. + # p "Got A BLANK chunk line" + end + + end + + + #-- + # We get a single chunk. Append it to the incoming content and switch back to line mode. + # + def receive_chunked_text text + # p "RECEIVED #{text.length} CHUNK" + (@content ||= []) << text + end + + + #-- + # TODO, inefficient how we're handling this. Part of it is done so as to + # make sure we don't have problems in detecting chunked-encoding, content-length, + # etc. + # + HttpResponseRE = /\AHTTP\/(1.[01]) ([\d]{3})/i + ClenRE = /\AContent-length:\s*(\d+)/i + ChunkedRE = /\ATransfer-encoding:\s*chunked/i + ColonRE = /\:\s*/ + + def process_header + unless @header_lines.first =~ HttpResponseRE + @conn.close_connection + @internal_error = :bad_request + end + @version = $1.dup + @status = $2.dup.to_i + + clen = nil + chunks = nil + @header_lines.each_with_index do |e,ix| + if ix > 0 + hdr,val = e.split(ColonRE,2) + (@headers[hdr.downcase] ||= []) << val + end + + if clen == nil and e =~ ClenRE + clen = $1.dup.to_i + end + if e =~ ChunkedRE + chunks = true + end + end + + if clen + # If the content length is zero we should not call set_text_mode, + # because a value of zero will make it wait forever, hanging the + # connection. Just return success instead, with empty content. + if clen == 0 then + @content = "" + @conn.pop_request + succeed(self) + else + @conn.set_text_mode clen + end + elsif chunks + @chunking = true + else + # Chunked transfer, multipart, or end-of-connection. + # For end-of-connection, we need to go the unbind + # method and suppress its desire to fail us. + p "NO CLEN" + p @args[:uri] + p @header_lines + @internal_error = :unsupported_clen + @conn.close_connection + end + end + private :process_header + + + def receive_text text + @chunking ? receive_chunked_text(text) : receive_sized_text(text) + end + + #-- + # At the present time, we only handle contents that have a length + # specified by the content-length header. + # + def receive_sized_text text + @content = text + @conn.pop_request + succeed(self) + end + end + + # Make a connection to a remote HTTP server. + # Can take either a pair of arguments (which will be interpreted as + # a hostname/ip-address and a port), or a hash. + # If the arguments are a hash, then supported values include: + # :host => a hostname or ip-address + # :port => a port number + # :ssl => true to enable ssl + def self.connect *args + if args.length == 2 + args = {:host=>args[0], :port=>args[1]} + else + args = args.first + end + + h,prt,ssl = args[:host], Integer(args[:port]), (args[:tls] || args[:ssl]) + conn = EM.connect( h, prt, self ) + conn.start_tls if ssl + conn.set_default_host_header( h, prt, ssl ) + conn + end + + # Get a url + # + # req = conn.get(:uri => '/') + # req.callback{|response| puts response.content } + # + def get args + if args.is_a?(String) + args = {:uri=>args} + end + args[:verb] = "GET" + request args + end + + # Post to a url + # + # req = conn.post('/data') + # req.callback{|response| puts response.content } + #-- + # XXX there's no way to supply a POST body.. wtf? + def post args + if args.is_a?(String) + args = {:uri=>args} + end + args[:verb] = "POST" + request args + end + + + #-- + # Compute and remember a string to be used as the host header in HTTP requests + # unless the user overrides it with an argument to #request. + # + # @private + def set_default_host_header host, port, ssl + if (ssl and port != 443) or (!ssl and port != 80) + @host_header = "#{host}:#{port}" + else + @host_header = host + end + end + + + # @private + def post_init + super + @connected = EM::DefaultDeferrable.new + end + + # @private + def connection_completed + super + @connected.succeed + end + + #-- + # All pending requests, if any, must fail. + # We might come here without ever passing through connection_completed + # in case we can't connect to the server. We'll also get here when the + # connection closes (either because the server closes it, or we close it + # due to detecting an internal error or security violation). + # In either case, run down all pending requests, if any, and signal failure + # on them. + # + # Set and remember a flag (@closed) so we can immediately fail any + # subsequent requests. + # + # @private + def unbind + super + @closed = true + (@requests || []).each {|r| r.fail} + end + + # @private + def request args + args[:host_header] = @host_header unless args.has_key?(:host_header) + args[:authorization] = @authorization unless args.has_key?(:authorization) + r = Request.new self, args + if @closed + r.fail + else + (@requests ||= []).unshift r + @connected.callback {r.send_request} + end + r + end + + # @private + def receive_line ln + if req = @requests.last + req.receive_line ln + else + p "??????????" + p ln + end + end + + # @private + def receive_binary_data text + @requests.last.receive_text text + end + + #-- + # Called by a Request object when it completes. + # + # @private + def pop_request + @requests.pop + end + end + + +=begin + class HttpClient2x < Connection + include LineText2 + + # TODO: Make this behave appropriate in case a #connect fails. + # Currently, this produces no errors. + + # Make a connection to a remote HTTP server. + # Can take either a pair of arguments (which will be interpreted as + # a hostname/ip-address and a port), or a hash. + # If the arguments are a hash, then supported values include: + # :host => a hostname or ip-address; + # :port => a port number + #-- + # TODO, support optional encryption arguments like :ssl + def self.connect *args + if args.length == 2 + args = {:host=>args[0], :port=>args[1]} + else + args = args.first + end + + h,prt = args[:host],Integer(args[:port]) + EM.connect( h, prt, self, h, prt ) + end + + + #-- + # Sugars a connection that makes a single request and then + # closes the connection. Matches the behavior and the arguments + # of the original implementation of class HttpClient. + # + # Intended primarily for back compatibility, but the idiom + # is probably useful so it's not deprecated. + # We return a Deferrable, as did the original implementation. + # + # Because we're improving the way we deal with errors and exceptions + # (specifically, HTTP response codes other than 2xx will trigger the + # errback rather than the callback), this may break some existing code. + # + def self.request args + c = connect args + end + + #-- + # Requests can be pipelined. When we get a request, add it to the + # front of a queue as an array. The last element of the @requests + # array is always the oldest request received. Each element of the + # @requests array is a two-element array consisting of a hash with + # the original caller's arguments, and an initially-empty Ostruct + # containing the data we retrieve from the server's response. + # Maintain the instance variable @current_response, which is the response + # of the oldest pending request. That's just to make other code a little + # easier. If the variable doesn't exist when we come here, we're + # obviously the first request being made on the connection. + # + # The reason for keeping this method private (and requiring use of the + # convenience methods #get, #post, #head, etc) is to avoid the small + # performance penalty of canonicalizing the verb. + # + def request args + d = EventMachine::DefaultDeferrable.new + + if @closed + d.fail + return d + end + + o = OpenStruct.new + o.deferrable = d + (@requests ||= []).unshift [args, o] + @current_response ||= @requests.last.last + @connected.callback { + az = args[:authorization] and az = "Authorization: #{az}\r\n" + + r = [ + "#{args[:verb]} #{args[:uri]} HTTP/#{args[:version] || "1.1"}\r\n", + "Host: #{args[:host_header] || @host_header}\r\n", + az || "", + "\r\n" + ] + p r + send_data r.join + } + o.deferrable + end + private :request + + def get args + if args.is_a?(String) + args = {:uri=>args} + end + args[:verb] = "GET" + request args + end + + def initialize host, port + super + @host_header = "#{host}:#{port}" + end + def post_init + super + @connected = EM::DefaultDeferrable.new + end + + + def connection_completed + super + @connected.succeed + end + + #-- + # Make sure to throw away any leftover incoming data if we've + # been closed due to recognizing an error. + # + # Generate an internal error if we get an unreasonable number of + # header lines. It could be malicious. + # + def receive_line ln + p ln + return if @closed + + if ln.length > 0 + (@current_response.headers ||= []).push ln + abort_connection if @current_response.headers.length > 100 + else + process_received_headers + end + end + + #-- + # We come here when we've seen all the headers for a particular request. + # What we do next depends on the response line (which should be the + # first line in the header set), and whether there is content to read. + # We may transition into a text-reading state to read content, or + # we may abort the connection, or we may go right back into parsing + # responses for the next response in the chain. + # + # We make an ASSUMPTION that the first line is an HTTP response. + # Anything else produces an error that aborts the connection. + # This may not be enough, because it may be that responses to pipelined + # requests will come with a blank-line delimiter. + # + # Any non-2xx response will be treated as a fatal error, and abort the + # connection. We will set up the status and other response parameters. + # TODO: we will want to properly support 1xx responses, which some versions + # of IIS copiously generate. + # TODO: We need to give the option of not aborting the connection with certain + # non-200 responses, in order to work with NTLM and other authentication + # schemes that work at the level of individual connections. + # + # Some error responses will get sugarings. For example, we'll return the + # Location header in the response in case of a 301/302 response. + # + # Possible dispositions here: + # 1) No content to read (either content-length is zero or it's a HEAD request); + # 2) Switch to text mode to read a specific number of bytes; + # 3) Read a chunked or multipart response; + # 4) Read till the server closes the connection. + # + # Our reponse to the client can be either to wait till all the content + # has been read and then to signal caller's deferrable, or else to signal + # it when we finish the processing the headers and then expect the caller + # to have given us a block to call as the content comes in. And of course + # the latter gets stickier with chunks and multiparts. + # + HttpResponseRE = /\AHTTP\/(1.[01]) ([\d]{3})/i + ClenRE = /\AContent-length:\s*(\d+)/i + def process_received_headers + abort_connection unless @current_response.headers.first =~ HttpResponseRE + @current_response.version = $1.dup + st = $2.dup + @current_response.status = st.to_i + abort_connection unless st[0,1] == "2" + + clen = nil + @current_response.headers.each do |e| + if clen == nil and e =~ ClenRE + clen = $1.dup.to_i + end + end + + if clen + set_text_mode clen + end + end + private :process_received_headers + + + def receive_binary_data text + @current_response.content = text + @current_response.deferrable.succeed @current_response + @requests.pop + @current_response = (@requests.last || []).last + set_line_mode + end + + + + # We've received either a server error or an internal error. + # Close the connection and abort any pending requests. + #-- + # When should we call close_connection? It will cause #unbind + # to be fired. Should the user expect to see #unbind before + # we call #receive_http_error, or the other way around? + # + # Set instance variable @closed. That's used to inhibit further + # processing of any inbound data after an error has been recognized. + # + # We shouldn't have to worry about any leftover outbound data, + # because we call close_connection (not close_connection_after_writing). + # That ensures that any pipelined requests received after an error + # DO NOT get streamed out to the server on this connection. + # Very important. TODO, write a unit-test to establish that behavior. + # + def abort_connection + close_connection + @closed = true + @current_response.deferrable.fail( @current_response ) + end + + + #------------------------ + # Below here are user-overridable methods. + + end +=end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/line_and_text.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/line_and_text.rb new file mode 100644 index 0000000..784daf2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/line_and_text.rb @@ -0,0 +1,125 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 November 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# +# + +module EventMachine + module Protocols + # A protocol that handles line-oriented data with interspersed binary text. + # + # This version is optimized for performance. See EventMachine::Protocols::LineText2 + # for a version which is optimized for correctness with regard to binary text blocks + # that can switch back to line mode. + class LineAndTextProtocol < Connection + MaxBinaryLength = 32*1024*1024 + + def initialize *args + super + lbp_init_line_state + end + + def receive_data data + if @lbp_mode == :lines + begin + @lpb_buffer.extract(data).each do |line| + receive_line(line.chomp) if respond_to?(:receive_line) + end + rescue + receive_error('overlength line') if respond_to?(:receive_error) + close_connection + return + end + else + if @lbp_binary_limit > 0 + wanted = @lbp_binary_limit - @lbp_binary_bytes_received + chunk = nil + if data.length > wanted + chunk = data.slice!(0...wanted) + else + chunk = data + data = "" + end + @lbp_binary_buffer[@lbp_binary_bytes_received...(@lbp_binary_bytes_received+chunk.length)] = chunk + @lbp_binary_bytes_received += chunk.length + if @lbp_binary_bytes_received == @lbp_binary_limit + receive_binary_data(@lbp_binary_buffer) if respond_to?(:receive_binary_data) + lbp_init_line_state + end + receive_data(data) if data.length > 0 + else + receive_binary_data(data) if respond_to?(:receive_binary_data) + data = "" + end + end + end + + def unbind + if @lbp_mode == :binary and @lbp_binary_limit > 0 + if respond_to?(:receive_binary_data) + receive_binary_data( @lbp_binary_buffer[0...@lbp_binary_bytes_received] ) + end + end + end + + # Set up to read the supplied number of binary bytes. + # This recycles all the data currently waiting in the line buffer, if any. + # If the limit is nil, then ALL subsequent data will be treated as binary + # data and passed to the upstream protocol handler as we receive it. + # If a limit is given, we'll hold the incoming binary data and not + # pass it upstream until we've seen it all, or until there is an unbind + # (in which case we'll pass up a partial). + # Specifying nil for the limit (the default) means there is no limit. + # Specifiyng zero for the limit will cause an immediate transition back to line mode. + # + def set_binary_mode size = nil + if @lbp_mode == :lines + if size == 0 + receive_binary_data("") if respond_to?(:receive_binary_data) + # Do no more work here. Stay in line mode and keep consuming data. + else + @lbp_binary_limit = size.to_i # (nil will be stored as zero) + if @lbp_binary_limit > 0 + raise "Overlength" if @lbp_binary_limit > MaxBinaryLength # arbitrary sanity check + @lbp_binary_buffer = "\0" * @lbp_binary_limit + @lbp_binary_bytes_received = 0 + end + + @lbp_mode = :binary + receive_data @lpb_buffer.flush + end + else + raise "invalid operation" + end + end + + #-- + # For internal use, establish protocol baseline for handling lines. + def lbp_init_line_state + @lpb_buffer = BufferedTokenizer.new("\n") + @lbp_mode = :lines + end + private :lbp_init_line_state + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/line_protocol.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/line_protocol.rb new file mode 100644 index 0000000..dfddae8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/line_protocol.rb @@ -0,0 +1,29 @@ +module EventMachine + module Protocols + # LineProtocol will parse out newline terminated strings from a receive_data stream + # + # module Server + # include EM::P::LineProtocol + # + # def receive_line(line) + # send_data("you said: #{line}") + # end + # end + # + module LineProtocol + # @private + def receive_data data + (@buf ||= '') << data + + while @buf.slice!(/(.*?)\r?\n/) + receive_line($1) + end + end + + # Invoked with lines received over the network + def receive_line(line) + # stub + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/linetext2.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/linetext2.rb new file mode 100644 index 0000000..9fdf28b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/linetext2.rb @@ -0,0 +1,179 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 November 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Protocols + # In the grand, time-honored tradition of re-inventing the wheel, we offer + # here YET ANOTHER protocol that handles line-oriented data with interspersed + # binary text. This one trades away some of the performance optimizations of + # EventMachine::Protocols::LineAndTextProtocol in order to get better correctness + # with regard to binary text blocks that can switch back to line mode. It also + # permits the line-delimiter to change in midstream. + # This was originally written to support Stomp. + module LineText2 + # TODO! We're not enforcing the limits on header lengths and text-lengths. + # When we get around to that, call #receive_error if the user defined it, otherwise + # throw exceptions. + + MaxBinaryLength = 32*1024*1024 + + #-- + # Will loop internally until there's no data left to read. + # That way the user-defined handlers we call can modify the + # handling characteristics on a per-token basis. + # + def receive_data data + return unless (data and data.length > 0) + + # Do this stuff in lieu of a constructor. + @lt2_mode ||= :lines + @lt2_delimiter ||= "\n" + @lt2_linebuffer ||= [] + + remaining_data = data + + while remaining_data.length > 0 + if @lt2_mode == :lines + delimiter_string = case @lt2_delimiter + when Regexp + remaining_data.slice(@lt2_delimiter) + else + @lt2_delimiter + end + ix = remaining_data.index(delimiter_string) if delimiter_string + if ix + @lt2_linebuffer << remaining_data[0...ix] + ln = @lt2_linebuffer.join + @lt2_linebuffer.clear + if @lt2_delimiter == "\n" + ln.chomp! + end + receive_line ln + remaining_data = remaining_data[(ix+delimiter_string.length)..-1] + else + @lt2_linebuffer << remaining_data + remaining_data = "" + end + elsif @lt2_mode == :text + if @lt2_textsize + needed = @lt2_textsize - @lt2_textpos + will_take = if remaining_data.length > needed + needed + else + remaining_data.length + end + + @lt2_textbuffer << remaining_data[0...will_take] + tail = remaining_data[will_take..-1] + + @lt2_textpos += will_take + if @lt2_textpos >= @lt2_textsize + # Reset line mode (the default behavior) BEFORE calling the + # receive_binary_data. This makes it possible for user code + # to call set_text_mode, enabling chains of text blocks + # (which can possibly be of different sizes). + set_line_mode + receive_binary_data @lt2_textbuffer.join + receive_end_of_binary_data + end + + remaining_data = tail + else + receive_binary_data remaining_data + remaining_data = "" + end + end + end + end + + # The line delimiter may be a regular expression or a string. Anything + # passed to set_delimiter other than a regular expression will be + # converted to a string. + def set_delimiter delim + @lt2_delimiter = case delim + when Regexp + delim + else + delim.to_s + end + end + + # Called internally but also exposed to user code, for the case in which + # processing of binary data creates a need to transition back to line mode. + # We support an optional parameter to "throw back" some data, which might + # be an umprocessed chunk of the transmitted binary data, or something else + # entirely. + def set_line_mode data="" + @lt2_mode = :lines + (@lt2_linebuffer ||= []).clear + receive_data data.to_s + end + + def set_text_mode size=nil + if size == 0 + set_line_mode + else + @lt2_mode = :text + (@lt2_textbuffer ||= []).clear + @lt2_textsize = size # which can be nil, signifying no limit + @lt2_textpos = 0 + end + end + + # Alias for #set_text_mode, added for back-compatibility with LineAndTextProtocol. + def set_binary_mode size=nil + set_text_mode size + end + + # In case of a dropped connection, we'll send a partial buffer to user code + # when in sized text mode. User overrides of #receive_binary_data need to + # be aware that they may get a short buffer. + def unbind + @lt2_mode ||= nil + if @lt2_mode == :text and @lt2_textpos > 0 + receive_binary_data @lt2_textbuffer.join + end + end + + # Stub. Should be subclassed by user code. + def receive_line ln + # no-op + end + + # Stub. Should be subclassed by user code. + def receive_binary_data data + # no-op + end + + # Stub. Should be subclassed by user code. + # This is called when transitioning internally from text mode + # back to line mode. Useful when client code doesn't want + # to keep track of how much data it's received. + def receive_end_of_binary_data + # no-op + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/memcache.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/memcache.rb new file mode 100644 index 0000000..1f81aaf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/memcache.rb @@ -0,0 +1,331 @@ +module EventMachine + module Protocols + # Implements the Memcache protocol (http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt). + # Requires memcached >= 1.2.4 w/ noreply support + # + # == Usage example + # + # EM.run{ + # cache = EM::P::Memcache.connect 'localhost', 11211 + # + # cache.set :a, 'hello' + # cache.set :b, 'hi' + # cache.set :c, 'how are you?' + # cache.set :d, '' + # + # cache.get(:a){ |v| p v } + # cache.get_hash(:a, :b, :c, :d){ |v| p v } + # cache.get(:a,:b,:c,:d){ |a,b,c,d| p [a,b,c,d] } + # + # cache.get(:a,:z,:b,:y,:d){ |a,z,b,y,d| p [a,z,b,y,d] } + # + # cache.get(:missing){ |m| p [:missing=, m] } + # cache.set(:missing, 'abc'){ p :stored } + # cache.get(:missing){ |m| p [:missing=, m] } + # cache.del(:missing){ p :deleted } + # cache.get(:missing){ |m| p [:missing=, m] } + # } + # + module Memcache + include EM::Deferrable + + ## + # constants + + unless defined? Cempty + # @private + Cstored = 'STORED'.freeze + # @private + Cend = 'END'.freeze + # @private + Cdeleted = 'DELETED'.freeze + # @private + Cunknown = 'NOT_FOUND'.freeze + # @private + Cerror = 'ERROR'.freeze + + # @private + Cempty = ''.freeze + # @private + Cdelimiter = "\r\n".freeze + end + + ## + # commands + + # Get the value associated with one or multiple keys + # + # cache.get(:a){ |v| p v } + # cache.get(:a,:b,:c,:d){ |a,b,c,d| p [a,b,c,d] } + # + def get *keys + raise ArgumentError unless block_given? + + callback{ + keys = keys.map{|k| k.to_s.gsub(/\s/,'_') } + send_data "get #{keys.join(' ')}\r\n" + @get_cbs << [keys, proc{ |values| + yield *keys.map{ |k| values[k] } + }] + } + end + + # Set the value for a given key + # + # cache.set :a, 'hello' + # cache.set(:missing, 'abc'){ puts "stored the value!" } + # + def set key, val, exptime = 0, &cb + callback{ + val = val.to_s + send_cmd :set, key, 0, exptime, val.respond_to?(:bytesize) ? val.bytesize : val.size, !block_given? + send_data val + send_data Cdelimiter + @set_cbs << cb if cb + } + end + + # Gets multiple values as a hash + # + # cache.get_hash(:a, :b, :c, :d){ |h| puts h[:a] } + # + def get_hash *keys + raise ArgumentError unless block_given? + + get *keys do |*values| + yield keys.inject({}){ |hash, k| hash.update k => values[keys.index(k)] } + end + end + + # Delete the value associated with a key + # + # cache.del :a + # cache.del(:b){ puts "deleted the value!" } + # + def delete key, expires = 0, &cb + callback{ + send_data "delete #{key} #{expires}#{cb ? '' : ' noreply'}\r\n" + @del_cbs << cb if cb + } + end + alias del delete + + # Connect to a memcached server (must support NOREPLY, memcached >= 1.2.4) + def self.connect host = 'localhost', port = 11211 + EM.connect host, port, self, host, port + end + + def send_cmd cmd, key, flags = 0, exptime = 0, bytes = 0, noreply = false + send_data "#{cmd} #{key} #{flags} #{exptime} #{bytes}#{noreply ? ' noreply' : ''}\r\n" + end + private :send_cmd + + ## + # errors + + # @private + class ParserError < StandardError + end + + ## + # em hooks + + # @private + def initialize host, port = 11211 + @host, @port = host, port + end + + # @private + def connection_completed + @get_cbs = [] + @set_cbs = [] + @del_cbs = [] + + @values = {} + + @reconnecting = false + @connected = true + succeed + # set_delimiter "\r\n" + # set_line_mode + end + + #-- + # 19Feb09 Switched to a custom parser, LineText2 is recursive and can cause + # stack overflows when there is too much data. + # include EM::P::LineText2 + # @private + def receive_data data + (@buffer||='') << data + + while index = @buffer.index(Cdelimiter) + begin + line = @buffer.slice!(0,index+2) + process_cmd line + rescue ParserError + @buffer[0...0] = line + break + end + end + end + + #-- + # def receive_line line + # @private + def process_cmd line + case line.strip + when /^VALUE\s+(.+?)\s+(\d+)\s+(\d+)/ # VALUE + bytes = Integer($3) + # set_binary_mode bytes+2 + # @cur_key = $1 + if @buffer.size >= bytes + 2 + @values[$1] = @buffer.slice!(0,bytes) + @buffer.slice!(0,2) # \r\n + else + raise ParserError + end + + when Cend # END + if entry = @get_cbs.shift + keys, cb = entry + cb.call(@values) + end + @values = {} + + when Cstored # STORED + if cb = @set_cbs.shift + cb.call(true) + end + + when Cdeleted # DELETED + if cb = @del_cbs.shift + cb.call(true) + end + + when Cunknown # NOT_FOUND + if cb = @del_cbs.shift + cb.call(false) + end + + else + p [:MEMCACHE_UNKNOWN, line] + end + end + + #-- + # def receive_binary_data data + # @values[@cur_key] = data[0..-3] + # end + + # @private + def unbind + if @connected or @reconnecting + EM.add_timer(1){ reconnect @host, @port } + @connected = false + @reconnecting = true + @deferred_status = nil + else + raise 'Unable to connect to memcached server' + end + end + end + end +end + +if __FILE__ == $0 + # ruby -I ext:lib -r eventmachine -rubygems lib/protocols/memcache.rb + require 'em/spec' + + # @private + class TestConnection + include EM::P::Memcache + def send_data data + sent_data << data + end + def sent_data + @sent_data ||= '' + end + + def initialize + connection_completed + end + end + + EM.describe EM::Protocols::Memcache do + + before{ + @c = TestConnection.new + } + + should 'send get requests' do + @c.get('a'){} + @c.sent_data.should == "get a\r\n" + done + end + + should 'send set requests' do + @c.set('a', 1){} + @c.sent_data.should == "set a 0 0 1\r\n1\r\n" + done + end + + should 'use noreply on set without block' do + @c.set('a', 1) + @c.sent_data.should == "set a 0 0 1 noreply\r\n1\r\n" + done + end + + should 'send delete requests' do + @c.del('a') + @c.sent_data.should == "delete a 0 noreply\r\n" + done + end + + should 'work when get returns no values' do + @c.get('a'){ |a| + a.should.be.nil + done + } + + @c.receive_data "END\r\n" + end + + should 'invoke block on set' do + @c.set('a', 1){ + done + } + + @c.receive_data "STORED\r\n" + end + + should 'invoke block on delete' do + @c.delete('a'){ |found| + found.should.be.false + } + @c.delete('b'){ |found| + found.should.be.true + done + } + + @c.receive_data "NOT_FOUND\r\n" + @c.receive_data "DELETED\r\n" + end + + should 'parse split responses' do + @c.get('a'){ |a| + a.should == 'abc' + done + } + + @c.receive_data "VAL" + @c.receive_data "UE a 0 " + @c.receive_data "3\r\n" + @c.receive_data "ab" + @c.receive_data "c" + @c.receive_data "\r\n" + @c.receive_data "EN" + @c.receive_data "D\r\n" + end + + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/object_protocol.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/object_protocol.rb new file mode 100644 index 0000000..ec79cb4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/object_protocol.rb @@ -0,0 +1,46 @@ +module EventMachine + module Protocols + # ObjectProtocol allows for easy communication using marshaled ruby objects + # + # module RubyServer + # include EM::P::ObjectProtocol + # + # def receive_object obj + # send_object({'you said' => obj}) + # end + # end + # + module ObjectProtocol + # By default returns Marshal, override to return JSON or YAML, or any + # other serializer/deserializer responding to #dump and #load. + def serializer + Marshal + end + + # @private + def receive_data data + (@buf ||= '') << data + + while @buf.size >= 4 + if @buf.size >= 4+(size=@buf.unpack('N').first) + @buf.slice!(0,4) + receive_object serializer.load(@buf.slice!(0,size)) + else + break + end + end + end + + # Invoked with ruby objects received over the network + def receive_object obj + # stub + end + + # Sends a ruby object over the network + def send_object obj + data = serializer.dump(obj) + send_data [data.respond_to?(:bytesize) ? data.bytesize : data.size, data].pack('Na*') + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/postgres3.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/postgres3.rb new file mode 100644 index 0000000..7d87505 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/postgres3.rb @@ -0,0 +1,246 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 November 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-08 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# +# + +require 'postgres-pr/message' +require 'postgres-pr/connection' +require 'stringio' + +# @private +class StringIO + # Reads exactly +n+ bytes. + # + # If the data read is nil an EOFError is raised. + # + # If the data read is too short an IOError is raised + def readbytes(n) + str = read(n) + if str == nil + raise EOFError, "End of file reached" + end + if str.size < n + raise IOError, "data truncated" + end + str + end + alias read_exactly_n_bytes readbytes +end + + +module EventMachine + module Protocols + # PROVISIONAL IMPLEMENTATION of an evented Postgres client. + # This implements version 3 of the Postgres wire protocol, which will work + # with any Postgres version from roughly 7.4 onward. + # + # Objective: we want to access Postgres databases without requiring threads. + # Until now this has been a problem because the Postgres client implementations + # have all made use of blocking I/O calls, which is incompatible with a + # thread-free evented model. + # + # But rather than re-implement the Postgres Wire3 protocol, we're taking advantage + # of the existing postgres-pr library, which was originally written by Michael + # Neumann but (at this writing) appears to be no longer maintained. Still, it's + # in basically a production-ready state, and the wire protocol isn't that complicated + # anyway. + # + # We're tucking in a bunch of require statements that may not be present in garden-variety + # EM installations. Until we find a good way to only require these if a program + # requires postgres, this file will need to be required explicitly. + # + # We need to monkeypatch StringIO because it lacks the #readbytes method needed + # by postgres-pr. + # The StringIO monkeypatch is lifted from the standard library readbytes.rb, + # which adds method #readbytes directly to class IO. But StringIO is not a subclass of IO. + # It is modified to raise an IOError instead of TruncatedDataException since the exception is unused. + # + # We cloned the handling of postgres messages from lib/postgres-pr/connection.rb + # in the postgres-pr library, and modified it for event-handling. + # + # TODO: The password handling in dispatch_conn_message is totally incomplete. + # + # + # We return Deferrables from the user-level operations surfaced by this interface. + # Experimentally, we're using the pattern of always returning a boolean value as the + # first argument of a deferrable callback to indicate success or failure. This is + # instead of the traditional pattern of calling Deferrable#succeed or #fail, and + # requiring the user to define both a callback and an errback function. + # + # === Usage + # EM.run { + # db = EM.connect_unix_domain( "/tmp/.s.PGSQL.5432", EM::P::Postgres3 ) + # db.connect( dbname, username, psw ).callback do |status| + # if status + # db.query( "select * from some_table" ).callback do |status, result, errors| + # if status + # result.rows.each do |row| + # p row + # end + # end + # end + # end + # end + # } + class Postgres3 < EventMachine::Connection + include PostgresPR + + def initialize + @data = "" + @params = {} + end + + def connect db, user, psw=nil + d = EM::DefaultDeferrable.new + d.timeout 15 + + if @pending_query || @pending_conn + d.succeed false, "Operation already in progress" + else + @pending_conn = d + prms = {"user"=>user, "database"=>db} + @user = user + if psw + @password = psw + #prms["password"] = psw + end + send_data PostgresPR::StartupMessage.new( 3 << 16, prms ).dump + end + + d + end + + def query sql + d = EM::DefaultDeferrable.new + d.timeout 15 + + if @pending_query || @pending_conn + d.succeed false, "Operation already in progress" + else + @r = PostgresPR::Connection::Result.new + @e = [] + @pending_query = d + send_data PostgresPR::Query.dump(sql) + end + + d + end + + + def receive_data data + @data << data + while @data.length >= 5 + pktlen = @data[1...5].unpack("N").first + if @data.length >= (1 + pktlen) + pkt = @data.slice!(0...(1+pktlen)) + m = StringIO.open( pkt, "r" ) {|io| PostgresPR::Message.read( io ) } + if @pending_conn + dispatch_conn_message m + elsif @pending_query + dispatch_query_message m + else + raise "Unexpected message from database" + end + else + break # very important, break out of the while + end + end + end + + + def unbind + if o = (@pending_query || @pending_conn) + o.succeed false, "lost connection" + end + end + + # Cloned and modified from the postgres-pr. + def dispatch_conn_message msg + case msg + when AuthentificationClearTextPassword + raise ArgumentError, "no password specified" if @password.nil? + send_data PasswordMessage.new(@password).dump + + when AuthentificationCryptPassword + raise ArgumentError, "no password specified" if @password.nil? + send_data PasswordMessage.new(@password.crypt(msg.salt)).dump + + when AuthentificationMD5Password + raise ArgumentError, "no password specified" if @password.nil? + require 'digest/md5' + + m = Digest::MD5.hexdigest(@password + @user) + m = Digest::MD5.hexdigest(m + msg.salt) + m = 'md5' + m + send_data PasswordMessage.new(m).dump + + when AuthentificationKerberosV4, AuthentificationKerberosV5, AuthentificationSCMCredential + raise "unsupported authentification" + + when AuthentificationOk + when ErrorResponse + raise msg.field_values.join("\t") + when NoticeResponse + @notice_processor.call(msg) if @notice_processor + when ParameterStatus + @params[msg.key] = msg.value + when BackendKeyData + # TODO + #p msg + when ReadyForQuery + # TODO: use transaction status + pc,@pending_conn = @pending_conn,nil + pc.succeed true + else + raise "unhandled message type" + end + end + + # Cloned and modified from the postgres-pr. + def dispatch_query_message msg + case msg + when DataRow + @r.rows << msg.columns + when CommandComplete + @r.cmd_tag = msg.cmd_tag + when ReadyForQuery + pq,@pending_query = @pending_query,nil + pq.succeed true, @r, @e + when RowDescription + @r.fields = msg.fields + when CopyInResponse + when CopyOutResponse + when EmptyQueryResponse + when ErrorResponse + # TODO + @e << msg + when NoticeResponse + @notice_processor.call(msg) if @notice_processor + else + # TODO + end + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/saslauth.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/saslauth.rb new file mode 100644 index 0000000..9cabc51 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/saslauth.rb @@ -0,0 +1,175 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 November 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# +# + +module EventMachine + module Protocols + + # Implements SASL authd. + # This is a very, very simple protocol that mimics the one used + # by saslauthd and pwcheck, two outboard daemons included in the + # standard SASL library distro. + # The only thing this is really suitable for is SASL PLAIN + # (user+password) authentication, but the SASL libs that are + # linked into standard servers (like imapd and sendmail) implement + # the other ones. + # + # SASL-auth is intended for reasonably fast operation inside a + # single machine, so it has no transport-security (although there + # have been multi-machine extensions incorporating transport-layer + # encryption). + # + # The standard saslauthd module generally runs privileged and does + # its work by referring to the system-account files. + # + # This feature was added to EventMachine to enable the development + # of custom authentication/authorization engines for standard servers. + # + # To use SASLauth, include it in a class that subclasses EM::Connection, + # and reimplement the validate method. + # + # The typical way to incorporate this module into an authentication + # daemon would be to set it as the handler for a UNIX-domain socket. + # The code might look like this: + # + # EM.start_unix_domain_server( "/var/run/saslauthd/mux", MyHandler ) + # File.chmod( 0777, "/var/run/saslauthd/mux") + # + # The chmod is probably needed to ensure that unprivileged clients can + # access the UNIX-domain socket. + # + # It's also a very good idea to drop superuser privileges (if any), after + # the UNIX-domain socket has been opened. + #-- + # Implementation details: assume the client can send us pipelined requests, + # and that the client will close the connection. + # + # The client sends us four values, each encoded as a two-byte length field in + # network order followed by the specified number of octets. + # The fields specify the username, password, service name (such as imap), + # and the "realm" name. We send back the barest minimum reply, a single + # field also encoded as a two-octet length in network order, followed by + # either "NO" or "OK" - simplicity itself. + # + # We enforce a maximum field size just as a sanity check. + # We do NOT automatically time out the connection. + # + # The code we use to parse out the values is ugly and probably slow. + # Improvements welcome. + # + module SASLauth + + MaxFieldSize = 128*1024 + def post_init + super + @sasl_data = "" + @sasl_values = [] + end + + def receive_data data + @sasl_data << data + while @sasl_data.length >= 2 + len = (@sasl_data[0,2].unpack("n")).first + raise "SASL Max Field Length exceeded" if len > MaxFieldSize + if @sasl_data.length >= (len + 2) + @sasl_values << @sasl_data[2,len] + @sasl_data.slice!(0...(2+len)) + if @sasl_values.length == 4 + send_data( validate(*@sasl_values) ? "\0\002OK" : "\0\002NO" ) + @sasl_values.clear + end + else + break + end + end + end + + def validate username, psw, sysname, realm + p username + p psw + p sysname + p realm + true + end + end + + # Implements the SASL authd client protocol. + # This is a very, very simple protocol that mimics the one used + # by saslauthd and pwcheck, two outboard daemons included in the + # standard SASL library distro. + # The only thing this is really suitable for is SASL PLAIN + # (user+password) authentication, but the SASL libs that are + # linked into standard servers (like imapd and sendmail) implement + # the other ones. + # + # You can use this module directly as a handler for EM Connections, + # or include it in a module or handler class of your own. + # + # First connect to a SASL server (it's probably a TCP server, or more + # likely a Unix-domain socket). Then call the #validate? method, + # passing at least a username and a password. #validate? returns + # a Deferrable which will either succeed or fail, depending + # on the status of the authentication operation. + # + module SASLauthclient + MaxFieldSize = 128*1024 + + def validate? username, psw, sysname=nil, realm=nil + + str = [username, psw, sysname, realm].map {|m| + [(m || "").length, (m || "")] + }.flatten.pack( "nA*" * 4 ) + send_data str + + d = EM::DefaultDeferrable.new + @queries.unshift d + d + end + + def post_init + @sasl_data = "" + @queries = [] + end + + def receive_data data + @sasl_data << data + + while @sasl_data.length > 2 + len = (@sasl_data[0,2].unpack("n")).first + raise "SASL Max Field Length exceeded" if len > MaxFieldSize + if @sasl_data.length >= (len + 2) + val = @sasl_data[2,len] + @sasl_data.slice!(0...(2+len)) + q = @queries.pop + (val == "NO") ? q.fail : q.succeed + else + break + end + end + end + end + + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/smtpclient.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/smtpclient.rb new file mode 100644 index 0000000..25ad17a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/smtpclient.rb @@ -0,0 +1,394 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 July 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +require 'ostruct' + +module EventMachine + module Protocols + + # Simple SMTP client + # + # @example + # email = EM::Protocols::SmtpClient.send( + # :domain=>"example.com", + # :host=>'localhost', + # :port=>25, # optional, defaults 25 + # :starttls=>true, # use ssl + # :from=>"sender@example.com", + # :to=> ["to_1@example.com", "to_2@example.com"], + # :header=> {"Subject" => "This is a subject line"}, + # :body=> "This is the body of the email" + # ) + # email.callback{ + # puts 'Email sent!' + # } + # email.errback{ |e| + # puts 'Email failed!' + # } + # + # Sending generated emails (using Mail) + # + # mail = Mail.new do + # from 'alice@example.com' + # to 'bob@example.com' + # subject 'This is a test email' + # body 'Hello, world!' + # end + # + # email = EM::P::SmtpClient.send( + # :domain=>'example.com', + # :from=>mail.from.first, + # :to=>mail.to, + # :message=>mail.to_s + # ) + # + class SmtpClient < Connection + include EventMachine::Deferrable + include EventMachine::Protocols::LineText2 + + def initialize + @succeeded = nil + @responder = nil + @code = nil + @msg = nil + end + + # :host => required String + # a string containing the IP address or host name of the SMTP server to connect to. + # :port => optional + # defaults to 25. + # :domain => required String + # This is passed as the argument to the EHLO command. + # :starttls => optional Boolean + # If it evaluates true, then the client will initiate STARTTLS with + # the server, and abort the connection if the negotiation doesn't succeed. + # TODO, need to be able to pass certificate parameters with this option. + # :auth => optional Hash of auth parameters + # If not given, then no auth will be attempted. + # (In that case, the connection will be aborted if the server requires auth.) + # Specify the hash value :type to determine the auth type, along with additional parameters + # depending on the type. + # Currently only :type => :plain is supported. Pass additional parameters :username (String), + # and :password (either a String or a Proc that will be called at auth-time). + # + # @example + # :auth => {:type=>:plain, :username=>"mickey@disney.com", :password=>"mouse"} + # + # :from => required String + # Specifies the sender of the message. Will be passed as the argument + # to the MAIL FROM. Do NOT enclose the argument in angle-bracket (<>) characters. + # The connection will abort if the server rejects the value. + # :to => required String or Array of Strings + # The recipient(s) of the message. Do NOT enclose + # any of the values in angle-brackets (<>) characters. It's NOT a fatal error if one or more + # recipients are rejected by the server. (Of course, if ALL of them are, the server will most + # likely trigger an error when we try to send data.) An array of codes containing the status + # of each requested recipient is available after the call completes. TODO, we should define + # an overridable stub that will be called on rejection of a recipient or a sender, giving + # user code the chance to try again or abort the connection. + # + # One of either :message, :content, or :header and :body is required: + # + # :message => String + # A valid RFC2822 Internet Message. + # :content => String + # Raw data which MUST be in correct SMTP body format, with escaped leading dots and a trailing + # dot line. + # :header => String or Hash of values to be transmitted in the header of the message. + # The hash keys are the names of the headers (do NOT append a trailing colon), and the values + # are strings containing the header values. TODO, support Arrays of header values, which would + # cause us to send that specific header line more than once. + # + # @example + # :header => {"Subject" => "Bogus", "CC" => "myboss@example.com"} + # + # :body => Optional String or Array of Strings, defaults blank. + # This will be passed as the body of the email message. + # TODO, this needs to be significantly beefed up. As currently written, this requires the caller + # to properly format the input into CRLF-delimited lines of 7-bit characters in the standard + # SMTP transmission format. We need to be able to automatically convert binary data, and add + # correct line-breaks to text data. + # + # :verbose => Optional. + # If true, will cause a lot of information (including the server-side of the + # conversation) to be dumped to $>. + # + def self.send args={} + args[:port] ||= 25 + args[:body] ||= "" + +=begin + (I don't think it's possible for EM#connect to throw an exception under normal + circumstances, so this original code is stubbed out. A connect-failure will result + in the #unbind method being called without calling #connection_completed.) + begin + EventMachine.connect( args[:host], args[:port], self) {|c| + # According to the EM docs, we will get here AFTER post_init is called. + c.args = args + c.set_comm_inactivity_timeout 60 + } + rescue + # We'll get here on a connect error. This code mimics the effect + # of a call to invoke_internal_error. Would be great to DRY this up. + # (Actually, it may be that we never get here, if EM#connect catches + # its errors internally.) + d = EM::DefaultDeferrable.new + d.set_deferred_status(:failed, {:error=>[:connect, 500, "unable to connect to server"]}) + d + end +=end + EventMachine.connect( args[:host], args[:port], self) {|c| + # According to the EM docs, we will get here AFTER post_init is called. + c.args = args + c.set_comm_inactivity_timeout 60 + } + end + + attr_writer :args + + # @private + def post_init + @return_values = OpenStruct.new + @return_values.start_time = Time.now + end + + # @private + def connection_completed + @responder = :receive_signon + @msg = [] + end + + # We can get here in a variety of ways, all of them being failures unless + # the @succeeded flag is set. If a protocol success was recorded, then don't + # set a deferred success because the caller will already have done it + # (no need to wait until the connection closes to invoke the callbacks). + # + # @private + def unbind + unless @succeeded + @return_values.elapsed_time = Time.now - @return_values.start_time + @return_values.responder = @responder + @return_values.code = @code + @return_values.message = @msg + set_deferred_status(:failed, @return_values) + end + end + + # @private + def receive_line ln + $>.puts ln if @args[:verbose] + @range = ln[0...1].to_i + @code = ln[0...3].to_i + @msg << ln[4..-1] + unless ln[3...4] == '-' + $>.puts @responder if @args[:verbose] + send @responder + @msg.clear + end + end + + private + + # We encountered an error from the server and will close the connection. + # Use the error and message the server returned. + # + def invoke_error + @return_values.elapsed_time = Time.now - @return_values.start_time + @return_values.responder = @responder + @return_values.code = @code + @return_values.message = @msg + set_deferred_status :failed, @return_values + send_data "QUIT\r\n" + close_connection_after_writing + end + + # We encountered an error on our side of the protocol and will close the connection. + # Use an extra-protocol error code (900) and use the message from the caller. + # + def invoke_internal_error msg = "???" + @return_values.elapsed_time = Time.now - @return_values.start_time + @return_values.responder = @responder + @return_values.code = 900 + @return_values.message = msg + set_deferred_status :failed, @return_values + send_data "QUIT\r\n" + close_connection_after_writing + end + + def send_ehlo + send_data "EHLO #{@args[:domain]}\r\n" + end + + def receive_signon + return invoke_error unless @range == 2 + send_ehlo + @responder = :receive_ehlo_response + end + def receive_ehlo_response + return invoke_error unless @range == 2 + @server_caps = @msg + invoke_starttls + end + + def invoke_starttls + if @args[:starttls] + # It would be more sociable to first ask if @server_caps contains + # the string "STARTTLS" before we invoke it, but hey, life's too short. + send_data "STARTTLS\r\n" + @responder = :receive_starttls_response + else + invoke_auth + end + end + def receive_starttls_response + return invoke_error unless @range == 2 + start_tls + invoke_ehlo_over_tls + end + + def invoke_ehlo_over_tls + send_ehlo + @responder = :receive_ehlo_over_tls_response + end + def receive_ehlo_over_tls_response + return invoke_error unless @range == 2 + invoke_auth + end + + # Perform an authentication. If the caller didn't request one, then fall through + # to the mail-from state. + def invoke_auth + if @args[:auth] + if @args[:auth][:type] == :plain + psw = @args[:auth][:password] + if psw.respond_to?(:call) + psw = psw.call + end + #str = Base64::encode64("\0#{@args[:auth][:username]}\0#{psw}").chomp + str = ["\0#{@args[:auth][:username]}\0#{psw}"].pack("m").gsub(/\n/, '') + send_data "AUTH PLAIN #{str}\r\n" + @responder = :receive_auth_response + else + return invoke_internal_error("unsupported auth type") + end + else + invoke_mail_from + end + end + def receive_auth_response + return invoke_error unless @range == 2 + invoke_mail_from + end + + def invoke_mail_from + send_data "MAIL FROM: <#{@args[:from]}>\r\n" + @responder = :receive_mail_from_response + end + def receive_mail_from_response + return invoke_error unless @range == 2 + invoke_rcpt_to + end + + def invoke_rcpt_to + @rcpt_responses ||= [] + l = @rcpt_responses.length + to = @args[:to].is_a?(Array) ? @args[:to] : [@args[:to].to_s] + if l < to.length + send_data "RCPT TO: <#{to[l]}>\r\n" + @responder = :receive_rcpt_to_response + else + e = @rcpt_responses.select {|rr| rr.last == 2} + if e and e.length > 0 + invoke_data + else + invoke_error + end + end + end + def receive_rcpt_to_response + @rcpt_responses << [@code, @msg, @range] + invoke_rcpt_to + end + + def escape_leading_dots(s) + s.gsub(/^\./, '..') + end + + def invoke_data + send_data "DATA\r\n" + @responder = :receive_data_response + end + def receive_data_response + return invoke_error unless @range == 3 + + # The data to send can be given in either @args[:message], @args[:content], or the + # combination of @args[:header] and @args[:body]. + # + # - @args[:message] (String) MUST be a valid RFC2822 Internet Message + # + # - @args[:content] (String) MUST be in correct SMTP body format, with escaped + # leading dots and a trailing dot line + # + # - @args[:header] (Hash or String) + # - @args[:body] (Array or String) + if @args[:message] + send_data escape_leading_dots(@args[:message].to_s) + send_data "\r\n.\r\n" + elsif @args[:content] + send_data @args[:content].to_s + else + # The header can be a hash or an array. + if @args[:header].is_a?(Hash) + (@args[:header] || {}).each {|k,v| send_data escape_leading_dots("#{k}: #{v}\r\n") } + else + send_data escape_leading_dots(@args[:header].to_s) + end + send_data "\r\n" + + if @args[:body].is_a?(Array) + @args[:body].each {|e| send_data escape_leading_dots(e)} + else + send_data escape_leading_dots(@args[:body].to_s) + end + + send_data "\r\n.\r\n" + end + + @responder = :receive_message_response + end + def receive_message_response + return invoke_error unless @range == 2 + send_data "QUIT\r\n" + close_connection_after_writing + @succeeded = true + @return_values.elapsed_time = Time.now - @return_values.start_time + @return_values.responder = @responder + @return_values.code = @code + @return_values.message = @msg + set_deferred_status :succeeded, @return_values + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/smtpserver.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/smtpserver.rb new file mode 100644 index 0000000..e0f1f05 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/smtpserver.rb @@ -0,0 +1,666 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 July 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Protocols + + # This is a protocol handler for the server side of SMTP. + # It's NOT a complete SMTP server obeying all the semantics of servers conforming to + # RFC2821. Rather, it uses overridable method stubs to communicate protocol states + # and data to user code. User code is responsible for doing the right things with the + # data in order to get complete and correct SMTP server behavior. + # + # Simple SMTP server example: + # + # class EmailServer < EM::P::SmtpServer + # def receive_plain_auth(user, pass) + # true + # end + # + # def get_server_domain + # "mock.smtp.server.local" + # end + # + # def get_server_greeting + # "mock smtp server greets you with impunity" + # end + # + # def receive_sender(sender) + # current.sender = sender + # true + # end + # + # def receive_recipient(recipient) + # current.recipient = recipient + # true + # end + # + # def receive_message + # current.received = true + # current.completed_at = Time.now + # + # p [:received_email, current] + # @current = OpenStruct.new + # true + # end + # + # def receive_ehlo_domain(domain) + # @ehlo_domain = domain + # true + # end + # + # def receive_data_command + # current.data = "" + # true + # end + # + # def receive_data_chunk(data) + # current.data << data.join("\n") + # true + # end + # + # def receive_transaction + # if @ehlo_domain + # current.ehlo_domain = @ehlo_domain + # @ehlo_domain = nil + # end + # true + # end + # + # def current + # @current ||= OpenStruct.new + # end + # + # def self.start(host = 'localhost', port = 1025) + # require 'ostruct' + # @server = EM.start_server host, port, self + # end + # + # def self.stop + # if @server + # EM.stop_server @server + # @server = nil + # end + # end + # + # def self.running? + # !!@server + # end + # end + # + # EM.run{ EmailServer.start } + # + #-- + # Useful paragraphs in RFC-2821: + # 4.3.2: Concise list of command-reply sequences, in essence a text representation + # of the command state-machine. + # + # STARTTLS is defined in RFC2487. + # Observe that there are important rules governing whether a publicly-referenced server + # (meaning one whose Internet address appears in public MX records) may require the + # non-optional use of TLS. + # Non-optional TLS does not apply to EHLO, NOOP, QUIT or STARTTLS. + class SmtpServer < EventMachine::Connection + include Protocols::LineText2 + + HeloRegex = /\AHELO\s*/i + EhloRegex = /\AEHLO\s*/i + QuitRegex = /\AQUIT/i + MailFromRegex = /\AMAIL FROM:\s*/i + RcptToRegex = /\ARCPT TO:\s*/i + DataRegex = /\ADATA/i + NoopRegex = /\ANOOP/i + RsetRegex = /\ARSET/i + VrfyRegex = /\AVRFY\s+/i + ExpnRegex = /\AEXPN\s+/i + HelpRegex = /\AHELP/i + StarttlsRegex = /\ASTARTTLS/i + AuthRegex = /\AAUTH\s+/i + + + # Class variable containing default parameters that can be overridden + # in application code. + # Individual objects of this class will make an instance-local copy of + # the class variable, so that they can be reconfigured on a per-instance + # basis. + # + # Chunksize is the number of data lines we'll buffer before + # sending them to the application. TODO, make this user-configurable. + # + @@parms = { + :chunksize => 4000, + :verbose => false + } + def self.parms= parms={} + @@parms.merge!(parms) + end + + + + def initialize *args + super + @parms = @@parms + init_protocol_state + end + + def parms= parms={} + @parms.merge!(parms) + end + + # In SMTP, the server talks first. But by a (perhaps flawed) axiom in EM, + # #post_init will execute BEFORE the block passed to #start_server, for any + # given accepted connection. Since in this class we'll probably be getting + # a lot of initialization parameters, we want the guts of post_init to + # run AFTER the application has initialized the connection object. So we + # use a spawn to schedule the post_init to run later. + # It's a little weird, I admit. A reasonable alternative would be to set + # parameters as a class variable and to do that before accepting any connections. + # + # OBSOLETE, now we have @@parms. But the spawn is nice to keep as an illustration. + # + def post_init + #send_data "220 #{get_server_greeting}\r\n" (ORIGINAL) + #(EM.spawn {|x| x.send_data "220 #{x.get_server_greeting}\r\n"}).notify(self) + (EM.spawn {|x| x.send_server_greeting}).notify(self) + end + + def send_server_greeting + send_data "220 #{get_server_greeting}\r\n" + end + + def receive_line ln + @@parms[:verbose] and $>.puts ">>> #{ln}" + + return process_data_line(ln) if @state.include?(:data) + return process_auth_line(ln) if @state.include?(:auth_incomplete) + + case ln + when EhloRegex + process_ehlo $'.dup + when HeloRegex + process_helo $'.dup + when MailFromRegex + process_mail_from $'.dup + when RcptToRegex + process_rcpt_to $'.dup + when DataRegex + process_data + when RsetRegex + process_rset + when VrfyRegex + process_vrfy + when ExpnRegex + process_expn + when HelpRegex + process_help + when NoopRegex + process_noop + when QuitRegex + process_quit + when StarttlsRegex + process_starttls + when AuthRegex + process_auth $'.dup + else + process_unknown + end + end + + # TODO - implement this properly, the implementation is a stub! + def process_help + send_data "250 Ok, but unimplemented\r\n" + end + + # RFC2821, 3.5.3 Meaning of VRFY or EXPN Success Response: + # A server MUST NOT return a 250 code in response to a VRFY or EXPN + # command unless it has actually verified the address. In particular, + # a server MUST NOT return 250 if all it has done is to verify that the + # syntax given is valid. In that case, 502 (Command not implemented) + # or 500 (Syntax error, command unrecognized) SHOULD be returned. + # + # TODO - implement this properly, the implementation is a stub! + def process_vrfy + send_data "502 Command not implemented\r\n" + end + # TODO - implement this properly, the implementation is a stub! + def process_expn + send_data "502 Command not implemented\r\n" + end + + #-- + # This is called at several points to restore the protocol state + # to a pre-transaction state. In essence, we "forget" having seen + # any valid command except EHLO and STARTTLS. + # We also have to callback user code, in case they're keeping track + # of senders, recipients, and whatnot. + # + # We try to follow the convention of avoiding the verb "receive" for + # internal method names except receive_line (which we inherit), and + # using only receive_xxx for user-overridable stubs. + # + # init_protocol_state is called when we initialize the connection as + # well as during reset_protocol_state. It does NOT call the user + # override method. This enables us to promise the users that they + # won't see the overridable fire except after EHLO and RSET, and + # after a message has been received. Although the latter may be wrong. + # The standard may allow multiple DATA segments with the same set of + # senders and recipients. + # + def reset_protocol_state + init_protocol_state + s,@state = @state,[] + @state << :starttls if s.include?(:starttls) + @state << :ehlo if s.include?(:ehlo) + receive_transaction + end + def init_protocol_state + @state ||= [] + end + + + #-- + # EHLO/HELO is always legal, per the standard. On success + # it always clears buffers and initiates a mail "transaction." + # Which means that a MAIL FROM must follow. + # + # Per the standard, an EHLO/HELO or a RSET "initiates" an email + # transaction. Thereafter, MAIL FROM must be received before + # RCPT TO, before DATA. Not sure what this specific ordering + # achieves semantically, but it does make it easier to + # implement. We also support user-specified requirements for + # STARTTLS and AUTH. We make it impossible to proceed to MAIL FROM + # without fulfilling tls and/or auth, if the user specified either + # or both as required. We need to check the extension standard + # for auth to see if a credential is discarded after a RSET along + # with all the rest of the state. We'll behave as if it is. + # Now clearly, we can't discard tls after its been negotiated + # without dropping the connection, so that flag doesn't get cleared. + # + def process_ehlo domain + if receive_ehlo_domain domain + send_data "250-#{get_server_domain}\r\n" + if @@parms[:starttls] + send_data "250-STARTTLS\r\n" + end + if @@parms[:auth] + send_data "250-AUTH PLAIN\r\n" + end + send_data "250-NO-SOLICITING\r\n" + # TODO, size needs to be configurable. + send_data "250 SIZE 20000000\r\n" + reset_protocol_state + @state << :ehlo + else + send_data "550 Requested action not taken\r\n" + end + end + + def process_helo domain + if receive_ehlo_domain domain.dup + send_data "250 #{get_server_domain}\r\n" + reset_protocol_state + @state << :ehlo + else + send_data "550 Requested action not taken\r\n" + end + end + + def process_quit + send_data "221 Ok\r\n" + close_connection_after_writing + end + + def process_noop + send_data "250 Ok\r\n" + end + + def process_unknown + send_data "500 Unknown command\r\n" + end + + #-- + # So far, only AUTH PLAIN is supported but we should do at least LOGIN as well. + # TODO, support clients that send AUTH PLAIN with no parameter, expecting a 3xx + # response and a continuation of the auth conversation. + # + def process_auth str + if @state.include?(:auth) + send_data "503 auth already issued\r\n" + elsif str =~ /\APLAIN\s?/i + if $'.length == 0 + # we got a partial response, so let the client know to send the rest + @state << :auth_incomplete + send_data("334 \r\n") + else + # we got the initial response, so go ahead & process it + process_auth_line($') + end + #elsif str =~ /\ALOGIN\s+/i + else + send_data "504 auth mechanism not available\r\n" + end + end + + def process_auth_line(line) + plain = line.unpack("m").first + _,user,psw = plain.split("\000") + + succeeded = proc { + send_data "235 authentication ok\r\n" + @state << :auth + } + failed = proc { + send_data "535 invalid authentication\r\n" + } + auth = receive_plain_auth user,psw + + if auth.respond_to?(:callback) + auth.callback(&succeeded) + auth.errback(&failed) + else + (auth ? succeeded : failed).call + end + + @state.delete :auth_incomplete + end + + #-- + # Unusually, we can deal with a Deferrable returned from the user application. + # This was added to deal with a special case in a particular application, but + # it would be a nice idea to add it to the other user-code callbacks. + # + def process_data + unless @state.include?(:rcpt) + send_data "503 Operation sequence error\r\n" + else + succeeded = proc { + send_data "354 Send it\r\n" + @state << :data + @databuffer = [] + } + failed = proc { + send_data "550 Operation failed\r\n" + } + + d = receive_data_command + + if d.respond_to?(:callback) + d.callback(&succeeded) + d.errback(&failed) + else + (d ? succeeded : failed).call + end + end + end + + def process_rset + reset_protocol_state + receive_reset + send_data "250 Ok\r\n" + end + + def unbind + connection_ended + end + + #-- + # STARTTLS may not be issued before EHLO, or unless the user has chosen + # to support it. + # + # If :starttls_options is present and :starttls is set in the parms + # pass the options in :starttls_options to start_tls. Do this if you want to use + # your own certificate + # e.g. {:cert_chain_file => "/etc/ssl/cert.pem", :private_key_file => "/etc/ssl/private/cert.key"} + + def process_starttls + if @@parms[:starttls] + if @state.include?(:starttls) + send_data "503 TLS Already negotiated\r\n" + elsif ! @state.include?(:ehlo) + send_data "503 EHLO required before STARTTLS\r\n" + else + send_data "220 Start TLS negotiation\r\n" + start_tls(@@parms[:starttls_options] || {}) + @state << :starttls + end + else + process_unknown + end + end + + + #-- + # Requiring TLS is touchy, cf RFC2784. + # Requiring AUTH seems to be much more reasonable. + # We don't currently support any notion of deriving an authentication from the TLS + # negotiation, although that would certainly be reasonable. + # We DON'T allow MAIL FROM to be given twice. + # We DON'T enforce all the various rules for validating the sender or + # the reverse-path (like whether it should be null), and notifying the reverse + # path in case of delivery problems. All of that is left to the calling application. + # + def process_mail_from sender + if (@@parms[:starttls]==:required and !@state.include?(:starttls)) + send_data "550 This server requires STARTTLS before MAIL FROM\r\n" + elsif (@@parms[:auth]==:required and !@state.include?(:auth)) + send_data "550 This server requires authentication before MAIL FROM\r\n" + elsif @state.include?(:mail_from) + send_data "503 MAIL already given\r\n" + else + unless receive_sender sender + send_data "550 sender is unacceptable\r\n" + else + send_data "250 Ok\r\n" + @state << :mail_from + end + end + end + + #-- + # Since we require :mail_from to have been seen before we process RCPT TO, + # we don't need to repeat the tests for TLS and AUTH. + # Note that we don't remember or do anything else with the recipients. + # All of that is on the user code. + # TODO: we should enforce user-definable limits on the total number of + # recipients per transaction. + # We might want to make sure that a given recipient is only seen once, but + # for now we'll let that be the user's problem. + # + # User-written code can return a deferrable from receive_recipient. + # + def process_rcpt_to rcpt + unless @state.include?(:mail_from) + send_data "503 MAIL is required before RCPT\r\n" + else + succeeded = proc { + send_data "250 Ok\r\n" + @state << :rcpt unless @state.include?(:rcpt) + } + failed = proc { + send_data "550 recipient is unacceptable\r\n" + } + + d = receive_recipient rcpt + + if d.respond_to?(:set_deferred_status) + d.callback(&succeeded) + d.errback(&failed) + else + (d ? succeeded : failed).call + end + +=begin + unless receive_recipient rcpt + send_data "550 recipient is unacceptable\r\n" + else + send_data "250 Ok\r\n" + @state << :rcpt unless @state.include?(:rcpt) + end +=end + end + end + + + # Send the incoming data to the application one chunk at a time, rather than + # one line at a time. That lets the application be a little more flexible about + # storing to disk, etc. + # Since we clear the chunk array every time we submit it, the caller needs to be + # aware to do things like dup it if he wants to keep it around across calls. + # + # Resets the transaction upon disposition of the incoming message. + # RFC5321 says this about the MAIL FROM command: + # "This command tells the SMTP-receiver that a new mail transaction is + # starting and to reset all its state tables and buffers, including any + # recipients or mail data." + # + # Equivalent behaviour is implemented by resetting after a completed transaction. + # + # User-written code can return a Deferrable as a response from receive_message. + # + def process_data_line ln + if ln == "." + if @databuffer.length > 0 + receive_data_chunk @databuffer + @databuffer.clear + end + + + succeeded = proc { + send_data "250 Message accepted\r\n" + reset_protocol_state + } + failed = proc { + send_data "550 Message rejected\r\n" + reset_protocol_state + } + d = receive_message + + if d.respond_to?(:set_deferred_status) + d.callback(&succeeded) + d.errback(&failed) + else + (d ? succeeded : failed).call + end + + @state.delete :data + else + # slice off leading . if any + ln.slice!(0...1) if ln[0] == ?. + @databuffer << ln + if @databuffer.length > @@parms[:chunksize] + receive_data_chunk @databuffer + @databuffer.clear + end + end + end + + + #------------------------------------------ + # Everything from here on can be overridden in user code. + + # The greeting returned in the initial connection message to the client. + def get_server_greeting + "EventMachine SMTP Server" + end + # The domain name returned in the first line of the response to a + # successful EHLO or HELO command. + def get_server_domain + "Ok EventMachine SMTP Server" + end + + # A false response from this user-overridable method will cause a + # 550 error to be returned to the remote client. + # + def receive_ehlo_domain domain + true + end + + # Return true or false to indicate that the authentication is acceptable. + def receive_plain_auth user, password + true + end + + # Receives the argument of the MAIL FROM command. Return false to + # indicate to the remote client that the sender is not accepted. + # This can only be successfully called once per transaction. + # + def receive_sender sender + true + end + + # Receives the argument of a RCPT TO command. Can be given multiple + # times per transaction. Return false to reject the recipient. + # + def receive_recipient rcpt + true + end + + # Sent when the remote peer issues the RSET command. + # Since RSET is not allowed to fail (according to the protocol), + # we ignore any return value from user overrides of this method. + # + def receive_reset + end + + # Sent when the remote peer has ended the connection. + # + def connection_ended + end + + # Called when the remote peer sends the DATA command. + # Returning false will cause us to send a 550 error to the peer. + # This can be useful for dealing with problems that arise from processing + # the whole set of sender and recipients. + # + def receive_data_command + true + end + + # Sent when data from the remote peer is available. The size can be controlled + # by setting the :chunksize parameter. This call can be made multiple times. + # The goal is to strike a balance between sending the data to the application one + # line at a time, and holding all of a very large message in memory. + # + def receive_data_chunk data + @smtps_msg_size ||= 0 + @smtps_msg_size += data.join.length + STDERR.write "<#{@smtps_msg_size}>" + end + + # Sent after a message has been completely received. User code + # must return true or false to indicate whether the message has + # been accepted for delivery. + def receive_message + @@parms[:verbose] and $>.puts "Received complete message" + true + end + + # This is called when the protocol state is reset. It happens + # when the remote client calls EHLO/HELO or RSET. + def receive_transaction + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/socks4.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/socks4.rb new file mode 100644 index 0000000..132f320 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/socks4.rb @@ -0,0 +1,66 @@ +module EventMachine + module Protocols + # Basic SOCKS v4 client implementation + # + # Use as you would any regular connection: + # + # class MyConn < EM::P::Socks4 + # def post_init + # send_data("sup") + # end + # + # def receive_data(data) + # send_data("you said: #{data}") + # end + # end + # + # EM.connect socks_host, socks_port, MyConn, host, port + # + class Socks4 < Connection + def initialize(host, port) + @host = Socket.gethostbyname(host).last + @port = port + @socks_error_code = nil + @buffer = '' + setup_methods + end + + def setup_methods + class << self + def post_init; socks_post_init; end + def receive_data(*a); socks_receive_data(*a); end + end + end + + def restore_methods + class << self + remove_method :post_init + remove_method :receive_data + end + end + + def socks_post_init + header = [4, 1, @port, @host, 0].flatten.pack("CCnA4C") + send_data(header) + end + + def socks_receive_data(data) + @buffer << data + return if @buffer.size < 8 + + header_resp = @buffer.slice! 0, 8 + _, r = header_resp.unpack("cc") + if r != 90 + @socks_error_code = r + close_connection + return + end + + restore_methods + + post_init + receive_data(@buffer) unless @buffer.empty? + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/stomp.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/stomp.rb new file mode 100644 index 0000000..ca6f078 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/stomp.rb @@ -0,0 +1,205 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 November 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# +# + +module EventMachine + module Protocols + + # Implements Stomp (http://docs.codehaus.org/display/STOMP/Protocol). + # + # == Usage example + # + # module StompClient + # include EM::Protocols::Stomp + # + # def connection_completed + # connect :login => 'guest', :passcode => 'guest' + # end + # + # def receive_msg msg + # if msg.command == "CONNECTED" + # subscribe '/some/topic' + # else + # p ['got a message', msg] + # puts msg.body + # end + # end + # end + # + # EM.run{ + # EM.connect 'localhost', 61613, StompClient + # } + # + module Stomp + include LineText2 + + class Message + # The command associated with the message, usually 'CONNECTED' or 'MESSAGE' + attr_accessor :command + # Hash containing headers such as destination and message-id + attr_accessor :header + alias :headers :header + # Body of the message + attr_accessor :body + + # @private + def initialize + @header = {} + @state = :precommand + @content_length = nil + end + # @private + def consume_line line + if @state == :precommand + unless line =~ /\A\s*\Z/ + @command = line + @state = :headers + end + elsif @state == :headers + if line == "" + if @content_length + yield( [:sized_text, @content_length+1] ) + else + @state = :body + yield( [:unsized_text] ) + end + elsif line =~ /\A([^:]+):(.+)\Z/ + k = $1.dup.strip + v = $2.dup.strip + @header[k] = v + if k == "content-length" + @content_length = v.to_i + end + else + # This is a protocol error. How to signal it? + end + elsif @state == :body + @body = line + yield( [:dispatch] ) + end + end + end + + # @private + def send_frame verb, headers={}, body="" + body = body.to_s + ary = [verb, "\n"] + body_bytesize = body.bytesize if body.respond_to? :bytesize + body_bytesize ||= body.size + headers.each {|k,v| ary << "#{k}:#{v}\n" } + ary << "content-length: #{body_bytesize}\n" + ary << "content-type: text/plain; charset=UTF-8\n" unless headers.has_key? 'content-type' + ary << "\n" + ary << body + ary << "\0" + send_data ary.join + end + + # @private + def receive_line line + @stomp_initialized || init_message_reader + @stomp_message.consume_line(line) {|outcome| + if outcome.first == :sized_text + set_text_mode outcome[1] + elsif outcome.first == :unsized_text + set_delimiter "\0" + elsif outcome.first == :dispatch + receive_msg(@stomp_message) if respond_to?(:receive_msg) + init_message_reader + end + } + end + + # @private + def receive_binary_data data + @stomp_message.body = data[0..-2] + receive_msg(@stomp_message) if respond_to?(:receive_msg) + init_message_reader + end + + # @private + def init_message_reader + @stomp_initialized = true + set_delimiter "\n" + set_line_mode + @stomp_message = Message.new + end + + # Invoked with an incoming Stomp::Message received from the STOMP server + def receive_msg msg + # stub, overwrite this in your handler + end + + # CONNECT command, for authentication + # + # connect :login => 'guest', :passcode => 'guest' + # + def connect parms={} + send_frame "CONNECT", parms + end + + # SEND command, for publishing messages to a topic + # + # send '/topic/name', 'some message here' + # + def send destination, body, parms={} + send_frame "SEND", parms.merge( :destination=>destination ), body.to_s + end + + # SUBSCRIBE command, for subscribing to topics + # + # subscribe '/topic/name', false + # + def subscribe dest, ack=false + send_frame "SUBSCRIBE", {:destination=>dest, :ack=>(ack ? "client" : "auto")} + end + + # ACK command, for acknowledging receipt of messages + # + # module StompClient + # include EM::P::Stomp + # + # def connection_completed + # connect :login => 'guest', :passcode => 'guest' + # # subscribe with ack mode + # subscribe '/some/topic', true + # end + # + # def receive_msg msg + # if msg.command == "MESSAGE" + # ack msg.headers['message-id'] + # puts msg.body + # end + # end + # end + # + def ack msgid + send_frame "ACK", 'message-id'=> msgid + end + + end + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/tcptest.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/tcptest.rb new file mode 100644 index 0000000..3187893 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/protocols/tcptest.rb @@ -0,0 +1,54 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 July 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# +# + +module EventMachine + module Protocols + + # @private + class TcpConnectTester < Connection + include EventMachine::Deferrable + + def self.test( host, port ) + EventMachine.connect( host, port, self ) + end + + def post_init + @start_time = Time.now + end + + def connection_completed + @completed = true + set_deferred_status :succeeded, (Time.now - @start_time) + close_connection + end + + def unbind + set_deferred_status :failed, (Time.now - @start_time) unless @completed + end + end + + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/pure_ruby.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/pure_ruby.rb new file mode 100644 index 0000000..4f56aee --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/pure_ruby.rb @@ -0,0 +1,1279 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 8 Apr 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#------------------------------------------------------------------- +# +# + +# TODO List: +# TCP-connects currently assume non-blocking connect is available- need to +# degrade automatically on versions of Ruby prior to June 2006. +# + +require 'singleton' +require 'forwardable' +require 'socket' +require 'fcntl' +require 'set' +require 'openssl' + +module EventMachine + # @private + class Error < Exception; end + # @private + class UnknownTimerFired < RuntimeError; end + # @private + class Unsupported < RuntimeError; end + # @private + class ConnectionError < RuntimeError; end + # @private + class ConnectionNotBound < RuntimeError; end + + # Older versions of Ruby may not provide the SSLErrorWaitReadable + # OpenSSL class. Create an error class to act as a "proxy". + if defined?(OpenSSL::SSL::SSLErrorWaitReadable) + SSLConnectionWaitReadable = OpenSSL::SSL::SSLErrorWaitReadable + else + SSLConnectionWaitReadable = IO::WaitReadable + end + + # Older versions of Ruby may not provide the SSLErrorWaitWritable + # OpenSSL class. Create an error class to act as a "proxy". + if defined?(OpenSSL::SSL::SSLErrorWaitWritable) + SSLConnectionWaitWritable = OpenSSL::SSL::SSLErrorWaitWritable + else + SSLConnectionWaitWritable = IO::WaitWritable + end +end + +module EventMachine + class CertificateCreator + attr_reader :cert, :key + + def initialize + @key = OpenSSL::PKey::RSA.new(1024) + public_key = @key.public_key + subject = "/C=EventMachine/O=EventMachine/OU=EventMachine/CN=EventMachine" + @cert = OpenSSL::X509::Certificate.new + @cert.subject = @cert.issuer = OpenSSL::X509::Name.parse(subject) + @cert.not_before = Time.now + @cert.not_after = Time.now + 365 * 24 * 60 * 60 + @cert.public_key = public_key + @cert.serial = 0x0 + @cert.version = 2 + factory = OpenSSL::X509::ExtensionFactory.new + factory.subject_certificate = @cert + factory.issuer_certificate = @cert + @cert.extensions = [ + factory.create_extension("basicConstraints","CA:TRUE", true), + factory.create_extension("subjectKeyIdentifier", "hash") + ] + @cert.add_extension factory.create_extension("authorityKeyIdentifier", "keyid:always,issuer:always") + @cert.sign(@key, OpenSSL::Digest::SHA1.new) + end + end + + # @private + DefaultCertificate = CertificateCreator.new + + # @private + DefaultDHKey1024 = OpenSSL::PKey::DH.new <<-_end_of_pem_ +-----BEGIN DH PARAMETERS----- +MIGHAoGBAJ0lOVy0VIr/JebWn0zDwY2h+rqITFOpdNr6ugsgvkDXuucdcChhYExJ +AV/ZD2AWPbrTqV76mGRgJg4EddgT1zG0jq3rnFdMj2XzkBYx3BVvfR0Arnby0RHR +T4h7KZ/2zmjvV+eF8kBUHBJAojUlzxKj4QeO2x20FP9X5xmNUXeDAgEC +-----END DH PARAMETERS----- + _end_of_pem_ + + # @private + DefaultDHKey2048 = OpenSSL::PKey::DH.new <<-_end_of_pem_ +-----BEGIN DH PARAMETERS----- +MIIBCAKCAQEA7E6kBrYiyvmKAMzQ7i8WvwVk9Y/+f8S7sCTN712KkK3cqd1jhJDY +JbrYeNV3kUIKhPxWHhObHKpD1R84UpL+s2b55+iMd6GmL7OYmNIT/FccKhTcveab +VBmZT86BZKYyf45hUF9FOuUM9xPzuK3Vd8oJQvfYMCd7LPC0taAEljQLR4Edf8E6 +YoaOffgTf5qxiwkjnlVZQc3whgnEt9FpVMvQ9eknyeGB5KHfayAc3+hUAvI3/Cr3 +1bNveX5wInh5GDx1FGhKBZ+s1H+aedudCm7sCgRwv8lKWYGiHzObSma8A86KG+MD +7Lo5JquQ3DlBodj3IDyPrxIv96lvRPFtAwIBAg== +-----END DH PARAMETERS----- + _end_of_pem_ +end + +# @private +module EventMachine + class << self + # This is mostly useful for automated tests. + # Return a distinctive symbol so the caller knows whether he's dealing + # with an extension or with a pure-Ruby library. + # @private + def library_type + :pure_ruby + end + + # @private + def initialize_event_machine + Reactor.instance.initialize_for_run + end + + # Changed 04Oct06: intervals from the caller are now in milliseconds, but our native-ruby + # processor still wants them in seconds. + # @private + def add_oneshot_timer interval + Reactor.instance.install_oneshot_timer(interval / 1000) + end + + # @private + def run_machine + Reactor.instance.run + end + + # @private + def release_machine + end + + + def stopping? + return Reactor.instance.stop_scheduled + end + + # @private + def stop + Reactor.instance.stop + end + + # @private + def connect_server host, port + bind_connect_server nil, nil, host, port + end + + # @private + def bind_connect_server bind_addr, bind_port, host, port + EvmaTCPClient.connect(bind_addr, bind_port, host, port).uuid + end + + # @private + def send_data target, data, datalength + selectable = Reactor.instance.get_selectable( target ) or raise "unknown send_data target" + selectable.send_data data + end + + # @private + def close_connection target, after_writing + selectable = Reactor.instance.get_selectable( target ) + selectable.schedule_close after_writing if selectable + end + + # @private + def start_tcp_server host, port + (s = EvmaTCPServer.start_server host, port) or raise "no acceptor" + s.uuid + end + + # @private + def stop_tcp_server sig + s = Reactor.instance.get_selectable(sig) + s.schedule_close + end + + # @private + def start_unix_server chain + (s = EvmaUNIXServer.start_server chain) or raise "no acceptor" + s.uuid + end + + # @private + def connect_unix_server chain + EvmaUNIXClient.connect(chain).uuid + end + + # @private + def signal_loopbreak + Reactor.instance.signal_loopbreak + end + + # @private + def get_peername sig + selectable = Reactor.instance.get_selectable( sig ) or raise "unknown get_peername target" + selectable.get_peername + end + + # @private + def get_sockname sig + selectable = Reactor.instance.get_selectable( sig ) or raise "unknown get_sockname target" + selectable.get_sockname + end + + # @private + def open_udp_socket host, port + EvmaUDPSocket.create(host, port).uuid + end + + # This is currently only for UDP! + # We need to make it work with unix-domain sockets as well. + # @private + def send_datagram target, data, datalength, host, port + selectable = Reactor.instance.get_selectable( target ) or raise "unknown send_data target" + selectable.send_datagram data, Socket::pack_sockaddr_in(port, host) + end + + + # Sets reactor quantum in milliseconds. The underlying Reactor function wants a (possibly + # fractional) number of seconds. + # @private + def set_timer_quantum interval + Reactor.instance.set_timer_quantum(( 1.0 * interval) / 1000.0) + end + + # This method is a harmless no-op in the pure-Ruby implementation. This is intended to ensure + # that user code behaves properly across different EM implementations. + # @private + def epoll + end + + # @private + def ssl? + true + end + + def tls_parm_set?(parm) + !(parm.nil? || parm.empty?) + end + + # This method takes a series of positional arguments for specifying such + # things as private keys and certificate chains. It's expected that the + # parameter list will grow as we add more supported features. ALL of these + # parameters are optional, and can be specified as empty or nil strings. + # @private + def set_tls_parms signature, priv_key, cert_chain, verify_peer, fail_if_no_peer_cert, sni_hostname, cipher_list, ecdh_curve, dhparam, protocols_bitmask + bitmask = protocols_bitmask + ssl_options = OpenSSL::SSL::OP_ALL + ssl_options |= OpenSSL::SSL::OP_NO_SSLv2 if defined?(OpenSSL::SSL::OP_NO_SSLv2) && EM_PROTO_SSLv2 & bitmask == 0 + ssl_options |= OpenSSL::SSL::OP_NO_SSLv3 if defined?(OpenSSL::SSL::OP_NO_SSLv3) && EM_PROTO_SSLv3 & bitmask == 0 + ssl_options |= OpenSSL::SSL::OP_NO_TLSv1 if defined?(OpenSSL::SSL::OP_NO_TLSv1) && EM_PROTO_TLSv1 & bitmask == 0 + ssl_options |= OpenSSL::SSL::OP_NO_TLSv1_1 if defined?(OpenSSL::SSL::OP_NO_TLSv1_1) && EM_PROTO_TLSv1_1 & bitmask == 0 + ssl_options |= OpenSSL::SSL::OP_NO_TLSv1_2 if defined?(OpenSSL::SSL::OP_NO_TLSv1_2) && EM_PROTO_TLSv1_2 & bitmask == 0 + @tls_parms ||= {} + @tls_parms[signature] = { + :verify_peer => verify_peer, + :fail_if_no_peer_cert => fail_if_no_peer_cert, + :ssl_options => ssl_options + } + @tls_parms[signature][:priv_key] = File.read(priv_key) if tls_parm_set?(priv_key) + @tls_parms[signature][:cert_chain] = File.read(cert_chain) if tls_parm_set?(cert_chain) + @tls_parms[signature][:sni_hostname] = sni_hostname if tls_parm_set?(sni_hostname) + @tls_parms[signature][:cipher_list] = cipher_list.gsub(/,\s*/, ':') if tls_parm_set?(cipher_list) + @tls_parms[signature][:dhparam] = File.read(dhparam) if tls_parm_set?(dhparam) + @tls_parms[signature][:ecdh_curve] = ecdh_curve if tls_parm_set?(ecdh_curve) + end + + def start_tls signature + selectable = Reactor.instance.get_selectable(signature) or raise "unknown io selectable for start_tls" + tls_parms = @tls_parms[signature] + ctx = OpenSSL::SSL::SSLContext.new + ctx.options = tls_parms[:ssl_options] + ctx.cert = DefaultCertificate.cert + ctx.key = DefaultCertificate.key + ctx.cert_store = OpenSSL::X509::Store.new + ctx.cert_store.set_default_paths + ctx.cert = OpenSSL::X509::Certificate.new(tls_parms[:cert_chain]) if tls_parms[:cert_chain] + ctx.key = OpenSSL::PKey::RSA.new(tls_parms[:priv_key]) if tls_parms[:priv_key] + verify_mode = OpenSSL::SSL::VERIFY_NONE + if tls_parms[:verify_peer] + verify_mode |= OpenSSL::SSL::VERIFY_PEER + end + if tls_parms[:fail_if_no_peer_cert] + verify_mode |= OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT + end + ctx.verify_mode = verify_mode + ctx.servername_cb = Proc.new do |_, server_name| + tls_parms[:server_name] = server_name + nil + end + ctx.ciphers = tls_parms[:cipher_list] if tls_parms[:cipher_list] + if selectable.is_server + ctx.tmp_dh_callback = Proc.new do |_, _, key_length| + if tls_parms[:dhparam] + OpenSSL::PKey::DH.new(tls_parms[:dhparam]) + else + case key_length + when 1024 then DefaultDHKey1024 + when 2048 then DefaultDHKey2048 + else + nil + end + end + end + if tls_parms[:ecdh_curve] && ctx.respond_to?(:tmp_ecdh_callback) + ctx.tmp_ecdh_callback = Proc.new do + OpenSSL::PKey::EC.new(tls_parms[:ecdh_curve]) + end + end + end + ssl_io = OpenSSL::SSL::SSLSocket.new(selectable, ctx) + ssl_io.sync_close = true + if tls_parms[:sni_hostname] + ssl_io.hostname = tls_parms[:sni_hostname] if ssl_io.respond_to?(:hostname=) + end + begin + selectable.is_server ? ssl_io.accept_nonblock : ssl_io.connect_nonblock + rescue; end + selectable.io = ssl_io + end + + def get_peer_cert signature + selectable = Reactor.instance.get_selectable(signature) or raise "unknown get_peer_cert target" + if selectable.io.respond_to?(:peer_cert) && selectable.io.peer_cert + selectable.io.peer_cert.to_pem + else + nil + end + end + + def get_cipher_name signature + selectable = Reactor.instance.get_selectable(signature) or raise "unknown get_cipher_name target" + selectable.io.respond_to?(:cipher) ? selectable.io.cipher[0] : nil + end + + def get_cipher_protocol signature + selectable = Reactor.instance.get_selectable(signature) or raise "unknown get_cipher_protocol target" + selectable.io.respond_to?(:cipher) ? selectable.io.cipher[1] : nil + end + + def get_cipher_bits signature + selectable = Reactor.instance.get_selectable(signature) or raise "unknown get_cipher_bits target" + selectable.io.respond_to?(:cipher) ? selectable.io.cipher[2] : nil + end + + def get_sni_hostname signature + @tls_parms ||= {} + if @tls_parms[signature] + @tls_parms[signature][:server_name] + else + nil + end + end + + # This method is a no-op in the pure-Ruby implementation. We simply return Ruby's built-in + # per-process file-descriptor limit. + # @private + def set_rlimit_nofile n + 1024 + end + + # This method is a harmless no-op in pure Ruby, which doesn't have a built-in limit + # on the number of available timers. + # @private + def set_max_timer_count n + end + + # @private + def get_sock_opt signature, level, optname + selectable = Reactor.instance.get_selectable( signature ) or raise "unknown get_sock_opt target" + selectable.getsockopt level, optname + end + + # @private + def set_sock_opt signature, level, optname, optval + selectable = Reactor.instance.get_selectable( signature ) or raise "unknown set_sock_opt target" + selectable.setsockopt level, optname, optval + end + + # @private + def send_file_data sig, filename + sz = File.size(filename) + raise "file too large" if sz > 32*1024 + data = + begin + File.read filename + rescue + "" + end + send_data sig, data, data.length + end + + # @private + def get_outbound_data_size sig + r = Reactor.instance.get_selectable( sig ) or raise "unknown get_outbound_data_size target" + r.get_outbound_data_size + end + + # @private + def read_keyboard + EvmaKeyboard.open.uuid + end + + # @private + def set_comm_inactivity_timeout sig, tm + r = Reactor.instance.get_selectable( sig ) or raise "unknown set_comm_inactivity_timeout target" + r.set_inactivity_timeout tm + end + + # @private + def set_pending_connect_timeout sig, tm + # Needs to be implemented. Currently a no-op stub to allow + # certain software to operate with the EM pure-ruby. + end + end +end + +module EventMachine + # @private + class Connection + # @private + def get_outbound_data_size + EventMachine::get_outbound_data_size @signature + end + end +end + +module EventMachine + + # Factored out so we can substitute other implementations + # here if desired, such as the one in ActiveRBAC. + # @private + module UuidGenerator + def self.generate + @ix ||= 0 + @ix += 1 + end + end +end + + +module EventMachine + # @private + TimerFired = 100 + # @private + ConnectionData = 101 + # @private + ConnectionUnbound = 102 + # @private + ConnectionAccepted = 103 + # @private + ConnectionCompleted = 104 + # @private + LoopbreakSignalled = 105 + # @private + ConnectionNotifyReadable = 106 + # @private + ConnectionNotifyWritable = 107 + # @private + SslHandshakeCompleted = 108 + # @private + SslVerify = 109 + # @private + EM_PROTO_SSLv2 = 2 + # @private + EM_PROTO_SSLv3 = 4 + # @private + EM_PROTO_TLSv1 = 8 + # @private + EM_PROTO_TLSv1_1 = 16 + # @private + EM_PROTO_TLSv1_2 = 32 +end + +module EventMachine + # @private + class Reactor + include Singleton + + HeartbeatInterval = 2 + + attr_reader :current_loop_time, :stop_scheduled + + def initialize + initialize_for_run + end + + def install_oneshot_timer interval + uuid = UuidGenerator::generate + #@timers << [Time.now + interval, uuid] + #@timers.sort! {|a,b| a.first <=> b.first} + @timers.add([Time.now + interval, uuid]) + uuid + end + + # Called before run, this is a good place to clear out arrays + # with cruft that may be left over from a previous run. + # @private + def initialize_for_run + @running = false + @stop_scheduled = false + @selectables ||= {}; @selectables.clear + @timers = SortedSet.new # [] + set_timer_quantum(0.1) + @current_loop_time = Time.now + @next_heartbeat = @current_loop_time + HeartbeatInterval + end + + def add_selectable io + @selectables[io.uuid] = io + end + + def get_selectable uuid + @selectables[uuid] + end + + def run + raise Error.new( "already running" ) if @running + @running = true + + begin + open_loopbreaker + + loop { + @current_loop_time = Time.now + + break if @stop_scheduled + run_timers + break if @stop_scheduled + crank_selectables + break if @stop_scheduled + run_heartbeats + } + ensure + close_loopbreaker + @selectables.each {|k, io| io.close} + @selectables.clear + + @running = false + end + + end + + def run_timers + @timers.each {|t| + if t.first <= @current_loop_time + @timers.delete t + EventMachine::event_callback "", TimerFired, t.last + else + break + end + } + #while @timers.length > 0 and @timers.first.first <= now + # t = @timers.shift + # EventMachine::event_callback "", TimerFired, t.last + #end + end + + def run_heartbeats + if @next_heartbeat <= @current_loop_time + @next_heartbeat = @current_loop_time + HeartbeatInterval + @selectables.each {|k,io| io.heartbeat} + end + end + + def crank_selectables + #$stderr.write 'R' + + readers = @selectables.values.select {|io| io.select_for_reading?} + writers = @selectables.values.select {|io| io.select_for_writing?} + + s = select( readers, writers, nil, @timer_quantum) + + s and s[1] and s[1].each {|w| w.eventable_write } + s and s[0] and s[0].each {|r| r.eventable_read } + + @selectables.delete_if {|k,io| + if io.close_scheduled? + io.close + begin + EventMachine::event_callback io.uuid, ConnectionUnbound, nil + rescue ConnectionNotBound; end + true + end + } + end + + # #stop + def stop + raise Error.new( "not running") unless @running + @stop_scheduled = true + end + + def open_loopbreaker + # Can't use an IO.pipe because they can't be set nonselectable in Windows. + # Pick a random localhost UDP port. + #@loopbreak_writer.close if @loopbreak_writer + #rd,@loopbreak_writer = IO.pipe + @loopbreak_reader = UDPSocket.new + @loopbreak_writer = UDPSocket.new + bound = false + 100.times { + @loopbreak_port = rand(10000) + 40000 + begin + @loopbreak_reader.bind "127.0.0.1", @loopbreak_port + bound = true + break + rescue + end + } + raise "Unable to bind Loopbreaker" unless bound + LoopbreakReader.new(@loopbreak_reader) + end + + def close_loopbreaker + @loopbreak_writer.close + @loopbreak_writer = nil + end + + def signal_loopbreak + begin + @loopbreak_writer.send('+',0,"127.0.0.1",@loopbreak_port) if @loopbreak_writer + rescue IOError; end + end + + def set_timer_quantum interval_in_seconds + @timer_quantum = interval_in_seconds + end + + end + +end + +# @private +class IO + extend Forwardable + def_delegator :@my_selectable, :close_scheduled? + def_delegator :@my_selectable, :select_for_reading? + def_delegator :@my_selectable, :select_for_writing? + def_delegator :@my_selectable, :eventable_read + def_delegator :@my_selectable, :eventable_write + def_delegator :@my_selectable, :uuid + def_delegator :@my_selectable, :is_server + def_delegator :@my_selectable, :is_server= + def_delegator :@my_selectable, :send_data + def_delegator :@my_selectable, :schedule_close + def_delegator :@my_selectable, :get_peername + def_delegator :@my_selectable, :get_sockname + def_delegator :@my_selectable, :send_datagram + def_delegator :@my_selectable, :get_outbound_data_size + def_delegator :@my_selectable, :set_inactivity_timeout + def_delegator :@my_selectable, :heartbeat + def_delegator :@my_selectable, :io + def_delegator :@my_selectable, :io= +end + +module EventMachine + # @private + class Selectable + + attr_accessor :io, :is_server + attr_reader :uuid + + def initialize io + @io = io + @uuid = UuidGenerator.generate + @is_server = false + @last_activity = Reactor.instance.current_loop_time + + if defined?(Fcntl::F_GETFL) + m = @io.fcntl(Fcntl::F_GETFL, 0) + @io.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK | m) + else + # Windows doesn't define F_GETFL. + # It's not very reliable about setting descriptors nonblocking either. + begin + s = Socket.for_fd(@io.fileno) + s.fcntl( Fcntl::F_SETFL, Fcntl::O_NONBLOCK ) + rescue Errno::EINVAL, Errno::EBADF + warn "Serious error: unable to set descriptor non-blocking" + end + end + # TODO, should set CLOEXEC on Unix? + + @close_scheduled = false + @close_requested = false + + se = self; @io.instance_eval { @my_selectable = se } + Reactor.instance.add_selectable @io + end + + def close_scheduled? + @close_scheduled + end + + def select_for_reading? + false + end + + def select_for_writing? + false + end + + def get_peername + nil + end + + def get_sockname + nil + end + + def set_inactivity_timeout tm + @inactivity_timeout = tm + end + + def heartbeat + end + + def schedule_close(after_writing=false) + if after_writing + @close_requested = true + else + @close_scheduled = true + end + end + end + +end + +module EventMachine + # @private + class StreamObject < Selectable + def initialize io + super io + @outbound_q = [] + end + + # If we have to close, or a close-after-writing has been requested, + # then don't read any more data. + def select_for_reading? + true unless (@close_scheduled || @close_requested) + end + + # If we have to close, don't select for writing. + # Otherwise, see if the protocol is ready to close. + # If not, see if he has data to send. + # If a close-after-writing has been requested and the outbound queue + # is empty, convert the status to close_scheduled. + def select_for_writing? + unless @close_scheduled + if @outbound_q.empty? + @close_scheduled = true if @close_requested + false + else + true + end + end + end + + # Proper nonblocking I/O was added to Ruby 1.8.4 in May 2006. + # If we have it, then we can read multiple times safely to improve + # performance. + # The last-activity clock ASSUMES that we only come here when we + # have selected readable. + # TODO, coalesce multiple reads into a single event. + # TODO, do the function check somewhere else and cache it. + def eventable_read + @last_activity = Reactor.instance.current_loop_time + begin + if io.respond_to?(:read_nonblock) + 10.times { + data = io.read_nonblock(4096) + EventMachine::event_callback uuid, ConnectionData, data + } + else + data = io.sysread(4096) + EventMachine::event_callback uuid, ConnectionData, data + end + rescue Errno::EAGAIN, Errno::EWOULDBLOCK, SSLConnectionWaitReadable + # no-op + rescue Errno::ECONNRESET, Errno::ECONNREFUSED, EOFError, Errno::EPIPE, OpenSSL::SSL::SSLError + @close_scheduled = true + EventMachine::event_callback uuid, ConnectionUnbound, nil + end + + end + + # Provisional implementation. Will be re-implemented in subclasses. + # TODO: Complete this implementation. As it stands, this only writes + # a single packet per cycle. Highly inefficient, but required unless + # we're running on a Ruby with proper nonblocking I/O (Ruby 1.8.4 + # built from sources from May 25, 2006 or newer). + # We need to improve the loop so it writes multiple times, however + # not more than a certain number of bytes per cycle, otherwise + # one busy connection could hog output buffers and slow down other + # connections. Also we should coalesce small writes. + # URGENT TODO: Coalesce small writes. They are a performance killer. + # The last-activity recorder ASSUMES we'll only come here if we've + # selected writable. + def eventable_write + # coalesce the outbound array here, perhaps + @last_activity = Reactor.instance.current_loop_time + while data = @outbound_q.shift do + begin + data = data.to_s + w = if io.respond_to?(:write_nonblock) + io.write_nonblock data + else + io.syswrite data + end + + if w < data.length + @outbound_q.unshift data[w..-1] + break + end + rescue Errno::EAGAIN, SSLConnectionWaitReadable, SSLConnectionWaitWritable + @outbound_q.unshift data + break + rescue EOFError, Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EPIPE, OpenSSL::SSL::SSLError + @close_scheduled = true + @outbound_q.clear + end + end + + end + + # #send_data + def send_data data + # TODO, coalesce here perhaps by being smarter about appending to @outbound_q.last? + unless @close_scheduled or @close_requested or !data or data.length <= 0 + @outbound_q << data.to_s + end + end + + # #get_peername + # This is defined in the normal way on connected stream objects. + # Return an object that is suitable for passing to Socket#unpack_sockaddr_in or variants. + # We could also use a convenience method that did the unpacking automatically. + def get_peername + io.getpeername + end + + # #get_sockname + # This is defined in the normal way on connected stream objects. + # Return an object that is suitable for passing to Socket#unpack_sockaddr_in or variants. + # We could also use a convenience method that did the unpacking automatically. + def get_sockname + io.getsockname + end + + # #get_outbound_data_size + def get_outbound_data_size + @outbound_q.inject(0) {|memo,obj| memo += (obj || "").length} + end + + def heartbeat + if @inactivity_timeout and @inactivity_timeout > 0 and (@last_activity + @inactivity_timeout) < Reactor.instance.current_loop_time + schedule_close true + end + end + end + + +end + + +#-------------------------------------------------------------- + + + +module EventMachine + # @private + class EvmaTCPClient < StreamObject + + def self.connect bind_addr, bind_port, host, port + sd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 ) + sd.bind( Socket.pack_sockaddr_in( bind_port, bind_addr )) if bind_addr + + begin + # TODO, this assumes a current Ruby snapshot. + # We need to degrade to a nonblocking connect otherwise. + sd.connect_nonblock( Socket.pack_sockaddr_in( port, host )) + rescue Errno::ECONNREFUSED, Errno::EINPROGRESS + end + EvmaTCPClient.new sd + end + + def initialize io + super + @pending = true + @handshake_complete = false + end + + def ready? + if RUBY_PLATFORM =~ /linux/ + io.getsockopt(Socket::SOL_TCP, Socket::TCP_INFO).unpack("i").first == 1 # TCP_ESTABLISHED + else + io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first == 0 # NO ERROR + end + end + + def handshake_complete? + if !@handshake_complete && io.respond_to?(:state) + if io.state =~ /^SSLOK/ + @handshake_complete = true + EventMachine::event_callback uuid, SslHandshakeCompleted, "" + EventMachine::event_callback uuid, SslVerify, io.peer_cert.to_pem if io.peer_cert + end + else + @handshake_complete = true + end + @handshake_complete + end + + def pending? + handshake_complete? + if @pending + if ready? + @pending = false + EventMachine::event_callback uuid, ConnectionCompleted, "" + end + end + @pending + end + + def select_for_writing? + pending? + super + end + + def select_for_reading? + pending? + super + end + end +end + + + +module EventMachine + # @private + class EvmaKeyboard < StreamObject + + def self.open + EvmaKeyboard.new STDIN + end + + + def initialize io + super + end + + + def select_for_writing? + false + end + + def select_for_reading? + true + end + + + end +end + + + +module EventMachine + # @private + class EvmaUNIXClient < StreamObject + + def self.connect chain + sd = Socket.new( Socket::AF_LOCAL, Socket::SOCK_STREAM, 0 ) + begin + # TODO, this assumes a current Ruby snapshot. + # We need to degrade to a nonblocking connect otherwise. + sd.connect_nonblock( Socket.pack_sockaddr_un( chain )) + rescue Errno::EINPROGRESS + end + EvmaUNIXClient.new sd + end + + + def initialize io + super + @pending = true + end + + + def select_for_writing? + @pending ? true : super + end + + def select_for_reading? + @pending ? false : super + end + + def eventable_write + if @pending + @pending = false + if 0 == io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first + EventMachine::event_callback uuid, ConnectionCompleted, "" + end + else + super + end + end + + + + end +end + + +#-------------------------------------------------------------- + +module EventMachine + # @private + class EvmaTCPServer < Selectable + + # TODO, refactor and unify with EvmaUNIXServer. + + class << self + # Versions of ruby 1.8.4 later than May 26 2006 will work properly + # with an object of type TCPServer. Prior versions won't so we + # play it safe and just build a socket. + # + def start_server host, port + sd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 ) + sd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true ) + sd.bind( Socket.pack_sockaddr_in( port, host )) + sd.listen( 50 ) # 5 is what you see in all the books. Ain't enough. + EvmaTCPServer.new sd + end + end + + def initialize io + super io + end + + + def select_for_reading? + true + end + + #-- + # accept_nonblock returns an array consisting of the accepted + # socket and a sockaddr_in which names the peer. + # Don't accept more than 10 at a time. + def eventable_read + begin + 10.times { + descriptor,peername = io.accept_nonblock + sd = EvmaTCPClient.new descriptor + sd.is_server = true + EventMachine::event_callback uuid, ConnectionAccepted, sd.uuid + } + rescue Errno::EWOULDBLOCK, Errno::EAGAIN + end + end + + #-- + # + def schedule_close + @close_scheduled = true + end + + end +end + + +#-------------------------------------------------------------- + +module EventMachine + # @private + class EvmaUNIXServer < Selectable + + # TODO, refactor and unify with EvmaTCPServer. + + class << self + # Versions of ruby 1.8.4 later than May 26 2006 will work properly + # with an object of type TCPServer. Prior versions won't so we + # play it safe and just build a socket. + # + def start_server chain + sd = Socket.new( Socket::AF_LOCAL, Socket::SOCK_STREAM, 0 ) + sd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true ) + sd.bind( Socket.pack_sockaddr_un( chain )) + sd.listen( 50 ) # 5 is what you see in all the books. Ain't enough. + EvmaUNIXServer.new sd + end + end + + def initialize io + super io + end + + + def select_for_reading? + true + end + + #-- + # accept_nonblock returns an array consisting of the accepted + # socket and a sockaddr_in which names the peer. + # Don't accept more than 10 at a time. + def eventable_read + begin + 10.times { + descriptor,peername = io.accept_nonblock + sd = StreamObject.new descriptor + EventMachine::event_callback uuid, ConnectionAccepted, sd.uuid + } + rescue Errno::EWOULDBLOCK, Errno::EAGAIN + end + end + + #-- + # + def schedule_close + @close_scheduled = true + end + + end +end + + + +#-------------------------------------------------------------- + +module EventMachine + # @private + class LoopbreakReader < Selectable + + def select_for_reading? + true + end + + def eventable_read + io.sysread(128) + EventMachine::event_callback "", LoopbreakSignalled, "" + end + + end +end + + + +# @private +module EventMachine + # @private + class DatagramObject < Selectable + def initialize io + super io + @outbound_q = [] + end + + # #send_datagram + def send_datagram data, target + # TODO, coalesce here perhaps by being smarter about appending to @outbound_q.last? + unless @close_scheduled or @close_requested + @outbound_q << [data.to_s, target] + end + end + + # #select_for_writing? + def select_for_writing? + unless @close_scheduled + if @outbound_q.empty? + @close_scheduled = true if @close_requested + false + else + true + end + end + end + + # #select_for_reading? + def select_for_reading? + true + end + + # #get_outbound_data_size + def get_outbound_data_size + @outbound_q.inject(0) {|memo,obj| memo += (obj || "").length} + end + + + end + + +end + + +module EventMachine + # @private + class EvmaUDPSocket < DatagramObject + + class << self + def create host, port + sd = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 ) + sd.bind Socket::pack_sockaddr_in( port, host ) + EvmaUDPSocket.new sd + end + end + + # #eventable_write + # This really belongs in DatagramObject, but there is some UDP-specific stuff. + def eventable_write + 40.times { + break if @outbound_q.empty? + begin + data,target = @outbound_q.first + + # This damn better be nonblocking. + io.send data.to_s, 0, target + + @outbound_q.shift + rescue Errno::EAGAIN + # It's not been observed in testing that we ever get here. + # True to the definition, packets will be accepted and quietly dropped + # if the system is under pressure. + break + rescue EOFError, Errno::ECONNRESET + @close_scheduled = true + @outbound_q.clear + end + } + end + + # Proper nonblocking I/O was added to Ruby 1.8.4 in May 2006. + # If we have it, then we can read multiple times safely to improve + # performance. + def eventable_read + begin + if io.respond_to?(:recvfrom_nonblock) + 40.times { + data,@return_address = io.recvfrom_nonblock(16384) + EventMachine::event_callback uuid, ConnectionData, data + @return_address = nil + } + else + raise "unimplemented datagram-read operation on this Ruby" + end + rescue Errno::EAGAIN + # no-op + rescue Errno::ECONNRESET, EOFError + @close_scheduled = true + EventMachine::event_callback uuid, ConnectionUnbound, nil + end + end + + def send_data data + send_datagram data, @return_address + end + end +end + +# load base EM api on top, now that we have the underlying pure ruby +# implementation defined +require 'eventmachine' diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/queue.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/queue.rb new file mode 100644 index 0000000..9096ed0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/queue.rb @@ -0,0 +1,80 @@ +module EventMachine + # A cross thread, reactor scheduled, linear queue. + # + # This class provides a simple queue abstraction on top of the reactor + # scheduler. It services two primary purposes: + # + # * API sugar for stateful protocols + # * Pushing processing onto the reactor thread + # + # @example + # + # q = EM::Queue.new + # q.push('one', 'two', 'three') + # 3.times do + # q.pop { |msg| puts(msg) } + # end + # + class Queue + def initialize + @sink = [] + @drain = [] + @popq = [] + end + + # Pop items off the queue, running the block on the reactor thread. The pop + # will not happen immediately, but at some point in the future, either in + # the next tick, if the queue has data, or when the queue is populated. + # + # @return [NilClass] nil + def pop(*a, &b) + cb = EM::Callback(*a, &b) + EM.schedule do + if @drain.empty? + @drain = @sink + @sink = [] + end + if @drain.empty? + @popq << cb + else + cb.call @drain.shift + end + end + nil # Always returns nil + end + + # Push items onto the queue in the reactor thread. The items will not appear + # in the queue immediately, but will be scheduled for addition during the + # next reactor tick. + def push(*items) + EM.schedule do + @sink.push(*items) + unless @popq.empty? + @drain = @sink + @sink = [] + @popq.shift.call @drain.shift until @drain.empty? || @popq.empty? + end + end + end + alias :<< :push + + # @return [Boolean] + # @note This is a peek, it's not thread safe, and may only tend toward accuracy. + def empty? + @drain.empty? && @sink.empty? + end + + # @return [Integer] Queue size + # @note This is a peek, it's not thread safe, and may only tend toward accuracy. + def size + @drain.size + @sink.size + end + + # @return [Integer] Waiting size + # @note This is a peek at the number of jobs that are currently waiting on the Queue + def num_waiting + @popq.size + end + + end # Queue +end # EventMachine diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/resolver.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/resolver.rb new file mode 100644 index 0000000..1d2d7aa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/resolver.rb @@ -0,0 +1,232 @@ +module EventMachine + module DNS + class Resolver + + def self.windows? + if RUBY_PLATFORM =~ /mswin32|cygwin|mingw|bccwin/ + require 'win32/resolv' + true + else + false + end + end + + HOSTS_FILE = windows? ? Win32::Resolv.get_hosts_path : '/etc/hosts' + + @hosts = nil + @nameservers = nil + @socket = nil + + def self.resolve(hostname) + Request.new(socket, hostname) + end + + def self.socket + if @socket && @socket.error? + @socket = Socket.open + else + @socket ||= Socket.open + end + end + + def self.nameservers=(ns) + @nameservers = ns + end + + def self.nameservers + return @nameservers if @nameservers + + if windows? + _, ns = Win32::Resolv.get_resolv_info + return @nameservers = ns || [] + end + + @nameservers = [] + IO.readlines('/etc/resolv.conf').each do |line| + if line =~ /^nameserver (.+)$/ + @nameservers << $1.split(/\s+/).first + end + end + + @nameservers + rescue + @nameservers = [] + end + + def self.nameserver + nameservers.shuffle.first + end + + def self.hosts + return @hosts if @hosts + + @hosts = {} + IO.readlines(HOSTS_FILE).each do |line| + next if line =~ /^#/ + addr, host = line.split(/\s+/) + + next unless addr && host + @hosts[host] ||= [] + @hosts[host] << addr + end + + @hosts + rescue + @hosts = {} + end + end + + class RequestIdAlreadyUsed < RuntimeError; end + + class Socket < EventMachine::Connection + def self.open + EventMachine::open_datagram_socket('0.0.0.0', 0, self) + end + + def initialize + @nameserver = nil + end + + def post_init + @requests = {} + end + + def start_timer + @timer ||= EM.add_periodic_timer(0.1, &method(:tick)) + end + + def stop_timer + EM.cancel_timer(@timer) + @timer = nil + end + + def unbind + end + + def tick + @requests.each do |id,req| + req.tick + end + end + + def register_request(id, req) + if @requests.has_key?(id) + raise RequestIdAlreadyUsed + else + @requests[id] = req + end + + start_timer + end + + def deregister_request(id, req) + @requests.delete(id) + stop_timer if @requests.length == 0 + end + + def send_packet(pkt) + send_datagram(pkt, nameserver, 53) + end + + def nameserver=(ns) + @nameserver = ns + end + + def nameserver + @nameserver || Resolver.nameserver + end + + # Decodes the packet, looks for the request and passes the + # response over to the requester + def receive_data(data) + msg = nil + begin + msg = Resolv::DNS::Message.decode data + rescue + else + req = @requests[msg.id] + if req + @requests.delete(msg.id) + stop_timer if @requests.length == 0 + req.receive_answer(msg) + end + end + end + end + + class Request + include Deferrable + attr_accessor :retry_interval, :max_tries + + def initialize(socket, hostname) + @socket = socket + @hostname = hostname + @tries = 0 + @last_send = Time.at(0) + @retry_interval = 3 + @max_tries = 5 + + if addrs = Resolver.hosts[hostname] + succeed addrs + else + EM.next_tick { tick } + end + end + + def tick + # Break early if nothing to do + return if @last_send + @retry_interval > Time.now + if @tries < @max_tries + send + else + @socket.deregister_request(@id, self) + fail 'retries exceeded' + end + end + + def receive_answer(msg) + addrs = [] + msg.each_answer do |name,ttl,data| + if data.kind_of?(Resolv::DNS::Resource::IN::A) || + data.kind_of?(Resolv::DNS::Resource::IN::AAAA) + addrs << data.address.to_s + end + end + + if addrs.empty? + fail "rcode=#{msg.rcode}" + else + succeed addrs + end + end + + private + + def send + @tries += 1 + @last_send = Time.now + @socket.send_packet(packet.encode) + end + + def id + begin + @id = rand(65535) + @socket.register_request(@id, self) + rescue RequestIdAlreadyUsed + retry + end unless defined?(@id) + + @id + end + + def packet + msg = Resolv::DNS::Message.new + msg.id = id + msg.rd = 1 + msg.add_question @hostname, Resolv::DNS::Resource::IN::A + msg + end + + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/spawnable.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/spawnable.rb new file mode 100644 index 0000000..35c087d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/spawnable.rb @@ -0,0 +1,84 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 25 Aug 2007 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + # Support for Erlang-style processes. + # + class SpawnedProcess + # Send a message to the spawned process + def notify *x + me = self + EM.next_tick { + # A notification executes in the context of this + # SpawnedProcess object. That makes self and notify + # work as one would expect. + # + y = me.call(*x) + if y and y.respond_to?(:pull_out_yield_block) + a,b = y.pull_out_yield_block + set_receiver a + self.notify if b + end + } + end + alias_method :resume, :notify + alias_method :run, :notify # for formulations like (EM.spawn {xxx}).run + + def set_receiver blk + (class << self ; self ; end).class_eval do + remove_method :call if method_defined? :call + define_method :call, blk + end + end + + end + + # @private + class YieldBlockFromSpawnedProcess + def initialize block, notify + @block = [block,notify] + end + def pull_out_yield_block + @block + end + end + + # Spawn an erlang-style process + def self.spawn &block + s = SpawnedProcess.new + s.set_receiver block + s + end + + # @private + def self.yield &block + return YieldBlockFromSpawnedProcess.new( block, false ) + end + + # @private + def self.yield_and_notify &block + return YieldBlockFromSpawnedProcess.new( block, true ) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/streamer.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/streamer.rb new file mode 100644 index 0000000..cf49c88 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/streamer.rb @@ -0,0 +1,118 @@ +module EventMachine + # Streams a file over a given connection. Streaming begins once the object is + # instantiated. Typically FileStreamer instances are not reused. + # + # Streaming uses buffering for files larger than 16K and uses so-called fast file reader (a C++ extension) + # if available (it is part of eventmachine gem itself). + # + # @example + # + # module FileSender + # def post_init + # streamer = EventMachine::FileStreamer.new(self, '/tmp/bigfile.tar') + # streamer.callback{ + # # file was sent successfully + # close_connection_after_writing + # } + # end + # end + # + # + # @author Francis Cianfrocca + class FileStreamer + include Deferrable + + # Use mapped streamer for files bigger than 16k + MappingThreshold = 16384 + # Wait until next tick to send more data when 50k is still in the outgoing buffer + BackpressureLevel = 50000 + # Send 16k chunks at a time + ChunkSize = 16384 + + # @param [EventMachine::Connection] connection + # @param [String] filename File path + # + # @option args [Boolean] :http_chunks (false) Use HTTP 1.1 style chunked-encoding semantics. + def initialize connection, filename, args = {} + @connection = connection + @http_chunks = args[:http_chunks] + + if File.exist?(filename) + @size = File.size(filename) + if @size <= MappingThreshold + stream_without_mapping filename + else + stream_with_mapping filename + end + else + fail "file not found" + end + end + + # @private + def stream_without_mapping filename + if @http_chunks + @connection.send_data "#{@size.to_s(16)}\r\n" + @connection.send_file_data filename + @connection.send_data "\r\n0\r\n\r\n" + else + @connection.send_file_data filename + end + succeed + end + private :stream_without_mapping + + # @private + def stream_with_mapping filename + ensure_mapping_extension_is_present + + @position = 0 + @mapping = EventMachine::FastFileReader::Mapper.new filename + stream_one_chunk + end + private :stream_with_mapping + + # Used internally to stream one chunk at a time over multiple reactor ticks + # @private + def stream_one_chunk + loop { + if @position < @size + if @connection.get_outbound_data_size > BackpressureLevel + EventMachine::next_tick {stream_one_chunk} + break + else + len = @size - @position + len = ChunkSize if (len > ChunkSize) + + @connection.send_data( "#{len.to_s(16)}\r\n" ) if @http_chunks + @connection.send_data( @mapping.get_chunk( @position, len )) + @connection.send_data("\r\n") if @http_chunks + + @position += len + end + else + @connection.send_data "0\r\n\r\n" if @http_chunks + @mapping.close + succeed + break + end + } + end + + # + # We use an outboard extension class to get memory-mapped files. + # It's outboard to avoid polluting the core distro, but that means + # there's a "hidden" dependency on it. The first time we get here in + # any run, try to load up the dependency extension. User code will see + # a LoadError if it's not available, but code that doesn't require + # mapped files will work fine without it. This is a somewhat difficult + # compromise between usability and proper modularization. + # + # @private + def ensure_mapping_extension_is_present + @@fastfilereader ||= (require 'fastfilereaderext') + end + private :ensure_mapping_extension_is_present + + end # FileStreamer +end # EventMachine diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/threaded_resource.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/threaded_resource.rb new file mode 100644 index 0000000..87704d5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/threaded_resource.rb @@ -0,0 +1,90 @@ +module EventMachine + # = EventMachine::ThreadedResource + # + # A threaded resource is a "quick and dirty" wrapper around the concept of + # wiring up synchronous code into a standard EM::Pool. This is useful to keep + # interfaces coherent and provide a simple approach at "making an interface + # async-ish". + # + # General usage is to wrap libraries that do not support EventMachine, or to + # have a specific number of dedicated high-cpu worker resources. + # + # == Basic Usage example + # + # This example requires the cassandra gem. The cassandra gem contains an + # EventMachine interface, but it's sadly Fiber based and thus only works on + # 1.9. It also requires (potentially) complex stack switching logic to reach + # completion of nested operations. By contrast this approach provides a block + # in which normal synchronous code can occur, but makes no attempt to wire the + # IO into EventMachines C++ IO implementations, instead relying on the reactor + # pattern in rb_thread_select. + # + # cassandra_dispatcher = ThreadedResource.new do + # Cassandra.new('allthethings', '127.0.0.1:9160') + # end + # + # pool = EM::Pool.new + # + # pool.add cassandra_dispatcher + # + # # If we don't care about the result: + # pool.perform do |dispatcher| + # # The following block executes inside a dedicated thread, and should not + # # access EventMachine things: + # dispatcher.dispatch do |cassandra| + # cassandra.insert(:Things, '10', 'stuff' => 'things') + # end + # end + # + # # Example where we care about the result: + # pool.perform do |dispatcher| + # # The dispatch block is executed in the resources thread. + # completion = dispatcher.dispatch do |cassandra| + # cassandra.get(:Things, '10', 'stuff') + # end + # + # # This block will be yielded on the EM thread: + # completion.callback do |result| + # EM.do_something_with(result) + # end + # + # completion + # end + class ThreadedResource + + # The block should return the resource that will be yielded in a dispatch. + def initialize + @resource = yield + + @running = true + @queue = ::Queue.new + @thread = Thread.new do + @queue.pop.call while @running + end + end + + # Called on the EM thread, generally in a perform block to return a + # completion for the work. + def dispatch + completion = EM::Completion.new + @queue << lambda do + begin + result = yield @resource + completion.succeed result + rescue => e + completion.fail e + end + end + completion + end + + # Kill the internal thread. should only be used to cleanup - generally + # only required for tests. + def shutdown + @running = false + @queue << lambda {} + @thread.join + end + + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/tick_loop.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/tick_loop.rb new file mode 100644 index 0000000..a95d516 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/tick_loop.rb @@ -0,0 +1,85 @@ +module EventMachine + # Creates and immediately starts an EventMachine::TickLoop + def self.tick_loop(*a, &b) + TickLoop.new(*a, &b).start + end + + # A TickLoop is useful when one needs to distribute amounts of work + # throughout ticks in order to maintain response times. It is also useful for + # simple repeated checks and metrics. + # @example + # # Here we run through an array one item per tick until it is empty, + # # printing each element. + # # When the array is empty, we return :stop from the callback, and the + # # loop will terminate. + # # When the loop terminates, the on_stop callbacks will be called. + # EM.run do + # array = (1..100).to_a + # + # tickloop = EM.tick_loop do + # if array.empty? + # :stop + # else + # puts array.shift + # end + # end + # + # tickloop.on_stop { EM.stop } + # end + # + class TickLoop + + # Arguments: A callback (EM::Callback) to call each tick. If the call + # returns +:stop+ then the loop will be stopped. Any other value is + # ignored. + def initialize(*a, &b) + @work = EM::Callback(*a, &b) + @stops = [] + @stopped = true + end + + # Arguments: A callback (EM::Callback) to call once on the next stop (or + # immediately if already stopped). + def on_stop(*a, &b) + if @stopped + EM::Callback(*a, &b).call + else + @stops << EM::Callback(*a, &b) + end + end + + # Stop the tick loop immediately, and call it's on_stop callbacks. + def stop + @stopped = true + until @stops.empty? + @stops.shift.call + end + end + + # Query if the loop is stopped. + def stopped? + @stopped + end + + # Start the tick loop, will raise argument error if the loop is already + # running. + def start + raise ArgumentError, "double start" unless @stopped + @stopped = false + schedule + end + + private + def schedule + EM.next_tick do + next if @stopped + if @work.call == :stop + stop + else + schedule + end + end + self + end + end +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/timers.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/timers.rb new file mode 100644 index 0000000..41cd959 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/timers.rb @@ -0,0 +1,61 @@ +module EventMachine + # Creates a one-time timer + # + # timer = EventMachine::Timer.new(5) do + # # this will never fire because we cancel it + # end + # timer.cancel + # + class Timer + # Create a new timer that fires after a given number of seconds + def initialize interval, callback=nil, &block + @signature = EventMachine::add_timer(interval, callback || block) + end + + # Cancel the timer + def cancel + EventMachine.send :cancel_timer, @signature + end + end + + # Creates a periodic timer + # + # @example + # n = 0 + # timer = EventMachine::PeriodicTimer.new(5) do + # puts "the time is #{Time.now}" + # timer.cancel if (n+=1) > 5 + # end + # + class PeriodicTimer + # Create a new periodic timer that executes every interval seconds + def initialize interval, callback=nil, &block + @interval = interval + @code = callback || block + @cancelled = false + @work = method(:fire) + schedule + end + + # Cancel the periodic timer + def cancel + @cancelled = true + end + + # Fire the timer every interval seconds + attr_accessor :interval + + # @private + def schedule + EventMachine::add_timer @interval, @work + end + + # @private + def fire + unless @cancelled + @code.call + schedule + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/version.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/version.rb new file mode 100644 index 0000000..353a589 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/em/version.rb @@ -0,0 +1,3 @@ +module EventMachine + VERSION = "1.2.5" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/eventmachine.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/eventmachine.rb new file mode 100644 index 0000000..bf54c63 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/eventmachine.rb @@ -0,0 +1,1590 @@ +if defined?(EventMachine.library_type) and EventMachine.library_type == :pure_ruby + # assume 'em/pure_ruby' was loaded already +elsif RUBY_PLATFORM =~ /java/ + require 'java' + require 'jeventmachine' +else + begin + require 'rubyeventmachine' + rescue LoadError + warn "Unable to load the EventMachine C extension; To use the pure-ruby reactor, require 'em/pure_ruby'" + raise + end +end + +require 'em/version' +require 'em/pool' +require 'em/deferrable' +require 'em/future' +require 'em/streamer' +require 'em/spawnable' +require 'em/processes' +require 'em/iterator' +require 'em/buftok' +require 'em/timers' +require 'em/protocols' +require 'em/connection' +require 'em/callback' +require 'em/queue' +require 'em/channel' +require 'em/file_watch' +require 'em/process_watch' +require 'em/tick_loop' +require 'em/resolver' +require 'em/completion' +require 'em/threaded_resource' + +require 'shellwords' +require 'thread' +require 'resolv' + +# Top-level EventMachine namespace. If you are looking for EventMachine examples, see {file:docs/GettingStarted.md EventMachine tutorial}. +# +# ## Key methods ## +# ### Starting and stopping the event loop ### +# +# * {EventMachine.run} +# * {EventMachine.stop_event_loop} +# +# ### Implementing clients ### +# +# * {EventMachine.connect} +# +# ### Implementing servers ### +# +# * {EventMachine.start_server} +# +# ### Working with timers ### +# +# * {EventMachine.add_timer} +# * {EventMachine.add_periodic_timer} +# * {EventMachine.cancel_timer} +# +# ### Working with blocking tasks ### +# +# * {EventMachine.defer} +# * {EventMachine.next_tick} +# +# ### Efficient proxying ### +# +# * {EventMachine.enable_proxy} +# * {EventMachine.disable_proxy} +module EventMachine + class << self + # Exposed to allow joining on the thread, when run in a multithreaded + # environment. Performing other actions on the thread has undefined + # semantics (read: a dangerous endevor). + # + # @return [Thread] + attr_reader :reactor_thread + end + @next_tick_mutex = Mutex.new + @reactor_running = false + @next_tick_queue = [] + @tails = [] + @threadpool = @threadqueue = @resultqueue = nil + @all_threads_spawned = false + + # System errnos + # @private + ERRNOS = Errno::constants.grep(/^E/).inject(Hash.new(:unknown)) { |hash, name| + errno = Errno.__send__(:const_get, name) + hash[errno::Errno] = errno + hash + } + + # Initializes and runs an event loop. This method only returns if code inside the block passed to this method + # calls {EventMachine.stop_event_loop}. The block is executed after initializing its internal event loop but *before* running the loop, + # therefore this block is the right place to call any code that needs event loop to run, for example, {EventMachine.start_server}, + # {EventMachine.connect} or similar methods of libraries that use EventMachine under the hood + # (like `EventMachine::HttpRequest.new` or `AMQP.start`). + # + # Programs that are run for long periods of time (e.g. servers) usually start event loop by calling {EventMachine.run}, and let it + # run "forever". It's also possible to use {EventMachine.run} to make a single client-connection to a remote server, + # process the data flow from that single connection, and then call {EventMachine.stop_event_loop} to stop, in other words, + # to run event loop for a short period of time (necessary to complete some operation) and then shut it down. + # + # Once event loop is running, it is perfectly possible to start multiple servers and clients simultaneously: content-aware + # proxies like [Proxymachine](https://github.com/mojombo/proxymachine) do just that. + # + # ## Using EventMachine with Ruby on Rails and other Web application frameworks ## + # + # Standalone applications often run event loop on the main thread, thus blocking for their entire lifespan. In case of Web applications, + # if you are running an EventMachine-based app server such as [Thin](http://code.macournoyer.com/thin/) or [Goliath](https://github.com/postrank-labs/goliath/), + # they start event loop for you. Servers like Unicorn, Apache Passenger or Mongrel occupy main Ruby thread to serve HTTP(S) requests. This means + # that calling {EventMachine.run} on the same thread is not an option (it will result in Web server never binding to the socket). + # In that case, start event loop in a separate thread as demonstrated below. + # + # + # @example Starting EventMachine event loop in the current thread to run the "Hello, world"-like Echo server example + # + # #!/usr/bin/env ruby + # + # require 'rubygems' # or use Bundler.setup + # require 'eventmachine' + # + # class EchoServer < EM::Connection + # def receive_data(data) + # send_data(data) + # end + # end + # + # EventMachine.run do + # EventMachine.start_server("0.0.0.0", 10000, EchoServer) + # end + # + # + # @example Starting EventMachine event loop in a separate thread + # + # # doesn't block current thread, can be used with Ruby on Rails, Sinatra, Merb, Rack + # # and any other application server that occupies main Ruby thread. + # Thread.new { EventMachine.run } + # + # + # @note This method blocks calling thread. If you need to start EventMachine event loop from a Web app + # running on a non event-driven server (Unicorn, Apache Passenger, Mongrel), do it in a separate thread like demonstrated + # in one of the examples. + # @see file:docs/GettingStarted.md Getting started with EventMachine + # @see EventMachine.stop_event_loop + def self.run blk=nil, tail=nil, &block + # Obsoleted the use_threads mechanism. + # 25Nov06: Added the begin/ensure block. We need to be sure that release_machine + # gets called even if an exception gets thrown within any of the user code + # that the event loop runs. The best way to see this is to run a unit + # test with two functions, each of which calls {EventMachine.run} and each of + # which throws something inside of #run. Without the ensure, the second test + # will start without release_machine being called and will immediately throw + + # + if @reactor_running and @reactor_pid != Process.pid + # Reactor was started in a different parent, meaning we have forked. + # Clean up reactor state so a new reactor boots up in this child. + stop_event_loop + release_machine + cleanup_machine + @reactor_running = false + end + + tail and @tails.unshift(tail) + + if reactor_running? + (b = blk || block) and b.call # next_tick(b) + else + @conns = {} + @acceptors = {} + @timers = {} + @wrapped_exception = nil + @next_tick_queue ||= [] + @tails ||= [] + begin + @reactor_pid = Process.pid + @reactor_running = true + initialize_event_machine + (b = blk || block) and add_timer(0, b) + if @next_tick_queue && !@next_tick_queue.empty? + add_timer(0) { signal_loopbreak } + end + @reactor_thread = Thread.current + + # Rubinius needs to come back into "Ruby space" for GC to work, + # so we'll crank the machine here. + if defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx" + while run_machine_once; end + else + run_machine + end + + ensure + until @tails.empty? + @tails.pop.call + end + + release_machine + cleanup_machine + @reactor_running = false + @reactor_thread = nil + end + + raise @wrapped_exception if @wrapped_exception + end + end + + # Sugars a common use case. Will pass the given block to #run, but will terminate + # the reactor loop and exit the function as soon as the code in the block completes. + # (Normally, {EventMachine.run} keeps running indefinitely, even after the block supplied to it + # finishes running, until user code calls {EventMachine.stop}) + # + def self.run_block &block + pr = proc { + block.call + EventMachine::stop + } + run(&pr) + end + + # @return [Boolean] true if the calling thread is the same thread as the reactor. + def self.reactor_thread? + Thread.current == @reactor_thread + end + + # Runs the given callback on the reactor thread, or immediately if called + # from the reactor thread. Accepts the same arguments as {EventMachine::Callback} + def self.schedule(*a, &b) + cb = Callback(*a, &b) + if reactor_running? && reactor_thread? + cb.call + else + next_tick { cb.call } + end + end + + # Forks a new process, properly stops the reactor and then calls {EventMachine.run} inside of it again, passing your block. + def self.fork_reactor &block + # This implementation is subject to change, especially if we clean up the relationship + # of EM#run to @reactor_running. + # Original patch by Aman Gupta. + # + Kernel.fork do + if reactor_running? + stop_event_loop + release_machine + cleanup_machine + @reactor_running = false + @reactor_thread = nil + end + run block + end + end + + # Clean up Ruby space following a release_machine + def self.cleanup_machine + if @threadpool && !@threadpool.empty? + # Tell the threads to stop + @threadpool.each { |t| t.exit } + # Join the threads or bump the stragglers one more time + @threadpool.each { |t| t.join 0.01 || t.exit } + end + @threadpool = nil + @threadqueue = nil + @resultqueue = nil + @all_threads_spawned = false + @next_tick_queue = [] + end + + # Adds a block to call as the reactor is shutting down. + # + # These callbacks are called in the _reverse_ order to which they are added. + # + # @example Scheduling operations to be run when EventMachine event loop is stopped + # + # EventMachine.run do + # EventMachine.add_shutdown_hook { puts "b" } + # EventMachine.add_shutdown_hook { puts "a" } + # EventMachine.stop + # end + # + # # Outputs: + # # a + # # b + # + def self.add_shutdown_hook &block + @tails << block + end + + # Adds a one-shot timer to the event loop. + # Call it with one or two parameters. The first parameters is a delay-time + # expressed in *seconds* (not milliseconds). The second parameter, if + # present, must be an object that responds to :call. If 2nd parameter is not given, then you + # can also simply pass a block to the method call. + # + # This method may be called from the block passed to {EventMachine.run} + # or from any callback method. It schedules execution of the proc or block + # passed to it, after the passage of an interval of time equal to + # *at least* the number of seconds specified in the first parameter to + # the call. + # + # {EventMachine.add_timer} is a non-blocking method. Callbacks can and will + # be called during the interval of time that the timer is in effect. + # There is no built-in limit to the number of timers that can be outstanding at + # any given time. + # + # @example Setting a one-shot timer with EventMachine + # + # EventMachine.run { + # puts "Starting the run now: #{Time.now}" + # EventMachine.add_timer 5, proc { puts "Executing timer event: #{Time.now}" } + # EventMachine.add_timer(10) { puts "Executing timer event: #{Time.now}" } + # } + # + # @param [Integer] delay Delay in seconds + # @see EventMachine::Timer + # @see EventMachine.add_periodic_timer + def self.add_timer *args, &block + interval = args.shift + code = args.shift || block + if code + # check too many timers! + s = add_oneshot_timer((interval.to_f * 1000).to_i) + @timers[s] = code + s + end + end + + # Adds a periodic timer to the event loop. + # It takes the same parameters as the one-shot timer method, {EventMachine.add_timer}. + # This method schedules execution of the given block repeatedly, at intervals + # of time *at least* as great as the number of seconds given in the first + # parameter to the call. + # + # @example Write a dollar-sign to stderr every five seconds, without blocking + # + # EventMachine.run { + # EventMachine.add_periodic_timer( 5 ) { $stderr.write "$" } + # } + # + # @param [Integer] delay Delay in seconds + # + # @see EventMachine::PeriodicTimer + # @see EventMachine.add_timer + # + def self.add_periodic_timer *args, &block + interval = args.shift + code = args.shift || block + + EventMachine::PeriodicTimer.new(interval, code) + end + + + # Cancel a timer (can be a callback or an {EventMachine::Timer} instance). + # + # @param [#cancel, #call] timer_or_sig A timer to cancel + # @see EventMachine::Timer#cancel + def self.cancel_timer timer_or_sig + if timer_or_sig.respond_to? :cancel + timer_or_sig.cancel + else + @timers[timer_or_sig] = false if @timers.has_key?(timer_or_sig) + end + end + + + # Causes the processing loop to stop executing, which will cause all open connections and accepting servers + # to be run down and closed. Connection termination callbacks added using {EventMachine.add_shutdown_hook} + # will be called as part of running this method. + # + # When all of this processing is complete, the call to {EventMachine.run} which started the processing loop + # will return and program flow will resume from the statement following {EventMachine.run} call. + # + # @example Stopping a running EventMachine event loop + # + # require 'rubygems' + # require 'eventmachine' + # + # module Redmond + # def post_init + # puts "We're sending a dumb HTTP request to the remote peer." + # send_data "GET / HTTP/1.1\r\nHost: www.microsoft.com\r\n\r\n" + # end + # + # def receive_data data + # puts "We received #{data.length} bytes from the remote peer." + # puts "We're going to stop the event loop now." + # EventMachine::stop_event_loop + # end + # + # def unbind + # puts "A connection has terminated." + # end + # end + # + # puts "We're starting the event loop now." + # EventMachine.run { + # EventMachine.connect "www.microsoft.com", 80, Redmond + # } + # puts "The event loop has stopped." + # + # # This program will produce approximately the following output: + # # + # # We're starting the event loop now. + # # We're sending a dumb HTTP request to the remote peer. + # # We received 1440 bytes from the remote peer. + # # We're going to stop the event loop now. + # # A connection has terminated. + # # The event loop has stopped. + # + # + def self.stop_event_loop + EventMachine::stop + end + + # Initiates a TCP server (socket acceptor) on the specified IP address and port. + # + # The IP address must be valid on the machine where the program + # runs, and the process must be privileged enough to listen + # on the specified port (on Unix-like systems, superuser privileges + # are usually required to listen on any port lower than 1024). + # Only one listener may be running on any given address/port + # combination. start_server will fail if the given address and port + # are already listening on the machine, either because of a prior call + # to {.start_server} or some unrelated process running on the machine. + # If {.start_server} succeeds, the new network listener becomes active + # immediately and starts accepting connections from remote peers, + # and these connections generate callback events that are processed + # by the code specified in the handler parameter to {.start_server}. + # + # The optional handler which is passed to this method is the key + # to EventMachine's ability to handle particular network protocols. + # The handler parameter passed to start_server must be a Ruby Module + # that you must define. When the network server that is started by + # start_server accepts a new connection, it instantiates a new + # object of an anonymous class that is inherited from {EventMachine::Connection}, + # *into which your handler module have been included*. Arguments passed into start_server + # after the class name are passed into the constructor during the instantiation. + # + # Your handler module may override any of the methods in {EventMachine::Connection}, + # such as {EventMachine::Connection#receive_data}, in order to implement the specific behavior + # of the network protocol. + # + # Callbacks invoked in response to network events *always* take place + # within the execution context of the object derived from {EventMachine::Connection} + # extended by your handler module. There is one object per connection, and + # all of the callbacks invoked for a particular connection take the form + # of instance methods called against the corresponding {EventMachine::Connection} + # object. Therefore, you are free to define whatever instance variables you + # wish, in order to contain the per-connection state required by the network protocol you are + # implementing. + # + # {EventMachine.start_server} is usually called inside the block passed to {EventMachine.run}, + # but it can be called from any EventMachine callback. {EventMachine.start_server} will fail + # unless the EventMachine event loop is currently running (which is why + # it's often called in the block suppled to {EventMachine.run}). + # + # You may call start_server any number of times to start up network + # listeners on different address/port combinations. The servers will + # all run simultaneously. More interestingly, each individual call to start_server + # can specify a different handler module and thus implement a different + # network protocol from all the others. + # + # @example + # + # require 'rubygems' + # require 'eventmachine' + # + # # Here is an example of a server that counts lines of input from the remote + # # peer and sends back the total number of lines received, after each line. + # # Try the example with more than one client connection opened via telnet, + # # and you will see that the line count increments independently on each + # # of the client connections. Also very important to note, is that the + # # handler for the receive_data function, which our handler redefines, may + # # not assume that the data it receives observes any kind of message boundaries. + # # Also, to use this example, be sure to change the server and port parameters + # # to the start_server call to values appropriate for your environment. + # module LineCounter + # MaxLinesPerConnection = 10 + # + # def post_init + # puts "Received a new connection" + # @data_received = "" + # @line_count = 0 + # end + # + # def receive_data data + # @data_received << data + # while @data_received.slice!( /^[^\n]*[\n]/m ) + # @line_count += 1 + # send_data "received #{@line_count} lines so far\r\n" + # @line_count == MaxLinesPerConnection and close_connection_after_writing + # end + # end + # end + # + # EventMachine.run { + # host, port = "192.168.0.100", 8090 + # EventMachine.start_server host, port, LineCounter + # puts "Now accepting connections on address #{host}, port #{port}..." + # EventMachine.add_periodic_timer(10) { $stderr.write "*" } + # } + # + # @param [String] server Host to bind to. + # @param [Integer] port Port to bind to. + # @param [Module, Class] handler A module or class that implements connection callbacks + # + # @note Don't forget that in order to bind to ports < 1024 on Linux, *BSD and Mac OS X your process must have superuser privileges. + # + # @see file:docs/GettingStarted.md EventMachine tutorial + # @see EventMachine.stop_server + def self.start_server server, port=nil, handler=nil, *args, &block + begin + port = Integer(port) + rescue ArgumentError, TypeError + # there was no port, so server must be a unix domain socket + # the port argument is actually the handler, and the handler is one of the args + args.unshift handler if handler + handler = port + port = nil + end if port + + klass = klass_from_handler(Connection, handler, *args) + + s = if port + start_tcp_server server, port + else + start_unix_server server + end + @acceptors[s] = [klass,args,block] + s + end + + # Attach to an existing socket's file descriptor. The socket may have been + # started with {EventMachine.start_server}. + def self.attach_server sock, handler=nil, *args, &block + klass = klass_from_handler(Connection, handler, *args) + sd = sock.respond_to?(:fileno) ? sock.fileno : sock + s = attach_sd(sd) + @acceptors[s] = [klass,args,block,sock] + s + end + + # Stop a TCP server socket that was started with {EventMachine.start_server}. + # @see EventMachine.start_server + def self.stop_server signature + EventMachine::stop_tcp_server signature + end + + # Start a Unix-domain server. + # + # Note that this is an alias for {EventMachine.start_server}, which can be used to start both + # TCP and Unix-domain servers. + # + # @see EventMachine.start_server + def self.start_unix_domain_server filename, *args, &block + start_server filename, *args, &block + end + + # Initiates a TCP connection to a remote server and sets up event handling for the connection. + # {EventMachine.connect} requires event loop to be running (see {EventMachine.run}). + # + # {EventMachine.connect} takes the IP address (or hostname) and + # port of the remote server you want to connect to. + # It also takes an optional handler (a module or a subclass of {EventMachine::Connection}) which you must define, that + # contains the callbacks that will be invoked by the event loop on behalf of the connection. + # + # Learn more about connection lifecycle callbacks in the {file:docs/GettingStarted.md EventMachine tutorial} and + # {file:docs/ConnectionLifecycleCallbacks.md Connection lifecycle guide}. + # + # + # @example + # + # # Here's a program which connects to a web server, sends a naive + # # request, parses the HTTP header of the response, and then + # # (antisocially) ends the event loop, which automatically drops the connection + # # (and incidentally calls the connection's unbind method). + # module DumbHttpClient + # def post_init + # send_data "GET / HTTP/1.1\r\nHost: _\r\n\r\n" + # @data = "" + # @parsed = false + # end + # + # def receive_data data + # @data << data + # if !@parsed and @data =~ /[\n][\r]*[\n]/m + # @parsed = true + # puts "RECEIVED HTTP HEADER:" + # $`.each {|line| puts ">>> #{line}" } + # + # puts "Now we'll terminate the loop, which will also close the connection" + # EventMachine::stop_event_loop + # end + # end + # + # def unbind + # puts "A connection has terminated" + # end + # end + # + # EventMachine.run { + # EventMachine.connect "www.bayshorenetworks.com", 80, DumbHttpClient + # } + # puts "The event loop has ended" + # + # + # @example Defining protocol handler as a class + # + # class MyProtocolHandler < EventMachine::Connection + # def initialize *args + # super + # # whatever else you want to do here + # end + # + # # ... + # end + # + # + # @param [String] server Host to connect to + # @param [Integer] port Port to connect to + # @param [Module, Class] handler A module or class that implements connection lifecycle callbacks + # + # @see EventMachine.start_server + # @see file:docs/GettingStarted.md EventMachine tutorial + def self.connect server, port=nil, handler=nil, *args, &blk + # EventMachine::connect initiates a TCP connection to a remote + # server and sets up event-handling for the connection. + # It internally creates an object that should not be handled + # by the caller. HOWEVER, it's often convenient to get the + # object to set up interfacing to other objects in the system. + # We return the newly-created anonymous-class object to the caller. + # It's expected that a considerable amount of code will depend + # on this behavior, so don't change it. + # + # Ok, added support for a user-defined block, 13Apr06. + # This leads us to an interesting choice because of the + # presence of the post_init call, which happens in the + # initialize method of the new object. We call the user's + # block and pass the new object to it. This is a great + # way to do protocol-specific initiation. It happens + # AFTER post_init has been called on the object, which I + # certainly hope is the right choice. + # Don't change this lightly, because accepted connections + # are different from connected ones and we don't want + # to have them behave differently with respect to post_init + # if at all possible. + + bind_connect nil, nil, server, port, handler, *args, &blk + end + + # This method is like {EventMachine.connect}, but allows for a local address/port + # to bind the connection to. + # + # @see EventMachine.connect + def self.bind_connect bind_addr, bind_port, server, port=nil, handler=nil, *args + begin + port = Integer(port) + rescue ArgumentError, TypeError + # there was no port, so server must be a unix domain socket + # the port argument is actually the handler, and the handler is one of the args + args.unshift handler if handler + handler = port + port = nil + end if port + + klass = klass_from_handler(Connection, handler, *args) + + s = if port + if bind_addr + bind_connect_server bind_addr, bind_port.to_i, server, port + else + connect_server server, port + end + else + connect_unix_server server + end + + c = klass.new s, *args + @conns[s] = c + block_given? and yield c + c + end + + # {EventMachine.watch} registers a given file descriptor or IO object with the eventloop. The + # file descriptor will not be modified (it will remain blocking or non-blocking). + # + # The eventloop can be used to process readable and writable events on the file descriptor, using + # {EventMachine::Connection#notify_readable=} and {EventMachine::Connection#notify_writable=} + # + # {EventMachine::Connection#notify_readable?} and {EventMachine::Connection#notify_writable?} can be used + # to check what events are enabled on the connection. + # + # To detach the file descriptor, use {EventMachine::Connection#detach} + # + # @example + # + # module SimpleHttpClient + # def notify_readable + # header = @io.readline + # + # if header == "\r\n" + # # detach returns the file descriptor number (fd == @io.fileno) + # fd = detach + # end + # rescue EOFError + # detach + # end + # + # def unbind + # EM.next_tick do + # # socket is detached from the eventloop, but still open + # data = @io.read + # end + # end + # end + # + # EventMachine.run { + # sock = TCPSocket.new('site.com', 80) + # sock.write("GET / HTTP/1.0\r\n\r\n") + # conn = EventMachine.watch(sock, SimpleHttpClient) + # conn.notify_readable = true + # } + # + # @author Riham Aldakkak (eSpace Technologies) + def EventMachine::watch io, handler=nil, *args, &blk + attach_io io, true, handler, *args, &blk + end + + # Attaches an IO object or file descriptor to the eventloop as a regular connection. + # The file descriptor will be set as non-blocking, and EventMachine will process + # receive_data and send_data events on it as it would for any other connection. + # + # To watch a fd instead, use {EventMachine.watch}, which will not alter the state of the socket + # and fire notify_readable and notify_writable events instead. + def EventMachine::attach io, handler=nil, *args, &blk + attach_io io, false, handler, *args, &blk + end + + # @private + def EventMachine::attach_io io, watch_mode, handler=nil, *args + klass = klass_from_handler(Connection, handler, *args) + + if !watch_mode and klass.public_instance_methods.any?{|m| [:notify_readable, :notify_writable].include? m.to_sym } + raise ArgumentError, "notify_readable/writable with EM.attach is not supported. Use EM.watch(io){ |c| c.notify_readable = true }" + end + + if io.respond_to?(:fileno) + # getDescriptorByFileno deprecated in JRuby 1.7.x, removed in JRuby 9000 + if defined?(JRuby) && JRuby.runtime.respond_to?(:getDescriptorByFileno) + fd = JRuby.runtime.getDescriptorByFileno(io.fileno).getChannel + else + fd = io.fileno + end + else + fd = io + end + + s = attach_fd fd, watch_mode + c = klass.new s, *args + + c.instance_variable_set(:@io, io) + c.instance_variable_set(:@watch_mode, watch_mode) + c.instance_variable_set(:@fd, fd) + + @conns[s] = c + block_given? and yield c + c + end + + + # Connect to a given host/port and re-use the provided {EventMachine::Connection} instance. + # Consider also {EventMachine::Connection#reconnect}. + # + # @see EventMachine::Connection#reconnect + def self.reconnect server, port, handler + # Observe, the test for already-connected FAILS if we call a reconnect inside post_init, + # because we haven't set up the connection in @conns by that point. + # RESIST THE TEMPTATION to "fix" this problem by redefining the behavior of post_init. + # + # Changed 22Nov06: if called on an already-connected handler, just return the + # handler and do nothing more. Originally this condition raised an exception. + # We may want to change it yet again and call the block, if any. + + raise "invalid handler" unless handler.respond_to?(:connection_completed) + #raise "still connected" if @conns.has_key?(handler.signature) + return handler if @conns.has_key?(handler.signature) + + s = if port + connect_server server, port + else + connect_unix_server server + end + handler.signature = s + @conns[s] = handler + block_given? and yield handler + handler + end + + + # Make a connection to a Unix-domain socket. This method is simply an alias for {.connect}, + # which can connect to both TCP and Unix-domain sockets. Make sure that your process has sufficient + # permissions to open the socket it is given. + # + # @param [String] socketname Unix domain socket (local fully-qualified path) you want to connect to. + # + # @note UNIX sockets, as the name suggests, are not available on Microsoft Windows. + def self.connect_unix_domain socketname, *args, &blk + connect socketname, *args, &blk + end + + + # Used for UDP-based protocols. Its usage is similar to that of {EventMachine.start_server}. + # + # This method will create a new UDP (datagram) socket and + # bind it to the address and port that you specify. + # The normal callbacks (see {EventMachine.start_server}) will + # be called as events of interest occur on the newly-created + # socket, but there are some differences in how they behave. + # + # {Connection#receive_data} will be called when a datagram packet + # is received on the socket, but unlike TCP sockets, the message + # boundaries of the received data will be respected. In other words, + # if the remote peer sent you a datagram of a particular size, + # you may rely on {Connection#receive_data} to give you the + # exact data in the packet, with the original data length. + # Also observe that Connection#receive_data may be called with a + # *zero-length* data payload, since empty datagrams are permitted in UDP. + # + # {Connection#send_data} is available with UDP packets as with TCP, + # but there is an important difference. Because UDP communications + # are *connectionless*, there is no implicit recipient for the packets you + # send. Ordinarily you must specify the recipient for each packet you send. + # However, EventMachine provides for the typical pattern of receiving a UDP datagram + # from a remote peer, performing some operation, and then sending + # one or more packets in response to the same remote peer. + # To support this model easily, just use {Connection#send_data} + # in the code that you supply for {Connection#receive_data}. + # + # EventMachine will provide an implicit return address for any messages sent to + # {Connection#send_data} within the context of a {Connection#receive_data} callback, + # and your response will automatically go to the correct remote peer. + # + # Observe that the port number that you supply to {EventMachine.open_datagram_socket} + # may be zero. In this case, EventMachine will create a UDP socket + # that is bound to an [ephemeral port](http://en.wikipedia.org/wiki/Ephemeral_port). + # This is not appropriate for servers that must publish a well-known + # port to which remote peers may send datagrams. But it can be useful + # for clients that send datagrams to other servers. + # If you do this, you will receive any responses from the remote + # servers through the normal {Connection#receive_data} callback. + # Observe that you will probably have issues with firewalls blocking + # the ephemeral port numbers, so this technique is most appropriate for LANs. + # + # If you wish to send datagrams to arbitrary remote peers (not + # necessarily ones that have sent data to which you are responding), + # then see {Connection#send_datagram}. + # + # DO NOT call send_data from a datagram socket outside of a {Connection#receive_data} method. Use {Connection#send_datagram}. + # If you do use {Connection#send_data} outside of a {Connection#receive_data} method, you'll get a confusing error + # because there is no "peer," as #send_data requires (inside of {EventMachine::Connection#receive_data}, + # {EventMachine::Connection#send_data} "fakes" the peer as described above). + # + # @param [String] address IP address + # @param [String] port Port + # @param [Class, Module] handler A class or a module that implements connection lifecycle callbacks. + def self.open_datagram_socket address, port, handler=nil, *args + # Replaced the implementation on 01Oct06. Thanks to Tobias Gustafsson for pointing + # out that this originally did not take a class but only a module. + + + klass = klass_from_handler(Connection, handler, *args) + s = open_udp_socket address, port.to_i + c = klass.new s, *args + @conns[s] = c + block_given? and yield c + c + end + + + # For advanced users. This function sets the default timer granularity, which by default is + # slightly smaller than 100 milliseconds. Call this function to set a higher or lower granularity. + # The function affects the behavior of {EventMachine.add_timer} and {EventMachine.add_periodic_timer}. + # Most applications will not need to call this function. + # + # Avoid setting the quantum to very low values because that may reduce performance under some extreme conditions. + # We recommend that you not use values lower than 10. + # + # This method only can be used if event loop is running. + # + # @param [Integer] mills New timer granularity, in milliseconds + # + # @see EventMachine.add_timer + # @see EventMachine.add_periodic_timer + # @see EventMachine::Timer + # @see EventMachine.run + def self.set_quantum mills + set_timer_quantum mills.to_i + end + + # Sets the maximum number of timers and periodic timers that may be outstanding at any + # given time. You only need to call {.set_max_timers} if you need more than the default + # number of timers, which on most platforms is 1000. + # + # @note This method has to be used *before* event loop is started. + # + # @param [Integer] ct Maximum number of timers that may be outstanding at any given time + # + # @see EventMachine.add_timer + # @see EventMachine.add_periodic_timer + # @see EventMachine::Timer + def self.set_max_timers ct + set_max_timer_count ct + end + + # Gets the current maximum number of allowed timers + # + # @return [Integer] Maximum number of timers that may be outstanding at any given time + def self.get_max_timers + get_max_timer_count + end + + # Returns the total number of connections (file descriptors) currently held by the reactor. + # Note that a tick must pass after the 'initiation' of a connection for this number to increment. + # It's usually accurate, but don't rely on the exact precision of this number unless you really know EM internals. + # + # @example + # + # EventMachine.run { + # EventMachine.connect("rubyeventmachine.com", 80) + # # count will be 0 in this case, because connection is not + # # established yet + # count = EventMachine.connection_count + # } + # + # + # @example + # + # EventMachine.run { + # EventMachine.connect("rubyeventmachine.com", 80) + # + # EventMachine.next_tick { + # # In this example, count will be 1 since the connection has been established in + # # the next loop of the reactor. + # count = EventMachine.connection_count + # } + # } + # + # @return [Integer] Number of connections currently held by the reactor. + def self.connection_count + self.get_connection_count + end + + # The is the responder for the loopback-signalled event. + # It can be fired either by code running on a separate thread ({EventMachine.defer}) or on + # the main thread ({EventMachine.next_tick}). + # It will often happen that a next_tick handler will reschedule itself. We + # consume a copy of the tick queue so that tick events scheduled by tick events + # have to wait for the next pass through the reactor core. + # + # @private + def self.run_deferred_callbacks + until (@resultqueue ||= []).empty? + result,cback = @resultqueue.pop + cback.call result if cback + end + + # Capture the size at the start of this tick... + size = @next_tick_mutex.synchronize { @next_tick_queue.size } + size.times do |i| + callback = @next_tick_mutex.synchronize { @next_tick_queue.shift } + begin + callback.call + rescue + exception_raised = true + raise + ensure + # This is a little nasty. The problem is, if an exception occurs during + # the callback, then we need to send a signal to the reactor to actually + # do some work during the next_tick. The only mechanism we have from the + # ruby side is next_tick itself, although ideally, we'd just drop a byte + # on the loopback descriptor. + EM.next_tick {} if exception_raised + end + end + end + + + # EventMachine.defer is used for integrating blocking operations into EventMachine's control flow. + # The action of {.defer} is to take the block specified in the first parameter (the "operation") + # and schedule it for asynchronous execution on an internal thread pool maintained by EventMachine. + # When the operation completes, it will pass the result computed by the block (if any) back to the + # EventMachine reactor. Then, EventMachine calls the block specified in the second parameter to + # {.defer} (the "callback"), as part of its normal event handling loop. The result computed by the + # operation block is passed as a parameter to the callback. You may omit the callback parameter if + # you don't need to execute any code after the operation completes. If the operation raises an + # unhandled exception, the exception will be passed to the third parameter to {.defer} (the + # "errback"), as part of its normal event handling loop. If no errback is provided, the exception + # will be allowed to blow through to the main thread immediately. + # + # ## Caveats ## + # + # Note carefully that the code in your deferred operation will be executed on a separate + # thread from the main EventMachine processing and all other Ruby threads that may exist in + # your program. Also, multiple deferred operations may be running at once! Therefore, you + # are responsible for ensuring that your operation code is threadsafe. + # + # Don't write a deferred operation that will block forever. If so, the current implementation will + # not detect the problem, and the thread will never be returned to the pool. EventMachine limits + # the number of threads in its pool, so if you do this enough times, your subsequent deferred + # operations won't get a chance to run. + # + # The threads within the EventMachine's thread pool have abort_on_exception set to true. As a result, + # if an unhandled exception is raised by the deferred operation and an errback is not provided, it + # will blow through to the main thread immediately. If the main thread is within an indiscriminate + # rescue block at that time, the exception could be handled improperly by the main thread. + # + # @example + # + # operation = proc { + # # perform a long-running operation here, such as a database query. + # "result" # as usual, the last expression evaluated in the block will be the return value. + # } + # callback = proc {|result| + # # do something with result here, such as send it back to a network client. + # } + # errback = proc {|error| + # # do something with error here, such as re-raising or logging. + # } + # + # EventMachine.defer(operation, callback, errback) + # + # @param [#call] op An operation you want to offload to EventMachine thread pool + # @param [#call] callback A callback that will be run on the event loop thread after `operation` finishes. + # @param [#call] errback An errback that will be run on the event loop thread after `operation` raises an exception. + # + # @see EventMachine.threadpool_size + def self.defer op = nil, callback = nil, errback = nil, &blk + # OBSERVE that #next_tick hacks into this mechanism, so don't make any changes here + # without syncing there. + # + # Running with $VERBOSE set to true gives a warning unless all ivars are defined when + # they appear in rvalues. But we DON'T ever want to initialize @threadqueue unless we + # need it, because the Ruby threads are so heavyweight. We end up with this bizarre + # way of initializing @threadqueue because EventMachine is a Module, not a Class, and + # has no constructor. + + unless @threadpool + @threadpool = [] + @threadqueue = ::Queue.new + @resultqueue = ::Queue.new + spawn_threadpool + end + + @threadqueue << [op||blk,callback,errback] + end + + + # @private + def self.spawn_threadpool + until @threadpool.size == @threadpool_size.to_i + thread = Thread.new do + Thread.current.abort_on_exception = true + while true + begin + op, cback, eback = *@threadqueue.pop + rescue ThreadError + $stderr.puts $!.message + break # Ruby 2.0 may fail at Queue.pop + end + begin + result = op.call + @resultqueue << [result, cback] + rescue Exception => error + raise error unless eback + @resultqueue << [error, eback] + end + EventMachine.signal_loopbreak + end + end + @threadpool << thread + end + @all_threads_spawned = true + end + + ## + # Returns +true+ if all deferred actions are done executing and their + # callbacks have been fired. + # + def self.defers_finished? + return false if @threadpool and !@all_threads_spawned + return false if @threadqueue and not @threadqueue.empty? + return false if @resultqueue and not @resultqueue.empty? + return false if @threadpool and @threadqueue.num_waiting != @threadpool.size + return true + end + + class << self + # @private + attr_reader :threadpool + + # Size of the EventMachine.defer threadpool (defaults to 20) + # @return [Number] + attr_accessor :threadpool_size + EventMachine.threadpool_size = 20 + end + + # Schedules a proc for execution immediately after the next "turn" through the reactor + # core. An advanced technique, this can be useful for improving memory management and/or + # application responsiveness, especially when scheduling large amounts of data for + # writing to a network connection. + # + # This method takes either a single argument (which must be a callable object) or a block. + # + # @param [#call] pr A callable object to run + def self.next_tick pr=nil, &block + # This works by adding to the @resultqueue that's used for #defer. + # The general idea is that next_tick is used when we want to give the reactor a chance + # to let other operations run, either to balance the load out more evenly, or to let + # outbound network buffers drain, or both. So we probably do NOT want to block, and + # we probably do NOT want to be spinning any threads. A program that uses next_tick + # but not #defer shouldn't suffer the penalty of having Ruby threads running. They're + # extremely expensive even if they're just sleeping. + + raise ArgumentError, "no proc or block given" unless ((pr && pr.respond_to?(:call)) or block) + @next_tick_mutex.synchronize do + @next_tick_queue << ( pr || block ) + end + signal_loopbreak if reactor_running? + end + + # A wrapper over the setuid system call. Particularly useful when opening a network + # server on a privileged port because you can use this call to drop privileges + # after opening the port. Also very useful after a call to {.set_descriptor_table_size}, + # which generally requires that you start your process with root privileges. + # + # This method is intended for use in enforcing security requirements, consequently + # it will throw a fatal error and end your program if it fails. + # + # @param [String] username The effective name of the user whose privilege-level your process should attain. + # + # @note This method has no effective implementation on Windows or in the pure-Ruby + # implementation of EventMachine + def self.set_effective_user username + EventMachine::setuid_string username + end + + + # Sets the maximum number of file or socket descriptors that your process may open. + # If you call this method with no arguments, it will simply return + # the current size of the descriptor table without attempting to change it. + # + # The new limit on open descriptors **only** applies to sockets and other descriptors + # that belong to EventMachine. It has **no effect** on the number of descriptors + # you can create in ordinary Ruby code. + # + # Not available on all platforms. Increasing the number of descriptors beyond its + # default limit usually requires superuser privileges. (See {.set_effective_user} + # for a way to drop superuser privileges while your program is running.) + # + # @param [Integer] n_descriptors The maximum number of file or socket descriptors that your process may open + # @return [Integer] The new descriptor table size. + def self.set_descriptor_table_size n_descriptors=nil + EventMachine::set_rlimit_nofile n_descriptors + end + + + + # Runs an external process. + # + # @example + # + # module RubyCounter + # def post_init + # # count up to 5 + # send_data "5\n" + # end + # def receive_data data + # puts "ruby sent me: #{data}" + # end + # def unbind + # puts "ruby died with exit status: #{get_status.exitstatus}" + # end + # end + # + # EventMachine.run { + # EventMachine.popen("ruby -e' $stdout.sync = true; gets.to_i.times{ |i| puts i+1; sleep 1 } '", RubyCounter) + # } + # + # @note This method is not supported on Microsoft Windows + # @see EventMachine::DeferrableChildProcess + # @see EventMachine.system + def self.popen cmd, handler=nil, *args + # At this moment, it's only available on Unix. + # Perhaps misnamed since the underlying function uses socketpair and is full-duplex. + + klass = klass_from_handler(Connection, handler, *args) + w = case cmd + when Array + cmd + when String + Shellwords::shellwords( cmd ) + end + w.unshift( w.first ) if w.first + s = invoke_popen( w ) + c = klass.new s, *args + @conns[s] = c + yield(c) if block_given? + c + end + + + # Tells you whether the EventMachine reactor loop is currently running. + # + # Useful when writing libraries that want to run event-driven code, but may + # be running in programs that are already event-driven. In such cases, if {EventMachine.reactor_running?} + # returns false, your code can invoke {EventMachine.run} and run your application code inside + # the block passed to that method. If this method returns true, just + # execute your event-aware code. + # + # @return [Boolean] true if the EventMachine reactor loop is currently running + def self.reactor_running? + @reactor_running && Process.pid == @reactor_pid + end + + + # (Experimental) + # + # @private + def self.open_keyboard handler=nil, *args + klass = klass_from_handler(Connection, handler, *args) + + s = read_keyboard + c = klass.new s, *args + @conns[s] = c + block_given? and yield c + c + end + + # EventMachine's file monitoring API. Currently supported are the following events + # on individual files, using inotify on Linux systems, and kqueue for *BSD and Mac OS X: + # + # * File modified (written to) + # * File moved/renamed + # * File deleted + # + # EventMachine::watch_file takes a filename and a handler Module containing your custom callback methods. + # This will setup the low level monitoring on the specified file, and create a new EventMachine::FileWatch + # object with your Module mixed in. FileWatch is a subclass of {EventMachine::Connection}, so callbacks on this object + # work in the familiar way. The callbacks that will be fired by EventMachine are: + # + # * file_modified + # * file_moved + # * file_deleted + # + # You can access the filename being monitored from within this object using {FileWatch#path}. + # + # When a file is deleted, {FileWatch#stop_watching} will be called after your file_deleted callback, + # to clean up the underlying monitoring and remove EventMachine's reference to the now-useless {FileWatch} instance. + # This will in turn call unbind, if you wish to use it. + # + # The corresponding system-level Errno will be raised when attempting to monitor non-existent files, + # files with wrong permissions, or if an error occurs dealing with inotify/kqueue. + # + # @example + # + # # Before running this example, make sure we have a file to monitor: + # # $ echo "bar" > /tmp/foo + # + # module Handler + # def file_modified + # puts "#{path} modified" + # end + # + # def file_moved + # puts "#{path} moved" + # end + # + # def file_deleted + # puts "#{path} deleted" + # end + # + # def unbind + # puts "#{path} monitoring ceased" + # end + # end + # + # # for efficient file watching, use kqueue on Mac OS X + # EventMachine.kqueue = true if EventMachine.kqueue? + # + # EventMachine.run { + # EventMachine.watch_file("/tmp/foo", Handler) + # } + # + # # $ echo "baz" >> /tmp/foo => "/tmp/foo modified" + # # $ mv /tmp/foo /tmp/oof => "/tmp/foo moved" + # # $ rm /tmp/oof => "/tmp/foo deleted" + # + # @note The ability to pick up on the new filename after a rename is not yet supported. + # Calling #path will always return the filename you originally used. + # + # @param [String] filename Local path to the file to watch. + # @param [Class, Module] handler A class or module that implements event handlers associated with the file. + def self.watch_file(filename, handler=nil, *args) + klass = klass_from_handler(FileWatch, handler, *args) + + s = EM::watch_filename(filename) + c = klass.new s, *args + # we have to set the path like this because of how Connection.new works + c.instance_variable_set("@path", filename) + @conns[s] = c + block_given? and yield c + c + end + + # EventMachine's process monitoring API. On Mac OS X and *BSD this method is implemented using kqueue. + # + # @example + # + # module ProcessWatcher + # def process_exited + # put 'the forked child died!' + # end + # end + # + # pid = fork{ sleep } + # + # EventMachine.run { + # EventMachine.watch_process(pid, ProcessWatcher) + # EventMachine.add_timer(1){ Process.kill('TERM', pid) } + # } + # + # @param [Integer] pid PID of the process to watch. + # @param [Class, Module] handler A class or module that implements event handlers associated with the file. + def self.watch_process(pid, handler=nil, *args) + pid = pid.to_i + + klass = klass_from_handler(ProcessWatch, handler, *args) + + s = EM::watch_pid(pid) + c = klass.new s, *args + # we have to set the path like this because of how Connection.new works + c.instance_variable_set("@pid", pid) + @conns[s] = c + block_given? and yield c + c + end + + # Catch-all for errors raised during event loop callbacks. + # + # @example + # + # EventMachine.error_handler{ |e| + # puts "Error raised during event loop: #{e.message}" + # } + # + # @param [#call] cb Global catch-all errback + def self.error_handler cb = nil, &blk + if cb or blk + @error_handler = cb || blk + elsif instance_variable_defined? :@error_handler + remove_instance_variable :@error_handler + end + end + + # This method allows for direct writing of incoming data back out to another descriptor, at the C++ level in the reactor. + # This is very efficient and especially useful for proxies where high performance is required. Propogating data from a server response + # all the way up to Ruby, and then back down to the reactor to be sent back to the client, is often unnecessary and + # incurs a significant performance decrease. + # + # The two arguments are instance of {EventMachine::Connection} subclasses, 'from' and 'to'. 'from' is the connection whose inbound data you want + # relayed back out. 'to' is the connection to write it to. + # + # Once you call this method, the 'from' connection will no longer get receive_data callbacks from the reactor, + # except in the case that 'to' connection has already closed when attempting to write to it. You can see + # in the example, that proxy_target_unbound will be called when this occurs. After that, further incoming + # data will be passed into receive_data as normal. + # + # Note also that this feature supports different types of descriptors: TCP, UDP, and pipes. You can relay + # data from one kind to another, for example, feed a pipe from a UDP stream. + # + # @example + # + # module ProxyConnection + # def initialize(client, request) + # @client, @request = client, request + # end + # + # def post_init + # EM::enable_proxy(self, @client) + # end + # + # def connection_completed + # send_data @request + # end + # + # def proxy_target_unbound + # close_connection + # end + # + # def unbind + # @client.close_connection_after_writing + # end + # end + # + # module ProxyServer + # def receive_data(data) + # (@buf ||= "") << data + # if @buf =~ /\r\n\r\n/ # all http headers received + # EventMachine.connect("10.0.0.15", 80, ProxyConnection, self, data) + # end + # end + # end + # + # EventMachine.run { + # EventMachine.start_server("127.0.0.1", 8080, ProxyServer) + # } + # + # @param [EventMachine::Connection] from Source of data to be proxies/streamed. + # @param [EventMachine::Connection] to Destination of data to be proxies/streamed. + # @param [Integer] bufsize Buffer size to use + # @param [Integer] length Maximum number of bytes to proxy. + # + # @see EventMachine.disable_proxy + def self.enable_proxy(from, to, bufsize=0, length=0) + EM::start_proxy(from.signature, to.signature, bufsize, length) + end + + # Takes just one argument, a {Connection} that has proxying enabled via {EventMachine.enable_proxy}. + # Calling this method will remove that functionality and your connection will begin receiving + # data via {Connection#receive_data} again. + # + # @param [EventMachine::Connection] from Source of data that is being proxied + # @see EventMachine.enable_proxy + def self.disable_proxy(from) + EM::stop_proxy(from.signature) + end + + # Retrieve the heartbeat interval. This is how often EventMachine will check for dead connections + # that have had an inactivity timeout set via {Connection#set_comm_inactivity_timeout}. + # Default is 2 seconds. + # + # @return [Integer] Heartbeat interval, in seconds + def self.heartbeat_interval + EM::get_heartbeat_interval + end + + # Set the heartbeat interval. This is how often EventMachine will check for dead connections + # that have had an inactivity timeout set via {Connection#set_comm_inactivity_timeout}. + # Takes a Numeric number of seconds. Default is 2. + # + # @param [Integer] time Heartbeat interval, in seconds + def self.heartbeat_interval=(time) + EM::set_heartbeat_interval time.to_f + end + + # @private + def self.event_callback conn_binding, opcode, data + # + # Changed 27Dec07: Eliminated the hookable error handling. + # No one was using it, and it degraded performance significantly. + # It's in original_event_callback, which is dead code. + # + # Changed 25Jul08: Added a partial solution to the problem of exceptions + # raised in user-written event-handlers. If such exceptions are not caught, + # we must cause the reactor to stop, and then re-raise the exception. + # Otherwise, the reactor doesn't stop and it's left on the call stack. + # This is partial because we only added it to #unbind, where it's critical + # (to keep unbind handlers from being re-entered when a stopping reactor + # runs down open connections). It should go on the other calls to user + # code, but the performance impact may be too large. + # + if opcode == ConnectionUnbound + if c = @conns.delete( conn_binding ) + begin + if c.original_method(:unbind).arity != 0 + c.unbind(data == 0 ? nil : EventMachine::ERRNOS[data]) + else + c.unbind + end + # If this is an attached (but not watched) connection, close the underlying io object. + if c.instance_variable_defined?(:@io) and !c.instance_variable_get(:@watch_mode) + io = c.instance_variable_get(:@io) + begin + io.close + rescue Errno::EBADF, IOError + end + end + rescue Exception => e + if stopping? + @wrapped_exception = $! + stop + else + raise e + end + end + elsif c = @acceptors.delete( conn_binding ) + # no-op + else + if $! # Bubble user generated errors. + @wrapped_exception = $! + EM.stop + else + raise ConnectionNotBound, "received ConnectionUnbound for an unknown signature: #{conn_binding}" + end + end + elsif opcode == ConnectionAccepted + accep,args,blk = @acceptors[conn_binding] + raise NoHandlerForAcceptedConnection unless accep + c = accep.new data, *args + @conns[data] = c + blk and blk.call(c) + c # (needed?) + ## + # The remaining code is a fallback for the pure ruby and java reactors. + # In the C++ reactor, these events are handled in the C event_callback() in rubymain.cpp + elsif opcode == ConnectionCompleted + c = @conns[conn_binding] or raise ConnectionNotBound, "received ConnectionCompleted for unknown signature: #{conn_binding}" + c.connection_completed + elsif opcode == SslHandshakeCompleted + c = @conns[conn_binding] or raise ConnectionNotBound, "received SslHandshakeCompleted for unknown signature: #{conn_binding}" + c.ssl_handshake_completed + elsif opcode == SslVerify + c = @conns[conn_binding] or raise ConnectionNotBound, "received SslVerify for unknown signature: #{conn_binding}" + c.close_connection if c.ssl_verify_peer(data) == false + elsif opcode == TimerFired + t = @timers.delete( data ) + return if t == false # timer cancelled + t or raise UnknownTimerFired, "timer data: #{data}" + t.call + elsif opcode == ConnectionData + c = @conns[conn_binding] or raise ConnectionNotBound, "received data #{data} for unknown signature: #{conn_binding}" + c.receive_data data + elsif opcode == LoopbreakSignalled + run_deferred_callbacks + elsif opcode == ConnectionNotifyReadable + c = @conns[conn_binding] or raise ConnectionNotBound + c.notify_readable + elsif opcode == ConnectionNotifyWritable + c = @conns[conn_binding] or raise ConnectionNotBound + c.notify_writable + end + end + + # + # + # @private + def self._open_file_for_writing filename, handler=nil + klass = klass_from_handler(Connection, handler) + + s = _write_file filename + c = klass.new s + @conns[s] = c + block_given? and yield c + c + end + + # @private + def self.klass_from_handler(klass = Connection, handler = nil, *args) + klass = if handler and handler.is_a?(Class) + raise ArgumentError, "must provide module or subclass of #{klass.name}" unless klass >= handler + handler + elsif handler + if defined?(handler::EM_CONNECTION_CLASS) + handler::EM_CONNECTION_CLASS + else + handler::const_set(:EM_CONNECTION_CLASS, Class.new(klass) {include handler}) + end + else + klass + end + + arity = klass.instance_method(:initialize).arity + expected = arity >= 0 ? arity : -(arity + 1) + if (arity >= 0 and args.size != expected) or (arity < 0 and args.size < expected) + raise ArgumentError, "wrong number of arguments for #{klass}#initialize (#{args.size} for #{expected})" + end + + klass + end +end # module EventMachine + +# Alias for {EventMachine} +EM = EventMachine +# Alias for {EventMachine::Protocols} +EM::P = EventMachine::Protocols diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/fastfilereaderext.bundle b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/fastfilereaderext.bundle new file mode 100755 index 0000000000000000000000000000000000000000..13fdf2c3c459ba615f28670fac854d266f2202d3 GIT binary patch literal 34484 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 Jp2p$*e*m=ch&%uQ literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/jeventmachine.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/jeventmachine.rb new file mode 100644 index 0000000..ec563b2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/jeventmachine.rb @@ -0,0 +1,303 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 8 Apr 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +# This module provides "glue" for the Java version of the EventMachine reactor core. +# For C++ EventMachines, the analogous functionality is found in ext/rubymain.cpp, +# which is a garden-variety Ruby-extension glue module. + +require 'java' +require 'rubyeventmachine' +require 'socket' + +java_import java.io.FileDescriptor +java_import java.nio.channels.SocketChannel +java_import java.lang.reflect.Field + +module JavaFields + def set_field(key, value) + field = getClass.getDeclaredField(key) + field.setAccessible(true) + if field.getType.toString == 'int' + field.setInt(self, value) + else + field.set(self, value) + end + end + + def get_field(key) + field = getClass.getDeclaredField(key) + field.setAccessible(true) + field.get(self) + end +end + +FileDescriptor.send :include, JavaFields +SocketChannel.send :include, JavaFields + +module EventMachine + # TODO: These event numbers are defined in way too many places. + # DRY them up. + # @private + TimerFired = 100 + # @private + ConnectionData = 101 + # @private + ConnectionUnbound = 102 + # @private + ConnectionAccepted = 103 + # @private + ConnectionCompleted = 104 + # @private + LoopbreakSignalled = 105 + # @private + ConnectionNotifyReadable = 106 + # @private + ConnectionNotifyWritable = 107 + # @private + SslHandshakeCompleted = 108 + # @private + SslVerify = 109 + + # Exceptions that are defined in rubymain.cpp + class ConnectionError < RuntimeError; end + class ConnectionNotBound < RuntimeError; end + class UnknownTimerFired < RuntimeError; end + class Unsupported < RuntimeError; end + + # This thunk class used to be called EM, but that caused conflicts with + # the alias "EM" for module EventMachine. (FC, 20Jun08) + class JEM < com.rubyeventmachine.EmReactor + def eventCallback a1, a2, a3, a4 + s = String.from_java_bytes(a3.array[a3.position...a3.limit]) if a3 + EventMachine::event_callback a1, a2, s || a4 + nil + end + end + # class Connection < com.rubyeventmachine.Connection + # def associate_callback_target sig + # # No-op for the time being. + # end + # end + def self.initialize_event_machine + @em = JEM.new + end + def self.release_machine + @em = nil + end + def self.add_oneshot_timer interval + @em.installOneshotTimer interval + end + def self.run_machine + @em.run + end + def self.stop + @em.stop + end + def self.start_tcp_server server, port + @em.startTcpServer server, port + end + def self.stop_tcp_server sig + @em.stopTcpServer sig + end + def self.start_unix_server filename + # TEMPORARILY unsupported until someone figures out how to do it. + raise "unsupported on this platform" + end + def self.send_data sig, data, length + @em.sendData sig, data.to_java_bytes + end + def self.send_datagram sig, data, length, address, port + @em.sendDatagram sig, data.to_java_bytes, length, address, port + end + def self.connect_server server, port + bind_connect_server nil, nil, server, port + end + def self.bind_connect_server bind_addr, bind_port, server, port + @em.connectTcpServer bind_addr, bind_port.to_i, server, port + end + def self.close_connection sig, after_writing + @em.closeConnection sig, after_writing + end + def self.set_comm_inactivity_timeout sig, interval + @em.setCommInactivityTimeout sig, interval + end + def self.set_pending_connect_timeout sig, val + end + def self.set_heartbeat_interval val + end + def self.start_tls sig + @em.startTls sig + end + def self.ssl? + false + end + def self.signal_loopbreak + @em.signalLoopbreak + end + def self.set_timer_quantum q + @em.setTimerQuantum q + end + def self.epoll + # Epoll is a no-op for Java. + # The latest Java versions run epoll when possible in NIO. + end + def self.epoll= val + end + def self.kqueue + end + def self.kqueue= val + end + def self.epoll? + false + end + def self.kqueue? + false + end + def self.set_rlimit_nofile n_descriptors + # Currently a no-op for Java. + end + def self.open_udp_socket server, port + @em.openUdpSocket server, port + end + def self.invoke_popen cmd + # TEMPORARILY unsupported until someone figures out how to do it. + raise "unsupported on this platform" + end + def self.read_keyboard + # TEMPORARILY unsupported until someone figures out how to do it. + raise "temporarily unsupported on this platform" + end + def self.set_max_timer_count num + # harmless no-op in Java. There's no built-in timer limit. + @max_timer_count = num + end + def self.get_max_timer_count + # harmless no-op in Java. There's no built-in timer limit. + @max_timer_count || 100_000 + end + def self.library_type + :java + end + def self.get_peername sig + if peer = @em.getPeerName(sig) + Socket.pack_sockaddr_in(*peer) + end + end + def self.get_sockname sig + if sockName = @em.getSockName(sig) + Socket.pack_sockaddr_in(*sockName) + end + end + # @private + def self.attach_fd fileno, watch_mode + # 3Aug09: We could pass in the actual SocketChannel, but then it would be modified (set as non-blocking), and + # we would need some logic to make sure detach_fd below didn't clobber it. For now, we just always make a new + # SocketChannel for the underlying file descriptor + # if fileno.java_kind_of? SocketChannel + # ch = fileno + # ch.configureBlocking(false) + # fileno = nil + # elsif fileno.java_kind_of? java.nio.channels.Channel + + if fileno.java_kind_of? java.nio.channels.Channel + field = fileno.getClass.getDeclaredField('fdVal') + field.setAccessible(true) + fileno = field.get(fileno) + else + raise ArgumentError, 'attach_fd requires Java Channel or POSIX fileno' unless fileno.is_a? Integer + end + + if fileno == 0 + raise "can't open STDIN as selectable in Java =(" + elsif fileno.is_a? Integer + # 8Aug09: The following code is specific to the sun jvm's SocketChannelImpl. Is there a cross-platform + # way of implementing this? If so, also remember to update EventableSocketChannel#close and #cleanup + fd = FileDescriptor.new + fd.set_field 'fd', fileno + + ch = SocketChannel.open + ch.configureBlocking(false) + ch.kill + ch.set_field 'fd', fd + ch.set_field 'fdVal', fileno + ch.set_field 'state', ch.get_field('ST_CONNECTED') + end + + @em.attachChannel(ch,watch_mode) + end + def self.detach_fd sig + if ch = @em.detachChannel(sig) + ch.get_field 'fdVal' + end + end + + def self.set_notify_readable sig, mode + @em.setNotifyReadable(sig, mode) + end + def self.set_notify_writable sig, mode + @em.setNotifyWritable(sig, mode) + end + + def self.is_notify_readable sig + @em.isNotifyReadable(sig) + end + def self.is_notify_writable sig + @em.isNotifyWritable(sig) + end + def self.get_connection_count + @em.getConnectionCount + end + + def self.pause_connection(sig) + @em.pauseConnection(sig) + end + def self.resume_connection(sig) + @em.resumeConnection(sig) + end + def self.connection_paused?(sig) + @em.isConnectionPaused(sig) + end + def self._get_outbound_data_size(sig) + @em.getOutboundDataSize(sig) + end + + + def self.set_tls_parms(sig, params) + end + def self.start_tls(sig) + end + def self.send_file_data(sig, filename) + end + + class Connection + def associate_callback_target sig + # No-op for the time being + end + def get_outbound_data_size + EM._get_outbound_data_size @signature + end + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/rubyeventmachine.bundle b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/lib/rubyeventmachine.bundle new file mode 100755 index 0000000000000000000000000000000000000000..46ee82fbccc90cca444635a080aa53615cefedeb GIT binary patch literal 461356 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%0D}SB1K|oR3TuJeH|AXK(4&TQ;?erhdIz_#<86C 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∓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 L4O=oP5{dkOw0F#Y literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/package.rake b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/package.rake new file mode 100644 index 0000000..00419d0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/package.rake @@ -0,0 +1,120 @@ +require 'rubygems' +require 'rubygems/package_task' + +begin + require 'rake/extensiontask' + require 'rake/javaextensiontask' +rescue LoadError => e + puts <<-MSG +rake-compiler gem seems to be missing. Please install it with + + gem install rake-compiler + +(add sudo if necessary). + MSG +end + +Gem::PackageTask.new(GEMSPEC) do |pkg| +end + +if RUBY_PLATFORM =~ /java/ + Rake::JavaExtensionTask.new("rubyeventmachine", GEMSPEC) do |ext| + ext.ext_dir = 'java/src' + end +else + def setup_cross_compilation(ext) + unless RUBY_PLATFORM =~ /mswin|mingw/ + ext.cross_compile = true + ext.cross_platform = ['x86-mingw32', 'x64-mingw32'] + end + end + def hack_cross_compilation(ext) + # inject 1.8/1.9 pure-ruby entry point + # HACK: add these dependencies to the task instead of using cross_compiling + if ext.cross_platform.is_a?(Array) + ext.cross_platform.each do |platform| + task = "native:#{GEMSPEC.name}:#{platform}" + if Rake::Task.task_defined?(task) + Rake::Task[task].prerequisites.unshift "lib/#{ext.name}.rb" + end + end + end + end + + em = Rake::ExtensionTask.new("rubyeventmachine", GEMSPEC) do |ext| + ext.ext_dir = 'ext' + ext.source_pattern = '*.{h,c,cpp}' + setup_cross_compilation(ext) + end + hack_cross_compilation em + + ff = Rake::ExtensionTask.new("fastfilereaderext", GEMSPEC) do |ext| + ext.ext_dir = 'ext/fastfilereader' + ext.source_pattern = '*.{h,c,cpp}' + setup_cross_compilation(ext) + end + hack_cross_compilation ff +end + +# Setup shim files that require 1.8 vs 1.9 extensions in win32 bin gems +%w[ rubyeventmachine fastfilereaderext ].each do |filename| + file("lib/#{filename}.rb") do |t| + File.open(t.name, 'wb') do |f| + f.write <<-eoruby + RUBY_VERSION =~ /(\\d+.\\d+)/ + require "\#{$1}/#{File.basename(t.name, '.rb')}" + eoruby + end + at_exit{ FileUtils.rm t.name if File.exist?(t.name) } + end +end + +task :cross_cxx do + ENV['CROSS_COMPILING'] = 'yes' + require 'rake/extensioncompiler' + ENV['CXX'] = "#{Rake::ExtensionCompiler.mingw_host}-g++" +end + +if Rake::Task.task_defined?(:cross) + task :cross => 'lib/rubyeventmachine.rb' + task :cross => 'lib/fastfilereaderext.rb' + task :cross => :cross_cxx +end + +def windows?; RUBY_PLATFORM =~ /mswin|mingw/; end +def sudo(cmd) + if windows? || (require 'etc'; Etc.getpwuid.uid == 0) + sh cmd + else + sh "sudo #{cmd}" + end +end +def gem_cmd(action, name, *args) + rb = Gem.ruby rescue nil + rb ||= (require 'rbconfig'; File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])) + sudo "#{rb} -r rubygems -e 'require %{rubygems/gem_runner}; Gem::GemRunner.new.run(%w{#{action} #{name} #{args.join(' ')}})'" +end + +Rake::Task[:clean].enhance [:clobber_package] + +# DevKit task following the example of Luis Lavena's test-ruby-c-extension +task :devkit do + begin + require "devkit" + rescue LoadError => e + abort "Failed to activate RubyInstaller's DevKit required for compilation." + end +end + +if RUBY_PLATFORM =~ /mingw|mswin/ + Rake::Task['compile'].prerequisites.unshift 'devkit' +end + +desc "Build binary gems for Windows with rake-compiler-dock" +task 'gem:windows' do + require 'rake_compiler_dock' + RakeCompilerDock.sh <<-EOT + RUBY_CC_VERSION="${RUBY_CC_VERSION//1.8.7/}" + bundle && rake cross native gem + EOT +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/test.rake b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/test.rake new file mode 100644 index 0000000..1185ac7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/test.rake @@ -0,0 +1,8 @@ +require 'rake/testtask' + +Rake::TestTask.new(:test) do |t| + t.libs << "tests" + t.libs << "lib" + t.pattern = 'tests/**/test_*.rb' + t.warning = true +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/test_pure.rake b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/test_pure.rake new file mode 100644 index 0000000..5a84ded --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/rakelib/test_pure.rake @@ -0,0 +1,13 @@ +require 'rake/testtask' + +Rake::TestTask.new(:test_pure) do |t| + t.libs << 'tests' + t.libs << 'lib' + t.test_files = Dir.glob('tests/**/test_pure*.rb') + Dir.glob('tests/**/test_ssl*.rb') + t.warning = true +end + +task :test_em_pure_ruby do + ENV['EM_PURE_RUBY'] = 'true' + Rake::Task['test_pure'].execute +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/client.crt b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/client.crt new file mode 100644 index 0000000..1919d97 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/client.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFRDCCAywCAQEwDQYJKoZIhvcNAQEFBQAwaDELMAkGA1UEBhMCRU0xFTATBgNV +BAgTDEV2ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQL +EwtEZXZlbG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMB4XDTA5MDMyOTAy +MzE0NloXDTEwMDMyOTAyMzE0NlowaDELMAkGA1UEBhMCRU0xFTATBgNVBAgTDEV2 +ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQLEwtEZXZl +bG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEAv1FSOIX1z7CQtVBFlrB0A3/V29T+22STKKmiRWYkKL5b ++hkrp9IZ5J4phZHgUVM2VDPOO2Oc2PU6dlGGZISg+UPERunTogxQKezCV0vcE9cK +OwzxCFDRvv5rK8aKMscfBLbNKocAXywuRRQmdxPiVRzbyPrl+qCr/EDLXAX3D77l +S8n2AwDg19VyI+IgFUE+Dy5e1eLoY6nV+Mq+vNXdn3ttF3t+ngac5pj5Q9h+pD5p +67baDHSnf/7cy2fa/LKrLolVHQR9G2K6cEfeM99NtcsMbkoPs4iI3FA05OVTQHXg +C8C8cRxrb9APl95I/ep65OIaCJgcdYxJ3QD3qOtQo6/NQsGnjbyiUxaEpjfqyT1N +uzWD81Q8uXGNS8yD6dDynt/lseBjyp2nfC3uQ5fY18VdIcu0MJ9pezBUKrNuhlsy +XXEZ2DXj4sY8QOvIcBqSB/zmS1nGEK55xrtkaiaNrY8fe8wRVpcPLxy+P225NFw+ +B69FJRA0Lj6Jt9BM4hV/3MSIEWwTVhuw4E02ywDYTzz1wq3ITf0tsbIPn0hXQMxD +ohhAoKioM6u+yHtqsxD0eYaAWmHTVn5oDvOSGpvCpBfWHyA7FP5UQak0fKABEAgK +iQYEnb294AXwXymJttfGTIV/Ne4tLN5dIpNma8UO8rlThlcr6xnTQDbR3gkTDRsC +AwEAATANBgkqhkiG9w0BAQUFAAOCAgEAj7J8fy1LUWoVWnrXDAC9jwJ1nI/YjoSU +6ywke3o04+nZC5S+dPnuVy+HAwsU940CoNvP6RStI/bH6JL+NIqEFmwM3M8xIEWV +MYVPkfvQUxxGvDnaY7vv93u+6Q77HV3qlhAQBHChyuXyO7TG3+WzsiT9AnBNtAP0 +4jClt5kCAQXLO/p0SFEZQ8Ru9SM8d1i73Z0VDVzs8jYWlBhiherSgbw1xK4wBOpJ +43XmjZsBSrDpiAXd07Ak3UL2GjfT7eStgebL3UIe39ThE/s/+l43bh0M6WbOBvyQ +i/rZ50kd1GvN0xnZhtv07hIJWO85FGWi7Oet8AzdUZJ17v1Md/f2vdhPVTFN9q+w +mQ6LxjackqCvaJaQfBEbqsn2Tklxk4tZuDioiQbOElT2e6vljQVJWIfNx38Ny2LM +aiXQPQu+4CI7meAh5gXM5nyJGbZvRPsxj89CqYzyHCYs5HBP3AsviBvn26ziOF+c +544VmHd9HkIv8UTC29hh+R64RlgMQQQdaXFaUrFPTs/do0k8n/c2bPc0iTdfi5Q2 +gq6Vi8q6Ay5wGgTtRRbn/mWKuCFjEh94z6pF9Xr06NX0PuEOdf+Ls9vI5vz6G0w6 +0Li7devEN7EKBY+7Mcjg918yq9i5tEiMkUgT68788t3fTC+4iUQ5fDtdrHsaOlIR +8bs/XQVNE/s= +-----END CERTIFICATE----- diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/client.key b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/client.key new file mode 100644 index 0000000..87a2531 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/client.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/dhparam.pem b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/dhparam.pem new file mode 100644 index 0000000..b6464ab --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/dhparam.pem @@ -0,0 +1,13 @@ +-----BEGIN DH PARAMETERS----- +MIICCAKCAgEAikiatXa5aAteOtd6hOO33npjCvJByD3dwuM8rWzz0DFZdUH9nFJi +b0VvTVweVECb6XZBsrDNLqGQykCrm43swSk5D9XQCGJLxFERD6yk3b90xaeCm3/a +b0Ek5ZVvV73Cc/YbVmpBiOHoTFpUFJLZ7pLMQUSn8y3qUlNcY9/88HuwFi1s1lRM +ovihSRyZMYAuYWOD4yuOuIcroKVjD6gWFrsW9XrALWny6vUXQrhk8Q3rj+wM6ZtE +5afcB0b6ZJtphrDfk3dFjOVG/zVT37VWgrY8GABrpo2ey0W0WIQJ7rDKLaPaI4kc +voOgC2K8Z3kSARZK+jULnwmBeYECz4EH/FF6FEp3GOKtkL4mqEkvh1n5EAesDOGl +iiX+RZXcUrZliSeifSXBTMJWWFVC0fkGIMb9PTZfZHyAC54lpuxzVki0HIyQG9Fs +41zBJ5e8eEoXXlfUYtduUC35YGy2IxSzYLAJE76rctAZSWghha9xLOCDFoLjMr8h +FosKeHKJcBQ0bc8ymOpRIfrYLWhc0Pz2zkpJ/4eYw9t7NYg7S+jP19IE0gUnuM9v +SpoYMtS28tP9nEdokdwuBKD0D3bJEBBefDlHgfXoMgvy9Hivc9PBGGNTNpyFPpwF +sWVAkfhoNMJMC5V7LZsze+lftiDtzVoLSPDa9bO4BK7b/MgwCxfOhGsCAQI= +-----END DH PARAMETERS----- diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/em_test_helper.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/em_test_helper.rb new file mode 100644 index 0000000..20a3e59 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/em_test_helper.rb @@ -0,0 +1,154 @@ +require 'em/pure_ruby' if ENV['EM_PURE_RUBY'] +require 'eventmachine' +require 'test/unit' +require 'rbconfig' +require 'socket' + +puts "EM Library Type: #{EM.library_type}" + +class Test::Unit::TestCase + class EMTestTimeout < StandardError ; end + + def setup_timeout(timeout = TIMEOUT_INTERVAL) + EM.schedule { + EM.add_timer(timeout) { + raise EMTestTimeout, "Test was cancelled after #{timeout} seconds." + } + } + end + + def port_in_use?(port, host="127.0.0.1") + s = TCPSocket.new(host, port) + s.close + s + rescue Errno::ECONNREFUSED + false + end + + def next_port + @@port ||= 9000 + begin + @@port += 1 + end while port_in_use?(@@port) + + @@port + end + + # Returns true if the host have a localhost 127.0.0.1 IPv4. + def self.local_ipv4? + return @@has_local_ipv4 if defined?(@@has_local_ipv4) + begin + get_my_ipv4_address "127.0.0.1" + @@has_local_ipv4 = true + rescue + @@has_local_ipv4 = false + end + end + + # Returns true if the host have a public IPv4 and stores it in + # @@public_ipv4. + def self.public_ipv4? + return @@has_public_ipv4 if defined?(@@has_public_ipv4) + begin + @@public_ipv4 = get_my_ipv4_address "1.2.3.4" + @@has_public_ipv4 = true + rescue + @@has_public_ipv4 = false + end + end + + # Returns true if the host have a localhost ::1 IPv6. + def self.local_ipv6? + return @@has_local_ipv6 if defined?(@@has_local_ipv6) + begin + get_my_ipv6_address "::1" + @@has_local_ipv6 = true + rescue + @@has_local_ipv6 = false + end + end + + # Returns true if the host have a public IPv6 and stores it in + # @@public_ipv6. + def self.public_ipv6? + return @@has_public_ipv6 if defined?(@@has_public_ipv6) + begin + @@public_ipv6 = get_my_ipv6_address "2001::1" + @@has_public_ipv6 = true + rescue + @@has_public_ipv6 = false + end + end + + # Returns an array with the localhost addresses (IPv4 and/or IPv6). + def local_ips + return @@local_ips if defined?(@@local_ips) + @@local_ips = [] + @@local_ips << "127.0.0.1" if self.class.local_ipv4? + @@local_ips << "::1" if self.class.local_ipv6? + @@local_ips + end + + def exception_class + jruby? ? NativeException : RuntimeError + end + + module PlatformHelper + # http://blog.emptyway.com/2009/11/03/proper-way-to-detect-windows-platform-in-ruby/ + def windows? + RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ + end + + def solaris? + RUBY_PLATFORM =~ /solaris/ + end + + # http://stackoverflow.com/questions/1342535/how-can-i-tell-if-im-running-from-jruby-vs-ruby/1685970#1685970 + def jruby? + defined? JRUBY_VERSION + end + + def rbx? + defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx' + end + end + + include PlatformHelper + extend PlatformHelper + + # Tests run significantly slower on windows. YMMV + TIMEOUT_INTERVAL = windows? ? 1 : 0.25 + + def silent + backup, $VERBOSE = $VERBOSE, nil + begin + yield + ensure + $VERBOSE = backup + end + end + + + private + + def self.get_my_ipv4_address ip + orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily + UDPSocket.open(Socket::AF_INET) do |s| + s.connect ip, 1 + s.addr.last + end + ensure + Socket.do_not_reverse_lookup = orig + end + + def self.get_my_ipv6_address ip + orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily + UDPSocket.open(Socket::AF_INET6) do |s| + s.connect ip, 1 + s.addr.last + end + ensure + Socket.do_not_reverse_lookup = orig + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_attach.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_attach.rb new file mode 100644 index 0000000..4a55017 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_attach.rb @@ -0,0 +1,151 @@ +require 'em_test_helper' +require 'socket' + +class TestAttach < Test::Unit::TestCase + class EchoServer < EM::Connection + def receive_data data + $received_data << data + send_data data + end + end + + class EchoClient < EM::Connection + def initialize socket + self.notify_readable = true + @socket = socket + @socket.write("abc\n") + end + + def notify_readable + $read = @socket.readline + $fd = detach + end + + def unbind + EM.next_tick do + @socket.write("def\n") + EM.add_timer(0.1) { EM.stop } + end + end + end + + def setup + @port = next_port + $read, $r, $w, $fd = nil + $received_data = "" + end + + def teardown + [$r, $w].each do |io| + io.close rescue nil + end + $received_data = nil + end + + def test_attach + socket = nil + + EM.run { + EM.start_server "127.0.0.1", @port, EchoServer + socket = TCPSocket.new "127.0.0.1", @port + EM.watch socket, EchoClient, socket + } + + assert_equal $read, "abc\n" + unless jruby? # jruby filenos are not real + assert_equal $fd, socket.fileno + end + assert_equal false, socket.closed? + assert_equal socket.readline, "def\n" + end + + module PipeWatch + def notify_readable + $read = $r.readline + EM.stop + end + end + + def test_attach_server + omit_if(jruby?) + $before = TCPServer.new("127.0.0.1", @port) + sig = nil + EM.run { + sig = EM.attach_server $before, EchoServer + + handler = Class.new(EM::Connection) do + def initialize + send_data "hello world" + close_connection_after_writing + EM.add_timer(0.1) { EM.stop } + end + end + EM.connect("127.0.0.1", @port, handler) + } + + assert_equal false, $before.closed? + assert_equal "hello world", $received_data + assert sig.is_a?(Integer) + end + + def test_attach_pipe + EM.run{ + $r, $w = IO.pipe + EM.watch $r, PipeWatch do |c| + c.notify_readable = true + end + $w.write("ghi\n") + } + + assert_equal $read, "ghi\n" + end + + def test_set_readable + before, after = nil + + EM.run{ + $r, $w = IO.pipe + c = EM.watch $r, PipeWatch do |con| + con.notify_readable = false + end + + EM.next_tick{ + before = c.notify_readable? + c.notify_readable = true + after = c.notify_readable? + } + + $w.write("jkl\n") + } + + assert !before + assert after + assert_equal $read, "jkl\n" + end + + def test_read_write_pipe + result = nil + + pipe_reader = Module.new do + define_method :receive_data do |data| + result = data + EM.stop + end + end + + r,w = IO.pipe + + EM.run { + EM.attach r, pipe_reader + writer = EM.attach(w) + writer.send_data 'ghi' + + # XXX: Process will hang in Windows without this line + writer.close_connection_after_writing + } + + assert_equal "ghi", result + ensure + [r,w].each {|io| io.close rescue nil } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_basic.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_basic.rb new file mode 100644 index 0000000..b8f6258 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_basic.rb @@ -0,0 +1,315 @@ +require 'em_test_helper' +require 'socket' + +class TestBasic < Test::Unit::TestCase + def setup + @port = next_port + end + + def test_connection_class_cache + mod = Module.new + a, b = nil, nil + EM.run { + EM.start_server '127.0.0.1', @port, mod + a = EM.connect '127.0.0.1', @port, mod + b = EM.connect '127.0.0.1', @port, mod + EM.stop + } + assert_equal a.class, b.class + assert_kind_of EM::Connection, a + end + + #------------------------------------- + + + def test_em + assert_nothing_raised do + EM.run { + setup_timeout + EM.add_timer 0 do + EM.stop + end + } + end + end + + #------------------------------------- + + def test_timer + assert_nothing_raised do + EM.run { + setup_timeout + n = 0 + EM.add_periodic_timer(0.1) { + n += 1 + EM.stop if n == 2 + } + } + end + end + + #------------------------------------- + + # This test once threw an already-running exception. + module Trivial + def post_init + EM.stop + end + end + + def test_server + assert_nothing_raised do + EM.run { + setup_timeout + EM.start_server "127.0.0.1", @port, Trivial + EM.connect "127.0.0.1", @port + } + end + end + + #-------------------------------------- + + # EM#run_block starts the reactor loop, runs the supplied block, and then STOPS + # the loop automatically. Contrast with EM#run, which keeps running the reactor + # even after the supplied block completes. + def test_run_block + assert !EM.reactor_running? + a = nil + EM.run_block { a = "Worked" } + assert a + assert !EM.reactor_running? + end + + class UnbindError < EM::Connection + ERR = Class.new(StandardError) + def initialize *args + super + end + def connection_completed + close_connection_after_writing + end + def unbind + raise ERR + end + end + + def test_unbind_error_during_stop + assert_raises( UnbindError::ERR ) { + EM.run { + EM.start_server "127.0.0.1", @port + EM.connect "127.0.0.1", @port, UnbindError do + EM.stop + end + } + } + end + + def test_unbind_error + EM.run { + EM.error_handler do |e| + assert(e.is_a?(UnbindError::ERR)) + EM.stop + end + EM.start_server "127.0.0.1", @port + EM.connect "127.0.0.1", @port, UnbindError + } + end + + module BrsTestSrv + def receive_data data + $received << data + end + def unbind + EM.stop + end + end + module BrsTestCli + def post_init + send_data $sent + close_connection_after_writing + end + end + + # From ticket #50 + def test_byte_range_send + $received = '' + $sent = (0..255).to_a.pack('C*') + EM::run { + EM::start_server "127.0.0.1", @port, BrsTestSrv + EM::connect "127.0.0.1", @port, BrsTestCli + + setup_timeout + } + assert_equal($sent, $received) + end + + def test_bind_connect + pend('FIXME: this test is broken on Windows') if windows? + + local_ip = UDPSocket.open {|s| s.connect('localhost', 80); s.addr.last } + + bind_port = next_port + + port, ip = nil + bound_server = Module.new do + define_method :post_init do + begin + port, ip = Socket.unpack_sockaddr_in(get_peername) + ensure + EM.stop + end + end + end + + EM.run do + setup_timeout + EM.start_server "127.0.0.1", @port, bound_server + EM.bind_connect local_ip, bind_port, "127.0.0.1", @port + end + + assert_equal bind_port, port + assert_equal local_ip, ip + end + + def test_invalid_address_bind_connect_dst + e = nil + EM.run do + begin + EM.bind_connect('localhost', nil, 'invalid.invalid', 80) + rescue Exception => e + # capture the exception + ensure + EM.stop + end + end + + assert_kind_of(EventMachine::ConnectionError, e) + assert_match(/unable to resolve address:.*not known/, e.message) + end + + def test_invalid_address_bind_connect_src + e = nil + EM.run do + begin + EM.bind_connect('invalid.invalid', nil, 'localhost', 80) + rescue Exception => e + # capture the exception + ensure + EM.stop + end + end + + assert_kind_of(EventMachine::ConnectionError, e) + assert_match(/invalid bind address:.*not known/, e.message) + end + + def test_reactor_thread? + assert !EM.reactor_thread? + EM.run { assert EM.reactor_thread?; EM.stop } + assert !EM.reactor_thread? + end + + def test_schedule_on_reactor_thread + x = false + EM.run do + EM.schedule { x = true } + EM.stop + end + assert x + end + + def test_schedule_from_thread + x = false + EM.run do + Thread.new { EM.schedule { x = true; EM.stop } }.join + end + assert x + end + + def test_set_heartbeat_interval + omit_if(jruby?) + interval = 0.5 + EM.run { + EM.set_heartbeat_interval interval + $interval = EM.get_heartbeat_interval + EM.stop + } + assert_equal(interval, $interval) + end + + module PostInitRaiser + ERR = Class.new(StandardError) + def post_init + raise ERR + end + end + + def test_bubble_errors_from_post_init + assert_raises(PostInitRaiser::ERR) do + EM.run do + EM.start_server "127.0.0.1", @port + EM.connect "127.0.0.1", @port, PostInitRaiser + end + end + end + + module InitializeRaiser + ERR = Class.new(StandardError) + def initialize + raise ERR + end + end + + def test_bubble_errors_from_initialize + assert_raises(InitializeRaiser::ERR) do + EM.run do + EM.start_server "127.0.0.1", @port + EM.connect "127.0.0.1", @port, InitializeRaiser + end + end + end + + def test_schedule_close + omit_if(jruby?) + localhost, port = '127.0.0.1', 9000 + timer_ran = false + num_close_scheduled = nil + EM.run do + assert_equal 0, EM.num_close_scheduled + EM.add_timer(1) { timer_ran = true; EM.stop } + EM.start_server localhost, port do |s| + s.close_connection + num_close_scheduled = EM.num_close_scheduled + end + EM.connect localhost, port do |c| + def c.unbind + EM.stop + end + end + end + assert !timer_ran + assert_equal 1, num_close_scheduled + end + + def test_error_handler_idempotent # issue 185 + errors = [] + ticks = [] + EM.error_handler do |e| + errors << e + end + + EM.run do + EM.next_tick do + ticks << :first + raise + end + EM.next_tick do + ticks << :second + end + EM.add_timer(0.001) { EM.stop } + end + + assert_equal 1, errors.size + assert_equal [:first, :second], ticks + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_channel.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_channel.rb new file mode 100644 index 0000000..c54bf1d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_channel.rb @@ -0,0 +1,75 @@ +require 'em_test_helper' + +class TestEMChannel < Test::Unit::TestCase + def test_channel_subscribe + s = 0 + EM.run do + c = EM::Channel.new + c.subscribe { |v| s = v; EM.stop } + c << 1 + end + assert_equal 1, s + end + + def test_channel_unsubscribe + s = 0 + EM.run do + c = EM::Channel.new + subscription = c.subscribe { |v| s = v } + c.unsubscribe(subscription) + c << 1 + EM.next_tick { EM.stop } + end + assert_not_equal 1, s + end + + def test_channel_pop + s = 0 + EM.run do + c = EM::Channel.new + c.pop{ |v| s = v } + c.push(1,2,3) + c << 4 + c << 5 + EM.next_tick { EM.stop } + end + assert_equal 1, s + end + + def test_channel_reactor_thread_push + out = [] + c = EM::Channel.new + c.subscribe { |v| out << v } + Thread.new { c.push(1,2,3) }.join + assert out.empty? + + EM.run { EM.next_tick { EM.stop } } + + assert_equal [1,2,3], out + end + + def test_channel_reactor_thread_callback + out = [] + c = EM::Channel.new + Thread.new { c.subscribe { |v| out << v } }.join + c.push(1,2,3) + assert out.empty? + + EM.run { EM.next_tick { EM.stop } } + + assert_equal [1,2,3], out + end + + def test_channel_num_subscribers + subs = 0 + EM.run do + c = EM::Channel.new + c.subscribe { |v| s = v } + c.subscribe { |v| s = v } + EM.next_tick { EM.stop } + subs = c.num_subscribers + end + + assert_equal subs, 2 + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_completion.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_completion.rb new file mode 100644 index 0000000..1bd9a8f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_completion.rb @@ -0,0 +1,178 @@ +require 'em_test_helper' +require 'em/completion' + +class TestCompletion < Test::Unit::TestCase + def completion + @completion ||= EM::Completion.new + end + + def crank + # This is a slow solution, but this just executes the next tick queue + # once. It's the easiest way for now. + EM.run { EM.stop } + end + + def results + @results ||= [] + end + + def test_state + assert_equal :unknown, completion.state + end + + def test_succeed + completion.callback { |val| results << val } + completion.succeed :object + crank + assert_equal :succeeded, completion.state + assert_equal [:object], results + end + + def test_fail + completion.errback { |val| results << val } + completion.fail :object + crank + assert_equal :failed, completion.state + assert_equal [:object], results + end + + def test_callback + completion.callback { results << :callback } + completion.errback { results << :errback } + completion.succeed + crank + assert_equal [:callback], results + end + + def test_errback + completion.callback { results << :callback } + completion.errback { results << :errback } + completion.fail + crank + assert_equal [:errback], results + end + + def test_stateback + completion.stateback(:magic) { results << :stateback } + completion.change_state(:magic) + crank + assert_equal [:stateback], results + end + + def test_does_not_enqueue_when_completed + completion.callback { results << :callback } + completion.succeed + completion.errback { results << :errback } + completion.fail + crank + assert_equal [:callback], results + end + + def test_completed + assert_equal false, completion.completed? + completion.succeed + assert_equal true, completion.completed? + completion.fail + assert_equal true, completion.completed? + completion.change_state :magic + assert_equal false, completion.completed? + end + + def test_recursive_callbacks + completion.callback do |val| + results << val + completion.succeed :two + end + completion.callback do |val| + results << val + completion.succeed :three + end + completion.callback do |val| + results << val + end + completion.succeed :one + crank + assert_equal [:one, :two, :three], results + end + + def test_late_defined_callbacks + completion.callback { results << :one } + completion.succeed + crank + assert_equal [:one], results + completion.callback { results << :two } + crank + assert_equal [:one, :two], results + end + + def test_cleared_completions + completion.callback { results << :callback } + completion.errback { results << :errback } + + completion.succeed + crank + completion.fail + crank + completion.succeed + crank + + assert_equal [:callback], results + end + + def test_skip_completed_callbacks + completion.callback { results << :callback } + completion.succeed + crank + + completion.errback { results << :errback } + completion.fail + crank + + assert_equal [:callback], results + end + + def test_completions + completion.completion { results << :completion } + completion.succeed + crank + assert_equal [:completion], results + + completion.change_state(:unknown) + results.clear + + completion.completion { results << :completion } + completion.fail + crank + assert_equal [:completion], results + end + + def test_latent_completion + completion.completion { results << :completion } + completion.succeed + crank + completion.completion { results << :completion } + crank + assert_equal [:completion, :completion], results + end + + def test_timeout + args = [1, 2, 3] + EM.run do + completion.timeout(0.0001, *args) + completion.errback { |*errargs| results << errargs } + completion.completion { EM.stop } + EM.add_timer(0.1) { flunk 'test timed out' } + end + assert_equal [[1,2,3]], results + end + + def test_timeout_gets_cancelled + EM.run do + completion.timeout(0.0001, :timeout) + completion.errback { results << :errback } + completion.succeed + EM.add_timer(0.0002) { EM.stop } + end + assert_equal [], results + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_connection_count.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_connection_count.rb new file mode 100644 index 0000000..350c417 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_connection_count.rb @@ -0,0 +1,83 @@ +require 'em_test_helper' + +class TestConnectionCount < Test::Unit::TestCase + def teardown + EM.epoll = false + EM.kqueue = false + end + + def test_idle_connection_count + count = nil + EM.run { + count = EM.connection_count + EM.stop_event_loop + } + assert_equal(0, count) + end + + # Run this again with epoll enabled (if available) + def test_idle_connection_count_epoll + EM.epoll if EM.epoll? + + count = nil + EM.run { + count = EM.connection_count + EM.stop_event_loop + } + assert_equal(0, count) + end + + # Run this again with kqueue enabled (if available) + def test_idle_connection_count_kqueue + EM.kqueue if EM.kqueue? + + count = nil + EM.run { + count = EM.connection_count + EM.stop_event_loop + } + assert_equal(0, count) + end + + module Client + def connection_completed + $client_conns += 1 + EM.stop if $client_conns == 3 + end + end + + def test_with_some_connections + EM.run { + $client_conns = 0 + $initial_conns = EM.connection_count + EM.start_server("127.0.0.1", 9999) + $server_conns = EM.connection_count + 3.times { EM.connect("127.0.0.1", 9999, Client) } + } + + assert_equal(0, $initial_conns) + assert_equal(1, $server_conns) + assert_equal(4, $client_conns + $server_conns) + end + + module DoubleCloseClient + def unbind + close_connection + $num_close_scheduled_1 = EM.num_close_scheduled + EM.next_tick do + $num_close_scheduled_2 = EM.num_close_scheduled + EM.stop + end + end + end + + def test_num_close_scheduled + omit_if(jruby?) + EM.run { + assert_equal(0, EM.num_close_scheduled) + EM.connect("127.0.0.1", 9999, DoubleCloseClient) # nothing listening on 9999 + } + assert_equal(1, $num_close_scheduled_1) + assert_equal(0, $num_close_scheduled_2) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_connection_write.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_connection_write.rb new file mode 100644 index 0000000..35533b5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_connection_write.rb @@ -0,0 +1,35 @@ +require 'em_test_helper' + +class TestConnectionWrite < Test::Unit::TestCase + + # This test takes advantage of the fact that EM::_RunSelectOnce iterates over the connections twice: + # - once to determine which ones to call Write() on + # - and once to call Write() on each of them. + # + # But state may change in the meantime before Write() is finally called. + # And that is what we try to exploit to get Write() to be called when bWatchOnly is true, and bNotifyWritable is false, + # to cause an assertion failure. + + module SimpleClient + def notify_writable + $conn2.notify_writable = false # Being naughty in callback + # If this doesn't crash anything, the test passed! + end + end + + def test_with_naughty_callback + EM.run do + r1, _ = IO.pipe + r2, _ = IO.pipe + + # Adding EM.watches + $conn1 = EM.watch(r1, SimpleClient) + $conn2 = EM.watch(r2, SimpleClient) + + $conn1.notify_writable = true + $conn2.notify_writable = true + + EM.stop + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_defer.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_defer.rb new file mode 100644 index 0000000..aeca127 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_defer.rb @@ -0,0 +1,35 @@ +require 'em_test_helper' + +class TestDefer < Test::Unit::TestCase + + def test_defers + n = 0 + n_times = 20 + EM.run { + n_times.times { + work_proc = proc { n += 1 } + callback = proc { EM.stop if n == n_times } + EM.defer work_proc, callback + } + } + assert_equal( n, n_times ) + end + + def test_errbacks + iterations = 20 + callback_parameter = rand(100) + callback_parameters = [] + callback_op = proc { callback_parameter } + callback = proc { |result| callback_parameters << result } + errback_parameter = Exception.new + errback_parameters = [] + errback_op = proc { raise errback_parameter } + errback = proc { |error| errback_parameters << error } + EventMachine.run do + (1..iterations).each { |index| EventMachine.defer(index.even? ? callback_op : errback_op, callback, errback) } + EventMachine.add_periodic_timer(0.1) { EventMachine.stop if EventMachine.defers_finished? } + end + assert_equal(callback_parameters.select { |parameter| parameter == callback_parameter }.length, iterations * 0.5) + assert_equal(errback_parameters.select{ |parameter| parameter == errback_parameter }.length, iterations * 0.5) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_deferrable.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_deferrable.rb new file mode 100644 index 0000000..5f286a7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_deferrable.rb @@ -0,0 +1,35 @@ +require 'em_test_helper' + +class TestDeferrable < Test::Unit::TestCase + class Later + include EM::Deferrable + end + + def test_timeout_without_args + assert_nothing_raised do + EM.run { + df = Later.new + df.timeout(0) + df.errback { EM.stop } + EM.add_timer(0.01) { flunk "Deferrable was not timed out." } + } + end + end + + def test_timeout_with_args + args = nil + + EM.run { + df = Later.new + df.timeout(0, :timeout, :foo) + df.errback do |type, name| + args = [type, name] + EM.stop + end + + EM.add_timer(0.01) { flunk "Deferrable was not timed out." } + } + + assert_equal [:timeout, :foo], args + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_epoll.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_epoll.rb new file mode 100644 index 0000000..36f5609 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_epoll.rb @@ -0,0 +1,142 @@ +require 'em_test_helper' + + +class TestEpoll < Test::Unit::TestCase + + module TestEchoServer + def receive_data data + send_data data + close_connection_after_writing + end + end + + module TestEchoClient + def connection_completed + send_data "ABCDE" + $max += 1 + end + def receive_data data + raise "bad response" unless data == "ABCDE" + end + def unbind + $n -= 1 + EM.stop if $n == 0 + end + end + + + # We can set the rlimit/nofile of a process but we can only set it + # higher if we're running as root. + # On most systems, the default value is 1024. + def test_rlimit + omit_if(windows? || jruby?) + unless EM.set_descriptor_table_size >= 1024 + a = EM.set_descriptor_table_size + assert( a <= 1024 ) + a = EM.set_descriptor_table_size( 1024 ) + assert( a == 1024 ) + end + end + + # Run a high-volume version of this test by kicking the number of connections + # up past 512. (Each connection uses two sockets, a client and a server.) + # (Will require running the test as root) + # This test exercises TCP clients and servers. + # + # XXX this test causes all sort of weird issues on OSX (when run as part of the suite) + def _test_descriptors + EM.epoll + EM.set_descriptor_table_size 60000 + EM.run { + EM.start_server "127.0.0.1", 9800, TestEchoServer + $n = 0 + $max = 0 + 100.times { + EM.connect("127.0.0.1", 9800, TestEchoClient) {$n += 1} + } + } + assert_equal(0, $n) + assert_equal(100, $max) + end + + def setup + @port = next_port + end + + module TestDatagramServer + def receive_data dgm + $in = dgm + send_data "abcdefghij" + end + end + module TestDatagramClient + def initialize port + @port = port + end + + def post_init + send_datagram "1234567890", "127.0.0.1", @port + end + + def receive_data dgm + $out = dgm + EM.stop + end + end + + def test_datagrams + $in = $out = "" + EM.run { + EM.open_datagram_socket "127.0.0.1", @port, TestDatagramServer + EM.open_datagram_socket "127.0.0.1", 0, TestDatagramClient, @port + } + assert_equal( "1234567890", $in ) + assert_equal( "abcdefghij", $out ) + end + + # XXX this test fails randomly... + def _test_unix_domain + fn = "/tmp/xxx.chain" + EM.epoll + EM.set_descriptor_table_size 60000 + EM.run { + # The pure-Ruby version won't let us open the socket if the node already exists. + # Not sure, that actually may be correct and the compiled version is wrong. + # Pure Ruby also oddly won't let us make that many connections. This test used + # to run 100 times. Not sure where that lower connection-limit is coming from in + # pure Ruby. + # Let's not sweat the Unix-ness of the filename, since this test can't possibly + # work on Windows anyway. + # + File.unlink(fn) if File.exist?(fn) + EM.start_unix_domain_server fn, TestEchoServer + $n = 0 + $max = 0 + 50.times { + EM.connect_unix_domain(fn, TestEchoClient) {$n += 1} + } + EM::add_timer(1) { $stderr.puts("test_unix_domain timed out!"); EM::stop } + } + assert_equal(0, $n) + assert_equal(50, $max) + ensure + File.unlink(fn) if File.exist?(fn) + end + + def test_attach_detach + EM.epoll + EM.run { + EM.add_timer(0.01) { EM.stop } + + r, _ = IO.pipe + + # This tests a regression where detach in the same tick as attach crashes EM + EM.watch(r) do |connection| + connection.detach + end + } + + assert true + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_error_handler.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_error_handler.rb new file mode 100644 index 0000000..23c23f7 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_error_handler.rb @@ -0,0 +1,38 @@ +require 'em_test_helper' + +class TestErrorHandler < Test::Unit::TestCase + def setup + @exception = Class.new(StandardError) + end + + def test_error_handler + error = nil + + EM.error_handler{ |e| + error = e + EM.error_handler(nil) + EM.stop + } + + assert_nothing_raised do + EM.run{ + EM.add_timer(0){ + raise @exception, 'test' + } + } + end + + assert_equal error.class, @exception + assert_equal error.message, 'test' + end + + def test_without_error_handler + assert_raise @exception do + EM.run{ + EM.add_timer(0){ + raise @exception, 'test' + } + } + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_exc.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_exc.rb new file mode 100644 index 0000000..d9c860a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_exc.rb @@ -0,0 +1,43 @@ +require 'em_test_helper' + +class TestSomeExceptions < Test::Unit::TestCase + class DoomedConnectionError < StandardError + end + class DoomedConnection < EventMachine::Connection + def unbind + raise DoomedConnectionError + end + end + + # Read the commentary in EM#run. + # This test exercises the ensure block in #run that makes sure + # EM#release_machine gets called even if an exception is + # thrown within the user code. Without the ensured call to release_machine, + # the second call to EM#run will fail with a C++ exception + # because the machine wasn't cleaned up properly. + + def test_a + assert_raises(RuntimeError) { + EM.run { + raise "some exception" + } + } + end + + def test_b + assert_raises(RuntimeError) { + EM.run { + raise "some exception" + } + } + end + + def test_exception_on_unbind + assert_raises(DoomedConnectionError) { + EM.run { + EM.connect("localhost", 8888, DoomedConnection) + } + } + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_file_watch.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_file_watch.rb new file mode 100644 index 0000000..5602071 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_file_watch.rb @@ -0,0 +1,85 @@ +require 'em_test_helper' +require 'tempfile' + +class TestFileWatch < Test::Unit::TestCase + if windows? + def test_watch_file_raises_unsupported_error + assert_raises(EM::Unsupported) do + EM.run do + file = Tempfile.new("fake_file") + EM.watch_file(file.path) + end + end + end + elsif EM.respond_to? :watch_filename + module FileWatcher + def file_modified + $modified = true + end + def file_deleted + $deleted = true + end + def unbind + $unbind = true + EM.stop + end + end + + def setup + EM.kqueue = true if EM.kqueue? + end + + def teardown + EM.kqueue = false if EM.kqueue? + end + + def test_events + omit_if(solaris?) + EM.run{ + file = Tempfile.new('em-watch') + $tmp_path = file.path + + # watch it + watch = EM.watch_file(file.path, FileWatcher) + $path = watch.path + + # modify it + File.open(file.path, 'w'){ |f| f.puts 'hi' } + + # delete it + EM.add_timer(0.01){ file.close; file.delete } + } + + assert_equal($path, $tmp_path) + assert($modified) + assert($deleted) + assert($unbind) + end + + # Refer: https://github.com/eventmachine/eventmachine/issues/512 + def test_invalid_signature + # This works fine with kqueue, only fails with linux inotify. + omit_if(EM.kqueue?) + + EM.run { + file = Tempfile.new('foo') + + w1 = EventMachine.watch_file(file.path) + w2 = EventMachine.watch_file(file.path) + + assert_raise EventMachine::InvalidSignature do + w2.stop_watching + end + + EM.stop + } + end + else + warn "EM.watch_file not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_watch_file_unsupported + assert true + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_fork.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_fork.rb new file mode 100644 index 0000000..8b15bb5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_fork.rb @@ -0,0 +1,75 @@ +require 'em_test_helper' + +class TestFork < Test::Unit::TestCase + + def test_fork_safe + omit_if(jruby?) + omit_if(windows?) + + fork_pid = nil + read, write = IO.pipe + EM.run do + fork_pid = fork do + write.puts "forked" + EM.run do + EM.next_tick do + write.puts "EM ran" + EM.stop + end + end + end + EM.stop + end + + sleep 0.1 + begin + Timeout::timeout 1 do + assert_equal "forked\n", read.readline + assert_equal "EM ran\n", read.readline + end + rescue Timeout::Error + Process.kill 'TERM', fork_pid + flunk "Timeout waiting for next_tick in new fork reactor" + end + ensure + read.close rescue nil + write.close rescue nil + end + + def test_fork_reactor + omit_if(jruby?) + omit_if(windows?) + + fork_pid = nil + read, write = IO.pipe + EM.run do + EM.defer do + write.puts Process.pid + EM.defer do + EM.stop + end + end + fork_pid = EM.fork_reactor do + EM.defer do + write.puts Process.pid + EM.stop + end + end + end + + sleep 0.1 + begin + Timeout::timeout 1 do + assert_equal Process.pid.to_s, read.readline.chomp + assert_equal fork_pid.to_s, read.readline.chomp + end + rescue Timeout::Error + Process.kill 'TERM', fork_pid + flunk "Timeout waiting for deferred block in fork_reactor" + end + ensure + read.close rescue nil + write.close rescue nil + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_futures.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_futures.rb new file mode 100644 index 0000000..b494856 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_futures.rb @@ -0,0 +1,170 @@ +require 'em_test_helper' + +class TestFutures < Test::Unit::TestCase + + def setup + end + + def teardown + end + + def test_future + assert_equal(100, EM::Deferrable.future(100) ) + + p1 = proc { 100 + 1 } + assert_equal(101, EM::Deferrable.future(p1) ) + end + + class MyFuture + include EM::Deferrable + def initialize *args + super + set_deferred_status :succeeded, 40 + end + end + + class MyErrorFuture + include EM::Deferrable + def initialize *args + super + set_deferred_status :failed, 41 + end + end + + + def test_future_1 + # Call future with one additional argument and it will be treated as a callback. + def my_future + MyFuture.new + end + + value = nil + EM::Deferrable.future my_future, proc {|v| value=v} + assert_equal( 40, value ) + end + + + def test_future_2 + # Call future with two additional arguments and they will be treated as a callback + # and an errback. + value = nil + EM::Deferrable.future MyErrorFuture.new, nil, proc {|v| value=v} + assert_equal( 41, value ) + end + + + def test_future_3 + # Call future with no additional arguments but with a block, and the block will be + # treated as a callback. + value = nil + EM::Deferrable.future MyFuture.new do |v| + value=v + end + assert_equal( 40, value ) + end + + + class RecursiveCallback + include EM::Deferrable + end + + # A Deferrable callback can call #set_deferred_status to change the values + # passed to subsequent callbacks. + # + def test_recursive_callbacks + n = 0 # counter assures that all the tests actually run. + rc = RecursiveCallback.new + rc.callback {|a| + assert_equal(100, a) + n += 1 + rc.set_deferred_status :succeeded, 101, 101 + } + rc.callback {|a,b| + assert_equal(101, a) + assert_equal(101, b) + n += 1 + rc.set_deferred_status :succeeded, 102, 102, 102 + } + rc.callback {|a,b,c| + assert_equal(102, a) + assert_equal(102, b) + assert_equal(102, c) + n += 1 + } + rc.set_deferred_status :succeeded, 100 + assert_equal(3, n) + end + + def test_syntactic_sugar + rc = RecursiveCallback.new + rc.set_deferred_success 100 + rc.set_deferred_failure 200 + end + + # It doesn't raise an error to set deferred status more than once. + # In fact, this is a desired and useful idiom when it happens INSIDE + # a callback or errback. + # However, it's less useful otherwise, and in fact would generally be + # indicative of a programming error. However, we would like to be resistant + # to such errors. So whenever we set deferred status, we also clear BOTH + # stacks of handlers. + # + def test_double_calls + s = 0 + e = 0 + + d = EM::DefaultDeferrable.new + d.callback {s += 1} + d.errback {e += 1} + + d.succeed # We expect the callback to be called, and the errback to be DISCARDED. + d.fail # Presumably an error. We expect the errback NOT to be called. + d.succeed # We expect the callback to have been discarded and NOT to be called again. + + assert_equal(1, s) + assert_equal(0, e) + end + + # Adding a callback to a Deferrable that is already in a success state executes the callback + # immediately. The same applies to a an errback added to an already-failed Deferrable. + # HOWEVER, we expect NOT to be able to add errbacks to succeeded Deferrables, or callbacks + # to failed ones. + # + # We illustrate this with a rather contrived test. The test calls #fail after #succeed, + # which ordinarily would not happen in a real program. + # + # What we're NOT attempting to specify is what happens if a Deferrable is succeeded and then + # failed (or vice-versa). Should we then be able to add callbacks/errbacks of the appropriate + # type for immediate execution? For now at least, the official answer is "don't do that." + # + def test_delayed_callbacks + s1 = 0 + s2 = 0 + e = 0 + + d = EM::DefaultDeferrable.new + d.callback {s1 += 1} + + d.succeed # Triggers and discards the callback. + + d.callback {s2 += 1} # This callback is executed immediately and discarded. + + d.errback {e += 1} # This errback should be DISCARDED and never execute. + d.fail # To prove it, fail and assert e is 0 + + assert_equal( [1,1], [s1,s2] ) + assert_equal( 0, e ) + end + + def test_timeout + n = 0 + EM.run { + d = EM::DefaultDeferrable.new + d.callback {n = 1; EM.stop} + d.errback {n = 2; EM.stop} + d.timeout(0.01) + } + assert_equal( 2, n ) + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_handler_check.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_handler_check.rb new file mode 100644 index 0000000..c417694 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_handler_check.rb @@ -0,0 +1,35 @@ +require 'em_test_helper' + +class TestHandlerCheck < Test::Unit::TestCase + + class Foo < EM::Connection; end; + module TestModule; end; + + def test_with_correct_class + assert_nothing_raised do + EM.run { + EM.connect("127.0.0.1", 80, Foo) + EM.stop_event_loop + } + end + end + + def test_with_incorrect_class + assert_raise(ArgumentError) do + EM.run { + EM.connect("127.0.0.1", 80, String) + EM.stop_event_loop + } + end + end + + def test_with_module + assert_nothing_raised do + EM.run { + EM.connect("127.0.0.1", 80, TestModule) + EM.stop_event_loop + } + end + end + +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_hc.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_hc.rb new file mode 100644 index 0000000..28e32c9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_hc.rb @@ -0,0 +1,155 @@ +require 'em_test_helper' + +class TestHeaderAndContentProtocol < Test::Unit::TestCase + + class SimpleTest < EM::P::HeaderAndContentProtocol + attr_reader :first_header, :my_headers, :request + + def receive_first_header_line hdr + @first_header ||= [] + @first_header << hdr + end + def receive_headers hdrs + @my_headers ||= [] + @my_headers << hdrs + end + def receive_request hdrs, content + @request ||= [] + @request << [hdrs, content] + end + end + + class StopOnUnbind < EM::Connection + def unbind + EM.add_timer(0.01) { EM.stop } + end + end + + def setup + @port = next_port + end + + def test_no_content + the_connection = nil + EM.run { + EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| + the_connection = conn + end + setup_timeout + + EM.connect "127.0.0.1", @port, StopOnUnbind do |c| + c.send_data [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join + c.close_connection_after_writing + end + } + assert_equal( ["aaa"], the_connection.first_header ) + assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers ) + assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request ) + end + + def test_content + the_connection = nil + content = "A" * 50 + headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"] + EM.run { + EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| + the_connection = conn + end + setup_timeout + + EM.connect "127.0.0.1", @port, StopOnUnbind do |c| + headers.each { |h| c.send_data "#{h}\r\n" } + c.send_data "\n" + c.send_data content + c.close_connection_after_writing + end + } + assert_equal( ["aaa"], the_connection.first_header ) + assert_equal( [headers], the_connection.my_headers ) + assert_equal( [[headers, content]], the_connection.request ) + end + + def test_several_requests + the_connection = nil + content = "A" * 50 + headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"] + EM.run { + EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| + the_connection = conn + end + setup_timeout + + EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c| + 5.times do + headers.each { |h| c.send_data "#{h}\r\n" } + c.send_data "\n" + c.send_data content + end + c.close_connection_after_writing + end + } + assert_equal( ["aaa"] * 5, the_connection.first_header ) + assert_equal( [headers] * 5, the_connection.my_headers ) + assert_equal( [[headers, content]] * 5, the_connection.request ) + end + + + # def x_test_multiple_content_length_headers + # # This is supposed to throw a RuntimeError but it throws a C++ exception instead. + # the_connection = nil + # content = "A" * 50 + # headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten + # EM.run { + # EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| + # the_connection = conn + # end + # EM.add_timer(4) {raise "test timed out"} + # test_proc = proc { + # t = TCPSocket.new "127.0.0.1", @port + # headers.each {|h| t.write "#{h}\r\n" } + # t.write "\n" + # t.write content + # t.close + # } + # EM.defer test_proc, proc { + # EM.stop + # } + # } + # end + + def test_interpret_headers + the_connection = nil + content = "A" * 50 + headers = [ + "GET / HTTP/1.0", + "Accept: aaa", + "User-Agent: bbb", + "Host: ccc", + "x-tempest-header:ddd" + ] + + EM.run { + EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| + the_connection = conn + end + setup_timeout + + EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c| + headers.each { |h| c.send_data "#{h}\r\n" } + c.send_data "\n" + c.send_data content + c.close_connection_after_writing + end + } + + hsh = the_connection.headers_2_hash( the_connection.my_headers.shift ) + expect = { + :accept => "aaa", + :user_agent => "bbb", + :host => "ccc", + :x_tempest_header => "ddd" + } + assert_equal(expect, hsh) + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_httpclient.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_httpclient.rb new file mode 100644 index 0000000..572a802 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_httpclient.rb @@ -0,0 +1,238 @@ +require 'em_test_helper' + +class TestHttpClient < Test::Unit::TestCase + + def setup + @port = next_port + end + + #------------------------------------- + + def test_http_client + ok = false + EM.run { + c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 } + c.callback { + ok = true + c.close_connection + EM.stop + } + c.errback {EM.stop} # necessary, otherwise a failure blocks the test suite forever. + } + assert ok + end + + #------------------------------------- + + def test_http_client_1 + ok = false + EM.run { + c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 } + c.callback { + ok = true + c.close_connection + EM.stop + } + c.errback {EM.stop} + } + assert ok + end + + #------------------------------------- + + def test_http_client_2 + ok = false + EM.run { + c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 } + c.callback { + ok = true + c.close_connection + EM.stop + } + c.errback {EM.stop} + } + assert ok + end + + + #----------------------------------------- + + # Test a server that returns a page with a zero content-length. + # This caused an early version of the HTTP client not to generate a response, + # causing this test to hang. Observe, there was no problem with responses + # lacking a content-length, just when the content-length was zero. + # + class EmptyContent < EM::Connection + def initialize *args + super + end + def receive_data data + send_data "HTTP/1.0 404 ...\r\nContent-length: 0\r\n\r\n" + close_connection_after_writing + end + end + + def test_http_empty_content + ok = false + EM.run { + EM.start_server "127.0.0.1", @port, EmptyContent + c = silent { EM::P::HttpClient.send :request, :host => "127.0.0.1", :port => @port } + c.callback { + ok = true + c.close_connection + EM.stop + } + } + assert ok + end + + + #--------------------------------------- + + class PostContent < EM::P::LineAndTextProtocol + def initialize *args + super + @lines = [] + end + def receive_line line + if line.length > 0 + @lines << line + else + process_headers + end + end + def receive_binary_data data + @post_content = data + send_response + end + def process_headers + if @lines.first =~ /\APOST ([^\s]+) HTTP\/1.1\Z/ + @uri = $1.dup + else + raise "bad request" + end + + @lines.each {|line| + if line =~ /\AContent-length:\s*(\d+)\Z/i + @content_length = $1.dup.to_i + elsif line =~ /\AContent-type:\s*(\d+)\Z/i + @content_type = $1.dup + end + } + + raise "invalid content length" unless @content_length + set_binary_mode @content_length + end + def send_response + send_data "HTTP/1.1 200 ...\r\nConnection: close\r\nContent-length: 10\r\nContent-type: text/html\r\n\r\n0123456789" + close_connection_after_writing + end + end + + # TODO, this is WRONG. The handler is asserting an HTTP 1.1 request, but the client + # is sending a 1.0 request. Gotta fix the client + def test_post + response = nil + EM.run { + EM.start_server '127.0.0.1', @port, PostContent + setup_timeout(2) + c = silent { EM::P::HttpClient.request( + :host => '127.0.0.1', + :port => @port, + :method => :post, + :request => "/aaa", + :content => "XYZ", + :content_type => "text/plain" + )} + c.callback {|r| + response = r + EM.stop + } + } + + assert_equal( 200, response[:status] ) + assert_equal( "0123456789", response[:content] ) + end + + + # TODO, need a more intelligent cookie tester. + # In fact, this whole test-harness needs a beefier server implementation. + def test_cookie + ok = false + EM.run { + c = silent { EM::Protocols::HttpClient.send :request, :host => "www.google.com", :port => 80, :cookie=>"aaa=bbb" } + c.callback { + ok = true + c.close_connection + EM.stop + } + c.errback {EM.stop} + } + assert ok + end + + # We can tell the client to send an HTTP/1.0 request (default is 1.1). + # This is useful for suppressing chunked responses until those are working. + def test_version_1_0 + ok = false + EM.run { + c = silent { EM::P::HttpClient.request( + :host => "www.google.com", + :port => 80, + :version => "1.0" + )} + c.callback { + ok = true + c.close_connection + EM.stop + } + c.errback {EM.stop} + } + assert ok + end + + #----------------------------------------- + + # Test a server that returns chunked encoding + # + class ChunkedEncodingContent < EventMachine::Connection + def initialize *args + super + end + def receive_data data + send_data ["HTTP/1.1 200 OK", + "Server: nginx/0.7.67", + "Date: Sat, 23 Oct 2010 16:41:32 GMT", + "Content-Type: application/json", + "Transfer-Encoding: chunked", + "Connection: keep-alive", + "", + "1800", + "chunk1" * 1024, + "5a", + "chunk2" * 15, + "0", + ""].join("\r\n") + close_connection_after_writing + end + end + + def test_http_chunked_encoding_content + ok = false + EM.run { + EM.start_server "127.0.0.1", @port, ChunkedEncodingContent + c = silent { EM::P::HttpClient.send :request, :host => "127.0.0.1", :port => @port } + c.callback { |result| + if result[:content] == "chunk1" * 1024 + "chunk2" * 15 + ok = true + end + c.close_connection + EM.stop + } + } + assert ok + end + +end + + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_httpclient2.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_httpclient2.rb new file mode 100644 index 0000000..a00fcbc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_httpclient2.rb @@ -0,0 +1,128 @@ +require 'em_test_helper' + +class TestHttpClient2 < Test::Unit::TestCase + class TestServer < EM::Connection + end + + def setup + @port = next_port + end + + # #connect returns an object which has made a connection to an HTTP server + # and exposes methods for making HTTP requests on that connection. + # #connect can take either a pair of parameters (a host and a port), + # or a single parameter which is a Hash. + # + def test_connect + EM.run { + setup_timeout(1) + EM.start_server '127.0.0.1', @port, TestServer + silent do + EM::P::HttpClient2.connect '127.0.0.1', @port + EM::P::HttpClient2.connect( :host=>'127.0.0.1', :port=>@port ) + end + EM.stop + } + end + + def test_bad_port + EM.run { + setup_timeout(1) + EM.start_server '127.0.0.1', @port, TestServer + assert_raises( ArgumentError ) { + silent { EM::P::HttpClient2.connect '127.0.0.1', "xxx" } + } + EM.stop + } + end + + def test_bad_server + err = nil + EM.run { + setup_timeout(1) + http = silent { EM::P::HttpClient2.connect '127.0.0.1', 9999 } + d = http.get "/" + d.errback { err = true; d.internal_error; EM.stop } + } + assert(err) + end + + def test_get + content = nil + EM.run { + setup_timeout(1) + http = silent { EM::P::HttpClient2.connect :host => "google.com", :port => 80, :version => '1.0' } + d = http.get "/" + d.callback { + content = d.content + EM.stop + } + } + assert(content) + end + + # Not a pipelined request because we wait for one response before we request the next. + # XXX this test is broken because it sends the second request to the first connection + # XXX right before the connection closes + def _test_get_multiple + content = nil + EM.run { + setup_timeout(1) + http = silent { EM::P::HttpClient2.connect "google.com", :version => '1.0' } + d = http.get "/" + d.callback { + e = http.get "/" + e.callback { + content = e.content + EM.stop + } + } + } + assert(content) + end + + def test_get_pipeline + headers, headers2 = nil, nil + EM.run { + setup_timeout(1) + http = silent { EM::P::HttpClient2.connect "google.com", 80 } + d = http.get("/") + d.callback { + headers = d.headers + } + e = http.get("/") + e.callback { + headers2 = e.headers + } + EM.tick_loop { EM.stop if headers && headers2 } + EM.add_timer(1) { EM.stop } + } + assert(headers) + assert(headers2) + end + + def test_authheader + EM.run { + setup_timeout(1) + EM.start_server '127.0.0.1', @port, TestServer + http = silent { EM::P::HttpClient2.connect '127.0.0.1', 18842 } + d = http.get :url=>"/", :authorization=>"Basic xxx" + d.callback {EM.stop} + d.errback {EM.stop} + } + end + + def test_https_get + omit_unless(EM.ssl?) + d = nil + EM.run { + setup_timeout(1) + http = silent { EM::P::HttpClient2.connect :host => 'www.google.com', :port => 443, :ssl => true, :version => '1.0' } + d = http.get "/" + d.callback {EM.stop} + d.errback {EM.stop} + } + assert_equal(200, d.status) + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_idle_connection.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_idle_connection.rb new file mode 100644 index 0000000..bfc57cd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_idle_connection.rb @@ -0,0 +1,31 @@ +require 'em_test_helper' + +class TestIdleConnection < Test::Unit::TestCase + def setup + @port = next_port + end + + def test_idle_time + omit_if(!EM.respond_to?(:get_idle_time)) + + a, b = nil, nil + EM.run do + EM.start_server '127.0.0.1', @port, Module.new + conn = EM.connect '127.0.0.1', @port + EM.add_timer(0.3) do + a = conn.get_idle_time + conn.send_data 'a' + EM.next_tick do + EM.next_tick do + b = conn.get_idle_time + conn.close_connection + EM.stop + end + end + end + end + + assert_in_delta 0.3, a, 0.1 + assert_in_delta 0, b, 0.1 + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_inactivity_timeout.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_inactivity_timeout.rb new file mode 100644 index 0000000..15e39a2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_inactivity_timeout.rb @@ -0,0 +1,54 @@ +require 'em_test_helper' + +class TestInactivityTimeout < Test::Unit::TestCase + + if EM.respond_to? :get_comm_inactivity_timeout + def test_default + EM.run { + c = EM.connect("127.0.0.1", 54321) + assert_equal 0.0, c.comm_inactivity_timeout + EM.stop + } + end + + def test_set_and_get + EM.run { + c = EM.connect("127.0.0.1", 54321) + c.comm_inactivity_timeout = 2.5 + assert_equal 2.5, c.comm_inactivity_timeout + EM.stop + } + end + + def test_for_real + start, finish = nil + + timeout_handler = Module.new do + define_method :unbind do + finish = Time.now + EM.stop + end + end + + EM.run { + setup_timeout + EM.heartbeat_interval = 0.01 + EM.start_server("127.0.0.1", 12345) + EM.add_timer(0.01) { + start = Time.now + c = EM.connect("127.0.0.1", 12345, timeout_handler) + c.comm_inactivity_timeout = 0.02 + } + } + + assert_in_delta(0.02, (finish - start), 0.02) + end + else + warn "EM.comm_inactivity_timeout not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_comm_inactivity_timeout_not_implemented + assert true + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ipv4.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ipv4.rb new file mode 100644 index 0000000..bd11bbf --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ipv4.rb @@ -0,0 +1,95 @@ +require 'em_test_helper' + +class TestIPv4 < Test::Unit::TestCase + # Runs a TCP server in the local IPv4 address, connects to it and sends a specific data. + # Timeout in 2 seconds. + def test_ipv4_tcp_local_server + omit_if(!Test::Unit::TestCase.public_ipv4?) + + @@received_data = nil + @local_port = next_port + setup_timeout(2) + + EM.run do + EM::start_server(@@public_ipv4, @local_port) do |s| + def s.receive_data data + @@received_data = data + EM.stop + end + end + + EM::connect(@@public_ipv4, @local_port) do |c| + c.send_data "ipv4/tcp" + end + end + + assert_equal "ipv4/tcp", @@received_data + end + + # Runs a UDP server in the local IPv4 address, connects to it and sends a specific data. + # Timeout in 2 seconds. + def test_ipv4_udp_local_server + omit_if(!Test::Unit::TestCase.public_ipv4?) + + @@received_data = nil + @local_port = next_port + setup_timeout(2) + + EM.run do + EM::open_datagram_socket(@@public_ipv4, @local_port) do |s| + def s.receive_data data + @@received_data = data + EM.stop + end + end + + EM::open_datagram_socket(@@public_ipv4, next_port) do |c| + c.send_datagram "ipv4/udp", @@public_ipv4, @local_port + end + end + + assert_equal "ipv4/udp", @@received_data + end + + # Try to connect via TCP to an invalid IPv4. EM.connect should raise + # EM::ConnectionError. + def test_tcp_connect_to_invalid_ipv4 + omit_if(!Test::Unit::TestCase.public_ipv4?) + + invalid_ipv4 = "9.9:9" + + EM.run do + begin + error = nil + EM.connect(invalid_ipv4, 1234) + rescue => e + error = e + ensure + EM.stop + assert_equal EM::ConnectionError, (error && error.class) + end + end + end + + # Try to send a UDP datagram to an invalid IPv4. EM.send_datagram should raise + # EM::ConnectionError. + def test_udp_send_datagram_to_invalid_ipv4 + omit_if(!Test::Unit::TestCase.public_ipv4?) + + invalid_ipv4 = "9.9:9" + + EM.run do + begin + error = nil + EM.open_datagram_socket(@@public_ipv4, next_port) do |c| + c.send_datagram "hello", invalid_ipv4, 1234 + end + rescue => e + error = e + ensure + EM.stop + assert_equal EM::ConnectionError, (error && error.class) + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ipv6.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ipv6.rb new file mode 100644 index 0000000..b4fff67 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ipv6.rb @@ -0,0 +1,107 @@ +require 'em_test_helper' + +class TestIPv6 < Test::Unit::TestCase + + if Test::Unit::TestCase.public_ipv6? + + # Runs a TCP server in the local IPv6 address, connects to it and sends a specific data. + # Timeout in 2 seconds. + def test_ipv6_tcp_local_server + @@received_data = nil + @local_port = next_port + setup_timeout(2) + + EM.run do + EM.start_server(@@public_ipv6, @local_port) do |s| + def s.receive_data data + @@received_data = data + EM.stop + end + end + + EM::connect(@@public_ipv6, @local_port) do |c| + def c.unbind(reason) + warn "unbind: #{reason.inspect}" if reason # XXX at least find out why it failed + end + c.send_data "ipv6/tcp" + end + end + + assert_equal "ipv6/tcp", @@received_data + end + + # Runs a UDP server in the local IPv6 address, connects to it and sends a specific data. + # Timeout in 2 seconds. + def test_ipv6_udp_local_server + @@received_data = nil + @local_port = next_port + @@remote_ip = nil + setup_timeout(2) + + EM.run do + EM.open_datagram_socket(@@public_ipv6, @local_port) do |s| + def s.receive_data data + _port, @@remote_ip = Socket.unpack_sockaddr_in(s.get_peername) + @@received_data = data + EM.stop + end + end + + EM.open_datagram_socket(@@public_ipv6, next_port) do |c| + c.send_datagram "ipv6/udp", @@public_ipv6, @local_port + end + end + assert_equal @@remote_ip, @@public_ipv6 + assert_equal "ipv6/udp", @@received_data + end + + # Try to connect via TCP to an invalid IPv6. EM.connect should raise + # EM::ConnectionError. + def test_tcp_connect_to_invalid_ipv6 + invalid_ipv6 = "1:A" + + EM.run do + begin + error = nil + EM.connect(invalid_ipv6, 1234) + rescue => e + error = e + ensure + EM.stop + assert_equal EM::ConnectionError, (error && error.class) + end + end + end + + # Try to send a UDP datagram to an invalid IPv6. EM.send_datagram should raise + # EM::ConnectionError. + def test_udp_send_datagram_to_invalid_ipv6 + invalid_ipv6 = "1:A" + + EM.run do + begin + error = nil + EM.open_datagram_socket(@@public_ipv6, next_port) do |c| + c.send_datagram "hello", invalid_ipv6, 1234 + end + rescue => e + error = e + ensure + EM.stop + assert_equal EM::ConnectionError, (error && error.class) + end + end + end + + + else + warn "no IPv6 in this host, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests. + def test_ipv6_unavailable + assert true + end + + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_iterator.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_iterator.rb new file mode 100644 index 0000000..6ec4e46 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_iterator.rb @@ -0,0 +1,118 @@ +require 'em_test_helper' + +class TestIterator < Test::Unit::TestCase + + # By default, format the time with tenths-of-seconds. + # Some tests should ask for extra decimal places to ensure + # that delays between iterations will receive a changed time. + def get_time(n=1) + time = EM.current_time + time.strftime('%H:%M:%S.') + time.tv_usec.to_s[0, n] + end + + def test_default_concurrency + items = {} + list = 1..10 + EM.run { + EM::Iterator.new(list).each( proc {|num,iter| + time = get_time(3) + items[time] ||= [] + items[time] << num + EM::Timer.new(0.02) {iter.next} + }, proc {EM.stop}) + } + assert_equal(10, items.keys.size) + assert_equal(list.to_a.sort, items.values.flatten.sort) + end + + def test_default_concurrency_with_a_proc + items = {} + list = (1..10).to_a + original_list = list.dup + EM.run { + EM::Iterator.new(proc{list.pop || EM::Iterator::Stop}).each( proc {|num,iter| + time = get_time(3) + items[time] ||= [] + items[time] << num + EM::Timer.new(0.02) {iter.next} + }, proc {EM.stop}) + } + assert_equal(10, items.keys.size) + assert_equal(original_list.to_a.sort, items.values.flatten.sort) + end + + def test_concurrency_bigger_than_list_size + items = {} + list = [1,2,3] + EM.run { + EM::Iterator.new(list,10).each(proc {|num,iter| + time = get_time + items[time] ||= [] + items[time] << num + EM::Timer.new(1) {iter.next} + }, proc {EM.stop}) + } + assert_equal(1, items.keys.size) + assert_equal(list.to_a.sort, items.values.flatten.sort) + end + + def test_changing_concurrency_affects_active_iteration + items = {} + list = 1..25 + seen = 0 + EM.run { + i = EM::Iterator.new(list,1) + i.each(proc {|num,iter| + time = get_time + items[time] ||= [] + items[time] << num + if (seen += 1) == 5 + # The first 5 items will be distinct times + # The next 20 items will happen in 2 bursts + i.concurrency = 10 + end + EM::Timer.new(0.2) {iter.next} + }, proc {EM.stop}) + } + assert_in_delta(7, items.keys.size, 1) + assert_equal(list.to_a.sort, items.values.flatten.sort) + end + + def test_map + list = 100..150 + EM.run { + EM::Iterator.new(list).map(proc{ |num,iter| + EM.add_timer(0.01){ iter.return(num) } + }, proc{ |results| + assert_equal(list.to_a.size, results.size) + EM.stop + }) + } + end + + def test_inject + omit_if(windows?) + + list = %w[ pwd uptime uname date ] + EM.run { + EM::Iterator.new(list, 2).inject({}, proc{ |hash,cmd,iter| + EM.system(cmd){ |output,status| + hash[cmd] = status.exitstatus == 0 ? output.strip : nil + iter.return(hash) + } + }, proc{ |results| + assert_equal(results.keys.sort, list.sort) + EM.stop + }) + } + end + + def test_concurrency_is_0 + EM.run { + assert_raise ArgumentError do + EM::Iterator.new(1..5,0) + end + EM.stop + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_kb.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_kb.rb new file mode 100644 index 0000000..9c31f5f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_kb.rb @@ -0,0 +1,28 @@ +require 'em_test_helper' + +class TestKeyboardEvents < Test::Unit::TestCase + + module KbHandler + include EM::Protocols::LineText2 + def receive_line d + EM::stop if d == "STOP" + end + end + + # This test doesn't actually do anything useful but is here to + # illustrate the usage. If you removed the timer and ran this test + # by itself on a console, and then typed into the console, it would + # work. + # I don't know how to get the test harness to simulate actual keystrokes. + # When someone figures that out, then we can make this a real test. + # + def test_kb + omit_if(jruby?) + omit_if(!$stdout.tty?) # don't run the test unless it stands a chance of validity. + EM.run do + EM.open_keyboard KbHandler + EM::Timer.new(1) { EM.stop } + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_line_protocol.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_line_protocol.rb new file mode 100644 index 0000000..2067a72 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_line_protocol.rb @@ -0,0 +1,33 @@ +require 'em_test_helper' + +class TestLineProtocol < Test::Unit::TestCase + class LineProtocolTestClass + include EM::Protocols::LineProtocol + + def lines + @lines ||= [] + end + + def receive_line(line) + lines << line + end + end + + def setup + @proto = LineProtocolTestClass.new + end + + def test_simple_split_line + @proto.receive_data("this is") + assert_equal([], @proto.lines) + + @proto.receive_data(" a test\n") + assert_equal(["this is a test"], @proto.lines) + end + + def test_simple_lines + @proto.receive_data("aaa\nbbb\r\nccc\nddd") + assert_equal(%w(aaa bbb ccc), @proto.lines) + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ltp.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ltp.rb new file mode 100644 index 0000000..06c2685 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ltp.rb @@ -0,0 +1,155 @@ +require 'em_test_helper' + +class TestLineAndTextProtocol < Test::Unit::TestCase + + class TLP_LineBuffer < EM::P::LineAndTextProtocol + attr_reader :line_buffer + + def initialize + super + @line_buffer = [] + end + + def receive_line line + @line_buffer << line + end + end + + module StopClient + def set_receive_data(&blk) + @rdb = blk + end + + def receive_data data + @rdb.call(data) if @rdb + end + + def unbind + EM.add_timer(0.1) { EM.stop } + end + end + + def setup + @port = next_port + end + + def test_simple_lines + conn = nil + EM.run { + EM.start_server( "127.0.0.1", @port, TLP_LineBuffer ) do |c| + conn = c + end + setup_timeout + + EM.connect "127.0.0.1", @port, StopClient do |c| + c.send_data "aaa\nbbb\r\nccc\n" + c.close_connection_after_writing + end + } + assert_equal( %w(aaa bbb ccc), conn.line_buffer) + end + + #-------------------------------------------------------------------- + + class TLP_ErrorMessage < EM::P::LineAndTextProtocol + attr_reader :error_message + + def initialize + super + @error_message = [] + end + + def receive_line text + raise + end + + def receive_error text + @error_message << text + end + end + + def test_overlength_lines + conn = nil + EM.run { + EM.start_server( "127.0.0.1", @port, TLP_ErrorMessage ) do |c| + conn = c + end + setup_timeout + EM.connect "127.0.0.1", @port, StopClient do |c| + c.send_data "a" * (16*1024 + 1) + c.send_data "\n" + c.close_connection_after_writing + end + + } + assert_equal( ["overlength line"], conn.error_message ) + end + + + #-------------------------------------------------------------------- + + class LineAndTextTest < EM::P::LineAndTextProtocol + def receive_line line + if line =~ /content-length:\s*(\d+)/i + @content_length = $1.to_i + elsif line.length == 0 + set_binary_mode @content_length + end + end + def receive_binary_data text + send_data "received #{text.length} bytes" + close_connection_after_writing + end + end + + def test_lines_and_text + output = '' + EM.run { + EM.start_server( "127.0.0.1", @port, LineAndTextTest ) + setup_timeout + + EM.connect "127.0.0.1", @port, StopClient do |c| + c.set_receive_data { |data| output << data } + c.send_data "Content-length: 400\n" + c.send_data "\n" + c.send_data "A" * 400 + EM.add_timer(0.1) { c.close_connection_after_writing } + end + } + assert_equal( "received 400 bytes", output ) + end + + #-------------------------------------------------------------------- + + + class BinaryTextTest < EM::P::LineAndTextProtocol + def receive_line line + if line =~ /content-length:\s*(\d+)/i + set_binary_mode $1.to_i + else + raise "protocol error" + end + end + def receive_binary_data text + send_data "received #{text.length} bytes" + close_connection_after_writing + end + end + + def test_binary_text + output = '' + EM.run { + EM.start_server( "127.0.0.1", @port, BinaryTextTest ) + setup_timeout + + EM.connect "127.0.0.1", @port, StopClient do |c| + c.set_receive_data { |data| output << data } + c.send_data "Content-length: 10000\n" + c.send_data "A" * 10000 + EM.add_timer(0.1) { c.close_connection_after_writing } + end + } + assert_equal( "received 10000 bytes", output ) + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ltp2.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ltp2.rb new file mode 100644 index 0000000..220fcbe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ltp2.rb @@ -0,0 +1,332 @@ +require 'em_test_helper' + +# TODO!!! Need tests for overlength headers and text bodies. + +class TestLineText2 < Test::Unit::TestCase + + # Run each of these tests two ways: passing in the whole test-dataset in one chunk, + # and passing it in one character at a time. + + class Basic + include EM::Protocols::LineText2 + attr_reader :lines + def receive_line line + (@lines ||= []) << line + end + end + def test_basic + testdata = "Line 1\nLine 2\r\nLine 3\n" + + a = Basic.new + a.receive_data testdata + assert_equal( ["Line 1", "Line 2", "Line 3"], a.lines ) + + a = Basic.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( ["Line 1", "Line 2", "Line 3"], a.lines ) + end + + # The basic test above shows that extra newlines are chomped + # This test shows that newlines are preserved if the delimiter isn't \n + class PreserveNewlines + include EM::Protocols::LineText2 + attr_reader :lines + def initialize *args + super + @delim = "|" + set_delimiter @delim + end + def receive_line line + (@lines ||= []) << line + end + end + def test_preserve_newlines + a = PreserveNewlines.new + a.receive_data "aaa|bbb|ccc|\n|\r\n| \t ||" + assert_equal( ["aaa", "bbb", "ccc", "\n", "\r\n", " \t ", ""], a.lines ) + end + + class ChangeDelimiter + include EM::Protocols::LineText2 + attr_reader :lines + def initialize *args + super + @delim = "A" + set_delimiter @delim + end + def receive_line line + (@lines ||= []) << line + set_delimiter( @delim.succ! ) + end + end + + def test_change_delimiter + testdata = %Q(LineaALinebBLinecCLinedD) + + a = ChangeDelimiter.new + a.receive_data testdata + assert_equal( ["Linea", "Lineb", "Linec", "Lined"], a.lines ) + + a = ChangeDelimiter.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( ["Linea", "Lineb", "Linec", "Lined"], a.lines ) + end + + class RegexDelimiter + include EM::Protocols::LineText2 + attr_reader :lines + def initialize *args + super + @delim = /[A-D]/ + set_delimiter @delim + end + def receive_line line + (@lines ||= []) << line + end + end + + def test_regex_delimiter + testdata = %Q(LineaALinebBLinecCLinedD) + + a = RegexDelimiter.new + a.receive_data testdata + assert_equal( ["Linea", "Lineb", "Linec", "Lined"], a.lines ) + + a = RegexDelimiter.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( ["Linea", "Lineb", "Linec", "Lined"], a.lines ) + end + + #-- + # Test two lines followed by an empty line, ten bytes of binary data, then + # two more lines. + + class Binary + include EM::Protocols::LineText2 + attr_reader :lines, :body + def initialize *args + super + @lines = [] + @body = nil + end + def receive_line ln + if ln == "" + set_text_mode 10 + else + @lines << ln + end + end + def receive_binary_data data + @body = data + end + end + + def test_binary + testdata = %Q(Line 1 +Line 2 + +0000000000Line 3 +Line 4 +) + + a = Binary.new + a.receive_data testdata + assert_equal( ["Line 1", "Line 2", "Line 3", "Line 4"], a.lines) + assert_equal( "0000000000", a.body ) + + a = Binary.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( ["Line 1", "Line 2", "Line 3", "Line 4"], a.lines) + assert_equal( "0000000000", a.body ) + end + + + # Test unsized binary data. The expectation is that each chunk of it + # will be passed to us as it it received. + class UnsizedBinary + include EM::Protocols::LineText2 + attr_reader :n_calls, :body + def initialize *args + super + set_text_mode + end + def receive_binary_data data + @n_calls ||= 0 + @n_calls += 1 + (@body ||= "") << data + end + end + + def test_unsized_binary + testdata = "X\0" * 1000 + + a = UnsizedBinary.new + a.receive_data testdata + assert_equal( 1, a.n_calls ) + assert_equal( testdata, a.body ) + + a = UnsizedBinary.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( 2000, a.n_calls ) + assert_equal( testdata, a.body ) + end + + + # Test binary data with a "throw back" into line-mode. + class ThrowBack + include EM::Protocols::LineText2 + attr_reader :headers + def initialize *args + super + @headers = [] + @n_bytes = 0 + set_text_mode + end + def receive_binary_data data + wanted = 25 - @n_bytes + will_take = if data.length > wanted + data.length - wanted + else + data.length + end + @n_bytes += will_take + + if @n_bytes == 25 + set_line_mode( data[will_take..-1] ) + end + end + def receive_line ln + @headers << ln + end + end + def test_throw_back + testdata = "Line\n" * 10 + + a = ThrowBack.new + a.receive_data testdata + assert_equal( ["Line"] * 5, a.headers ) + + a = ThrowBack.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( ["Line"] * 5, a.headers ) + end + + # Test multi-character line delimiters. + # Also note that the test data has a "tail" with no delimiter, that will be + # discarded, but cf. the BinaryTail test. + # TODO!!! This test doesn't work in the byte-by-byte case. + class Multichar + include EM::Protocols::LineText2 + attr_reader :lines + def initialize *args + super + @lines = [] + set_delimiter "012" + end + def receive_line ln + @lines << ln + end + end + def test_multichar + testdata = "Line012Line012Line012Line" + + a = Multichar.new + a.receive_data testdata + assert_equal( ["Line"]*3, a.lines ) + + a = Multichar.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + # DOESN'T WORK in this case. Multi-character delimiters are broken. + #assert_equal( ["Line"]*3, a.lines ) + end + + # Test a binary "tail," when a sized binary transfer doesn't complete because + # of an unbind. We get a partial result. + class BinaryTail + include EM::Protocols::LineText2 + attr_reader :data + def initialize *args + super + @data = "" + set_text_mode 1000 + end + def receive_binary_data data + # we expect to get all the data in one chunk, even in the byte-by-byte case, + # because sized transfers by definition give us exactly one call to + # #receive_binary_data. + @data = data + end + end + def test_binary_tail + testdata = "0" * 500 + + a = BinaryTail.new + a.receive_data testdata + a.unbind + assert_equal( "0" * 500, a.data ) + + a = BinaryTail.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + a.unbind + assert_equal( "0" * 500, a.data ) + end + + + # Test an end-of-binary call. Arrange to receive binary data but don't bother counting it + # as it comes. Rely on getting receive_end_of_binary_data to signal the transition back to + # line mode. + # At the present time, this isn't strictly necessary with sized binary chunks because by + # definition we accumulate them and make exactly one call to receive_binary_data, but + # we may want to support a mode in the future that would break up large chunks into multiple + # calls. + class LazyBinary + include EM::Protocols::LineText2 + attr_reader :data, :end + def initialize *args + super + @data = "" + set_text_mode 1000 + end + def receive_binary_data data + # we expect to get all the data in one chunk, even in the byte-by-byte case, + # because sized transfers by definition give us exactly one call to + # #receive_binary_data. + @data = data + end + def receive_end_of_binary_data + @end = true + end + end + def test_receive_end_of_binary_data + testdata = "_" * 1000 + a = LazyBinary.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( "_" * 1000, a.data ) + assert( a.end ) + end + + + # This tests a bug fix in which calling set_text_mode failed when called + # inside receive_binary_data. + # + class BinaryPair + include EM::Protocols::LineText2 + attr_reader :sizes + def initialize *args + super + set_text_mode 1 + @sizes = [] + end + def receive_binary_data dt + @sizes << dt.length + set_text_mode( (dt.length == 1) ? 2 : 1 ) + end + end + def test_binary_pairs + test_data = "123" * 5 + a = BinaryPair.new + a.receive_data test_data + assert_equal( [1,2,1,2,1,2,1,2,1,2], a.sizes ) + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_many_fds.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_many_fds.rb new file mode 100644 index 0000000..7c126dc --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_many_fds.rb @@ -0,0 +1,22 @@ +require 'em_test_helper' +require 'socket' + +class TestManyFDs < Test::Unit::TestCase + def setup + @port = next_port + end + + def test_connection_class_cache + mod = Module.new + a = nil + Process.setrlimit(Process::RLIMIT_NOFILE, 4096) rescue nil + EM.run { + EM.start_server '127.0.0.1', @port, mod + 1100.times do + a = EM.connect '127.0.0.1', @port, mod + assert_kind_of EM::Connection, a + end + EM.stop + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_next_tick.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_next_tick.rb new file mode 100644 index 0000000..9b60359 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_next_tick.rb @@ -0,0 +1,104 @@ +require 'em_test_helper' + +class TestNextTick < Test::Unit::TestCase + + def test_tick_arg + pr = proc {EM.stop} + EM.run { + EM.next_tick pr + } + assert true + end + + def test_tick_block + EM.run { + EM.next_tick {EM.stop} + } + assert true + end + + # This illustrates the solution to a long-standing problem. + # It's now possible to correctly nest calls to EM#run. + # See the source code commentary for EM#run for more info. + # + def test_run_run + EM.run { + EM.run { + EM.next_tick {EM.stop} + } + } + end + + def test_pre_run_queue + x = false + EM.next_tick { EM.stop; x = true } + EM.run { EM.add_timer(0.01) { EM.stop } } + assert x + end + + def test_cleanup_after_stop + x = true + EM.run{ + EM.next_tick{ + EM.stop + EM.next_tick{ x=false } + } + } + EM.run{ + EM.next_tick{ EM.stop } + } + assert x + end + + # We now support an additional parameter for EM#run. + # You can pass two procs to EM#run now. The first is executed as the normal + # run block. The second (if given) is scheduled for execution after the + # reactor loop completes. + # The reason for supporting this is subtle. There has always been an expectation + # that EM#run doesn't return until after the reactor loop ends. But now it's + # possible to nest calls to EM#run, which means that a nested call WILL + # RETURN. In order to write code that will run correctly either way, it's + # recommended to put any code which must execute after the reactor completes + # in the second parameter. + # + def test_run_run_2 + a = proc {EM.stop} + b = proc {assert true} + EM.run a, b + end + + + # This illustrates that EM#run returns when it's called nested. + # This isn't a feature, rather it's something to be wary of when writing code + # that must run correctly even if EM#run is called while a reactor is already + # running. + def test_run_run_3 + a = [] + EM.run { + EM.run proc {EM.stop}, proc {a << 2} + a << 1 + } + assert_equal( [1,2], a ) + end + + + def test_schedule_on_reactor_thread + x = false + EM.run do + EM.schedule { x = true } + EM.stop + end + assert x + end + + def test_schedule_from_thread + x = false + EM.run do + Thread.new { EM.schedule { x = true } }.join + assert !x + EM.next_tick { EM.stop } + end + assert x + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_object_protocol.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_object_protocol.rb new file mode 100644 index 0000000..b1287ea --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_object_protocol.rb @@ -0,0 +1,36 @@ +require 'em_test_helper' + +class TestObjectProtocol < Test::Unit::TestCase + module Server + include EM::P::ObjectProtocol + def post_init + send_object :hello=>'world' + end + def receive_object obj + $server = obj + EM.stop + end + end + + module Client + include EM::P::ObjectProtocol + def receive_object obj + $client = obj + send_object 'you_said'=>obj + end + end + + def setup + @port = next_port + end + + def test_send_receive + EM.run{ + EM.start_server "127.0.0.1", @port, Server + EM.connect "127.0.0.1", @port, Client + } + + assert($client == {:hello=>'world'}) + assert($server == {'you_said'=>{:hello=>'world'}}) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pause.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pause.rb new file mode 100644 index 0000000..d078a77 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pause.rb @@ -0,0 +1,107 @@ +require 'em_test_helper' + +class TestPause < Test::Unit::TestCase + if EM.respond_to? :pause_connection + def setup + @port = next_port + end + + def teardown + assert(!EM.reactor_running?) + end + + def test_pause_resume + server = nil + + s_rx = c_rx = 0 + + test_server = Module.new do + define_method :post_init do + server = self + end + + define_method :receive_data do |data| + s_rx += 1 + + EM.add_periodic_timer(0.01) { send_data 'hi' } + send_data 'hi' + + # pause server, now no outgoing data will actually + # be sent and no more incoming data will be received + pause + end + end + + test_client = Module.new do + def post_init + EM.add_periodic_timer(0.01) do + send_data 'hello' + end + end + + define_method :receive_data do |data| + c_rx += 1 + end + end + + EM.run do + EM.start_server "127.0.0.1", @port, test_server + EM.connect "127.0.0.1", @port, test_client + + EM.add_timer(0.05) do + assert_equal 1, s_rx + assert_equal 0, c_rx + assert server.paused? + + # resume server, queued outgoing and incoming data will be flushed + server.resume + + assert !server.paused? + + EM.add_timer(0.05) do + assert server.paused? + assert s_rx > 1 + assert c_rx > 0 + EM.stop + end + end + end + end + + def test_pause_in_receive_data + incoming = [] + + test_server = Module.new do + define_method(:receive_data) do |data| + incoming << data + pause + EM.add_timer(0.5){ close_connection } + end + define_method(:unbind) do + EM.stop + end + end + + buf = 'a' * 1024 + + EM.run do + EM.start_server "127.0.0.1", @port, test_server + cli = EM.connect "127.0.0.1", @port + 128.times do + cli.send_data buf + end + end + + assert_equal 1, incoming.size + assert incoming[0].bytesize > buf.bytesize + assert incoming[0].bytesize < buf.bytesize * 128 + end + else + warn "EM.pause_connection not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_pause_connection_not_implemented + assert true + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pending_connect_timeout.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pending_connect_timeout.rb new file mode 100644 index 0000000..a3f7fa4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pending_connect_timeout.rb @@ -0,0 +1,52 @@ +require 'em_test_helper' + +class TestPendingConnectTimeout < Test::Unit::TestCase + + if EM.respond_to? :get_pending_connect_timeout + def test_default + EM.run { + c = EM.connect("127.0.0.1", 54321) + assert_equal 20.0, c.pending_connect_timeout + EM.stop + } + end + + def test_set_and_get + EM.run { + c = EM.connect("127.0.0.1", 54321) + c.pending_connect_timeout = 2.5 + assert_equal 2.5, c.pending_connect_timeout + EM.stop + } + end + + def test_for_real + start, finish = nil + + timeout_handler = Module.new do + define_method :unbind do + finish = EM.current_time + EM.stop + end + end + + EM.run { + setup_timeout + EM.heartbeat_interval = 0.1 + start = EM.current_time + c = EM.connect('192.0.2.0', 54321, timeout_handler) + c.pending_connect_timeout = 0.2 + } + + assert_in_delta(0.2, (finish - start), 0.1) + end + else + warn "EM.pending_connect_timeout not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_pending_connect_timeout_not_implemented + assert true + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pool.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pool.rb new file mode 100644 index 0000000..6bd117e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pool.rb @@ -0,0 +1,196 @@ +require 'em_test_helper' + +class TestPool < Test::Unit::TestCase + def pool + @pool ||= EM::Pool.new + end + + def go + EM.run { yield } + end + + def stop + EM.stop + end + + def deferrable + @deferrable ||= EM::DefaultDeferrable.new + end + + def test_supports_more_work_than_resources + ran = false + go do + pool.perform do + ran = true + deferrable + end + stop + end + assert_equal false, ran + go do + pool.add :resource + stop + end + assert_equal true, ran + end + + def test_reques_resources_on_error + pooled_res, pooled_res2 = nil + pool.add :res + go do + pool.perform do |res| + pooled_res = res + deferrable + end + stop + end + deferrable.fail + go do + pool.perform do |res| + pooled_res2 = res + deferrable + end + stop + end + assert_equal :res, pooled_res + assert_equal pooled_res, pooled_res2 + end + + def test_supports_custom_error_handler + eres = nil + pool.on_error do |res| + eres = res + end + performs = [] + pool.add :res + go do + pool.perform do |res| + performs << res + deferrable + end + pool.perform do |res| + performs << res + deferrable + end + deferrable.fail + stop + end + assert_equal :res, eres + # manual requeues required when error handler is installed: + assert_equal 1, performs.size + assert_equal :res, performs.first + end + + def test_catches_successful_deferrables + performs = [] + pool.add :res + go do + pool.perform { |res| performs << res; deferrable } + pool.perform { |res| performs << res; deferrable } + stop + end + assert_equal [:res], performs + deferrable.succeed + go { stop } + assert_equal [:res, :res], performs + end + + def test_prunes_locked_and_removed_resources + performs = [] + pool.add :res + deferrable.succeed + go do + pool.perform { |res| performs << res; pool.remove res; deferrable } + pool.perform { |res| performs << res; pool.remove res; deferrable } + stop + end + assert_equal [:res], performs + end + + # Contents is only to be used for inspection of the pool! + def test_contents + pool.add :res + assert_equal [:res], pool.contents + # Assert that modifying the contents list does not affect the pools + # contents. + pool.contents.delete(:res) + assert_equal [:res], pool.contents + end + + def test_contents_when_perform_errors_and_on_error_is_not_set + pool.add :res + assert_equal [:res], pool.contents + + pool.perform do |r| + d = EM::DefaultDeferrable.new + d.fail + d + end + + EM.run { EM.next_tick { EM.stop } } + + assert_equal [:res], pool.contents + end + + def test_contents_when_perform_errors_and_on_error_is_set + pool.add :res + res = nil + pool.on_error do |r| + res = r + end + assert_equal [:res], pool.contents + + pool.perform do |r| + d = EM::DefaultDeferrable.new + d.fail 'foo' + d + end + + EM.run { EM.next_tick { EM.stop } } + + assert_equal :res, res + assert_equal [], pool.contents + end + + def test_num_waiting + pool.add :res + assert_equal 0, pool.num_waiting + pool.perform { |r| EM::DefaultDeferrable.new } + assert_equal 0, pool.num_waiting + 10.times { pool.perform { |r| EM::DefaultDeferrable.new } } + EM.run { EM.next_tick { EM.stop } } + assert_equal 10, pool.num_waiting + end + + def test_exceptions_in_the_work_block_bubble_up_raise_and_fail_the_resource + pool.add :res + + res = nil + pool.on_error { |r| res = r } + pool.perform { raise 'boom' } + + assert_raises(RuntimeError) do + EM.run { EM.next_tick { EM.stop } } + end + + assert_equal [], pool.contents + assert_equal :res, res + end + + def test_removed_list_does_not_leak_on_errors + pool.add :res + + pool.on_error do |r| + # This is actually the wrong thing to do, and not required, but some users + # might do it. When they do, they would find that @removed would cause a + # slow leak. + pool.remove r + end + + pool.perform { d = EM::DefaultDeferrable.new; d.fail; d } + + EM.run { EM.next_tick { EM.stop } } + assert_equal [], pool.instance_variable_get(:@removed) + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_process_watch.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_process_watch.rb new file mode 100644 index 0000000..6e0c49a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_process_watch.rb @@ -0,0 +1,50 @@ +require 'em_test_helper' + +if EM.kqueue? + class TestProcessWatch < Test::Unit::TestCase + module ParentProcessWatcher + def process_forked + $forked = true + end + end + + module ChildProcessWatcher + def process_exited + $exited = true + end + def unbind + $unbind = true + EM.stop + end + end + + def setup + EM.kqueue = true + end + + def teardown + EM.kqueue = false + end + + def test_events + omit_if(rbx?) + omit_if(jruby?) + EM.run{ + # watch ourselves for a fork notification + EM.watch_process(Process.pid, ParentProcessWatcher) + $fork_pid = fork{ sleep } + child = EM.watch_process($fork_pid, ChildProcessWatcher) + $pid = child.pid + + EM.add_timer(0.2){ + Process.kill('TERM', $fork_pid) + } + } + + assert_equal($pid, $fork_pid) + assert($forked) + assert($exited) + assert($unbind) + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_processes.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_processes.rb new file mode 100644 index 0000000..dd03cf0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_processes.rb @@ -0,0 +1,128 @@ +require 'em_test_helper' + +class TestProcesses < Test::Unit::TestCase + + if !windows? && !jruby? + + # EM::DeferrableChildProcess is a sugaring of a common use-case + # involving EM::popen. + # Call the #open method on EM::DeferrableChildProcess, passing + # a command-string. #open immediately returns an EM::Deferrable + # object. It also schedules the forking of a child process, which + # will execute the command passed to #open. + # When the forked child terminates, the Deferrable will be signalled + # and execute its callbacks, passing the data that the child process + # wrote to stdout. + # + def test_deferrable_child_process + ls = "" + EM.run { + d = EM::DeferrableChildProcess.open( "ls -ltr" ) + d.callback {|data_from_child| + ls = data_from_child + EM.stop + } + } + assert( ls.length > 0) + end + + def setup + $out = nil + $status = nil + end + + def test_em_system + EM.run{ + EM.system('ls'){ |out,status| $out, $status = out, status; EM.stop } + } + + assert( $out.length > 0 ) + assert_equal(0, $status.exitstatus) + assert_kind_of(Process::Status, $status) + end + + def test_em_system_pid + $pids = [] + + EM.run{ + $pids << EM.system('echo hi', proc{ |out,status|$pids << status.pid; EM.stop }) + } + + assert_equal $pids[0], $pids[1] + end + + def test_em_system_with_proc + EM.run{ + EM.system('ls', proc{ |out,status| $out, $status = out, status; EM.stop }) + } + + assert( $out.length > 0 ) + assert_equal(0, $status.exitstatus) + assert_kind_of(Process::Status, $status) + end + + def test_em_system_with_two_procs + EM.run{ + EM.system('sh', proc{ |process| + process.send_data("echo hello\n") + process.send_data("exit\n") + }, proc{ |out,status| + $out = out + $status = status + EM.stop + }) + } + + assert_equal("hello\n", $out) + end + + def test_em_system_cmd_arguments + EM.run{ + EM.system('echo', '1', '2', 'version', proc{ |process| + }, proc{ |out,status| + $out = out + $status = status + EM.stop + }) + } + + assert_match(/1 2 version/i, $out) + end + + def test_em_system_spaced_arguments + EM.run{ + EM.system('ruby', '-e', 'puts "hello"', proc{ |out,status| + $out = out + EM.stop + }) + } + + assert_equal("hello\n", $out) + end + + def test_em_popen_pause_resume + c_rx = 0 + + test_client = Module.new do + define_method :receive_data do |data| + c_rx += 1 + pause + EM.add_timer(0.5) { EM.stop } + end + end + + EM.run do + EM.popen('echo 1', test_client) + end + + assert_equal 1, c_rx + end + else + warn "EM.popen not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_popen_unsupported + assert true + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_proxy_connection.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_proxy_connection.rb new file mode 100644 index 0000000..11c0fb4 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_proxy_connection.rb @@ -0,0 +1,180 @@ +require 'em_test_helper' + +class TestProxyConnection < Test::Unit::TestCase + + if EM.respond_to?(:start_proxy) + module ProxyConnection + def initialize(client, request) + @client, @request = client, request + end + + def post_init + EM::enable_proxy(self, @client) + end + + def connection_completed + EM.next_tick { + send_data @request + } + end + + def proxy_target_unbound + $unbound_early = true + EM.stop + end + + def unbind + $proxied_bytes = self.get_proxied_bytes + @client.close_connection_after_writing + end + end + + module PartialProxyConnection + def initialize(client, request, length) + @client, @request, @length = client, request, length + end + + def post_init + EM::enable_proxy(self, @client, 0, @length) + end + + def receive_data(data) + $unproxied_data = data + @client.send_data(data) + end + + def connection_completed + EM.next_tick { + send_data @request + } + end + + def proxy_target_unbound + $unbound_early = true + EM.stop + end + + def proxy_completed + $proxy_completed = true + end + + def unbind + @client.close_connection_after_writing + end + end + + module Client + def connection_completed + send_data "EM rocks!" + end + + def receive_data(data) + $client_data = data + end + + def unbind + EM.stop + end + end + + module Client2 + include Client + def unbind; end + end + + module Server + def receive_data(data) + send_data "I know!" if data == "EM rocks!" + close_connection_after_writing + end + end + + module ProxyServer + def initialize port + @port = port + end + + def receive_data(data) + @proxy = EM.connect("127.0.0.1", @port, ProxyConnection, self, data) + end + end + + module PartialProxyServer + def initialize port + @port = port + end + + def receive_data(data) + EM.connect("127.0.0.1", @port, PartialProxyConnection, self, data, 1) + end + end + + module EarlyClosingProxy + def initialize port + @port = port + end + + def receive_data(data) + EM.connect("127.0.0.1", @port, ProxyConnection, self, data) + close_connection + end + end + + def setup + @port = next_port + @proxy_port = next_port + end + + def test_proxy_connection + EM.run { + EM.start_server("127.0.0.1", @port, Server) + EM.start_server("127.0.0.1", @proxy_port, ProxyServer, @port) + EM.connect("127.0.0.1", @proxy_port, Client) + } + + assert_equal("I know!", $client_data) + end + + def test_proxied_bytes + EM.run { + EM.start_server("127.0.0.1", @port, Server) + EM.start_server("127.0.0.1", @proxy_port, ProxyServer, @port) + EM.connect("127.0.0.1", @proxy_port, Client) + } + + assert_equal("I know!", $client_data) + assert_equal("I know!".bytesize, $proxied_bytes) + end + + def test_partial_proxy_connection + EM.run { + EM.start_server("127.0.0.1", @port, Server) + EM.start_server("127.0.0.1", @proxy_port, PartialProxyServer, @port) + EM.connect("127.0.0.1", @proxy_port, Client) + } + + assert_equal("I know!", $client_data) + assert_equal(" know!", $unproxied_data) + assert($proxy_completed) + end + + def test_early_close + $client_data = nil + EM.run { + EM.start_server("127.0.0.1", @port, Server) + EM.start_server("127.0.0.1", @proxy_port, EarlyClosingProxy, @port) + EM.connect("127.0.0.1", @proxy_port, Client2) + } + + assert($unbound_early) + end + else + warn "EM.start_proxy not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_start_proxy_not_implemented + assert !EM.respond_to?(:start_proxy) + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pure.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pure.rb new file mode 100644 index 0000000..8863a8d --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_pure.rb @@ -0,0 +1,139 @@ +require 'em_test_helper' + +class TestPure < Test::Unit::TestCase + + def setup + @port = next_port + end + + # These tests are intended to exercise problems that come up in the + # pure-Ruby implementation. However, we DON'T constrain them such that + # they only run in pure-Ruby. These tests need to work identically in + # any implementation. + + #------------------------------------- + + # The EM reactor needs to run down open connections and release other resources + # when it stops running. Make sure this happens even if user code throws a Ruby + # exception. + # If exception handling is incorrect, the second test will fail with a no-bind error + # because the TCP server opened in the first test will not have been closed. + + def test_exception_handling_releases_resources + exception = Class.new(StandardError) + + 2.times do + assert_raises(exception) do + EM.run do + EM.start_server "127.0.0.1", @port + raise exception + end + end + end + end + + # Under some circumstances, the pure Ruby library would emit an Errno::ECONNREFUSED + # exception on certain kinds of TCP connect-errors. + # It's always been something of an open question whether EM should throw an exception + # in these cases but the defined answer has always been to catch it the unbind method. + # With a connect failure, the latter will always fire, but connection_completed will + # never fire. So even though the point is arguable, it's incorrect for the pure Ruby + # version to throw an exception. + module TestConnrefused + def unbind + EM.stop + end + def connection_completed + raise "should never get here" + end + end + + def test_connrefused + assert_nothing_raised do + EM.run { + setup_timeout(2) + EM.connect "127.0.0.1", @port, TestConnrefused + } + end + end + + # Make sure connection_completed gets called as expected with TCP clients. This is the + # opposite of test_connrefused. + # If the test fails, it will hang because EM.stop never gets called. + # + module TestConnaccepted + def connection_completed + EM.stop + end + end + def test_connaccepted + assert_nothing_raised do + EM.run { + EM.start_server "127.0.0.1", @port + EM.connect "127.0.0.1", @port, TestConnaccepted + setup_timeout(1) + } + end + end + + def test_reactor_running + a = false + EM.run { + a = EM.reactor_running? + EM.next_tick {EM.stop} + } + assert a + end + + module TLSServer + def post_init + start_tls + end + + def ssl_handshake_completed + $server_handshake_completed = true + end + + def receive_data(data) + $server_received_data = data + send_data(data) + end + end + + module TLSClient + def post_init + start_tls + end + + def ssl_handshake_completed + $client_handshake_completed = true + end + + def connection_completed + send_data('Hello World!') + end + + def receive_data(data) + $client_received_data = data + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + def test_start_tls + $client_handshake_completed, $server_handshake_completed = false, false + $client_received_data, $server_received_data = nil, nil + EM.run do + EM.start_server("127.0.0.1", 16789, TLSServer) + EM.connect("127.0.0.1", 16789, TLSClient) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + assert($client_received_data == "Hello World!") + assert($server_received_data == "Hello World!") + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_queue.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_queue.rb new file mode 100644 index 0000000..34278c0 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_queue.rb @@ -0,0 +1,64 @@ +require 'em_test_helper' + +class TestEMQueue < Test::Unit::TestCase + def test_queue_push + s = 0 + EM.run do + q = EM::Queue.new + q.push(1) + EM.next_tick { s = q.size; EM.stop } + end + assert_equal 1, s + end + + def test_queue_pop + x,y,z = nil + EM.run do + q = EM::Queue.new + q.push(1,2,3) + q.pop { |v| x = v } + q.pop { |v| y = v } + q.pop { |v| z = v; EM.stop } + end + assert_equal 1, x + assert_equal 2, y + assert_equal 3, z + end + + def test_queue_reactor_thread + q = EM::Queue.new + + Thread.new { q.push(1,2,3) }.join + assert q.empty? + EM.run { EM.next_tick { EM.stop } } + assert_equal 3, q.size + + x = nil + Thread.new { q.pop { |v| x = v } }.join + assert_equal nil, x + EM.run { EM.next_tick { EM.stop } } + assert_equal 1, x + end + + def test_num_waiting + q = EM::Queue.new + many = 3 + many.times { q.pop {} } + EM.run { EM.next_tick { EM.stop } } + assert_equal many, q.num_waiting + end + + def test_big_queue + EM.run do + q = EM::Queue.new + 2000.times do |i| + q.push(*0..1000) + q.pop { |v| assert_equal v, i % 1001 } + end + q.pop do + assert_equal 1_999_999, q.size + EM.stop + end + end + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_resolver.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_resolver.rb new file mode 100644 index 0000000..58ed5f5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_resolver.rb @@ -0,0 +1,105 @@ +require 'em_test_helper' + +class TestResolver < Test::Unit::TestCase + def test_nameserver + assert_kind_of(String, EM::DNS::Resolver.nameserver) + end + + def test_nameservers + assert_kind_of(Array, EM::DNS::Resolver.nameservers) + end + + def test_hosts + assert_kind_of(Hash, EM::DNS::Resolver.hosts) + + # Make sure that blank or comment lines are skipped + refute(EM::DNS::Resolver.hosts.include? nil) + end + + def test_a + pend('FIXME: this test is broken on Windows') if windows? + + EM.run { + d = EM::DNS::Resolver.resolve "example.com" + d.errback { assert false } + d.callback { |r| + assert r + EM.stop + } + } + end + + def test_bad_host + EM.run { + d = EM::DNS::Resolver.resolve "asdfasasdf" + d.callback { assert false } + d.errback { assert true; EM.stop } + } + end + + def test_garbage + assert_raises( ArgumentError ) { + EM.run { + EM::DNS::Resolver.resolve 123 + } + } + end + + # There isn't a public DNS entry like 'example.com' with an A rrset + def test_a_pair + pend('FIXME: this test is broken on Windows') if windows? + + EM.run { + d = EM::DNS::Resolver.resolve "yahoo.com" + d.errback { |err| assert false, "failed to resolve yahoo.com: #{err}" } + d.callback { |r| + assert_kind_of(Array, r) + assert r.size > 1, "returned #{r.size} results: #{r.inspect}" + EM.stop + } + } + end + + def test_localhost + pend('FIXME: this test is broken on Windows') if windows? + + EM.run { + d = EM::DNS::Resolver.resolve "localhost" + d.errback { assert false } + d.callback { |r| + assert_include(["127.0.0.1", "::1"], r.first) + assert_kind_of(Array, r) + + EM.stop + } + } + end + + def test_timer_cleanup + pend('FIXME: this test is broken on Windows') if windows? + + EM.run { + d = EM::DNS::Resolver.resolve "example.com" + d.errback { |err| assert false, "failed to resolve example.com: #{err}" } + d.callback { |r| + # This isn't a great test, but it's hard to get more canonical + # confirmation that the timer is cancelled + assert_nil(EM::DNS::Resolver.socket.instance_variable_get(:@timer)) + + EM.stop + } + } + end + + def test_failure_timer_cleanup + EM.run { + d = EM::DNS::Resolver.resolve "asdfasdf" + d.callback { assert false } + d.errback { + assert_nil(EM::DNS::Resolver.socket.instance_variable_get(:@timer)) + + EM.stop + } + } + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_running.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_running.rb new file mode 100644 index 0000000..693b390 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_running.rb @@ -0,0 +1,14 @@ +require 'em_test_helper' + +class TestRunning < Test::Unit::TestCase + def test_running + assert_equal( false, EM::reactor_running? ) + r = false + EM.run { + r = EM::reactor_running? + EM.stop + } + assert_equal( true, r ) + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_sasl.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_sasl.rb new file mode 100644 index 0000000..e80f657 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_sasl.rb @@ -0,0 +1,47 @@ +require 'em_test_helper' + + +class TestSASL < Test::Unit::TestCase + + # SASL authentication is usually done with UNIX-domain sockets, but + # we'll use TCP so this test will work on Windows. As far as the + # protocol handlers are concerned, there's no difference. + + TestUser,TestPsw = "someone", "password" + + class SaslServer < EM::Connection + include EM::Protocols::SASLauth + def validate usr, psw, sys, realm + usr == TestUser and psw == TestPsw + end + end + + class SaslClient < EM::Connection + include EM::Protocols::SASLauthclient + end + + def setup + @port = next_port + end + + def test_sasl + resp = nil + EM.run { + EM.start_server( "127.0.0.1", @port, SaslServer ) + + c = EM.connect( "127.0.0.1", @port, SaslClient ) + d = c.validate?( TestUser, TestPsw ) + d.timeout 1 + d.callback { + resp = true + EM.stop + } + d.errback { + resp = false + EM.stop + } + } + assert_equal( true, resp ) + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_send_file.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_send_file.rb new file mode 100644 index 0000000..a784b50 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_send_file.rb @@ -0,0 +1,217 @@ +require 'em_test_helper' +require 'tempfile' + +class TestSendFile < Test::Unit::TestCase + + if EM.respond_to?(:send_file_data) + module TestModule + def initialize filename + @filename = filename + end + + def post_init + send_file_data @filename + close_connection_after_writing + end + end + + module TestClient + def data_to(&blk) + @data_to = blk + end + + def receive_data(data) + @data_to.call(data) if @data_to + end + + def unbind + EM.stop + end + end + + def setup + @file = Tempfile.new("em_test_file") + @filename = @file.path + @port = next_port + end + + def test_send_file + File.open( @filename, "w" ) {|f| + f << ("A" * 5000) + } + + data = '' + + EM.run { + EM.start_server "127.0.0.1", @port, TestModule, @filename + setup_timeout + + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + assert_equal( "A" * 5000, data ) + end + + # EM::Connection#send_file_data has a strict upper limit on the filesize it will work with. + def test_send_large_file + File.open( @filename, "w" ) {|f| + f << ("A" * 1000000) + } + + data = '' + + assert_raises(RuntimeError) { + EM.run { + EM.start_server "127.0.0.1", @port, TestModule, @filename + setup_timeout + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + } + end + + module StreamTestModule + def initialize filename + @filename = filename + end + + def post_init + EM::Deferrable.future( stream_file_data(@filename)) { + close_connection_after_writing + } + end + end + + module ChunkStreamTestModule + def initialize filename + @filename = filename + end + + def post_init + EM::Deferrable.future( stream_file_data(@filename, :http_chunks=>true)) { + close_connection_after_writing + } + end + end + + def test_stream_file_data + File.open( @filename, "w" ) {|f| + f << ("A" * 1000) + } + + data = '' + + EM.run { + EM.start_server "127.0.0.1", @port, StreamTestModule, @filename + setup_timeout + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + assert_equal( "A" * 1000, data ) + end + + def test_stream_chunked_file_data + File.open( @filename, "w" ) {|f| + f << ("A" * 1000) + } + + data = '' + + EM.run { + EM.start_server "127.0.0.1", @port, ChunkStreamTestModule, @filename + setup_timeout + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + assert_equal( "3e8\r\n#{"A" * 1000}\r\n0\r\n\r\n", data ) + end + + module BadFileTestModule + def initialize filename + @filename = filename + end + + def post_init + de = stream_file_data( @filename+".wrong" ) + de.errback {|msg| + send_data msg + close_connection_after_writing + } + end + end + def test_stream_bad_file + data = '' + EM.run { + EM.start_server "127.0.0.1", @port, BadFileTestModule, @filename + setup_timeout(5) + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + assert_equal( "file not found", data ) + end + else + warn "EM.send_file_data not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_send_file_data_not_implemented + assert !EM.respond_to?(:send_file_data) + end + end + + begin + require 'fastfilereaderext' + + def test_stream_large_file_data + File.open( @filename, "w" ) {|f| + f << ("A" * 10000) + } + + data = '' + + EM.run { + EM.start_server "127.0.0.1", @port, StreamTestModule, @filename + setup_timeout + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + assert_equal( "A" * 10000, data ) + end + + def test_stream_large_chunked_file_data + File.open( @filename, "w" ) {|f| + f << ("A" * 100000) + } + + data = '' + + EM.run { + EM.start_server "127.0.0.1", @port, ChunkStreamTestModule, @filename + setup_timeout + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + expected = [ + "4000\r\n#{"A" * 16384}\r\n" * 6, + "6a0\r\n#{"A" * 0x6a0}\r\n", + "0\r\n\r\n" + ].join + assert_equal( expected, data ) + end + rescue LoadError + warn "require 'fastfilereaderext' failed, skipping tests in #{__FILE__}" + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_servers.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_servers.rb new file mode 100644 index 0000000..2a17050 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_servers.rb @@ -0,0 +1,33 @@ +require 'em_test_helper' +require 'socket' + +class TestServers < Test::Unit::TestCase + + def setup + @port = next_port + end + + def server_alive? + port_in_use?(@port) + end + + def run_test_stop_server + EM.run { + sig = EM.start_server("127.0.0.1", @port) + assert server_alive?, "Server didn't start" + EM.stop_server sig + # Give the server some time to shutdown. + EM.add_timer(0.1) { + assert !server_alive?, "Server didn't stop" + EM.stop + } + } + end + + def test_stop_server + assert !server_alive?, "Port already in use" + 2.times { run_test_stop_server } + assert !server_alive?, "Servers didn't stop" + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_shutdown_hooks.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_shutdown_hooks.rb new file mode 100644 index 0000000..b0e0c5c --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_shutdown_hooks.rb @@ -0,0 +1,23 @@ +require 'em_test_helper' + +class TestShutdownHooks < Test::Unit::TestCase + def test_shutdown_hooks + r = false + EM.run { + EM.add_shutdown_hook { r = true } + EM.stop + } + assert_equal( true, r ) + end + + def test_hook_order + r = [] + EM.run { + EM.add_shutdown_hook { r << 2 } + EM.add_shutdown_hook { r << 1 } + EM.stop + } + assert_equal( [1, 2], r ) + end +end + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_smtpclient.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_smtpclient.rb new file mode 100644 index 0000000..71ed584 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_smtpclient.rb @@ -0,0 +1,75 @@ +require 'em_test_helper' + +class TestSmtpClient < Test::Unit::TestCase + + Localhost = "127.0.0.1" + Localport = 9801 + + def setup + end + + def teardown + end + + def test_a + # No real tests until we have a server implementation to test against. + # This is what the call looks like, though: + err = nil + EM.run { + d = EM::Protocols::SmtpClient.send :domain=>"example.com", + :host=>Localhost, + :port=>Localport, # optional, defaults 25 + :starttls=>true, + :from=>"sender@example.com", + :to=> ["to_1@example.com", "to_2@example.com"], + :header=> {"Subject" => "This is a subject line"}, + :body=> "This is the body of the email", + :verbose=>true + d.errback {|e| + err = e + EM.stop + } + } + assert(err) + end + + def test_content + err = nil + EM.run { + d = EM::Protocols::SmtpClient.send :domain=>"example.com", + :host=>Localhost, + :port=>Localport, # optional, defaults 25 + :starttls=>true, + :from=>"sender@example.com", + :to=> ["to_1@example.com", "to_2@example.com"], + :content => ["Subject: xxx\r\n\r\ndata\r\n.\r\n"], + :verbose=>true + d.errback {|e| + err = e + EM.stop + } + } + assert(err) + end + + + EM::Protocols::SmtpClient.__send__(:public, :escape_leading_dots) + + def test_escaping + smtp = EM::Protocols::SmtpClient.new :domain => "example.com" + + expectations = { + "Hello\r\n" => "Hello\r\n", + "\r\n.whatever\r\n" => "\r\n..whatever\r\n", + "\r\n.\r\n" => "\r\n..\r\n", + "\r\n.\r\n." => "\r\n..\r\n..", + ".\r\n.\r\n" => "..\r\n..\r\n", + "..\r\n" => "...\r\n" + } + + expectations.each do |input, output| + assert_equal output, smtp.escape_leading_dots(input) + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_smtpserver.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_smtpserver.rb new file mode 100644 index 0000000..18c50fe --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_smtpserver.rb @@ -0,0 +1,57 @@ +require 'em_test_helper' + +class TestSmtpServer < Test::Unit::TestCase + + # Don't test on port 25. It requires superuser and there's probably + # a mail server already running there anyway. + Localhost = "127.0.0.1" + Localport = 25001 + + # This class is an example of what you need to write in order + # to implement a mail server. You override the methods you are + # interested in. Some, but not all, of these are illustrated here. + # + class Mailserver < EM::Protocols::SmtpServer + + attr_reader :my_msg_body, :my_sender, :my_recipients + + def initialize *args + super + end + def receive_sender sender + @my_sender = sender + #p sender + true + end + def receive_recipient rcpt + @my_recipients ||= [] + @my_recipients << rcpt + true + end + def receive_data_chunk c + @my_msg_body = c.last + end + def connection_ended + EM.stop + end + end + + def test_mail + c = nil + EM.run { + EM.start_server( Localhost, Localport, Mailserver ) {|conn| c = conn} + EM::Timer.new(2) {EM.stop} # prevent hanging the test suite in case of error + EM::Protocols::SmtpClient.send :host=>Localhost, + :port=>Localport, + :domain=>"bogus", + :from=>"me@example.com", + :to=>"you@example.com", + :header=> {"Subject"=>"Email subject line", "Reply-to"=>"me@example.com"}, + :body=>"Not much of interest here." + + } + assert_equal( "Not much of interest here.", c.my_msg_body ) + assert_equal( "", c.my_sender ) + assert_equal( [""], c.my_recipients ) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_sock_opt.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_sock_opt.rb new file mode 100644 index 0000000..60fba35 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_sock_opt.rb @@ -0,0 +1,54 @@ +require 'em_test_helper' +require 'socket' + +class TestSockOpt < Test::Unit::TestCase + def setup + assert(!EM.reactor_running?) + @port = next_port + end + + def teardown + assert(!EM.reactor_running?) + end + + def test_set_sock_opt + omit_if(windows?) + omit_if(!EM.respond_to?(:set_sock_opt)) + + val = nil + test_module = Module.new do + define_method :post_init do + val = set_sock_opt Socket::SOL_SOCKET, Socket::SO_BROADCAST, true + EM.stop + end + end + + EM.run do + EM.start_server '127.0.0.1', @port + EM.connect '127.0.0.1', @port, test_module + end + + assert_equal 0, val + end + + def test_get_sock_opt + omit_if(windows?) + omit_if(!EM.respond_to?(:set_sock_opt)) + + val = nil + test_module = Module.new do + define_method :connection_completed do + val = get_sock_opt Socket::SOL_SOCKET, Socket::SO_ERROR + EM.stop + end + end + + EM.run do + EM.start_server '127.0.0.1', @port + EM.connect '127.0.0.1', @port, test_module + end + + assert_equal "\0\0\0\0", val + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_spawn.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_spawn.rb new file mode 100644 index 0000000..ab0a92f --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_spawn.rb @@ -0,0 +1,293 @@ + +require 'em_test_helper' + + + +class TestSpawn < Test::Unit::TestCase + + # Spawn a process that simply stops the reactor. + # Assert that the notification runs after the block that calls it. + # + def test_stop + x = nil + EM.run { + s = EM.spawn {EM.stop} + s.notify + x = true + } + assert x + end + + + # Pass a parameter to a spawned process. + # + def test_parms + val = 5 + EM.run { + s = EM.spawn {|v| val *= v; EM.stop} + s.notify 3 + } + assert_equal( 15, val ) + end + + # Pass multiple parameters to a spawned process. + # + def test_multiparms + val = 5 + EM.run { + s = EM.spawn {|v1,v2| val *= (v1 + v2); EM.stop} + s.notify 3,4 + } + assert_equal( 35, val ) + end + + + # This test demonstrates that a notification does not happen immediately, + # but rather is scheduled sometime after the current code path completes. + # + def test_race + x = 0 + EM.run { + s = EM.spawn {x *= 2; EM.stop} + s.notify + x = 2 + } + assert_equal( 4, x) + end + + + # Spawn a process and notify it 25 times to run fibonacci + # on a pair of global variables. + # + def test_fibonacci + x = 1 + y = 1 + EM.run { + s = EM.spawn {x,y = y,x+y} + 25.times {s.notify} + + t = EM.spawn {EM.stop} + t.notify + } + assert_equal( 121393, x) + assert_equal( 196418, y) + end + + # This one spawns 25 distinct processes, and notifies each one once, + # rather than notifying a single process 25 times. + # + def test_another_fibonacci + x = 1 + y = 1 + EM.run { + 25.times { + s = EM.spawn {x,y = y,x+y} + s.notify + } + + t = EM.spawn {EM.stop} + t.notify + } + assert_equal( 121393, x) + assert_equal( 196418, y) + end + + + # Make a chain of processes that notify each other in turn + # with intermediate fibonacci results. The final process in + # the chain stops the loop and returns the result. + # + def test_fibonacci_chain + a,b = nil + + EM.run { + nextpid = EM.spawn {|x,y| + a,b = x,y + EM.stop + } + + 25.times { + n = nextpid + nextpid = EM.spawn {|x,y| n.notify( y, x+y )} + } + + nextpid.notify( 1, 1 ) + } + + assert_equal( 121393, a) + assert_equal( 196418, b) + end + + + # EM#yield gives a spawed process to yield control to other processes + # (in other words, to stop running), and to specify a different code block + # that will run on its next notification. + # + def test_yield + a = 0 + EM.run { + n = EM.spawn { + a += 10 + EM.yield { + a += 20 + EM.yield { + a += 30 + EM.stop + } + } + } + n.notify + n.notify + n.notify + } + assert_equal( 60, a ) + end + + # EM#yield_and_notify behaves like EM#yield, except that it also notifies the + # yielding process. This may sound trivial, since the yield block will run very + # shortly after with no action by the program, but this actually can be very useful, + # because it causes the reactor core to execute once before the yielding process + # gets control back. So it can be used to allow heavily-used network connections + # to clear buffers, or allow other processes to process their notifications. + # + # Notice in this test code that only a simple notify is needed at the bottom + # of the initial block. Even so, all of the yielded blocks will execute. + # + def test_yield_and_notify + a = 0 + EM.run { + n = EM.spawn { + a += 10 + EM.yield_and_notify { + a += 20 + EM.yield_and_notify { + a += 30 + EM.stop + } + } + } + n.notify + } + assert_equal( 60, a ) + end + + # resume is an alias for notify. + # + def test_resume + EM.run { + n = EM.spawn {EM.stop} + n.resume + } + assert true + end + + # run is an idiomatic alias for notify. + # + def test_run + EM.run { + (EM.spawn {EM.stop}).run + } + assert true + end + + + # Clones the ping-pong example from the Erlang tutorial, in much less code. + # Illustrates that a spawned block executes in the context of a SpawnableObject. + # (Meaning, we can pass self as a parameter to another process that can then + # notify us.) + # + def test_ping_pong + n_pongs = 0 + EM.run { + pong = EM.spawn {|x, ping| + n_pongs += 1 + ping.notify( x-1 ) + } + ping = EM.spawn {|x| + if x > 0 + pong.notify x, self + else + EM.stop + end + } + ping.notify 3 + } + assert_equal( 3, n_pongs ) + end + + # Illustrates that you can call notify inside a notification, and it will cause + # the currently-executing process to be re-notified. Of course, the new notification + # won't run until sometime after the current one completes. + # + def test_self_notify + n = 0 + EM.run { + pid = EM.spawn {|x| + if x > 0 + n += x + notify( x-1 ) + else + EM.stop + end + } + pid.notify 3 + } + assert_equal( 6, n ) + end + + + # Illustrates that the block passed to #spawn executes in the context of a + # SpawnedProcess object, NOT in the local context. This can often be deceptive. + # + class BlockScopeTest + attr_reader :var + def run + # The following line correctly raises a NameError. + # The problem is that the programmer expected the spawned block to + # execute in the local context, but it doesn't. + # + # (EM.spawn { do_something }).notify ### NO! BAD! + + + + # The following line correctly passes self as a parameter to the + # notified process. + # + (EM.spawn {|obj| obj.do_something }).notify(self) + + + + # Here's another way to do it. This works because "myself" is bound + # in the local scope, unlike "self," so the spawned block sees it. + # + myself = self + (EM.spawn { myself.do_something }).notify + + + + # And we end the loop. + # This is a tangential point, but observe that #notify never blocks. + # It merely appends a message to the internal queue of a spawned process + # and returns. As it turns out, the reactor processes notifications for ALL + # spawned processes in the order that #notify is called. So there is a + # reasonable expectation that the process which stops the reactor will + # execute after the previous ones in this method. HOWEVER, this is NOT + # a documented behavior and is subject to change. + # + (EM.spawn {EM.stop}).notify + end + def do_something + @var ||= 0 + @var += 100 + end + end + + def test_block_scope + bs = BlockScopeTest.new + EM.run { + bs.run + } + assert_equal( 200, bs.var ) + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_args.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_args.rb new file mode 100644 index 0000000..d337628 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_args.rb @@ -0,0 +1,78 @@ +require "test/unit" +require 'tempfile' + +require 'em_test_helper' + +module EM + def self._set_mocks + class < priv_file) + end + assert_raises(EM::FileNotFoundException) do + conn.start_tls(:cert_chain_file => cert_file) + end + assert_raises(EM::FileNotFoundException) do + conn.start_tls(:private_key_file => priv_file, :cert_chain_file => cert_file) + end + end + + def test_tls_params_file_does_exist + priv_file = Tempfile.new('em_test') + cert_file = Tempfile.new('em_test') + priv_file_path = priv_file.path + cert_file_path = cert_file.path + conn = EM::Connection.new('foo') + params = {:private_key_file => priv_file_path, :cert_chain_file => cert_file_path} + begin + conn.start_tls params + rescue Object + assert(false, 'should not have raised an exception') + end + end +end if EM.ssl? diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_dhparam.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_dhparam.rb new file mode 100644 index 0000000..85f52d2 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_dhparam.rb @@ -0,0 +1,84 @@ +require 'em_test_helper' + +class TestSslDhParam < Test::Unit::TestCase + def setup + $dir = File.dirname(File.expand_path(__FILE__)) + '/' + $dhparam_file = File.join($dir, 'dhparam.pem') + end + + module Client + def post_init + start_tls + end + + def ssl_handshake_completed + $client_handshake_completed = true + $client_cipher_name = get_cipher_name + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + module Server + def post_init + start_tls(:dhparam => $dhparam_file, :cipher_list => "DHE,EDH") + end + + def ssl_handshake_completed + $server_handshake_completed = true + $server_cipher_name = get_cipher_name + end + end + + module NoDhServer + def post_init + start_tls(:cipher_list => "DHE,EDH") + end + + def ssl_handshake_completed + $server_handshake_completed = true + $server_cipher_name = get_cipher_name + end + end + + def test_no_dhparam + omit_unless(EM.ssl?) + omit_if(EM.library_type == :pure_ruby) # DH will work with defaults + omit_if(rbx?) + + $client_handshake_completed, $server_handshake_completed = false, false + $server_cipher_name, $client_cipher_name = nil, nil + + EM.run { + EM.start_server("127.0.0.1", 16784, NoDhServer) + EM.connect("127.0.0.1", 16784, Client) + } + + assert(!$client_handshake_completed) + assert(!$server_handshake_completed) + end + + def test_dhparam + omit_unless(EM.ssl?) + omit_if(rbx?) + + $client_handshake_completed, $server_handshake_completed = false, false + $server_cipher_name, $client_cipher_name = nil, nil + + EM.run { + EM.start_server("127.0.0.1", 16784, Server) + EM.connect("127.0.0.1", 16784, Client) + } + + assert($client_handshake_completed) + assert($server_handshake_completed) + + assert($client_cipher_name.length > 0) + assert_equal($client_cipher_name, $server_cipher_name) + + assert_match(/^(DHE|EDH)/, $client_cipher_name) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_ecdh_curve.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_ecdh_curve.rb new file mode 100644 index 0000000..8dc167b --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_ecdh_curve.rb @@ -0,0 +1,80 @@ +require 'em_test_helper' + +class TestSslEcdhCurve < Test::Unit::TestCase + module Client + def post_init + start_tls + end + + def ssl_handshake_completed + $client_handshake_completed = true + $client_cipher_name = get_cipher_name + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + module Server + def post_init + start_tls(:ecdh_curve => "prime256v1", :cipher_list => "ECDH") + end + + def ssl_handshake_completed + $server_handshake_completed = true + $server_cipher_name = get_cipher_name + end + end + + module NoCurveServer + def post_init + start_tls(:cipher_list => "ECDH") + end + + def ssl_handshake_completed + $server_handshake_completed = true + $server_cipher_name = get_cipher_name + end + end + + def test_no_ecdh_curve + omit_unless(EM.ssl?) + omit_if(rbx?) + + $client_handshake_completed, $server_handshake_completed = false, false + + EM.run { + EM.start_server("127.0.0.1", 16784, NoCurveServer) + EM.connect("127.0.0.1", 16784, Client) + } + + assert(!$client_handshake_completed) + assert(!$server_handshake_completed) + end + + def test_ecdh_curve + omit_unless(EM.ssl?) + omit_if(EM.library_type == :pure_ruby && RUBY_VERSION < "2.3.0") + omit_if(rbx?) + + $client_handshake_completed, $server_handshake_completed = false, false + $server_cipher_name, $client_cipher_name = nil, nil + + EM.run { + EM.start_server("127.0.0.1", 16784, Server) + EM.connect("127.0.0.1", 16784, Client) + } + + assert($client_handshake_completed) + assert($server_handshake_completed) + + assert($client_cipher_name.length > 0) + assert_equal($client_cipher_name, $server_cipher_name) + + assert_match(/^(AECDH|ECDHE)/, $client_cipher_name) + end + + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_extensions.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_extensions.rb new file mode 100644 index 0000000..0610ba8 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_extensions.rb @@ -0,0 +1,49 @@ +require 'em_test_helper' + +require 'socket' +require 'openssl' + +if EM.ssl? + class TestSslExtensions < Test::Unit::TestCase + + module Client + def ssl_handshake_completed + $client_handshake_completed = true + close_connection + end + + def unbind + EM.stop_event_loop + end + + def post_init + start_tls(:ssl_version => :tlsv1, :sni_hostname => 'example.com') + end + end + + module Server + def ssl_handshake_completed + $server_handshake_completed = true + $server_sni_hostname = get_sni_hostname + end + + def post_init + start_tls(:ssl_version => :TLSv1) + end + end + + def test_tlsext_sni_hostname + $server_handshake_completed = false + + EM.run do + EM.start_server("127.0.0.1", 16784, Server) + EM.connect("127.0.0.1", 16784, Client) + end + + assert($server_handshake_completed) + assert_equal('example.com', $server_sni_hostname) + end + end +else + warn "EM built without SSL support, skipping tests in #{__FILE__}" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_methods.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_methods.rb new file mode 100644 index 0000000..c2e5744 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_methods.rb @@ -0,0 +1,65 @@ +require 'em_test_helper' + +class TestSSLMethods < Test::Unit::TestCase + + module ServerHandler + def post_init + start_tls + end + + def ssl_handshake_completed + $server_called_back = true + $server_cert_value = get_peer_cert + $server_cipher_bits = get_cipher_bits + $server_cipher_name = get_cipher_name + $server_cipher_protocol = get_cipher_protocol + end + end + + module ClientHandler + def post_init + start_tls + end + + def ssl_handshake_completed + $client_called_back = true + $client_cert_value = get_peer_cert + $client_cipher_bits = get_cipher_bits + $client_cipher_name = get_cipher_name + $client_cipher_protocol = get_cipher_protocol + EM.stop_event_loop + end + end + + def test_ssl_methods + omit_unless(EM.ssl?) + omit_if(rbx?) + $server_called_back, $client_called_back = false, false + $server_cert_value, $client_cert_value = nil, nil + $server_cipher_bits, $client_cipher_bits = nil, nil + $server_cipher_name, $client_cipher_name = nil, nil + $server_cipher_protocol, $client_cipher_protocol = nil, nil + + EM.run { + EM.start_server("127.0.0.1", 9999, ServerHandler) + EM.connect("127.0.0.1", 9999, ClientHandler) + } + + assert($server_called_back) + assert($client_called_back) + + assert($server_cert_value.is_a?(NilClass)) + assert($client_cert_value.is_a?(String)) + + assert($client_cipher_bits > 0) + assert_equal($client_cipher_bits, $server_cipher_bits) + + assert($client_cipher_name.length > 0) + assert_match(/AES/, $client_cipher_name) + assert_equal($client_cipher_name, $server_cipher_name) + + assert_match(/TLS/, $client_cipher_protocol) + assert_equal($client_cipher_protocol, $server_cipher_protocol) + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_protocols.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_protocols.rb new file mode 100644 index 0000000..bcb6824 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_protocols.rb @@ -0,0 +1,246 @@ +require 'em_test_helper' + +require 'socket' +require 'openssl' + +if EM.ssl? + class TestSslProtocols < Test::Unit::TestCase + + module Client + def ssl_handshake_completed + $client_handshake_completed = true + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + module Server + def ssl_handshake_completed + $server_handshake_completed = true + end + end + + module ClientAny + include Client + def post_init + start_tls(:ssl_version => %w(sslv2 sslv3 tlsv1 tlsv1_1 tlsv1_2)) + end + end + + module ClientDefault + include Client + def post_init + start_tls + end + end + + module ClientSSLv3 + include Client + def post_init + start_tls(:ssl_version => %w(SSLv3)) + end + end + + module ServerSSLv3 + include Server + def post_init + start_tls(:ssl_version => %w(SSLv3)) + end + end + + module ServerTLSv1CaseInsensitive + include Server + def post_init + start_tls(:ssl_version => %w(tlsv1)) + end + end + + module ServerAny + include Server + def post_init + start_tls(:ssl_version => %w(sslv2 sslv3 tlsv1 tlsv1_1 tlsv1_2)) + end + end + + module ServerDefault + include Server + def post_init + start_tls + end + end + + module InvalidProtocol + include Client + def post_init + start_tls(:ssl_version => %w(tlsv1 badinput)) + end + end + + def test_invalid_ssl_version + assert_raises(RuntimeError, "Unrecognized SSL/TLS Version: badinput") do + EM.run do + EM.start_server("127.0.0.1", 16784, InvalidProtocol) + EM.connect("127.0.0.1", 16784, InvalidProtocol) + end + end + end + + def test_any_to_v3 + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerSSLv3) + EM.connect("127.0.0.1", 16784, ClientAny) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_case_insensitivity + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerTLSv1CaseInsensitive) + EM.connect("127.0.0.1", 16784, ClientAny) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_v3_to_any + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerAny) + EM.connect("127.0.0.1", 16784, ClientSSLv3) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_v3_to_v3 + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerSSLv3) + EM.connect("127.0.0.1", 16784, ClientSSLv3) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_any_to_any + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerAny) + EM.connect("127.0.0.1", 16784, ClientAny) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_default_to_default + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerDefault) + EM.connect("127.0.0.1", 16784, ClientDefault) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + module ServerV3StopAfterHandshake + def post_init + start_tls(:ssl_version => %w(SSLv3)) + end + + def ssl_handshake_completed + $server_handshake_completed = true + EM.stop_event_loop + end + end + + module ServerTLSv1StopAfterHandshake + def post_init + start_tls(:ssl_version => %w(TLSv1)) + end + + def ssl_handshake_completed + $server_handshake_completed = true + EM.stop_event_loop + end + end + + def test_v3_with_external_client + $server_handshake_completed = false + EM.run do + setup_timeout(2) + EM.start_server("127.0.0.1", 16784, ServerV3StopAfterHandshake) + EM.defer do + sock = TCPSocket.new("127.0.0.1", 16784) + ctx = OpenSSL::SSL::SSLContext.new + ctx.ssl_version = :SSLv3_client + ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx) + ssl.connect + ssl.close rescue nil + sock.close rescue nil + end + end + + assert($server_handshake_completed) + end + + def test_tlsv1_with_external_client + $server_handshake_completed = false + EM.run do + setup_timeout(2) + EM.start_server("127.0.0.1", 16784, ServerTLSv1StopAfterHandshake) + EM.defer do + sock = TCPSocket.new("127.0.0.1", 16784) + ctx = OpenSSL::SSL::SSLContext.new + ctx.ssl_version = :TLSv1_client + ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx) + ssl.connect + ssl.close rescue nil + sock.close rescue nil + end + end + + assert($server_handshake_completed) + end + + def test_tlsv1_required_with_external_client + $server_handshake_completed = false + + EM.run do + n = 0 + EM.add_periodic_timer(0.5) do + n += 1 + (EM.stop rescue nil) if n == 2 + end + EM.start_server("127.0.0.1", 16784, ServerTLSv1StopAfterHandshake) + EM.defer do + sock = TCPSocket.new("127.0.0.1", 16784) + ctx = OpenSSL::SSL::SSLContext.new + ctx.ssl_version = :SSLv3_client + ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx) + assert_raise OpenSSL::SSL::SSLError do + ssl.connect + end + ssl.close rescue nil + sock.close rescue nil + EM.stop rescue nil + end + end + + assert(!$server_handshake_completed) + end + end +else + warn "EM built without SSL support, skipping tests in #{__FILE__}" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_verify.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_verify.rb new file mode 100644 index 0000000..a6d8fca --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ssl_verify.rb @@ -0,0 +1,128 @@ +require 'em_test_helper' + +class TestSslVerify < Test::Unit::TestCase + def setup + $dir = File.dirname(File.expand_path(__FILE__)) + '/' + $cert_from_file = File.read($dir+'client.crt') + end + + module ClientNoCert + def connection_completed + start_tls() + end + + def ssl_handshake_completed + $client_handshake_completed = true + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + module Client + def connection_completed + start_tls(:private_key_file => $dir+'client.key', :cert_chain_file => $dir+'client.crt') + end + + def ssl_handshake_completed + $client_handshake_completed = true + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + module AcceptServer + def post_init + start_tls(:verify_peer => true) + end + + def ssl_verify_peer(cert) + $cert_from_server = cert + true + end + + def ssl_handshake_completed + $server_handshake_completed = true + end + end + + module DenyServer + def post_init + start_tls(:verify_peer => true) + end + + def ssl_verify_peer(cert) + $cert_from_server = cert + # Do not accept the peer. This should now cause the connection to shut down without the SSL handshake being completed. + false + end + + def ssl_handshake_completed + $server_handshake_completed = true + end + end + + module FailServerNoPeerCert + def post_init + start_tls(:verify_peer => true, :fail_if_no_peer_cert => true) + end + + def ssl_verify_peer(cert) + raise "Verify peer should not get called for a client without a certificate" + end + + def ssl_handshake_completed + $server_handshake_completed = true + end + end + + def test_fail_no_peer_cert + omit_unless(EM.ssl?) + omit_if(rbx?) + + $client_handshake_completed, $server_handshake_completed = false, false + + EM.run { + EM.start_server("127.0.0.1", 16784, FailServerNoPeerCert) + EM.connect("127.0.0.1", 16784, ClientNoCert) + } + + assert(!$client_handshake_completed) + assert(!$server_handshake_completed) + end + + def test_accept_server + omit_unless(EM.ssl?) + omit_if(EM.library_type == :pure_ruby) # Server has a default cert chain + omit_if(rbx?) + $client_handshake_completed, $server_handshake_completed = false, false + EM.run { + EM.start_server("127.0.0.1", 16784, AcceptServer) + EM.connect("127.0.0.1", 16784, Client).instance_variable_get("@signature") + } + + assert_equal($cert_from_file, $cert_from_server) + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_deny_server + omit_unless(EM.ssl?) + omit_if(EM.library_type == :pure_ruby) # Server has a default cert chain + omit_if(rbx?) + $client_handshake_completed, $server_handshake_completed = false, false + EM.run { + EM.start_server("127.0.0.1", 16784, DenyServer) + EM.connect("127.0.0.1", 16784, Client) + } + + assert_equal($cert_from_file, $cert_from_server) + assert(!$client_handshake_completed) + assert(!$server_handshake_completed) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_stomp.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_stomp.rb new file mode 100644 index 0000000..53c0502 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_stomp.rb @@ -0,0 +1,38 @@ +require 'em_test_helper' + +class TestStomp < Test::Unit::TestCase + CONTENT_LENGTH_REGEX = /^content-length: (\d+)$/ + + def bytesize(str) + str = str.to_s + size = str.bytesize if str.respond_to?(:bytesize) # bytesize added in 1.9 + size || str.size + end + + class TStomp + include EM::P::Stomp + + def last_sent_content_length + @sent && Integer(@sent[CONTENT_LENGTH_REGEX, 1]) + end + + def send_data(string) + @sent = string + end + end + + def test_content_length_in_bytes + connection = TStomp.new + + queue = "queue" + failure_message = "header content-length is not the byte size of last sent body" + + body = "test" + connection.send queue, body + assert_equal bytesize(body), connection.last_sent_content_length, failure_message + + body = "test\u221A" + connection.send queue, body + assert_equal bytesize(body), connection.last_sent_content_length, failure_message + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_system.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_system.rb new file mode 100644 index 0000000..fbbe2c9 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_system.rb @@ -0,0 +1,46 @@ +# coding: utf-8 +require 'em_test_helper' + +class TestSystem < Test::Unit::TestCase + def setup + @filename = File.expand_path("../Ñ Ð¼Ð°Ð½Ð°Ð» dump.txt", __FILE__) + @test_data = 'a' * 100 + File.open(@filename, 'w'){|f| f.write(@test_data)} + end + + def test_system + omit_if(windows?) + + result = nil + status = nil + EM.run { + EM.system('cat', @filename){|out, state| + result = out + status = state.exitstatus + EM.stop + } + } + assert_equal(0, status) + assert_equal(@test_data, result) + end + + def test_system_with_string + omit_if(windows?) + + result = nil + status = nil + EM.run { + EM.system("cat '#@filename'"){|out, state| + result = out + status = state.exitstatus + EM.stop + } + } + assert_equal(0, status) + assert_equal(@test_data, result) + end + + def teardown + File.unlink(@filename) + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_threaded_resource.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_threaded_resource.rb new file mode 100644 index 0000000..9bb39c6 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_threaded_resource.rb @@ -0,0 +1,63 @@ +require 'em_test_helper' + +class TestThreadedResource < Test::Unit::TestCase + def object + @object ||= {} + end + + def resource + @resource = EM::ThreadedResource.new do + object + end + end + + def teardown + resource.shutdown + end + + def test_dispatch_completion + EM.run do + EM.add_timer(3) do + EM.stop + fail 'Resource dispatch timed out' + end + completion = resource.dispatch do |o| + o[:foo] = :bar + :foo + end + completion.callback do |result| + assert_equal :foo, result + EM.stop + end + completion.errback do |error| + EM.stop + fail "Unexpected error: #{error.message}" + end + end + assert_equal :bar, object[:foo] + end + + def test_dispatch_failure + completion = resource.dispatch do |o| + raise 'boom' + end + completion.errback do |error| + assert_kind_of RuntimeError, error + assert_equal 'boom', error.message + end + end + + def test_dispatch_threading + main = Thread.current + resource.dispatch do |o| + o[:dispatch_thread] = Thread.current + end + assert_not_equal main, object[:dispatch_thread] + end + + def test_shutdown + # This test should get improved sometime. The method returning thread is + # NOT an api that will be maintained. + assert !resource.shutdown.alive? + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_tick_loop.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_tick_loop.rb new file mode 100644 index 0000000..39d86b5 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_tick_loop.rb @@ -0,0 +1,59 @@ +require "test/unit" +require 'em_test_helper' + +class TestEmTickLoop < Test::Unit::TestCase + def test_em_tick_loop + i = 0 + EM.tick_loop { i += 1; EM.stop if i == 10 } + EM.run { EM.add_timer(1) { EM.stop } } + assert_equal i, 10 + end + + def test_tick_loop_on_stop + t = nil + tick_loop = EM.tick_loop { :stop } + tick_loop.on_stop { t = true } + EM.run { EM.next_tick { EM.stop } } + assert t + end + + def test_start_twice + i = 0 + s = 0 + tick_loop = EM.tick_loop { i += 1; :stop } + tick_loop.on_stop { s += 1; EM.stop } + EM.run { EM.next_tick { EM.stop } } + assert_equal 1, i + assert_equal 1, s + tick_loop.start + EM.run { EM.next_tick { EM.stop } } + assert_equal 2, i + assert_equal 1, s # stop callbacks are only called once + end + + def test_stop + i, s = 0, 0 + tick_loop = EM.tick_loop { i += 1 } + tick_loop.on_stop { s += 1 } + EM.run { EM.next_tick { tick_loop.stop; EM.next_tick { EM.stop } } } + assert tick_loop.stopped? + assert_equal 1, i + assert_equal 1, s + end + + def test_immediate_stops + s = 0 + tick_loop = EM::TickLoop.new { } + tick_loop.on_stop { s += 1 } + tick_loop.on_stop { s += 1 } + assert_equal 2, s + end + + def test_stopped + tick_loop = EM::TickLoop.new { } + assert tick_loop.stopped? + tick_loop.start + assert !tick_loop.stopped? + end + +end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_timers.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_timers.rb new file mode 100644 index 0000000..88b3b78 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_timers.rb @@ -0,0 +1,130 @@ +require 'em_test_helper' + +class TestTimers < Test::Unit::TestCase + + def test_timer_with_block + x = false + EM.run { + EM::Timer.new(0) { + x = true + EM.stop + } + } + assert x + end + + def test_timer_with_proc + x = false + EM.run { + EM::Timer.new(0, proc { + x = true + EM.stop + }) + } + assert x + end + + def test_timer_cancel + assert_nothing_raised do + EM.run { + timer = EM::Timer.new(0.01) { flunk "Timer was not cancelled." } + timer.cancel + + EM.add_timer(0.02) { EM.stop } + } + end + end + + def test_periodic_timer + x = 0 + EM.run { + EM::PeriodicTimer.new(0.01) do + x += 1 + EM.stop if x == 4 + end + } + + assert_equal 4, x + end + + def test_add_periodic_timer + x = 0 + EM.run { + t = EM.add_periodic_timer(0.01) do + x += 1 + EM.stop if x == 4 + end + assert t.respond_to?(:cancel) + } + assert_equal 4, x + end + + def test_periodic_timer_cancel + x = 0 + EM.run { + pt = EM::PeriodicTimer.new(0.01) { x += 1 } + pt.cancel + EM::Timer.new(0.02) { EM.stop } + } + assert_equal 0, x + end + + def test_add_periodic_timer_cancel + x = 0 + EM.run { + pt = EM.add_periodic_timer(0.01) { x += 1 } + EM.cancel_timer(pt) + EM.add_timer(0.02) { EM.stop } + } + assert_equal 0, x + end + + def test_periodic_timer_self_cancel + x = 0 + EM.run { + pt = EM::PeriodicTimer.new(0) { + x += 1 + if x == 4 + pt.cancel + EM.stop + end + } + } + assert_equal 4, x + end + + def test_oneshot_timer_large_future_value + large_value = 11948602000 + EM.run { + EM.add_timer(large_value) { EM.stop } + EM.add_timer(0.02) { EM.stop } + } + end + + # This test is only applicable to compiled versions of the reactor. + # Pure ruby and java versions have no built-in limit on the number of outstanding timers. + unless [:pure_ruby, :java].include? EM.library_type + def test_timer_change_max_outstanding + defaults = EM.get_max_timers + EM.set_max_timers(100) + + one_hundred_one_timers = lambda do + 101.times { EM.add_timer(0.01) {} } + EM.stop + end + + assert_raises(RuntimeError) do + EM.run( &one_hundred_one_timers ) + end + + EM.set_max_timers( 101 ) + + assert_nothing_raised do + EM.run( &one_hundred_one_timers ) + end + ensure + EM.set_max_timers(defaults) + end + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ud.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ud.rb new file mode 100644 index 0000000..3559756 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_ud.rb @@ -0,0 +1,8 @@ +require 'em_test_helper' + +class TestUserDefinedEvents < Test::Unit::TestCase + + def test_a + end + +end diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_unbind_reason.rb b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_unbind_reason.rb new file mode 100644 index 0000000..ff9193e --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/tests/test_unbind_reason.rb @@ -0,0 +1,40 @@ +require 'em_test_helper' + +class TestUnbindReason < Test::Unit::TestCase + + class StubConnection < EM::Connection + attr_reader :error + def unbind(reason = nil) + @error = reason + EM.stop + end + end + + # RFC 5737 Address Blocks Reserved for Documentation + def test_connect_timeout + conn = nil + EM.run do + conn = EM.connect '192.0.2.0', 80, StubConnection + conn.pending_connect_timeout = 1 + end + assert_equal Errno::ETIMEDOUT, conn.error + end + + def test_connect_refused + pend('FIXME: this test is broken on Windows') if windows? + conn = nil + EM.run do + conn = EM.connect '127.0.0.1', 12388, StubConnection + end + assert_equal Errno::ECONNREFUSED, conn.error + end + + def test_optional_argument + pend('FIXME: this test is broken on Windows') if windows? + conn = nil + EM.run do + conn = EM.connect '127.0.0.1', 12388, StubConnection + end + assert_equal Errno::ECONNREFUSED, conn.error + end +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/COPYING b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/COPYING new file mode 100644 index 0000000..7622318 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/COPYING @@ -0,0 +1,49 @@ +Copyright (c) 2008-2013, Ruby FFI project contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Ruby FFI project nor the + names of its contributors may 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 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. + +libffi, used by this project, is licensed under the MIT license: + +libffi - Copyright (c) 1996-2011 Anthony Green, Red Hat, Inc and others. +See source files for details. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/LICENSE b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/LICENSE new file mode 100644 index 0000000..20185fd --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2008-2016, Ruby FFI project contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Ruby FFI project nor the + names of its contributors may 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 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. diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/README.md b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/README.md new file mode 100644 index 0000000..8ab8efa --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/README.md @@ -0,0 +1,111 @@ +# ruby-ffi https://wiki.github.com/ffi/ffi [![Build Status](https://travis-ci.org/ffi/ffi.png?branch=master)](https://travis-ci.org/ffi/ffi) + +## Description + +Ruby-FFI is a ruby extension for programmatically loading dynamic +libraries, binding functions within them, and calling those functions +from Ruby code. Moreover, a Ruby-FFI extension works without changes +on Ruby and JRuby. [Discover why you should write your next extension +using Ruby-FFI](https://wiki.github.com/ffi/ffi/why-use-ffi). + +## Features/problems + +* Intuitive DSL +* Supports all C native types +* C structs (also nested), enums and global variables +* Callbacks from C to ruby +* Automatic garbage collection of native memory + +## Synopsis + +```ruby +require 'ffi' + +module MyLib + extend FFI::Library + ffi_lib 'c' + attach_function :puts, [ :string ], :int +end + +MyLib.puts 'Hello, World using libc!' +``` + +For less minimalistic and more sane examples you may look at: + +* the samples/ folder +* the examples on the [wiki](https://wiki.github.com/ffi/ffi) +* the projects using FFI listed on this page (https://wiki.github.com/ffi/ffi/projects-using-ffi) + +## Requirements + +You need a sane building environment in order to compile the extension. +At a minimum, you will need: +* A C compiler (e.g. Xcode on OSX, gcc on everything else) +* libffi development library - this is commonly in the libffi-dev or libffi-devel + +On Linux systems running with [PaX](https://en.wikipedia.org/wiki/PaX) (Gentoo, Alpine, etc.) FFI may trigger `mprotrect` errors. You may need to disable [mprotect](https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Restrict_mprotect.28.29) for ruby (`paxctl -m [/path/to/ruby]`) for the time being until a solution is found. + +## Installation + +From rubygems: + + [sudo] gem install ffi + +or from the git repository on github: + + git clone git://github.com/ffi/ffi.git + cd ffi + rake gem:install + +## License + +The ffi library is covered by the BSD license, also see the LICENSE file. +The specs are shared with Rubyspec and are licensed by the same license +as Rubyspec, see the LICENSE.SPECS file. + +## Credits + +The following people have submitted code, bug reports, or otherwise contributed to the success of this project: + +* Alban Peignier +* Aman Gupta +* Andrea Fazzi +* Andreas Niederl +* Andrew Cholakian +* Antonio Terceiro +* Brian Candler +* Brian D. Burns +* Bryan Kearney +* Charlie Savage +* Chikanaga Tomoyuki +* Hongli Lai +* Ian MacLeod +* Jake Douglas +* Jean-Dominique Morani +* Jeremy Hinegardner +* Jesús García Sáez +* Joe Khoobyar +* Jurij Smakov +* KISHIMOTO, Makoto +* Kim Burgestrand +* Lars Kanis +* Luc Heinrich +* Luis Lavena +* Matijs van Zuijlen +* Matthew King +* Mike Dalessio +* NARUSE, Yui +* Park Heesob +* Shin Yee +* Stephen Bannasch +* Suraj N. Kurapati +* Sylvain Daubert +* Victor Costan +* beoran@gmail.com +* ctide +* emboss +* hobophobe +* meh +* postmodern +* wycats@gmail.com +* Wayne Meissner diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/Rakefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/Rakefile new file mode 100644 index 0000000..c8e4cf3 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/Rakefile @@ -0,0 +1,232 @@ +require 'rubygems/tasks' +require 'rbconfig' +require 'rake/clean' +require File.expand_path("./lib/ffi/version") + +USE_RAKE_COMPILER = (RUBY_PLATFORM =~ /java/) ? false : true +if USE_RAKE_COMPILER + require 'rake/extensiontask' +end + +require 'date' +require 'fileutils' +require 'rbconfig' +require 'rspec/core/rake_task' +require 'rubygems/package_task' + +LIBEXT = case RbConfig::CONFIG['host_os'].downcase + when /darwin/ + "dylib" + when /mswin|mingw/ + "dll" + else + RbConfig::CONFIG['DLEXT'] + end + +CPU = case RbConfig::CONFIG['host_cpu'].downcase + when /i[3456]86/ + # Darwin always reports i686, even when running in 64bit mode + if RbConfig::CONFIG['host_os'] =~ /darwin/ && 0xfee1deadbeef.is_a?(Fixnum) + "x86_64" + else + "i386" + end + + when /amd64|x86_64/ + "x86_64" + + when /ppc64|powerpc64/ + "powerpc64" + + when /ppc|powerpc/ + "powerpc" + + when /^arm/ + "arm" + + else + RbConfig::CONFIG['host_cpu'] + end + +OS = case RbConfig::CONFIG['host_os'].downcase + when /linux/ + "linux" + when /darwin/ + "darwin" + when /freebsd/ + "freebsd" + when /openbsd/ + "openbsd" + when /sunos|solaris/ + "solaris" + when /mswin|mingw/ + "win32" + else + RbConfig::CONFIG['host_os'].downcase + end + +GMAKE = system('which gmake >/dev/null') && 'gmake' || 'make' + +LIBTEST = "build/libtest.#{LIBEXT}" +BUILD_DIR = "build" +BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUBY_VERSION) + +def gem_spec + @gem_spec ||= Gem::Specification.load('ffi.gemspec') +end + +TEST_DEPS = [ LIBTEST ] +if RUBY_PLATFORM == "java" + RSpec::Core::RakeTask.new(:spec) do |config| + config.rspec_opts = YAML.load_file 'spec/spec.opts' + end +else + RSpec::Core::RakeTask.new(:spec => :compile) do |config| + config.rspec_opts = YAML.load_file 'spec/spec.opts' + end + + TEST_DEPS.unshift :compile +end + +desc "Build all packages" +task :package => 'gem:package' + +CLOBBER.include 'lib/ffi/types.conf' +CLOBBER.include 'pkg' +CLOBBER.include 'log' + +CLEAN.include 'build' +CLEAN.include 'conftest.dSYM' +CLEAN.include 'spec/ffi/fixtures/libtest.{dylib,so,dll}' +CLEAN.include 'spec/ffi/fixtures/*.o' +CLEAN.include "pkg/ffi-*-{mingw32,java}" +CLEAN.include 'lib/1.*' +CLEAN.include 'lib/2.*' +CLEAN.include 'bin' + +task :distclean => :clobber + +desc "Build the native test lib" +file "build/libtest.#{LIBEXT}" => FileList['libtest/**/*.[ch]'] do + sh %{#{GMAKE} -f libtest/GNUmakefile CPU=#{CPU} OS=#{OS} } +end + + +desc "Build test helper lib" +task :libtest => "build/libtest.#{LIBEXT}" + +desc "Test the extension" +task :test => [ :spec ] + + +namespace :bench do + ITER = ENV['ITER'] ? ENV['ITER'].to_i : 100000 + bench_libs = "-Ilib -I#{BUILD_DIR}" unless RUBY_PLATFORM == "java" + bench_files = Dir["bench/bench_*.rb"].reject { |f| f == "bench_helper.rb" } + bench_files.each do |bench| + task File.basename(bench, ".rb")[6..-1] => TEST_DEPS do + sh %{#{Gem.ruby} #{bench_libs} #{bench} #{ITER}} + end + end + task :all => TEST_DEPS do + bench_files.each do |bench| + sh %{#{Gem.ruby} #{bench_libs} #{bench}} + end + end +end + +task 'spec:run' => TEST_DEPS +task 'spec:specdoc' => TEST_DEPS + +task :default => :spec + +namespace 'java' do + + java_gem_spec = Gem::Specification.new do |s| + s.name = gem_spec.name + s.version = gem_spec.version + s.author = gem_spec.author + s.email = gem_spec.email + s.homepage = gem_spec.homepage + s.summary = gem_spec.summary + s.description = gem_spec.description + s.files = %w(LICENSE COPYING README.md Rakefile) + s.has_rdoc = false + s.license = gem_spec.license + s.platform = 'java' + end + + Gem::PackageTask.new(java_gem_spec) do |pkg| + pkg.need_zip = true + pkg.need_tar = true + pkg.package_dir = 'pkg' + end +end + +task 'gem:java' => 'java:gem' + + +if USE_RAKE_COMPILER + Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext| + ext.name = 'ffi_c' # indicate the name of the extension. + # ext.lib_dir = BUILD_DIR # put binaries into this folder. + ext.tmp_dir = BUILD_DIR # temporary folder used during compilation. + ext.cross_compile = true # enable cross compilation (requires cross compile toolchain) + ext.cross_platform = %w[i386-mingw32 x64-mingw32] # forces the Windows platform instead of the default one + end + + ENV['RUBY_CC_VERSION'] ||= '1.8.7:1.9.3:2.0.0:2.1.6:2.2.2:2.3.0' + + # To reduce the gem file size strip mingw32 dlls before packaging + ENV['RUBY_CC_VERSION'].to_s.split(':').each do |ruby_version| + task "build/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" do |t| + sh "i686-w64-mingw32-strip -S build/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" + end + + task "build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" do |t| + sh "x86_64-w64-mingw32-strip -S build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" + end + end + + desc "build a windows gem without all the ceremony." + task "gem:windows" do + require "rake_compiler_dock" + RakeCompilerDock.sh "bundle && rake cross native gem MAKE='nice make -j`nproc`'" + end +end + +$LOAD_PATH.unshift File.join(File.dirname(__FILE__), 'lib') +require 'ffi/platform' +types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf')) +logfile = File.join(File.dirname(__FILE__), 'types_log') + +file types_conf => File.join("lib", "ffi", "version.rb") do |task| + require 'fileutils' + require 'ffi/tools/types_generator' + options = {} + FileUtils.mkdir_p(File.dirname(task.name), { :mode => 0755 }) + File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f| + f.puts FFI::TypesGenerator.generate(options) + end + File.open(logfile, 'w') do |log| + log.puts(types_conf) + end +end + +task :types_conf => types_conf do +end + +Gem::Tasks.new do |t| + t.scm.tag.format = '%s' +end + +begin + require 'yard' + + namespace :doc do + YARD::Rake::YardocTask.new do |yard| + end + end +rescue LoadError + warn "[warn] YARD unavailable" +end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/.RUBYARCHDIR.time b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/.RUBYARCHDIR.time new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.c new file mode 100644 index 0000000..b81884a --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.c @@ -0,0 +1,1104 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (C) 2009 Jake Douglas + * Copyright (C) 2008 Luc Heinrich + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#include +#ifndef _MSC_VER +# include +# include +# include +#else +# include "win32/stdbool.h" +# include "win32/stdint.h" +#endif + +#include +#include + +#include "rbffi.h" +#include "compat.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "Function.h" +#include "LongDouble.h" + +#ifndef PRIsVALUE +# define PRIsVALUE "s" +#endif + +static inline char* memory_address(VALUE self); +VALUE rbffi_AbstractMemoryClass = Qnil; +static VALUE NullPointerErrorClass = Qnil; +static ID id_to_ptr = 0, id_plus = 0, id_call = 0; + +static VALUE +memory_allocate(VALUE klass) +{ + AbstractMemory* memory; + VALUE obj; + obj = Data_Make_Struct(klass, AbstractMemory, NULL, -1, memory); + memory->flags = MEM_RD | MEM_WR; + + return obj; +} +#define VAL(x, swap) (unlikely(((memory->flags & MEM_SWAP) != 0)) ? swap((x)) : (x)) + +#define NUM_OP(name, type, toNative, fromNative, swap) \ +static void memory_op_put_##name(AbstractMemory* memory, long off, VALUE value); \ +static void \ +memory_op_put_##name(AbstractMemory* memory, long off, VALUE value) \ +{ \ + type tmp = (type) VAL(toNative(value), swap); \ + checkWrite(memory); \ + checkBounds(memory, off, sizeof(type)); \ + memcpy(memory->address + off, &tmp, sizeof(tmp)); \ +} \ +static VALUE memory_put_##name(VALUE self, VALUE offset, VALUE value); \ +static VALUE \ +memory_put_##name(VALUE self, VALUE offset, VALUE value) \ +{ \ + AbstractMemory* memory; \ + Data_Get_Struct(self, AbstractMemory, memory); \ + memory_op_put_##name(memory, NUM2LONG(offset), value); \ + return self; \ +} \ +static VALUE memory_write_##name(VALUE self, VALUE value); \ +static VALUE \ +memory_write_##name(VALUE self, VALUE value) \ +{ \ + AbstractMemory* memory; \ + Data_Get_Struct(self, AbstractMemory, memory); \ + memory_op_put_##name(memory, 0, value); \ + return self; \ +} \ +static VALUE memory_op_get_##name(AbstractMemory* memory, long off); \ +static VALUE \ +memory_op_get_##name(AbstractMemory* memory, long off) \ +{ \ + type tmp; \ + checkRead(memory); \ + checkBounds(memory, off, sizeof(type)); \ + memcpy(&tmp, memory->address + off, sizeof(tmp)); \ + return fromNative(VAL(tmp, swap)); \ +} \ +static VALUE memory_get_##name(VALUE self, VALUE offset); \ +static VALUE \ +memory_get_##name(VALUE self, VALUE offset) \ +{ \ + AbstractMemory* memory; \ + Data_Get_Struct(self, AbstractMemory, memory); \ + return memory_op_get_##name(memory, NUM2LONG(offset)); \ +} \ +static VALUE memory_read_##name(VALUE self); \ +static VALUE \ +memory_read_##name(VALUE self) \ +{ \ + AbstractMemory* memory; \ + Data_Get_Struct(self, AbstractMemory, memory); \ + return memory_op_get_##name(memory, 0); \ +} \ +static MemoryOp memory_op_##name = { memory_op_get_##name, memory_op_put_##name }; \ +\ +static VALUE memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary); \ +static VALUE \ +memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary) \ +{ \ + long count = RARRAY_LEN(ary); \ + long off = NUM2LONG(offset); \ + AbstractMemory* memory = MEMORY(self); \ + long i; \ + checkWrite(memory); \ + checkBounds(memory, off, count * sizeof(type)); \ + for (i = 0; i < count; i++) { \ + type tmp = (type) VAL(toNative(RARRAY_PTR(ary)[i]), swap); \ + memcpy(memory->address + off + (i * sizeof(type)), &tmp, sizeof(tmp)); \ + } \ + return self; \ +} \ +static VALUE memory_write_array_of_##name(VALUE self, VALUE ary); \ +static VALUE \ +memory_write_array_of_##name(VALUE self, VALUE ary) \ +{ \ + return memory_put_array_of_##name(self, INT2FIX(0), ary); \ +} \ +static VALUE memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length); \ +static VALUE \ +memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length) \ +{ \ + long count = NUM2LONG(length); \ + long off = NUM2LONG(offset); \ + AbstractMemory* memory = MEMORY(self); \ + VALUE retVal = rb_ary_new2(count); \ + long i; \ + checkRead(memory); \ + checkBounds(memory, off, count * sizeof(type)); \ + for (i = 0; i < count; ++i) { \ + type tmp; \ + memcpy(&tmp, memory->address + off + (i * sizeof(type)), sizeof(tmp)); \ + rb_ary_push(retVal, fromNative(VAL(tmp, swap))); \ + } \ + return retVal; \ +} \ +static VALUE memory_read_array_of_##name(VALUE self, VALUE length); \ +static VALUE \ +memory_read_array_of_##name(VALUE self, VALUE length) \ +{ \ + return memory_get_array_of_##name(self, INT2FIX(0), length); \ +} + +#define NOSWAP(x) (x) +#define bswap16(x) (((x) >> 8) & 0xff) | (((x) << 8) & 0xff00); +static inline int16_t +SWAPS16(int16_t x) +{ + return bswap16(x); +} + +static inline uint16_t +SWAPU16(uint16_t x) +{ + return bswap16(x); +} + +#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) +#define bswap32(x) \ + (((x << 24) & 0xff000000) | \ + ((x << 8) & 0x00ff0000) | \ + ((x >> 8) & 0x0000ff00) | \ + ((x >> 24) & 0x000000ff)) + +#define bswap64(x) \ + (((x << 56) & 0xff00000000000000ULL) | \ + ((x << 40) & 0x00ff000000000000ULL) | \ + ((x << 24) & 0x0000ff0000000000ULL) | \ + ((x << 8) & 0x000000ff00000000ULL) | \ + ((x >> 8) & 0x00000000ff000000ULL) | \ + ((x >> 24) & 0x0000000000ff0000ULL) | \ + ((x >> 40) & 0x000000000000ff00ULL) | \ + ((x >> 56) & 0x00000000000000ffULL)) + +static inline int32_t +SWAPS32(int32_t x) +{ + return bswap32(x); +} + +static inline uint32_t +SWAPU32(uint32_t x) +{ + return bswap32(x); +} + +static inline int64_t +SWAPS64(int64_t x) +{ + return bswap64(x); +} + +static inline uint64_t +SWAPU64(uint64_t x) +{ + return bswap64(x); +} + +#else +# define SWAPS32(x) ((int32_t) __builtin_bswap32(x)) +# define SWAPU32(x) ((uint32_t) __builtin_bswap32(x)) +# define SWAPS64(x) ((int64_t) __builtin_bswap64(x)) +# define SWAPU64(x) ((uint64_t) __builtin_bswap64(x)) +#endif + +#if LONG_MAX > INT_MAX +# define SWAPSLONG SWAPS64 +# define SWAPULONG SWAPU64 +#else +# define SWAPSLONG SWAPS32 +# define SWAPULONG SWAPU32 +#endif + +NUM_OP(int8, int8_t, NUM2INT, INT2NUM, NOSWAP); +NUM_OP(uint8, uint8_t, NUM2UINT, UINT2NUM, NOSWAP); +NUM_OP(int16, int16_t, NUM2INT, INT2NUM, SWAPS16); +NUM_OP(uint16, uint16_t, NUM2UINT, UINT2NUM, SWAPU16); +NUM_OP(int32, int32_t, NUM2INT, INT2NUM, SWAPS32); +NUM_OP(uint32, uint32_t, NUM2UINT, UINT2NUM, SWAPU32); +NUM_OP(int64, int64_t, NUM2LL, LL2NUM, SWAPS64); +NUM_OP(uint64, uint64_t, NUM2ULL, ULL2NUM, SWAPU64); +NUM_OP(long, long, NUM2LONG, LONG2NUM, SWAPSLONG); +NUM_OP(ulong, unsigned long, NUM2ULONG, ULONG2NUM, SWAPULONG); +NUM_OP(float32, float, NUM2DBL, rb_float_new, NOSWAP); +NUM_OP(float64, double, NUM2DBL, rb_float_new, NOSWAP); +NUM_OP(longdouble, long double, rbffi_num2longdouble, rbffi_longdouble_new, NOSWAP); + +static inline void* +get_pointer_value(VALUE value) +{ + const int type = TYPE(value); + if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_PointerClass)) { + return memory_address(value); + } else if (type == T_NIL) { + return NULL; + } else if (type == T_FIXNUM) { + return (void *) (uintptr_t) FIX2ULONG(value); + } else if (type == T_BIGNUM) { + return (void *) (uintptr_t) NUM2ULL(value); + } else if (rb_respond_to(value, id_to_ptr)) { + return MEMORY_PTR(rb_funcall2(value, id_to_ptr, 0, NULL)); + } else { + rb_raise(rb_eArgError, "value is not a pointer"); + return NULL; + } +} + +NUM_OP(pointer, void *, get_pointer_value, rbffi_Pointer_NewInstance, NOSWAP); + +static inline uint8_t +rbffi_bool_value(VALUE value) +{ + return RTEST(value); +} + +static inline VALUE +rbffi_bool_new(uint8_t value) +{ + return (value & 1) != 0 ? Qtrue : Qfalse; +} + +NUM_OP(bool, unsigned char, rbffi_bool_value, rbffi_bool_new, NOSWAP); + + +/* + * call-seq: memory.clear + * Set the memory to all-zero. + * @return [self] + */ +static VALUE +memory_clear(VALUE self) +{ + AbstractMemory* ptr = MEMORY(self); + memset(ptr->address, 0, ptr->size); + return self; +} + +/* + * call-seq: memory.size + * Return memory size in bytes (alias: #total) + * @return [Numeric] + */ +static VALUE +memory_size(VALUE self) +{ + AbstractMemory* ptr; + + Data_Get_Struct(self, AbstractMemory, ptr); + + return LONG2NUM(ptr->size); +} + +/* + * call-seq: memory.get(type, offset) + * Return data of given type contained in memory. + * @param [Symbol, Type] type_name type of data to get + * @param [Numeric] offset point in buffer to start from + * @return [Object] + * @raise {ArgumentError} if type is not supported + */ +static VALUE +memory_get(VALUE self, VALUE type_name, VALUE offset) +{ + AbstractMemory* ptr; + VALUE nType; + Type *type; + + nType = rbffi_Type_Lookup(type_name); + if(NIL_P(nType)) goto undefined_type; + + Data_Get_Struct(self, AbstractMemory, ptr); + Data_Get_Struct(nType, Type, type); + + MemoryOp *op = get_memory_op(type); + if(op == NULL) goto undefined_type; + + return op->get(ptr, NUM2LONG(offset)); + +undefined_type: { + VALUE msg = rb_sprintf("undefined type '%" PRIsVALUE "'", type_name); + rb_exc_raise(rb_exc_new3(rb_eArgError, msg)); + return Qnil; + } +} + +/* + * call-seq: memory.put(type, offset, value) + * @param [Symbol, Type] type_name type of data to put + * @param [Numeric] offset point in buffer to start from + * @return [nil] + * @raise {ArgumentError} if type is not supported + */ +static VALUE +memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value) +{ + AbstractMemory* ptr; + VALUE nType; + Type *type; + + nType = rbffi_Type_Lookup(type_name); + if(NIL_P(nType)) goto undefined_type; + + Data_Get_Struct(self, AbstractMemory, ptr); + Data_Get_Struct(nType, Type, type); + + MemoryOp *op = get_memory_op(type); + if(op == NULL) goto undefined_type; + + op->put(ptr, NUM2LONG(offset), value); + return Qnil; + +undefined_type: { + VALUE msg = rb_sprintf("unsupported type '%" PRIsVALUE "'", type_name); + rb_exc_raise(rb_exc_new3(rb_eArgError, msg)); + return Qnil; + } +} + +/* + * call-seq: memory.get_string(offset, length=nil) + * Return string contained in memory. + * @param [Numeric] offset point in buffer to start from + * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). + * @return [String] + * @raise {IndexError} if +length+ is too great + * @raise {NullPointerError} if memory not initialized + */ +static VALUE +memory_get_string(int argc, VALUE* argv, VALUE self) +{ + VALUE length = Qnil, offset = Qnil; + AbstractMemory* ptr = MEMORY(self); + long off, len; + char* end; + int nargs = rb_scan_args(argc, argv, "11", &offset, &length); + + off = NUM2LONG(offset); + len = nargs > 1 && length != Qnil ? NUM2LONG(length) : (ptr->size - off); + checkRead(ptr); + checkBounds(ptr, off, len); + + end = memchr(ptr->address + off, 0, len); + return rb_tainted_str_new((char *) ptr->address + off, + (end != NULL ? end - ptr->address - off : len)); +} + +/* + * call-seq: memory.get_array_of_string(offset, count=nil) + * Return an array of strings contained in memory. + * @param [Numeric] offset point in memory to start from + * @param [Numeric] count number of strings to get. If nil, return all strings + * @return [Array] + * @raise {IndexError} if +offset+ is too great + * @raise {NullPointerError} if memory not initialized + */ +static VALUE +memory_get_array_of_string(int argc, VALUE* argv, VALUE self) +{ + VALUE offset = Qnil, countnum = Qnil, retVal = Qnil; + AbstractMemory* ptr; + long off; + int count; + + rb_scan_args(argc, argv, "11", &offset, &countnum); + off = NUM2LONG(offset); + count = (countnum == Qnil ? 0 : NUM2INT(countnum)); + retVal = rb_ary_new2(count); + + Data_Get_Struct(self, AbstractMemory, ptr); + checkRead(ptr); + + if (countnum != Qnil) { + int i; + + checkBounds(ptr, off, count * sizeof (char*)); + + for (i = 0; i < count; ++i) { + const char* strptr = *((const char**) (ptr->address + off) + i); + rb_ary_push(retVal, (strptr == NULL ? Qnil : rb_tainted_str_new2(strptr))); + } + + } else { + checkBounds(ptr, off, sizeof (char*)); + for ( ; off < ptr->size - (long) sizeof (void *); off += (long) sizeof (void *)) { + const char* strptr = *(const char**) (ptr->address + off); + if (strptr == NULL) { + break; + } + rb_ary_push(retVal, rb_tainted_str_new2(strptr)); + } + } + + return retVal; +} + +/* + * call-seq: memory.read_array_of_string(count=nil) + * Return an array of strings contained in memory. Same as: + * memory.get_array_of_string(0, count) + * @param [Numeric] count number of strings to get. If nil, return all strings + * @return [Array] + */ +static VALUE +memory_read_array_of_string(int argc, VALUE* argv, VALUE self) +{ + VALUE* rargv = ALLOCA_N(VALUE, argc + 1); + int i; + + rargv[0] = INT2FIX(0); + for (i = 0; i < argc; i++) { + rargv[i + 1] = argv[i]; + } + + return memory_get_array_of_string(argc + 1, rargv, self); +} + + +/* + * call-seq: memory.put_string(offset, str) + * @param [Numeric] offset + * @param [String] str + * @return [self] + * @raise {SecurityError} when writing unsafe string to memory + * @raise {IndexError} if +offset+ is too great + * @raise {NullPointerError} if memory not initialized + * Put a string in memory. + */ +static VALUE +memory_put_string(VALUE self, VALUE offset, VALUE str) +{ + AbstractMemory* ptr = MEMORY(self); + long off, len; + + Check_Type(str, T_STRING); + off = NUM2LONG(offset); + len = RSTRING_LEN(str); + + checkWrite(ptr); + checkBounds(ptr, off, len + 1); + + memcpy(ptr->address + off, RSTRING_PTR(str), len); + *((char *) ptr->address + off + len) = '\0'; + + return self; +} + +/* + * call-seq: memory.get_bytes(offset, length) + * Return string contained in memory. + * @param [Numeric] offset point in buffer to start from + * @param [Numeric] length string's length in bytes. + * @return [String] + * @raise {IndexError} if +length+ is too great + * @raise {NullPointerError} if memory not initialized + */ +static VALUE +memory_get_bytes(VALUE self, VALUE offset, VALUE length) +{ + AbstractMemory* ptr = MEMORY(self); + long off, len; + + off = NUM2LONG(offset); + len = NUM2LONG(length); + + checkRead(ptr); + checkBounds(ptr, off, len); + + return rb_tainted_str_new((char *) ptr->address + off, len); +} + +/* + * call-seq: memory.put_bytes(offset, str, index=0, length=nil) + * Put a string in memory. + * @param [Numeric] offset point in buffer to start from + * @param [String] str string to put to memory + * @param [Numeric] index + * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). + * @return [self] + * @raise {IndexError} if +length+ is too great + * @raise {NullPointerError} if memory not initialized + * @raise {RangeError} if +index+ is negative, or if index+length is greater than size of string + * @raise {SecurityError} when writing unsafe string to memory + */ +static VALUE +memory_put_bytes(int argc, VALUE* argv, VALUE self) +{ + AbstractMemory* ptr = MEMORY(self); + VALUE offset = Qnil, str = Qnil, rbIndex = Qnil, rbLength = Qnil; + long off, len, idx; + int nargs = rb_scan_args(argc, argv, "22", &offset, &str, &rbIndex, &rbLength); + + Check_Type(str, T_STRING); + + off = NUM2LONG(offset); + idx = nargs > 2 ? NUM2LONG(rbIndex) : 0; + if (idx < 0) { + rb_raise(rb_eRangeError, "index cannot be less than zero"); + return Qnil; + } + len = nargs > 3 ? NUM2LONG(rbLength) : (RSTRING_LEN(str) - idx); + if ((idx + len) > RSTRING_LEN(str)) { + rb_raise(rb_eRangeError, "index+length is greater than size of string"); + return Qnil; + } + + checkWrite(ptr); + checkBounds(ptr, off, len); + + if (rb_safe_level() >= 1 && OBJ_TAINTED(str)) { + rb_raise(rb_eSecurityError, "Writing unsafe string to memory"); + return Qnil; + } + memcpy(ptr->address + off, RSTRING_PTR(str) + idx, len); + + return self; +} + +/* + * call-seq: memory.read_bytes(length) + * @param [Numeric] length of string to return + * @return [String] + * equivalent to : + * memory.get_bytes(0, length) + */ +static VALUE +memory_read_bytes(VALUE self, VALUE length) +{ + return memory_get_bytes(self, INT2FIX(0), length); +} + +/* + * call-seq: memory.write_bytes(str, index=0, length=nil) + * @param [String] str string to put to memory + * @param [Numeric] index + * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). + * @return [self] + * equivalent to : + * memory.put_bytes(0, str, index, length) + */ +static VALUE +memory_write_bytes(int argc, VALUE* argv, VALUE self) +{ + VALUE* wargv = ALLOCA_N(VALUE, argc + 1); + int i; + + wargv[0] = INT2FIX(0); + for (i = 0; i < argc; i++) { + wargv[i + 1] = argv[i]; + } + + return memory_put_bytes(argc + 1, wargv, self); +} + +/* + * call-seq: memory.type_size + * @return [Numeric] type size in bytes + * Get the memory's type size. + */ +static VALUE +memory_type_size(VALUE self) +{ + AbstractMemory* ptr; + + Data_Get_Struct(self, AbstractMemory, ptr); + + return INT2NUM(ptr->typeSize); +} + +/* + * Document-method: [] + * call-seq: memory[idx] + * @param [Numeric] idx index to access in memory + * @return + * Memory read accessor. + */ +static VALUE +memory_aref(VALUE self, VALUE idx) +{ + AbstractMemory* ptr; + VALUE rbOffset = Qnil; + + Data_Get_Struct(self, AbstractMemory, ptr); + + rbOffset = ULONG2NUM(NUM2ULONG(idx) * ptr->typeSize); + + return rb_funcall2(self, id_plus, 1, &rbOffset); +} + +static inline char* +memory_address(VALUE obj) +{ + return ((AbstractMemory *) DATA_PTR(obj))->address; +} + +static VALUE +memory_copy_from(VALUE self, VALUE rbsrc, VALUE rblen) +{ + AbstractMemory* dst; + + Data_Get_Struct(self, AbstractMemory, dst); + + memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc, rbffi_AbstractMemoryClass)->address, NUM2INT(rblen)); + + return self; +} + +AbstractMemory* +rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass) +{ + if (rb_obj_is_kind_of(obj, klass)) { + AbstractMemory* memory; + Data_Get_Struct(obj, AbstractMemory, memory); + return memory; + } + + rb_raise(rb_eArgError, "Invalid Memory object"); + return NULL; +} + +void +rbffi_AbstractMemory_Error(AbstractMemory *mem, int op) +{ + VALUE rbErrorClass = mem->address == NULL ? NullPointerErrorClass : rb_eRuntimeError; + if (op == MEM_RD) { + rb_raise(rbErrorClass, "invalid memory read at address=%p", mem->address); + } else if (op == MEM_WR) { + rb_raise(rbErrorClass, "invalid memory write at address=%p", mem->address); + } else { + rb_raise(rbErrorClass, "invalid memory access at address=%p", mem->address); + } +} + +static VALUE +memory_op_get_strptr(AbstractMemory* ptr, long offset) +{ + void* tmp = NULL; + + if (ptr != NULL && ptr->address != NULL) { + checkRead(ptr); + checkBounds(ptr, offset, sizeof(tmp)); + memcpy(&tmp, ptr->address + offset, sizeof(tmp)); + } + + return tmp != NULL ? rb_tainted_str_new2(tmp) : Qnil; +} + +static void +memory_op_put_strptr(AbstractMemory* ptr, long offset, VALUE value) +{ + rb_raise(rb_eArgError, "Cannot set :string fields"); +} + +static MemoryOp memory_op_strptr = { memory_op_get_strptr, memory_op_put_strptr }; + + +MemoryOps rbffi_AbstractMemoryOps = { + &memory_op_int8, /*.int8 */ + &memory_op_uint8, /* .uint8 */ + &memory_op_int16, /* .int16 */ + &memory_op_uint16, /* .uint16 */ + &memory_op_int32, /* .int32 */ + &memory_op_uint32, /* .uint32 */ + &memory_op_int64, /* .int64 */ + &memory_op_uint64, /* .uint64 */ + &memory_op_long, /* .slong */ + &memory_op_ulong, /* .uslong */ + &memory_op_float32, /* .float32 */ + &memory_op_float64, /* .float64 */ + &memory_op_longdouble, /* .longdouble */ + &memory_op_pointer, /* .pointer */ + &memory_op_strptr, /* .strptr */ + &memory_op_bool /* .boolOp */ +}; + +void +rbffi_AbstractMemory_Init(VALUE moduleFFI) +{ + /* + * Document-class: FFI::AbstractMemory + * + * {AbstractMemory} is the base class for many memory management classes such as {Buffer}. + * + * This class has a lot of methods to work with integers : + * * put_intsize(offset, value) + * * get_intsize(offset) + * * put_uintsize(offset, value) + * * get_uintsize(offset) + * * writeuintsize(value) + * * read_intsize + * * write_uintsize(value) + * * read_uintsize + * * put_array_of_intsize(offset, ary) + * * get_array_of_intsize(offset, length) + * * put_array_of_uintsize(offset, ary) + * * get_array_of_uintsize(offset, length) + * * write_array_of_intsize(ary) + * * read_array_of_intsize(length) + * * write_array_of_uintsize(ary) + * * read_array_of_uintsize(length) + * where _size_ is 8, 16, 32 or 64. Same methods exist for long type. + * + * Aliases exist : _char_ for _int8_, _short_ for _int16_, _int_ for _int32_ and long_long for _int64_. + * + * Others methods are listed below. + */ + VALUE classMemory = rb_define_class_under(moduleFFI, "AbstractMemory", rb_cObject); + rbffi_AbstractMemoryClass = classMemory; + /* + * Document-variable: FFI::AbstractMemory + */ + rb_global_variable(&rbffi_AbstractMemoryClass); + rb_define_alloc_func(classMemory, memory_allocate); + + NullPointerErrorClass = rb_define_class_under(moduleFFI, "NullPointerError", rb_eRuntimeError); + /* Document-variable: NullPointerError */ + rb_global_variable(&NullPointerErrorClass); + + +#undef INT +#define INT(type) \ + rb_define_method(classMemory, "put_" #type, memory_put_##type, 2); \ + rb_define_method(classMemory, "get_" #type, memory_get_##type, 1); \ + rb_define_method(classMemory, "put_u" #type, memory_put_u##type, 2); \ + rb_define_method(classMemory, "get_u" #type, memory_get_u##type, 1); \ + rb_define_method(classMemory, "write_" #type, memory_write_##type, 1); \ + rb_define_method(classMemory, "read_" #type, memory_read_##type, 0); \ + rb_define_method(classMemory, "write_u" #type, memory_write_u##type, 1); \ + rb_define_method(classMemory, "read_u" #type, memory_read_u##type, 0); \ + rb_define_method(classMemory, "put_array_of_" #type, memory_put_array_of_##type, 2); \ + rb_define_method(classMemory, "get_array_of_" #type, memory_get_array_of_##type, 2); \ + rb_define_method(classMemory, "put_array_of_u" #type, memory_put_array_of_u##type, 2); \ + rb_define_method(classMemory, "get_array_of_u" #type, memory_get_array_of_u##type, 2); \ + rb_define_method(classMemory, "write_array_of_" #type, memory_write_array_of_##type, 1); \ + rb_define_method(classMemory, "read_array_of_" #type, memory_read_array_of_##type, 1); \ + rb_define_method(classMemory, "write_array_of_u" #type, memory_write_array_of_u##type, 1); \ + rb_define_method(classMemory, "read_array_of_u" #type, memory_read_array_of_u##type, 1); + + INT(int8); + INT(int16); + INT(int32); + INT(int64); + INT(long); + +#define ALIAS(name, old) \ + rb_define_alias(classMemory, "put_" #name, "put_" #old); \ + rb_define_alias(classMemory, "get_" #name, "get_" #old); \ + rb_define_alias(classMemory, "put_u" #name, "put_u" #old); \ + rb_define_alias(classMemory, "get_u" #name, "get_u" #old); \ + rb_define_alias(classMemory, "write_" #name, "write_" #old); \ + rb_define_alias(classMemory, "read_" #name, "read_" #old); \ + rb_define_alias(classMemory, "write_u" #name, "write_u" #old); \ + rb_define_alias(classMemory, "read_u" #name, "read_u" #old); \ + rb_define_alias(classMemory, "put_array_of_" #name, "put_array_of_" #old); \ + rb_define_alias(classMemory, "get_array_of_" #name, "get_array_of_" #old); \ + rb_define_alias(classMemory, "put_array_of_u" #name, "put_array_of_u" #old); \ + rb_define_alias(classMemory, "get_array_of_u" #name, "get_array_of_u" #old); \ + rb_define_alias(classMemory, "write_array_of_" #name, "write_array_of_" #old); \ + rb_define_alias(classMemory, "read_array_of_" #name, "read_array_of_" #old); \ + rb_define_alias(classMemory, "write_array_of_u" #name, "write_array_of_u" #old); \ + rb_define_alias(classMemory, "read_array_of_u" #name, "read_array_of_u" #old); + + ALIAS(char, int8); + ALIAS(short, int16); + ALIAS(int, int32); + ALIAS(long_long, int64); + + /* + * Document-method: put_float32 + * call-seq: memory.put_float32offset, value) + * @param [Numeric] offset + * @param [Numeric] value + * @return [self] + * Put +value+ as a 32-bit float in memory at offset +offset+ (alias: #put_float). + */ + rb_define_method(classMemory, "put_float32", memory_put_float32, 2); + /* + * Document-method: get_float32 + * call-seq: memory.get_float32(offset) + * @param [Numeric] offset + * @return [Float] + * Get a 32-bit float from memory at offset +offset+ (alias: #get_float). + */ + rb_define_method(classMemory, "get_float32", memory_get_float32, 1); + rb_define_alias(classMemory, "put_float", "put_float32"); + rb_define_alias(classMemory, "get_float", "get_float32"); + /* + * Document-method: write_float + * call-seq: memory.write_float(value) + * @param [Numeric] value + * @return [self] + * Write +value+ as a 32-bit float in memory. + * + * Same as: + * memory.put_float(0, value) + */ + rb_define_method(classMemory, "write_float", memory_write_float32, 1); + /* + * Document-method: read_float + * call-seq: memory.read_float + * @return [Float] + * Read a 32-bit float from memory. + * + * Same as: + * memory.get_float(0) + */ + rb_define_method(classMemory, "read_float", memory_read_float32, 0); + /* + * Document-method: put_array_of_float32 + * call-seq: memory.put_array_of_float32(offset, ary) + * @param [Numeric] offset + * @param [Array] ary + * @return [self] + * Put values from +ary+ as 32-bit floats in memory from offset +offset+ (alias: #put_array_of_float). + */ + rb_define_method(classMemory, "put_array_of_float32", memory_put_array_of_float32, 2); + /* + * Document-method: get_array_of_float32 + * call-seq: memory.get_array_of_float32(offset, length) + * @param [Numeric] offset + * @param [Numeric] length number of Float to get + * @return [Array] + * Get 32-bit floats in memory from offset +offset+ (alias: #get_array_of_float). + */ + rb_define_method(classMemory, "get_array_of_float32", memory_get_array_of_float32, 2); + /* + * Document-method: write_array_of_float + * call-seq: memory.write_array_of_float(ary) + * @param [Array] ary + * @return [self] + * Write values from +ary+ as 32-bit floats in memory. + * + * Same as: + * memory.put_array_of_float(0, ary) + */ + rb_define_method(classMemory, "write_array_of_float", memory_write_array_of_float32, 1); + /* + * Document-method: read_array_of_float + * call-seq: memory.read_array_of_float(length) + * @param [Numeric] length number of Float to read + * @return [Array] + * Read 32-bit floats from memory. + * + * Same as: + * memory.get_array_of_float(0, ary) + */ + rb_define_method(classMemory, "read_array_of_float", memory_read_array_of_float32, 1); + rb_define_alias(classMemory, "put_array_of_float", "put_array_of_float32"); + rb_define_alias(classMemory, "get_array_of_float", "get_array_of_float32"); + /* + * Document-method: put_float64 + * call-seq: memory.put_float64(offset, value) + * @param [Numeric] offset + * @param [Numeric] value + * @return [self] + * Put +value+ as a 64-bit float (double) in memory at offset +offset+ (alias: #put_double). + */ + rb_define_method(classMemory, "put_float64", memory_put_float64, 2); + /* + * Document-method: get_float64 + * call-seq: memory.get_float64(offset) + * @param [Numeric] offset + * @return [Float] + * Get a 64-bit float (double) from memory at offset +offset+ (alias: #get_double). + */ + rb_define_method(classMemory, "get_float64", memory_get_float64, 1); + rb_define_alias(classMemory, "put_double", "put_float64"); + rb_define_alias(classMemory, "get_double", "get_float64"); + /* + * Document-method: write_double + * call-seq: memory.write_double(value) + * @param [Numeric] value + * @return [self] + * Write +value+ as a 64-bit float (double) in memory. + * + * Same as: + * memory.put_double(0, value) + */ + rb_define_method(classMemory, "write_double", memory_write_float64, 1); + /* + * Document-method: read_double + * call-seq: memory.read_double + * @return [Float] + * Read a 64-bit float (double) from memory. + * + * Same as: + * memory.get_double(0) + */ + rb_define_method(classMemory, "read_double", memory_read_float64, 0); + /* + * Document-method: put_array_of_float64 + * call-seq: memory.put_array_of_float64(offset, ary) + * @param [Numeric] offset + * @param [Array] ary + * @return [self] + * Put values from +ary+ as 64-bit floats (doubles) in memory from offset +offset+ (alias: #put_array_of_double). + */ + rb_define_method(classMemory, "put_array_of_float64", memory_put_array_of_float64, 2); + /* + * Document-method: get_array_of_float64 + * call-seq: memory.get_array_of_float64(offset, length) + * @param [Numeric] offset + * @param [Numeric] length number of Float to get + * @return [Array] + * Get 64-bit floats (doubles) in memory from offset +offset+ (alias: #get_array_of_double). + */ + rb_define_method(classMemory, "get_array_of_float64", memory_get_array_of_float64, 2); + /* + * Document-method: write_array_of_double + * call-seq: memory.write_array_of_double(ary) + * @param [Array] ary + * @return [self] + * Write values from +ary+ as 64-bit floats (doubles) in memory. + * + * Same as: + * memory.put_array_of_double(0, ary) + */ + rb_define_method(classMemory, "write_array_of_double", memory_write_array_of_float64, 1); + /* + * Document-method: read_array_of_double + * call-seq: memory.read_array_of_double(length) + * @param [Numeric] length number of Float to read + * @return [Array] + * Read 64-bit floats (doubles) from memory. + * + * Same as: + * memory.get_array_of_double(0, ary) + */ + rb_define_method(classMemory, "read_array_of_double", memory_read_array_of_float64, 1); + rb_define_alias(classMemory, "put_array_of_double", "put_array_of_float64"); + rb_define_alias(classMemory, "get_array_of_double", "get_array_of_float64"); + /* + * Document-method: put_pointer + * call-seq: memory.put_pointer(offset, value) + * @param [Numeric] offset + * @param [nil,Pointer, Integer, #to_ptr] value + * @return [self] + * Put +value+ in memory from +offset+.. + */ + rb_define_method(classMemory, "put_pointer", memory_put_pointer, 2); + /* + * Document-method: get_pointer + * call-seq: memory.get_pointer(offset) + * @param [Numeric] offset + * @return [Pointer] + * Get a {Pointer} to the memory from +offset+. + */ + rb_define_method(classMemory, "get_pointer", memory_get_pointer, 1); + /* + * Document-method: write_pointer + * call-seq: memory.write_pointer(value) + * @param [nil,Pointer, Integer, #to_ptr] value + * @return [self] + * Write +value+ in memory. + * + * Equivalent to: + * memory.put_pointer(0, value) + */ + rb_define_method(classMemory, "write_pointer", memory_write_pointer, 1); + /* + * Document-method: read_pointer + * call-seq: memory.read_pointer + * @return [Pointer] + * Get a {Pointer} to the memory from base address. + * + * Equivalent to: + * memory.get_pointer(0) + */ + rb_define_method(classMemory, "read_pointer", memory_read_pointer, 0); + /* + * Document-method: put_array_of_pointer + * call-seq: memory.put_array_of_pointer(offset, ary) + * @param [Numeric] offset + * @param [Array<#to_ptr>] ary + * @return [self] + * Put an array of {Pointer} into memory from +offset+. + */ + rb_define_method(classMemory, "put_array_of_pointer", memory_put_array_of_pointer, 2); + /* + * Document-method: get_array_of_pointer + * call-seq: memory.get_array_of_pointer(offset, length) + * @param [Numeric] offset + * @param [Numeric] length + * @return [Array] + * Get an array of {Pointer} of length +length+ from +offset+. + */ + rb_define_method(classMemory, "get_array_of_pointer", memory_get_array_of_pointer, 2); + /* + * Document-method: write_array_of_pointer + * call-seq: memory.write_array_of_pointer(ary) + * @param [Array<#to_ptr>] ary + * @return [self] + * Write an array of {Pointer} into memory from +offset+. + * + * Same as : + * memory.put_array_of_pointer(0, ary) + */ + rb_define_method(classMemory, "write_array_of_pointer", memory_write_array_of_pointer, 1); + /* + * Document-method: read_array_of_pointer + * call-seq: memory.read_array_of_pointer(length) + * @param [Numeric] length + * @return [Array] + * Read an array of {Pointer} of length +length+. + * + * Same as: + * memory.get_array_of_pointer(0, length) + */ + rb_define_method(classMemory, "read_array_of_pointer", memory_read_array_of_pointer, 1); + + rb_define_method(classMemory, "get_string", memory_get_string, -1); + rb_define_method(classMemory, "put_string", memory_put_string, 2); + rb_define_method(classMemory, "get_bytes", memory_get_bytes, 2); + rb_define_method(classMemory, "put_bytes", memory_put_bytes, -1); + rb_define_method(classMemory, "read_bytes", memory_read_bytes, 1); + rb_define_method(classMemory, "write_bytes", memory_write_bytes, -1); + rb_define_method(classMemory, "get_array_of_string", memory_get_array_of_string, -1); + + rb_define_method(classMemory, "get", memory_get, 2); + rb_define_method(classMemory, "put", memory_put, 3); + + rb_define_method(classMemory, "clear", memory_clear, 0); + rb_define_method(classMemory, "total", memory_size, 0); + rb_define_alias(classMemory, "size", "total"); + rb_define_method(classMemory, "type_size", memory_type_size, 0); + rb_define_method(classMemory, "[]", memory_aref, 1); + rb_define_method(classMemory, "__copy_from__", memory_copy_from, 2); + + id_to_ptr = rb_intern("to_ptr"); + id_call = rb_intern("call"); + id_plus = rb_intern("+"); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.h new file mode 100644 index 0000000..1119288 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.h @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may 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 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. + */ + +#ifndef RBFFI_ABSTRACTMEMORY_H +#define RBFFI_ABSTRACTMEMORY_H + +#ifndef _MSC_VER +#include +#endif +#include +#ifndef _MSC_VER +#include +#endif + +#include "compat.h" +#include "Types.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +#define MEM_RD 0x01 +#define MEM_WR 0x02 +#define MEM_CODE 0x04 +#define MEM_SWAP 0x08 +#define MEM_EMBED 0x10 + +typedef struct AbstractMemory_ AbstractMemory; + +typedef struct { + VALUE (*get)(AbstractMemory* ptr, long offset); + void (*put)(AbstractMemory* ptr, long offset, VALUE value); +} MemoryOp; + +typedef struct { + MemoryOp* int8; + MemoryOp* uint8; + MemoryOp* int16; + MemoryOp* uint16; + MemoryOp* int32; + MemoryOp* uint32; + MemoryOp* int64; + MemoryOp* uint64; + MemoryOp* slong; + MemoryOp* uslong; + MemoryOp* float32; + MemoryOp* float64; + MemoryOp* longdouble; + MemoryOp* pointer; + MemoryOp* strptr; + MemoryOp* boolOp; +} MemoryOps; + +struct AbstractMemory_ { + char* address; /* Use char* instead of void* to ensure adding to it works correctly */ + long size; + int flags; + int typeSize; +}; + + +extern VALUE rbffi_AbstractMemoryClass; +extern MemoryOps rbffi_AbstractMemoryOps; + +extern void rbffi_AbstractMemory_Init(VALUE ffiModule); + +extern AbstractMemory* rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass); + +extern void rbffi_AbstractMemory_Error(AbstractMemory *, int op); + +static inline void +checkBounds(AbstractMemory* mem, long off, long len) +{ + if (unlikely((off | len | (off + len) | (mem->size - (off + len))) < 0)) { + rb_raise(rb_eIndexError, "Memory access offset=%ld size=%ld is out of bounds", + off, len); + } +} + +static inline void +checkRead(AbstractMemory* mem) +{ + if (unlikely((mem->flags & MEM_RD) == 0)) { + rbffi_AbstractMemory_Error(mem, MEM_RD); + } +} + +static inline void +checkWrite(AbstractMemory* mem) +{ + if (unlikely((mem->flags & MEM_WR) == 0)) { + rbffi_AbstractMemory_Error(mem, MEM_WR); + } +} + +static inline MemoryOp* +get_memory_op(Type* type) +{ + switch (type->nativeType) { + case NATIVE_INT8: + return rbffi_AbstractMemoryOps.int8; + case NATIVE_UINT8: + return rbffi_AbstractMemoryOps.uint8; + case NATIVE_INT16: + return rbffi_AbstractMemoryOps.int16; + case NATIVE_UINT16: + return rbffi_AbstractMemoryOps.uint16; + case NATIVE_INT32: + return rbffi_AbstractMemoryOps.int32; + case NATIVE_UINT32: + return rbffi_AbstractMemoryOps.uint32; + case NATIVE_INT64: + return rbffi_AbstractMemoryOps.int64; + case NATIVE_UINT64: + return rbffi_AbstractMemoryOps.uint64; + case NATIVE_LONG: + return rbffi_AbstractMemoryOps.slong; + case NATIVE_ULONG: + return rbffi_AbstractMemoryOps.uslong; + case NATIVE_FLOAT32: + return rbffi_AbstractMemoryOps.float32; + case NATIVE_FLOAT64: + return rbffi_AbstractMemoryOps.float64; + case NATIVE_LONGDOUBLE: + return rbffi_AbstractMemoryOps.longdouble; + case NATIVE_POINTER: + return rbffi_AbstractMemoryOps.pointer; + case NATIVE_STRING: + return rbffi_AbstractMemoryOps.strptr; + case NATIVE_BOOL: + return rbffi_AbstractMemoryOps.boolOp; + default: + return NULL; + } +} + +#define MEMORY(obj) rbffi_AbstractMemory_Cast((obj), rbffi_AbstractMemoryClass) +#define MEMORY_PTR(obj) MEMORY((obj))->address +#define MEMORY_LEN(obj) MEMORY((obj))->size + + + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_ABSTRACTMEMORY_H */ + diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.o b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.o new file mode 100644 index 0000000000000000000000000000000000000000..a0647e78d5c5d149f1650f3ab4f887f76351058c GIT binary patch literal 335396 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

    iUP&D2@7>5MHm&P`uDonNCbV{Lt=TG?~Q zFR)Q@W1@Y!oZUKt+FybRk2m96gE^!6u}95K-`3UyW7ZzO`6bxe4_XK$lk(2zPo$zc zq?aOG5Xin7&2q(<#gY%|xY`BLW$ila%-1G{+kE4&u1?z9vqYAb`KJY=!9=*FK5AZ_ z)P|FBebe`Nr?)U&+HN)``Q$XRM`uu?{sp>V4eoOm6}ybE|?PDCDyd*3u<3sj1iu3S)H@;N&90=n`u^A!ZXgw zkj*0R?cRVSE!0iuGyKiX^1spl!kJe~uU>o|&GAI6C74Wl!>t~#Mw(ryIoKAC%H^Hx zLG$vsJ+?Gxj?*M=QXi3QTlPh+)X#}Zs;E}K^(G{Vz%=dHaXY51Bamp7mdvgxqZTws zS2rTDws4EpljR_mMYqQs-`%GeqvJ9jQAU~l7GS+kHq(q=M;l-HY&<*dn%X=a%i^`S z`zHBMeanVB-jNJ(u{nFXuk7UJk!j(x&f+9KXr#AW>Rj}bXt&DTBKiTtBOAnOwQ+8P zA)jknIy(c+;iZOt#z}@HKbV~T%=CAX?rd?)lQV6~6wYsc^E2G!6KX0>s3|+4ru@Vz zqb$cC4MbzfNH7>Ln$u7}ztruPy4%8$h+}Y>UI{vfB{iUA>5C0EDMZ!7& literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/project.h b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/project.h new file mode 100644 index 0000000..de2f450 --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/project.h @@ -0,0 +1,176 @@ +/***************************************************************************** + +$Id$ + +File: project.h +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#ifndef __Project__H_ +#define __Project__H_ + + +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifdef OS_UNIX +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +typedef int SOCKET; +#define INVALID_SOCKET -1 +#define SOCKET_ERROR -1 +#ifdef OS_SOLARIS8 +#include +#include +#ifndef AF_LOCAL +#define AF_LOCAL AF_UNIX +#endif +// INADDR_NONE is undefined on Solaris < 8. Thanks to Brett Eisenberg and Tim Pease. +#ifndef INADDR_NONE +#define INADDR_NONE ((unsigned long)-1) +#endif +#endif /* OS_SOLARIS8 */ + +#ifdef _AIX +#include +#ifndef AF_LOCAL +#define AF_LOCAL AF_UNIX +#endif +#endif /* _AIX */ + +#ifdef OS_DARWIN +#include +#include +#endif /* OS_DARWIN */ + +#endif /* OS_UNIX */ + +#ifdef OS_WIN32 +// 21Sep09: windows limits select() to 64 sockets by default, we increase it to 1024 here (before including winsock2.h) +// 18Jun12: fd_setsize must be changed in the ruby binary (not in this extension). redefining it also causes segvs, see eventmachine/eventmachine#333 +//#define FD_SETSIZE 1024 + +// WIN32_LEAN_AND_MEAN excludes APIs such as Cryptography, DDE, RPC, Shell, and Windows Sockets. +#define WIN32_LEAN_AND_MEAN + +#include +#include +#include +#include +#include +#include + +// Older versions of MinGW in the Ruby Dev Kit do not provide the getaddrinfo hint flags +#ifndef AI_ADDRCONFIG +#define AI_ADDRCONFIG 0x0400 +#endif + +#ifndef AI_NUMERICSERV +#define AI_NUMERICSERV 0x0008 +#endif + +// Use the Win32 wrapper library that Ruby owns to be able to close sockets with the close() function +#define RUBY_EXPORT +#include +#include +#endif /* OS_WIN32 */ + +#if !defined(_MSC_VER) || _MSC_VER > 1500 +#include +#endif + +using namespace std; + +#ifdef WITH_SSL +#include +#include +#endif + +#ifdef HAVE_EPOLL +#include +#endif + +#ifdef HAVE_KQUEUE +#include +#include +#endif + +#ifdef HAVE_INOTIFY +#include +#endif + +#ifdef HAVE_OLD_INOTIFY +#include +#include +static inline int inotify_init (void) { return syscall (__NR_inotify_init); } +static inline int inotify_add_watch (int fd, const char *name, __u32 mask) { return syscall (__NR_inotify_add_watch, fd, name, mask); } +static inline int inotify_rm_watch (int fd, __u32 wd) { return syscall (__NR_inotify_rm_watch, fd, wd); } +#define HAVE_INOTIFY 1 +#endif + +#ifdef HAVE_INOTIFY +#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event)) +#endif + +#ifdef HAVE_WRITEV +#include +#endif + +#if __cplusplus +extern "C" { +#endif + typedef void (*EMCallback)(const unsigned long, int, const char*, const unsigned long); +#if __cplusplus +} +#endif + +#if defined(__GNUC__) && (__GNUC__ >= 3) +#define UNUSED __attribute__ ((unused)) +#else +#define UNUSED +#endif + +#include "binder.h" +#include "em.h" +#include "ed.h" +#include "page.h" +#include "ssl.h" +#include "eventmachine.h" + +#endif // __Project__H_ diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/rubyeventmachine.bundle b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/rubyeventmachine.bundle new file mode 100755 index 0000000000000000000000000000000000000000..46ee82fbccc90cca444635a080aa53615cefedeb GIT binary patch literal 461356 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%0D}SB1K|oR3TuJeH|AXK(4&TQ;?erhdIz_#<86C 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∓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 L4O=oP5{dkOw0F#Y literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/rubymain.cpp b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/rubymain.cpp new file mode 100644 index 0000000..305f9cb --- /dev/null +++ b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/rubymain.cpp @@ -0,0 +1,1515 @@ +/***************************************************************************** + +$Id$ + +File: rubymain.cpp +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#include "project.h" +#include "eventmachine.h" +#include + +#ifndef RFLOAT_VALUE +#define RFLOAT_VALUE(arg) RFLOAT(arg)->value +#endif + +/* Adapted from NUM2BSIG / BSIG2NUM in ext/fiddle/conversions.h, + * we'll call it a BSIG for Binding Signature here. */ +#if SIZEOF_VOIDP == SIZEOF_LONG +# define BSIG2NUM(x) (ULONG2NUM((unsigned long)(x))) +# define NUM2BSIG(x) (NUM2ULONG(x)) +# ifdef OS_WIN32 +# define PRIFBSIG "I32u" +# else +# define PRIFBSIG "lu" +# endif +#else +# define BSIG2NUM(x) (ULL2NUM((unsigned long long)(x))) +# define NUM2BSIG(x) (NUM2ULL(x)) +# ifdef OS_WIN32 +# define PRIFBSIG "I64u" +# else +# define PRIFBSIG "llu" +# endif +#endif + +/******* +Statics +*******/ + +static VALUE EmModule; +static VALUE EmConnection; +static VALUE EmConnsHash; +static VALUE EmTimersHash; + +static VALUE EM_eConnectionError; +static VALUE EM_eUnknownTimerFired; +static VALUE EM_eConnectionNotBound; +static VALUE EM_eUnsupported; +static VALUE EM_eInvalidSignature; + +static VALUE Intern_at_signature; +static VALUE Intern_at_timers; +static VALUE Intern_at_conns; +static VALUE Intern_at_error_handler; +static VALUE Intern_event_callback; +static VALUE Intern_run_deferred_callbacks; +static VALUE Intern_delete; +static VALUE Intern_call; +static VALUE Intern_at; +static VALUE Intern_receive_data; +static VALUE Intern_ssl_handshake_completed; +static VALUE Intern_ssl_verify_peer; +static VALUE Intern_notify_readable; +static VALUE Intern_notify_writable; +static VALUE Intern_proxy_target_unbound; +static VALUE Intern_proxy_completed; +static VALUE Intern_connection_completed; + +static VALUE rb_cProcStatus; + +struct em_event { + uintptr_t signature; + int event; + const char *data_str; + unsigned long data_num; +}; + +static inline VALUE ensure_conn(const uintptr_t signature) +{ + VALUE conn = rb_hash_aref (EmConnsHash, BSIG2NUM (signature)); + if (conn == Qnil) + rb_raise (EM_eConnectionNotBound, "unknown connection: %" PRIFBSIG, signature); + return conn; +} + + +/**************** +t_event_callback +****************/ + +static inline void event_callback (struct em_event* e) +{ + const uintptr_t signature = e->signature; + int event = e->event; + const char *data_str = e->data_str; + const unsigned long data_num = e->data_num; + + switch (event) { + case EM_CONNECTION_READ: + { + VALUE conn = rb_hash_aref (EmConnsHash, BSIG2NUM (signature)); + if (conn == Qnil) + rb_raise (EM_eConnectionNotBound, "received %lu bytes of data for unknown signature: %" PRIFBSIG, data_num, signature); + rb_funcall (conn, Intern_receive_data, 1, rb_str_new (data_str, data_num)); + return; + } + case EM_CONNECTION_ACCEPTED: + { + rb_funcall (EmModule, Intern_event_callback, 3, BSIG2NUM(signature), INT2FIX(event), ULONG2NUM(data_num)); + return; + } + case EM_CONNECTION_UNBOUND: + { + rb_funcall (EmModule, Intern_event_callback, 3, BSIG2NUM(signature), INT2FIX(event), ULONG2NUM(data_num)); + return; + } + case EM_CONNECTION_COMPLETED: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_connection_completed, 0); + return; + } + case EM_CONNECTION_NOTIFY_READABLE: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_notify_readable, 0); + return; + } + case EM_CONNECTION_NOTIFY_WRITABLE: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_notify_writable, 0); + return; + } + case EM_LOOPBREAK_SIGNAL: + { + rb_funcall (EmModule, Intern_run_deferred_callbacks, 0); + return; + } + case EM_TIMER_FIRED: + { + VALUE timer = rb_funcall (EmTimersHash, Intern_delete, 1, ULONG2NUM (data_num)); + if (timer == Qnil) { + rb_raise (EM_eUnknownTimerFired, "no such timer: %lu", data_num); + } else if (timer == Qfalse) { + /* Timer Canceled */ + } else { + rb_funcall (timer, Intern_call, 0); + } + return; + } + #ifdef WITH_SSL + case EM_SSL_HANDSHAKE_COMPLETED: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_ssl_handshake_completed, 0); + return; + } + case EM_SSL_VERIFY: + { + VALUE conn = ensure_conn(signature); + VALUE should_accept = rb_funcall (conn, Intern_ssl_verify_peer, 1, rb_str_new(data_str, data_num)); + if (RTEST(should_accept)) + evma_accept_ssl_peer (signature); + return; + } + #endif + case EM_PROXY_TARGET_UNBOUND: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_proxy_target_unbound, 0); + return; + } + case EM_PROXY_COMPLETED: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_proxy_completed, 0); + return; + } + } +} + +/******************* +event_error_handler +*******************/ + +static void event_error_handler(VALUE self UNUSED, VALUE err) +{ + VALUE error_handler = rb_ivar_get(EmModule, Intern_at_error_handler); + rb_funcall (error_handler, Intern_call, 1, err); +} + +/********************** +event_callback_wrapper +**********************/ + +static void event_callback_wrapper (const uintptr_t signature, int event, const char *data_str, const unsigned long data_num) +{ + struct em_event e; + e.signature = signature; + e.event = event; + e.data_str = data_str; + e.data_num = data_num; + + if (!rb_ivar_defined(EmModule, Intern_at_error_handler)) + event_callback(&e); + else + rb_rescue((VALUE (*)(ANYARGS))event_callback, (VALUE)&e, (VALUE (*)(ANYARGS))event_error_handler, Qnil); +} + +/************************** +t_initialize_event_machine +**************************/ + +static VALUE t_initialize_event_machine (VALUE self UNUSED) +{ + EmConnsHash = rb_ivar_get (EmModule, Intern_at_conns); + EmTimersHash = rb_ivar_get (EmModule, Intern_at_timers); + assert(EmConnsHash != Qnil); + assert(EmTimersHash != Qnil); + evma_initialize_library ((EMCallback)event_callback_wrapper); + return Qnil; +} + + +/****************** +t_run_machine_once +******************/ + +static VALUE t_run_machine_once (VALUE self UNUSED) +{ + return evma_run_machine_once () ? Qtrue : Qfalse; +} + + +/************* +t_run_machine +*************/ + +static VALUE t_run_machine (VALUE self UNUSED) +{ + evma_run_machine(); + return Qnil; +} + + +/******************* +t_add_oneshot_timer +*******************/ + +static VALUE t_add_oneshot_timer (VALUE self UNUSED, VALUE interval) +{ + const uintptr_t f = evma_install_oneshot_timer (FIX2LONG (interval)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "ran out of timers; use #set_max_timers to increase limit"); + return BSIG2NUM (f); +} + + +/************** +t_start_server +**************/ + +static VALUE t_start_server (VALUE self UNUSED, VALUE server, VALUE port) +{ + const uintptr_t f = evma_create_tcp_server (StringValueCStr(server), FIX2INT(port)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no acceptor (port is in use or requires root privileges)"); + return BSIG2NUM (f); +} + +/************* +t_stop_server +*************/ + +static VALUE t_stop_server (VALUE self UNUSED, VALUE signature) +{ + evma_stop_tcp_server (NUM2BSIG (signature)); + return Qnil; +} + + +/******************* +t_start_unix_server +*******************/ + +static VALUE t_start_unix_server (VALUE self UNUSED, VALUE filename) +{ + const uintptr_t f = evma_create_unix_domain_server (StringValueCStr(filename)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no unix-domain acceptor"); + return BSIG2NUM (f); +} + +/******************** +t_attach_sd +********************/ + +static VALUE t_attach_sd(VALUE self UNUSED, VALUE sd) +{ + const uintptr_t f = evma_attach_sd(FIX2INT(sd)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no socket descriptor acceptor"); + return BSIG2NUM (f); +} + + +/*********** +t_send_data +***********/ + +static VALUE t_send_data (VALUE self UNUSED, VALUE signature, VALUE data, VALUE data_length) +{ + int b = evma_send_data_to_connection (NUM2BSIG (signature), StringValuePtr (data), FIX2INT (data_length)); + return INT2NUM (b); +} + + +/*********** +t_start_tls +***********/ + +static VALUE t_start_tls (VALUE self UNUSED, VALUE signature) +{ + evma_start_tls (NUM2BSIG (signature)); + return Qnil; +} + +/*************** +t_set_tls_parms +***************/ + +static VALUE t_set_tls_parms (VALUE self UNUSED, VALUE signature, VALUE privkeyfile, VALUE certchainfile, VALUE verify_peer, VALUE fail_if_no_peer_cert, VALUE snihostname, VALUE cipherlist, VALUE ecdh_curve, VALUE dhparam, VALUE ssl_version) +{ + /* set_tls_parms takes a series of positional arguments for specifying such things + * as private keys and certificate chains. + * It's expected that the parameter list will grow as we add more supported features. + * ALL of these parameters are optional, and can be specified as empty or NULL strings. + */ + evma_set_tls_parms (NUM2BSIG (signature), StringValueCStr (privkeyfile), StringValueCStr (certchainfile), (verify_peer == Qtrue ? 1 : 0), (fail_if_no_peer_cert == Qtrue ? 1 : 0), StringValueCStr (snihostname), StringValueCStr (cipherlist), StringValueCStr (ecdh_curve), StringValueCStr (dhparam), NUM2INT (ssl_version)); + return Qnil; +} + +/*************** +t_get_peer_cert +***************/ + +#ifdef WITH_SSL +static VALUE t_get_peer_cert (VALUE self UNUSED, VALUE signature) +{ + VALUE ret = Qnil; + + X509 *cert = NULL; + BUF_MEM *buf; + BIO *out; + + cert = evma_get_peer_cert (NUM2BSIG (signature)); + + if (cert != NULL) { + out = BIO_new(BIO_s_mem()); + PEM_write_bio_X509(out, cert); + BIO_get_mem_ptr(out, &buf); + ret = rb_str_new(buf->data, buf->length); + X509_free(cert); + BIO_free(out); + } + + return ret; +} +#else +static VALUE t_get_peer_cert (VALUE self UNUSED, VALUE signature UNUSED) +{ + return Qnil; +} +#endif + +/*************** +t_get_cipher_bits +***************/ + +#ifdef WITH_SSL +static VALUE t_get_cipher_bits (VALUE self UNUSED, VALUE signature) +{ + int bits = evma_get_cipher_bits (NUM2BSIG (signature)); + if (bits == -1) + return Qnil; + return INT2NUM (bits); +} +#else +static VALUE t_get_cipher_bits (VALUE self UNUSED, VALUE signature UNUSED) +{ + return Qnil; +} +#endif + +/*************** +t_get_cipher_name +***************/ + +#ifdef WITH_SSL +static VALUE t_get_cipher_name (VALUE self UNUSED, VALUE signature) +{ + const char *protocol = evma_get_cipher_name (NUM2BSIG (signature)); + if (protocol) + return rb_str_new2 (protocol); + + return Qnil; +} +#else +static VALUE t_get_cipher_name (VALUE self UNUSED, VALUE signature UNUSED) +{ + return Qnil; +} +#endif + +/*************** +t_get_cipher_protocol +***************/ + +#ifdef WITH_SSL +static VALUE t_get_cipher_protocol (VALUE self UNUSED, VALUE signature) +{ + const char *cipher = evma_get_cipher_protocol (NUM2BSIG (signature)); + if (cipher) + return rb_str_new2 (cipher); + + return Qnil; +} +#else +static VALUE t_get_cipher_protocol (VALUE self UNUSED, VALUE signature UNUSED) +{ + return Qnil; +} +#endif + +/*************** +t_get_sni_hostname +***************/ + +#ifdef WITH_SSL +static VALUE t_get_sni_hostname (VALUE self UNUSED, VALUE signature) +{ + const char *sni_hostname = evma_get_sni_hostname (NUM2BSIG (signature)); + if (sni_hostname) + return rb_str_new2 (sni_hostname); + + return Qnil; +} +#else +static VALUE t_get_sni_hostname (VALUE self UNUSED, VALUE signature UNUSED) +{ + return Qnil; +} +#endif + +/************** +t_get_peername +**************/ + +static VALUE t_get_peername (VALUE self UNUSED, VALUE signature) +{ + char buf[1024]; + socklen_t len = sizeof buf; + try { + if (evma_get_peername (NUM2BSIG (signature), (struct sockaddr*)buf, &len)) { + return rb_str_new (buf, len); + } + } catch (std::runtime_error e) { + rb_raise (rb_eRuntimeError, "%s", e.what()); + } + + return Qnil; +} + +/************** +t_get_sockname +**************/ + +static VALUE t_get_sockname (VALUE self UNUSED, VALUE signature) +{ + char buf[1024]; + socklen_t len = sizeof buf; + try { + if (evma_get_sockname (NUM2BSIG (signature), (struct sockaddr*)buf, &len)) { + return rb_str_new (buf, len); + } + } catch (std::runtime_error e) { + rb_raise (rb_eRuntimeError, "%s", e.what()); + } + + return Qnil; +} + +/******************** +t_get_subprocess_pid +********************/ + +static VALUE t_get_subprocess_pid (VALUE self UNUSED, VALUE signature) +{ + pid_t pid; + if (evma_get_subprocess_pid (NUM2BSIG (signature), &pid)) { + return INT2NUM (pid); + } + + return Qnil; +} + +/*********************** +t_get_subprocess_status +***********************/ + +static VALUE t_get_subprocess_status (VALUE self UNUSED, VALUE signature) +{ + VALUE proc_status = Qnil; + + int status; + pid_t pid; + + if (evma_get_subprocess_status (NUM2BSIG (signature), &status)) { + if (evma_get_subprocess_pid (NUM2BSIG (signature), &pid)) { + proc_status = rb_obj_alloc(rb_cProcStatus); + + /* MRI Ruby uses hidden instance vars */ + rb_iv_set(proc_status, "status", INT2FIX(status)); + rb_iv_set(proc_status, "pid", INT2FIX(pid)); + +#ifdef RUBINIUS + /* Rubinius uses standard instance vars */ + rb_iv_set(proc_status, "@pid", INT2FIX(pid)); + if (WIFEXITED(status)) { + rb_iv_set(proc_status, "@status", INT2FIX(WEXITSTATUS(status))); + } else if (WIFSIGNALED(status)) { + rb_iv_set(proc_status, "@termsig", INT2FIX(WTERMSIG(status))); + } else if (WIFSTOPPED(status)) { + rb_iv_set(proc_status, "@stopsig", INT2FIX(WSTOPSIG(status))); + } +#endif + } + } + + return proc_status; +} + +/********************** +t_get_connection_count +**********************/ + +static VALUE t_get_connection_count (VALUE self UNUSED) +{ + return INT2NUM(evma_get_connection_count()); +} + +/***************************** +t_get_comm_inactivity_timeout +*****************************/ + +static VALUE t_get_comm_inactivity_timeout (VALUE self UNUSED, VALUE signature) +{ + return rb_float_new(evma_get_comm_inactivity_timeout(NUM2BSIG (signature))); +} + +/***************************** +t_set_comm_inactivity_timeout +*****************************/ + +static VALUE t_set_comm_inactivity_timeout (VALUE self UNUSED, VALUE signature, VALUE timeout) +{ + float ti = RFLOAT_VALUE(timeout); + if (evma_set_comm_inactivity_timeout(NUM2BSIG(signature), ti)) { + return Qtrue; + } + return Qfalse; +} + +/***************************** +t_get_pending_connect_timeout +*****************************/ + +static VALUE t_get_pending_connect_timeout (VALUE self UNUSED, VALUE signature) +{ + return rb_float_new(evma_get_pending_connect_timeout(NUM2BSIG (signature))); +} + +/***************************** +t_set_pending_connect_timeout +*****************************/ + +static VALUE t_set_pending_connect_timeout (VALUE self UNUSED, VALUE signature, VALUE timeout) +{ + float ti = RFLOAT_VALUE(timeout); + if (evma_set_pending_connect_timeout(NUM2BSIG(signature), ti)) { + return Qtrue; + } + return Qfalse; +} + +/*************** +t_send_datagram +***************/ + +static VALUE t_send_datagram (VALUE self UNUSED, VALUE signature, VALUE data, VALUE data_length, VALUE address, VALUE port) +{ + int b = evma_send_datagram (NUM2BSIG (signature), StringValuePtr (data), FIX2INT (data_length), StringValueCStr(address), FIX2INT(port)); + if (b < 0) + rb_raise (EM_eConnectionError, "%s", "error in sending datagram"); // FIXME: this could be more specific. + return INT2NUM (b); +} + + +/****************** +t_close_connection +******************/ + +static VALUE t_close_connection (VALUE self UNUSED, VALUE signature, VALUE after_writing) +{ + evma_close_connection (NUM2BSIG (signature), ((after_writing == Qtrue) ? 1 : 0)); + return Qnil; +} + +/******************************** +t_report_connection_error_status +********************************/ + +static VALUE t_report_connection_error_status (VALUE self UNUSED, VALUE signature) +{ + int b = evma_report_connection_error_status (NUM2BSIG (signature)); + return INT2NUM (b); +} + + + +/**************** +t_connect_server +****************/ + +static VALUE t_connect_server (VALUE self UNUSED, VALUE server, VALUE port) +{ + // Avoid FIX2INT in this case, because it doesn't deal with type errors properly. + // Specifically, if the value of port comes in as a string rather than an integer, + // NUM2INT will throw a type error, but FIX2INT will generate garbage. + + try { + const uintptr_t f = evma_connect_to_server (NULL, 0, StringValueCStr(server), NUM2INT(port)); + if (!f) + rb_raise (EM_eConnectionError, "%s", "no connection"); + return BSIG2NUM (f); + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + +/********************* +t_bind_connect_server +*********************/ + +static VALUE t_bind_connect_server (VALUE self UNUSED, VALUE bind_addr, VALUE bind_port, VALUE server, VALUE port) +{ + // Avoid FIX2INT in this case, because it doesn't deal with type errors properly. + // Specifically, if the value of port comes in as a string rather than an integer, + // NUM2INT will throw a type error, but FIX2INT will generate garbage. + + try { + const uintptr_t f = evma_connect_to_server (StringValueCStr(bind_addr), NUM2INT(bind_port), StringValueCStr(server), NUM2INT(port)); + if (!f) + rb_raise (EM_eConnectionError, "%s", "no connection"); + return BSIG2NUM (f); + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + +/********************* +t_connect_unix_server +*********************/ + +static VALUE t_connect_unix_server (VALUE self UNUSED, VALUE serversocket) +{ + const uintptr_t f = evma_connect_to_unix_server (StringValueCStr(serversocket)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no connection"); + return BSIG2NUM (f); +} + +/*********** +t_attach_fd +***********/ + +static VALUE t_attach_fd (VALUE self UNUSED, VALUE file_descriptor, VALUE watch_mode) +{ + const uintptr_t f = evma_attach_fd (NUM2INT(file_descriptor), watch_mode == Qtrue); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no connection"); + return BSIG2NUM (f); +} + +/*********** +t_detach_fd +***********/ + +static VALUE t_detach_fd (VALUE self UNUSED, VALUE signature) +{ + return INT2NUM(evma_detach_fd (NUM2BSIG (signature))); +} + +/********************* +t_get_file_descriptor +*********************/ +static VALUE t_get_file_descriptor (VALUE self UNUSED, VALUE signature) +{ + return INT2NUM(evma_get_file_descriptor (NUM2BSIG (signature))); +} + +/************** +t_get_sock_opt +**************/ + +static VALUE t_get_sock_opt (VALUE self UNUSED, VALUE signature, VALUE lev, VALUE optname) +{ + int fd = evma_get_file_descriptor (NUM2BSIG (signature)); + int level = NUM2INT(lev), option = NUM2INT(optname); + socklen_t len = 128; + char buf[128]; + + if (getsockopt(fd, level, option, buf, &len) < 0) + rb_sys_fail("getsockopt"); + + return rb_str_new(buf, len); +} + +/************** +t_set_sock_opt +**************/ + +static VALUE t_set_sock_opt (VALUE self UNUSED, VALUE signature, VALUE lev, VALUE optname, VALUE optval) +{ + int fd = evma_get_file_descriptor (NUM2BSIG (signature)); + int level = NUM2INT(lev), option = NUM2INT(optname); + int i; + const void *v; + socklen_t len; + + switch (TYPE(optval)) { + case T_FIXNUM: + i = FIX2INT(optval); + goto numval; + case T_FALSE: + i = 0; + goto numval; + case T_TRUE: + i = 1; + numval: + v = (void*)&i; len = sizeof(i); + break; + default: + StringValue(optval); + v = RSTRING_PTR(optval); + len = RSTRING_LENINT(optval); + break; + } + + + if (setsockopt(fd, level, option, (char *)v, len) < 0) + rb_sys_fail("setsockopt"); + + return INT2FIX(0); +} + +/******************** +t_is_notify_readable +********************/ + +static VALUE t_is_notify_readable (VALUE self UNUSED, VALUE signature) +{ + return evma_is_notify_readable(NUM2BSIG (signature)) ? Qtrue : Qfalse; +} + +/********************* +t_set_notify_readable +*********************/ + +static VALUE t_set_notify_readable (VALUE self UNUSED, VALUE signature, VALUE mode) +{ + evma_set_notify_readable(NUM2BSIG(signature), mode == Qtrue); + return Qnil; +} + +/******************** +t_is_notify_readable +********************/ + +static VALUE t_is_notify_writable (VALUE self UNUSED, VALUE signature) +{ + return evma_is_notify_writable(NUM2BSIG (signature)) ? Qtrue : Qfalse; +} + +/********************* +t_set_notify_writable +*********************/ + +static VALUE t_set_notify_writable (VALUE self UNUSED, VALUE signature, VALUE mode) +{ + evma_set_notify_writable(NUM2BSIG (signature), mode == Qtrue); + return Qnil; +} + +/******* +t_pause +*******/ + +static VALUE t_pause (VALUE self UNUSED, VALUE signature) +{ + return evma_pause(NUM2BSIG (signature)) ? Qtrue : Qfalse; +} + +/******** +t_resume +********/ + +static VALUE t_resume (VALUE self UNUSED, VALUE signature) +{ + return evma_resume(NUM2BSIG (signature)) ? Qtrue : Qfalse; +} + +/********** +t_paused_p +**********/ + +static VALUE t_paused_p (VALUE self UNUSED, VALUE signature) +{ + return evma_is_paused(NUM2BSIG (signature)) ? Qtrue : Qfalse; +} + +/********************* +t_num_close_scheduled +*********************/ + +static VALUE t_num_close_scheduled (VALUE self UNUSED) +{ + return INT2FIX(evma_num_close_scheduled()); +} + +/***************** +t_open_udp_socket +*****************/ + +static VALUE t_open_udp_socket (VALUE self UNUSED, VALUE server, VALUE port) +{ + const uintptr_t f = evma_open_datagram_socket (StringValueCStr(server), FIX2INT(port)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no datagram socket"); + return BSIG2NUM(f); +} + + + +/***************** +t_release_machine +*****************/ + +static VALUE t_release_machine (VALUE self UNUSED) +{ + evma_release_library(); + return Qnil; +} + + +/****** +t_stop +******/ + +static VALUE t_stop (VALUE self UNUSED) +{ + evma_stop_machine(); + return Qnil; +} + +/****************** +t_signal_loopbreak +******************/ + +static VALUE t_signal_loopbreak (VALUE self UNUSED) +{ + evma_signal_loopbreak(); + return Qnil; +} + +/************** +t_library_type +**************/ + +static VALUE t_library_type (VALUE self UNUSED) +{ + return rb_eval_string (":extension"); +} + + + +/******************* +t_set_timer_quantum +*******************/ + +static VALUE t_set_timer_quantum (VALUE self UNUSED, VALUE interval) +{ + evma_set_timer_quantum (FIX2INT (interval)); + return Qnil; +} + +/******************** +t_get_max_timer_count +********************/ + +static VALUE t_get_max_timer_count (VALUE self UNUSED) +{ + return INT2FIX (evma_get_max_timer_count()); +} + +/******************** +t_set_max_timer_count +********************/ + +static VALUE t_set_max_timer_count (VALUE self UNUSED, VALUE ct) +{ + evma_set_max_timer_count (FIX2INT (ct)); + return Qnil; +} + +/******************** +t_get/set_simultaneous_accept_count +********************/ + +static VALUE t_get_simultaneous_accept_count (VALUE self UNUSED) +{ + return INT2FIX (evma_get_simultaneous_accept_count()); +} + +static VALUE t_set_simultaneous_accept_count (VALUE self UNUSED, VALUE ct) +{ + evma_set_simultaneous_accept_count (FIX2INT (ct)); + return Qnil; +} + +/*************** +t_setuid_string +***************/ + +static VALUE t_setuid_string (VALUE self UNUSED, VALUE username) +{ + evma_setuid_string (StringValueCStr (username)); + return Qnil; +} + + + +/************** +t_invoke_popen +**************/ + +static VALUE t_invoke_popen (VALUE self UNUSED, VALUE cmd) +{ + #ifdef OS_WIN32 + rb_raise (EM_eUnsupported, "popen is not available on this platform"); + #endif + + int len = RARRAY_LEN(cmd); + if (len >= 2048) + rb_raise (rb_eRuntimeError, "%s", "too many arguments to popen"); + char *strings [2048]; + for (int i=0; i < len; i++) { + VALUE ix = INT2FIX (i); + VALUE s = rb_ary_aref (1, &ix, cmd); + strings[i] = StringValueCStr (s); + } + strings[len] = NULL; + + uintptr_t f = 0; + try { + f = evma_popen (strings); + } catch (std::runtime_error e) { + rb_raise (rb_eRuntimeError, "%s", e.what()); + } + if (!f) { + char *err = strerror (errno); + char buf[100]; + memset (buf, 0, sizeof(buf)); + snprintf (buf, sizeof(buf)-1, "no popen: %s", (err?err:"???")); + rb_raise (rb_eRuntimeError, "%s", buf); + } + return BSIG2NUM (f); +} + + +/*************** +t_read_keyboard +***************/ + +static VALUE t_read_keyboard (VALUE self UNUSED) +{ + const uintptr_t f = evma_open_keyboard(); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no keyboard reader"); + return BSIG2NUM (f); +} + + +/**************** +t_watch_filename +****************/ + +static VALUE t_watch_filename (VALUE self UNUSED, VALUE fname) +{ + try { + return BSIG2NUM(evma_watch_filename(StringValueCStr(fname))); + } catch (std::runtime_error e) { + rb_raise (EM_eUnsupported, "%s", e.what()); + } + return Qnil; +} + + +/****************** +t_unwatch_filename +******************/ + +static VALUE t_unwatch_filename (VALUE self UNUSED, VALUE sig) +{ + try { + evma_unwatch_filename(NUM2BSIG (sig)); + } catch (std::runtime_error e) { + rb_raise (EM_eInvalidSignature, "%s", e.what()); + } + + return Qnil; +} + + +/*********** +t_watch_pid +***********/ + +static VALUE t_watch_pid (VALUE self UNUSED, VALUE pid) +{ + try { + return BSIG2NUM(evma_watch_pid(NUM2INT(pid))); + } catch (std::runtime_error e) { + rb_raise (EM_eUnsupported, "%s", e.what()); + } + return Qnil; +} + + +/************* +t_unwatch_pid +*************/ + +static VALUE t_unwatch_pid (VALUE self UNUSED, VALUE sig) +{ + evma_unwatch_pid(NUM2BSIG (sig)); + return Qnil; +} + + +/********** +t__epoll_p +**********/ + +static VALUE t__epoll_p (VALUE self UNUSED) +{ + #ifdef HAVE_EPOLL + return Qtrue; + #else + return Qfalse; + #endif +} + +/******** +t__epoll +********/ + +static VALUE t__epoll (VALUE self UNUSED) +{ + if (t__epoll_p(self) == Qfalse) + return Qfalse; + + evma_set_epoll (1); + return Qtrue; +} + +/*********** +t__epoll_set +***********/ + +static VALUE t__epoll_set (VALUE self, VALUE val) +{ + if (t__epoll_p(self) == Qfalse && val == Qtrue) + rb_raise (EM_eUnsupported, "%s", "epoll is not supported on this platform"); + + evma_set_epoll (val == Qtrue ? 1 : 0); + return val; +} + + +/*********** +t__kqueue_p +***********/ + +static VALUE t__kqueue_p (VALUE self UNUSED) +{ + #ifdef HAVE_KQUEUE + return Qtrue; + #else + return Qfalse; + #endif +} + +/********* +t__kqueue +*********/ + +static VALUE t__kqueue (VALUE self UNUSED) +{ + if (t__kqueue_p(self) == Qfalse) + return Qfalse; + + evma_set_kqueue (1); + return Qtrue; +} + +/************* +t__kqueue_set +*************/ + +static VALUE t__kqueue_set (VALUE self, VALUE val) +{ + if (t__kqueue_p(self) == Qfalse && val == Qtrue) + rb_raise (EM_eUnsupported, "%s", "kqueue is not supported on this platform"); + + evma_set_kqueue (val == Qtrue ? 1 : 0); + return val; +} + + +/******** +t__ssl_p +********/ + +static VALUE t__ssl_p (VALUE self UNUSED) +{ + #ifdef WITH_SSL + return Qtrue; + #else + return Qfalse; + #endif +} + +/******** +t_stopping +********/ + +static VALUE t_stopping () +{ + if (evma_stopping()) { + return Qtrue; + } else { + return Qfalse; + } +} + + +/**************** +t_send_file_data +****************/ + +static VALUE t_send_file_data (VALUE self UNUSED, VALUE signature, VALUE filename) +{ + + /* The current implementation of evma_send_file_data_to_connection enforces a strict + * upper limit on the file size it will transmit (currently 32K). The function returns + * zero on success, -1 if the requested file exceeds its size limit, and a positive + * number for other errors. + * TODO: Positive return values are actually errno's, which is probably the wrong way to + * do this. For one thing it's ugly. For another, we can't be sure zero is never a real errno. + */ + + int b = evma_send_file_data_to_connection (NUM2BSIG (signature), StringValueCStr(filename)); + if (b == -1) + rb_raise(rb_eRuntimeError, "%s", "File too large. send_file_data() supports files under 32k."); + if (b > 0) { + char *err = strerror (b); + char buf[1024]; + memset (buf, 0, sizeof(buf)); + snprintf (buf, sizeof(buf)-1, ": %s %s", StringValueCStr(filename),(err?err:"???")); + + rb_raise (rb_eIOError, "%s", buf); + } + + return INT2NUM (0); +} + + +/******************* +t_set_rlimit_nofile +*******************/ + +static VALUE t_set_rlimit_nofile (VALUE self UNUSED, VALUE arg) +{ + arg = (NIL_P(arg)) ? -1 : NUM2INT (arg); + return INT2NUM (evma_set_rlimit_nofile (arg)); +} + +/*************************** +conn_get_outbound_data_size +***************************/ + +static VALUE conn_get_outbound_data_size (VALUE self) +{ + VALUE sig = rb_ivar_get (self, Intern_at_signature); + return INT2NUM (evma_get_outbound_data_size (NUM2BSIG (sig))); +} + + +/****************************** +conn_associate_callback_target +******************************/ + +static VALUE conn_associate_callback_target (VALUE self UNUSED, VALUE sig UNUSED) +{ + // No-op for the time being. + return Qnil; +} + + +/*************** +t_get_loop_time +****************/ + +static VALUE t_get_loop_time (VALUE self UNUSED) +{ + uint64_t current_time = evma_get_current_loop_time(); + if (current_time == 0) { + return Qnil; + } + + // Generally the industry has moved to 64-bit time_t, this is just in case we're 32-bit time_t. + if (sizeof(time_t) < 8 && current_time > INT_MAX) { + return rb_funcall(rb_cTime, Intern_at, 2, INT2NUM(current_time / 1000000), INT2NUM(current_time % 1000000)); + } else { + return rb_time_new(current_time / 1000000, current_time % 1000000); + } +} + + +/************* +t_start_proxy +**************/ + +static VALUE t_start_proxy (VALUE self UNUSED, VALUE from, VALUE to, VALUE bufsize, VALUE length) +{ + try { + evma_start_proxy(NUM2BSIG (from), NUM2BSIG (to), NUM2ULONG(bufsize), NUM2ULONG(length)); + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + + +/************ +t_stop_proxy +*************/ + +static VALUE t_stop_proxy (VALUE self UNUSED, VALUE from) +{ + try{ + evma_stop_proxy(NUM2BSIG (from)); + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + +/*************** +t_proxied_bytes +****************/ + +static VALUE t_proxied_bytes (VALUE self UNUSED, VALUE from) +{ + try{ + return BSIG2NUM(evma_proxied_bytes(NUM2BSIG (from))); + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + +/*************** +t_get_idle_time +****************/ + +static VALUE t_get_idle_time (VALUE self UNUSED, VALUE from) +{ + try{ + uint64_t current_time = evma_get_current_loop_time(); + uint64_t time = evma_get_last_activity_time(NUM2BSIG (from)); + if (current_time != 0 && time != 0) { + if (time >= current_time) + return BSIG2NUM(0); + else { + uint64_t diff = current_time - time; + float seconds = diff / (1000.0*1000.0); + return rb_float_new(seconds); + } + return Qnil; + } + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + +/************************ +t_get_heartbeat_interval +*************************/ + +static VALUE t_get_heartbeat_interval (VALUE self UNUSED) +{ + return rb_float_new(evma_get_heartbeat_interval()); +} + + +/************************ +t_set_heartbeat_interval +*************************/ + +static VALUE t_set_heartbeat_interval (VALUE self UNUSED, VALUE interval) +{ + float iv = RFLOAT_VALUE(interval); + if (evma_set_heartbeat_interval(iv)) + return Qtrue; + return Qfalse; +} + + +/********************* +Init_rubyeventmachine +*********************/ + +extern "C" void Init_rubyeventmachine() +{ + // Lookup Process::Status for get_subprocess_status + VALUE rb_mProcess = rb_const_get(rb_cObject, rb_intern("Process")); + rb_cProcStatus = rb_const_get(rb_mProcess, rb_intern("Status")); + + // Tuck away some symbol values so we don't have to look 'em up every time we need 'em. + Intern_at_signature = rb_intern ("@signature"); + Intern_at_timers = rb_intern ("@timers"); + Intern_at_conns = rb_intern ("@conns"); + Intern_at_error_handler = rb_intern("@error_handler"); + + Intern_event_callback = rb_intern ("event_callback"); + Intern_run_deferred_callbacks = rb_intern ("run_deferred_callbacks"); + Intern_delete = rb_intern ("delete"); + Intern_call = rb_intern ("call"); + Intern_at = rb_intern("at"); + Intern_receive_data = rb_intern ("receive_data"); + Intern_ssl_handshake_completed = rb_intern ("ssl_handshake_completed"); + Intern_ssl_verify_peer = rb_intern ("ssl_verify_peer"); + Intern_notify_readable = rb_intern ("notify_readable"); + Intern_notify_writable = rb_intern ("notify_writable"); + Intern_proxy_target_unbound = rb_intern ("proxy_target_unbound"); + Intern_proxy_completed = rb_intern ("proxy_completed"); + Intern_connection_completed = rb_intern ("connection_completed"); + + // INCOMPLETE, we need to define class Connections inside module EventMachine + // run_machine and run_machine_without_threads are now identical. + // Must deprecate the without_threads variant. + EmModule = rb_define_module ("EventMachine"); + EmConnection = rb_define_class_under (EmModule, "Connection", rb_cObject); + + rb_define_class_under (EmModule, "NoHandlerForAcceptedConnection", rb_eRuntimeError); + EM_eConnectionError = rb_define_class_under (EmModule, "ConnectionError", rb_eRuntimeError); + EM_eConnectionNotBound = rb_define_class_under (EmModule, "ConnectionNotBound", rb_eRuntimeError); + EM_eUnknownTimerFired = rb_define_class_under (EmModule, "UnknownTimerFired", rb_eRuntimeError); + EM_eUnsupported = rb_define_class_under (EmModule, "Unsupported", rb_eRuntimeError); + EM_eInvalidSignature = rb_define_class_under (EmModule, "InvalidSignature", rb_eRuntimeError); + + rb_define_module_function (EmModule, "initialize_event_machine", (VALUE(*)(...))t_initialize_event_machine, 0); + rb_define_module_function (EmModule, "run_machine_once", (VALUE(*)(...))t_run_machine_once, 0); + rb_define_module_function (EmModule, "run_machine", (VALUE(*)(...))t_run_machine, 0); + rb_define_module_function (EmModule, "run_machine_without_threads", (VALUE(*)(...))t_run_machine, 0); + rb_define_module_function (EmModule, "add_oneshot_timer", (VALUE(*)(...))t_add_oneshot_timer, 1); + rb_define_module_function (EmModule, "start_tcp_server", (VALUE(*)(...))t_start_server, 2); + rb_define_module_function (EmModule, "stop_tcp_server", (VALUE(*)(...))t_stop_server, 1); + rb_define_module_function (EmModule, "start_unix_server", (VALUE(*)(...))t_start_unix_server, 1); + rb_define_module_function (EmModule, "attach_sd", (VALUE(*)(...))t_attach_sd, 1); + rb_define_module_function (EmModule, "set_tls_parms", (VALUE(*)(...))t_set_tls_parms, 10); + rb_define_module_function (EmModule, "start_tls", (VALUE(*)(...))t_start_tls, 1); + rb_define_module_function (EmModule, "get_peer_cert", (VALUE(*)(...))t_get_peer_cert, 1); + rb_define_module_function (EmModule, "get_cipher_bits", (VALUE(*)(...))t_get_cipher_bits, 1); + rb_define_module_function (EmModule, "get_cipher_name", (VALUE(*)(...))t_get_cipher_name, 1); + rb_define_module_function (EmModule, "get_cipher_protocol", (VALUE(*)(...))t_get_cipher_protocol, 1); + rb_define_module_function (EmModule, "get_sni_hostname", (VALUE(*)(...))t_get_sni_hostname, 1); + rb_define_module_function (EmModule, "send_data", (VALUE(*)(...))t_send_data, 3); + rb_define_module_function (EmModule, "send_datagram", (VALUE(*)(...))t_send_datagram, 5); + rb_define_module_function (EmModule, "close_connection", (VALUE(*)(...))t_close_connection, 2); + rb_define_module_function (EmModule, "report_connection_error_status", (VALUE(*)(...))t_report_connection_error_status, 1); + rb_define_module_function (EmModule, "connect_server", (VALUE(*)(...))t_connect_server, 2); + rb_define_module_function (EmModule, "bind_connect_server", (VALUE(*)(...))t_bind_connect_server, 4); + rb_define_module_function (EmModule, "connect_unix_server", (VALUE(*)(...))t_connect_unix_server, 1); + + rb_define_module_function (EmModule, "attach_fd", (VALUE (*)(...))t_attach_fd, 2); + rb_define_module_function (EmModule, "detach_fd", (VALUE (*)(...))t_detach_fd, 1); + rb_define_module_function (EmModule, "get_file_descriptor", (VALUE (*)(...))t_get_file_descriptor, 1); + rb_define_module_function (EmModule, "get_sock_opt", (VALUE (*)(...))t_get_sock_opt, 3); + rb_define_module_function (EmModule, "set_sock_opt", (VALUE (*)(...))t_set_sock_opt, 4); + rb_define_module_function (EmModule, "set_notify_readable", (VALUE (*)(...))t_set_notify_readable, 2); + rb_define_module_function (EmModule, "set_notify_writable", (VALUE (*)(...))t_set_notify_writable, 2); + rb_define_module_function (EmModule, "is_notify_readable", (VALUE (*)(...))t_is_notify_readable, 1); + rb_define_module_function (EmModule, "is_notify_writable", (VALUE (*)(...))t_is_notify_writable, 1); + + rb_define_module_function (EmModule, "pause_connection", (VALUE (*)(...))t_pause, 1); + rb_define_module_function (EmModule, "resume_connection", (VALUE (*)(...))t_resume, 1); + rb_define_module_function (EmModule, "connection_paused?", (VALUE (*)(...))t_paused_p, 1); + rb_define_module_function (EmModule, "num_close_scheduled", (VALUE (*)(...))t_num_close_scheduled, 0); + + rb_define_module_function (EmModule, "start_proxy", (VALUE (*)(...))t_start_proxy, 4); + rb_define_module_function (EmModule, "stop_proxy", (VALUE (*)(...))t_stop_proxy, 1); + rb_define_module_function (EmModule, "get_proxied_bytes", (VALUE (*)(...))t_proxied_bytes, 1); + + rb_define_module_function (EmModule, "watch_filename", (VALUE (*)(...))t_watch_filename, 1); + rb_define_module_function (EmModule, "unwatch_filename", (VALUE (*)(...))t_unwatch_filename, 1); + + rb_define_module_function (EmModule, "watch_pid", (VALUE (*)(...))t_watch_pid, 1); + rb_define_module_function (EmModule, "unwatch_pid", (VALUE (*)(...))t_unwatch_pid, 1); + + rb_define_module_function (EmModule, "current_time", (VALUE(*)(...))t_get_loop_time, 0); + + rb_define_module_function (EmModule, "open_udp_socket", (VALUE(*)(...))t_open_udp_socket, 2); + rb_define_module_function (EmModule, "read_keyboard", (VALUE(*)(...))t_read_keyboard, 0); + rb_define_module_function (EmModule, "release_machine", (VALUE(*)(...))t_release_machine, 0); + rb_define_module_function (EmModule, "stop", (VALUE(*)(...))t_stop, 0); + rb_define_module_function (EmModule, "signal_loopbreak", (VALUE(*)(...))t_signal_loopbreak, 0); + rb_define_module_function (EmModule, "library_type", (VALUE(*)(...))t_library_type, 0); + rb_define_module_function (EmModule, "set_timer_quantum", (VALUE(*)(...))t_set_timer_quantum, 1); + rb_define_module_function (EmModule, "get_max_timer_count", (VALUE(*)(...))t_get_max_timer_count, 0); + rb_define_module_function (EmModule, "set_max_timer_count", (VALUE(*)(...))t_set_max_timer_count, 1); + rb_define_module_function (EmModule, "get_simultaneous_accept_count", (VALUE(*)(...))t_get_simultaneous_accept_count, 0); + rb_define_module_function (EmModule, "set_simultaneous_accept_count", (VALUE(*)(...))t_set_simultaneous_accept_count, 1); + rb_define_module_function (EmModule, "setuid_string", (VALUE(*)(...))t_setuid_string, 1); + rb_define_module_function (EmModule, "invoke_popen", (VALUE(*)(...))t_invoke_popen, 1); + rb_define_module_function (EmModule, "send_file_data", (VALUE(*)(...))t_send_file_data, 2); + rb_define_module_function (EmModule, "get_heartbeat_interval", (VALUE(*)(...))t_get_heartbeat_interval, 0); + rb_define_module_function (EmModule, "set_heartbeat_interval", (VALUE(*)(...))t_set_heartbeat_interval, 1); + rb_define_module_function (EmModule, "get_idle_time", (VALUE(*)(...))t_get_idle_time, 1); + + rb_define_module_function (EmModule, "get_peername", (VALUE(*)(...))t_get_peername, 1); + rb_define_module_function (EmModule, "get_sockname", (VALUE(*)(...))t_get_sockname, 1); + rb_define_module_function (EmModule, "get_subprocess_pid", (VALUE(*)(...))t_get_subprocess_pid, 1); + rb_define_module_function (EmModule, "get_subprocess_status", (VALUE(*)(...))t_get_subprocess_status, 1); + rb_define_module_function (EmModule, "get_comm_inactivity_timeout", (VALUE(*)(...))t_get_comm_inactivity_timeout, 1); + rb_define_module_function (EmModule, "set_comm_inactivity_timeout", (VALUE(*)(...))t_set_comm_inactivity_timeout, 2); + rb_define_module_function (EmModule, "get_pending_connect_timeout", (VALUE(*)(...))t_get_pending_connect_timeout, 1); + rb_define_module_function (EmModule, "set_pending_connect_timeout", (VALUE(*)(...))t_set_pending_connect_timeout, 2); + rb_define_module_function (EmModule, "set_rlimit_nofile", (VALUE(*)(...))t_set_rlimit_nofile, 1); + rb_define_module_function (EmModule, "get_connection_count", (VALUE(*)(...))t_get_connection_count, 0); + + rb_define_module_function (EmModule, "epoll", (VALUE(*)(...))t__epoll, 0); + rb_define_module_function (EmModule, "epoll=", (VALUE(*)(...))t__epoll_set, 1); + rb_define_module_function (EmModule, "epoll?", (VALUE(*)(...))t__epoll_p, 0); + + rb_define_module_function (EmModule, "kqueue", (VALUE(*)(...))t__kqueue, 0); + rb_define_module_function (EmModule, "kqueue=", (VALUE(*)(...))t__kqueue_set, 1); + rb_define_module_function (EmModule, "kqueue?", (VALUE(*)(...))t__kqueue_p, 0); + + rb_define_module_function (EmModule, "ssl?", (VALUE(*)(...))t__ssl_p, 0); + rb_define_module_function(EmModule, "stopping?",(VALUE(*)(...))t_stopping, 0); + + rb_define_method (EmConnection, "get_outbound_data_size", (VALUE(*)(...))conn_get_outbound_data_size, 0); + rb_define_method (EmConnection, "associate_callback_target", (VALUE(*)(...))conn_associate_callback_target, 1); + + // Connection states + rb_define_const (EmModule, "TimerFired", INT2NUM(EM_TIMER_FIRED )); + rb_define_const (EmModule, "ConnectionData", INT2NUM(EM_CONNECTION_READ )); + rb_define_const (EmModule, "ConnectionUnbound", INT2NUM(EM_CONNECTION_UNBOUND )); + rb_define_const (EmModule, "ConnectionAccepted", INT2NUM(EM_CONNECTION_ACCEPTED )); + rb_define_const (EmModule, "ConnectionCompleted", INT2NUM(EM_CONNECTION_COMPLETED )); + rb_define_const (EmModule, "LoopbreakSignalled", INT2NUM(EM_LOOPBREAK_SIGNAL )); + rb_define_const (EmModule, "ConnectionNotifyReadable", INT2NUM(EM_CONNECTION_NOTIFY_READABLE)); + rb_define_const (EmModule, "ConnectionNotifyWritable", INT2NUM(EM_CONNECTION_NOTIFY_WRITABLE)); + rb_define_const (EmModule, "SslHandshakeCompleted", INT2NUM(EM_SSL_HANDSHAKE_COMPLETED )); + rb_define_const (EmModule, "SslVerify", INT2NUM(EM_SSL_VERIFY )); + // EM_PROXY_TARGET_UNBOUND = 110, + // EM_PROXY_COMPLETED = 111 + + // SSL Protocols + rb_define_const (EmModule, "EM_PROTO_SSLv2", INT2NUM(EM_PROTO_SSLv2 )); + rb_define_const (EmModule, "EM_PROTO_SSLv3", INT2NUM(EM_PROTO_SSLv3 )); + rb_define_const (EmModule, "EM_PROTO_TLSv1", INT2NUM(EM_PROTO_TLSv1 )); + rb_define_const (EmModule, "EM_PROTO_TLSv1_1", INT2NUM(EM_PROTO_TLSv1_1)); + rb_define_const (EmModule, "EM_PROTO_TLSv1_2", INT2NUM(EM_PROTO_TLSv1_2)); +} + diff --git a/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/rubymain.o b/vendor/bundle/ruby/2.3.0/gems/eventmachine-1.2.5/ext/rubymain.o new file mode 100644 index 0000000000000000000000000000000000000000..fa6417c38daa95fcffe6cf2f459520b3b6cb514e GIT binary patch literal 323704 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

  • 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 F6Jj004s(i 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 z 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